summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <ram@gw.mysql.r18.ru>2005-01-26 16:26:19 +0400
committerunknown <ram@gw.mysql.r18.ru>2005-01-26 16:26:19 +0400
commit63fdb2cc596e94c415fa82d0b503d4be96573593 (patch)
treed621d1c44f12f51c794784a6842ce2b5c06347ac /sql
parent662823c2097654f6bc92deef0d2777ab9d8a20ac (diff)
parente8ae338356d203942944e6bf4d4d40489b1a7625 (diff)
downloadmariadb-git-63fdb2cc596e94c415fa82d0b503d4be96573593.tar.gz
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-5.0
into gw.mysql.r18.ru:/usr/home/ram/work/5.0
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_ndbcluster.cc58
-rw-r--r--sql/ha_ndbcluster.h1
2 files changed, 50 insertions, 9 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 5cca81b1200..cfd1698ae2d 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -852,6 +852,42 @@ int ha_ndbcluster::get_metadata(const char *path)
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)
{
@@ -926,7 +962,8 @@ int ha_ndbcluster::build_index_list(TABLE *tab, enum ILBP phase)
const NDBINDEX *index= dict->getIndex(unique_index_name, m_tabname);
if (!index) DBUG_RETURN(1);
m_index[i].unique_index= (void *) index;
- }
+ error= fix_unique_index_attr_order(m_index[i], index, key_info);
+ }
}
DBUG_RETURN(error);
@@ -984,6 +1021,11 @@ void ha_ndbcluster::release_metadata()
{
m_index[i].unique_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;
@@ -1152,7 +1194,7 @@ ha_ndbcluster::set_index_key(NdbOperation *op,
const byte* ptr= key_part->null_bit ? key_ptr + 1 : key_ptr;
char buf[256];
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());
key_ptr+= key_part->store_length;
}
@@ -1655,13 +1697,10 @@ int ha_ndbcluster::set_bounds(NdbIndexScanOperation *op,
// Set bound if not cancelled via 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;
char buf[256];
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());
}
}
@@ -3990,9 +4029,10 @@ ha_ndbcluster::ha_ndbcluster(TABLE *table_arg):
for (i= 0; i < MAX_KEY; i++)
{
- m_index[i].type= UNDEFINED_INDEX;
- m_index[i].unique_index= NULL;
- m_index[i].index= NULL;
+ m_index[i].type= UNDEFINED_INDEX;
+ m_index[i].unique_index= NULL;
+ m_index[i].index= NULL;
+ m_index[i].unique_index_attrid_map= NULL;
}
DBUG_VOID_RETURN;
diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h
index 05bb5233664..942a4988252 100644
--- a/sql/ha_ndbcluster.h
+++ b/sql/ha_ndbcluster.h
@@ -51,6 +51,7 @@ typedef struct ndb_index_data {
NDB_INDEX_TYPE type;
void *index;
void *unique_index;
+ unsigned char *unique_index_attrid_map;
} NDB_INDEX_DATA;
typedef struct st_ndbcluster_share {