From 750fca61f9f0aa8830e583a8d84f60f14a4e76aa Mon Sep 17 00:00:00 2001 From: "igor@igor-inspiron.creware.com" <> Date: Mon, 13 Jun 2005 06:10:19 -0700 Subject: [PATCH 1/4] ctype_utf8.test, ctype_utf8.result: Added a test case for bug #11167. sql_select.cc: Fixed bug #11167. In 4.1 char/varchar fields are limited by 255 characters in length that make them longer than 255 bytes in size for such character sets as UTF8. The functions store_record_in_cache and read_cached_records did not take into account this Moreover the code did not take into account that the size of the varchar fields in 5.0 can be up to 65535 bytes --- BitKeeper/etc/logging_ok | 1 + mysql-test/r/ctype_utf8.result | 34 +++++++++++++++++++++++++++ mysql-test/t/ctype_utf8.test | 42 ++++++++++++++++++++++++++++++++++ sql/sql_select.cc | 12 +++++----- 4 files changed, 83 insertions(+), 6 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 343fb26c83a..717c9cd9261 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -80,6 +80,7 @@ hf@deer.mysql.r18.ru hf@genie.(none) holyfoot@mysql.com igor@hundin.mysql.fi +igor@igor-inspiron.creware.com igor@linux.local igor@rurik.mysql.com ingo@mysql.com diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 29b18f0431c..12ef8dfb8e8 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -905,3 +905,37 @@ select * from t1 where city = 'Durban '; id city 2 Durban drop table t1; +SET NAMES UTF8; +CREATE TABLE t1 ( +`id` int(20) NOT NULL auto_increment, +`country` varchar(100) NOT NULL default '', +`shortcode` varchar(100) NOT NULL default '', +`operator` varchar(100) NOT NULL default '', +`momid` varchar(30) NOT NULL default '', +`keyword` varchar(160) NOT NULL default '', +`content` varchar(160) NOT NULL default '', +`second_token` varchar(160) default NULL, +`gateway_id` int(11) NOT NULL default '0', +`created` datetime NOT NULL default '0000-00-00 00:00:00', +`msisdn` varchar(15) NOT NULL default '', +PRIMARY KEY (`id`), +UNIQUE KEY `MSCCSPK_20030521130957121` (`momid`), +KEY `IX_mobile_originated_message_keyword` (`keyword`), +KEY `IX_mobile_originated_message_created` (`created`), +KEY `IX_mobile_originated_message_support` (`msisdn`,`momid`,`keyword`,`gateway_id`,`created`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +INSERT INTO t1 VALUES +(1,'blah','464','aaa','fkc1c9ilc20x0hgae7lx6j09','ERR','ERR Имри.Афимим.Аеимимримдмримрмрирор имримримримр имридм ирбднримрфмририримрфмфмим.Ад.Д имдимримрад.Адимримримрмдиримримримр м.Дадимфшьмримд им.Адимимрн имадми','ИМРИ.АФИМИМ.АЕИМИМРИМДМРИМРМРИРОР',3,'2005-06-01 17:30:43','1234567890'), +(2,'blah','464','aaa','haxpl2ilc20x00bj4tt2m5ti','11','11 g','G',3,'2005-06-02 22:43:10','1234567890'); +CREATE TABLE t2 ( +`msisdn` varchar(15) NOT NULL default '', +`operator_id` int(11) NOT NULL default '0', +`created` datetime NOT NULL default '0000-00-00 00:00:00', +UNIQUE KEY `PK_user` (`msisdn`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO t2 VALUES ('1234567890',2,'2005-05-24 13:53:25'); +SELECT content, t2.msisdn FROM t1, t2 WHERE t1.msisdn = '1234567890'; +content msisdn +ERR Имри.Афимим.Аеимимримдмримрмрирор имримримримр имридм ирбднримрфмририримрфмфмим.Ад.Д имдимримрад.Адимримримрмдиримримримр м.Дадимфшьмримд им.Адимимрн имадми 1234567890 +11 g 1234567890 +DROP TABLE t1,t2; diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index 3c49b2a47f7..343b7c867e7 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -746,3 +746,45 @@ insert into t1 values (2,'Durban'); select * from t1 where city = 'Durban'; select * from t1 where city = 'Durban '; drop table t1; + +# +# Test for bug #11167: join for utf8 varchar value longer than 255 bytes +# + +SET NAMES UTF8; + +CREATE TABLE t1 ( + `id` int(20) NOT NULL auto_increment, + `country` varchar(100) NOT NULL default '', + `shortcode` varchar(100) NOT NULL default '', + `operator` varchar(100) NOT NULL default '', + `momid` varchar(30) NOT NULL default '', + `keyword` varchar(160) NOT NULL default '', + `content` varchar(160) NOT NULL default '', + `second_token` varchar(160) default NULL, + `gateway_id` int(11) NOT NULL default '0', + `created` datetime NOT NULL default '0000-00-00 00:00:00', + `msisdn` varchar(15) NOT NULL default '', + PRIMARY KEY (`id`), + UNIQUE KEY `MSCCSPK_20030521130957121` (`momid`), + KEY `IX_mobile_originated_message_keyword` (`keyword`), + KEY `IX_mobile_originated_message_created` (`created`), + KEY `IX_mobile_originated_message_support` (`msisdn`,`momid`,`keyword`,`gateway_id`,`created`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +INSERT INTO t1 VALUES +(1,'blah','464','aaa','fkc1c9ilc20x0hgae7lx6j09','ERR','ERR Имри.Афимим.Аеимимримдмримрмрирор имримримримр имридм ирбднримрфмририримрфмфмим.Ад.Д имдимримрад.Адимримримрмдиримримримр м.Дадимфшьмримд им.Адимимрн имадми','ИМРИ.АФИМИМ.АЕИМИМРИМДМРИМРМРИРОР',3,'2005-06-01 17:30:43','1234567890'), +(2,'blah','464','aaa','haxpl2ilc20x00bj4tt2m5ti','11','11 g','G',3,'2005-06-02 22:43:10','1234567890'); + +CREATE TABLE t2 ( + `msisdn` varchar(15) NOT NULL default '', + `operator_id` int(11) NOT NULL default '0', + `created` datetime NOT NULL default '0000-00-00 00:00:00', + UNIQUE KEY `PK_user` (`msisdn`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO t2 VALUES ('1234567890',2,'2005-05-24 13:53:25'); + +SELECT content, t2.msisdn FROM t1, t2 WHERE t1.msisdn = '1234567890'; + +DROP TABLE t1,t2; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 5b1603b44e2..2cb650cda2a 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -8112,9 +8112,9 @@ store_record_in_cache(JOIN_CACHE *cache) end > str && end[-1] == ' ' ; end--) ; length=(uint) (end-str); - memcpy(pos+1,str,length); - *pos=(uchar) length; - pos+=length+1; + memcpy(pos+sizeof(uint), str, length); + *((uint *) pos)= length; + pos+= length+sizeof(uint); } else { @@ -8177,9 +8177,9 @@ read_cached_record(JOIN_TAB *tab) { if (copy->strip) { - memcpy(copy->str,pos+1,length=(uint) *pos); - memset(copy->str+length,' ',copy->length-length); - pos+=1+length; + memcpy(copy->str, pos+sizeof(uint), length= *((uint *) pos)); + memset(copy->str+length, ' ', copy->length-length); + pos+= sizeof(uint)+length; } else { From 57ddf5223f8925db9c3a7d21f960726033ae23f0 Mon Sep 17 00:00:00 2001 From: "tulin@dl145c.mysql.com" <> Date: Mon, 13 Jun 2005 19:45:15 +0200 Subject: [PATCH 2/4] logging_ok: Logging to logging@openlogging.org accepted DbtcMain.cpp, testTimeout.cpp: Bug #11290 TransactionInactiveTimeout = 0 does not result in infinite timeout --- BitKeeper/etc/logging_ok | 1 + ndb/src/kernel/blocks/dbtc/DbtcMain.cpp | 16 +++-- ndb/test/ndbapi/testTimeout.cpp | 86 +++++++++++++++++++++---- 3 files changed, 85 insertions(+), 18 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 343fb26c83a..bdb93f5adbf 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -176,6 +176,7 @@ mysqldev@melody.local mysqldev@mysql.com mysqldev@o2k.irixworld.net ndbdev@dl145b.mysql.com +ndbdev@dl145c.mysql.com ndbdev@eel.hemma.oreland.se ndbdev@ndbmaster.mysql.com nick@mysql.com diff --git a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp index ca97a5bce6d..736a660f396 100644 --- a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp +++ b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp @@ -722,11 +722,14 @@ Dbtc::set_timeout_value(Uint32 timeOut) void Dbtc::set_appl_timeout_value(Uint32 timeOut) { - timeOut /= 10; - if (timeOut < ctimeOutValue) { - jam(); - c_appl_timeout_value = ctimeOutValue; - }//if + if (timeOut) + { + timeOut /= 10; + if (timeOut < ctimeOutValue) { + jam(); + c_appl_timeout_value = ctimeOutValue; + }//if + } c_appl_timeout_value = timeOut; } @@ -6133,7 +6136,8 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr) particular state we will use the application timeout parameter rather than the shorter Deadlock detection timeout. */ - if ((ctcTimer - getApiConTimer(apiConnectptr.i)) <= c_appl_timeout_value) { + if (c_appl_timeout_value == 0 || + (ctcTimer - getApiConTimer(apiConnectptr.i)) <= c_appl_timeout_value) { jam(); return; }//if diff --git a/ndb/test/ndbapi/testTimeout.cpp b/ndb/test/ndbapi/testTimeout.cpp index e310e12df81..71c11b25859 100644 --- a/ndb/test/ndbapi/testTimeout.cpp +++ b/ndb/test/ndbapi/testTimeout.cpp @@ -22,14 +22,14 @@ #include #include -#define TIMEOUT 3000 - +#define TIMEOUT (Uint32)3000 Uint32 g_org_timeout = 3000; int setTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){ NdbRestarter restarter; - + int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT); + NdbConfig conf(GETNDB(step)->getNodeId()+1); unsigned int nodeId = conf.getMasterNodeId(); if (!conf.getProperty(nodeId, @@ -39,7 +39,7 @@ setTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){ return NDBT_FAILED; } - int val[] = { DumpStateOrd::TcSetApplTransactionTimeout, TIMEOUT }; + int val[] = { DumpStateOrd::TcSetApplTransactionTimeout, timeout }; if(restarter.dumpStateAllNodes(val, 2) != 0){ return NDBT_FAILED; } @@ -94,9 +94,11 @@ int runTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ unsigned int nodeId = conf.getMasterNodeId(); int stepNo = step->getStepNo(); - int minSleep = (int)(TIMEOUT * 1.5); - int maxSleep = TIMEOUT * 2; - ndbout << "TransactionInactiveTimeout="<< TIMEOUT + int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT); + + int minSleep = (int)(timeout * 1.5); + int maxSleep = timeout * 2; + ndbout << "TransactionInactiveTimeout="<< timeout << ", minSleep="<getNumRecords(); - int minSleep = (int)(TIMEOUT * 1.5); - int maxSleep = TIMEOUT * 2; + int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT); + + int minSleep = (int)(timeout * 1.5); + int maxSleep = timeout * 2; HugoOperations hugoOps(*ctx->getTab()); Ndb* pNdb = GETNDB(step); @@ -148,7 +152,7 @@ int runTimeoutTrans2(NDBT_Context* ctx, NDBT_Step* step){ op1 = (op1 % 5); op2 = (op2 % 5); - ndbout << stepNo << ": TransactionInactiveTimeout="<< TIMEOUT + ndbout << stepNo << ": TransactionInactiveTimeout="<< timeout << ", minSleep="<getNumLoops(); @@ -334,6 +385,17 @@ TESTCASE("DontTimeoutTransaction", FINALIZER(resetTransactionTimeout); FINALIZER(runClearTable); } +TESTCASE("Bug11290", + "Setting TransactionInactiveTimeout to 0(zero) "\ + "should result in infinite timeout, and not as "\ + "was the bug, a timeout that is equal to the deadlock timeout"){ + TC_PROPERTY("TransactionInactiveTimeout",(Uint32)0); + INITIALIZER(runLoadTable); + INITIALIZER(setTransactionTimeout); + STEPS(runDeadlockTimeoutTrans, 1); + FINALIZER(resetTransactionTimeout); + FINALIZER(runClearTable); +} TESTCASE("DontTimeoutTransaction5", "Test that the transaction does not timeout "\ "if we sleep during the transaction. Use a sleep "\ From 42271e424013f70534da3e2e84ca55005ac4e92c Mon Sep 17 00:00:00 2001 From: "igor@igor-inspiron.creware.com" <> Date: Mon, 13 Jun 2005 11:24:26 -0700 Subject: [PATCH 3/4] func_if.result, func_if.test: Added a test case for bug #11142. item_cmpfunc.cc: Fixed bug #11142. Implementation of Item_func_nullif::is_null was corrected. --- mysql-test/r/func_if.result | 27 +++++++++++++++++++++++++++ mysql-test/t/func_if.test | 27 +++++++++++++++++++++++++++ sql/item_cmpfunc.cc | 4 +--- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index 508a50caf02..dd8f34d53d2 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -86,3 +86,30 @@ drop table t1; SELECT NULLIF(5,5) IS NULL, NULLIF(5,5) IS NOT NULL; NULLIF(5,5) IS NULL NULLIF(5,5) IS NOT NULL 1 0 +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a CHAR(10)); +INSERT INTO t1 VALUES ('aaa'), (NULL), (''), ('bbb'); +SELECT a, NULLIF(a,'') FROM t1; +a NULLIF(a,'') +aaa aaa +NULL NULL + NULL +bbb bbb +SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; +a NULLIF(a,'') +NULL NULL + NULL +DROP TABLE t1; +CREATE TABLE t1 (a CHAR(10)); +INSERT INTO t1 VALUES ('aaa'), (NULL), (''), ('bbb'); +SELECT a, NULLIF(a,'') FROM t1; +a NULLIF(a,'') +aaa aaa +NULL NULL + NULL +bbb bbb +SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; +a NULLIF(a,'') +NULL NULL + NULL +DROP TABLE t1; diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test index 693773b18c8..ae820fae93b 100644 --- a/mysql-test/t/func_if.test +++ b/mysql-test/t/func_if.test @@ -60,3 +60,30 @@ drop table t1; # Bug #5595 NULLIF() IS NULL returns false if NULLIF() returns NULL # SELECT NULLIF(5,5) IS NULL, NULLIF(5,5) IS NOT NULL; +# +# Test to check evaluation of MULLIF when the first argument is NULL +# (motivated by the Bug 11142) +# + +--disable_warnings +DROP TABLE IF EXISTS t1; +--enable_warnings + +CREATE TABLE t1 (a CHAR(10)); +INSERT INTO t1 VALUES ('aaa'), (NULL), (''), ('bbb'); +SELECT a, NULLIF(a,'') FROM t1; +SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; + +DROP TABLE t1; + +# +# Test for bug #11142: evaluation of NULLIF when the first argument is NULL +# + +CREATE TABLE t1 (a CHAR(10)); +INSERT INTO t1 VALUES ('aaa'), (NULL), (''), ('bbb'); + +SELECT a, NULLIF(a,'') FROM t1; +SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; + +DROP TABLE t1; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 337ac949d35..3098e5dc77e 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1161,9 +1161,7 @@ Item_func_nullif::val_str(String *str) bool Item_func_nullif::is_null() { - if (!cmp.compare()) - return (null_value=1); - return 0; + return (null_value= (!cmp.compare() ? 1 : args[0]->null_value)); } /* From 754e6c05274f434211f71be6768524e426809d65 Mon Sep 17 00:00:00 2001 From: "igor@igor-inspiron.creware.com" <> Date: Mon, 13 Jun 2005 11:38:16 -0700 Subject: [PATCH 4/4] func_if.result, func_if.test: Correction for test case of bug #11142. --- mysql-test/r/func_if.result | 14 -------------- mysql-test/t/func_if.test | 15 --------------- 2 files changed, 29 deletions(-) diff --git a/mysql-test/r/func_if.result b/mysql-test/r/func_if.result index dd8f34d53d2..2c8f19f1754 100644 --- a/mysql-test/r/func_if.result +++ b/mysql-test/r/func_if.result @@ -86,20 +86,6 @@ drop table t1; SELECT NULLIF(5,5) IS NULL, NULLIF(5,5) IS NOT NULL; NULLIF(5,5) IS NULL NULLIF(5,5) IS NOT NULL 1 0 -DROP TABLE IF EXISTS t1; -CREATE TABLE t1 (a CHAR(10)); -INSERT INTO t1 VALUES ('aaa'), (NULL), (''), ('bbb'); -SELECT a, NULLIF(a,'') FROM t1; -a NULLIF(a,'') -aaa aaa -NULL NULL - NULL -bbb bbb -SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; -a NULLIF(a,'') -NULL NULL - NULL -DROP TABLE t1; CREATE TABLE t1 (a CHAR(10)); INSERT INTO t1 VALUES ('aaa'), (NULL), (''), ('bbb'); SELECT a, NULLIF(a,'') FROM t1; diff --git a/mysql-test/t/func_if.test b/mysql-test/t/func_if.test index ae820fae93b..4333defa412 100644 --- a/mysql-test/t/func_if.test +++ b/mysql-test/t/func_if.test @@ -60,21 +60,6 @@ drop table t1; # Bug #5595 NULLIF() IS NULL returns false if NULLIF() returns NULL # SELECT NULLIF(5,5) IS NULL, NULLIF(5,5) IS NOT NULL; -# -# Test to check evaluation of MULLIF when the first argument is NULL -# (motivated by the Bug 11142) -# - ---disable_warnings -DROP TABLE IF EXISTS t1; ---enable_warnings - -CREATE TABLE t1 (a CHAR(10)); -INSERT INTO t1 VALUES ('aaa'), (NULL), (''), ('bbb'); -SELECT a, NULLIF(a,'') FROM t1; -SELECT a, NULLIF(a,'') FROM t1 WHERE NULLIF(a,'') IS NULL; - -DROP TABLE t1; # # Test for bug #11142: evaluation of NULLIF when the first argument is NULL