diff options
author | unknown <mskold/marty@mysql.com/linux.site> | 2006-10-18 14:28:18 +0200 |
---|---|---|
committer | unknown <mskold/marty@mysql.com/linux.site> | 2006-10-18 14:28:18 +0200 |
commit | 55ae6636bd7005d2dbd485087b52e0082ea3f87e (patch) | |
tree | 01b4222f044ce786b0dd514ddb7d75a35890d52e | |
parent | 4416725b34e9f075cf0087b71b037db72e6075ea (diff) | |
parent | 63814890d1126e042ddf2cccb88fe07a1331d997 (diff) | |
download | mariadb-git-55ae6636bd7005d2dbd485087b52e0082ea3f87e.tar.gz |
Merge mysql.com:/windows/Linux_space/MySQL/mysql-5.0
into mysql.com:/windows/Linux_space/MySQL/mysql-5.0-ndb
sql/ha_ndbcluster.cc:
Auto merged
-rw-r--r-- | mysql-test/r/ndb_charset.result | 8 | ||||
-rw-r--r-- | mysql-test/r/ndb_condition_pushdown.result | 22 | ||||
-rw-r--r-- | mysql-test/r/ndb_index_unique.result | 12 | ||||
-rw-r--r-- | mysql-test/r/ndb_multi.result | 32 | ||||
-rw-r--r-- | mysql-test/r/ndb_update.result | 2 | ||||
-rw-r--r-- | mysql-test/t/ndb_condition_pushdown.test | 10 | ||||
-rw-r--r-- | mysql-test/t/ndb_multi.test | 22 | ||||
-rw-r--r-- | sql/ha_ndbcluster.cc | 59 | ||||
-rw-r--r-- | sql/ha_ndbcluster.h | 69 | ||||
-rw-r--r-- | sql/handler.cc | 20 |
10 files changed, 211 insertions, 45 deletions
diff --git a/mysql-test/r/ndb_charset.result b/mysql-test/r/ndb_charset.result index 3763e20e59a..9e519c39496 100644 --- a/mysql-test/r/ndb_charset.result +++ b/mysql-test/r/ndb_charset.result @@ -112,9 +112,9 @@ unique key(a) ) engine=ndb; insert into t1 values(1, 'aAa'); insert into t1 values(2, 'aaa'); -ERROR 23000: Duplicate entry '2' for key 1 +ERROR 23000: Duplicate entry '' for key 0 insert into t1 values(3, 'AAA'); -ERROR 23000: Duplicate entry '3' for key 1 +ERROR 23000: Duplicate entry '' for key 0 select * from t1 order by p; p a 1 aAa @@ -138,9 +138,9 @@ unique key(a) ) engine=ndb; insert into t1 values (1,'A'),(2,'b '),(3,'C '),(4,'d '),(5,'E'),(6,'f'); insert into t1 values(99,'b'); -ERROR 23000: Duplicate entry '99' for key 1 +ERROR 23000: Duplicate entry '' for key 0 insert into t1 values(99,'a '); -ERROR 23000: Duplicate entry '99' for key 1 +ERROR 23000: Duplicate entry '' for key 0 select a,length(a) from t1 order by a; a length(a) A 1 diff --git a/mysql-test/r/ndb_condition_pushdown.result b/mysql-test/r/ndb_condition_pushdown.result index aefbcbf6ede..6012c9b6969 100644 --- a/mysql-test/r/ndb_condition_pushdown.result +++ b/mysql-test/r/ndb_condition_pushdown.result @@ -1782,6 +1782,28 @@ select * from t5 where b like '%jo%' order by a; a b 1 jonas 3 johan +set engine_condition_pushdown = off; +select auto from t1 where date_time like '1902-02-02 %' order by auto; +auto +2 +select auto from t1 where date_time not like '1902-02-02 %' order by auto; +auto +3 +4 +set engine_condition_pushdown = on; +explain select auto from t1 where date_time like '1902-02-02 %'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where +select auto from t1 where date_time like '1902-02-02 %' order by auto; +auto +2 +explain select auto from t1 where date_time not like '1902-02-02 %'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where +select auto from t1 where date_time not like '1902-02-02 %' order by auto; +auto +3 +4 drop table t1; create table t1 (a int, b varchar(3), primary key using hash(a)) engine=ndb; diff --git a/mysql-test/r/ndb_index_unique.result b/mysql-test/r/ndb_index_unique.result index 7864a5d1354..ce4759ad553 100644 --- a/mysql-test/r/ndb_index_unique.result +++ b/mysql-test/r/ndb_index_unique.result @@ -22,7 +22,7 @@ select * from t1 where b = 4 order by a; a b c 3 4 6 insert into t1 values(8, 2, 3); -ERROR 23000: Duplicate entry '8' for key 1 +ERROR 23000: Duplicate entry '' for key 0 select * from t1 order by a; a b c 1 2 3 @@ -89,7 +89,7 @@ a b c 1 1 1 4 4 NULL insert into t1 values(5,1,1); -ERROR 23000: Duplicate entry '5' for key 1 +ERROR 23000: Duplicate entry '' for key 0 drop table t1; CREATE TABLE t2 ( a int unsigned NOT NULL PRIMARY KEY, @@ -112,7 +112,7 @@ select * from t2 where b = 4 order by a; a b c 3 4 6 insert into t2 values(8, 2, 3); -ERROR 23000: Duplicate entry '8' for key 1 +ERROR 23000: Duplicate entry '' for key 0 select * from t2 order by a; a b c 1 2 3 @@ -177,7 +177,7 @@ pk a 3 NULL 4 4 insert into t1 values (5,0); -ERROR 23000: Duplicate entry '5' for key 1 +ERROR 23000: Duplicate entry '' for key 0 select * from t1 order by pk; pk a -1 NULL @@ -210,7 +210,7 @@ pk a b c 0 NULL 18 NULL 1 3 19 abc insert into t2 values(2,3,19,'abc'); -ERROR 23000: Duplicate entry '2' for key 1 +ERROR 23000: Duplicate entry '' for key 0 select * from t2 order by pk; pk a b c -1 1 17 NULL @@ -630,7 +630,7 @@ create table t1 (a int primary key, b varchar(1000) not null, unique key (b)) engine=ndb charset=utf8; insert into t1 values (1, repeat(_utf8 0xe288ab6474, 200)); insert into t1 values (2, repeat(_utf8 0xe288ab6474, 200)); -ERROR 23000: Duplicate entry '2' for key 1 +ERROR 23000: Duplicate entry '' for key 0 select a, sha1(b) from t1; a sha1(b) 1 08f5d02c8b8bc244f275bdfc22c42c5cab0d9d7d diff --git a/mysql-test/r/ndb_multi.result b/mysql-test/r/ndb_multi.result index bd3af223a65..351cd7e35c5 100644 --- a/mysql-test/r/ndb_multi.result +++ b/mysql-test/r/ndb_multi.result @@ -69,3 +69,35 @@ t3 t4 drop table t1, t2, t3, t4; drop table t1, t3, t4; +create table t1(c1 int key)ENGINE=MyISAM; +insert into t1 values(1),(3),(5); +select * from t1 order by c1; +c1 +1 +3 +5 +create table t1(c1 int key)ENGINE=MyISAM; +insert into t1 values(100),(344),(533); +select * from t1 order by c1; +c1 +100 +344 +533 +alter table t1 engine=ndb; +show tables; +Tables_in_test +t1 +Warnings: +Warning 1050 Local table test.t1 shadows ndb table +select * from t1 order by c1; +c1 +100 +344 +533 +drop table t1; +select * from t1 order by c1; +c1 +1 +3 +5 +drop table t1; diff --git a/mysql-test/r/ndb_update.result b/mysql-test/r/ndb_update.result index c2247564e65..164d1bd700c 100644 --- a/mysql-test/r/ndb_update.result +++ b/mysql-test/r/ndb_update.result @@ -18,7 +18,7 @@ pk1 b c 2 2 2 4 1 1 UPDATE t1 set pk1 = 1, c = 2 where pk1 = 4; -ERROR 23000: Duplicate entry '1' for key 1 +ERROR 23000: Duplicate entry '' for key 0 select * from t1 order by pk1; pk1 b c 0 0 0 diff --git a/mysql-test/t/ndb_condition_pushdown.test b/mysql-test/t/ndb_condition_pushdown.test index cc138b32b7e..748c26e2a9a 100644 --- a/mysql-test/t/ndb_condition_pushdown.test +++ b/mysql-test/t/ndb_condition_pushdown.test @@ -1649,6 +1649,16 @@ set engine_condition_pushdown = on; explain select * from t5 where b like '%jo%'; select * from t5 where b like '%jo%' order by a; +# bug#21056 ndb pushdown equal/setValue error on datetime +set engine_condition_pushdown = off; +select auto from t1 where date_time like '1902-02-02 %' order by auto; +select auto from t1 where date_time not like '1902-02-02 %' order by auto; +set engine_condition_pushdown = on; +explain select auto from t1 where date_time like '1902-02-02 %'; +select auto from t1 where date_time like '1902-02-02 %' order by auto; +explain select auto from t1 where date_time not like '1902-02-02 %'; +select auto from t1 where date_time not like '1902-02-02 %' order by auto; + # bug#17421 -1 drop table t1; create table t1 (a int, b varchar(3), primary key using hash(a)) diff --git a/mysql-test/t/ndb_multi.test b/mysql-test/t/ndb_multi.test index 1183f2b283f..ce8ce420793 100644 --- a/mysql-test/t/ndb_multi.test +++ b/mysql-test/t/ndb_multi.test @@ -69,4 +69,26 @@ drop table t1, t2, t3, t4; connection server2; drop table t1, t3, t4; +# bug#21378 +connection server1; +create table t1(c1 int key)ENGINE=MyISAM; +insert into t1 values(1),(3),(5); +select * from t1 order by c1; + +connection server2; +create table t1(c1 int key)ENGINE=MyISAM; +insert into t1 values(100),(344),(533); +select * from t1 order by c1; + +connection server1; +alter table t1 engine=ndb; + +connection server2; +show tables; +select * from t1 order by c1; +drop table t1; + +connection server1; +select * from t1 order by c1; +drop table t1; # End of 4.1 tests diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 5f18d5534e4..9a7a881d8e0 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -551,7 +551,14 @@ int ha_ndbcluster::ndb_err(NdbTransaction *trans) if (res == HA_ERR_FOUND_DUPP_KEY) { if (m_rows_to_insert == 1) - m_dupkey= table->s->primary_key; + { + /* + We can only distinguish between primary and non-primary + violations here, so we need to return MAX_KEY for non-primary + to signal that key is unknown + */ + m_dupkey= err.code == 630 ? table->s->primary_key : MAX_KEY; + } else { /* We are batching inserts, offending key is not available */ @@ -5072,16 +5079,15 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path, List<char> delete_list; while ((file_name=it++)) { + bool file_on_disk= false; DBUG_PRINT("info", ("%s", file_name)); if (hash_search(&ndb_tables, file_name, strlen(file_name))) { DBUG_PRINT("info", ("%s existed in NDB _and_ on disk ", file_name)); - // File existed in NDB and as frm file, put in ok_tables list - my_hash_insert(&ok_tables, (byte*)file_name); - continue; + file_on_disk= true; } - // File is not in NDB, check for .ndb file with this name + // Check for .ndb file with this name (void)strxnmov(name, FN_REFLEN, mysql_data_home,"/",db,"/",file_name,ha_ndb_ext,NullS); DBUG_PRINT("info", ("Check access for %s", name)); @@ -5089,9 +5095,25 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path, { DBUG_PRINT("info", ("%s did not exist on disk", name)); // .ndb file did not exist on disk, another table type + if (file_on_disk) + { + // Ignore this ndb table + gptr record= hash_search(&ndb_tables, file_name, strlen(file_name)); + DBUG_ASSERT(record); + hash_delete(&ndb_tables, record); + push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_TABLE_EXISTS_ERROR, + "Local table %s.%s shadows ndb table", + db, file_name); + } + continue; + } + if (file_on_disk) + { + // File existed in NDB and as frm file, put in ok_tables list + my_hash_insert(&ok_tables, (byte*)file_name); continue; } - DBUG_PRINT("info", ("%s existed on disk", name)); // The .ndb file exists on disk, but it's not in list of tables in ndb // Verify that handler agrees table is gone. @@ -6896,11 +6918,13 @@ void ndb_serialize_cond(const Item *item, void *arg) DBUG_PRINT("info", ("FIELD_ITEM")); DBUG_PRINT("info", ("table %s", tab->getName())); DBUG_PRINT("info", ("column %s", field->field_name)); + DBUG_PRINT("info", ("type %d", field->type())); DBUG_PRINT("info", ("result type %d", field->result_type())); // Check that we are expecting a field and with the correct // result type if (context->expecting(Item::FIELD_ITEM) && + context->expecting_field_type(field->type()) && (context->expecting_field_result(field->result_type()) || // Date and year can be written as string or int ((type == MYSQL_TYPE_TIME || @@ -6923,7 +6947,7 @@ void ndb_serialize_cond(const Item *item, void *arg) curr_cond->ndb_item= new Ndb_item(field, col->getColumnNo()); context->dont_expect(Item::FIELD_ITEM); context->expect_no_field_result(); - if (context->expect_mask) + if (! context->expecting_nothing()) { // We have not seen second argument yet if (type == MYSQL_TYPE_TIME || @@ -7120,6 +7144,9 @@ void ndb_serialize_cond(const Item *item, void *arg) func_item); context->expect(Item::STRING_ITEM); context->expect(Item::FIELD_ITEM); + context->expect_only_field_type(MYSQL_TYPE_STRING); + context->expect_field_type(MYSQL_TYPE_VAR_STRING); + context->expect_field_type(MYSQL_TYPE_VARCHAR); context->expect_field_result(STRING_RESULT); context->expect(Item::FUNC_ITEM); break; @@ -7225,7 +7252,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::STRING_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); @@ -7255,7 +7282,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::REAL_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); @@ -7278,7 +7305,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::INT_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); @@ -7301,7 +7328,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::DECIMAL_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); @@ -7351,7 +7378,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::STRING_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); @@ -7384,7 +7411,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::INT_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); @@ -7411,7 +7438,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::REAL_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); @@ -7434,7 +7461,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::VARBIN_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); @@ -7459,7 +7486,7 @@ void ndb_serialize_cond(const Item *item, void *arg) NDB_ITEM_QUALIFICATION q; q.value_type= Item::DECIMAL_ITEM; curr_cond->ndb_item= new Ndb_item(NDB_VALUE, q, item); - if (context->expect_field_result_mask) + if (! context->expecting_no_field_result()) { // We have not seen the field argument yet context->expect_only(Item::FIELD_ITEM); diff --git a/sql/ha_ndbcluster.h b/sql/ha_ndbcluster.h index cfb12981b98..f443a15ae77 100644 --- a/sql/ha_ndbcluster.h +++ b/sql/ha_ndbcluster.h @@ -362,53 +362,95 @@ class Ndb_cond_traverse_context Ndb_cond_traverse_context(TABLE *tab, void* ndb_tab, Ndb_cond_stack* stack) : table(tab), ndb_table(ndb_tab), supported(TRUE), stack_ptr(stack), cond_ptr(NULL), - expect_mask(0), expect_field_result_mask(0), skip(0), collation(NULL), - rewrite_stack(NULL) + skip(0), collation(NULL), rewrite_stack(NULL) { + // Allocate type checking bitmaps + bitmap_init(&expect_mask, 0, 512, FALSE); + bitmap_init(&expect_field_type_mask, 0, 512, FALSE); + bitmap_init(&expect_field_result_mask, 0, 512, FALSE); + if (stack) cond_ptr= stack->ndb_cond; }; ~Ndb_cond_traverse_context() { + bitmap_free(&expect_mask); + bitmap_free(&expect_field_type_mask); + bitmap_free(&expect_field_result_mask); if (rewrite_stack) delete rewrite_stack; } void expect(Item::Type type) { - expect_mask|= (1 << type); + bitmap_set_bit(&expect_mask, (uint) type); + if (type == Item::FIELD_ITEM) expect_all_field_types(); }; void dont_expect(Item::Type type) { - expect_mask&= ~(1 << type); + bitmap_clear_bit(&expect_mask, (uint) type); }; bool expecting(Item::Type type) { - return (expect_mask & (1 << type)); + return bitmap_is_set(&expect_mask, (uint) type); }; void expect_nothing() { - expect_mask= 0; + bitmap_clear_all(&expect_mask); }; + bool expecting_nothing() + { + return bitmap_is_clear_all(&expect_mask); + } void expect_only(Item::Type type) { - expect_mask= 0; + expect_nothing(); expect(type); }; + void expect_field_type(enum_field_types type) + { + bitmap_set_bit(&expect_field_type_mask, (uint) type); + }; + void expect_all_field_types() + { + bitmap_set_all(&expect_field_type_mask); + }; + bool expecting_field_type(enum_field_types type) + { + return bitmap_is_set(&expect_field_type_mask, (uint) type); + }; + void expect_no_field_type() + { + bitmap_clear_all(&expect_field_type_mask); + }; + bool expecting_no_field_type() + { + return bitmap_is_clear_all(&expect_field_type_mask); + } + void expect_only_field_type(enum_field_types result) + { + expect_no_field_type(); + expect_field_type(result); + }; + void expect_field_result(Item_result result) { - expect_field_result_mask|= (1 << result); + bitmap_set_bit(&expect_field_result_mask, (uint) result); }; bool expecting_field_result(Item_result result) { - return (expect_field_result_mask & (1 << result)); + return bitmap_is_set(&expect_field_result_mask, (uint) result); }; void expect_no_field_result() { - expect_field_result_mask= 0; + bitmap_clear_all(&expect_field_result_mask); }; + bool expecting_no_field_result() + { + return bitmap_is_clear_all(&expect_field_result_mask); + } void expect_only_field_result(Item_result result) { - expect_field_result_mask= 0; + expect_no_field_result(); expect_field_result(result); }; void expect_collation(CHARSET_INFO* col) @@ -428,8 +470,9 @@ class Ndb_cond_traverse_context bool supported; Ndb_cond_stack* stack_ptr; Ndb_cond* cond_ptr; - uint expect_mask; - uint expect_field_result_mask; + MY_BITMAP expect_mask; + MY_BITMAP expect_field_type_mask; + MY_BITMAP expect_field_result_mask; uint skip; CHARSET_INFO* collation; Ndb_rewrite_context *rewrite_stack; diff --git a/sql/handler.cc b/sql/handler.cc index 4accc746664..c95102c4bc0 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1774,12 +1774,22 @@ void handler::print_error(int error, myf errflag) /* Write the dupplicated key in the error message */ char key[MAX_KEY_LENGTH]; String str(key,sizeof(key),system_charset_info); - key_unpack(&str,table,(uint) key_nr); - uint max_length=MYSQL_ERRMSG_SIZE-(uint) strlen(ER(ER_DUP_ENTRY)); - if (str.length() >= max_length) + + if (key_nr == MAX_KEY) + { + /* Key is unknown */ + str.length(0); + key_nr= -1; + } + else { - str.length(max_length-4); - str.append(STRING_WITH_LEN("...")); + key_unpack(&str,table,(uint) key_nr); + uint max_length=MYSQL_ERRMSG_SIZE-(uint) strlen(ER(ER_DUP_ENTRY)); + if (str.length() >= max_length) + { + str.length(max_length-4); + str.append(STRING_WITH_LEN("...")); + } } my_error(ER_DUP_ENTRY, MYF(0), str.c_ptr(), key_nr+1); DBUG_VOID_RETURN; |