Commit f9d0512f authored by tomas@poseidon.ndb.mysql.com's avatar tomas@poseidon.ndb.mysql.com

Merge

parents 160f254d 1a331191
...@@ -612,3 +612,17 @@ a b c ...@@ -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; ...@@ -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;
...@@ -852,6 +852,42 @@ int ha_ndbcluster::get_metadata(const char *path) ...@@ -852,6 +852,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)
{ {
...@@ -926,6 +962,7 @@ int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase) ...@@ -926,6 +962,7 @@ 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);
} }
} }
...@@ -984,6 +1021,11 @@ void ha_ndbcluster::release_metadata() ...@@ -984,6 +1021,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;
...@@ -1152,7 +1194,7 @@ ha_ndbcluster::set_index_key(NdbOperation *op, ...@@ -1152,7 +1194,7 @@ ha_ndbcluster::set_index_key(NdbOperation *op,
const byte* ptr= key_part->null_bit ? key_ptr + 1 : key_ptr; const byte* ptr= key_part->null_bit ? key_ptr + 1 : key_ptr;
char buf[256]; char buf[256];
shrink_varchar(field, ptr, buf); shrink_varchar(field, ptr, buf);
if (set_ndb_key(op, field, i, ptr)) if (set_ndb_key(op, field, m_index[active_index].unique_index_attrid_map[i], ptr))
ERR_RETURN(m_active_trans->getNdbError()); ERR_RETURN(m_active_trans->getNdbError());
key_ptr+= key_part->store_length; key_ptr+= key_part->store_length;
} }
...@@ -1655,13 +1697,10 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op, ...@@ -1655,13 +1697,10 @@ 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];
strnmov(truncated_field_name,field->field_name,sizeof(truncated_field_name));
truncated_field_name[sizeof(truncated_field_name)-1]= '\0';
const char* ptr= p.bound_ptr; const char* ptr= p.bound_ptr;
char buf[256]; char buf[256];
shrink_varchar(field, ptr, buf); shrink_varchar(field, ptr, buf);
if (op->setBound(truncated_field_name, p.bound_type, ptr)) if (op->setBound(i, p.bound_type, ptr))
ERR_RETURN(op->getNdbError()); ERR_RETURN(op->getNdbError());
} }
} }
...@@ -3993,6 +4032,7 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg): ...@@ -3993,6 +4032,7 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
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;
......
...@@ -51,6 +51,7 @@ typedef struct ndb_index_data { ...@@ -51,6 +51,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 {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment