mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.1
into gw.mysql.r18.ru:/usr/home/ram/work/4.1.b7261
This commit is contained in:
@ -612,3 +612,17 @@ a b c
|
|||||||
3 NULL NULL
|
3 NULL NULL
|
||||||
4 4 NULL
|
4 4 NULL
|
||||||
drop table t1, t8;
|
drop table t1, t8;
|
||||||
|
create table t1(
|
||||||
|
id integer not null auto_increment,
|
||||||
|
month integer not null,
|
||||||
|
year integer not null,
|
||||||
|
code varchar( 2) not null,
|
||||||
|
primary key ( id),
|
||||||
|
unique idx_t1( month, code, year)
|
||||||
|
) engine=ndb;
|
||||||
|
INSERT INTO t1 (month, year, code) VALUES (4,2004,'12');
|
||||||
|
INSERT INTO t1 (month, year, code) VALUES (5,2004,'12');
|
||||||
|
select * from t1 where code = '12' and month = 4 and year = 2004 ;
|
||||||
|
id month year code
|
||||||
|
1 4 2004 12
|
||||||
|
drop table t1;
|
||||||
|
@ -286,3 +286,24 @@ select * from t8 order by a;
|
|||||||
select * from t1 order by a;
|
select * from t1 order by a;
|
||||||
drop table t1, t8;
|
drop table t1, t8;
|
||||||
|
|
||||||
|
###############################
|
||||||
|
# Bug 8101
|
||||||
|
#
|
||||||
|
# Unique index not specified in the same order as in table
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1(
|
||||||
|
id integer not null auto_increment,
|
||||||
|
month integer not null,
|
||||||
|
year integer not null,
|
||||||
|
code varchar( 2) not null,
|
||||||
|
primary key ( id),
|
||||||
|
unique idx_t1( month, code, year)
|
||||||
|
) engine=ndb;
|
||||||
|
|
||||||
|
INSERT INTO t1 (month, year, code) VALUES (4,2004,'12');
|
||||||
|
INSERT INTO t1 (month, year, code) VALUES (5,2004,'12');
|
||||||
|
|
||||||
|
select * from t1 where code = '12' and month = 4 and year = 2004 ;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
@ -765,6 +765,42 @@ int ha_ndbcluster::get_metadata(const char *path)
|
|||||||
DBUG_RETURN(build_index_list(table, ILBP_OPEN));
|
DBUG_RETURN(build_index_list(table, ILBP_OPEN));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fix_unique_index_attr_order(NDB_INDEX_DATA &data,
|
||||||
|
const NDBINDEX *index,
|
||||||
|
KEY *key_info)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("fix_unique_index_attr_order");
|
||||||
|
unsigned sz= index->getNoOfIndexColumns();
|
||||||
|
|
||||||
|
if (data.unique_index_attrid_map)
|
||||||
|
my_free((char*)data.unique_index_attrid_map, MYF(0));
|
||||||
|
data.unique_index_attrid_map= (unsigned char*)my_malloc(sz,MYF(MY_WME));
|
||||||
|
|
||||||
|
KEY_PART_INFO* key_part= key_info->key_part;
|
||||||
|
KEY_PART_INFO* end= key_part+key_info->key_parts;
|
||||||
|
DBUG_ASSERT(key_info->key_parts == sz);
|
||||||
|
for (unsigned i= 0; key_part != end; key_part++, i++)
|
||||||
|
{
|
||||||
|
const char *field_name= key_part->field->field_name;
|
||||||
|
unsigned name_sz= strlen(field_name);
|
||||||
|
if (name_sz >= NDB_MAX_ATTR_NAME_SIZE)
|
||||||
|
name_sz= NDB_MAX_ATTR_NAME_SIZE-1;
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
data.unique_index_attrid_map[i]= 255;
|
||||||
|
#endif
|
||||||
|
for (unsigned j= 0; j < sz; j++)
|
||||||
|
{
|
||||||
|
const NdbDictionary::Column *c= index->getColumn(j);
|
||||||
|
if (strncmp(field_name, c->getName(), name_sz) == 0)
|
||||||
|
{
|
||||||
|
data.unique_index_attrid_map[i]= j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBUG_ASSERT(data.unique_index_attrid_map[i] != 255);
|
||||||
|
}
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase)
|
int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase)
|
||||||
{
|
{
|
||||||
@ -839,7 +875,8 @@ int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase)
|
|||||||
const NDBINDEX *index= dict->getIndex(unique_index_name, m_tabname);
|
const NDBINDEX *index= dict->getIndex(unique_index_name, m_tabname);
|
||||||
if (!index) DBUG_RETURN(1);
|
if (!index) DBUG_RETURN(1);
|
||||||
m_index[i].unique_index= (void *) index;
|
m_index[i].unique_index= (void *) index;
|
||||||
}
|
error= fix_unique_index_attr_order(m_index[i], index, key_info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
@ -897,6 +934,11 @@ void ha_ndbcluster::release_metadata()
|
|||||||
{
|
{
|
||||||
m_index[i].unique_index= NULL;
|
m_index[i].unique_index= NULL;
|
||||||
m_index[i].index= NULL;
|
m_index[i].index= NULL;
|
||||||
|
if (m_index[i].unique_index_attrid_map)
|
||||||
|
{
|
||||||
|
my_free((char *)m_index[i].unique_index_attrid_map, MYF(0));
|
||||||
|
m_index[i].unique_index_attrid_map= NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
@ -1209,7 +1251,8 @@ int ha_ndbcluster::unique_index_read(const byte *key,
|
|||||||
|
|
||||||
for (i= 0; key_part != end; key_part++, i++)
|
for (i= 0; key_part != end; key_part++, i++)
|
||||||
{
|
{
|
||||||
if (set_ndb_key(op, key_part->field, i,
|
if (set_ndb_key(op, key_part->field,
|
||||||
|
m_index[active_index].unique_index_attrid_map[i],
|
||||||
key_part->null_bit ? key_ptr + 1 : key_ptr))
|
key_part->null_bit ? key_ptr + 1 : key_ptr))
|
||||||
ERR_RETURN(trans->getNdbError());
|
ERR_RETURN(trans->getNdbError());
|
||||||
key_ptr+= key_part->store_length;
|
key_ptr+= key_part->store_length;
|
||||||
@ -1476,10 +1519,7 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op,
|
|||||||
// Set bound if not cancelled via type -1
|
// Set bound if not cancelled via type -1
|
||||||
if (p.bound_type != -1)
|
if (p.bound_type != -1)
|
||||||
{
|
{
|
||||||
char truncated_field_name[NDB_MAX_ATTR_NAME_SIZE];
|
if (op->setBound(i, p.bound_type, p.bound_ptr))
|
||||||
strnmov(truncated_field_name,field->field_name,sizeof(truncated_field_name));
|
|
||||||
truncated_field_name[sizeof(truncated_field_name)-1]= '\0';
|
|
||||||
if (op->setBound(truncated_field_name, p.bound_type, p.bound_ptr))
|
|
||||||
ERR_RETURN(op->getNdbError());
|
ERR_RETURN(op->getNdbError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3839,9 +3879,10 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
|
|||||||
|
|
||||||
for (i= 0; i < MAX_KEY; i++)
|
for (i= 0; i < MAX_KEY; i++)
|
||||||
{
|
{
|
||||||
m_index[i].type= UNDEFINED_INDEX;
|
m_index[i].type= UNDEFINED_INDEX;
|
||||||
m_index[i].unique_index= NULL;
|
m_index[i].unique_index= NULL;
|
||||||
m_index[i].index= NULL;
|
m_index[i].index= NULL;
|
||||||
|
m_index[i].unique_index_attrid_map= NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
@ -52,6 +52,7 @@ typedef struct ndb_index_data {
|
|||||||
NDB_INDEX_TYPE type;
|
NDB_INDEX_TYPE type;
|
||||||
void *index;
|
void *index;
|
||||||
void *unique_index;
|
void *unique_index;
|
||||||
|
unsigned char *unique_index_attrid_map;
|
||||||
} NDB_INDEX_DATA;
|
} NDB_INDEX_DATA;
|
||||||
|
|
||||||
typedef struct st_ndbcluster_share {
|
typedef struct st_ndbcluster_share {
|
||||||
|
Reference in New Issue
Block a user