diff --git a/include/hash.h b/include/hash.h index cd7210a290c0db9e30617ee20cafdd17d0bc77aa..9a6d91036e195c4c14b9b86423556370b6236914 100644 --- a/include/hash.h +++ b/include/hash.h @@ -47,7 +47,7 @@ my_bool _hash_init(HASH *hash, CHARSET_INFO *charset, uint key_length, hash_get_key get_key, void (*free_element)(void*), uint flags CALLER_INFO_PROTO); void hash_free(HASH *tree); -void hash_reset(HASH *hash); +void my_hash_reset(HASH *hash); byte *hash_element(HASH *hash,uint idx); gptr hash_search(HASH *info,const byte *key,uint length); gptr hash_next(HASH *info,const byte *key,uint length); diff --git a/mysql-test/r/bdb.result b/mysql-test/r/bdb.result index e3674486a21fa5ba2d006da37eea52d75f8f2d28..d743bc0367503c5e694ba03644ac3944810fd573 100644 --- a/mysql-test/r/bdb.result +++ b/mysql-test/r/bdb.result @@ -1300,7 +1300,7 @@ insert into t1 values('+ ', '+ ', '+ '); set @a=repeat(' ',20); insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a)); Warnings: -Warning 1265 Data truncated for column 'v' at row 1 +Note 1265 Data truncated for column 'v' at row 1 select concat('*',v,'*',c,'*',t,'*') from t1; concat('*',v,'*',c,'*',t,'*') *+ *+*+ * @@ -1346,7 +1346,7 @@ t1 CREATE TABLE `t1` ( ) ENGINE=BerkeleyDB DEFAULT CHARSET=latin1 alter table t1 modify t varchar(10); Warnings: -Warning 1265 Data truncated for column 't' at row 2 +Note 1265 Data truncated for column 't' at row 2 show create table t1; Table Create Table t1 CREATE TABLE `t1` ( diff --git a/mysql-test/r/heap.result b/mysql-test/r/heap.result index 50f6d3d56fcc161f1f2014fcc8712eceffdc7310..4d5aabb8b3aeab875023ace4ccaa572f0c7cca63 100644 --- a/mysql-test/r/heap.result +++ b/mysql-test/r/heap.result @@ -255,7 +255,7 @@ insert into t1 values('+ ', '+ ', '+ '); set @a=repeat(' ',20); insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a)); Warnings: -Warning 1265 Data truncated for column 'v' at row 1 +Note 1265 Data truncated for column 'v' at row 1 select concat('*',v,'*',c,'*',t,'*') from t1; concat('*',v,'*',c,'*',t,'*') *+ *+*+ * diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index 1ac2f9631d7fd4f076a2baad102aa89eb4bd6264..138cae5caddeaf2772220085a4a3ddd28b9e34b4 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -571,7 +571,7 @@ insert into t1 values('+ ', '+ ', '+ '); set @a=repeat(' ',20); insert into t1 values (concat('+',@a),concat('+',@a),concat('+',@a)); Warnings: -Warning 1265 Data truncated for column 'v' at row 1 +Note 1265 Data truncated for column 'v' at row 1 select concat('*',v,'*',c,'*',t,'*') from t1; concat('*',v,'*',c,'*',t,'*') *+ *+*+ * @@ -617,7 +617,7 @@ t1 CREATE TABLE `t1` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 alter table t1 modify t varchar(10); Warnings: -Warning 1265 Data truncated for column 't' at row 2 +Note 1265 Data truncated for column 't' at row 2 show create table t1; Table Create Table t1 CREATE TABLE `t1` ( diff --git a/mysql-test/r/ndb_index_ordered.result b/mysql-test/r/ndb_index_ordered.result index ccb202b25a86c8f5e293c0249822ffbccb395ebc..7558e5cdb114b26467d702addc7af4fa208593a2 100644 --- a/mysql-test/r/ndb_index_ordered.result +++ b/mysql-test/r/ndb_index_ordered.result @@ -529,3 +529,19 @@ count(*)-8 select count(*)-9 from t1 use index (ti) where ti <= '23:59:59'; count(*)-9 0 +drop table t1; +create table t1(a int primary key, b int not null, index(b)); +insert into t1 values (1,1), (2,2); +set autocommit=0; +begin; +select count(*) from t1; +count(*) +2 +ALTER TABLE t1 ADD COLUMN c int; +select a from t1 where b = 2; +a +2 +show tables; +Tables_in_test +t1 +drop table t1; diff --git a/mysql-test/r/strict.result b/mysql-test/r/strict.result index 4da0f1e48f19f34518d3b9d733bf1e8232ceab39..f0f7ed9684e58a71e94ea598d0fb1e1e21f323b0 100644 --- a/mysql-test/r/strict.result +++ b/mysql-test/r/strict.result @@ -818,7 +818,6 @@ ERROR 01000: Data truncated for column 'col1' at row 1 INSERT INTO t1 (col2) VALUES ('hellobob'); ERROR 01000: Data truncated for column 'col2' at row 1 INSERT INTO t1 (col2) VALUES ('hello '); -ERROR 01000: Data truncated for column 'col2' at row 1 UPDATE t1 SET col1 ='hellobob' WHERE col1 ='he'; ERROR 01000: Data truncated for column 'col1' at row 2 UPDATE t1 SET col2 ='hellobob' WHERE col2 ='he'; @@ -835,6 +834,7 @@ col1 col2 hello hello he hellot hello hello +NULL hello hello hellob DROP TABLE t1; CREATE TABLE t1 (col1 enum('red','blue','green')); diff --git a/mysql-test/t/ndb_index_ordered.test b/mysql-test/t/ndb_index_ordered.test index b7a5b418f441865b7682b4ec2e3439b6cc44323a..1e70eac181e7e4790cb447cfce658aa388177a23 100644 --- a/mysql-test/t/ndb_index_ordered.test +++ b/mysql-test/t/ndb_index_ordered.test @@ -267,3 +267,21 @@ select count(*)-5 from t1 use index (ti) where ti < '10:11:11'; select count(*)-6 from t1 use index (ti) where ti <= '10:11:11'; select count(*)-8 from t1 use index (ti) where ti < '23:59:59'; select count(*)-9 from t1 use index (ti) where ti <= '23:59:59'; + +drop table t1; + +# bug#7798 +create table t1(a int primary key, b int not null, index(b)); +insert into t1 values (1,1), (2,2); +connect (con1,localhost,,,test); +connect (con2,localhost,,,test); +connection con1; +set autocommit=0; +begin; +select count(*) from t1; +connection con2; +ALTER TABLE t1 ADD COLUMN c int; +connection con1; +select a from t1 where b = 2; +show tables; +drop table t1; diff --git a/mysys/hash.c b/mysys/hash.c index 451bc1eb7f5c245e4a32be0c6058704b56f45604..6091ef39a4ed3412c17386665450bcb3f70598a5 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -122,13 +122,13 @@ void hash_free(HASH *hash) Delete all elements from the hash (the hash itself is to be reused). SYNOPSIS - hash_reset() + my_hash_reset() hash the hash to delete elements of */ -void hash_reset(HASH *hash) +void my_hash_reset(HASH *hash) { - DBUG_ENTER("hash_reset"); + DBUG_ENTER("my_hash_reset"); DBUG_PRINT("enter",("hash: 0x%lxd",hash)); hash_free_elements(hash); diff --git a/ndb/src/common/transporter/TransporterRegistry.cpp b/ndb/src/common/transporter/TransporterRegistry.cpp index 9273ad8bc80e6e84b54df27ba5392abff2b216db..fcc7a62d9e9cae77506146b1b69720707b2dd0d4 100644 --- a/ndb/src/common/transporter/TransporterRegistry.cpp +++ b/ndb/src/common/transporter/TransporterRegistry.cpp @@ -1419,6 +1419,6 @@ NdbOut & operator <<(NdbOut & out, SignalHeader & sh){ Transporter* TransporterRegistry::get_transporter(NodeId nodeId) { return theTransporters[nodeId]; -}; +} template class Vector<TransporterRegistry::Transporter_interface>; diff --git a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp index 5e79fc1c28f8b4f8f5f2e76d5ac2e98f1183a3da..5164ce572f4c9d6a0010f50f0393050bd2848164 100644 --- a/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp +++ b/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp @@ -1920,7 +1920,6 @@ void Dbtc::packKeyData000Lab(Signal* signal, Uint32 totalLen) { CacheRecord * const regCachePtr = cachePtr.p; - UintR Tmp; jam(); Uint32 len = 0; @@ -8646,14 +8645,16 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) apiConnectptr.i = scanTabReq->apiConnectPtr; tabptr.i = scanTabReq->tableId; - if (apiConnectptr.i >= capiConnectFilesize || - tabptr.i >= ctabrecFilesize) { + if (apiConnectptr.i >= capiConnectFilesize) + { jam(); warningHandlerLab(signal); return; }//if + ptrAss(apiConnectptr, apiConnectRecord); ApiConnectRecord * transP = apiConnectptr.p; + if (transP->apiConnectstate != CS_CONNECTED) { jam(); // could be left over from TCKEYREQ rollback @@ -8667,9 +8668,16 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) } else { jam(); errCode = ZSTATE_ERROR; - goto SCAN_TAB_error; + goto SCAN_TAB_error_no_state_change; } } + + if(tabptr.i >= ctabrecFilesize) + { + errCode = ZUNKNOWN_TABLE_ERROR; + goto SCAN_TAB_error; + } + ptrAss(tabptr, tableRecord); if ((aiLength == 0) || (!tabptr.p->checkTable(schemaVersion)) || @@ -8766,8 +8774,18 @@ void Dbtc::execSCAN_TABREQ(Signal* signal) errCode = ZNO_SCANREC_ERROR; goto SCAN_TAB_error; - SCAN_TAB_error: +SCAN_TAB_error: jam(); + /** + * Prepare for up coming ATTRINFO/KEYINFO + */ + transP->apiConnectstate = CS_ABORTING; + transP->abortState = AS_IDLE; + transP->transid[0] = transid1; + transP->transid[1] = transid2; + +SCAN_TAB_error_no_state_change: + ScanTabRef * ref = (ScanTabRef*)&signal->theData[0]; ref->apiConnectPtr = transP->ndbapiConnect; ref->transId1 = transid1; diff --git a/sql/field.cc b/sql/field.cc index f89479d9314e7be50a3785e1da87b553a36dd3c4..175ca09df371db8b81f9decc91eaf82efe9ad6a1 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4672,6 +4672,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) uint32 not_used, copy_length; char buff[80]; String tmpstr(buff,sizeof(buff), &my_charset_bin); + enum MYSQL_ERROR::enum_warning_level level= MYSQL_ERROR::WARN_LEVEL_WARN; /* Convert character set if nesessary */ if (String::needs_conversion(length, cs, field_charset, ¬_used)) @@ -4696,11 +4697,24 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) *ptr= (uchar) copy_length; else int2store(ptr, copy_length); - - if (copy_length < length) + + // Check if we lost something other than just trailing spaces + if ((copy_length < length) && table->in_use->count_cuted_fields) + { + const char *end= from + length; + from+= copy_length; + from+= field_charset->cset->scan(field_charset, from, end, MY_SEQ_SPACES); + /* + If we lost only spaces then produce a NOTE, not a WARNING. + But if we have already had errors (e.g with charset conversion), + then don't reset level to NOTE. + */ + if (from == end && !error) + level= MYSQL_ERROR::WARN_LEVEL_NOTE; error= 1; + } if (error) - set_warning(MYSQL_ERROR::WARN_LEVEL_WARN, ER_WARN_DATA_TRUNCATED, 1); + set_warning(level, ER_WARN_DATA_TRUNCATED, 1); return error; } diff --git a/sql/net_serv.cc b/sql/net_serv.cc index 55f56645f821e43d7f0d89cf863c99e79f7299ee..bd3bbe3e1a9430401a023dd476dc1dc380cebcfe 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -255,7 +255,7 @@ my_bool my_net_write(NET *net,const char *packet,ulong len) { uchar buff[NET_HEADER_SIZE]; - if (unlikely(!net->vio)) // nowhere to write + if (unlikely(!net->vio)) /* nowhere to write */ return 0; /* Big packets are handled by splitting them in packets of MAX_PACKET_LENGTH diff --git a/sql/sql_class.h b/sql/sql_class.h index 976c6789d9f2287d981bf4272140eab475e151b8..033f5674d340de546e510977118e401bf73fa977 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -742,8 +742,8 @@ class Statement_map /* Erase all statements (calls Statement destructor) */ void reset() { - hash_reset(&names_hash); - hash_reset(&st_hash); + my_hash_reset(&names_hash); + my_hash_reset(&st_hash); last_found_statement= 0; } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 5929ad5c14b2586b328834b1c970625a7aa9bce4..495fa4a0bd168b7dbe27b3499db64fffcec0f2d9 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -172,7 +172,7 @@ void lex_start(THD *thd, uchar *buf,uint length) lex->proc_list.first= 0; if (lex->spfuns.records) - hash_reset(&lex->spfuns); + my_hash_reset(&lex->spfuns); } void lex_end(LEX *lex)