Loading innobase/dict/dict0dict.c +1 −1 Original line number Diff line number Diff line Loading @@ -2244,7 +2244,7 @@ dict_foreign_add_to_cache( Scans from pointer onwards. Stops if is at the start of a copy of 'string' where characters are compared without case sensitivity. Stops also at '\0'. */ static const char* dict_scan_to( /*=========*/ Loading innobase/include/dict0dict.h +12 −0 Original line number Diff line number Diff line Loading @@ -891,6 +891,18 @@ dict_tables_have_same_db( const char* name2); /* in: table name in the form dbname '/' tablename */ /************************************************************************* Scans from pointer onwards. Stops if is at the start of a copy of 'string' where characters are compared without case sensitivity. Stops also at '\0'. */ const char* dict_scan_to( /*=========*/ /* out: scanned up to this */ const char* ptr, /* in: scan from */ const char* string);/* in: look for this */ /* Buffers for storing detailed information about the latest foreign key and unique key errors */ extern FILE* dict_foreign_err_file; Loading innobase/row/row0ins.c +14 −17 Original line number Diff line number Diff line Loading @@ -1483,7 +1483,7 @@ row_ins_scan_sec_index_for_duplicate( ibool moved; mtr_t mtr; trx_t* trx; ibool success; const char* ptr; n_unique = dict_index_get_n_unique(index); Loading Loading @@ -1523,9 +1523,11 @@ row_ins_scan_sec_index_for_duplicate( trx = thr_get_trx(thr); ut_ad(trx); dict_accept(*trx->mysql_query_str, "REPLACE", &success); if (success) { ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE"); if ( ptr && *ptr != '\0') { /* The manual defines the REPLACE semantics that it is either an INSERT or DELETE(s) for duplicate key Loading Loading @@ -1605,7 +1607,7 @@ row_ins_duplicate_error_in_clust( page_t* page; ulint n_unique; trx_t* trx = thr_get_trx(thr); ibool success; const char* ptr; UT_NOT_USED(mtr); Loading Loading @@ -1639,10 +1641,9 @@ row_ins_duplicate_error_in_clust( sure that in roll-forward we get the same duplicate errors as in original execution */ dict_accept(*trx->mysql_query_str, "REPLACE", &success); ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE"); if (success) { if (ptr && *ptr != '\0') { /* The manual defines the REPLACE semantics that it is either an INSERT or DELETE(s) Loading Loading @@ -1683,15 +1684,11 @@ row_ins_duplicate_error_in_clust( /* The manual defines the REPLACE semantics that it is either an INSERT or DELETE(s) for duplicate key + INSERT. Therefore, we should take X-lock for duplicates. */ /* Is the first word in MySQL query REPLACE ? */ duplicates. */ dict_accept(*trx->mysql_query_str, "REPLACE", &success); ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE"); if (success) { if (ptr && *ptr != '\0') { err = row_ins_set_exclusive_rec_lock( LOCK_REC_NOT_GAP, Loading innobase/row/row0sel.c +10 −16 Original line number Diff line number Diff line Loading @@ -2794,7 +2794,7 @@ row_search_for_mysql( rec_t* index_rec; rec_t* clust_rec; rec_t* old_vers; ulint err; ulint err = DB_SUCCESS; ibool moved; ibool cons_read_requires_clust_rec; ibool was_lock_wait; Loading Loading @@ -3206,16 +3206,10 @@ row_search_for_mysql( /* Try to place a lock on the index record */ /* If innodb_locks_unsafe_for_binlog option is used, we lock only the record, i.e. next-key locking is not used. */ if ( srv_locks_unsafe_for_binlog ) { err = sel_set_rec_lock(rec, index, prebuilt->select_lock_type, LOCK_REC_NOT_GAP, thr); } else we do not lock gaps. Supremum record is really a gap and therefore we do not set locks there. */ if ( srv_locks_unsafe_for_binlog == FALSE ) { err = sel_set_rec_lock(rec, index, prebuilt->select_lock_type, Loading mysql-test/t/ctype_utf8.test +1 −0 Original line number Diff line number Diff line Loading @@ -568,6 +568,7 @@ DROP TABLE t1; # # Bug #5723: length(<varchar utf8 field>) returns varying results # --disable_warnings SET NAMES utf8; --disable_warnings CREATE TABLE t1 ( Loading Loading
innobase/dict/dict0dict.c +1 −1 Original line number Diff line number Diff line Loading @@ -2244,7 +2244,7 @@ dict_foreign_add_to_cache( Scans from pointer onwards. Stops if is at the start of a copy of 'string' where characters are compared without case sensitivity. Stops also at '\0'. */ static const char* dict_scan_to( /*=========*/ Loading
innobase/include/dict0dict.h +12 −0 Original line number Diff line number Diff line Loading @@ -891,6 +891,18 @@ dict_tables_have_same_db( const char* name2); /* in: table name in the form dbname '/' tablename */ /************************************************************************* Scans from pointer onwards. Stops if is at the start of a copy of 'string' where characters are compared without case sensitivity. Stops also at '\0'. */ const char* dict_scan_to( /*=========*/ /* out: scanned up to this */ const char* ptr, /* in: scan from */ const char* string);/* in: look for this */ /* Buffers for storing detailed information about the latest foreign key and unique key errors */ extern FILE* dict_foreign_err_file; Loading
innobase/row/row0ins.c +14 −17 Original line number Diff line number Diff line Loading @@ -1483,7 +1483,7 @@ row_ins_scan_sec_index_for_duplicate( ibool moved; mtr_t mtr; trx_t* trx; ibool success; const char* ptr; n_unique = dict_index_get_n_unique(index); Loading Loading @@ -1523,9 +1523,11 @@ row_ins_scan_sec_index_for_duplicate( trx = thr_get_trx(thr); ut_ad(trx); dict_accept(*trx->mysql_query_str, "REPLACE", &success); if (success) { ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE"); if ( ptr && *ptr != '\0') { /* The manual defines the REPLACE semantics that it is either an INSERT or DELETE(s) for duplicate key Loading Loading @@ -1605,7 +1607,7 @@ row_ins_duplicate_error_in_clust( page_t* page; ulint n_unique; trx_t* trx = thr_get_trx(thr); ibool success; const char* ptr; UT_NOT_USED(mtr); Loading Loading @@ -1639,10 +1641,9 @@ row_ins_duplicate_error_in_clust( sure that in roll-forward we get the same duplicate errors as in original execution */ dict_accept(*trx->mysql_query_str, "REPLACE", &success); ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE"); if (success) { if (ptr && *ptr != '\0') { /* The manual defines the REPLACE semantics that it is either an INSERT or DELETE(s) Loading Loading @@ -1683,15 +1684,11 @@ row_ins_duplicate_error_in_clust( /* The manual defines the REPLACE semantics that it is either an INSERT or DELETE(s) for duplicate key + INSERT. Therefore, we should take X-lock for duplicates. */ /* Is the first word in MySQL query REPLACE ? */ duplicates. */ dict_accept(*trx->mysql_query_str, "REPLACE", &success); ptr = dict_scan_to(*(trx->mysql_query_str), "REPLACE"); if (success) { if (ptr && *ptr != '\0') { err = row_ins_set_exclusive_rec_lock( LOCK_REC_NOT_GAP, Loading
innobase/row/row0sel.c +10 −16 Original line number Diff line number Diff line Loading @@ -2794,7 +2794,7 @@ row_search_for_mysql( rec_t* index_rec; rec_t* clust_rec; rec_t* old_vers; ulint err; ulint err = DB_SUCCESS; ibool moved; ibool cons_read_requires_clust_rec; ibool was_lock_wait; Loading Loading @@ -3206,16 +3206,10 @@ row_search_for_mysql( /* Try to place a lock on the index record */ /* If innodb_locks_unsafe_for_binlog option is used, we lock only the record, i.e. next-key locking is not used. */ if ( srv_locks_unsafe_for_binlog ) { err = sel_set_rec_lock(rec, index, prebuilt->select_lock_type, LOCK_REC_NOT_GAP, thr); } else we do not lock gaps. Supremum record is really a gap and therefore we do not set locks there. */ if ( srv_locks_unsafe_for_binlog == FALSE ) { err = sel_set_rec_lock(rec, index, prebuilt->select_lock_type, Loading
mysql-test/t/ctype_utf8.test +1 −0 Original line number Diff line number Diff line Loading @@ -568,6 +568,7 @@ DROP TABLE t1; # # Bug #5723: length(<varchar utf8 field>) returns varying results # --disable_warnings SET NAMES utf8; --disable_warnings CREATE TABLE t1 ( Loading