From 1ef22e28ad7744d436c694e970420c426fc7095a Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 16 Mar 2023 17:24:12 +0200 Subject: [PATCH 001/171] MDEV-26258 Various crashes/asserts/corruptions when Aria encryption is enabled/used, but the encryption plugin is not loaded The reason for the MDEV reported failures is that the tests are enabling encryption for Aria but not providing any encryption keys. Fixed by checking if encryption keys exists before creating the table. Other things: - maria.encrypt_wrong-key changed as we now get the error on CREATE instead during insert. --- include/handler_ername.h | 1 + include/my_base.h | 6 +- include/my_handler_errors.h | 3 +- .../include/wait_until_connected_again.inc | 6 +- mysql-test/suite/maria/encrypt-no-key.result | 36 ++++++++---- mysql-test/suite/maria/encrypt-no-key.test | 55 ++++++++++++++++--- .../suite/maria/encrypt-wrong-key.result | 12 ++-- mysql-test/suite/maria/encrypt-wrong-key.test | 7 ++- storage/maria/ha_maria.cc | 3 +- storage/maria/ma_create.c | 2 + storage/maria/ma_crypt.c | 35 ++++++++++-- storage/maria/ma_crypt.h | 3 +- storage/maria/ma_delete_table.c | 7 ++- storage/maria/ma_open.c | 3 +- 14 files changed, 135 insertions(+), 44 deletions(-) diff --git a/include/handler_ername.h b/include/handler_ername.h index fe55062e6fb..20e62487c2c 100644 --- a/include/handler_ername.h +++ b/include/handler_ername.h @@ -79,3 +79,4 @@ { "HA_ERR_ABORTED_BY_USER", HA_ERR_ABORTED_BY_USER, "" }, { "HA_ERR_DISK_FULL", HA_ERR_DISK_FULL, "" }, { "HA_ERR_INCOMPATIBLE_DEFINITION", HA_ERR_INCOMPATIBLE_DEFINITION, "" }, +{ "HA_ERR_NO_ENCRYPTION", HA_ERR_NO_ENCRYPTION, "" }, diff --git a/include/my_base.h b/include/my_base.h index 32ef6f7fe85..cc3d57cb0b1 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -48,6 +48,7 @@ #define HA_OPEN_NO_PSI_CALL 1024U /* Don't call/connect PSI */ #define HA_OPEN_MERGE_TABLE 2048U #define HA_OPEN_FOR_CREATE 4096U +#define HA_OPEN_FOR_DROP (1U << 13) /* Open part of drop */ /* Allow opening even if table is incompatible as this is for ALTER TABLE which @@ -516,14 +517,15 @@ enum ha_base_keytype { #define HA_ERR_DISK_FULL 189 #define HA_ERR_INCOMPATIBLE_DEFINITION 190 #define HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE 191 /* Too many words in a phrase */ -#define HA_ERR_DECRYPTION_FAILED 192 /* Table encrypted but decypt failed */ +#define HA_ERR_DECRYPTION_FAILED 192 /* Table encrypted but decrypt failed */ #define HA_ERR_FK_DEPTH_EXCEEDED 193 /* FK cascade depth exceeded */ #define HA_ERR_TABLESPACE_MISSING 194 /* Missing Tablespace */ #define HA_ERR_SEQUENCE_INVALID_DATA 195 #define HA_ERR_SEQUENCE_RUN_OUT 196 #define HA_ERR_COMMIT_ERROR 197 #define HA_ERR_PARTITION_LIST 198 -#define HA_ERR_LAST 198 /* Copy of last error nr * */ +#define HA_ERR_NO_ENCRYPTION 199 +#define HA_ERR_LAST 199 /* Copy of last error nr * */ /* Number of different errors */ #define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1) diff --git a/include/my_handler_errors.h b/include/my_handler_errors.h index 4c3a02dd745..7eab185dd98 100644 --- a/include/my_handler_errors.h +++ b/include/my_handler_errors.h @@ -109,7 +109,8 @@ static const char *handler_error_messages[]= "Sequence has been run out", "Sequence values are conflicting", "Error during commit", - "Cannot select partitions" + "Cannot select partitions", + "Cannot initialize encryption. Check that all encryption parameters have been set" }; #endif /* MYSYS_MY_HANDLER_ERRORS_INCLUDED */ diff --git a/mysql-test/include/wait_until_connected_again.inc b/mysql-test/include/wait_until_connected_again.inc index 15a1e5bf847..f644ec8645f 100644 --- a/mysql-test/include/wait_until_connected_again.inc +++ b/mysql-test/include/wait_until_connected_again.inc @@ -11,7 +11,7 @@ let $counter= 5000; let $mysql_errno= 9999; while ($mysql_errno) { - --error 0,ER_ACCESS_DENIED_ERROR,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,ER_LOCK_WAIT_TIMEOUT,2002,2006,2013 + --error 0,ER_ACCESS_DENIED_ERROR,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,ER_LOCK_WAIT_TIMEOUT,2002,2006,2013,HA_ERR_NO_ENCRYPTION show status; dec $counter; @@ -30,6 +30,10 @@ while ($mysql_errno) { let $mysql_errno=0; } + if ($mysql_errno == 199) + { + let $mysql_errno=0; + } --sleep 0.1 } --enable_query_log diff --git a/mysql-test/suite/maria/encrypt-no-key.result b/mysql-test/suite/maria/encrypt-no-key.result index 6745670dfac..32a280d8cbc 100644 --- a/mysql-test/suite/maria/encrypt-no-key.result +++ b/mysql-test/suite/maria/encrypt-no-key.result @@ -1,15 +1,27 @@ -call mtr.add_suppression('Unknown key id 1. Can''t continue'); +call mtr.add_suppression("Initialization of encryption failed.*"); set global aria_encrypt_tables= 1; create table t1 (pk int primary key, a int, key(a)) engine=aria transactional=1; -alter table t1 disable keys; -insert into t1 values (1,1); -alter table t1 enable keys; -ERROR HY000: Unknown key id 1. Can't continue! -repair table t1 use_frm; -Table Op Msg_type Msg_text -test.t1 repair warning Number of rows changed from 0 to 1 -test.t1 repair Error Unknown key id 1. Can't continue! -test.t1 repair Error Unknown key id 1. Can't continue! -test.t1 repair status OK -drop table t1; +ERROR HY000: Initialization of encryption failed for ./test/t1 set global aria_encrypt_tables= default; +# +# MDEV-26258 Various crashes/asserts/corruptions when Aria encryption is +# enabled/used, but the encryption plugin is not loaded +# +SET GLOBAL aria_encrypt_tables=ON; +CREATE TABLE t1 (a INT KEY,b INT,KEY(b)) ENGINE=Aria; +ERROR HY000: Initialization of encryption failed for ./test/t1 +# Restart with encryption enabled +CREATE TABLE t1 (a INT KEY,b INT,KEY(b)) ENGINE=Aria; +INSERT INTO t1 VALUES (4,0); +LOAD INDEX INTO CACHE t1 IGNORE LEAVES; +Table Op Msg_type Msg_text +test.t1 preload_keys status OK +LOAD INDEX INTO CACHE t1; +Table Op Msg_type Msg_text +test.t1 preload_keys status OK +SELECT * FROM t1; +ERROR HY000: Initialization of encryption failed for ./test/t1.MAD +DROP TABLE t1; +Warnings: +Warning 199 Initialization of encryption failed for ./test/t1.MAD +Cleanup diff --git a/mysql-test/suite/maria/encrypt-no-key.test b/mysql-test/suite/maria/encrypt-no-key.test index 2d586c50695..b3f2f4b4bf3 100644 --- a/mysql-test/suite/maria/encrypt-no-key.test +++ b/mysql-test/suite/maria/encrypt-no-key.test @@ -1,14 +1,55 @@ # # MDEV-18496 Crash when Aria encryption is enabled but plugin not available # -call mtr.add_suppression('Unknown key id 1. Can''t continue'); +call mtr.add_suppression("Initialization of encryption failed.*"); set global aria_encrypt_tables= 1; +--error HA_ERR_NO_ENCRYPTION create table t1 (pk int primary key, a int, key(a)) engine=aria transactional=1; -alter table t1 disable keys; -insert into t1 values (1,1); -error 192; -alter table t1 enable keys; -repair table t1 use_frm; -drop table t1; set global aria_encrypt_tables= default; + +--echo # +--echo # MDEV-26258 Various crashes/asserts/corruptions when Aria encryption is +--echo # enabled/used, but the encryption plugin is not loaded +--echo # + +SET GLOBAL aria_encrypt_tables=ON; + +--write_file $MYSQLTEST_VARDIR/keys1.txt +1;770A8A65DA156D24EE2A093277530142 +EOF + +--replace_result \\ / +--error HA_ERR_NO_ENCRYPTION +CREATE TABLE t1 (a INT KEY,b INT,KEY(b)) ENGINE=Aria; + +--echo # Restart with encryption enabled + +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--shutdown_server +--source include/wait_until_disconnected.inc +--exec echo "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--enable_reconnect +--source include/wait_until_connected_again.inc + +CREATE TABLE t1 (a INT KEY,b INT,KEY(b)) ENGINE=Aria; +INSERT INTO t1 VALUES (4,0); +LOAD INDEX INTO CACHE t1 IGNORE LEAVES; +LOAD INDEX INTO CACHE t1; + +# Restart without encryption. Above table should be unreadable + +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--shutdown_server +--source include/wait_until_disconnected.inc +--exec echo "restart:--aria-encrypt-tables=0" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--enable_reconnect +--source include/wait_until_connected_again.inc + +--replace_result \\ / +--error HA_ERR_NO_ENCRYPTION +SELECT * FROM t1; +DROP TABLE t1; + +--echo Cleanup +--remove_file $MYSQLTEST_VARDIR/keys1.txt diff --git a/mysql-test/suite/maria/encrypt-wrong-key.result b/mysql-test/suite/maria/encrypt-wrong-key.result index bc22481296d..4ff057957da 100644 --- a/mysql-test/suite/maria/encrypt-wrong-key.result +++ b/mysql-test/suite/maria/encrypt-wrong-key.result @@ -1,16 +1,16 @@ call mtr.add_suppression("file_key_management"); call mtr.add_suppression("System key id 1 is missing"); call mtr.add_suppression("Unknown key id 1"); -call mtr.add_suppression("Failed to decrypt"); +call mtr.add_suppression("Initialization of encryption failed.*"); CREATE TABLE t1 (i INT, KEY(i)) ENGINE=Aria; INSERT INTO t1 VALUES (1); repair table t1; Table Op Msg_type Msg_text -test.t1 repair info Wrong CRC on datapage at 1 -test.t1 repair warning Number of rows changed from 1 to 0 -test.t1 repair status OK +test.t1 repair Error Initialization of encryption failed for ./test/t1.MAD +test.t1 repair error Corrupt INSERT INTO t1 VALUES (2); +ERROR HY000: Initialization of encryption failed for ./test/t1.MAD select * from t1; -ERROR HY000: failed to decrypt './test/t1' rc: -1 dstlen: 0 size: 8172 - +i +1 drop table t1; diff --git a/mysql-test/suite/maria/encrypt-wrong-key.test b/mysql-test/suite/maria/encrypt-wrong-key.test index ca65e1018d0..ac060c4e9dd 100644 --- a/mysql-test/suite/maria/encrypt-wrong-key.test +++ b/mysql-test/suite/maria/encrypt-wrong-key.test @@ -7,7 +7,7 @@ call mtr.add_suppression("file_key_management"); call mtr.add_suppression("System key id 1 is missing"); call mtr.add_suppression("Unknown key id 1"); -call mtr.add_suppression("Failed to decrypt"); +call mtr.add_suppression("Initialization of encryption failed.*"); --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server @@ -36,8 +36,11 @@ EOF --enable_reconnect --source include/wait_until_connected_again.inc +--replace_result \\ / repair table t1; +--replace_result \\ / +--error HA_ERR_NO_ENCRYPTION INSERT INTO t1 VALUES (2); --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect @@ -48,8 +51,6 @@ INSERT INTO t1 VALUES (2); --enable_reconnect --source include/wait_until_connected_again.inc ---replace_result \\ / ---error 192 select * from t1; drop table t1; --remove_file $MYSQLTEST_VARDIR/keys1.txt diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 2d6c8f85fe4..f25ba2aa0b3 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -292,7 +292,8 @@ static MYSQL_SYSVAR_BOOL(used_for_temp_tables, "Whether temporary tables should be MyISAM or Aria", 0, 0, 1); -static MYSQL_SYSVAR_BOOL(encrypt_tables, maria_encrypt_tables, PLUGIN_VAR_OPCMDARG, +static MYSQL_SYSVAR_BOOL(encrypt_tables, maria_encrypt_tables, + PLUGIN_VAR_OPCMDARG, "Encrypt tables (only for tables with ROW_FORMAT=PAGE (default) " "and not FIXED/DYNAMIC)", 0, 0, 0); diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index 8ef3249c2e4..3352a494d16 100644 --- a/storage/maria/ma_create.c +++ b/storage/maria/ma_create.c @@ -1062,6 +1062,8 @@ int maria_create(const char *name, enum data_file_type datafile_type, if (encrypted) { + DBUG_ASSERT(share.data_file_name.length == 0); + share.data_file_name.str= (char*) name; /* For error reporting */ if (ma_crypt_create(&share) || ma_crypt_write(&share, file)) goto err; diff --git a/storage/maria/ma_crypt.c b/storage/maria/ma_crypt.c index 33cf72b0b1e..8cc85d87d28 100644 --- a/storage/maria/ma_crypt.c +++ b/storage/maria/ma_crypt.c @@ -100,6 +100,7 @@ static void crypt_data_scheme_locker(struct st_encryption_scheme *scheme, int ma_crypt_create(MARIA_SHARE* share) { + uint key_version; MARIA_CRYPT_DATA *crypt_data= (MARIA_CRYPT_DATA*)my_malloc(sizeof(MARIA_CRYPT_DATA), MYF(MY_ZEROFILL)); crypt_data->scheme.type= CRYPT_SCHEME_1; @@ -110,6 +111,16 @@ ma_crypt_create(MARIA_SHARE* share) my_random_bytes((uchar*)&crypt_data->space, sizeof(crypt_data->space)); share->crypt_data= crypt_data; share->crypt_page_header_space= CRYPT_SCHEME_1_KEY_VERSION_SIZE; + + key_version = encryption_key_get_latest_version(crypt_data->scheme.key_id); + if (unlikely(key_version == ENCRYPTION_KEY_VERSION_INVALID)) + { + my_errno= HA_ERR_NO_ENCRYPTION; + my_printf_error(HA_ERR_NO_ENCRYPTION, + "Initialization of encryption failed for %s", MYF(0), + share->data_file_name.str); + return 1; + } return 0; } @@ -145,7 +156,7 @@ ma_crypt_write(MARIA_SHARE* share, File file) } uchar* -ma_crypt_read(MARIA_SHARE* share, uchar *buff) +ma_crypt_read(MARIA_SHARE* share, uchar *buff, my_bool silent) { uchar type= buff[0]; uchar iv_length= buff[1]; @@ -155,9 +166,9 @@ ma_crypt_read(MARIA_SHARE* share, uchar *buff) iv_length != sizeof(((MARIA_CRYPT_DATA*)1)->scheme.iv) + 4) { my_printf_error(HA_ERR_UNSUPPORTED, - "Unsupported crypt scheme! type: %d iv_length: %d\n", - MYF(ME_FATAL|ME_ERROR_LOG), - type, iv_length); + "Unsupported crypt scheme type: %d iv_length: %d\n", + MYF(ME_ERROR_LOG | (silent ? ME_WARNING : ME_FATAL)), + type, iv_length); return 0; } @@ -166,6 +177,7 @@ ma_crypt_read(MARIA_SHARE* share, uchar *buff) /* opening a table */ MARIA_CRYPT_DATA *crypt_data= (MARIA_CRYPT_DATA*)my_malloc(sizeof(MARIA_CRYPT_DATA), MYF(MY_ZEROFILL)); + uint key_version; crypt_data->scheme.type= type; mysql_mutex_init(key_CRYPT_DATA_lock, &crypt_data->lock, @@ -175,6 +187,17 @@ ma_crypt_read(MARIA_SHARE* share, uchar *buff) crypt_data->space= uint4korr(buff + 2); memcpy(crypt_data->scheme.iv, buff + 6, sizeof(crypt_data->scheme.iv)); share->crypt_data= crypt_data; + + key_version= encryption_key_get_latest_version(crypt_data->scheme.key_id); + if (unlikely(key_version == ENCRYPTION_KEY_VERSION_INVALID)) + { + my_errno= HA_ERR_NO_ENCRYPTION; + my_printf_error(HA_ERR_NO_ENCRYPTION, + "Initialization of encryption failed for %s", + MYF(ME_ERROR_LOG | (silent ? ME_WARNING : ME_FATAL)), + share->data_file_name.str); + return 0; + } } share->crypt_page_header_space= CRYPT_SCHEME_1_KEY_VERSION_SIZE; @@ -462,7 +485,7 @@ static int ma_encrypt(MARIA_SHARE *share, MARIA_CRYPT_DATA *crypt_data, uint32 dstlen= 0; /* Must be set because of error message */ *key_version = encryption_key_get_latest_version(crypt_data->scheme.key_id); - if (*key_version == ENCRYPTION_KEY_VERSION_INVALID) + if (unlikely(*key_version == ENCRYPTION_KEY_VERSION_INVALID)) { /* We use this error for both encryption and decryption, as in normal @@ -470,7 +493,7 @@ static int ma_encrypt(MARIA_SHARE *share, MARIA_CRYPT_DATA *crypt_data, */ my_errno= HA_ERR_DECRYPTION_FAILED; my_printf_error(HA_ERR_DECRYPTION_FAILED, - "Unknown key id %u. Can't continue!", + "Unknown encryption key id %u. Can't continue!", MYF(ME_FATAL|ME_ERROR_LOG), crypt_data->scheme.key_id); return 1; diff --git a/storage/maria/ma_crypt.h b/storage/maria/ma_crypt.h index 811b319bc0c..acaf36ee831 100644 --- a/storage/maria/ma_crypt.h +++ b/storage/maria/ma_crypt.h @@ -26,7 +26,8 @@ uint ma_crypt_get_index_page_header_space(struct st_maria_share *); uint ma_crypt_get_file_length(); /* bytes needed in file */ int ma_crypt_create(struct st_maria_share *); /* create encryption data */ int ma_crypt_write(struct st_maria_share *, File); /* write encryption data */ -uchar* ma_crypt_read(struct st_maria_share *, uchar *buff); /* read crypt data*/ +uchar* ma_crypt_read(struct st_maria_share *, uchar *buff, + my_bool silent); /* read crypt data*/ void ma_crypt_set_data_pagecache_callbacks(struct st_pagecache_file *file, struct st_maria_share *share); diff --git a/storage/maria/ma_delete_table.c b/storage/maria/ma_delete_table.c index 0c78476ad44..250ea9dff89 100644 --- a/storage/maria/ma_delete_table.c +++ b/storage/maria/ma_delete_table.c @@ -43,12 +43,13 @@ int maria_delete_table(const char *name) 'open_for_repair' to be able to open even a crashed table. */ my_errno= 0; - if (!(info= maria_open(name, O_RDONLY, HA_OPEN_FOR_REPAIR))) + if (!(info= maria_open(name, O_RDONLY, (HA_OPEN_FOR_DROP | HA_OPEN_FOR_REPAIR)))) { sync_dir= 0; /* Ignore not found errors and wrong symlink errors */ - if (my_errno != ENOENT && my_errno != HA_WRONG_CREATE_OPTION) - got_error= my_errno;; + if (my_errno != ENOENT && my_errno != HA_WRONG_CREATE_OPTION && + my_errno != HA_ERR_NO_ENCRYPTION) + got_error= my_errno; } else { diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index 06183c72895..7b59351e24b 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -863,7 +863,8 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) if (MY_TEST(share->base.extra_options & MA_EXTRA_OPTIONS_ENCRYPTED)) { - if (!(disk_pos= ma_crypt_read(share, disk_pos))) + if (!(disk_pos= ma_crypt_read(share, disk_pos, + MY_TEST(open_flags & HA_OPEN_FOR_DROP)))) goto err; } From 4cb0d43ac63761174a39cea892c176b9cfa6edfc Mon Sep 17 00:00:00 2001 From: Monty Date: Fri, 17 Mar 2023 12:02:04 +0200 Subject: [PATCH 002/171] MDEV-28054 Various crashes upon INSERT/UPDATE after changing Aria settings The cause of the crash was that test was setting aria_sort_buffer_size to MAX_LONG_LONG, which caused an overflow in my_malloc() when trying to allocate the buffer + 8 bytes. Fixed by reducing max size of sort_buffer for Aria and MyISAM Other things: - Added code in maria_repair_parallell() to not allocate a big sort buffer for small files. - Updated size of minumim sort buffer in Aria --- mysql-test/suite/maria/maria.result | 17 +--- mysql-test/suite/maria/maria.test | 18 +---- mysql-test/suite/maria/repair-big-sort.result | 81 +++++++++++++++++++ mysql-test/suite/maria/repair-big-sort.test | 15 ++++ .../r/aria_sort_buffer_size_basic.result | 8 +- .../suite/sys_vars/r/sysvars_aria.result | 4 +- .../r/sysvars_server_embedded,32bit.rdiff | 8 +- .../sys_vars/r/sysvars_server_embedded.result | 6 +- .../r/sysvars_server_notembedded.result | 6 +- storage/maria/ha_maria.cc | 2 +- storage/maria/ma_check.c | 22 +++++ storage/maria/ma_sort.c | 26 +++--- storage/maria/maria_chk.c | 3 +- storage/maria/maria_def.h | 3 +- storage/myisam/ha_myisam.cc | 2 +- 15 files changed, 159 insertions(+), 62 deletions(-) create mode 100644 mysql-test/suite/maria/repair-big-sort.result create mode 100644 mysql-test/suite/maria/repair-big-sort.test diff --git a/mysql-test/suite/maria/maria.result b/mysql-test/suite/maria/maria.result index 925c5121bfb..f8911bdde2b 100644 --- a/mysql-test/suite/maria/maria.result +++ b/mysql-test/suite/maria/maria.result @@ -2814,7 +2814,7 @@ DROP TABLE t1; # cardinalities=1 # SET aria_repair_threads=2; -SET aria_sort_buffer_size=8192; +SET aria_sort_buffer_size=16384; CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); Warnings: Note 1831 Duplicate index `a_2`. This is deprecated and will be disallowed in a future release @@ -2839,19 +2839,8 @@ SET aria_repair_threads=@@global.aria_repair_threads; # low myisam_sort_buffer_size # CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); -INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), -(6,'0'),(7,'0'); -INSERT INTO t1 SELECT a+10,b FROM t1; -INSERT INTO t1 SELECT a+20,b FROM t1; -INSERT INTO t1 SELECT a+40,b FROM t1; -INSERT INTO t1 SELECT a+80,b FROM t1; -INSERT INTO t1 SELECT a+160,b FROM t1; -INSERT INTO t1 SELECT a+320,b FROM t1; -INSERT INTO t1 SELECT a+640,b FROM t1; -INSERT INTO t1 SELECT a+1280,b FROM t1; -INSERT INTO t1 SELECT a+2560,b FROM t1; -INSERT INTO t1 SELECT a+5120,b FROM t1; -SET aria_sort_buffer_size=4096; +INSERT INTO t1 select seq,'0' from seq_1_to_65536; +SET aria_sort_buffer_size=16384; REPAIR TABLE t1; Table Op Msg_type Msg_text test.t1 repair error aria_sort_buffer_size is too small. X diff --git a/mysql-test/suite/maria/maria.test b/mysql-test/suite/maria/maria.test index a326bb12d2a..f7a5b5c35b2 100644 --- a/mysql-test/suite/maria/maria.test +++ b/mysql-test/suite/maria/maria.test @@ -5,6 +5,7 @@ -- source include/have_maria.inc -- source include/have_partition.inc +-- source include/have_sequence.inc call mtr.add_suppression("Can't find record in '.*'"); @@ -2034,7 +2035,7 @@ DROP TABLE t1; --echo # cardinalities=1 --echo # SET aria_repair_threads=2; -SET aria_sort_buffer_size=8192; +SET aria_sort_buffer_size=16384; CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); --replace_regex /Current aria_sort_buffer_size.*/X/ @@ -2050,19 +2051,8 @@ SET aria_repair_threads=@@global.aria_repair_threads; --echo # low myisam_sort_buffer_size --echo # CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); -INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), - (6,'0'),(7,'0'); -INSERT INTO t1 SELECT a+10,b FROM t1; -INSERT INTO t1 SELECT a+20,b FROM t1; -INSERT INTO t1 SELECT a+40,b FROM t1; -INSERT INTO t1 SELECT a+80,b FROM t1; -INSERT INTO t1 SELECT a+160,b FROM t1; -INSERT INTO t1 SELECT a+320,b FROM t1; -INSERT INTO t1 SELECT a+640,b FROM t1; -INSERT INTO t1 SELECT a+1280,b FROM t1; -INSERT INTO t1 SELECT a+2560,b FROM t1; -INSERT INTO t1 SELECT a+5120,b FROM t1; -SET aria_sort_buffer_size=4096; +INSERT INTO t1 select seq,'0' from seq_1_to_65536; +SET aria_sort_buffer_size=16384; --replace_regex /Current aria_sort_buffer_size.*/X/ REPAIR TABLE t1; CHECK TABLE t1; diff --git a/mysql-test/suite/maria/repair-big-sort.result b/mysql-test/suite/maria/repair-big-sort.result new file mode 100644 index 00000000000..d1dfe3f7c2f --- /dev/null +++ b/mysql-test/suite/maria/repair-big-sort.result @@ -0,0 +1,81 @@ +SET sql_mode=''; +CREATE TEMPORARY TABLE t1 (a tinyINT,b CHAR(1)) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +INSERT INTO t1 VALUES (1,1),(3,3),(2,2); +SET SESSION tmp_table_size=True; +Warnings: +Warning 1292 Truncated incorrect tmp_table_size value: '1' +CREATE TABLE t2 (c INT, d DATE) ENGINE=InnoDB PARTITION BY RANGE (YEAR (d)) SUBPARTITION BY HASH (TO_DAYS (d)) (PARTITION p0 VALUES LESS THAN (1990) (SUBPARTITION s0, SUBPARTITION s1), PARTITION p1 VALUES LESS THAN MAXVALUE (SUBPARTITION s4, SUBPARTITION s5)); +SET SESSION aria_sort_buffer_size=CAST(-1 AS UNSIGNED INT); +Warnings: +Note 1105 Cast to unsigned converted negative integer to it's positive complement +Note 1105 Cast to unsigned converted negative integer to it's positive complement +Warning 1292 Truncated incorrect aria_sort_buffer_size value: '18446744073709551615' +INSERT INTO t1 SELECT '', SEQ FROM seq_1_to_258; +Warnings: +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 1 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 2 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 3 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 4 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 5 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 6 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 7 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 8 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 9 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 10 +Warning 1265 Data truncated for column 'b' at row 10 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 11 +Warning 1265 Data truncated for column 'b' at row 11 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 12 +Warning 1265 Data truncated for column 'b' at row 12 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 13 +Warning 1265 Data truncated for column 'b' at row 13 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 14 +Warning 1265 Data truncated for column 'b' at row 14 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 15 +Warning 1265 Data truncated for column 'b' at row 15 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 16 +Warning 1265 Data truncated for column 'b' at row 16 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 17 +Warning 1265 Data truncated for column 'b' at row 17 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 18 +Warning 1265 Data truncated for column 'b' at row 18 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 19 +Warning 1265 Data truncated for column 'b' at row 19 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 20 +Warning 1265 Data truncated for column 'b' at row 20 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 21 +Warning 1265 Data truncated for column 'b' at row 21 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 22 +Warning 1265 Data truncated for column 'b' at row 22 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 23 +Warning 1265 Data truncated for column 'b' at row 23 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 24 +Warning 1265 Data truncated for column 'b' at row 24 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 25 +Warning 1265 Data truncated for column 'b' at row 25 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 26 +Warning 1265 Data truncated for column 'b' at row 26 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 27 +Warning 1265 Data truncated for column 'b' at row 27 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 28 +Warning 1265 Data truncated for column 'b' at row 28 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 29 +Warning 1265 Data truncated for column 'b' at row 29 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 30 +Warning 1265 Data truncated for column 'b' at row 30 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 31 +Warning 1265 Data truncated for column 'b' at row 31 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 32 +Warning 1265 Data truncated for column 'b' at row 32 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 33 +Warning 1265 Data truncated for column 'b' at row 33 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 34 +Warning 1265 Data truncated for column 'b' at row 34 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 35 +Warning 1265 Data truncated for column 'b' at row 35 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 36 +Warning 1265 Data truncated for column 'b' at row 36 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 37 +SET SESSION aria_repair_threads=4; +UPDATE t1 SET a=( (SELECT MAX(a) FROM t1)); +drop table t1,t2; diff --git a/mysql-test/suite/maria/repair-big-sort.test b/mysql-test/suite/maria/repair-big-sort.test new file mode 100644 index 00000000000..f2f4f84c29b --- /dev/null +++ b/mysql-test/suite/maria/repair-big-sort.test @@ -0,0 +1,15 @@ + +--source include/have_innodb.inc +--source include/have_partition.inc +--source include/have_sequence.inc + +SET sql_mode=''; +CREATE TEMPORARY TABLE t1 (a tinyINT,b CHAR(1)) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +INSERT INTO t1 VALUES (1,1),(3,3),(2,2); +SET SESSION tmp_table_size=True; +CREATE TABLE t2 (c INT, d DATE) ENGINE=InnoDB PARTITION BY RANGE (YEAR (d)) SUBPARTITION BY HASH (TO_DAYS (d)) (PARTITION p0 VALUES LESS THAN (1990) (SUBPARTITION s0, SUBPARTITION s1), PARTITION p1 VALUES LESS THAN MAXVALUE (SUBPARTITION s4, SUBPARTITION s5)); +SET SESSION aria_sort_buffer_size=CAST(-1 AS UNSIGNED INT); +INSERT INTO t1 SELECT '', SEQ FROM seq_1_to_258; +SET SESSION aria_repair_threads=4; +UPDATE t1 SET a=( (SELECT MAX(a) FROM t1)); +drop table t1,t2; diff --git a/mysql-test/suite/sys_vars/r/aria_sort_buffer_size_basic.result b/mysql-test/suite/sys_vars/r/aria_sort_buffer_size_basic.result index 56522566ec9..6da4c9bfe97 100644 --- a/mysql-test/suite/sys_vars/r/aria_sort_buffer_size_basic.result +++ b/mysql-test/suite/sys_vars/r/aria_sort_buffer_size_basic.result @@ -22,13 +22,13 @@ Warnings: Warning 1292 Truncated incorrect aria_sort_buffer_size value: '10' select @@global.aria_sort_buffer_size; @@global.aria_sort_buffer_size -4096 +16376 set session aria_sort_buffer_size=10; Warnings: Warning 1292 Truncated incorrect aria_sort_buffer_size value: '10' select @@session.aria_sort_buffer_size; @@session.aria_sort_buffer_size -4096 +16376 set global aria_sort_buffer_size=1.1; ERROR 42000: Incorrect argument type to variable 'aria_sort_buffer_size' set session aria_sort_buffer_size=1e1; @@ -40,9 +40,9 @@ Warnings: Warning 1292 Truncated incorrect aria_sort_buffer_size value: '0' select @@global.aria_sort_buffer_size; @@global.aria_sort_buffer_size -4096 +16376 set session aria_sort_buffer_size=cast(-1 as unsigned int); select @@session.aria_sort_buffer_size; @@session.aria_sort_buffer_size -18446744073709551615 +1152921504606846975 SET @@global.aria_sort_buffer_size = @start_global_value; diff --git a/mysql-test/suite/sys_vars/r/sysvars_aria.result b/mysql-test/suite/sys_vars/r/sysvars_aria.result index 9f5585668b6..3e9130db9db 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_aria.result +++ b/mysql-test/suite/sys_vars/r/sysvars_aria.result @@ -223,8 +223,8 @@ DEFAULT_VALUE 268434432 VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. -NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MIN_VALUE 16376 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff index e0aad7fa6d0..6fa25546ad1 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff @@ -97,9 +97,9 @@ @@ -207,7 +207,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. - NUMERIC_MIN_VALUE 4096 + NUMERIC_MIN_VALUE 16376 -NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -684,8 +684,8 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result index 1ed5b5ce3bd..c03181d0c63 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -216,8 +216,8 @@ VARIABLE_NAME ARIA_SORT_BUFFER_SIZE VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. -NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MIN_VALUE 16376 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -2127,7 +2127,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index 125d629ac87..48b481b200c 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -216,8 +216,8 @@ VARIABLE_NAME ARIA_SORT_BUFFER_SIZE VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. -NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MIN_VALUE 16376 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -2287,7 +2287,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index f25ba2aa0b3..6639fc39caf 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -269,7 +269,7 @@ static MYSQL_THDVAR_ULONG(repair_threads, PLUGIN_VAR_RQCMDARG, static MYSQL_THDVAR_ULONGLONG(sort_buffer_size, PLUGIN_VAR_RQCMDARG, "The buffer that is allocated when sorting the index when doing a " "REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE.", NULL, NULL, - SORT_BUFFER_INIT, MIN_SORT_BUFFER, SIZE_T_MAX, 1); + SORT_BUFFER_INIT, MARIA_MIN_SORT_MEMORY, SIZE_T_MAX/16, 1); static MYSQL_THDVAR_ENUM(stats_method, PLUGIN_VAR_RQCMDARG, "Specifies how Aria index statistics collection code should treat " diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c index fec443dfc56..6835af928ee 100644 --- a/storage/maria/ma_check.c +++ b/storage/maria/ma_check.c @@ -3903,6 +3903,16 @@ int maria_repair_by_sort(HA_CHECK *param, register MARIA_HA *info, { sort_param.key_read= sort_key_read; sort_param.key_write= sort_key_write; + + /* + Limit usage of sort memory + We assume we don't need more memory than data file length * 2 + (There is a pointer overhead for each key, but this is hard to + estimae as we cannot be sure how many records we have in file to + be repaired). + */ + set_if_smaller(param->sort_buffer_length, sort_info.filelength*2); + set_if_bigger(param->sort_buffer_length, MARIA_MIN_SORT_MEMORY); } if (sort_info.new_info->s->data_file_type == BLOCK_RECORD) @@ -4505,6 +4515,16 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, DBUG_PRINT("io_cache_share", ("thread: %u read_cache: %p", i, &sort_param[i].read_cache)); + /* + Limit usage of sort memory + We assume we don't need more memory than data file length * 2 + (There is a pointer overhead for each key, but this is hard to + estimae as we cannot be sure how many records we have in file to + be repaired). + */ + set_if_smaller(param->sort_buffer_length, sort_info.filelength*2); + set_if_bigger(param->sort_buffer_length, MARIA_MIN_SORT_MEMORY); + /* two approaches: the same amount of memory for each thread or the memory for the same number of keys for each thread... @@ -4517,6 +4537,8 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, #else param->sort_buffer_length*sort_param[i].key_length/total_key_length; #endif + set_if_bigger(sort_param[i].sortbuff_size, MARIA_MIN_SORT_MEMORY); + if (mysql_thread_create(key_thread_find_all_keys, &sort_param[i].thr, &thr_attr, _ma_thr_find_all_keys, (void *) (sort_param+i))) diff --git a/storage/maria/ma_sort.c b/storage/maria/ma_sort.c index 4dc6472bd15..bd57cdb7727 100644 --- a/storage/maria/ma_sort.c +++ b/storage/maria/ma_sort.c @@ -29,12 +29,10 @@ /* static variables */ -#undef MIN_SORT_MEMORY #undef DISK_BUFFER_SIZE #define MERGEBUFF 15 #define MERGEBUFF2 31 -#define MIN_SORT_MEMORY (4096-MALLOC_OVERHEAD) #define DISK_BUFFER_SIZE (IO_SIZE*128) /* How many keys we can keep in memory */ @@ -145,11 +143,11 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, sort_keys= (uchar **) NULL; error= 1; maxbuffer=1; - memavl=MY_MAX(sortbuff_size,MIN_SORT_MEMORY); + memavl=MY_MAX(sortbuff_size,MARIA_MIN_SORT_MEMORY); records= info->sort_info->max_records; sort_length= info->key_length; - while (memavl >= MIN_SORT_MEMORY) + while (memavl >= MARIA_MIN_SORT_MEMORY) { /* Check if we can fit all keys into memory */ if (((ulonglong) (records + 1) * @@ -208,10 +206,10 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, break; } old_memavl=memavl; - if ((memavl=memavl/4*3) < MIN_SORT_MEMORY && old_memavl > MIN_SORT_MEMORY) - memavl=MIN_SORT_MEMORY; + if ((memavl=memavl/4*3) < MARIA_MIN_SORT_MEMORY && old_memavl > MARIA_MIN_SORT_MEMORY) + memavl=MARIA_MIN_SORT_MEMORY; } - if (memavl < MIN_SORT_MEMORY) + if (memavl < MARIA_MIN_SORT_MEMORY) { /* purecov: begin inspected */ _ma_check_print_error(info->sort_info->param, @@ -387,12 +385,12 @@ static my_bool _ma_thr_find_all_keys_exec(MARIA_SORT_PARAM* sort_param) bzero((char*) &sort_param->unique, sizeof(sort_param->unique)); sortbuff_size= sort_param->sortbuff_size; - memavl= MY_MAX(sortbuff_size, MIN_SORT_MEMORY); + memavl= MY_MAX(sortbuff_size, MARIA_MIN_SORT_MEMORY); idx= (ha_keys) sort_param->sort_info->max_records; sort_length= sort_param->key_length; maxbuffer= 1; - while (memavl >= MIN_SORT_MEMORY) + while (memavl >= MARIA_MIN_SORT_MEMORY) { if ((my_off_t) (idx+1)*(sort_length+sizeof(char*)) <= (my_off_t) memavl) keys= idx+1; @@ -442,11 +440,11 @@ static my_bool _ma_thr_find_all_keys_exec(MARIA_SORT_PARAM* sort_param) break; } old_memavl= memavl; - if ((memavl= memavl/4*3) < MIN_SORT_MEMORY && - old_memavl > MIN_SORT_MEMORY) - memavl= MIN_SORT_MEMORY; + if ((memavl= memavl/4*3) < MARIA_MIN_SORT_MEMORY && + old_memavl > MARIA_MIN_SORT_MEMORY) + memavl= MARIA_MIN_SORT_MEMORY; } - if (memavl < MIN_SORT_MEMORY) + if (memavl < MARIA_MIN_SORT_MEMORY) { /* purecov: begin inspected */ _ma_check_print_error(sort_param->sort_info->param, @@ -626,7 +624,7 @@ int _ma_thr_write_keys(MARIA_SORT_PARAM *sort_param) if (!mergebuf) { length=(size_t)param->sort_buffer_length; - while (length >= MIN_SORT_MEMORY) + while (length >= MARIA_MIN_SORT_MEMORY) { if ((mergebuf= my_malloc((size_t) length, MYF(0)))) break; diff --git a/storage/maria/maria_chk.c b/storage/maria/maria_chk.c index 2f130de1c7a..921751030a8 100644 --- a/storage/maria/maria_chk.c +++ b/storage/maria/maria_chk.c @@ -424,7 +424,8 @@ static struct my_option my_long_options[] = "Size of sort buffer. Used by --recover", &check_param.sort_buffer_length, &check_param.sort_buffer_length, 0, GET_ULL, REQUIRED_ARG, - SORT_BUFFER_INIT, MIN_SORT_BUFFER, SIZE_T_MAX, MALLOC_OVERHEAD, 1L, 0}, + SORT_BUFFER_INIT, MARIA_MIN_SORT_MEMORY, SIZE_T_MAX/10, MALLOC_OVERHEAD, + 1L, 0}, { "sort_key_blocks", OPT_SORT_KEY_BLOCKS, "Internal buffer for sorting keys; Don't touch :)", &check_param.sort_key_blocks, diff --git a/storage/maria/maria_def.h b/storage/maria/maria_def.h index 80c57ad9a0e..f4799eef379 100644 --- a/storage/maria/maria_def.h +++ b/storage/maria/maria_def.h @@ -45,6 +45,8 @@ #define MARIA_MAX_TREE_LEVELS 32 #define MARIA_MAX_RECORD_ON_STACK 16384 +#define MARIA_MIN_SORT_MEMORY (16384-MALLOC_OVERHEAD) + /* maria_open() flag, specific for maria_pack */ #define HA_OPEN_IGNORE_MOVED_STATE (1U << 30) @@ -1273,7 +1275,6 @@ typedef struct st_maria_block_info #define PAGE_BUFFER_INIT MY_ALIGN_DOWN(1024L*1024L*256L-MALLOC_OVERHEAD, 8192) #define READ_BUFFER_INIT MY_ALIGN_DOWN(1024L*256L-MALLOC_OVERHEAD, 1024) #define SORT_BUFFER_INIT MY_ALIGN_DOWN(1024L*1024L*256L-MALLOC_OVERHEAD, 1024) -#define MIN_SORT_BUFFER 4096U #define fast_ma_writeinfo(INFO) if (!(INFO)->s->tot_locks) (void) _ma_writeinfo((INFO),0) #define fast_ma_readinfo(INFO) ((INFO)->lock_type == F_UNLCK) && _ma_readinfo((INFO),F_RDLCK,1) diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 4fef809f4f0..ddab8bcf741 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -80,7 +80,7 @@ static MYSQL_THDVAR_ULONG(repair_threads, PLUGIN_VAR_RQCMDARG, static MYSQL_THDVAR_ULONGLONG(sort_buffer_size, PLUGIN_VAR_RQCMDARG, "The buffer that is allocated when sorting the index when doing " "a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE", NULL, NULL, - SORT_BUFFER_INIT, MIN_SORT_BUFFER, SIZE_T_MAX, 1); + SORT_BUFFER_INIT, MIN_SORT_BUFFER, SIZE_T_MAX/16, 1); static MYSQL_SYSVAR_BOOL(use_mmap, opt_myisam_use_mmap, PLUGIN_VAR_NOCMDARG, "Use memory mapping for reading and writing MyISAM tables", NULL, NULL, FALSE); From 4f7317579e700a8ac4375b3b85e5fb1a91a1a20f Mon Sep 17 00:00:00 2001 From: Monty Date: Sat, 29 Apr 2023 20:39:50 +0300 Subject: [PATCH 003/171] Fixed "Trying to lock uninitialized mutex' in parallel replication The problem was that mutex_init() was called after the worker was put into the domain_hash, which allowed other threads to access it before mutex was initialized. --- sql/rpl_parallel.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 746c923ba44..96b319c5f4a 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -2317,9 +2317,7 @@ rpl_parallel::find(uint32 domain_id) mysql_cond_init(key_COND_parallel_entry, &e->COND_parallel_entry, NULL); if (my_hash_insert(&domain_hash, (uchar *)e)) { - mysql_cond_destroy(&e->COND_parallel_entry); - mysql_mutex_destroy(&e->LOCK_parallel_entry); - my_free(e); + free_rpl_parallel_entry(e); return NULL; } } From 7f96dd50e25abc2a9a75d96cc1c711124b6be765 Mon Sep 17 00:00:00 2001 From: Monty Date: Tue, 2 May 2023 22:30:57 +0300 Subject: [PATCH 004/171] MDEV-6768 Wrong result with aggregate with join with no result set When a query does implicit grouping and join operation produces an empty result set, a NULL-complemented row combination is generated. However, constant table fields still show non-NULL values. What happens in the is that end_send_group() is called with a const row but without any rows matching the WHERE clause. This last part is shown by 'join->first_record' not being set. This causes item->no_rows_in_result() to be called for all items to reset all sum functions to their initial state. However fields are not set to NULL. The used fix is to produce NULL-complemented records for constant tables as well. Also, reset the constant table's records back in case we're in a subquery which may get re-executed. An alternative fix would have item->no_rows_in_result() also work with Item_field objects. There is some other issues with the code: - join->no_rows_in_result_called is used but never set. - Tables that are used with group functions are not properly marked as maybe_null, which is required if the table rows should be regarded as null-complemented (not existing). - The code that tries to detect if mixed_implicit_grouping should be set didn't take into account all usage of fields and sum functions. - Item_func::restore_to_before_no_rows_in_result() called the wrong function. - join->clear() does not use a table_map argument to clear_tables(), which caused it to ignore constant tables. - unclear_tables() does not correctly restore status to what is was before clear_tables(). Main bug fix was to always use a table_map argument to clear_tables() and always use join->clear() and clear_tables() together with unclear_tables(). Other fixes: - Fixed Item_func::restore_to_before_no_rows_in_result() - Set 'join->no_rows_in_result_called' when no_rows_in_result_set() is called. - Removed not used argument from setup_end_select_func(). - More code comments - Ensure that end_send_group() modifies the same fields as are in the result set. - Changed return_zero_rows() to use pointers instead of references, similar to the rest of the code. --- mysql-test/main/group_min_max.result | 113 +++++++++++ mysql-test/main/group_min_max.test | 115 +++++++++++ mysql-test/main/type_timestamp.result | 2 + mysql-test/main/type_timestamp.test | 1 + sql/item_func.h | 2 +- sql/sql_select.cc | 264 ++++++++++++++++---------- sql/sql_select.h | 5 +- sql/table.h | 10 +- 8 files changed, 405 insertions(+), 107 deletions(-) diff --git a/mysql-test/main/group_min_max.result b/mysql-test/main/group_min_max.result index fd9b5be4260..4c2693e5e4c 100644 --- a/mysql-test/main/group_min_max.result +++ b/mysql-test/main/group_min_max.result @@ -4025,3 +4025,116 @@ drop table t1; # # End of 10.1 tests # +# +# MDEV-6768 Wrong result with agregate with join with no resultset +# +create table t1 +( +PARENT_ID int(10) unsigned NOT NULL AUTO_INCREMENT, +PARENT_FIELD VARCHAR(10), +PRIMARY KEY (PARENT_ID) +) engine=innodb; +create table t2 +( +CHILD_ID INT NOT NULL AUTO_INCREMENT, +PARENT_ID INT NOT NULL, +CHILD_FIELD varchar(10), +PRIMARY KEY (CHILD_ID) +)engine=innodb; +INSERT INTO t1 (PARENT_FIELD) +SELECT 'AAAA'; +INSERT INTO t2 (PARENT_ID, CHILD_FIELD) +SELECT 1, 'BBBB'; +explain select +t1.PARENT_ID, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index +1 SIMPLE t2 ALL NULL NULL NULL NULL 1 Using where +select +t1.PARENT_ID, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +PARENT_ID min(CHILD_FIELD) +NULL NULL +select +1, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +1 min(CHILD_FIELD) +1 NULL +select +IFNULL(t1.PARENT_ID,1), +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +IFNULL(t1.PARENT_ID,1) min(CHILD_FIELD) +1 NULL +# Check that things works with MyISAM (which has different explain) +alter table t1 engine=myisam; +alter table t2 engine=myisam; +explain select +t1.PARENT_ID, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +select +t1.PARENT_ID, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +PARENT_ID min(CHILD_FIELD) +NULL NULL +drop table t1,t2; +# Check that things works if sub queries are re-executed +create table t1 (a int primary key, b int); +create table t2 (a int primary key, b int); +create table t3 (a int primary key, b int); +insert into t1 values (1,1),(2,2),(3,3); +insert into t2 values (1,1),(2,2),(3,3); +insert into t3 values (1,1),(3,3); +explain +select *, +(select +CONCAT('t2:', IFNULL(t2.a, 't2a-null'), ';', +'min_t3_b:', IFNULL(min(t3.b), 't3b-null')) +from t2,t3 +where t2.a=1 and t1.b = t3.a) as s1 +from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 3 +2 DEPENDENT SUBQUERY t2 const PRIMARY PRIMARY 4 const 1 Using index +2 DEPENDENT SUBQUERY t3 eq_ref PRIMARY PRIMARY 4 test.t1.b 1 +select *, +(select +CONCAT('t2:', IFNULL(t2.a, 't2a-null'), ';', +'min_t3_b:', IFNULL(min(t3.b), 't3b-null')) +from t2,t3 +where t2.a=1 and t1.b = t3.a) as s1 +from t1; +a b s1 +1 1 t2:1;min_t3_b:1 +2 2 t2:t2a-null;min_t3_b:t3b-null +3 3 t2:1;min_t3_b:3 +drop table t1,t2,t3; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/group_min_max.test b/mysql-test/main/group_min_max.test index 506323599cb..3c5c1b5bb9b 100644 --- a/mysql-test/main/group_min_max.test +++ b/mysql-test/main/group_min_max.test @@ -5,6 +5,7 @@ --source include/no_valgrind_without_big.inc --source include/default_optimizer_switch.inc +--source include/have_innodb.inc # # TODO: @@ -1688,3 +1689,117 @@ drop table t1; --echo # --echo # End of 10.1 tests --echo # + +--echo # +--echo # MDEV-6768 Wrong result with agregate with join with no resultset +--echo # + +create table t1 +( + PARENT_ID int(10) unsigned NOT NULL AUTO_INCREMENT, + PARENT_FIELD VARCHAR(10), + PRIMARY KEY (PARENT_ID) +) engine=innodb; + +create table t2 +( + CHILD_ID INT NOT NULL AUTO_INCREMENT, + PARENT_ID INT NOT NULL, + CHILD_FIELD varchar(10), + PRIMARY KEY (CHILD_ID) +)engine=innodb; + +INSERT INTO t1 (PARENT_FIELD) +SELECT 'AAAA'; + +INSERT INTO t2 (PARENT_ID, CHILD_FIELD) +SELECT 1, 'BBBB'; + +explain select + t1.PARENT_ID, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +select + t1.PARENT_ID, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +select + 1, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +select + IFNULL(t1.PARENT_ID,1), + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + + +--echo # Check that things works with MyISAM (which has different explain) + +alter table t1 engine=myisam; +alter table t2 engine=myisam; + +explain select + t1.PARENT_ID, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +select + t1.PARENT_ID, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +drop table t1,t2; + +--echo # Check that things works if sub queries are re-executed + +create table t1 (a int primary key, b int); +create table t2 (a int primary key, b int); +create table t3 (a int primary key, b int); + +insert into t1 values (1,1),(2,2),(3,3); +insert into t2 values (1,1),(2,2),(3,3); +insert into t3 values (1,1),(3,3); + +explain +select *, + (select + CONCAT('t2:', IFNULL(t2.a, 't2a-null'), ';', + 'min_t3_b:', IFNULL(min(t3.b), 't3b-null')) + from t2,t3 + where t2.a=1 and t1.b = t3.a) as s1 +from t1; + +select *, + (select + CONCAT('t2:', IFNULL(t2.a, 't2a-null'), ';', + 'min_t3_b:', IFNULL(min(t3.b), 't3b-null')) + from t2,t3 + where t2.a=1 and t1.b = t3.a) as s1 +from t1; + +drop table t1,t2,t3; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/main/type_timestamp.result b/mysql-test/main/type_timestamp.result index 58cb12ae267..dbccee08ada 100644 --- a/mysql-test/main/type_timestamp.result +++ b/mysql-test/main/type_timestamp.result @@ -1230,6 +1230,8 @@ SELECT * FROM t1 HAVING MIN(t1.c1) >= ALL(SELECT 'a' UNION SELECT 'r'); c1 Warnings: Warning 1292 Truncated incorrect datetime value: 'r' +SELECT * FROM t1 HAVING MIN(t1.c1) > 0; +c1 DROP TABLE t1; CREATE TABLE t1 (c1 timestamp); INSERT INTO t1 VALUES ('2010-01-01 00:00:00'); diff --git a/mysql-test/main/type_timestamp.test b/mysql-test/main/type_timestamp.test index f12cc2a4bc3..c8517656071 100644 --- a/mysql-test/main/type_timestamp.test +++ b/mysql-test/main/type_timestamp.test @@ -810,6 +810,7 @@ DROP TABLE t1; CREATE TABLE t1 (c1 timestamp); SELECT MIN(t1.c1) AS k1 FROM t1 HAVING (k1 >= ALL(SELECT 'a' UNION SELECT 'r')); SELECT * FROM t1 HAVING MIN(t1.c1) >= ALL(SELECT 'a' UNION SELECT 'r'); +SELECT * FROM t1 HAVING MIN(t1.c1) > 0; DROP TABLE t1; CREATE TABLE t1 (c1 timestamp); diff --git a/sql/item_func.h b/sql/item_func.h index 41f2a52616d..3afe0d00661 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -381,7 +381,7 @@ public: { for (uint i= 0; i < arg_count; i++) { - args[i]->no_rows_in_result(); + args[i]->restore_to_before_no_rows_in_result(); } } void convert_const_compared_to_int_field(THD *thd); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 56a185acdd5..2be1fea9b03 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -142,10 +142,10 @@ static void update_depend_map_for_order(JOIN *join, ORDER *order); static ORDER *remove_const(JOIN *join,ORDER *first_order,COND *cond, bool change_list, bool *simple_order); static int return_zero_rows(JOIN *join, select_result *res, - List &tables, - List &fields, bool send_row, + List *tables, + List *fields, bool send_row, ulonglong select_options, const char *info, - Item *having, List &all_fields); + Item *having, List *all_fields); static COND *build_equal_items(JOIN *join, COND *cond, COND_EQUAL *inherited, List *join_list, @@ -1157,11 +1157,40 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) DBUG_RETURN(0); } + /***************************************************************************** Check fields, find best join, do the select and output fields. mysql_select assumes that all tables are already opened *****************************************************************************/ +/* + Check if we have a field reference. If yes, we have to use + mixed_implicit_grouping. +*/ + +static bool check_list_for_field(List *items) +{ + List_iterator_fast select_it(*items); + Item *select_el; + + while ((select_el= select_it++)) + { + if (select_el->with_field) + return true; + } + return false; +} + +static bool check_list_for_field(ORDER *order) +{ + for (; order; order= order->next) + { + if (order->item[0]->with_field) + return true; + } + return false; +} + /** Prepare of whole select (including sub queries in future). @@ -1241,53 +1270,45 @@ JOIN::prepare(TABLE_LIST *tables_init, DBUG_RETURN(-1); /* - TRUE if the SELECT list mixes elements with and without grouping, - and there is no GROUP BY clause. Mixing non-aggregated fields with - aggregate functions in the SELECT list is a MySQL extenstion that - is allowed only if the ONLY_FULL_GROUP_BY sql mode is not set. + mixed_implicit_grouping will be set to TRUE if the SELECT list + mixes elements with and without grouping, and there is no GROUP BY + clause. + Mixing non-aggregated fields with aggregate functions in the + SELECT list or HAVING is a MySQL extension that is allowed only if + the ONLY_FULL_GROUP_BY sql mode is not set. */ mixed_implicit_grouping= false; if ((~thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY) && select_lex->with_sum_func && !group_list) { - List_iterator_fast select_it(fields_list); - Item *select_el; /* Element of the SELECT clause, can be an expression. */ - bool found_field_elem= false; - bool found_sum_func_elem= false; - - while ((select_el= select_it++)) + if (check_list_for_field(&fields_list) || + check_list_for_field(order)) { - if (select_el->with_sum_func()) - found_sum_func_elem= true; - if (select_el->with_field) - found_field_elem= true; - if (found_sum_func_elem && found_field_elem) + TABLE_LIST *tbl; + List_iterator_fast li(select_lex->leaf_tables); + + mixed_implicit_grouping= true; // mark for future + + while ((tbl= li++)) { - mixed_implicit_grouping= true; - break; + /* + If the query uses implicit grouping where the select list + contains both aggregate functions and non-aggregate fields, + any non-aggregated field may produce a NULL value. Set all + fields of each table as nullable before semantic analysis to + take into account this change of nullability. + + Note: this loop doesn't touch tables inside merged + semi-joins, because subquery-to-semijoin conversion has not + been done yet. This is intended. + */ + if (tbl->table) + tbl->table->maybe_null= 1; } } } - table_count= select_lex->leaf_tables.elements; - TABLE_LIST *tbl; - List_iterator_fast li(select_lex->leaf_tables); - while ((tbl= li++)) - { - /* - If the query uses implicit grouping where the select list contains both - aggregate functions and non-aggregate fields, any non-aggregated field - may produce a NULL value. Set all fields of each table as nullable before - semantic analysis to take into account this change of nullability. - - Note: this loop doesn't touch tables inside merged semi-joins, because - subquery-to-semijoin conversion has not been done yet. This is intended. - */ - if (mixed_implicit_grouping && tbl->table) - tbl->table->maybe_null= 1; - } - uint real_og_num= og_num; if (skip_order_by && select_lex != select_lex->master_unit()->global_parameters()) @@ -3838,7 +3859,7 @@ bool JOIN::make_aggr_tables_info() set_items_ref_array(items0); if (join_tab) join_tab[exec_join_tab_cnt() + aggr_tables - 1].next_select= - setup_end_select_func(this, NULL); + setup_end_select_func(this); group= has_group_by; DBUG_RETURN(false); @@ -4220,13 +4241,7 @@ JOIN::reinit() } } - /* Reset of sum functions */ - if (sum_funcs) - { - Item_sum *func, **func_ptr= sum_funcs; - while ((func= *(func_ptr++))) - func->clear(); - } + clear_sum_funcs(); if (no_rows_in_result_called) { @@ -4510,12 +4525,12 @@ void JOIN::exec_inner() } else { - (void) return_zero_rows(this, result, select_lex->leaf_tables, - *columns_list, + (void) return_zero_rows(this, result, &select_lex->leaf_tables, + columns_list, send_row_on_empty_set(), select_options, zero_result_cause, - having ? having : tmp_having, all_fields); + having ? having : tmp_having, &all_fields); DBUG_VOID_RETURN; } } @@ -14626,10 +14641,36 @@ ORDER *simple_remove_const(ORDER *order, COND *where) } +/* + Set all fields in the table to have a null value + + @param tables Table list +*/ + +static void make_tables_null_complemented(List *tables) +{ + List_iterator ti(*tables); + TABLE_LIST *table; + while ((table= ti++)) + { + /* + Don't touch semi-join materialization tables, as the a join_free() + call may have freed them (and HAVING clause can't have references to + them anyway). + */ + if (!table->is_jtbm()) + { + TABLE *tbl= table->table; + mark_as_null_row(tbl); // Set fields to NULL + } + } +} + + static int -return_zero_rows(JOIN *join, select_result *result, List &tables, - List &fields, bool send_row, ulonglong select_options, - const char *info, Item *having, List &all_fields) +return_zero_rows(JOIN *join, select_result *result, List *tables, + List *fields, bool send_row, ulonglong select_options, + const char *info, Item *having, List *all_fields) { DBUG_ENTER("return_zero_rows"); @@ -14645,24 +14686,15 @@ return_zero_rows(JOIN *join, select_result *result, List &tables, Set all tables to have NULL row. This is needed as we will be evaluating HAVING condition. */ - List_iterator ti(tables); - TABLE_LIST *table; - while ((table= ti++)) - { - /* - Don't touch semi-join materialization tables, as the above join_free() - call has freed them (and HAVING clause can't have references to them - anyway). - */ - if (!table->is_jtbm()) - mark_as_null_row(table->table); // All fields are NULL - } - List_iterator_fast it(all_fields); + make_tables_null_complemented(tables); + + List_iterator_fast it(*all_fields); Item *item; /* Inform all items (especially aggregating) to calculate HAVING correctly, also we will need it for sending results. */ + join->no_rows_in_result_called= 1; while ((item= it++)) item->no_rows_in_result(); if (having && having->val_int() == 0) @@ -14676,12 +14708,12 @@ return_zero_rows(JOIN *join, select_result *result, List &tables, join->thd->limit_found_rows= 0; } - if (!(result->send_result_set_metadata(fields, + if (!(result->send_result_set_metadata(*fields, Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))) { bool send_error= FALSE; if (send_row) - send_error= result->send_data(fields) > 0; + send_error= result->send_data(*fields) > 0; if (likely(!send_error)) result->send_eof(); // Should be safe } @@ -14697,49 +14729,42 @@ return_zero_rows(JOIN *join, select_result *result, List &tables, } /** - used only in JOIN::clear (always) and in do_select() - (if there where no matching rows) + Reset table rows to contain a null-complement row (all fields are null) + + Used only in JOIN::clear() and in do_select() if there where no matching rows. @param join JOIN - @param cleared_tables If not null, clear also const tables and mark all - cleared tables in the map. cleared_tables is only - set when called from do_select() when there is a - group function and there where no matching rows. + @param cleared_tables Used to mark all cleared tables in the map. Needed for + unclear_tables() to know which tables to restore to + their original state. */ static void clear_tables(JOIN *join, table_map *cleared_tables) { - /* - must clear only the non-const tables as const tables are not re-calculated. - */ + DBUG_ASSERT(cleared_tables); for (uint i= 0 ; i < join->table_count ; i++) { TABLE *table= join->table[i]; if (table->null_row) continue; // Nothing more to do - if (!(table->map & join->const_table_map) || cleared_tables) + (*cleared_tables)|= (((table_map) 1) << i); + if (table->s->null_bytes) { - if (cleared_tables) - { - (*cleared_tables)|= (((table_map) 1) << i); - if (table->s->null_bytes) - { - /* - Remember null bits for the record so that we can restore the - original const record in unclear_tables() - */ - memcpy(table->record[1], table->null_flags, table->s->null_bytes); - } - } - mark_as_null_row(table); // All fields are NULL + /* + Remember null bits for the record so that we can restore the + original const record in unclear_tables() + */ + memcpy(table->record[1], table->null_flags, table->s->null_bytes); } + mark_as_null_row(table); // All fields are NULL } } /** Reverse null marking for tables and restore null bits. + This return the tables to the state of before clear_tables(). We have to do this because the tables may be re-used in a sub query and the subquery will assume that the const tables contains the original @@ -20216,9 +20241,9 @@ void set_postjoin_aggr_write_func(JOIN_TAB *tab) end_select function to use. This function can't fail. */ -Next_select_func setup_end_select_func(JOIN *join, JOIN_TAB *tab) +Next_select_func setup_end_select_func(JOIN *join) { - TMP_TABLE_PARAM *tmp_tbl= tab ? tab->tmp_table_param : &join->tmp_table_param; + TMP_TABLE_PARAM *tmp_tbl= &join->tmp_table_param; /* Choose method for presenting result to user. Use end_send_group @@ -20289,7 +20314,7 @@ do_select(JOIN *join, Procedure *procedure) join->duplicate_rows= join->send_records=0; if (join->only_const_tables() && !join->need_tmp) { - Next_select_func end_select= setup_end_select_func(join, NULL); + Next_select_func end_select= setup_end_select_func(join); /* HAVING will be checked after processing aggregate functions, @@ -20764,6 +20789,7 @@ sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) { DBUG_ENTER("sub_select"); + /* Restore state if mark_as_null_row() have been called */ if (join_tab->last_inner) { JOIN_TAB *last_inner_tab= join_tab->last_inner; @@ -22126,11 +22152,18 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), { int idx= -1; enum_nested_loop_state ok_code= NESTED_LOOP_OK; + /* + join_tab can be 0 in the case all tables are const tables and we did not + need a temporary table to store the result. + In this case we use the original given fields, which is stored in + join->fields. + */ List *fields= join_tab ? (join_tab-1)->fields : join->fields; DBUG_ENTER("end_send_group"); if (!join->items3.is_null() && !join->set_group_rpa) { + /* Move ref_pointer_array to points to items3 */ join->set_group_rpa= true; join->set_items_ref_array(join->items3); } @@ -22138,10 +22171,12 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), if (!join->first_record || end_of_records || (idx=test_if_group_changed(join->group_fields)) >= 0) { + if (!join->group_sent && (join->first_record || (end_of_records && !join->group && !join->group_optimized_away))) { + table_map cleared_tables= (table_map) 0; if (join->procedure) join->procedure->end_group(); if (idx < (int) join->send_group_parts) @@ -22164,11 +22199,13 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), { if (!join->first_record) { - List_iterator_fast it(*join->fields); - Item *item; /* No matching rows for group function */ - join->clear(); + List_iterator_fast it(*fields); + Item *item; + join->no_rows_in_result_called= 1; + + join->clear(&cleared_tables); while ((item= it++)) item->no_rows_in_result(); } @@ -22194,7 +22231,14 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), if (join->rollup_send_data((uint) (idx+1))) error= 1; } - } + if (join->no_rows_in_result_called) + { + /* Restore null tables to original state */ + join->no_rows_in_result_called= 0; + if (cleared_tables) + unclear_tables(join, &cleared_tables); + } + } if (unlikely(error > 0)) DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ if (end_of_records) @@ -22496,6 +22540,7 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), { if (join->first_record || (end_of_records && !join->group)) { + table_map cleared_tables= (table_map) 0; if (join->procedure) join->procedure->end_group(); int send_group_parts= join->send_group_parts; @@ -22504,7 +22549,7 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), if (!join->first_record) { /* No matching rows for group function */ - join->clear(); + join->clear(&cleared_tables); } copy_sum_funcs(join->sum_funcs, join->sum_funcs_end[send_group_parts]); @@ -22527,6 +22572,8 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)), DBUG_RETURN(NESTED_LOOP_ERROR); } } + if (cleared_tables) + unclear_tables(join, &cleared_tables); if (end_of_records) goto end; } @@ -26629,11 +26676,8 @@ int JOIN::rollup_write_data(uint idx, TMP_TABLE_PARAM *tmp_table_param_arg, TABL (end_send_group/end_write_group) */ -void JOIN::clear() +void inline JOIN::clear_sum_funcs() { - clear_tables(this, 0); - copy_fields(&tmp_table_param); - if (sum_funcs) { Item_sum *func, **func_ptr= sum_funcs; @@ -26643,6 +26687,22 @@ void JOIN::clear() } +/* + Prepare for returning 'empty row' when there is no matching row. + + - Mark all tables with mark_as_null_row() + - Make a copy of of all simple SELECT items + - Reset all sum functions to NULL or 0. +*/ + +void JOIN::clear(table_map *cleared_tables) +{ + clear_tables(this, cleared_tables); + copy_fields(&tmp_table_param); + clear_sum_funcs(); +} + + /** Print an EXPLAIN line with all NULLs and given message in the 'Extra' column diff --git a/sql/sql_select.h b/sql/sql_select.h index 0dfecc98a48..4bac201c3b4 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -227,7 +227,7 @@ enum sj_strategy_enum typedef enum_nested_loop_state (*Next_select_func)(JOIN *, struct st_join_table *, bool); -Next_select_func setup_end_select_func(JOIN *join, JOIN_TAB *tab); +Next_select_func setup_end_select_func(JOIN *join); int rr_sequential(READ_RECORD *info); int rr_sequential_and_unpack(READ_RECORD *info); Item *remove_pushed_top_conjuncts(THD *thd, Item *cond); @@ -1730,7 +1730,8 @@ public: void join_free(); /** Cleanup this JOIN, possibly for reuse */ void cleanup(bool full); - void clear(); + void clear(table_map *cleared_tables); + void inline clear_sum_funcs(); bool send_row_on_empty_set() { return (do_send_rows && implicit_grouping && !group_optimized_away && diff --git a/sql/table.h b/sql/table.h index 6f7f4e63473..1414659b78f 100644 --- a/sql/table.h +++ b/sql/table.h @@ -3337,10 +3337,16 @@ inline void mark_as_null_row(TABLE *table) bfill(table->null_flags,table->s->null_bytes,255); } +/* + Restore table to state before mark_as_null_row() call. + This assumes that the caller has restored table->null_flags, + as is done in unclear_tables(). +*/ + inline void unmark_as_null_row(TABLE *table) { - table->null_row=0; - table->status= STATUS_NO_RECORD; + table->null_row= 0; + table->status&= ~STATUS_NULL_ROW; } bool is_simple_order(ORDER *order); From 9b6f87b62afb32ea238e39b362b8e761f53e541c Mon Sep 17 00:00:00 2001 From: sara Date: Wed, 3 May 2023 01:34:32 +0200 Subject: [PATCH 005/171] MDEV-30892 test galera.galera_log_bin is not deterministic galera.galera_log_bin test created the test tables and executed initial DML into node 2 Then connection is switched to node 1, where ALTER TABLE was attempted. But there is no guarantee that the table to alter was yet replicated to node 1. The fix in this commit, creates the test tables in node 1 instead, so it is guaranteed that they are available for the later ALTER Signed-off-by: Julius Goryavsky --- mysql-test/suite/galera/r/galera_log_bin.result | 4 ++-- mysql-test/suite/galera/r/galera_log_bin_ext.result | 4 ++-- .../suite/galera/r/galera_log_bin_ext_mariabackup.result | 4 ++-- mysql-test/suite/galera/r/galera_log_bin_opt.result | 4 ++-- mysql-test/suite/galera/t/galera_log_bin.inc | 4 ++-- mysql-test/suite/galera/t/galera_log_bin_sst.inc | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_log_bin.result b/mysql-test/suite/galera/r/galera_log_bin.result index df7ace9d95a..31f953bfd36 100644 --- a/mysql-test/suite/galera/r/galera_log_bin.result +++ b/mysql-test/suite/galera/r/galera_log_bin.result @@ -1,10 +1,10 @@ connection node_2; connection node_1; -connection node_1; +connection node_2; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; -connection node_2; +connection node_1; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/r/galera_log_bin_ext.result b/mysql-test/suite/galera/r/galera_log_bin_ext.result index b110cb4dba3..9d7ea473241 100644 --- a/mysql-test/suite/galera/r/galera_log_bin_ext.result +++ b/mysql-test/suite/galera/r/galera_log_bin_ext.result @@ -2,11 +2,11 @@ connection node_2; connection node_1; connection node_1; connection node_2; -connection node_1; +connection node_2; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; -connection node_2; +connection node_1; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/r/galera_log_bin_ext_mariabackup.result b/mysql-test/suite/galera/r/galera_log_bin_ext_mariabackup.result index b110cb4dba3..9d7ea473241 100644 --- a/mysql-test/suite/galera/r/galera_log_bin_ext_mariabackup.result +++ b/mysql-test/suite/galera/r/galera_log_bin_ext_mariabackup.result @@ -2,11 +2,11 @@ connection node_2; connection node_1; connection node_1; connection node_2; -connection node_1; +connection node_2; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; -connection node_2; +connection node_1; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/r/galera_log_bin_opt.result b/mysql-test/suite/galera/r/galera_log_bin_opt.result index df7ace9d95a..31f953bfd36 100644 --- a/mysql-test/suite/galera/r/galera_log_bin_opt.result +++ b/mysql-test/suite/galera/r/galera_log_bin_opt.result @@ -1,10 +1,10 @@ connection node_2; connection node_1; -connection node_1; +connection node_2; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; -connection node_2; +connection node_1; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/t/galera_log_bin.inc b/mysql-test/suite/galera/t/galera_log_bin.inc index 4c245846752..3cac28047d4 100644 --- a/mysql-test/suite/galera/t/galera_log_bin.inc +++ b/mysql-test/suite/galera/t/galera_log_bin.inc @@ -1,11 +1,11 @@ --source include/galera_cluster.inc --source include/force_restart.inc ---connection node_1 +--connection node_2 set global wsrep_on=OFF; reset master; set global wsrep_on=ON; ---connection node_2 +--connection node_1 set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/t/galera_log_bin_sst.inc b/mysql-test/suite/galera/t/galera_log_bin_sst.inc index 3d20add6d9e..87420ad539f 100644 --- a/mysql-test/suite/galera/t/galera_log_bin_sst.inc +++ b/mysql-test/suite/galera/t/galera_log_bin_sst.inc @@ -6,11 +6,11 @@ --let $node_2=node_2 --source include/auto_increment_offset_save.inc ---connection node_1 +--connection node_2 set global wsrep_on=OFF; reset master; set global wsrep_on=ON; ---connection node_2 +--connection node_1 set global wsrep_on=OFF; reset master; set global wsrep_on=ON; From 01ea779149a32f0dfd6fe8ea52c7ba51a69e1016 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 28 Apr 2023 14:41:27 +0400 Subject: [PATCH 006/171] MDEV-31174 New class Native_functions_hash --- plugin/versioning/versioning.cc | 6 +-- sql/item_create.cc | 82 ++++++++++++++++++++------------- sql/item_create.h | 57 ++++++++++++++++++----- sql/sql_lex.cc | 2 +- sql/sql_show.cc | 3 -- sql/sql_yacc.yy | 2 +- sql/sql_yacc_ora.yy | 2 +- 7 files changed, 101 insertions(+), 53 deletions(-) diff --git a/plugin/versioning/versioning.cc b/plugin/versioning/versioning.cc index e150e4e8465..8b9fb74e77b 100644 --- a/plugin/versioning/versioning.cc +++ b/plugin/versioning/versioning.cc @@ -140,7 +140,7 @@ Create_func_trt_trx_sees Create_func_trt_trx_sees::s_singleton; #define BUILDER(F) & F::s_singleton -static Native_func_registry func_array[] = +static const Native_func_registry func_array_vers[] = { { { C_STRING_WITH_LEN("TRT_BEGIN_TS") }, BUILDER(Create_func_trt)}, { { C_STRING_WITH_LEN("TRT_COMMIT_ID") }, BUILDER(Create_func_trt)}, @@ -164,7 +164,7 @@ static int versioning_plugin_init(void *p __attribute__ ((unused))) { DBUG_ENTER("versioning_plugin_init"); // No need in locking since we so far single-threaded - int res= item_create_append(func_array); + int res= native_functions_hash.append(func_array_vers); if (res) { my_message(ER_PLUGIN_IS_NOT_LOADED, "Can't append function array" , MYF(0)); @@ -177,7 +177,7 @@ static int versioning_plugin_init(void *p __attribute__ ((unused))) static int versioning_plugin_deinit(void *p __attribute__ ((unused))) { DBUG_ENTER("versioning_plugin_deinit"); - (void) item_create_remove(func_array); + (void) native_functions_hash.remove(func_array_vers); DBUG_RETURN(0); } diff --git a/sql/item_create.cc b/sql/item_create.cc index 616ba3a641a..a95d2ae4f9a 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -7249,7 +7249,7 @@ Create_func_year_week::create_native(THD *thd, const LEX_CSTRING *name, - keep 1 line per entry, it makes grep | sort easier */ -Native_func_registry func_array[] = +const Native_func_registry func_array[] = { { { STRING_WITH_LEN("ABS") }, BUILDER(Create_func_abs)}, { { STRING_WITH_LEN("ACOS") }, BUILDER(Create_func_acos)}, @@ -7609,9 +7609,10 @@ Native_func_registry func_array[] = { {0, 0}, NULL} }; -size_t func_array_length= sizeof(func_array) / sizeof(Native_func_registry) - 1; -static HASH native_functions_hash; +const size_t func_array_length= sizeof(func_array) / sizeof(Native_func_registry) - 1; + +Native_functions_hash native_functions_hash; extern "C" uchar* get_native_fct_hash_key(const uchar *buff, size_t *length, @@ -7628,85 +7629,89 @@ get_native_fct_hash_key(const uchar *buff, size_t *length, startup only (before going multi-threaded) */ -int item_create_init() +bool Native_functions_hash::init(size_t count) { - DBUG_ENTER("item_create_init"); + DBUG_ENTER("Native_functions_hash::init"); - if (my_hash_init(& native_functions_hash, + if (my_hash_init(this, system_charset_info, - array_elements(func_array), + (ulong) count, 0, 0, (my_hash_get_key) get_native_fct_hash_key, NULL, /* Nothing to free */ MYF(0))) - DBUG_RETURN(1); + DBUG_RETURN(true); - DBUG_RETURN(item_create_append(func_array)); + DBUG_RETURN(false); } -int item_create_append(Native_func_registry array[]) -{ - Native_func_registry *func; - DBUG_ENTER("item_create_append"); +bool Native_functions_hash::append(const Native_func_registry array[]) +{ + const Native_func_registry *func; + + DBUG_ENTER("Native_functions_hash::append"); for (func= array; func->builder != NULL; func++) { - if (my_hash_insert(& native_functions_hash, (uchar*) func)) - DBUG_RETURN(1); + if (my_hash_insert(this, (uchar*) func)) + DBUG_RETURN(true); } #ifndef DBUG_OFF - for (uint i=0 ; i < native_functions_hash.records ; i++) + for (uint i=0 ; i < records ; i++) { - func= (Native_func_registry*) my_hash_element(& native_functions_hash, i); + func= (Native_func_registry*) my_hash_element(this, i); DBUG_PRINT("info", ("native function: %s length: %u", func->name.str, (uint) func->name.length)); } #endif - DBUG_RETURN(0); + DBUG_RETURN(false); } -int item_create_remove(Native_func_registry array[]) -{ - Native_func_registry *func; - DBUG_ENTER("item_create_remove"); +bool Native_functions_hash::remove(const Native_func_registry array[]) +{ + const Native_func_registry *func; + + DBUG_ENTER("Native_functions_hash::remove"); for (func= array; func->builder != NULL; func++) { - if (my_hash_delete(& native_functions_hash, (uchar*) func)) - DBUG_RETURN(1); + if (my_hash_delete(this, (uchar*) func)) + DBUG_RETURN(true); } - DBUG_RETURN(0); + DBUG_RETURN(false); } + /* Empty the hash table for native functions. Note: this code is not thread safe, and is intended to be used at server shutdown only (after thread requests have been executed). */ -void item_create_cleanup() +void Native_functions_hash::cleanup() { - DBUG_ENTER("item_create_cleanup"); - my_hash_free(& native_functions_hash); + DBUG_ENTER("Native_functions_hash::cleanup"); + my_hash_free(this); DBUG_VOID_RETURN; } + Create_func * -find_native_function_builder(THD *thd, const LEX_CSTRING *name) +Native_functions_hash::find(THD *thd, const LEX_CSTRING &name) const { Native_func_registry *func; Create_func *builder= NULL; /* Thread safe */ - func= (Native_func_registry*) my_hash_search(&native_functions_hash, - (uchar*) name->str, - name->length); + func= (Native_func_registry*) my_hash_search(this, + (uchar*) name.str, + name.length); if (func) { @@ -7716,6 +7721,19 @@ find_native_function_builder(THD *thd, const LEX_CSTRING *name) return builder; } + +int item_create_init() +{ + return native_functions_hash.init(func_array, array_elements(func_array)); +} + + +void item_create_cleanup() +{ + native_functions_hash.cleanup(); +} + + Create_qfunc * find_qualified_function_builder(THD *thd) { diff --git a/sql/item_create.h b/sql/item_create.h index 8456644ff6d..60a757b95d8 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -144,16 +144,6 @@ protected: }; -/** - Find the native function builder associated with a given function name. - @param thd The current thread - @param name The native function name - @return The native function builder associated with the name, or NULL -*/ -extern Create_func *find_native_function_builder(THD *thd, - const LEX_CSTRING *name); - - /** Find the function builder for qualified functions. @param thd The current thread @@ -200,9 +190,52 @@ struct Native_func_registry Create_func *builder; }; + +class Native_functions_hash: public HASH +{ +public: + Native_functions_hash() + { + bzero(this, sizeof(*this)); + } + ~Native_functions_hash() + { + /* + No automatic free because objects of this type + are expected to be declared statically. + The code in cleanup() calls my_hash_free() which may not work correctly + at the very end of mariadbd shutdown. + The the upper level code should call cleanup() explicitly. + + Unfortunatelly, it's not possible to use DBUG_ASSERT(!records) here, + because the server terminates using exit() in some cases, + e.g. in the test main.named_pipe with the "Create named pipe failed" + error. + */ + } + bool init(size_t count); + bool init(const Native_func_registry array[], size_t count) + { + return init(count) || append(array); + } + bool append(const Native_func_registry array[]); + bool remove(const Native_func_registry array[]); + void cleanup(); + /** + Find the native function builder associated with a given function name. + @param thd The current thread + @param name The native function name + @return The native function builder associated with the name, or NULL + */ + Create_func *find(THD *thd, const LEX_CSTRING &name) const; +}; + +extern MYSQL_PLUGIN_IMPORT Native_functions_hash native_functions_hash; + +extern const Native_func_registry func_array[]; +extern const size_t func_array_length; + int item_create_init(); -int item_create_append(Native_func_registry array[]); -int item_create_remove(Native_func_registry array[]); void item_create_cleanup(); Item *create_func_dyncol_create(THD *thd, List &list); diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index f77b98f04f1..019377061a0 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -943,7 +943,7 @@ bool is_lex_native_function(const LEX_CSTRING *name) bool is_native_function(THD *thd, const LEX_CSTRING *name) { - if (find_native_function_builder(thd, name)) + if (native_functions_hash.find(thd, *name)) return true; if (is_lex_native_function(name)) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 1ad20ac7593..a621c1de29a 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -76,9 +76,6 @@ extern size_t symbols_length; extern SYMBOL sql_functions[]; extern size_t sql_functions_length; -extern Native_func_registry func_array[]; -extern size_t func_array_length; - enum enum_i_s_events_fields { ISE_EVENT_CATALOG= 0, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index cf3927ac30c..cdc04d93708 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -11485,7 +11485,7 @@ function_call_generic: This will be revised with WL#2128 (SQL PATH) */ - builder= find_native_function_builder(thd, &$1); + builder= native_functions_hash.find(thd, $1); if (builder) { item= builder->create_func(thd, &$1, $4); diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index 87f71d8332b..5b734a27f8c 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -11600,7 +11600,7 @@ function_call_generic: This will be revised with WL#2128 (SQL PATH) */ - builder= find_native_function_builder(thd, &$1); + builder= native_functions_hash.find(thd, $1); if (builder) { item= builder->create_func(thd, &$1, $4); From 08a4732860348bcdc16b4ad8ecfc2b4b2e644ae5 Mon Sep 17 00:00:00 2001 From: Monty Date: Wed, 3 May 2023 21:27:30 +0300 Subject: [PATCH 007/171] MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size The problem was that join_buffer_size conflicted with join_buffer_space_limit, which caused the query to be run without join buffer. However this caused wrong results as the optimizer assumed that hash+join buffer would ensure that the equi-join condition would be satisfied, and didn't check it itself. Fixed by not using join_buffer_space_limit when optimize_join_buffer_size=off. This matches the documentation at https://mariadb.com/kb/en/block-based-join-algorithms Other things: - Removed not used variable JOIN_TAB::join_buffer_size_limit - Give an error if we cannot allocate a join buffer. This can only happen if the join_buffer variables are wrongly configured or we are running out of memory. In the future, instead of returning an error, we could properly convert the query plan that uses BNL-H join into one that doesn't use join buffering: make sure the equi-join condition is checked where appropriate. Reviewer: Sergei Petrunia --- mysql-test/main/join_cache.result | 33 ++++++++++++-- mysql-test/main/join_cache.test | 28 ++++++++++++ mysql-test/main/join_optimizer.test | 2 + sql/sql_join_cache.cc | 68 +++++++++++++++++++---------- sql/sql_select.h | 1 - 5 files changed, 104 insertions(+), 28 deletions(-) diff --git a/mysql-test/main/join_cache.result b/mysql-test/main/join_cache.result index 1837576e719..3b02740c67c 100644 --- a/mysql-test/main/join_cache.result +++ b/mysql-test/main/join_cache.result @@ -5655,13 +5655,13 @@ EXPLAIN SELECT * FROM t1, t2 LEFT JOIN t3 ON t2.b=t3.b WHERE t1.a=t2.a; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL NULL NULL NULL NULL 12 Using where -1 SIMPLE t3 ALL NULL NULL NULL NULL 3 Using where +1 SIMPLE t2 ALL NULL NULL NULL NULL 12 Using where; Using join buffer (flat, BNL join) +1 SIMPLE t3 ALL NULL NULL NULL NULL 3 Using where; Using join buffer (incremental, BNL join) SELECT * FROM t1, t2 LEFT JOIN t3 ON t2.b=t3.b WHERE t1.a=t2.a; a a b b c +3 3 32 32 302 3 3 30 30 300 3 3 31 NULL NULL -3 3 32 32 302 set join_buffer_space_limit=@save_join_buffer_space_limit; set join_buffer_size=@save_join_buffer_size; set join_cache_level=@save_join_cache_level; @@ -6229,6 +6229,33 @@ EXPLAIN } drop table t1,t2,t3; # End of 10.3 tests +# +# MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size +# +CREATE TABLE t1 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t1 VALUES (1332945389); +CREATE TABLE t2 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t2 VALUES (1180244875), (1951338178); +SET SESSION join_buffer_size= X; +Warnings: +Warning X Truncated incorrect join_buffer_size value: 'X' +SET SESSION join_cache_level = 4; +SET optimizer_switch='optimize_join_buffer_size=on'; +SELECT t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +i +SET optimizer_switch='optimize_join_buffer_size=off'; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +ERROR HYX: Could not create a join buffer. Please check and adjust the value of the variables 'JOIN_BUFFER_SIZE (X)' and 'JOIN_BUFFER_SPACE_LIMIT (X)' +SET SESSION join_buffer_size= 10000000; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +i i +SET SESSION optimizer_switch= default; +SET SESSION join_buffer_size= default; +SET SESSION join_cache_level= default; +drop table t1,t2; +# +# End of 10.4 tests +# set @@optimizer_switch=@save_optimizer_switch; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= diff --git a/mysql-test/main/join_cache.test b/mysql-test/main/join_cache.test index 07ac0b760cf..500fd9e1049 100644 --- a/mysql-test/main/join_cache.test +++ b/mysql-test/main/join_cache.test @@ -4201,6 +4201,34 @@ drop table t1,t2,t3; --echo # End of 10.3 tests +--echo # +--echo # MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size +--echo # + +CREATE TABLE t1 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t1 VALUES (1332945389); +CREATE TABLE t2 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t2 VALUES (1180244875), (1951338178); +--replace_regex /[0-9][0-9]+/X/ +SET SESSION join_buffer_size= 5250229460064350213; +SET SESSION join_cache_level = 4; +SET optimizer_switch='optimize_join_buffer_size=on'; +SELECT t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET optimizer_switch='optimize_join_buffer_size=off'; +--replace_regex /[0-9][0-9]+/X/ +--error ER_OUTOFMEMORY +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET SESSION join_buffer_size= 10000000; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET SESSION optimizer_switch= default; +SET SESSION join_buffer_size= default; +SET SESSION join_cache_level= default; +drop table t1,t2; + +--echo # +--echo # End of 10.4 tests +--echo # + # The following command must be the last one in the file set @@optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/main/join_optimizer.test b/mysql-test/main/join_optimizer.test index 3afe82113b9..e5f6181944d 100644 --- a/mysql-test/main/join_optimizer.test +++ b/mysql-test/main/join_optimizer.test @@ -2,6 +2,8 @@ drop table if exists t0,t1,t2,t3; --enable_warnings +--source include/have_innodb.inc + --echo # --echo # BUG#38049 incorrect rows estimations with references from preceding table --echo # diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index beca5fc782a..6de76334908 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -805,20 +805,18 @@ size_t JOIN_CACHE::get_min_join_buffer_size() the estimated number of records in the partial join DESCRIPTION - At the first its invocation for the cache the function calculates the - maximum possible size of join buffer for the cache. If the parameter - optimize_buff_size true then this value does not exceed the size of the - space needed for the estimated number of records 'max_records' in the - partial join that joins tables from the first one through join_tab. This - value is also capped off by the value of join_tab->join_buffer_size_limit, - if it has been set a to non-zero value, and by the value of the system - parameter join_buffer_size - otherwise. After the calculation of the - interesting size the function saves the value in the field 'max_buff_size' - in order to use it directly at the next invocations of the function. - NOTES - Currently the value of join_tab->join_buffer_size_limit is initialized - to 0 and is never reset. + At the first its invocation for the cache the function calculates + the maximum possible size of join buffer for the cache. If the + parameter optimize_buff_size true then this value does not exceed + the size of the space needed for the estimated number of records + 'max_records' in the partial join that joins tables from the first + one through join_tab. This value is also capped off by the value + of the system parameter join_buffer_size. After the calculation of + the interesting size the function saves the value in the field + 'max_buff_size' in order to use it directly at the next + invocations of the function. + RETURN VALUE The maximum possible size of the join buffer of this cache @@ -842,8 +840,6 @@ size_t JOIN_CACHE::get_max_join_buffer_size(bool optimize_buff_size) space_per_record= len; size_t limit_sz= (size_t)join->thd->variables.join_buff_size; - if (join_tab->join_buffer_size_limit) - set_if_smaller(limit_sz, join_tab->join_buffer_size_limit); if (!optimize_buff_size) max_sz= limit_sz; else @@ -923,13 +919,25 @@ int JOIN_CACHE::alloc_buffer() curr_min_buff_space_sz+= min_buff_size; curr_buff_space_sz+= buff_size; - if (curr_min_buff_space_sz > join_buff_space_limit || - (curr_buff_space_sz > join_buff_space_limit && - (!optimize_buff_size || + if (optimize_buff_size) + { + /* + optimize_join_buffer_size=on used. We should limit the join + buffer space to join_buff_space_limit if possible. + */ + if (curr_min_buff_space_sz > join_buff_space_limit) + { + /* + Increase buffer size to minimum needed, to be able to use the + join buffer. + */ + join_buff_space_limit= curr_min_buff_space_sz; + } + if (curr_buff_space_sz > join_buff_space_limit && join->shrink_join_buffers(join_tab, curr_buff_space_sz, - join_buff_space_limit)))) - goto fail; - + join_buff_space_limit)) + goto fail; // Fatal error + } if (for_explain_only) return 0; @@ -2766,7 +2774,6 @@ bool JOIN_CACHE_BKAH::save_explain_data(EXPLAIN_BKA_TYPE *explain) int JOIN_CACHE_HASHED::init(bool for_explain) { - int rc= 0; TABLE_REF *ref= &join_tab->ref; DBUG_ENTER("JOIN_CACHE_HASHED::init"); @@ -2776,8 +2783,21 @@ int JOIN_CACHE_HASHED::init(bool for_explain) key_length= ref->key_length; - if ((rc= JOIN_CACHE::init(for_explain)) || for_explain) - DBUG_RETURN (rc); + if (JOIN_CACHE::init(for_explain)) + { + THD *thd= join->thd; + const char *errmsg= + "Could not create a join buffer. Please check and " + "adjust the value of the variables 'JOIN_BUFFER_SIZE (%llu)' and " + "'JOIN_BUFFER_SPACE_LIMIT (%llu)'"; + my_printf_error(ER_OUTOFMEMORY, errmsg, MYF(0), + thd->variables.join_buff_size, + thd->variables.join_buff_space_limit); + DBUG_RETURN (1); + } + + if (for_explain) + DBUG_RETURN(0); if (!(key_buff= (uchar*) join->thd->alloc(key_length))) DBUG_RETURN(1); diff --git a/sql/sql_select.h b/sql/sql_select.h index 4bac201c3b4..f2b9d272701 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -395,7 +395,6 @@ typedef struct st_join_table { bool idx_cond_fact_out; bool use_join_cache; uint used_join_cache_level; - ulong join_buffer_size_limit; JOIN_CACHE *cache; /* Index condition for BKA access join From 5fd46be5a7da83e935c59796733d52906b59f14c Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 4 May 2023 12:43:18 +0300 Subject: [PATCH 008/171] Fixed calculation of JOIN_CACHE::max_records The old code did set max_records to either number_of_rows (partial_join_cardinality) or memory size (join_buffer_space_limit) which did not make sense. Fixed by setting max_records to number of rows that fits into join_buffer_size. Other things: - Initialize buffer cache values in JOIN_CACHE constructors (safety) Reviewer: Sergei Petrunia --- mysql-test/main/join_cache.result | 2 +- sql/sql_join_cache.cc | 24 +++++++++++++++--------- sql/sql_join_cache.h | 10 ++-------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/mysql-test/main/join_cache.result b/mysql-test/main/join_cache.result index 3b02740c67c..f5ddbfea733 100644 --- a/mysql-test/main/join_cache.result +++ b/mysql-test/main/join_cache.result @@ -3781,9 +3781,9 @@ id1 num3 text1 id4 id3 dummy 228808822 6 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 18 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 1 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 -228808822 3 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 17 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 50 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 +228808822 3 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 4 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 89 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2381969632 2482416112 0 228808822 19 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2381969632 2482416112 0 diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index 6de76334908..eac03404240 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -634,7 +634,7 @@ void JOIN_CACHE::create_remaining_fields() /* - Calculate and set all cache constants + Calculate and set all cache constants SYNOPSIS set_constants() @@ -829,6 +829,12 @@ size_t JOIN_CACHE::get_max_join_buffer_size(bool optimize_buff_size) size_t max_sz; size_t min_sz= get_min_join_buffer_size(); size_t len= 0; + double max_records, partial_join_cardinality= + (join_tab-1)->get_partial_join_cardinality(); + size_t limit_sz= (size_t) join->thd->variables.join_buff_size; + /* Expected join buffer space used for one record */ + size_t space_per_record; + for (JOIN_TAB *tab= start_tab; tab != join_tab; tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) { @@ -839,13 +845,17 @@ size_t JOIN_CACHE::get_max_join_buffer_size(bool optimize_buff_size) len+= get_max_key_addon_space_per_record() + avg_aux_buffer_incr; space_per_record= len; - size_t limit_sz= (size_t)join->thd->variables.join_buff_size; + /* Note that space_per_record can be 0 if no table fields where used */ + max_records= (double) (limit_sz / MY_MAX(space_per_record, 1)); + set_if_smaller(max_records, partial_join_cardinality); + set_if_bigger(max_records, 10.0); + if (!optimize_buff_size) max_sz= limit_sz; else { - if (limit_sz / max_records > space_per_record) - max_sz= space_per_record * max_records; + if ((size_t) (limit_sz / max_records) > space_per_record) + max_sz= space_per_record * (size_t) max_records; else max_sz= limit_sz; max_sz+= pack_length_with_blob_ptrs; @@ -855,7 +865,7 @@ size_t JOIN_CACHE::get_max_join_buffer_size(bool optimize_buff_size) max_buff_size= max_sz; } return max_buff_size; -} +} /* @@ -895,14 +905,10 @@ int JOIN_CACHE::alloc_buffer() join->thd->variables.join_buff_space_limit; bool optimize_buff_size= optimizer_flag(join->thd, OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE); - double partial_join_cardinality= (join_tab-1)->get_partial_join_cardinality(); buff= NULL; min_buff_size= 0; max_buff_size= 0; min_records= 1; - max_records= (size_t) (partial_join_cardinality <= join_buff_space_limit ? - (ulonglong) partial_join_cardinality : join_buff_space_limit); - set_if_bigger(max_records, 10); min_buff_size= get_min_join_buffer_size(); buff_size= get_max_join_buffer_size(optimize_buff_size); diff --git a/sql/sql_join_cache.h b/sql/sql_join_cache.h index f75e9fd380f..ad9cea744d7 100644 --- a/sql/sql_join_cache.h +++ b/sql/sql_join_cache.h @@ -248,9 +248,6 @@ protected: /* The expected size of the space per record in the auxiliary buffer */ size_t avg_aux_buffer_incr; - /* Expected join buffer space used for one record */ - size_t space_per_record; - /* Pointer to the beginning of the join buffer */ uchar *buff; /* @@ -272,11 +269,6 @@ protected: the minimal size equal to min_buff_size */ size_t min_records; - /* - The maximum expected number of records to be put in the join buffer - at one refill - */ - size_t max_records; /* Pointer to the current position in the join buffer. @@ -542,6 +534,7 @@ protected: join_tab= tab; prev_cache= next_cache= 0; buff= 0; + min_buff_size= max_buff_size= 0; // Caches } /* @@ -557,6 +550,7 @@ protected: next_cache= 0; prev_cache= prev; buff= 0; + min_buff_size= max_buff_size= 0; // Caches if (prev) prev->next_cache= this; } From e74390d94f81d0bc6d0b2b8999f7ee44fd2092e9 Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 4 May 2023 13:06:39 +0300 Subject: [PATCH 009/171] Cleanup of sql_join_cache code (no logic changes) - Remove virtual from get_min_join_buffer_size() and get_max_join_buffer_size(). - Avoid some calls to get_min_buffer_size() - Simply cache usage in get_..._join_buffer_size() - Simplify get_max_join_buffer_size() when using optimize_buff_size - Reindented some long comments Reviewer: Sergei Petrunia --- sql/sql_join_cache.cc | 162 +++++++++++++++++++++--------------------- sql/sql_join_cache.h | 5 +- 2 files changed, 85 insertions(+), 82 deletions(-) diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index eac03404240..7d61ce31cca 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -694,16 +694,22 @@ void JOIN_CACHE::set_constants() (prev_cache ? prev_cache->get_size_of_rec_offset() : 0) + length + fields*sizeof(uint); pack_length_with_blob_ptrs= pack_length + blobs*sizeof(uchar *); - min_buff_size= 0; min_records= 1; + min_buff_size= get_min_join_buffer_size(); buff_size= (size_t)MY_MAX(join->thd->variables.join_buff_size, - get_min_join_buffer_size()); + min_buff_size); size_of_rec_ofs= offset_size(buff_size); size_of_rec_len= blobs ? size_of_rec_ofs : offset_size(len); size_of_fld_ofs= size_of_rec_len; base_prefix_length= (with_length ? size_of_rec_len : 0) + (prev_cache ? prev_cache->get_size_of_rec_offset() : 0); - /* + /* + Call ge_min_join_buffer_size() again as the size may have got smaller + if size_of_rec_ofs or some other variable changed since last call. + */ + min_buff_size= 0; + min_buff_size= get_min_join_buffer_size(); + /* The size of the offsets for referenced fields will be added later. The values of 'pack_length' and 'pack_length_with_blob_ptrs' are adjusted every time when the first reference to the referenced field is registered. @@ -767,30 +773,29 @@ uint JOIN_CACHE::get_record_max_affix_length() size_t JOIN_CACHE::get_min_join_buffer_size() { - if (!min_buff_size) + if (min_buff_size) + return min_buff_size; // use cached value + + size_t len= 0, len_last= 0, len_addon, min_sz, add_sz= 0; + + for (JOIN_TAB *tab= start_tab; tab != join_tab; + tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) { - size_t len= 0; - size_t len_last= 0; - for (JOIN_TAB *tab= start_tab; tab != join_tab; - tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) - { - len+= tab->get_max_used_fieldlength(); - len_last+= tab->get_used_fieldlength(); - } - size_t len_addon= get_record_max_affix_length() + - get_max_key_addon_space_per_record(); - len+= len_addon; - len_last+= len_addon; - size_t min_sz= len*(min_records-1) + len_last; - min_sz+= pack_length_with_blob_ptrs; - size_t add_sz= 0; - for (uint i=0; i < min_records; i++) - add_sz+= join_tab_scan->aux_buffer_incr(i+1); - avg_aux_buffer_incr= add_sz/min_records; - min_sz+= add_sz; - set_if_bigger(min_sz, 1); - min_buff_size= min_sz; + len+= tab->get_max_used_fieldlength(); + len_last+= tab->get_used_fieldlength(); } + len_addon= (get_record_max_affix_length() + + get_max_key_addon_space_per_record()); + len+= len_addon; + len_last+= len_addon; + min_sz= len*(min_records-1) + len_last; + min_sz+= pack_length_with_blob_ptrs; + for (uint i=0; i < min_records; i++) + add_sz+= join_tab_scan->aux_buffer_incr(i+1); + avg_aux_buffer_incr= add_sz/min_records; + min_sz+= add_sz; + set_if_bigger(min_sz, 1); + min_buff_size= min_sz; return min_buff_size; } @@ -822,48 +827,48 @@ size_t JOIN_CACHE::get_min_join_buffer_size() The maximum possible size of the join buffer of this cache */ -size_t JOIN_CACHE::get_max_join_buffer_size(bool optimize_buff_size) +size_t JOIN_CACHE::get_max_join_buffer_size(bool optimize_buff_size, + size_t min_sz) { - if (!max_buff_size) + if (max_buff_size) + return max_buff_size; // use cached value + + size_t limit_sz= (size_t) join->thd->variables.join_buff_size; + + if (!optimize_buff_size) + return max_buff_size= limit_sz; + + size_t max_sz; + size_t len= 0; + double max_records, partial_join_cardinality= + (join_tab-1)->get_partial_join_cardinality(); + /* Expected join buffer space used for one record */ + size_t space_per_record; + + for (JOIN_TAB *tab= start_tab; tab != join_tab; + tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) { - size_t max_sz; - size_t min_sz= get_min_join_buffer_size(); - size_t len= 0; - double max_records, partial_join_cardinality= - (join_tab-1)->get_partial_join_cardinality(); - size_t limit_sz= (size_t) join->thd->variables.join_buff_size; - /* Expected join buffer space used for one record */ - size_t space_per_record; - - for (JOIN_TAB *tab= start_tab; tab != join_tab; - tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) - { - len+= tab->get_used_fieldlength(); - } - len+= get_record_max_affix_length(); - avg_record_length= len; - len+= get_max_key_addon_space_per_record() + avg_aux_buffer_incr; - space_per_record= len; - - /* Note that space_per_record can be 0 if no table fields where used */ - max_records= (double) (limit_sz / MY_MAX(space_per_record, 1)); - set_if_smaller(max_records, partial_join_cardinality); - set_if_bigger(max_records, 10.0); - - if (!optimize_buff_size) - max_sz= limit_sz; - else - { - if ((size_t) (limit_sz / max_records) > space_per_record) - max_sz= space_per_record * (size_t) max_records; - else - max_sz= limit_sz; - max_sz+= pack_length_with_blob_ptrs; - set_if_smaller(max_sz, limit_sz); - } - set_if_bigger(max_sz, min_sz); - max_buff_size= max_sz; + len+= tab->get_used_fieldlength(); } + len+= get_record_max_affix_length(); + avg_record_length= len; + len+= get_max_key_addon_space_per_record() + avg_aux_buffer_incr; + space_per_record= len; + + /* Note that space_per_record can be 0 if no table fields where used */ + max_records= (double) (limit_sz / MY_MAX(space_per_record, 1)); + set_if_smaller(max_records, partial_join_cardinality); + set_if_bigger(max_records, 10.0); + + if ((size_t) (limit_sz / max_records) > space_per_record) + max_sz= space_per_record * (size_t) max_records; + else + max_sz= limit_sz; + max_sz+= pack_length_with_blob_ptrs; + set_if_smaller(max_sz, limit_sz); + + set_if_bigger(max_sz, min_sz); + max_buff_size= max_sz; return max_buff_size; } @@ -906,11 +911,7 @@ int JOIN_CACHE::alloc_buffer() bool optimize_buff_size= optimizer_flag(join->thd, OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE); buff= NULL; - min_buff_size= 0; - max_buff_size= 0; - min_records= 1; - min_buff_size= get_min_join_buffer_size(); - buff_size= get_max_join_buffer_size(optimize_buff_size); + buff_size= get_max_join_buffer_size(optimize_buff_size, min_buff_size); for (tab= start_tab; tab!= join_tab; tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) @@ -1093,18 +1094,19 @@ int JOIN_CACHE::init(bool for_explain) /* - Check the possibility to read the access keys directly from the join buffer + Check the possibility to read the access keys directly from the join buffer SYNOPSIS check_emb_key_usage() DESCRIPTION - The function checks some conditions at which the key values can be read - directly from the join buffer. This is possible when the key values can be - composed by concatenation of the record fields stored in the join buffer. - Sometimes when the access key is multi-component the function has to re-order - the fields written into the join buffer to make keys embedded. If key - values for the key access are detected as embedded then 'use_emb_key' - is set to TRUE. + The function checks some conditions at which the key values can be + read directly from the join buffer. This is possible when the key + values can be composed by concatenation of the record fields + stored in the join buffer. Sometimes when the access key is + multi-component the function has to re-order the fields written + into the join buffer to make keys embedded. If key values for the + key access are detected as embedded then 'use_emb_key' is set to + TRUE. EXAMPLE Let table t2 has an index defined on the columns a,b . Let's assume also @@ -1257,7 +1259,7 @@ bool JOIN_CACHE::check_emb_key_usage() trailing spaces - significant part of fixed length fields that can have trailing spaces with the prepanded length - - data of non-blob variable length fields with the prepanded data length + - data of non-blob variable length fields with the prepanded data length - blob data from blob fields with the prepanded data length (5) record offset values for the data fields that are referred to from other caches @@ -1328,7 +1330,7 @@ uint JOIN_CACHE::write_record_data(uchar * link, bool *is_full) Check whether we won't be able to add any new record into the cache after this one because the cache will be full. Set last_record to TRUE if it's so. The assume that the cache will be full after the record has been written - into it if either the remaining space of the cache is not big enough for the + into it if either the remaining space of the cache is not big enough for the record's blob values or if there is a chance that not all non-blob fields of the next record can be placed there. This function is called only in the case when there is enough space left in @@ -1350,7 +1352,7 @@ uint JOIN_CACHE::write_record_data(uchar * link, bool *is_full) /* Put a reference to the fields of the record that are stored in the previous - cache if there is any. This reference is passed by the 'link' parameter. + cache if there is any. This reference is passed by the 'link' parameter. */ if (prev_cache) { diff --git a/sql/sql_join_cache.h b/sql/sql_join_cache.h index ad9cea744d7..8bdce1bd592 100644 --- a/sql/sql_join_cache.h +++ b/sql/sql_join_cache.h @@ -602,9 +602,10 @@ public: void set_join_buffer_size(size_t sz) { buff_size= sz; } /* Get the minimum possible size of the cache join buffer */ - virtual size_t get_min_join_buffer_size(); + size_t get_min_join_buffer_size(); /* Get the maximum possible size of the cache join buffer */ - virtual size_t get_max_join_buffer_size(bool optimize_buff_size); + size_t get_max_join_buffer_size(bool optimize_buff_size, + size_t min_buffer_size_arg); /* Shrink the size if the cache join buffer in a given ratio */ bool shrink_join_buffer_in_ratio(ulonglong n, ulonglong d); From c874d5c68d24fb78bb6d59db1927ea5794891e38 Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 4 May 2023 19:13:30 +0300 Subject: [PATCH 010/171] Added missing test file --- .../rpl/r/{rpl_loaddatalocal.result => rpl_loaddata_local.result} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename mysql-test/suite/rpl/r/{rpl_loaddatalocal.result => rpl_loaddata_local.result} (100%) diff --git a/mysql-test/suite/rpl/r/rpl_loaddatalocal.result b/mysql-test/suite/rpl/r/rpl_loaddata_local.result similarity index 100% rename from mysql-test/suite/rpl/r/rpl_loaddatalocal.result rename to mysql-test/suite/rpl/r/rpl_loaddata_local.result From 84b9fc25a29b94a37eb9d5ac2e2c0f75c0efafda Mon Sep 17 00:00:00 2001 From: Monty Date: Fri, 5 May 2023 11:31:35 +0300 Subject: [PATCH 011/171] Fixed wrong test cases (embedded and ASAN) - main.selectivity failed because one test produced different result with embedded (missing feature). Fixed by moving the failing part to selectivity_notembedded. - Disabled maria.encrypt-no-key for embedded as embedded does not support encryption - Moved test from join_cache to join_cache_notasan that tried to alloc() a buffer bigger than available memory. --- mysql-test/main/join_cache.result | 27 ----- mysql-test/main/join_cache.test | 28 ----- mysql-test/main/join_cache_notasan.result | 27 +++++ mysql-test/main/join_cache_notasan.test | 35 ++++++ mysql-test/main/selectivity.result | 69 ------------ mysql-test/main/selectivity.test | 79 -------------- mysql-test/main/selectivity_innodb.result | 67 ------------ .../main/selectivity_notembedded.result | 83 ++++++++++++++ mysql-test/main/selectivity_notembedded.test | 102 ++++++++++++++++++ mysql-test/suite/maria/encrypt-no-key.test | 1 + 10 files changed, 248 insertions(+), 270 deletions(-) create mode 100644 mysql-test/main/join_cache_notasan.result create mode 100644 mysql-test/main/join_cache_notasan.test create mode 100644 mysql-test/main/selectivity_notembedded.result create mode 100644 mysql-test/main/selectivity_notembedded.test diff --git a/mysql-test/main/join_cache.result b/mysql-test/main/join_cache.result index f5ddbfea733..6b39f936628 100644 --- a/mysql-test/main/join_cache.result +++ b/mysql-test/main/join_cache.result @@ -6229,33 +6229,6 @@ EXPLAIN } drop table t1,t2,t3; # End of 10.3 tests -# -# MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size -# -CREATE TABLE t1 (i int PRIMARY KEY)engine=innodb; -INSERT INTO t1 VALUES (1332945389); -CREATE TABLE t2 (i int PRIMARY KEY)engine=innodb; -INSERT INTO t2 VALUES (1180244875), (1951338178); -SET SESSION join_buffer_size= X; -Warnings: -Warning X Truncated incorrect join_buffer_size value: 'X' -SET SESSION join_cache_level = 4; -SET optimizer_switch='optimize_join_buffer_size=on'; -SELECT t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; -i -SET optimizer_switch='optimize_join_buffer_size=off'; -SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; -ERROR HYX: Could not create a join buffer. Please check and adjust the value of the variables 'JOIN_BUFFER_SIZE (X)' and 'JOIN_BUFFER_SPACE_LIMIT (X)' -SET SESSION join_buffer_size= 10000000; -SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; -i i -SET SESSION optimizer_switch= default; -SET SESSION join_buffer_size= default; -SET SESSION join_cache_level= default; -drop table t1,t2; -# -# End of 10.4 tests -# set @@optimizer_switch=@save_optimizer_switch; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= diff --git a/mysql-test/main/join_cache.test b/mysql-test/main/join_cache.test index 500fd9e1049..07ac0b760cf 100644 --- a/mysql-test/main/join_cache.test +++ b/mysql-test/main/join_cache.test @@ -4201,34 +4201,6 @@ drop table t1,t2,t3; --echo # End of 10.3 tests ---echo # ---echo # MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size ---echo # - -CREATE TABLE t1 (i int PRIMARY KEY)engine=innodb; -INSERT INTO t1 VALUES (1332945389); -CREATE TABLE t2 (i int PRIMARY KEY)engine=innodb; -INSERT INTO t2 VALUES (1180244875), (1951338178); ---replace_regex /[0-9][0-9]+/X/ -SET SESSION join_buffer_size= 5250229460064350213; -SET SESSION join_cache_level = 4; -SET optimizer_switch='optimize_join_buffer_size=on'; -SELECT t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; -SET optimizer_switch='optimize_join_buffer_size=off'; ---replace_regex /[0-9][0-9]+/X/ ---error ER_OUTOFMEMORY -SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; -SET SESSION join_buffer_size= 10000000; -SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; -SET SESSION optimizer_switch= default; -SET SESSION join_buffer_size= default; -SET SESSION join_cache_level= default; -drop table t1,t2; - ---echo # ---echo # End of 10.4 tests ---echo # - # The following command must be the last one in the file set @@optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/main/join_cache_notasan.result b/mysql-test/main/join_cache_notasan.result new file mode 100644 index 00000000000..3cec949f5c6 --- /dev/null +++ b/mysql-test/main/join_cache_notasan.result @@ -0,0 +1,27 @@ +# +# MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size +# +CREATE TABLE t1 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t1 VALUES (1332945389); +CREATE TABLE t2 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t2 VALUES (1180244875), (1951338178); +SET SESSION join_buffer_size= X; +Warnings: +Warning X Truncated incorrect join_buffer_size value: 'X' +SET SESSION join_cache_level = 4; +SET optimizer_switch='optimize_join_buffer_size=on'; +SELECT t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +i +SET optimizer_switch='optimize_join_buffer_size=off'; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +ERROR HYX: Could not create a join buffer. Please check and adjust the value of the variables 'JOIN_BUFFER_SIZE (X)' and 'JOIN_BUFFER_SPACE_LIMIT (X)' +SET SESSION join_buffer_size= 10000000; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +i i +SET SESSION optimizer_switch= default; +SET SESSION join_buffer_size= default; +SET SESSION join_cache_level= default; +drop table t1,t2; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/join_cache_notasan.test b/mysql-test/main/join_cache_notasan.test new file mode 100644 index 00000000000..7fd5e4e80b1 --- /dev/null +++ b/mysql-test/main/join_cache_notasan.test @@ -0,0 +1,35 @@ +# +# Tests that should be in join_cache but cannot be run with ASAN + +--source include/not_asan.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size +--echo # + +# This test tries to allocate a too big bufffer, for which ASAN gives an error + +CREATE TABLE t1 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t1 VALUES (1332945389); +CREATE TABLE t2 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t2 VALUES (1180244875), (1951338178); +--replace_regex /[0-9][0-9]+/X/ +SET SESSION join_buffer_size= 5250229460064350213; +SET SESSION join_cache_level = 4; +SET optimizer_switch='optimize_join_buffer_size=on'; +SELECT t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET optimizer_switch='optimize_join_buffer_size=off'; +--replace_regex /[0-9][0-9]+/X/ +--error ER_OUTOFMEMORY +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET SESSION join_buffer_size= 10000000; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET SESSION optimizer_switch= default; +SET SESSION join_buffer_size= default; +SET SESSION join_cache_level= default; +drop table t1,t2; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/main/selectivity.result b/mysql-test/main/selectivity.result index 7d7343847cd..a6866e55b13 100644 --- a/mysql-test/main/selectivity.result +++ b/mysql-test/main/selectivity.result @@ -1937,75 +1937,6 @@ Warnings: Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2 DROP TABLE t1; # End of 10.2 tests -# -# MDEV-31067: selectivity_from_histogram >1.0 for a DOUBLE_PREC_HB histogram -# -create table t0(a int); -insert into t0 select 1 from seq_1_to_78; -create table t1(a int); -insert into t1 select 1 from seq_1_to_26; -create table t10 (a int); -insert into t10 select 0 from t0, seq_1_to_4; -insert into t10 select 8693 from t1; -insert into t10 select 8694 from t1; -insert into t10 select 8695 from t1; -insert into t10 select 34783 from t1; -insert into t10 select 34784 from t1; -insert into t10 select 34785 from t1; -insert into t10 select 34785 from t0, seq_1_to_8; -insert into t10 select 65214 from t1; -insert into t10 select 65215 from t1; -insert into t10 select 65216 from t1; -insert into t10 select 65216 from t0, seq_1_to_52; -insert into t10 select 65217 from t1; -insert into t10 select 65218 from t1; -insert into t10 select 65219 from t1; -insert into t10 select 65219 from t0; -insert into t10 select 73913 from t1; -insert into t10 select 73914 from t1; -insert into t10 select 73915 from t1; -insert into t10 select 73915 from t0, seq_1_to_40; -insert into t10 select 78257 from t1; -insert into t10 select 78258 from t1; -insert into t10 select 78259 from t1; -insert into t10 select 91300 from t1; -insert into t10 select 91301 from t1; -insert into t10 select 91302 from t1; -insert into t10 select 91302 from t0, seq_1_to_6; -insert into t10 select 91303 from t1; -insert into t10 select 91304 from t1; -insert into t10 select 91305 from t1; -insert into t10 select 91305 from t0, seq_1_to_8; -insert into t10 select 99998 from t1; -insert into t10 select 99999 from t1; -insert into t10 select 100000 from t1; -set use_stat_tables=preferably; -analyze table t10 persistent for all; -Table Op Msg_type Msg_text -test.t10 analyze status Engine-independent statistics collected -test.t10 analyze status OK -flush tables; -set @tmp=@@optimizer_trace; -set optimizer_trace=1; -explain select * from t10 where a in (91303); -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t10 ALL NULL NULL NULL NULL 9984 Using where -# Must have selectivity_from_histogram <= 1.0: -select json_detailed(json_extract(trace, '$**.selectivity_for_columns')) -from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.selectivity_for_columns')) -[ - [ - { - "column_name": "a", - "ranges": - ["91303 <= a <= 91303"], - "selectivity_from_histogram": 0.0357 - } - ] -] -set optimizer_trace=@tmp; -drop table t0,t1,t10; set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; set histogram_size=@save_histogram_size; set use_stat_tables= @save_use_stat_tables; diff --git a/mysql-test/main/selectivity.test b/mysql-test/main/selectivity.test index 06a3e32da95..def74394ec5 100644 --- a/mysql-test/main/selectivity.test +++ b/mysql-test/main/selectivity.test @@ -1324,85 +1324,6 @@ DROP TABLE t1; --echo # End of 10.2 tests ---echo # ---echo # MDEV-31067: selectivity_from_histogram >1.0 for a DOUBLE_PREC_HB histogram ---echo # -create table t0(a int); # This holds how many rows we hold in a bucket. -insert into t0 select 1 from seq_1_to_78; - -create table t1(a int); # one-third of a bucket -insert into t1 select 1 from seq_1_to_26; - -create table t10 (a int); -insert into t10 select 0 from t0, seq_1_to_4; - -insert into t10 select 8693 from t1; -insert into t10 select 8694 from t1; -insert into t10 select 8695 from t1; - - -insert into t10 select 34783 from t1; -insert into t10 select 34784 from t1; -insert into t10 select 34785 from t1; - - -insert into t10 select 34785 from t0, seq_1_to_8; - -insert into t10 select 65214 from t1; -insert into t10 select 65215 from t1; -insert into t10 select 65216 from t1; - -insert into t10 select 65216 from t0, seq_1_to_52; - -insert into t10 select 65217 from t1; -insert into t10 select 65218 from t1; -insert into t10 select 65219 from t1; - -insert into t10 select 65219 from t0; - - -insert into t10 select 73913 from t1; -insert into t10 select 73914 from t1; -insert into t10 select 73915 from t1; - -insert into t10 select 73915 from t0, seq_1_to_40; - - -insert into t10 select 78257 from t1; -insert into t10 select 78258 from t1; -insert into t10 select 78259 from t1; - -insert into t10 select 91300 from t1; -insert into t10 select 91301 from t1; -insert into t10 select 91302 from t1; - -insert into t10 select 91302 from t0, seq_1_to_6; - -insert into t10 select 91303 from t1; # Only 1/3rd of bucket matches the search tuple -insert into t10 select 91304 from t1; -insert into t10 select 91305 from t1; - -insert into t10 select 91305 from t0, seq_1_to_8; - -insert into t10 select 99998 from t1; -insert into t10 select 99999 from t1; -insert into t10 select 100000 from t1; - -set use_stat_tables=preferably; -analyze table t10 persistent for all; -flush tables; - -set @tmp=@@optimizer_trace; -set optimizer_trace=1; -explain select * from t10 where a in (91303); - ---echo # Must have selectivity_from_histogram <= 1.0: -select json_detailed(json_extract(trace, '$**.selectivity_for_columns')) -from information_schema.optimizer_trace; - -set optimizer_trace=@tmp; -drop table t0,t1,t10; - set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; set histogram_size=@save_histogram_size; set use_stat_tables= @save_use_stat_tables; diff --git a/mysql-test/main/selectivity_innodb.result b/mysql-test/main/selectivity_innodb.result index dfba12f2b05..13816f8185c 100644 --- a/mysql-test/main/selectivity_innodb.result +++ b/mysql-test/main/selectivity_innodb.result @@ -1947,73 +1947,6 @@ Warnings: Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` = 2 DROP TABLE t1; # End of 10.2 tests -# -# MDEV-31067: selectivity_from_histogram >1.0 for a DOUBLE_PREC_HB histogram -# -create table t0(a int); -insert into t0 select 1 from seq_1_to_78; -create table t1(a int); -insert into t1 select 1 from seq_1_to_26; -create table t10 (a int); -insert into t10 select 0 from t0, seq_1_to_4; -insert into t10 select 8693 from t1; -insert into t10 select 8694 from t1; -insert into t10 select 8695 from t1; -insert into t10 select 34783 from t1; -insert into t10 select 34784 from t1; -insert into t10 select 34785 from t1; -insert into t10 select 34785 from t0, seq_1_to_8; -insert into t10 select 65214 from t1; -insert into t10 select 65215 from t1; -insert into t10 select 65216 from t1; -insert into t10 select 65216 from t0, seq_1_to_52; -insert into t10 select 65217 from t1; -insert into t10 select 65218 from t1; -insert into t10 select 65219 from t1; -insert into t10 select 65219 from t0; -insert into t10 select 73913 from t1; -insert into t10 select 73914 from t1; -insert into t10 select 73915 from t1; -insert into t10 select 73915 from t0, seq_1_to_40; -insert into t10 select 78257 from t1; -insert into t10 select 78258 from t1; -insert into t10 select 78259 from t1; -insert into t10 select 91300 from t1; -insert into t10 select 91301 from t1; -insert into t10 select 91302 from t1; -insert into t10 select 91302 from t0, seq_1_to_6; -insert into t10 select 91303 from t1; -insert into t10 select 91304 from t1; -insert into t10 select 91305 from t1; -insert into t10 select 91305 from t0, seq_1_to_8; -insert into t10 select 99998 from t1; -insert into t10 select 99999 from t1; -insert into t10 select 100000 from t1; -set use_stat_tables=preferably; -analyze table t10 persistent for all; -Table Op Msg_type Msg_text -test.t10 analyze status Engine-independent statistics collected -test.t10 analyze status OK -flush tables; -set statement optimizer_trace=1 for -explain select * from t10 where a in (91303); -id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t10 ALL NULL NULL NULL NULL 9984 Using where -# Must have selectivity_from_histogram <= 1.0: -select json_detailed(json_extract(trace, '$**.selectivity_for_columns')) -from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.selectivity_for_columns')) -[ - [ - { - "column_name": "a", - "ranges": - ["91303 <= a <= 91303"], - "selectivity_from_histogram": 0.035714283 - } - ] -] -drop table t0,t1,t10; set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; set histogram_size=@save_histogram_size; set use_stat_tables= @save_use_stat_tables; diff --git a/mysql-test/main/selectivity_notembedded.result b/mysql-test/main/selectivity_notembedded.result new file mode 100644 index 00000000000..8b298a95801 --- /dev/null +++ b/mysql-test/main/selectivity_notembedded.result @@ -0,0 +1,83 @@ +# +# MDEV-31067: selectivity_from_histogram >1.0 for a DOUBLE_PREC_HB histogram +# +set @save_histogram_size=@@histogram_size; +set @save_histogram_type=@@histogram_type; +set @save_use_stat_tables=@@use_stat_tables; +set @save_optimizer_use_condition_selectivity=@@optimizer_use_condition_selectivity; +SET histogram_size= 255; +set histogram_type='DOUBLE_PREC_HB'; +set use_stat_tables=preferably; +SET optimizer_use_condition_selectivity=3; +create table t0(a int); +insert into t0 select 1 from seq_1_to_78; +create table t1(a int); +insert into t1 select 1 from seq_1_to_26; +create table t10 (a int); +insert into t10 select 0 from t0, seq_1_to_4; +insert into t10 select 8693 from t1; +insert into t10 select 8694 from t1; +insert into t10 select 8695 from t1; +insert into t10 select 34783 from t1; +insert into t10 select 34784 from t1; +insert into t10 select 34785 from t1; +insert into t10 select 34785 from t0, seq_1_to_8; +insert into t10 select 65214 from t1; +insert into t10 select 65215 from t1; +insert into t10 select 65216 from t1; +insert into t10 select 65216 from t0, seq_1_to_52; +insert into t10 select 65217 from t1; +insert into t10 select 65218 from t1; +insert into t10 select 65219 from t1; +insert into t10 select 65219 from t0; +insert into t10 select 73913 from t1; +insert into t10 select 73914 from t1; +insert into t10 select 73915 from t1; +insert into t10 select 73915 from t0, seq_1_to_40; +insert into t10 select 78257 from t1; +insert into t10 select 78258 from t1; +insert into t10 select 78259 from t1; +insert into t10 select 91300 from t1; +insert into t10 select 91301 from t1; +insert into t10 select 91302 from t1; +insert into t10 select 91302 from t0, seq_1_to_6; +insert into t10 select 91303 from t1; +insert into t10 select 91304 from t1; +insert into t10 select 91305 from t1; +insert into t10 select 91305 from t0, seq_1_to_8; +insert into t10 select 99998 from t1; +insert into t10 select 99999 from t1; +insert into t10 select 100000 from t1; +analyze table t10 persistent for all; +Table Op Msg_type Msg_text +test.t10 analyze status Engine-independent statistics collected +test.t10 analyze status OK +flush tables; +set @tmp=@@optimizer_trace; +set optimizer_trace=1; +explain select * from t10 where a in (91303); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t10 ALL NULL NULL NULL NULL 9984 Using where +# Must have selectivity_from_histogram <= 1.0: +select json_detailed(json_extract(trace, '$**.selectivity_for_columns')) +from information_schema.optimizer_trace; +json_detailed(json_extract(trace, '$**.selectivity_for_columns')) +[ + [ + { + "column_name": "a", + "ranges": + ["91303 <= a <= 91303"], + "selectivity_from_histogram": 0.0357 + } + ] +] +drop table t0,t1,t10; +set optimizer_trace=@tmp; +set @@histogram_size=@save_histogram_size; +set @histogram_type=@save_histogram_type; +set @use_stat_tables=@save_use_stat_tables; +set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/selectivity_notembedded.test b/mysql-test/main/selectivity_notembedded.test new file mode 100644 index 00000000000..f79c370186f --- /dev/null +++ b/mysql-test/main/selectivity_notembedded.test @@ -0,0 +1,102 @@ +--source include/have_stat_tables.inc +--source include/have_sequence.inc +--source include/not_embedded.inc + +--echo # +--echo # MDEV-31067: selectivity_from_histogram >1.0 for a DOUBLE_PREC_HB histogram +--echo # + +set @save_histogram_size=@@histogram_size; +set @save_histogram_type=@@histogram_type; +set @save_use_stat_tables=@@use_stat_tables; +set @save_optimizer_use_condition_selectivity=@@optimizer_use_condition_selectivity; + +SET histogram_size= 255; +set histogram_type='DOUBLE_PREC_HB'; +set use_stat_tables=preferably; +SET optimizer_use_condition_selectivity=3; + +create table t0(a int); # This holds how many rows we hold in a bucket. +insert into t0 select 1 from seq_1_to_78; + +create table t1(a int); # one-third of a bucket +insert into t1 select 1 from seq_1_to_26; + +create table t10 (a int); +insert into t10 select 0 from t0, seq_1_to_4; + +insert into t10 select 8693 from t1; +insert into t10 select 8694 from t1; +insert into t10 select 8695 from t1; + + +insert into t10 select 34783 from t1; +insert into t10 select 34784 from t1; +insert into t10 select 34785 from t1; + + +insert into t10 select 34785 from t0, seq_1_to_8; + +insert into t10 select 65214 from t1; +insert into t10 select 65215 from t1; +insert into t10 select 65216 from t1; + +insert into t10 select 65216 from t0, seq_1_to_52; + +insert into t10 select 65217 from t1; +insert into t10 select 65218 from t1; +insert into t10 select 65219 from t1; + +insert into t10 select 65219 from t0; + + +insert into t10 select 73913 from t1; +insert into t10 select 73914 from t1; +insert into t10 select 73915 from t1; + +insert into t10 select 73915 from t0, seq_1_to_40; + + +insert into t10 select 78257 from t1; +insert into t10 select 78258 from t1; +insert into t10 select 78259 from t1; + +insert into t10 select 91300 from t1; +insert into t10 select 91301 from t1; +insert into t10 select 91302 from t1; + +insert into t10 select 91302 from t0, seq_1_to_6; + +insert into t10 select 91303 from t1; # Only 1/3rd of bucket matches the search tuple +insert into t10 select 91304 from t1; +insert into t10 select 91305 from t1; + +insert into t10 select 91305 from t0, seq_1_to_8; + +insert into t10 select 99998 from t1; +insert into t10 select 99999 from t1; +insert into t10 select 100000 from t1; + +analyze table t10 persistent for all; +flush tables; + +set @tmp=@@optimizer_trace; +set optimizer_trace=1; +explain select * from t10 where a in (91303); + +--echo # Must have selectivity_from_histogram <= 1.0: +--replace_result 0.035714283 0.0357 +select json_detailed(json_extract(trace, '$**.selectivity_for_columns')) +from information_schema.optimizer_trace; + +drop table t0,t1,t10; + +set optimizer_trace=@tmp; +set @@histogram_size=@save_histogram_size; +set @histogram_type=@save_histogram_type; +set @use_stat_tables=@save_use_stat_tables; +set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/suite/maria/encrypt-no-key.test b/mysql-test/suite/maria/encrypt-no-key.test index b3f2f4b4bf3..89c50d79a54 100644 --- a/mysql-test/suite/maria/encrypt-no-key.test +++ b/mysql-test/suite/maria/encrypt-no-key.test @@ -1,3 +1,4 @@ +--source include/not_embedded.inc # # MDEV-18496 Crash when Aria encryption is enabled but plugin not available # From a09f661f4392fc9574a5239972243eebc65fe7f2 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Mon, 8 May 2023 11:42:24 -0700 Subject: [PATCH 012/171] MDEV-31181 Crash with EXPLAIN EXTENDED for single-table DELETE using IN predicand This bug affected EXPLAIN EXTENDED command for single-table DELETE that used an IN subquery in its WHERE clause. A crash happened if the optimizer chose to employ index_subquery or unique_subquery access when processing such command. The crash happened when the command tried to print the transformed query. In the current code of 10.4 for single-table DELETE statements the output of any explain command is produced after the join structures of all used subqueries have been destroyed. JOIN::destroy() sets the field tab of the JOIN_TAB structures created for subquery tables to NULL. As a result subselect_indexsubquery_engine::print(), subselect_indexsubquery_engine() cannot use this field to get the alias name of the joined table. This patch suggests to use the field TABLE_LIST::TAB that can be accessed from JOIN_TAB::tab_list to get the alias name of the joined table. Approved by Oleksandr Byelkin --- mysql-test/main/explain_non_select.result | 32 +++++++++++++++++++++++ mysql-test/main/explain_non_select.test | 28 ++++++++++++++++++++ sql/item_subselect.cc | 18 ++++++++----- sql/opt_subselect.cc | 1 + 4 files changed, 72 insertions(+), 7 deletions(-) diff --git a/mysql-test/main/explain_non_select.result b/mysql-test/main/explain_non_select.result index d60f10f85c8..d7ed3992572 100644 --- a/mysql-test/main/explain_non_select.result +++ b/mysql-test/main/explain_non_select.result @@ -277,3 +277,35 @@ EXECUTE stmt; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 ALL NULL NULL NULL NULL 2 drop table t1,t2; +# +# MDEV-31181: EXPLAIN EXTENDED for single-table DELETE with IN predicand +# +create table t1 (a int); +insert into t1 values (3), (7), (1), (3), (4); +create table t2 (pk int primary key); +insert into t2 values (3), (5), (1); +create table t3 (a int, key(a)); +insert into t3 values (7), (5), (7), (3); +explain extended delete from t1 where a in (select pk from t2); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 5 100.00 Using where +2 DEPENDENT SUBQUERY t2 unique_subquery PRIMARY PRIMARY 4 func 1 100.00 Using index +Warnings: +Note 1003 /* select#1 */ delete from `test`.`t1` where (`test`.`t1`.`a`,(((`test`.`t1`.`a`) in t2 on PRIMARY))) +delete from t1 where a in (select pk from t2); +select * from t1; +a +7 +4 +explain extended delete from t1 where a in (select a from t3); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00 Using where +2 DEPENDENT SUBQUERY t3 index_subquery a a 5 func 2 100.00 Using index +Warnings: +Note 1003 /* select#1 */ delete from `test`.`t1` where (`test`.`t1`.`a`,(((`test`.`t1`.`a`) in t3 on a))) +delete from t1 where a in (select a from t3); +select * from t1; +a +4 +drop table t1,t2,t3; +# End of 10.4 tests diff --git a/mysql-test/main/explain_non_select.test b/mysql-test/main/explain_non_select.test index d9ff0fb7245..c0c543ad273 100644 --- a/mysql-test/main/explain_non_select.test +++ b/mysql-test/main/explain_non_select.test @@ -250,3 +250,31 @@ PREPARE stmt FROM 'EXPLAIN INSERT INTO t1 SELECT * FROM t2'; EXECUTE stmt; drop table t1,t2; +--echo # +--echo # MDEV-31181: EXPLAIN EXTENDED for single-table DELETE with IN predicand +--echo # + +create table t1 (a int); +insert into t1 values (3), (7), (1), (3), (4); +create table t2 (pk int primary key); +insert into t2 values (3), (5), (1); +create table t3 (a int, key(a)); +insert into t3 values (7), (5), (7), (3); + +let $q1= +delete from t1 where a in (select pk from t2); + +eval explain extended $q1; +eval $q1; +select * from t1; + +let $q2= +delete from t1 where a in (select a from t3); + +eval explain extended $q2; +eval $q2; +select * from t1; + +drop table t1,t2,t3; + +--echo # End of 10.4 tests diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index f88e1e7e101..ae0ab27ec31 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -4536,10 +4536,11 @@ void subselect_union_engine::print(String *str, enum_query_type query_type) void subselect_uniquesubquery_engine::print(String *str, enum_query_type query_type) { + TABLE *table= tab->tab_list ? tab->tab_list->table : tab->table; str->append(STRING_WITH_LEN("(")); tab->ref.items[0]->print(str, query_type); str->append(STRING_WITH_LEN(" in ")); - if (tab->table->s->table_category == TABLE_CATEGORY_TEMPORARY) + if (table->s->table_category == TABLE_CATEGORY_TEMPORARY) { /* Temporary tables' names change across runs, so they can't be used for @@ -4548,8 +4549,8 @@ void subselect_uniquesubquery_engine::print(String *str, str->append(STRING_WITH_LEN("")); } else - str->append(&tab->table->s->table_name); - KEY *key_info= tab->table->key_info+ tab->ref.key; + str->append(&table->s->table_name); + KEY *key_info= table->key_info+ tab->ref.key; str->append(STRING_WITH_LEN(" on ")); str->append(&key_info->name); if (cond) @@ -4567,12 +4568,13 @@ all other tests pass. void subselect_uniquesubquery_engine::print(String *str) { - KEY *key_info= tab->table->key_info + tab->ref.key; + TABLE *table= tab->tab_list ? tab->tab_list->table : tab->table; + KEY *key_info= table->key_info + tab->ref.key; str->append(STRING_WITH_LEN("(")); for (uint i= 0; i < key_info->user_defined_key_parts; i++) tab->ref.items[i]->print(str); str->append(STRING_WITH_LEN(" in ")); - str->append(&tab->table->s->table_name); + str->append(&table->s->table_name); str->append(STRING_WITH_LEN(" on ")); str->append(&key_info->name); if (cond) @@ -4587,11 +4589,12 @@ void subselect_uniquesubquery_engine::print(String *str) void subselect_indexsubquery_engine::print(String *str, enum_query_type query_type) { + TABLE *table= tab->tab_list ? tab->tab_list->table : tab->table; str->append(STRING_WITH_LEN("(")); tab->ref.items[0]->print(str, query_type); str->append(STRING_WITH_LEN(" in ")); - str->append(tab->table->s->table_name.str, tab->table->s->table_name.length); - KEY *key_info= tab->table->key_info+ tab->ref.key; + str->append(&table->s->table_name); + KEY *key_info= table->key_info+ tab->ref.key; str->append(STRING_WITH_LEN(" on ")); str->append(&key_info->name); if (check_null) @@ -5271,6 +5274,7 @@ subselect_hash_sj_engine::make_unique_engine() DBUG_RETURN(NULL); tab->table= tmp_table; + tab->tab_list= 0; tab->preread_init_done= FALSE; tab->ref.tmp_table_index_lookup_init(thd, tmp_key, it, FALSE); diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 1c03b0bb4a3..db7a4c0fc14 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -4128,6 +4128,7 @@ bool setup_sj_materialization_part1(JOIN_TAB *sjm_tab) sjm->materialized= FALSE; sjm_tab->table= sjm->table; + sjm_tab->tab_list= emb_sj_nest; sjm->table->pos_in_table_list= emb_sj_nest; DBUG_RETURN(FALSE); From 6544d88ff5a7b2ec66153933a3a0531b9091c357 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Tue, 9 May 2023 21:20:10 -0700 Subject: [PATCH 013/171] MDEV-31224 Crash with EXPLAIN EXTENDED for multi-table update of system table EXPLAIN EXTENDED should always print the field item used in the left part of an equality expression from the SET clause of an update statement as a reference to table column. Approved by Oleksandr Byelkin --- mysql-test/main/explain_non_select.result | 18 ++++++++++++++++++ mysql-test/main/explain_non_select.test | 19 +++++++++++++++++++ .../main/myisam_explain_non_select_all.result | 4 ++-- sql/sql_select.cc | 2 +- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/mysql-test/main/explain_non_select.result b/mysql-test/main/explain_non_select.result index d7ed3992572..009a568e2c2 100644 --- a/mysql-test/main/explain_non_select.result +++ b/mysql-test/main/explain_non_select.result @@ -308,4 +308,22 @@ select * from t1; a 4 drop table t1,t2,t3; +# +# MDEV-31224: EXPLAIN EXTENDED for multi-table update of system table +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (3); +EXPLAIN EXTENDED UPDATE t1, t2 SET b = 4 WHERE a IN (6,2); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t2 system NULL NULL NULL NULL 1 100.00 +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 update `test`.`t1` set `test`.`t2`.`b` = 4 where `test`.`t1`.`a` in (6,2) +UPDATE t1, t2 SET b = 4 WHERE a IN (6,2); +SELECT * from t2; +b +4 +DROP TABLE t1, t2; # End of 10.4 tests diff --git a/mysql-test/main/explain_non_select.test b/mysql-test/main/explain_non_select.test index c0c543ad273..e861955b3f1 100644 --- a/mysql-test/main/explain_non_select.test +++ b/mysql-test/main/explain_non_select.test @@ -277,4 +277,23 @@ select * from t1; drop table t1,t2,t3; +--echo # +--echo # MDEV-31224: EXPLAIN EXTENDED for multi-table update of system table +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (b INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (3); + +let $q= +UPDATE t1, t2 SET b = 4 WHERE a IN (6,2); + +eval EXPLAIN EXTENDED $q; +eval $q; +SELECT * from t2; + +DROP TABLE t1, t2; + --echo # End of 10.4 tests diff --git a/mysql-test/main/myisam_explain_non_select_all.result b/mysql-test/main/myisam_explain_non_select_all.result index 3ca9629d027..b515cb4fd83 100644 --- a/mysql-test/main/myisam_explain_non_select_all.result +++ b/mysql-test/main/myisam_explain_non_select_all.result @@ -2689,7 +2689,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t2 system NULL NULL NULL NULL 0 0.00 Const row not found 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Warnings: -Note 1003 update `test`.`t1` set NULL = 10 +Note 1003 update `test`.`t1` set `test`.`t2`.`c2` = 10 # Status of EXPLAIN EXTENDED query Variable_name Value Handler_read_key 7 @@ -2734,7 +2734,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t2 system NULL NULL NULL NULL 0 0.00 Const row not found 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 update `test`.`t1` set NULL = 10 where `test`.`t1`.`c3` = 10 +Note 1003 update `test`.`t1` set `test`.`t2`.`c2` = 10 where `test`.`t1`.`c3` = 10 # Status of EXPLAIN EXTENDED query Variable_name Value Handler_read_key 7 diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 2be1fea9b03..a5d6ca05a1e 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -28169,7 +28169,7 @@ void st_select_lex::print_set_clause(THD *thd, String *str, else str->append(','); - item->print(str, query_type); + item->print(str, (enum_query_type) (query_type | QT_NO_DATA_EXPANSION)); str->append(STRING_WITH_LEN(" = ")); val->print(str, query_type); } From 8c6e314ba98cf2026d00aad764e1b9aa3c87ace2 Mon Sep 17 00:00:00 2001 From: Daniel Bartholomew Date: Wed, 10 May 2023 08:11:15 -0400 Subject: [PATCH 014/171] bump the VERSION --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2abc1c05da3..91b253ca00c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=4 -MYSQL_VERSION_PATCH=29 +MYSQL_VERSION_PATCH=30 SERVER_MATURITY=stable From 7e7e12e747a8284efea697518940f6a647ff915c Mon Sep 17 00:00:00 2001 From: Oleg Smirnov Date: Mon, 24 Apr 2023 18:38:42 +0700 Subject: [PATCH 015/171] MDEV-30765 SHOW TABLES not working properly with lower_case_table_names=2 lower_case_table_names=2 means "table names and database names are stored as declared, but they are compared in lowercase". But names of objects in grants are stored in lowercase for any value of lower_case_table_names. This caused an error when checking grants for objects containing uppercase letters since table_hash_search() didn't take into account lower_case_table_names value --- mysql-test/main/lowercase_table2.opt | 1 + mysql-test/main/lowercase_table2.result | 36 ++++++++++++++++++++----- mysql-test/main/lowercase_table2.test | 26 ++++++++++++++++++ sql/sql_acl.cc | 2 +- 4 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 mysql-test/main/lowercase_table2.opt diff --git a/mysql-test/main/lowercase_table2.opt b/mysql-test/main/lowercase_table2.opt new file mode 100644 index 00000000000..ac4d3211e89 --- /dev/null +++ b/mysql-test/main/lowercase_table2.opt @@ -0,0 +1 @@ +--lower-case-table-names=2 diff --git a/mysql-test/main/lowercase_table2.result b/mysql-test/main/lowercase_table2.result index 9194638a4d2..fe06fb671a2 100644 --- a/mysql-test/main/lowercase_table2.result +++ b/mysql-test/main/lowercase_table2.result @@ -14,7 +14,7 @@ SHOW CREATE TABLE T1; Table Create Table T1 CREATE TABLE `T1` ( `a` int(11) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci RENAME TABLE T1 TO T2; SHOW TABLES LIKE "T2"; Tables_in_test (T2) @@ -70,7 +70,7 @@ SHOW CREATE TABLE T1; Table Create Table T1 CREATE TABLE `T1` ( `a` int(11) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci RENAME TABLE T1 TO T2; SHOW TABLES LIKE "T2"; Tables_in_test (T2) @@ -319,18 +319,42 @@ Database (mysql_t%) mysql_TEST show create database mysql_test; Database Create Database -mysql_test CREATE DATABASE `mysql_test` /*!40100 DEFAULT CHARACTER SET latin1 */ +mysql_test CREATE DATABASE `mysql_test` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */ show create database mysql_TEST; Database Create Database -mysql_TEST CREATE DATABASE `mysql_TEST` /*!40100 DEFAULT CHARACTER SET latin1 */ +mysql_TEST CREATE DATABASE `mysql_TEST` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */ show create table mysql_TEST.T1; Table Create Table T1 CREATE TABLE `T1` ( `a` int(11) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci show create table mysql_test.t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop database mysql_TEST; +# MDEV-30765 SHOW TABLES not working properly with +# lower_case_table_names=2 +# +create database db1; +use db1; +# lowercase table name +create table `a` (a int); +# uppercase table name +create table `B` (a int); +create user 'mysqltest_1'@'localhost' identified by 'password'; +grant select, show view on db1.`a` to 'mysqltest_1'@'localhost'; +grant select, show view on db1.`B` to 'mysqltest_1'@'localhost'; +connect conn1, localhost, mysqltest_1, password, test; +connection conn1; +use db1; +show tables; +Tables_in_db1 +B +a +connection default; +disconnect conn1; +drop user 'mysqltest_1'@'localhost'; +drop tables a, B; +drop database db1; diff --git a/mysql-test/main/lowercase_table2.test b/mysql-test/main/lowercase_table2.test index 601089ca760..82c07bf9345 100644 --- a/mysql-test/main/lowercase_table2.test +++ b/mysql-test/main/lowercase_table2.test @@ -288,3 +288,29 @@ show create database mysql_TEST; show create table mysql_TEST.T1; show create table mysql_test.t1; drop database mysql_TEST; + +--echo # MDEV-30765 SHOW TABLES not working properly with +--echo # lower_case_table_names=2 +--echo # +create database db1; +use db1; +--echo # lowercase table name +create table `a` (a int); +--echo # uppercase table name +create table `B` (a int); + +create user 'mysqltest_1'@'localhost' identified by 'password'; + +grant select, show view on db1.`a` to 'mysqltest_1'@'localhost'; +grant select, show view on db1.`B` to 'mysqltest_1'@'localhost'; + +connect (conn1, localhost, mysqltest_1, password, test); +connection conn1; +use db1; +show tables; + +connection default; +disconnect conn1; +drop user 'mysqltest_1'@'localhost'; +drop tables a, B; +drop database db1; \ No newline at end of file diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 4bb16e3248d..c764d2fe2f7 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -5462,7 +5462,7 @@ table_hash_search(const char *host, const char *ip, const char *db, const char *user, const char *tname, bool exact) { return (GRANT_TABLE*) name_hash_search(&column_priv_hash, host, ip, db, - user, tname, exact, FALSE); + user, tname, exact, (lower_case_table_names > 0)); } static bool column_priv_insert(GRANT_TABLE *grant) From 28eaf66e18fbb2fc15c20c14f835c7c276c35cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 10 May 2023 08:42:37 +0300 Subject: [PATCH 016/171] MDEV-30388 : Assertion `!wsrep_has_changes(thd) || (thd->lex->sql_command == SQLCOM_CREATE_TABLE && !thd->is_current_stmt_binlog_format_row()) || thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted' failed Problem for Galera is the fact that sequences are not really transactional. Sequence operation is committed immediately in sql_sequence.cd and later Galera could find out that we have changes but actual statement is not there anymore. Therefore, we must make some restrictions what kind of sequences Galera can support. (1) Galera cluster supports only sequences implemented by InnoDB storage engine. This is because Galera replication supports currently only InnoDB. (2) We do not allow LOCK TABLE on sequence object and we do not allow sequence creation under LOCK TABLE, instead lock is released and we issue warning. (3) We allow sequences with NOCACHE definition or with INCREMEMENT BY 0 CACHE=n definition. This makes sure that sequence values are unique accross Galera cluster. Signed-off-by: Julius Goryavsky --- mysql-test/suite/galera/r/MDEV-18832.result | 7 +- mysql-test/suite/galera/r/MDEV-27862.result | 5 - .../suite/galera/r/galera_sequences.result | 186 +++++++++++++- mysql-test/suite/galera/t/MDEV-18832.test | 12 +- mysql-test/suite/galera/t/MDEV-27862.test | 11 - .../suite/galera/t/galera_sequences.cnf | 4 + .../suite/galera/t/galera_sequences.test | 236 +++++++++++++++++- sql/sql_parse.cc | 10 + sql/sql_sequence.cc | 28 +-- sql/sql_table.cc | 63 +++++ sql/sql_table.h | 4 + sql/wsrep_mysqld.cc | 13 +- sql/wsrep_trans_observer.h | 11 +- 13 files changed, 516 insertions(+), 74 deletions(-) diff --git a/mysql-test/suite/galera/r/MDEV-18832.result b/mysql-test/suite/galera/r/MDEV-18832.result index 2e0872b9f2e..676ee4bf337 100644 --- a/mysql-test/suite/galera/r/MDEV-18832.result +++ b/mysql-test/suite/galera/r/MDEV-18832.result @@ -1,17 +1,14 @@ connection node_2; connection node_1; -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; CREATE TABLE t1 (Id int(11) NOT NULL, PRIMARY KEY (Id)); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); DROP SEQUENCE Seq1_1; -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); ERROR 23000: Duplicate entry '1' for key 'PRIMARY' DROP SEQUENCE Seq1_1; DROP TABLE t1; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -connection node_2; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); diff --git a/mysql-test/suite/galera/r/MDEV-27862.result b/mysql-test/suite/galera/r/MDEV-27862.result index 25b7bc6cfd2..d1aa9e2ca91 100644 --- a/mysql-test/suite/galera/r/MDEV-27862.result +++ b/mysql-test/suite/galera/r/MDEV-27862.result @@ -1,10 +1,5 @@ connection node_2; connection node_1; -CREATE SEQUENCE seq_nocache ENGINE=InnoDB; -DROP SEQUENCE seq_nocache; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -connection node_2; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); connection node_1; CREATE SEQUENCE seq NOCACHE ENGINE=InnoDB; SELECT NEXTVAL(seq) = 1; diff --git a/mysql-test/suite/galera/r/galera_sequences.result b/mysql-test/suite/galera/r/galera_sequences.result index da669e6774e..ec3adec8924 100644 --- a/mysql-test/suite/galera/r/galera_sequences.result +++ b/mysql-test/suite/galera/r/galera_sequences.result @@ -1,11 +1,6 @@ connection node_2; connection node_1; connection node_1; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -CALL mtr.add_suppression("WSREP: CREATE TABLE isolation failure"); -connection node_2; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -connection node_1; CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 1000000 increment by 0 cache 1000 nocycle ENGINE=InnoDB; SHOW CREATE SEQUENCE seq; Table Create Table @@ -15,14 +10,14 @@ SHOW CREATE SEQUENCE seq; Table Create Table seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 1000000 increment by 0 cache 1000 nocycle ENGINE=InnoDB connection node_1; -ALTER SEQUENCE seq MAXVALUE = 10000; +ALTER SEQUENCE seq MAXVALUE = 10000 NOCACHE; SHOW CREATE SEQUENCE seq; Table Create Table -seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 10000 increment by 0 cache 1000 nocycle ENGINE=InnoDB +seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 10000 increment by 0 nocache nocycle ENGINE=InnoDB connection node_2; SHOW CREATE SEQUENCE seq; Table Create Table -seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 10000 increment by 0 cache 1000 nocycle ENGINE=InnoDB +seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 10000 increment by 0 nocache nocycle ENGINE=InnoDB connection node_1; DROP SEQUENCE seq; SHOW CREATE SEQUENCE seq; @@ -31,25 +26,26 @@ connection node_2; SHOW CREATE SEQUENCE seq; ERROR 42S02: Table 'test.seq' doesn't exist connection node_1; -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; select NEXT VALUE FOR Seq1_1; NEXT VALUE FOR Seq1_1 1 alter table Seq1_1 engine=myisam; +ERROR 42000: This version of MariaDB doesn't yet support 'Galera cluster does support only InnoDB sequences' select NEXT VALUE FOR Seq1_1; NEXT VALUE FOR Seq1_1 -1001 +2 alter table Seq1_1 engine=innodb; select NEXT VALUE FOR Seq1_1; NEXT VALUE FOR Seq1_1 -2001 +3 connection node_2; SHOW CREATE SEQUENCE Seq1_1; Table Create Table -Seq1_1 CREATE SEQUENCE `Seq1_1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB +Seq1_1 CREATE SEQUENCE `Seq1_1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 nocache nocycle ENGINE=InnoDB select NEXT VALUE FOR Seq1_1; NEXT VALUE FOR Seq1_1 -3001 +4 connection node_1; DROP SEQUENCE Seq1_1; connection node_1; @@ -107,3 +103,167 @@ DROP TABLE t1; DROP SEQUENCE sq1; DROP SEQUENCE sq2; SET SESSION wsrep_OSU_method='TOI'; +CREATE TABLE t (f INT) engine=innodb; +LOCK TABLE t WRITE; +CREATE OR REPLACE SEQUENCE t MAXVALUE=13 INCREMENT BY 1 NOCACHE engine=innodb; +Warnings: +Warning 138 Galera cluster does not support LOCK TABLE on SEQUENCES. Lock is released. +LOCK TABLE t WRITE; +ERROR 42000: This version of MariaDB doesn't yet support 'LOCK TABLE on SEQUENCES in Galera cluster' +INSERT INTO t VALUES (0,0,1,1,1,0,0,0); +SELECT * from t; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +0 0 1 1 1 0 0 0 +SELECT NEXTVAL(t); +NEXTVAL(t) +0 +UNLOCK TABLES; +DROP TABLE t; +CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), +b int) engine=innodb; +INSERT INTO t1(b) VALUES (1),(2),(3); +SELECT * FROM t1; +a b +1 1 +3 2 +5 3 +connection node_2; +SELECT * FROM t1; +a b +1 1 +3 2 +5 3 +INSERT INTO t1(b) VALUES (4),(5),(6); +SELECT * FROM t1; +a b +1 1 +3 2 +5 3 +8 4 +10 5 +12 6 +connection node_1; +SELECT * FROM t1; +a b +1 1 +3 2 +5 3 +8 4 +10 5 +12 6 +DROP TABLE t1; +DROP SEQUENCE t; +CREATE SEQUENCE t ENGINE=MYISAM; +ERROR 42000: This version of MariaDB doesn't yet support 'Galera cluster does support only InnoDB sequences' +CREATE SEQUENCE t INCREMENT BY 1 NOCACHE ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +connection node_2; +# Wait DDL to replicate +connection node_1; +SELECT @@auto_increment_increment; +@@auto_increment_increment +2 +SELECT @@auto_increment_offset; +@@auto_increment_offset +1 +SET SESSION wsrep_sync_wait=0; +connection node_2; +SELECT @@auto_increment_increment; +@@auto_increment_increment +2 +SELECT @@auto_increment_offset; +@@auto_increment_offset +2 +SET SESSION wsrep_sync_wait=0; +connection node_1; +connection node_2; +connection node_1; +DROP SEQUENCE t; +DROP TABLE t1; +CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB; +DROP SEQUENCE t; +CREATE SEQUENCE t INCREMENT BY 1 CACHE=20 ENGINE=INNODB; +ERROR 42000: This version of MariaDB doesn't yet support 'In Galera if you use CACHE you should set INCREMENT BY 0 to behave correctly in a cluster' +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +connection node_2; +# Wait DDL to replicate +connection node_1; +SET SESSION wsrep_sync_wait=0; +connection node_2; +SET SESSION wsrep_sync_wait=0; +connection node_1; +connection node_2; +connection node_1; +DROP SEQUENCE t; +DROP TABLE t1; +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +ALTER TABLE t ENGINE=MYISAM; +ERROR 42000: This version of MariaDB doesn't yet support 'Galera cluster does support only InnoDB sequences' +ALTER SEQUENCE t INCREMENT BY 1 CACHE=10; +ERROR 42000: This version of MariaDB doesn't yet support 'In Galera if you use CACHE you should set INCREMENT BY 0 to behave correctly in a cluster' +ALTER SEQUENCE t INCREMENT BY 1 NOCACHE; +ALTER SEQUENCE t INCREMENT BY 0 NOCACHE; +ALTER SEQUENCE t INCREMENT BY 0 CACHE=10; +DROP SEQUENCE t; +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +BEGIN; +INSERT INTO t1(b) VALUES (1); +INSERT INTO t1(b) VALUES (2); +INSERT INTO t1(b) VALUES (3); +INSERT INTO t1(b) VALUES (4); +INSERT INTO t1(a,b) VALUES (2,2); +INSERT INTO t1(a,b) VALUES (3,2); +ERROR 23000: Duplicate entry '3' for key 'PRIMARY' +ROLLBACK; +SELECT * FROM t1; +a b +SELECT NEXTVAL(t); +NEXTVAL(t) +9 +connection node_2; +SELECT * FROM t1; +a b +SELECT NEXTVAL(t); +NEXTVAL(t) +2 +connection node_1; +DROP TABLE t1; +DROP SEQUENCE t; +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +BEGIN; +INSERT INTO t1(b) VALUES (1); +INSERT INTO t1(b) VALUES (2); +INSERT INTO t1(b) VALUES (3); +INSERT INTO t1(b) VALUES (4); +INSERT INTO t1(a,b) VALUES (2,2); +INSERT INTO t1(a,b) VALUES (3,2); +ERROR 23000: Duplicate entry '3' for key 'PRIMARY' +COMMIT; +SELECT * FROM t1; +a b +1 1 +2 2 +3 2 +5 3 +7 4 +SELECT NEXTVAL(t); +NEXTVAL(t) +9 +connection node_2; +SELECT * FROM t1; +a b +1 1 +2 2 +3 2 +5 3 +7 4 +SELECT NEXTVAL(t); +NEXTVAL(t) +42 +connection node_1; +DROP TABLE t1; +DROP SEQUENCE t; diff --git a/mysql-test/suite/galera/t/MDEV-18832.test b/mysql-test/suite/galera/t/MDEV-18832.test index ba93761435a..d60be151142 100644 --- a/mysql-test/suite/galera/t/MDEV-18832.test +++ b/mysql-test/suite/galera/t/MDEV-18832.test @@ -1,23 +1,15 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; CREATE TABLE t1 (Id int(11) NOT NULL, PRIMARY KEY (Id)); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); DROP SEQUENCE Seq1_1; -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; --error ER_DUP_ENTRY INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); DROP SEQUENCE Seq1_1; DROP TABLE t1; - -# Supress warning for SEQUENCES that are declared without `NOCACHE` introduced with MDEV-27862 - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); - ---connection node_2 - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); diff --git a/mysql-test/suite/galera/t/MDEV-27862.test b/mysql-test/suite/galera/t/MDEV-27862.test index 89d3465b91f..d23ce95d47e 100644 --- a/mysql-test/suite/galera/t/MDEV-27862.test +++ b/mysql-test/suite/galera/t/MDEV-27862.test @@ -1,17 +1,6 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -# Report WARNING when SEQUENCE is created without `NOCACHE` - -CREATE SEQUENCE seq_nocache ENGINE=InnoDB; -DROP SEQUENCE seq_nocache; - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); - ---connection node_2 - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); - # NEXTVAL --connection node_1 diff --git a/mysql-test/suite/galera/t/galera_sequences.cnf b/mysql-test/suite/galera/t/galera_sequences.cnf index 98e724fb2d0..3a0543e3d34 100644 --- a/mysql-test/suite/galera/t/galera_sequences.cnf +++ b/mysql-test/suite/galera/t/galera_sequences.cnf @@ -3,7 +3,11 @@ [mysqld.1] log-bin log-slave-updates +auto-increment-increment=2 +auto-increment-offset=1 [mysqld.2] log-bin log-slave-updates +auto-increment-increment=2 +auto-increment-offset=2 diff --git a/mysql-test/suite/galera/t/galera_sequences.test b/mysql-test/suite/galera/t/galera_sequences.test index 613823d83e9..2582c204435 100644 --- a/mysql-test/suite/galera/t/galera_sequences.test +++ b/mysql-test/suite/galera/t/galera_sequences.test @@ -5,13 +5,6 @@ # MDEV-19353 : Alter Sequence do not replicate to another nodes with in Galera Cluster # ---connection node_1 -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -CALL mtr.add_suppression("WSREP: CREATE TABLE isolation failure"); ---connection node_2 - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); - --connection node_1 CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 1000000 increment by 0 cache 1000 nocycle ENGINE=InnoDB; SHOW CREATE SEQUENCE seq; @@ -20,7 +13,7 @@ SHOW CREATE SEQUENCE seq; SHOW CREATE SEQUENCE seq; --connection node_1 -ALTER SEQUENCE seq MAXVALUE = 10000; +ALTER SEQUENCE seq MAXVALUE = 10000 NOCACHE; SHOW CREATE SEQUENCE seq; --connection node_2 @@ -39,8 +32,9 @@ SHOW CREATE SEQUENCE seq; # MDEV-18848 : Galera: 10.4 node crashed with Assertion `client_state.transaction().active()` after altering SEQUENCE table's engine to myisam and back to innodb # --connection node_1 -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; select NEXT VALUE FOR Seq1_1; +--error ER_NOT_SUPPORTED_YET alter table Seq1_1 engine=myisam; select NEXT VALUE FOR Seq1_1; alter table Seq1_1 engine=innodb; @@ -98,3 +92,227 @@ DROP TABLE t1; DROP SEQUENCE sq1; DROP SEQUENCE sq2; SET SESSION wsrep_OSU_method='TOI'; + +# +# MDEV-30388 Assertion `!wsrep_has_changes(thd) || (thd->lex->sql_command == SQLCOM_CREATE_TABLE +# && !thd->is_current_stmt_binlog_format_row()) || +# thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted' failed +# + +CREATE TABLE t (f INT) engine=innodb; +LOCK TABLE t WRITE; +CREATE OR REPLACE SEQUENCE t MAXVALUE=13 INCREMENT BY 1 NOCACHE engine=innodb; +--error ER_NOT_SUPPORTED_YET +LOCK TABLE t WRITE; +INSERT INTO t VALUES (0,0,1,1,1,0,0,0); +SELECT * from t; +SELECT NEXTVAL(t); +UNLOCK TABLES; +DROP TABLE t; + +CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), +b int) engine=innodb; +INSERT INTO t1(b) VALUES (1),(2),(3); +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; +INSERT INTO t1(b) VALUES (4),(5),(6); +SELECT * FROM t1; + +--connection node_1 +SELECT * FROM t1; +DROP TABLE t1; +DROP SEQUENCE t; + +# +# Test Galera SEQUENCE support +# +# +# No MyISAM SEQUENCES +# +--error ER_NOT_SUPPORTED_YET +CREATE SEQUENCE t ENGINE=MYISAM; +CREATE SEQUENCE t INCREMENT BY 1 NOCACHE ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; + +--connection node_2 +--echo # Wait DDL to replicate +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +# +# Below we do not care order of INSERTs we care only that values are unique +# +--connection node_1 +SELECT @@auto_increment_increment; +SELECT @@auto_increment_offset; +--let $wsrep_sync_wait_orig_1 = `SELECT @@wsrep_sync_wait` +SET SESSION wsrep_sync_wait=0; + +--connection node_2 +SELECT @@auto_increment_increment; +SELECT @@auto_increment_offset; +--let $wsrep_sync_wait_orig_2 = `SELECT @@wsrep_sync_wait` +SET SESSION wsrep_sync_wait=0; + +--let $count = 20 +--disable_query_log +while ($count) +{ +--connection node_1 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (1); +--connection node_2 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (2); +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (2); +--connection node_1 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (1); +--dec $count +} +--enable_query_log + +--connection node_1 +--disable_query_log +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_1 +--enable_query_log + +--connection node_2 +--disable_query_log +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_2 +--enable_query_log + +--connection node_1 +DROP SEQUENCE t; +DROP TABLE t1; +CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB; +DROP SEQUENCE t; +--error ER_NOT_SUPPORTED_YET +CREATE SEQUENCE t INCREMENT BY 1 CACHE=20 ENGINE=INNODB; + +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; + +--connection node_2 +--echo # Wait DDL to replicate +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +# +# Below we do not care order of INSERTs we care only that values are unique +# +--connection node_1 +--let $wsrep_sync_wait_orig_1 = `SELECT @@wsrep_sync_wait` +SET SESSION wsrep_sync_wait=0; + +--connection node_2 +--let $wsrep_sync_wait_orig_2 = `SELECT @@wsrep_sync_wait` +SET SESSION wsrep_sync_wait=0; + +--let $count = 5 +--disable_query_log +while ($count) +{ +--connection node_1 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (1),(2),(3),(4),(5),(6),(7),(8),(9); +--connection node_2 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (21),(22),(23),(24),(25),(26),(27),(28),(29); +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (21),(22),(23),(24),(25),(26),(27),(28),(29); +--connection node_1 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (1),(2),(3),(4),(5),(6),(7),(8),(9); +--dec $count +} +--enable_query_log + +--connection node_1 +--disable_query_log +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_1 +--enable_query_log + +--connection node_2 +--disable_query_log +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_2 +--enable_query_log + +--connection node_1 +DROP SEQUENCE t; +DROP TABLE t1; + +# +# Test ALTER table to sequence and ALTER SEQUENCE +# +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +--error ER_NOT_SUPPORTED_YET +ALTER TABLE t ENGINE=MYISAM; +--error ER_NOT_SUPPORTED_YET +ALTER SEQUENCE t INCREMENT BY 1 CACHE=10; +ALTER SEQUENCE t INCREMENT BY 1 NOCACHE; +ALTER SEQUENCE t INCREMENT BY 0 NOCACHE; +ALTER SEQUENCE t INCREMENT BY 0 CACHE=10; +DROP SEQUENCE t; + +# +# Test transactions +# +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +# +# ROLLBACK TRX +# +BEGIN; +INSERT INTO t1(b) VALUES (1); +INSERT INTO t1(b) VALUES (2); +INSERT INTO t1(b) VALUES (3); +INSERT INTO t1(b) VALUES (4); +INSERT INTO t1(a,b) VALUES (2,2); +--error ER_DUP_ENTRY +INSERT INTO t1(a,b) VALUES (3,2); +ROLLBACK; +SELECT * FROM t1; +SELECT NEXTVAL(t); + +--connection node_2 +SELECT * FROM t1; +SELECT NEXTVAL(t); + +--connection node_1 +DROP TABLE t1; +DROP SEQUENCE t; + +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +# +# COMMIT TRX +# +BEGIN; +INSERT INTO t1(b) VALUES (1); +INSERT INTO t1(b) VALUES (2); +INSERT INTO t1(b) VALUES (3); +INSERT INTO t1(b) VALUES (4); +INSERT INTO t1(a,b) VALUES (2,2); +--error ER_DUP_ENTRY +INSERT INTO t1(a,b) VALUES (3,2); +COMMIT; + +SELECT * FROM t1; +SELECT NEXTVAL(t); + +--connection node_2 +SELECT * FROM t1; +SELECT NEXTVAL(t); + +--connection node_1 +DROP TABLE t1; +DROP SEQUENCE t; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index c95993e1604..48d4f0cbd55 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2951,6 +2951,16 @@ retry: if (result) goto err; } + +#ifdef WITH_WSREP + if (WSREP(thd) && table->table->s->table_type == TABLE_TYPE_SEQUENCE) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "LOCK TABLE on SEQUENCES in Galera cluster"); + goto err; + } +#endif + } /* Check privileges of view tables here, after views were opened. diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index ce95d7baeeb..2904749d1e6 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -311,11 +311,6 @@ bool sequence_insert(THD *thd, LEX *lex, TABLE_LIST *org_table_list) DBUG_RETURN(TRUE); } -#ifdef WITH_WSREP - if (WSREP_ON && seq->cache != 0) - WSREP_WARN("CREATE SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -#endif - /* If not temporary table */ if (!temporary_table) { @@ -925,21 +920,24 @@ bool Sql_cmd_alter_sequence::execute(THD *thd) 0, 0)) DBUG_RETURN(TRUE); /* purecov: inspected */ -#ifdef WITH_WSREP - if (WSREP_ON && new_seq->cache != 0) - WSREP_WARN("ALTER SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -#endif - if (check_grant(thd, ALTER_ACL, first_table, FALSE, 1, FALSE)) DBUG_RETURN(TRUE); /* purecov: inspected */ #ifdef WITH_WSREP - if (WSREP_ON && WSREP(thd) && - wsrep_to_isolation_begin(thd, first_table->db.str, - first_table->table_name.str, - first_table)) - DBUG_RETURN(TRUE); + if (WSREP(thd) && wsrep_thd_is_local(thd)) + { + if (wsrep_check_sequence(thd, new_seq)) + DBUG_RETURN(TRUE); + + if (wsrep_to_isolation_begin(thd, first_table->db.str, + first_table->table_name.str, + first_table)) + { + DBUG_RETURN(TRUE); + } + } #endif /* WITH_WSREP */ + if (if_exists()) thd->push_internal_handler(&no_such_table_handler); error= open_and_lock_tables(thd, first_table, FALSE, 0); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 1e88e7722e3..b0f7d848068 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -5301,6 +5301,51 @@ int mysql_create_table_no_lock(THD *thd, const LEX_CSTRING *db, return res; } +#ifdef WITH_WSREP +/** Additional sequence checks for Galera cluster. + +@param thd thread handle +@param seq sequence definition +@retval 0 failure +@retval 1 success +*/ +bool wsrep_check_sequence(THD* thd, const sequence_definition *seq) +{ + enum legacy_db_type db_type; + if (thd->lex->create_info.used_fields & HA_CREATE_USED_ENGINE) + { + db_type= thd->lex->create_info.db_type->db_type; + } + else + { + const handlerton *hton= ha_default_handlerton(thd); + db_type= hton->db_type; + } + + // In Galera cluster we support only InnoDB sequences + if (db_type != DB_TYPE_INNODB) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "Galera cluster does support only InnoDB sequences"); + return(true); + } + + // In Galera cluster it is best to use INCREMENT BY 0 with CACHE + // or NOCACHE + if (seq && + seq->increment && + seq->cache) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "In Galera if you use CACHE you should set INCREMENT BY 0" + " to behave correctly in a cluster"); + return(true); + } + + return (false); +} +#endif /* WITH_WSREP */ + /** Implementation of SQLCOM_CREATE_TABLE. @@ -5356,6 +5401,15 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table, if (!opt_explicit_defaults_for_timestamp) promote_first_timestamp_column(&alter_info->create_list); +#ifdef WITH_WSREP + if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && + WSREP(thd) && wsrep_thd_is_local_toi(thd)) + { + if (wsrep_check_sequence(thd, create_info->seq_create_info)) + DBUG_RETURN(true); + } +#endif /* WITH_WSREP */ + /* We can abort create table for any table type */ thd->abort_on_warning= thd->is_strict_mode(); @@ -10143,6 +10197,15 @@ do_continue:; } #endif +#ifdef WITH_WSREP + if (table->s->sequence && WSREP(thd) && + wsrep_thd_is_local_toi(thd)) + { + if (wsrep_check_sequence(thd, create_info->seq_create_info)) + DBUG_RETURN(TRUE); + } +#endif /* WITH_WSREP */ + /* Use copy algorithm if: - old_alter_table system variable is set without in-place requested using diff --git a/sql/sql_table.h b/sql/sql_table.h index e51b5ec0f0f..2422f4dcb59 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -285,4 +285,8 @@ extern mysql_mutex_t LOCK_gdl; bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *); +#ifdef WITH_WSREP +bool wsrep_check_sequence(THD* thd, const sequence_definition *seq); +#endif + #endif /* SQL_TABLE_INCLUDED */ diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index a95cefc6f0f..a898b554a78 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -2298,9 +2298,20 @@ int wsrep_to_isolation_begin(THD *thd, const char *db_, const char *table_, return -1; } + /* If we are inside LOCK TABLE we release it and give warning. */ + if (thd->variables.option_bits & OPTION_TABLE_LOCK && + thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE) + { + thd->locked_tables_list.unlock_locked_tables(thd); + thd->variables.option_bits&= ~(OPTION_TABLE_LOCK); + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + HA_ERR_UNSUPPORTED, + "Galera cluster does not support LOCK TABLE on " + "SEQUENCES. Lock is released."); + } if (wsrep_debug && thd->mdl_context.has_locks()) { - WSREP_DEBUG("thread holds MDL locks at TI begin: %s %llu", + WSREP_DEBUG("thread holds MDL locks at TO begin: %s %llu", wsrep_thd_query(thd), thd->thread_id); } diff --git a/sql/wsrep_trans_observer.h b/sql/wsrep_trans_observer.h index 5f799d56c05..2d5e4d3a1f2 100644 --- a/sql/wsrep_trans_observer.h +++ b/sql/wsrep_trans_observer.h @@ -414,11 +414,12 @@ int wsrep_after_statement(THD* thd) { DBUG_ENTER("wsrep_after_statement"); WSREP_DEBUG("wsrep_after_statement for %lu client_state %s " - " client_mode %s trans_state %s", - thd_get_thread_id(thd), - wsrep::to_c_string(thd->wsrep_cs().state()), - wsrep::to_c_string(thd->wsrep_cs().mode()), - wsrep::to_c_string(thd->wsrep_cs().transaction().state())); + " client_mode %s trans_state %s query %s", + thd_get_thread_id(thd), + wsrep::to_c_string(thd->wsrep_cs().state()), + wsrep::to_c_string(thd->wsrep_cs().mode()), + wsrep::to_c_string(thd->wsrep_cs().transaction().state()), + wsrep_thd_query(thd)); DBUG_RETURN((thd->wsrep_cs().state() != wsrep::client_state::s_none && thd->wsrep_cs().mode() == Wsrep_client_state::m_local) ? thd->wsrep_cs().after_statement() : 0); From 3a7b3113505b317f8f1288d18dd0fa19a6ac360a Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Fri, 12 May 2023 02:46:42 +0200 Subject: [PATCH 017/171] MDEV-30388 correction: fix compilation error --- sql/sql_table.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_table.h b/sql/sql_table.h index 2422f4dcb59..cf61ad6a4fa 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -286,7 +286,7 @@ extern mysql_mutex_t LOCK_gdl; bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *); #ifdef WITH_WSREP -bool wsrep_check_sequence(THD* thd, const sequence_definition *seq); +bool wsrep_check_sequence(THD* thd, const class sequence_definition *seq); #endif #endif /* SQL_TABLE_INCLUDED */ From 7d55eb00f357e876fc81631919dd7f7defaf5bec Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Thu, 16 Mar 2023 09:29:10 +0100 Subject: [PATCH 018/171] MDEV-30473 Remove test galera.MDEV-27713 Remove test galera.MDEV-27713. This test relies on GET_LOCK() and has stopped working since commit 844ddb1 (see MDEV-30473). This commit disabled GET_LOCK() in combination with Galera. Signed-off-by: Julius Goryavsky --- mysql-test/suite/galera/r/MDEV-27713.result | 46 -------------- mysql-test/suite/galera/t/MDEV-27713.test | 67 --------------------- 2 files changed, 113 deletions(-) delete mode 100644 mysql-test/suite/galera/r/MDEV-27713.result delete mode 100644 mysql-test/suite/galera/t/MDEV-27713.test diff --git a/mysql-test/suite/galera/r/MDEV-27713.result b/mysql-test/suite/galera/r/MDEV-27713.result deleted file mode 100644 index 14575cb484d..00000000000 --- a/mysql-test/suite/galera/r/MDEV-27713.result +++ /dev/null @@ -1,46 +0,0 @@ -connection node_2; -connection node_1; -CREATE TABLE t1 ( -f1 INT, -f2 VARCHAR(255) PRIMARY KEY -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -INSERT INTO t1 VALUES(1, 'abc'); -connection node_1; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES (2,'def'); -connection node_2; -SET GLOBAL event_scheduler=ON; -CREATE PROCEDURE update_table() -BEGIN -SET AUTOCOMMIT=OFF; -DO GET_LOCK('local_lock', 0); -SET DEBUG_SYNC = 'innodb_row_update_for_mysql_begin SIGNAL blocked WAIT_FOR continue'; -UPDATE t1 SET f2 = 'jkl' WHERE f1 != 2; -DO RELEASE_LOCK('local_lock'); -END| -CREATE DEFINER=current_user -EVENT event -ON SCHEDULE AT CURRENT_TIMESTAMP -ON COMPLETION PRESERVE -ENABLE -DO CALL update_table(); -connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; -SET DEBUG_SYNC = 'now WAIT_FOR blocked'; -connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2; -SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; -connection node_1; -COMMIT; -connection node_2b; -SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; -connection node_2a; -SET DEBUG_SYNC = 'now SIGNAL continue'; -connection node_2; -SET GLOBAL event_scheduler=default; -DROP PROCEDURE update_table; -DROP EVENT event; -SET DEBUG_SYNC='reset'; -SET GLOBAL debug_dbug = DEFAULT; -connection node_1; -DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-27713.test b/mysql-test/suite/galera/t/MDEV-27713.test deleted file mode 100644 index 4bfcd7e3d50..00000000000 --- a/mysql-test/suite/galera/t/MDEV-27713.test +++ /dev/null @@ -1,67 +0,0 @@ ---source include/galera_cluster.inc ---source include/have_innodb.inc ---source include/have_debug.inc ---source include/have_debug_sync.inc ---source include/big_test.inc - -CREATE TABLE t1 ( - f1 INT, - f2 VARCHAR(255) PRIMARY KEY -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -INSERT INTO t1 VALUES(1, 'abc'); - ---connection node_1 -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES (2,'def'); - ---connection node_2 - -SET GLOBAL event_scheduler=ON; - -DELIMITER |; -CREATE PROCEDURE update_table() -BEGIN - SET AUTOCOMMIT=OFF; - DO GET_LOCK('local_lock', 0); - SET DEBUG_SYNC = 'innodb_row_update_for_mysql_begin SIGNAL blocked WAIT_FOR continue'; - UPDATE t1 SET f2 = 'jkl' WHERE f1 != 2; - DO RELEASE_LOCK('local_lock'); -END| -DELIMITER ;| - -CREATE DEFINER=current_user - EVENT event - ON SCHEDULE AT CURRENT_TIMESTAMP - ON COMPLETION PRESERVE - ENABLE - DO CALL update_table(); - ---connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 -SET DEBUG_SYNC = 'now WAIT_FOR blocked'; - -# Applier control thread ---connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 -SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; - ---connection node_1 -COMMIT; - -# Applier control thread ---connection node_2b -SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; - ---connection node_2a -SET DEBUG_SYNC = 'now SIGNAL continue'; - ---connection node_2 -SET GLOBAL event_scheduler=default; -DROP PROCEDURE update_table; -DROP EVENT event; -SET DEBUG_SYNC='reset'; -SET GLOBAL debug_dbug = DEFAULT; - ---connection node_1 -DROP TABLE t1; From f102b595e8a65d910e34ea943eb562dc16a4256c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 3 May 2023 08:29:38 +0300 Subject: [PATCH 019/171] MDEV-28433 : Server crashes when wsrep_sst_donor and wsrep_cluster_address set to NULL Do not allow setting wsrep_sst_donor as NULL as it is incorrect value. User can use value '' (default) that represents same as NULL. Setting wsrep_cluster_address to NULL is already handled correctly. Signed-off-by: Julius Goryavsky --- mysql-test/suite/galera/r/mdev-28433.result | 25 +++++++++++++ mysql-test/suite/galera/t/mdev-28433.test | 35 +++++++++++++++++++ .../sys_vars/r/wsrep_sst_donor_basic.result | 11 ++++-- .../sys_vars/t/wsrep_sst_donor_basic.test | 5 ++- sql/wsrep_sst.cc | 9 +++++ 5 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 mysql-test/suite/galera/r/mdev-28433.result create mode 100644 mysql-test/suite/galera/t/mdev-28433.test diff --git a/mysql-test/suite/galera/r/mdev-28433.result b/mysql-test/suite/galera/r/mdev-28433.result new file mode 100644 index 00000000000..c2dde6481f4 --- /dev/null +++ b/mysql-test/suite/galera/r/mdev-28433.result @@ -0,0 +1,25 @@ +connection node_2; +connection node_1; +connection node_1; +connection node_2; +connection node_2; +SET @@global.wsrep_sst_donor = NULL; +ERROR 42000: Variable 'wsrep_sst_donor' can't be set to the value of 'NULL' +SET @@global.wsrep_cluster_address='NULL'; +SET SESSION wsrep_sync_wait=0; +SELECT @@wsrep_sst_donor; +@@wsrep_sst_donor + +SELECT @@wsrep_cluster_address; +@@wsrep_cluster_address +NULL +SHOW STATUS LIKE 'wsrep_ready'; +Variable_name Value +wsrep_ready OFF +SHOW STATUS LIKE 'wsrep_cluster_status'; +Variable_name Value +wsrep_cluster_status Disconnected +call mtr.add_suppression("WSREP: .*Invalid backend URI.*"); +call mtr.add_suppression("WSREP: gcs connect failed: Invalid argument"); +disconnect node_2; +disconnect node_1; diff --git a/mysql-test/suite/galera/t/mdev-28433.test b/mysql-test/suite/galera/t/mdev-28433.test new file mode 100644 index 00000000000..ddee3618fee --- /dev/null +++ b/mysql-test/suite/galera/t/mdev-28433.test @@ -0,0 +1,35 @@ +--source include/galera_cluster.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 +--let $wsrep_cluster_address_saved = `SELECT @@global.wsrep_cluster_address` + +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_sst_donor = NULL; +--let $wsrep_cluster_address_orig = `SELECT @@wsrep_cluster_address` +SET @@global.wsrep_cluster_address='NULL'; +SET SESSION wsrep_sync_wait=0; +SELECT @@wsrep_sst_donor; +SELECT @@wsrep_cluster_address; +# Must return 'OFF' +SHOW STATUS LIKE 'wsrep_ready'; + +# Must return 'Disconnected' +SHOW STATUS LIKE 'wsrep_cluster_status'; + +--disable_query_log +--eval SET @@global.wsrep_cluster_address = '$wsrep_cluster_address_orig' +--enable_query_log +--source include/wait_until_connected_again.inc +--source include/galera_wait_ready.inc +call mtr.add_suppression("WSREP: .*Invalid backend URI.*"); +call mtr.add_suppression("WSREP: gcs connect failed: Invalid argument"); + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result b/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result index 3d4fc24df7f..dbe4cc23bf9 100644 --- a/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result +++ b/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result @@ -33,17 +33,22 @@ SET @@global.wsrep_sst_donor=default; SELECT @@global.wsrep_sst_donor; @@global.wsrep_sst_donor -SET @@global.wsrep_sst_donor=NULL; +SET @@global.wsrep_sst_donor=''; SELECT @@global.wsrep_sst_donor; @@global.wsrep_sst_donor -NULL + # invalid values SET @@global.wsrep_sst_donor=1; ERROR 42000: Incorrect argument type to variable 'wsrep_sst_donor' SELECT @@global.wsrep_sst_donor; @@global.wsrep_sst_donor -NULL + +SET @@global.wsrep_sst_donor=NULL; +ERROR 42000: Variable 'wsrep_sst_donor' can't be set to the value of 'NULL' +SELECT @@global.wsrep_sst_donor; +@@global.wsrep_sst_donor + # restore the initial value SET @@global.wsrep_sst_donor = @wsrep_sst_donor_global_saved; diff --git a/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test b/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test index 7d3d6598557..c4b32bb8af6 100644 --- a/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test +++ b/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test @@ -27,7 +27,7 @@ SET @@global.wsrep_sst_donor='hyphenated-donor-name'; SELECT @@global.wsrep_sst_donor; SET @@global.wsrep_sst_donor=default; SELECT @@global.wsrep_sst_donor; -SET @@global.wsrep_sst_donor=NULL; +SET @@global.wsrep_sst_donor=''; SELECT @@global.wsrep_sst_donor; --echo @@ -35,6 +35,9 @@ SELECT @@global.wsrep_sst_donor; --error ER_WRONG_TYPE_FOR_VAR SET @@global.wsrep_sst_donor=1; SELECT @@global.wsrep_sst_donor; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_sst_donor=NULL; +SELECT @@global.wsrep_sst_donor; --echo --echo # restore the initial value diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 1fb1d6890e2..a0540744c96 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -299,6 +299,15 @@ void wsrep_sst_auth_init () bool wsrep_sst_donor_check (sys_var *self, THD* thd, set_var* var) { + if ((! var->save_result.string_value.str) || + (var->save_result.string_value.length > (FN_REFLEN -1))) // safety + { + my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var->var->name.str, + var->save_result.string_value.str ? + var->save_result.string_value.str : "NULL"); + return 1; + } + return 0; } From 0474466bc2c3e05a160677f1dbabea374e942736 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Thu, 11 May 2023 23:34:41 -0700 Subject: [PATCH 020/171] MDEV-31240 Crash with condition pushable into derived and containing outer reference This bug could affect queries containing a subquery over splittable derived tables and having an outer references in its WHERE clause. If such subquery contained an equality condition whose left part was a reference to a column of the derived table and the right part referred only to outer columns then the server crashed in the function st_join_table::choose_best_splitting() The crashing code was added in the commit ce7ffe61d836fe9f0cfc1087f058bc40d66e5cfb that made the code of the function sensitive to presence of the flag OUTER_REF_TABLE_BIT in the KEYUSE_EXT::needed_in_prefix fields. The field needed_in_prefix of the KEYUSE_EXT structure should not contain table maps with OUTER_REF_TABLE_BIT or RAND_TABLE_BIT. Note that this fix is quite conservative: for affected queries it just returns the query plans that were used before the above mentioned commit. In fact the equalities causing crashes should be pushed into derived tables without any usage of split optimization. Approved by Sergei Petrunia --- mysql-test/main/derived_cond_pushdown.result | 94 ++++++++++++++++++++ mysql-test/main/derived_cond_pushdown.test | 41 +++++++++ sql/opt_split.cc | 3 +- 3 files changed, 137 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/derived_cond_pushdown.result b/mysql-test/main/derived_cond_pushdown.result index 4b202ea7a12..a4fc7a7447d 100644 --- a/mysql-test/main/derived_cond_pushdown.result +++ b/mysql-test/main/derived_cond_pushdown.result @@ -18358,4 +18358,98 @@ a deallocate prepare stmt; drop view v1; drop table t1; +# +# MDEV-31240: condition pushed into splittable derived has reference to +# outer column and does not refer to any column of embedding +# select +# +create table t1 (a int); +insert into t1 select seq from seq_1_to_1000; +create table t2 (a int, b int, key (a)); +insert into t2 select mod(seq,100), rand(13) * mod(seq,500) from seq_1_to_1000; +create table t3 (a int); +insert into t3 values (3), (1); +analyze table t1, t2, t3 persistent for all; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status Table is already up to date +test.t3 analyze status Engine-independent statistics collected +test.t3 analyze status OK +explain select +a, +( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +from t1 limit 5; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 +2 DEPENDENT SUBQUERY t3 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY ref key0 key0 5 test.t1.a 2 +3 LATERAL DERIVED t2 ref a a 5 test.t1.a 10 +select +a, +( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +from t1 limit 5; +a ( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +1 1=804 +2 1=1056 +3 1=846 +4 1=947 +5 1=973 +truncate table t2; +insert into t2 select mod(seq,10), rand(15) * mod(seq,500) from seq_1_to_1000; +analyze table t2 persistent for all; +Table Op Msg_type Msg_text +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status Table is already up to date +explain select +a, +( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +from t1 limit 5; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 +2 DEPENDENT SUBQUERY t3 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY ref key0 key0 5 test.t1.a 100 +3 DERIVED t2 ALL a NULL NULL NULL 1000 Using temporary; Using filesort +select +a, +( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +from t1 limit 5; +a ( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +1 1=11858 +2 1=11380 +3 1=11588 +4 1=11373 +5 1=11612 +drop table t1,t2,t3; # End of 10.4 tests diff --git a/mysql-test/main/derived_cond_pushdown.test b/mysql-test/main/derived_cond_pushdown.test index b4e131dbe79..7a4d9b4ad7d 100644 --- a/mysql-test/main/derived_cond_pushdown.test +++ b/mysql-test/main/derived_cond_pushdown.test @@ -3972,4 +3972,45 @@ deallocate prepare stmt; drop view v1; drop table t1; +--echo # +--echo # MDEV-31240: condition pushed into splittable derived has reference to +--echo # outer column and does not refer to any column of embedding +--echo # select +--echo # + +create table t1 (a int); +insert into t1 select seq from seq_1_to_1000; + +create table t2 (a int, b int, key (a)); +insert into t2 select mod(seq,100), rand(13) * mod(seq,500) from seq_1_to_1000; + +create table t3 (a int); +insert into t3 values (3), (1); + +analyze table t1, t2, t3 persistent for all; + +let $q= +select + a, + ( select concat(t3.a,'=',dt.s) + from + (select a, sum(b) as s from t2 group by a) as dt, + t3 + where dt.a=t1.a and t3.a < 3 + ) +from t1 limit 5; + +eval explain $q; +eval $q; + +truncate table t2; +insert into t2 select mod(seq,10), rand(15) * mod(seq,500) from seq_1_to_1000; + +analyze table t2 persistent for all; + +eval explain $q; +eval $q; + +drop table t1,t2,t3; + --echo # End of 10.4 tests diff --git a/sql/opt_split.cc b/sql/opt_split.cc index bb3aec9ee8d..6d816552baf 100644 --- a/sql/opt_split.cc +++ b/sql/opt_split.cc @@ -664,7 +664,8 @@ add_ext_keyuse_for_splitting(Dynamic_array *ext_keyuses, keyuse_ext.cond_guard= added_key_field->cond_guard; keyuse_ext.sj_pred_no= added_key_field->sj_pred_no; keyuse_ext.validity_ref= 0; - keyuse_ext.needed_in_prefix= added_key_field->val->used_tables(); + keyuse_ext.needed_in_prefix= added_key_field->val->used_tables() & + ~(OUTER_REF_TABLE_BIT | RAND_TABLE_BIT); keyuse_ext.validity_var= false; return ext_keyuses->push(keyuse_ext); } From b3cdb612491de6070c376bd98d30c5ec9aaffa87 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 12 May 2023 11:51:58 +0400 Subject: [PATCH 021/171] MDEV-31250 ROW variables do not get assigned from subselects ROW variables did not get assigned from subselects in these contexts: BEGIN DECLARE r ROW TYPE OF t1; SET r=(SELECT * FROM t1 WHERE a=1); END; BEGIN DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1); END; All fields of the ROW variable remained NULL. --- .../main/sp-anchor-row-type-table.result | 44 +++++++++++++++ mysql-test/main/sp-anchor-row-type-table.test | 55 +++++++++++++++++++ sql/field.cc | 3 + 3 files changed, 102 insertions(+) diff --git a/mysql-test/main/sp-anchor-row-type-table.result b/mysql-test/main/sp-anchor-row-type-table.result index c28d26304db..5e3b655a75b 100644 --- a/mysql-test/main/sp-anchor-row-type-table.result +++ b/mysql-test/main/sp-anchor-row-type-table.result @@ -814,3 +814,47 @@ t2 CREATE TABLE `t2` ( `text0` text DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; +# +# End of 10.3 tests +# +# +# Start of 10.4 tests +# +# +# MDEV-31250 ROW variables do not get assigned from subselects +# +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1; +SELECT * INTO r FROM t1 WHERE a=1; +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1; +SET r=(SELECT * FROM t1 WHERE a=1); +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1); +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/sp-anchor-row-type-table.test b/mysql-test/main/sp-anchor-row-type-table.test index 3f04dc68586..213460ed38f 100644 --- a/mysql-test/main/sp-anchor-row-type-table.test +++ b/mysql-test/main/sp-anchor-row-type-table.test @@ -881,3 +881,58 @@ END; $$ DELIMITER ;$$ DROP TABLE t1; + +--echo # +--echo # End of 10.3 tests +--echo # + + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-31250 ROW variables do not get assigned from subselects +--echo # + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1; + SELECT * INTO r FROM t1 WHERE a=1; + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1; + SET r=(SELECT * FROM t1 WHERE a=1); + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1); + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/sql/field.cc b/sql/field.cc index 14252033a01..ff45b6c5de9 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2543,6 +2543,8 @@ bool Field_row::sp_prepare_and_store_item(THD *thd, Item **value) fixed underlying Item_field pointing to Field_row. - In case if we're assigning from a ROW() value, src and value[0] will point to the same Item_row. + - In case if we're assigning from a subselect, src and value[0] also + point to the same Item_singlerow_subselect. */ Item *src; if (!(src= thd->sp_fix_func_item(value)) || @@ -2554,6 +2556,7 @@ bool Field_row::sp_prepare_and_store_item(THD *thd, Item **value) DBUG_RETURN(true); } + src->bring_value(); DBUG_RETURN(m_table->sp_set_all_fields_from_item(thd, src)); } From 2ff01e763e9113af75fe73826cac029e84521b6d Mon Sep 17 00:00:00 2001 From: Mikhail Chalov Date: Fri, 10 Mar 2023 14:41:11 -0800 Subject: [PATCH 022/171] Fix insecure use of strcpy, strcat and sprintf in Connect Old style C functions `strcpy()`, `strcat()` and `sprintf()` are vulnerable to security issues due to lacking memory boundary checks. Replace these in the Connect storage engine with safe new and/or custom functions such as `snprintf()` `safe_strcpy()` and `safe_strcat()`. With this change FlawFinder and other static security analyzers report 287 fewer findings. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc. --- storage/connect/bson.cpp | 30 ++++++++--------- storage/connect/bsonudf.cpp | 50 ++++++++++++++-------------- storage/connect/cmgoconn.cpp | 14 ++++---- storage/connect/filamgz.cpp | 16 ++++----- storage/connect/filamtxt.cpp | 30 ++++++++--------- storage/connect/filamvct.cpp | 20 +++++------ storage/connect/filamzip.cpp | 30 ++++++++--------- storage/connect/filter.cpp | 12 +++---- storage/connect/fmdlex.c | 2 +- storage/connect/ha_connect.cc | 62 +++++++++++++++++------------------ storage/connect/javaconn.cpp | 24 +++++++------- storage/connect/jdbconn.cpp | 24 +++++++------- storage/connect/jmgoconn.cpp | 6 ++-- storage/connect/json.cpp | 27 ++++++++------- storage/connect/jsonudf.cpp | 44 ++++++++++++------------- storage/connect/macutil.cpp | 7 ++-- storage/connect/odbconn.cpp | 28 ++++++++-------- storage/connect/osutil.c | 13 ++++---- storage/connect/plgdbutl.cpp | 6 ++-- storage/connect/plugutil.cpp | 8 +++-- storage/connect/tabjmg.cpp | 14 ++++---- storage/connect/tabmysql.cpp | 54 +++++++++++++++--------------- storage/connect/tabpivot.cpp | 32 +++++++++--------- storage/connect/tabsys.cpp | 16 ++++----- storage/connect/tabwmi.cpp | 32 ++++++++++-------- storage/connect/tabxml.cpp | 42 ++++++++++++------------ storage/connect/value.cpp | 22 ++++++------- storage/connect/xindex.cpp | 13 +++++--- 28 files changed, 348 insertions(+), 330 deletions(-) diff --git a/storage/connect/bson.cpp b/storage/connect/bson.cpp index 880b4a1ce23..058cef9e62e 100644 --- a/storage/connect/bson.cpp +++ b/storage/connect/bson.cpp @@ -215,7 +215,7 @@ OFFSET BDOC::ParseArray(size_t& i) switch (s[i]) { case ',': if (level < 2) { - sprintf(G->Message, "Unexpected ',' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected ',' near %.*s", (int) ARGS); throw 1; } else level = 1; @@ -223,7 +223,7 @@ OFFSET BDOC::ParseArray(size_t& i) break; case ']': if (level == 1) { - sprintf(G->Message, "Unexpected ',]' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected ',]' near %.*s", (int) ARGS); throw 1; } // endif level @@ -237,7 +237,7 @@ OFFSET BDOC::ParseArray(size_t& i) break; default: if (level == 2) { - sprintf(G->Message, "Unexpected value near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected value near %.*s", (int) ARGS); throw 1; } else if (lastvlp) { vlp = ParseValue(i, NewVal()); @@ -284,7 +284,7 @@ OFFSET BDOC::ParseObject(size_t& i) level = 2; } else { - sprintf(G->Message, "misplaced string near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "misplaced string near %.*s", (int) ARGS); throw 2; } // endif level @@ -294,14 +294,14 @@ OFFSET BDOC::ParseObject(size_t& i) ParseValue(++i, GetVlp(lastbpp)); level = 3; } else { - sprintf(G->Message, "Unexpected ':' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected ':' near %.*s", (int) ARGS); throw 2; } // endif level break; case ',': if (level < 3) { - sprintf(G->Message, "Unexpected ',' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected ',' near %.*s", (int) ARGS); throw 2; } else level = 1; @@ -309,7 +309,7 @@ OFFSET BDOC::ParseObject(size_t& i) break; case '}': if (!(level == 0 || level == 3)) { - sprintf(G->Message, "Unexpected '}' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected '}' near %.*s", (int) ARGS); throw 2; } // endif level @@ -321,7 +321,7 @@ OFFSET BDOC::ParseObject(size_t& i) case '\t': break; default: - sprintf(G->Message, "Unexpected character '%c' near %.*s", + snprintf(G->Message, sizeof(G->Message), "Unexpected character '%c' near %.*s", s[i], (int) ARGS); throw 2; }; // endswitch s[i] @@ -399,7 +399,7 @@ suite: return bvp; err: - sprintf(G->Message, "Unexpected character '%c' near %.*s", s[i], (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected character '%c' near %.*s", s[i], (int) ARGS); throw 3; } // end of ParseValue @@ -758,16 +758,16 @@ bool BDOC::SerializeValue(PBVAL jvp, bool b) return jp->Escape(MZP(jvp->To_Val)); case TYPE_INTG: - sprintf(buf, "%d", jvp->N); + snprintf(buf, sizeof(buf), "%d", jvp->N); return jp->WriteStr(buf); case TYPE_BINT: - sprintf(buf, "%lld", *(longlong*)MakePtr(Base, jvp->To_Val)); + snprintf(buf, sizeof(buf), "%lld", *(longlong*)MakePtr(Base, jvp->To_Val)); return jp->WriteStr(buf); case TYPE_FLOAT: - sprintf(buf, "%.*f", jvp->Nd, jvp->F); + snprintf(buf, sizeof(buf), "%.*f", jvp->Nd, jvp->F); return jp->WriteStr(buf); case TYPE_DBL: - sprintf(buf, "%.*lf", jvp->Nd, *(double*)MakePtr(Base, jvp->To_Val)); + snprintf(buf, sizeof(buf), "%.*lf", jvp->Nd, *(double*)MakePtr(Base, jvp->To_Val)); return jp->WriteStr(buf); case TYPE_NULL: return jp->WriteStr("null"); @@ -797,7 +797,7 @@ void* BJSON::BsonSubAlloc(size_t size) memp, size, pph->To_Free, pph->FreeBlk); if (size > pph->FreeBlk) { /* Not enough memory left in pool */ - sprintf(G->Message, + snprintf(G->Message, sizeof(G->Message), "Not enough memory for request of %zd (used=%zd free=%zd)", size, pph->To_Free, pph->FreeBlk); xtrc(1, "BsonSubAlloc: %s\n", G->Message); @@ -1679,7 +1679,7 @@ PBVAL BJSON::SetValue(PBVAL vlp, PVAL valp) break; default: - sprintf(G->Message, "Unsupported typ %d\n", valp->GetType()); + snprintf(G->Message, sizeof(G->Message), "Unsupported typ %d\n", valp->GetType()); throw(777); } // endswitch Type diff --git a/storage/connect/bsonudf.cpp b/storage/connect/bsonudf.cpp index 8df04232277..f0e9b52fd1a 100644 --- a/storage/connect/bsonudf.cpp +++ b/storage/connect/bsonudf.cpp @@ -68,7 +68,7 @@ static PBSON BbinAlloc(PGLOBAL g, ulong len, PBVAL jsp) PBSON bsp = (PBSON)PlgDBSubAlloc(g, NULL, sizeof(BSON)); if (bsp) { - strcpy(bsp->Msg, "Binary Json"); + snprintf(bsp->Msg, sizeof(bsp->Msg), "Binary Json"); bsp->Msg[BMX] = 0; bsp->Filename = NULL; bsp->G = g; @@ -270,7 +270,7 @@ my_bool BJNX::SetArrayOptions(PGLOBAL g, char* p, int i, PSZ nm) } // endif n } else { - strcpy(g->Message, "Wrong array specification"); + snprintf(g->Message, sizeof(g->Message), "Wrong array specification"); return true; } // endif's @@ -565,7 +565,7 @@ PBVAL BJNX::GetRowValue(PGLOBAL g, PBVAL row, int i) vlp = row; // DupVal(g, row) ??? } else { - strcpy(g->Message, "Unexpected object"); + snprintf(g->Message, sizeof(g->Message), "Unexpected object"); vlp = NULL; } //endif Op @@ -610,7 +610,7 @@ PBVAL BJNX::GetRowValue(PGLOBAL g, PBVAL row, int i) /*********************************************************************************/ PVAL BJNX::ExpandArray(PGLOBAL g, PBVAL arp, int n) { - strcpy(g->Message, "Expand cannot be done by this function"); + snprintf(g->Message, sizeof(g->Message), "Expand cannot be done by this function"); return NULL; } // end of ExpandArray @@ -791,7 +791,7 @@ PVAL BJNX::CalculateArray(PGLOBAL g, PBVAL bap, int n) xtrc(1, "Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return vp; @@ -860,7 +860,7 @@ PBVAL BJNX::GetRow(PGLOBAL g) } else if (row->Type == TYPE_JAR) { AddArrayValue(row, MOF(nwr)); } else { - strcpy(g->Message, "Wrong type when writing new row"); + snprintf(g->Message, sizeof(g->Message), "Wrong type when writing new row"); nwr = NULL; } // endif's @@ -893,7 +893,7 @@ my_bool BJNX::WriteValue(PGLOBAL g, PBVAL jvalp) case TYPE_JAR: arp = row; break; case TYPE_JVAL: jvp = MVP(row->To_Val); break; default: - strcpy(g->Message, "Invalid target type"); + snprintf(g->Message, sizeof(g->Message), "Invalid target type"); return true; } // endswitch Type @@ -1067,7 +1067,7 @@ my_bool BJNX::CheckPath(PGLOBAL g, UDF_ARGS *args, PBVAL jsp, PBVAL& jvp, int n) return false; } else { - strcpy(g->Message, "Path argument is null"); + snprintf(g->Message, sizeof(g->Message), "Path argument is null"); return true; } // endif path @@ -1088,7 +1088,7 @@ PSZ BJNX::Locate(PGLOBAL g, PBVAL jsp, PBVAL jvp, int k) g->Message[0] = 0; if (!jsp) { - strcpy(g->Message, "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); return NULL; } // endif jsp @@ -1115,7 +1115,7 @@ PSZ BJNX::Locate(PGLOBAL g, PBVAL jsp, PBVAL jvp, int k) if (err) { if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } else if (Found) { Jp->WriteChr('\0'); @@ -1127,7 +1127,7 @@ PSZ BJNX::Locate(PGLOBAL g, PBVAL jsp, PBVAL jvp, int k) xtrc(1, "Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return str; @@ -1208,7 +1208,7 @@ PSZ BJNX::LocateAll(PGLOBAL g, PBVAL jsp, PBVAL bvp, int mx) PJPN jnp; if (!jsp) { - strcpy(g->Message, "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); return NULL; } // endif jsp @@ -1247,13 +1247,13 @@ PSZ BJNX::LocateAll(PGLOBAL g, PBVAL jsp, PBVAL bvp, int mx) PlugSubAlloc(g, NULL, Jp->N); str = Jp->Strp; } else if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } catch (int n) { xtrc(1, "Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return str; @@ -1744,7 +1744,7 @@ PBSON BJNX::MakeBinResult(UDF_ARGS *args, PBVAL top, ulong len, int n) if ((bnp = BbinAlloc(G, len, top))) { bnp->Filename = filename; bnp->Pretty = pretty; - strcpy(bnp->Msg, "Json Binary item"); + snprintf(bnp->Msg, sizeof(bnp->Msg), "Json Binary item"); } //endif bnp return bnp; @@ -3100,7 +3100,7 @@ char* bson_test(UDF_INIT* initid, UDF_ARGS* args, char* result, *error = 1; str = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; str = NULL; @@ -3221,7 +3221,7 @@ char* bsonlocate(UDF_INIT* initid, UDF_ARGS* args, char* result, *error = 1; path = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; @@ -3339,7 +3339,7 @@ char* bson_locate_all(UDF_INIT* initid, UDF_ARGS* args, char* result, *error = 1; path = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; @@ -3706,7 +3706,7 @@ char *bson_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, jvp = bnx.GetRowValue(g, jvp, 0); if (!bnx.IsJson(jvp)) { - strcpy(g->Message, "Not a Json item"); + snprintf(g->Message, sizeof(g->Message), "Not a Json item"); } else str = bnx.Serialize(g, jvp, NULL, 0); @@ -3838,7 +3838,7 @@ char *bsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); str = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); str = NULL; } // end catch @@ -4297,7 +4297,7 @@ static char *bson_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); str = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); str = NULL; } // end catch @@ -4739,8 +4739,8 @@ char *bfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result, PGLOBAL g = (PGLOBAL)initid->ptr; BDOC doc(g); - strcpy(fn, MakePSZ(g, args, 0)); - strcpy(ofn, MakePSZ(g, args, 1)); + snprintf(fn, sizeof(fn), "%s", MakePSZ(g, args, 0)); + snprintf(ofn, sizeof(ofn), "%s", MakePSZ(g, args, 1)); if (args->arg_count == 3) lrecl = (size_t)*(longlong*)args->args[2]; @@ -5866,7 +5866,7 @@ static char *bbin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); } // end catch @@ -6198,7 +6198,7 @@ char* bbin_locate_all(UDF_INIT* initid, UDF_ARGS* args, char* result, *error = 1; path = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 3ecdb02a813..e61806d42eb 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -156,7 +156,7 @@ bool CMgoConn::Connect(PGLOBAL g) { if (!Pcg->Db_name || !Pcg->Coll_name) { // This would crash in mongoc_client_get_collection - strcpy(g->Message, "Missing DB or collection name"); + snprintf(g->Message, sizeof(g->Message), "Missing DB or collection name"); return true; } // endif name @@ -165,7 +165,7 @@ bool CMgoConn::Connect(PGLOBAL g) __try { mongo_init(true); } __except (EXCEPTION_EXECUTE_HANDLER) { - strcpy(g->Message, "Cannot load MongoDB C driver"); + snprintf(g->Message, sizeof(g->Message), "Cannot load MongoDB C driver"); return true; } // end try/except #else // !_WIN32 @@ -379,7 +379,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) p = strrchr(options, ']'); if (!p) { - strcpy(g->Message, "Missing ] in pipeline"); + snprintf(g->Message, sizeof(g->Message), "Missing ] in pipeline"); return true; } else *(char*)p = 0; @@ -390,7 +390,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) s->Append(",{\"$match\":"); if (MakeSelector(g, filp, s)) { - strcpy(g->Message, "Failed making selector"); + snprintf(g->Message, sizeof(g->Message), "Failed making selector"); return true; } else s->Append('}'); @@ -454,7 +454,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) s->Append(','); if (MakeSelector(g, filp, s)) { - strcpy(g->Message, "Failed making selector"); + snprintf(g->Message, sizeof(g->Message), "Failed making selector"); return true; } // endif Selector @@ -771,7 +771,7 @@ int CMgoConn::Write(PGLOBAL g) } // endif remove } else { - strcpy(g->Message, "Mongo update: cannot find _id"); + snprintf(g->Message, sizeof(g->Message), "Mongo update: cannot find _id"); rc = RC_FX; } // endif b @@ -1066,7 +1066,7 @@ bool CMgoConn::AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd) } // endswitch Buf_Type if (!rc) { - strcpy(g->Message, "Adding value failed"); + snprintf(g->Message, sizeof(g->Message), "Adding value failed"); return true; } else return false; diff --git a/storage/connect/filamgz.cpp b/storage/connect/filamgz.cpp index 3e5741d378c..c13e1b2ea38 100644 --- a/storage/connect/filamgz.cpp +++ b/storage/connect/filamgz.cpp @@ -88,7 +88,7 @@ int GZFAM::Zerror(PGLOBAL g) { int errnum; - strcpy(g->Message, gzerror(Zfile, &errnum)); + snprintf(g->Message, sizeof(g->Message), "%s", gzerror(Zfile, &errnum)); if (errnum == Z_ERRNO) #if defined(_WIN32) @@ -142,7 +142,7 @@ bool GZFAM::OpenTableFile(PGLOBAL g) /*****************************************************************/ /* Updating GZ files not implemented yet. */ /*****************************************************************/ - strcpy(g->Message, MSG(UPD_ZIP_NOT_IMP)); + snprintf(g->Message, sizeof(g->Message), MSG(UPD_ZIP_NOT_IMP)); return true; case MODE_DELETE: if (!Tdbp->GetNext()) { @@ -379,7 +379,7 @@ int GZFAM::WriteBuffer(PGLOBAL g) /***********************************************************************/ int GZFAM::DeleteRecords(PGLOBAL g, int) { - strcpy(g->Message, MSG(NO_ZIP_DELETE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_ZIP_DELETE)); return RC_FX; } // end of DeleteRecords @@ -926,7 +926,7 @@ bool ZLBFAM::AllocateBuffer(PGLOBAL g) #if 0 if (!Optimized && Tdbp->NeedIndexing(g)) { - strcpy(g->Message, MSG(NOP_ZLIB_INDEX)); + snprintf(g->Message, sizeof(g->Message), MSG(NOP_ZLIB_INDEX)); return TRUE; } // endif indexing #endif // 0 @@ -993,7 +993,7 @@ bool ZLBFAM::AllocateBuffer(PGLOBAL g) CurBlk = Block - 1; CurNum = Last; - strcpy(g->Message, MSG(NO_PAR_BLK_INS)); + snprintf(g->Message, sizeof(g->Message), "%s",MSG(NO_PAR_BLK_INS)); return TRUE; } // endif Last @@ -1068,7 +1068,7 @@ bool ZLBFAM::SetPos(PGLOBAL g, int pos __attribute__((unused))) return true; #if 0 // All this must be checked if (pos < 0) { - strcpy(g->Message, MSG(INV_REC_POS)); + snprintf(g->Message, sizeof(g->Message), MSG(INV_REC_POS)); return true; } // endif recpos @@ -1156,7 +1156,7 @@ int ZLBFAM::ReadBuffer(PGLOBAL g) rdbuf = Zlenp; } else { // !Optimized if (CurBlk != OldBlk + 1) { - strcpy(g->Message, MSG(INV_RAND_ACC)); + snprintf(g->Message, sizeof(g->Message), MSG(INV_RAND_ACC)); return RC_FX; } else Fpos = ftell(Stream); // Used when optimizing @@ -1276,7 +1276,7 @@ int ZLBFAM::WriteBuffer(PGLOBAL g) #if defined(_DEBUG) if (Tdbp->GetFtype() == RECFM_FIX && (signed)strlen(CurLine) != Lrecl + (signed)strlen(CrLf)) { - strcpy(g->Message, MSG(BAD_LINE_LEN)); + snprintf(g->Message, sizeof(g->Message), MSG(BAD_LINE_LEN)); Closing = TRUE; return RC_FX; } // endif Lrecl diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index f8168887e89..d449fc1d1c5 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -367,13 +367,13 @@ int TXTFAM::UpdateSortedRows(PGLOBAL g) // return RC_INFO; return RC_OK; // Nothing to do } else if (!(Sosar = MakeValueArray(g, To_Sos))) { - strcpy(g->Message, "Start position array is null"); + snprintf(g->Message, sizeof(g->Message), "Start position array is null"); goto err; } else if (!(Updar = MakeValueArray(g, To_Upd))) { - strcpy(g->Message, "Updated line array is null"); + snprintf(g->Message, sizeof(g->Message), "Updated line array is null"); goto err; } else if (!(ix = (int*)Posar->GetSortIndex(g))) { - strcpy(g->Message, "Error getting array sort index"); + snprintf(g->Message, sizeof(g->Message), "Error getting array sort index"); goto err; } // endif's @@ -419,10 +419,10 @@ int TXTFAM::DeleteSortedRows(PGLOBAL g) // return RC_INFO; return RC_OK; // Nothing to do } else if (!(Sosar = MakeValueArray(g, To_Sos))) { - strcpy(g->Message, "Start position array is null"); + snprintf(g->Message, sizeof(g->Message), "Start position array is null"); goto err; } else if (!(ix = (int*)Posar->GetSortIndex(g))) { - strcpy(g->Message, "Error getting array sort index"); + snprintf(g->Message, sizeof(g->Message), "Error getting array sort index"); goto err; } // endif's @@ -454,7 +454,7 @@ err: /***********************************************************************/ int TXTFAM::InitDelete(PGLOBAL g, int, int) { - strcpy(g->Message, "InitDelete should not be used by this table type"); + snprintf(g->Message, sizeof(g->Message), "InitDelete should not be used by this table type"); return RC_FX; } // end of InitDelete @@ -556,7 +556,7 @@ bool DOSFAM::OpenTableFile(PGLOBAL g) switch (mode) { case MODE_READ: - strcpy(opmode, "r"); + snprintf(opmode, sizeof(opmode), "r"); break; case MODE_DELETE: if (!Tdbp->Next) { @@ -570,7 +570,7 @@ bool DOSFAM::OpenTableFile(PGLOBAL g) } // endif blocked // This will erase the entire file - strcpy(opmode, "w"); + snprintf(opmode, sizeof(opmode), "w"); Tdbp->ResetSize(); break; } // endif @@ -580,14 +580,14 @@ bool DOSFAM::OpenTableFile(PGLOBAL g) /* fall through */ case MODE_UPDATE: if ((UseTemp = Tdbp->IsUsingTemp(g))) { - strcpy(opmode, "r"); + snprintf(opmode, sizeof(opmode), "r"); Bin = true; } else - strcpy(opmode, "r+"); + snprintf(opmode, sizeof(opmode), "r+"); break; case MODE_INSERT: - strcpy(opmode, "a+"); + snprintf(opmode, sizeof(opmode), "a+"); break; default: snprintf(g->Message, sizeof(g->Message), MSG(BAD_OPEN_MODE), mode); @@ -1364,7 +1364,7 @@ int BLKFAM::GetNextPos(void) /***********************************************************************/ bool BLKFAM::SetPos(PGLOBAL g, int) { - strcpy(g->Message, "Blocked variable tables cannot be used indexed"); + snprintf(g->Message, sizeof(g->Message), "Blocked variable tables cannot be used indexed"); return true; } // end of SetPos @@ -1708,10 +1708,10 @@ bool BINFAM::OpenTableFile(PGLOBAL g) { switch (mode) { case MODE_READ: - strcpy(opmode, "rb"); + snprintf(opmode, sizeof(opmode), "rb"); break; case MODE_WRITE: - strcpy(opmode, "wb"); + snprintf(opmode, sizeof(opmode), "wb"); break; default: snprintf(g->Message, sizeof(g->Message), MSG(BAD_OPEN_MODE), mode); @@ -1859,7 +1859,7 @@ int BINFAM::ReadBuffer(PGLOBAL g) // Read the prefix giving the row length if (!fread(&Recsize, sizeof(size_t), 1, Stream)) { if (!feof(Stream)) { - strcpy(g->Message, "Error reading line prefix\n"); + snprintf(g->Message, sizeof(g->Message), "Error reading line prefix\n"); return RC_FX; } else return RC_EF; diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index 46dd7eba5ff..618e857f248 100644 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -429,7 +429,7 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) /*********************************************************************/ switch (mode) { case MODE_READ: - strcpy(opmode, "rb"); + snprintf(opmode, sizeof(opmode), "rb"); break; case MODE_DELETE: if (!Tdbp->GetNext()) { @@ -437,7 +437,7 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) DelRows = Cardinality(g); // This will delete the whole file - strcpy(opmode, "wb"); + snprintf(opmode, sizeof(opmode), "wb"); break; } // endif @@ -445,7 +445,7 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); - strcpy(opmode, (UseTemp) ? "rb" : "r+b"); + snprintf(opmode, sizeof(opmode), (UseTemp) ? "rb" : "r+b"); break; case MODE_INSERT: if (MaxBlk) { @@ -453,11 +453,11 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) if (MakeEmptyFile(g, To_File)) return true; - strcpy(opmode, "r+b"); // Required to update empty blocks + snprintf(opmode, sizeof(opmode), "r+b"); // Required to update empty blocks } else if (!Block || Last == Nrec) - strcpy(opmode, "ab"); + snprintf(opmode, sizeof(opmode), "ab"); else - strcpy(opmode, "r+b"); // Required to update the last block + snprintf(opmode, sizeof(opmode), "r+b"); // Required to update the last block break; default: @@ -1912,7 +1912,7 @@ bool VECFAM::OpenTableFile(PGLOBAL g) /*********************************************************************/ switch (mode) { case MODE_READ: - strcpy(opmode, "rb"); + snprintf(opmode, sizeof(opmode), "rb"); break; case MODE_DELETE: if (!Tdbp->GetNext()) { @@ -1920,7 +1920,7 @@ bool VECFAM::OpenTableFile(PGLOBAL g) DelRows = Cardinality(g); // This will delete the whole file - strcpy(opmode, "wb"); + snprintf(opmode, sizeof(opmode), "wb"); // This will stop the process by causing GetProgMax to return 0. ResetTableSize(g, 0, Nrec); @@ -1931,10 +1931,10 @@ bool VECFAM::OpenTableFile(PGLOBAL g) /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); - strcpy(opmode, (UseTemp) ? "rb": "r+b"); + snprintf(opmode, sizeof(opmode), (UseTemp) ? "rb": "r+b"); break; case MODE_INSERT: - strcpy(opmode, "ab"); + snprintf(opmode, sizeof(opmode), "ab"); break; default: snprintf(g->Message, sizeof(g->Message), MSG(BAD_OPEN_MODE), mode); diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index 40926cd2ae7..7859e974294 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -152,7 +152,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) /*********************************************************************/ /* pat is a multiple file name with wildcard characters */ /*********************************************************************/ - strcpy(filename, pat); + snprintf(filename, sizeof(filename), "%s", pat); #if defined(_WIN32) int rc; @@ -174,7 +174,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) snprintf(g->Message, sizeof(g->Message), MSG(BAD_FILE_HANDLE), filename); return true; } else { - strcpy(g->Message, "Cannot find any file to load"); + snprintf(g->Message, sizeof(g->Message), "Cannot find any file to load"); return true; } // endif rc @@ -208,7 +208,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) // Close the search handle. if (!FindClose(hSearch)) { - strcpy(g->Message, MSG(SRCH_CLOSE_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(SRCH_CLOSE_ERR)); return true; } // endif FindClose @@ -402,7 +402,7 @@ bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, PCSZ fn, bool append) return true; } else { - strcpy(g->Message, "Only INSERT mode supported for ZIPPING files"); + snprintf(g->Message, sizeof(g->Message), "Only INSERT mode supported for ZIPPING files"); return true; } // endif mode @@ -610,7 +610,7 @@ int UNZIPUTL::findEntry(PGLOBAL g, bool next) next = true; } while (true); - strcpy(g->Message, "FindNext logical error"); + snprintf(g->Message, sizeof(g->Message), "FindNext logical error"); return RC_FX; } // end of FindEntry @@ -703,7 +703,7 @@ bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, PCSZ fn) return true; } else { - strcpy(g->Message, "Only READ mode supported for ZIPPED tables"); + snprintf(g->Message, sizeof(g->Message), "Only READ mode supported for ZIPPED tables"); return true; } // endif mode @@ -755,7 +755,7 @@ bool UNZIPUTL::openEntry(PGLOBAL g) try { memory = new char[size + 1]; } catch (...) { - strcpy(g->Message, "Out of memory"); + snprintf(g->Message, sizeof(g->Message), "Out of memory"); return true; } // end try/catch @@ -1130,16 +1130,16 @@ int UZDFAM::dbfhead(PGLOBAL g, void* buf) // Check first byte to be sure of .dbf type if ((hdrp->Version & 0x03) != DBFTYPE) { - strcpy(g->Message, MSG(NOT_A_DBF_FILE)); + snprintf(g->Message, sizeof(g->Message), MSG(NOT_A_DBF_FILE)); rc = RC_INFO; if ((hdrp->Version & 0x30) == 0x30) { - strcpy(g->Message, MSG(FOXPRO_FILE)); + snprintf(g->Message, sizeof(g->Message), MSG(FOXPRO_FILE)); dbc = 264; // FoxPro database container } // endif Version } else - strcpy(g->Message, MSG(DBASE_FILE)); + snprintf(g->Message, sizeof(g->Message), MSG(DBASE_FILE)); // Check last byte(s) of header endmark = (char*)hdrp + hdrp->Headlen() - dbc; @@ -1304,13 +1304,13 @@ bool ZIPFAM::OpenTableFile(PGLOBAL g) if (len < 0) return true; else if (!append && len > 0) { - strcpy(g->Message, "No insert into existing zip file"); + snprintf(g->Message, sizeof(g->Message), "No insert into existing zip file"); return true; } else if (append && len > 0) { UNZIPUTL *zutp = new(g) UNZIPUTL(target, NULL, false); if (!zutp->IsInsertOk(g, filename)) { - strcpy(g->Message, "No insert into existing entry"); + snprintf(g->Message, sizeof(g->Message), "No insert into existing entry"); return true; } // endif Ok @@ -1337,7 +1337,7 @@ bool ZIPFAM::OpenTableFile(PGLOBAL g) /***********************************************************************/ int ZIPFAM::ReadBuffer(PGLOBAL g) { - strcpy(g->Message, "ReadBuffer should not been called when zipping"); + snprintf(g->Message, sizeof(g->Message), "ReadBuffer should not been called when zipping"); return RC_FX; } // end of ReadBuffer @@ -1388,13 +1388,13 @@ bool ZPXFAM::OpenTableFile(PGLOBAL g) if (len < 0) return true; else if (!append && len > 0) { - strcpy(g->Message, "No insert into existing zip file"); + snprintf(g->Message, sizeof(g->Message), "No insert into existing zip file"); return true; } else if (append && len > 0) { UNZIPUTL *zutp = new(g) UNZIPUTL(target, NULL, false); if (!zutp->IsInsertOk(g, filename)) { - strcpy(g->Message, "No insert into existing entry"); + snprintf(g->Message, sizeof(g->Message), "No insert into existing entry"); return true; } // endif Ok diff --git a/storage/connect/filter.cpp b/storage/connect/filter.cpp index a3f75304a47..82d879ab082 100644 --- a/storage/connect/filter.cpp +++ b/storage/connect/filter.cpp @@ -386,7 +386,7 @@ int FILTER::CheckColumn(PGLOBAL g, PSQL sqlp, PXOB &p, int &ag) } // endfor i if (*errmsg) { - strcpy(g->Message, errmsg); + snprintf(g->Message, sizeof(g->Message), errmsg); return -1; } else return n; @@ -993,7 +993,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) break; case TYPE_ARRAY: if ((Opc != OP_IN && !Opm) || i == 0) { - strcpy(g->Message, MSG(BAD_ARRAY_OPER)); + snprintf(g->Message, sizeof(g->Message), MSG(BAD_ARRAY_OPER)); return TRUE; } // endif @@ -1007,7 +1007,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) goto TEST; // Filter has only one argument } // endif i - strcpy(g->Message, MSG(VOID_FIRST_ARG)); + snprintf(g->Message, sizeof(g->Message), MSG(VOID_FIRST_ARG)); return TRUE; } // endswitch @@ -1052,7 +1052,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) } // endif Opc if (comtype == TYPE_ERROR) { - strcpy(g->Message, MSG(ILL_FILTER_CONV)); + snprintf(g->Message, sizeof(g->Message), MSG(ILL_FILTER_CONV)); return TRUE; } // endif @@ -1101,7 +1101,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) break; case TYPE_FILTER: - strcpy(g->Message, MSG(UNMATCH_FIL_ARG)); + snprintf(g->Message, sizeof(g->Message), MSG(UNMATCH_FIL_ARG)); return TRUE; default: // Conversion from Column, Select/Func, Expr, Scalfnc... @@ -1270,7 +1270,7 @@ bool FILTER::Eval(PGLOBAL g) ap = (PARRAY)Arg(1); break; default: - strcpy(g->Message, MSG(IN_WITHOUT_SUB)); + snprintf(g->Message, sizeof(g->Message), MSG(IN_WITHOUT_SUB)); goto FilterError; } // endswitch Type diff --git a/storage/connect/fmdlex.c b/storage/connect/fmdlex.c index 1bca2d4ec18..165913a9698 100644 --- a/storage/connect/fmdlex.c +++ b/storage/connect/fmdlex.c @@ -1480,7 +1480,7 @@ void MakeAMPM(int n) n, pp->Num, pp->InFmt, pp->OutFmt); #endif pp->Index[pp->Num++] = -n; - sprintf(buf, "%%%ds", m); + snprintf(buf, sizeof(buf), "%%%ds", m); MakeIn(buf); if (pp->OutFmt) { diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 0a0a206c9c8..0e91742b1fa 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -1868,7 +1868,7 @@ bool ha_connect::CheckVirtualIndex(TABLE_SHARE *s) rid= (fp->option_struct) ? fp->option_struct->special : NULL; if (!rid || (stricmp(rid, "ROWID") && stricmp(rid, "ROWNUM"))) { - strcpy(g->Message, "Invalid virtual index"); + snprintf(g->Message, sizeof(g->Message), "Invalid virtual index"); return true; } // endif rowid @@ -2014,7 +2014,7 @@ int ha_connect::OpenTable(PGLOBAL g, bool del) case MODE_INSERT: case MODE_UPDATE: case MODE_DELETE: - strcpy(g->Message, MSG(READ_ONLY)); + snprintf(g->Message, sizeof(g->Message), MSG(READ_ONLY)); return HA_ERR_TABLE_READONLY; default: break; @@ -2143,7 +2143,7 @@ bool ha_connect::CheckColumnList(PGLOBAL g) htrc("Exception %d: %s\n", n, g->Message); brc= true; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); brc= true; } // end catch @@ -2512,7 +2512,7 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, ranges[1]= (end_range && !eq_range) ? &save_end_range : NULL; if (!ranges[0] && !ranges[1]) { - strcpy(g->Message, "MakeKeyWhere: No key"); + snprintf(g->Message, sizeof(g->Message), "MakeKeyWhere: No key"); return true; } else both= ranges[0] && ranges[1]; @@ -2611,7 +2611,7 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, qry->Append(')'); if ((oom= qry->IsTruncated())) - strcpy(g->Message, "Out of memory"); + snprintf(g->Message, sizeof(g->Message), "Out of memory"); dbug_tmp_restore_column_map(&table->write_set, old_map); return oom; @@ -3385,7 +3385,7 @@ const COND *ha_connect::cond_push(const COND *cond) if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch fin:; @@ -3611,7 +3611,7 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT*) htrc("Exception %d: %s\n", n, g->Message); rc= HA_ERR_INTERNAL_ERROR; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); rc= HA_ERR_INTERNAL_ERROR; } // end catch @@ -4711,7 +4711,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, break; default: htrc("Unsupported sql_command=%d\n", thd_sql_command(thd)); - strcpy(g->Message, "CONNECT Unsupported command"); + snprintf(g->Message, sizeof(g->Message), "CONNECT Unsupported command"); my_message(ER_NOT_ALLOWED_COMMAND, g->Message, MYF(0)); newmode= MODE_ERROR; break; @@ -4769,7 +4769,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, break; default: htrc("Unsupported sql_command=%d\n", thd_sql_command(thd)); - strcpy(g->Message, "CONNECT Unsupported command"); + snprintf(g->Message, sizeof(g->Message), "CONNECT Unsupported command"); my_message(ER_NOT_ALLOWED_COMMAND, g->Message, MYF(0)); newmode= MODE_ERROR; break; @@ -5024,7 +5024,7 @@ int ha_connect::external_lock(THD *thd, int lock_type) xmod= MODE_ANY; // For info commands DBUG_RETURN(rc); } else if (check_privileges(thd, options, table->s->db.str)) { - strcpy(g->Message, "This operation requires the FILE privilege"); + snprintf(g->Message, sizeof(g->Message), "This operation requires the FILE privilege"); htrc("%s\n", g->Message); DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif check_privileges @@ -5378,7 +5378,7 @@ bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, PCSZ host, else if (port && port != (signed)GetDefaultPort()) return false; - strcpy(g->Message, "This MySQL table is defined on itself"); + snprintf(g->Message, sizeof(g->Message), "This MySQL table is defined on itself"); return true; } // end of CheckSelf @@ -5721,7 +5721,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, } else if (topt->http) { if (ttp == TAB_UNDEF) { ttr= TAB_JSON; - strcpy(g->Message, "No table_type. Was set to JSON"); + snprintf(g->Message, sizeof(g->Message), "No table_type. Was set to JSON"); push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message); } else ttr= ttp; @@ -5754,7 +5754,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, case TAB_BSON: #endif // BSON_SUPPORT if (checkPrivileges(thd, ttp, topt, db)) { - strcpy(g->Message, "This operation requires the FILE privilege"); + snprintf(g->Message, sizeof(g->Message), "This operation requires the FILE privilege"); rc= HA_ERR_INTERNAL_ERROR; goto err; } // endif check_privileges @@ -5770,7 +5770,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, char *p; if (!tbl) { - strcpy(g->Message, "Missing table list"); + snprintf(g->Message, sizeof(g->Message), "Missing table list"); rc= HA_ERR_INTERNAL_ERROR; goto err; } // endif tbl @@ -5828,7 +5828,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, if (fnc & FNC_DRIVER) { ok= true; } else if (!(url= strz(g, create_info->connect_string))) { - strcpy(g->Message, "Missing URL"); + snprintf(g->Message, sizeof(g->Message), "Missing URL"); } else { // Store JDBC additional parameters int rc; @@ -5932,7 +5932,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, if (topt->module && topt->subtype) ok= true; else - strcpy(g->Message, "Missing OEM module or subtype"); + snprintf(g->Message, sizeof(g->Message), "Missing OEM module or subtype"); break; #if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) @@ -5984,7 +5984,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, } // endif supfnc if (src && fnc != FNC_NO) { - strcpy(g->Message, "Cannot make catalog table from srcdef"); + snprintf(g->Message, sizeof(g->Message), "Cannot make catalog table from srcdef"); ok= false; } // endif src @@ -6136,7 +6136,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, qrp= OEMColumns(g, topt, tab, (char*)db, fnc == FNC_COL); break; default: - strcpy(g->Message, "System error during assisted discovery"); + snprintf(g->Message, sizeof(g->Message), "System error during assisted discovery"); break; } // endswitch ttp @@ -6380,7 +6380,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, htrc("Exception %d: %s\n", n, g->Message); rc= HA_ERR_INTERNAL_ERROR; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); rc= HA_ERR_INTERNAL_ERROR; } // end catch @@ -6538,7 +6538,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, case TAB_PIVOT: case TAB_OCCUR: if (options->srcdef) { - strcpy(g->Message, "Cannot check looping reference"); + snprintf(g->Message, sizeof(g->Message), "Cannot check looping reference"); push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message); } else if (options->tabname) { if (!stricmp(options->tabname, create_info->alias.str) && @@ -6551,7 +6551,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, } // endif tab } else { - strcpy(g->Message, "Missing object table name or definition"); + snprintf(g->Message, sizeof(g->Message), "Missing object table name or definition"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif tabname @@ -6629,14 +6629,14 @@ int ha_connect::create(const char *name, TABLE *table_arg, #if !defined(DOMDOC_SUPPORT) if (dom) { - strcpy(g->Message, "MS-DOM not supported by this version"); + snprintf(g->Message, sizeof(g->Message), "MS-DOM not supported by this version"); xsup= NULL; } // endif DomDoc #endif // !DOMDOC_SUPPORT #if !defined(LIBXML2_SUPPORT) if (!dom) { - strcpy(g->Message, "libxml2 not supported by this version"); + snprintf(g->Message, sizeof(g->Message), "libxml2 not supported by this version"); xsup= NULL; } // endif Libxml2 #endif // !LIBXML2_SUPPORT @@ -6681,7 +6681,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, continue; // This is a virtual column if (fp->flags & AUTO_INCREMENT_FLAG) { - strcpy(g->Message, "Auto_increment is not supported yet"); + snprintf(g->Message, sizeof(g->Message), "Auto_increment is not supported yet"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_INTERNAL_ERROR; DBUG_RETURN(rc); @@ -6697,7 +6697,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, if (type == TAB_VIR) if (!fp->option_struct || !fp->option_struct->special) { - strcpy(g->Message, "Virtual tables accept only special or virtual columns"); + snprintf(g->Message, sizeof(g->Message), "Virtual tables accept only special or virtual columns"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_INTERNAL_ERROR; DBUG_RETURN(rc); @@ -6915,7 +6915,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, // This is an ALTER to CONNECT from another engine. // It cannot be accepted because the table data would be modified // except when the target file does not exist. - strcpy(g->Message, "Operation denied. Table data would be modified."); + snprintf(g->Message, sizeof(g->Message), "Operation denied. Table data would be modified."); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif part_info @@ -6925,11 +6925,11 @@ int ha_connect::create(const char *name, TABLE *table_arg, // Get the index definitions if ((xdp= GetIndexInfo()) || sqlcom == SQLCOM_DROP_INDEX) { if (options->multiple) { - strcpy(g->Message, "Multiple tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "Multiple tables are not indexable"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_UNSUPPORTED; } else if (options->compressed) { - strcpy(g->Message, "Compressed tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "Compressed tables are not indexable"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_UNSUPPORTED; } else if (GetIndexType(type) == 1) { @@ -7210,11 +7210,11 @@ ha_connect::check_if_supported_inplace_alter(TABLE *altered_table, !SameString(altered_table, "optname") || !SameBool(altered_table, "sepindex")) { if (newopt->multiple) { - strcpy(g->Message, "Multiple tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "Multiple tables are not indexable"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ALTER_ERROR); } else if (newopt->compressed) { - strcpy(g->Message, "Compressed tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "Compressed tables are not indexable"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ALTER_ERROR); } else if (GetIndexType(type) == 1) { @@ -7265,7 +7265,7 @@ ha_connect::check_if_supported_inplace_alter(TABLE *altered_table, tshp= NULL; if (FileExists(fn, false)) { - strcpy(g->Message, "Operation denied. Table data would be lost."); + snprintf(g->Message, sizeof(g->Message), "Operation denied. Table data would be lost."); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ALTER_ERROR); } else diff --git a/storage/connect/javaconn.cpp b/storage/connect/javaconn.cpp index 3d1dfbc3f26..6078d51517f 100644 --- a/storage/connect/javaconn.cpp +++ b/storage/connect/javaconn.cpp @@ -167,7 +167,7 @@ bool JAVAConn::gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig mid = env->GetMethodID(jdi, name, sig); if (Check()) { - strcpy(g->Message, Msg); + snprintf(g->Message, sizeof(g->Message), Msg); return true; } else return false; @@ -372,7 +372,7 @@ bool JAVAConn::Open(PGLOBAL g) rc = jvm->AttachCurrentThread((void**)&env, nullptr); if (rc != JNI_OK) { - strcpy(g->Message, "Cannot attach jvm to the current thread"); + snprintf(g->Message, sizeof(g->Message), "Cannot attach jvm to the current thread"); return true; } // endif rc @@ -456,26 +456,26 @@ bool JAVAConn::Open(PGLOBAL g) switch (rc) { case JNI_OK: - strcpy(g->Message, "VM successfully created"); + snprintf(g->Message, sizeof(g->Message), "VM successfully created"); brc = false; break; case JNI_ERR: - strcpy(g->Message, "Initialising JVM failed: unknown error"); + snprintf(g->Message, sizeof(g->Message), "Initialising JVM failed: unknown error"); break; case JNI_EDETACHED: - strcpy(g->Message, "Thread detached from the VM"); + snprintf(g->Message, sizeof(g->Message), "Thread detached from the VM"); break; case JNI_EVERSION: - strcpy(g->Message, "JNI version error"); + snprintf(g->Message, sizeof(g->Message), "JNI version error"); break; case JNI_ENOMEM: - strcpy(g->Message, "Not enough memory"); + snprintf(g->Message, sizeof(g->Message), "Not enough memory"); break; case JNI_EEXIST: - strcpy(g->Message, "VM already created"); + snprintf(g->Message, sizeof(g->Message), "VM already created"); break; case JNI_EINVAL: - strcpy(g->Message, "Invalid arguments"); + snprintf(g->Message, sizeof(g->Message), "Invalid arguments"); break; default: snprintf(g->Message, sizeof(g->Message), "Unknown return code %d", (int)rc); @@ -516,7 +516,7 @@ bool JAVAConn::Open(PGLOBAL g) rc = env->CallStaticIntMethod(jdi, alp, path); if ((msg = Check(rc))) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), msg); env->DeleteLocalRef(path); return RC_FX; } else switch (rc) { @@ -528,7 +528,7 @@ bool JAVAConn::Open(PGLOBAL g) break; case JNI_ERR: default: - strcpy(g->Message, "Error adding jpath"); + snprintf(g->Message, sizeof(g->Message), "Error adding jpath"); env->DeleteLocalRef(path); return RC_FX; } // endswitch rc @@ -559,7 +559,7 @@ bool JAVAConn::Open(PGLOBAL g) errid = env->GetMethodID(jdi, "GetErrmsg", "()Ljava/lang/String;"); if (env->ExceptionCheck()) { - strcpy(g->Message, "ERROR: method GetErrmsg() not found!"); + snprintf(g->Message, sizeof(g->Message), "ERROR: method GetErrmsg() not found!"); env->ExceptionDescribe(); env->ExceptionClear(); return true; diff --git a/storage/connect/jdbconn.cpp b/storage/connect/jdbconn.cpp index 09786f28beb..b1cffa0a77e 100644 --- a/storage/connect/jdbconn.cpp +++ b/storage/connect/jdbconn.cpp @@ -879,11 +879,11 @@ int JDBConn::ExecuteCommand(PCSZ sql) snprintf(g->Message, sizeof(g->Message), "GetResult: %s", Msg); rc = RC_FX; } else if (m_Ncol) { - strcpy(g->Message, "Result set column number"); + snprintf(g->Message, sizeof(g->Message), "Result set column number"); rc = RC_OK; // A result set was returned } else { m_Aff = (int)n; // Affected rows - strcpy(g->Message, "Affected rows"); + snprintf(g->Message, sizeof(g->Message), "Affected rows"); rc = RC_NF; } // endif ncol @@ -903,7 +903,7 @@ int JDBConn::Fetch(int pos) if (pos) { if (!m_Scrollable) { - strcpy(g->Message, "Cannot fetch(pos) if FORWARD ONLY"); + snprintf(g->Message, sizeof(g->Message), "Cannot fetch(pos) if FORWARD ONLY"); return rc; } else if (gmID(m_G, fetchid, "Fetch", "(I)Z")) return rc; @@ -1232,7 +1232,7 @@ int JDBConn::ExecuteSQL(void) jint n = env->CallIntMethod(job, xpid); if (n == -3) - strcpy(g->Message, "SQL statement is not prepared"); + snprintf(g->Message, sizeof(g->Message), "SQL statement is not prepared"); else if (Check(n)) snprintf(g->Message, sizeof(g->Message), "ExecutePrep: %s", Msg); else { @@ -1315,17 +1315,17 @@ bool JDBConn::SetParam(JDBCCOL *colp) break; case TYPE_DATE: if ((dat = env->FindClass("java/sql/Timestamp")) == nullptr) { - strcpy(g->Message, "Cannot find Timestamp class"); + snprintf(g->Message, sizeof(g->Message), "Cannot find Timestamp class"); return true; } else if (!(dtc = env->GetMethodID(dat, "", "(J)V"))) { - strcpy(g->Message, "Cannot find Timestamp class constructor"); + snprintf(g->Message, sizeof(g->Message), "Cannot find Timestamp class constructor"); return true; } // endif's lg = (jlong)val->GetBigintValue() * 1000; if ((datobj = env->NewObject(dat, dtc, lg)) == nullptr) { - strcpy(g->Message, "Cannot make Timestamp object"); + snprintf(g->Message, sizeof(g->Message), "Cannot make Timestamp object"); return true; } else if (gmID(g, setid, "SetTimestampParm", "(ILjava/sql/Timestamp;)V")) return true; @@ -1416,12 +1416,12 @@ bool JDBConn::SetParam(JDBCCOL *colp) int rc = ExecuteCommand(src); if (rc == RC_NF) { - strcpy(g->Message, "Srcdef is not returning a result set"); + snprintf(g->Message, sizeof(g->Message), "Srcdef is not returning a result set"); return NULL; } else if ((rc) == RC_FX) { return NULL; } else if (m_Ncol == 0) { - strcpy(g->Message, "Invalid Srcdef"); + snprintf(g->Message, sizeof(g->Message), "Invalid Srcdef"); return NULL; } // endif's @@ -1463,7 +1463,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) if (Check()) snprintf(g->Message, sizeof(g->Message), "ColumnDesc: %s", Msg); else - strcpy(g->Message, "No result metadata"); + snprintf(g->Message, sizeof(g->Message), "No result metadata"); env->ReleaseIntArrayElements(val, n, 0); return NULL; @@ -1568,7 +1568,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) // n because we no more ignore the first column if ((n = qrp->Nbcol) > (uint)ncol) { - strcpy(g->Message, MSG(COL_NUM_MISM)); + snprintf(g->Message, sizeof(g->Message), MSG(COL_NUM_MISM)); return -1; } // endif n @@ -1638,7 +1638,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) PQRYRES qrp; if (!m_Rows) { - strcpy(g->Message, "Void result"); + snprintf(g->Message, sizeof(g->Message), "Void result"); return NULL; } // endif m_Rows diff --git a/storage/connect/jmgoconn.cpp b/storage/connect/jmgoconn.cpp index f527eb83dfe..16f472ea084 100644 --- a/storage/connect/jmgoconn.cpp +++ b/storage/connect/jmgoconn.cpp @@ -264,7 +264,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, p = strrchr(Options, ']'); if (!p) { - strcpy(g->Message, "Missing ] in pipeline"); + snprintf(g->Message, sizeof(g->Message), "Missing ] in pipeline"); return true; } else *(char*)p = 0; @@ -275,7 +275,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, s->Append(",{\"$match\":"); if (MakeSelector(g, filp, s)) { - strcpy(g->Message, "Failed making selector"); + snprintf(g->Message, sizeof(g->Message), "Failed making selector"); return true; } else s->Append('}'); @@ -343,7 +343,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, s->Append(','); if (MakeSelector(g, filp, s)) { - strcpy(g->Message, "Failed making selector"); + snprintf(g->Message, sizeof(g->Message), "Failed making selector"); return true; } // endif Selector diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 6b1da3af628..f4338a146bf 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -164,7 +164,7 @@ PJSON ParseJson(PGLOBAL g, char* s, size_t len, int* ptyp, bool* comma) htrc("ParseJson: s=%.10s len=%zd\n", s, len); if (!s || !len) { - strcpy(g->Message, "Void JSON object"); + snprintf(g->Message, sizeof(g->Message), "Void JSON object"); return NULL; } else if (comma) *comma = false; @@ -247,7 +247,7 @@ PJSON ParseJson(PGLOBAL g, char* s, size_t len, int* ptyp, bool* comma) htrc("Exception %d: %s\n", n, g->Message); jsp = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); jsp = NULL; } // end catch @@ -271,7 +271,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) { jdp->dfp = GetDefaultPrec(); if (!jsp) { - safe_strcpy(g->Message, sizeof(g->Message), "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); throw 1; } else if (!fn) { // Serialize to a string @@ -307,20 +307,25 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) { err = jdp->SerializeValue((PJVAL)jsp); break; default: - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } // endswitch Type if (fs) { fputs(EL, fs); fclose(fs); - str = (err) ? NULL : strcpy(g->Message, "Ok"); + if(err) { + str = NULL; + } else { + snprintf(g->Message, sizeof(g->Message), "Ok"); + str = g->Message; + } } else if (!err) { str = ((JOUTSTR*)jp)->Strp; jp->WriteChr('\0'); PlugSubAlloc(g, NULL, ((JOUTSTR*)jp)->N); } else { if (!g->Message[0]) - strcpy(g->Message, "Error in Serialize"); + snprintf(g->Message, sizeof(g->Message), "Error in Serialize"); } // endif's @@ -329,7 +334,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) { htrc("Exception %d: %s\n", n, g->Message); str = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); str = NULL; } // end catch @@ -553,7 +558,7 @@ PJAR JDOC::ParseAsArray(PGLOBAL g, int& i, int pretty, int *ptyp) return jsp; } else - strcpy(g->Message, "More than one item in file"); + snprintf(g->Message, sizeof(g->Message), "More than one item in file"); return NULL; } // end of ParseAsArray @@ -672,7 +677,7 @@ PJOB JDOC::ParseObject(PGLOBAL g, int& i) throw 2; }; // endswitch s[i] - strcpy(g->Message, "Unexpected EOF in Object"); + snprintf(g->Message, sizeof(g->Message), "Unexpected EOF in Object"); throw 2; } // end of ParseObject @@ -1179,7 +1184,7 @@ PSZ JOBJECT::GetText(PGLOBAL g, PSTRG text) bool JOBJECT::Merge(PGLOBAL g, PJSON jsp) { if (jsp->GetType() != TYPE_JOB) { - strcpy(g->Message, "Second argument is not an object"); + snprintf(g->Message, sizeof(g->Message), "Second argument is not an object"); return true; } // endif Type @@ -1353,7 +1358,7 @@ PJVAL JARRAY::AddArrayValue(PGLOBAL g, PJVAL jvp, int *x) bool JARRAY::Merge(PGLOBAL g, PJSON jsp) { if (jsp->GetType() != TYPE_JAR) { - strcpy(g->Message, "Second argument is not an array"); + snprintf(g->Message, sizeof(g->Message), "Second argument is not an array"); return true; } // endif Type diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index bc75f80bcc5..26f3688fc15 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -172,7 +172,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) case '!': jnp->Op = OP_SEP; break; // Average case '#': jnp->Op = OP_NUM; break; case '*': // Expand this array - strcpy(g->Message, "Expand not supported by this function"); + snprintf(g->Message, sizeof(g->Message), "Expand not supported by this function"); return true; default: snprintf(g->Message, sizeof(g->Message), "Invalid function specification %c", *p); @@ -194,7 +194,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) } // endif n } else { - strcpy(g->Message, "Wrong array specification"); + snprintf(g->Message, sizeof(g->Message), "Wrong array specification"); return true; } // endif's @@ -355,10 +355,10 @@ PJVAL JSNX::MakeJson(PGLOBAL g, PJSON jsp, int n) Jb = false; if (Value->IsTypeNum()) { - strcpy(g->Message, "Cannot make Json for a numeric value"); + snprintf(g->Message, sizeof(g->Message), "Cannot make Json for a numeric value"); return NULL; } else if (jsp->GetType() != TYPE_JAR && jsp->GetType() != TYPE_JOB) { - strcpy(g->Message, "Target is not an array or object"); + snprintf(g->Message, sizeof(g->Message), "Target is not an array or object"); return NULL; } else if (n < Nod -1) { if (jsp->GetType() == TYPE_JAR) { @@ -447,7 +447,7 @@ PJVAL JSNX::GetRowValue(PGLOBAL g, PJSON row, int i, my_bool b) val = new(g)JVALUE(row); } else { - strcpy(g->Message, "Unexpected object"); + snprintf(g->Message, sizeof(g->Message), "Unexpected object"); val = NULL; } //endif Op @@ -497,7 +497,7 @@ PJVAL JSNX::GetRowValue(PGLOBAL g, PJSON row, int i, my_bool b) /*********************************************************************************/ PVAL JSNX::ExpandArray(PGLOBAL g, PJAR arp, int n) { - strcpy(g->Message, "Expand cannot be done by this function"); + snprintf(g->Message, sizeof(g->Message), "Expand cannot be done by this function"); return NULL; } // end of ExpandArray @@ -783,7 +783,7 @@ PJSON JSNX::GetRow(PGLOBAL g) ((PJAR)row)->AddArrayValue(g, new(g)JVALUE(nwr)); ((PJAR)row)->InitArray(g); } else { - strcpy(g->Message, "Wrong type when writing new row"); + snprintf(g->Message, sizeof(g->Message), "Wrong type when writing new row"); nwr = NULL; } // endif's @@ -816,7 +816,7 @@ my_bool JSNX::WriteValue(PGLOBAL g, PJVAL jvalp) case TYPE_JAR: arp = (PJAR)row; break; case TYPE_JVAL: jvp = (PJVAL)row; break; default: - strcpy(g->Message, "Invalid target type"); + snprintf(g->Message, sizeof(g->Message), "Invalid target type"); return true; } // endswitch Type @@ -851,7 +851,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) g->Message[0] = 0; if (!jsp) { - strcpy(g->Message, "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); return NULL; } // endif jsp @@ -878,7 +878,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) if (err) { if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } else if (Found) { Jp->WriteChr('\0'); @@ -892,7 +892,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) PUSH_WARNING(g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return str; @@ -972,7 +972,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) PJPN jnp; if (!jsp) { - strcpy(g->Message, "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); return NULL; } // endif jsp @@ -1011,7 +1011,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) PlugSubAlloc(g, NULL, Jp->N); str = Jp->Strp; } else if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } catch (int n) { if (trace(1)) @@ -1019,7 +1019,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) PUSH_WARNING(g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return str; @@ -1402,7 +1402,7 @@ static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON jsp, PJVAL& jvp, int n } // endif jvp } else { - strcpy(g->Message, "Path argument is null"); + snprintf(g->Message, sizeof(g->Message), "Path argument is null"); return true; } // endif path @@ -1750,7 +1750,7 @@ my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n, char errmsg[MAX_STR]; snprintf(errmsg, sizeof(errmsg) - 1, MSG(WORK_AREA), g->Message); - strcpy(g->Message, errmsg); + snprintf(g->Message, sizeof(g->Message), "%s", errmsg); return true; } // endif SareaAlloc @@ -3620,7 +3620,7 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); str = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); str = NULL; } // end catch @@ -3980,7 +3980,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, *error = 1; path = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; @@ -4106,7 +4106,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, *error = 1; path = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; @@ -4379,7 +4379,7 @@ char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); str = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); str = NULL; } // end catch @@ -6187,7 +6187,7 @@ bool JUP::unPretty(PGLOBAL g, int lrecl) { htrc("UnPretty: s=%.10s len=%zd lrecl=%d\n", s, len, lrecl); if (!s || !len) { - strcpy(g->Message, "Void JSON file"); + snprintf(g->Message, sizeof(g->Message), "Void JSON file"); return true; } else if (*s != '[') { // strcpy(g->Message, "JSON file is not an array"); @@ -6250,7 +6250,7 @@ bool JUP::unPretty(PGLOBAL g, int lrecl) { htrc("Exception %d: %s\n", n, g->Message); rc = true; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); rc = true; } // end catch diff --git a/storage/connect/macutil.cpp b/storage/connect/macutil.cpp index fd85210ac91..99b2cce8ade 100644 --- a/storage/connect/macutil.cpp +++ b/storage/connect/macutil.cpp @@ -57,12 +57,11 @@ void MACINFO::MakeErrorMsg(PGLOBAL g, DWORD drc) "GetAdaptersInfo: Buffer Overflow buflen=%d nbofadap=%d", Buflen, N); else if (drc == ERROR_INVALID_PARAMETER) - strcpy(g->Message, "GetAdaptersInfo: Invalid parameters"); + snprintf(g->Message, sizeof(g->Message), "GetAdaptersInfo: Invalid parameters"); else if (drc == ERROR_NO_DATA) - strcpy(g->Message, - "No adapter information exists for the local computer"); + snprintf(g->Message, sizeof(g->Message), "No adapter information exists for the local computer"); else if (drc == ERROR_NOT_SUPPORTED) - strcpy(g->Message, "GetAdaptersInfo is not supported"); + snprintf(g->Message, sizeof(g->Message), "GetAdaptersInfo is not supported"); else FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index e83f1b5f04c..9f23ace8ade 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -1155,7 +1155,7 @@ int ODBConn::Open(PCSZ ConnectString, POPARM sop, DWORD options) if (!m_UseCnc) { if (DriverConnect(options)) { - strcpy(g->Message, MSG(CONNECT_CANCEL)); + snprintf(g->Message, sizeof(g->Message), MSG(CONNECT_CANCEL)); return 0; } // endif @@ -1480,7 +1480,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) ThrowDBX(rc, "SQLNumResultCols", hstmt); if (ncol == 0) { - strcpy(g->Message, "This Srcdef does not return a result set"); + snprintf(g->Message, sizeof(g->Message), "This Srcdef does not return a result set"); return -1; } // endif ncol @@ -1523,7 +1523,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) tp = GetSQLCType(colp->GetResultType()); if (tp == SQL_TYPE_NULL) { - sprintf(m_G->Message, MSG(INV_COLUMN_TYPE), + snprintf(m_G->Message, sizeof(m_G->Message), MSG(INV_COLUMN_TYPE), colp->GetResultType(), SVP(colp->GetName())); ThrowDBX(m_G->Message); } // endif tp @@ -1549,7 +1549,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); if (b) SQLCancel(hstmt); @@ -1777,7 +1777,7 @@ int ODBConn::ExecuteSQL(void) if (ncol) { // This should never happen while inserting - strcpy(g->Message, "Logical error while inserting"); + snprintf(g->Message, sizeof(g->Message), "Logical error while inserting"); } else { // Insert, Update or Delete statement if (!Check(rc = SQLRowCount(m_hstmt, &afrw))) @@ -1786,7 +1786,7 @@ int ODBConn::ExecuteSQL(void) } // endif ncol } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); SQLCancel(m_hstmt); rc = SQLFreeStmt(m_hstmt, SQL_DROP); m_hstmt = NULL; @@ -1825,7 +1825,7 @@ bool ODBConn::BindParam(ODBCCOL *colp) ThrowDBX(rc, "SQLDescribeParam", m_hstmt); } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); #endif // 0 colsize = colp->GetPrecision(); sqlt = GetSQLType(buftype); @@ -1923,10 +1923,10 @@ bool ODBConn::ExecSQLcommand(char *sql) ThrowDBX(rc, "SQLRowCount", hstmt); m_Tdb->AftRows = (int)afrw; - strcpy(g->Message, "Affected rows"); + snprintf(g->Message, sizeof(g->Message), "Affected rows"); } else { m_Tdb->AftRows = (int)ncol; - strcpy(g->Message, "Result set column number"); + snprintf(g->Message, sizeof(g->Message), "Result set column number"); } // endif ncol } catch(DBX *x) { @@ -2024,7 +2024,7 @@ PQRYRES ODBConn::GetMetaData(PGLOBAL g, PCSZ dsn, PCSZ src) } // end try/catch if (!ncol) { - strcpy(g->Message, "Invalid Srcdef"); + snprintf(g->Message, sizeof(g->Message), "Invalid Srcdef"); goto err; } // endif ncol @@ -2122,7 +2122,7 @@ bool ODBConn::GetDataSources(PQRYRES qrp) } // endfor i } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rv = true; } // end try/catch @@ -2173,7 +2173,7 @@ bool ODBConn::GetDrivers(PQRYRES qrp) } // endfor n } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rv = true; } // end try/catch @@ -2517,7 +2517,7 @@ PQRYRES ODBConn::AllocateResult(PGLOBAL g) PQRYRES qrp; if (!m_Rows) { - strcpy(g->Message, "Void result"); + snprintf(g->Message, sizeof(g->Message), "Void result"); return NULL; } // endif m_Res @@ -2596,7 +2596,7 @@ int ODBConn::Rewind(char *sql, ODBCCOL *tocols) rbuf = (int)crow; } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rbuf = -1; } // end try/catch diff --git a/storage/connect/osutil.c b/storage/connect/osutil.c index 278023f55a2..9b1771be105 100644 --- a/storage/connect/osutil.c +++ b/storage/connect/osutil.c @@ -4,6 +4,7 @@ #include #include #include "osutil.h" +#include "m_string.h" #ifdef _WIN32 my_bool CloseFileHandle(HANDLE h) @@ -140,25 +141,25 @@ char *_fullpath(char *absPath, const char *relPath, size_t maxLength) char *p; if ( *relPath == '\\' || *relPath == '/' ) { - strncpy(absPath, relPath, maxLength); + snprintf(absPath, maxLength, "%s", relPath); } else if (*relPath == '~') { // get the path to the home directory struct passwd *pw = getpwuid(getuid()); const char *homedir = pw->pw_dir; if (homedir) - strcat(strncpy(absPath, homedir, maxLength), relPath + 1); + snprintf(absPath, maxLength, "%s%s", homedir, relPath + 1); else - strncpy(absPath, relPath, maxLength); + snprintf(absPath, maxLength, "%s", relPath); } else { char buff[2*_MAX_PATH]; p= getcwd(buff, _MAX_PATH); assert(p); - strcat(buff,"/"); - strcat(buff, relPath); - strncpy(absPath, buff, maxLength); + safe_strcat(buff, sizeof(buff), "/"); + safe_strcat(buff, sizeof(buff), relPath); + snprintf(absPath, maxLength, "%s", buff); } /* endif's relPath */ p = absPath; diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index c1534eb6c2a..647d011065e 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -381,7 +381,7 @@ char *SetPath(PGLOBAL g, const char *path) return NULL; if (PlugIsAbsolutePath(path)) { - strcpy(buf, path); + snprintf(buf, len, "%s", path); return buf; } // endif path @@ -391,9 +391,9 @@ char *SetPath(PGLOBAL g, const char *path) #else // !_WIN32 const char *s = "/"; #endif // !_WIN32 - strcat(strcat(strcat(strcpy(buf, "."), s), path), s); + snprintf(buf, len, ".%s%s%s", s, path, s); } else - strcpy(buf, path); + snprintf(buf, len, "%s", path); } // endif path diff --git a/storage/connect/plugutil.cpp b/storage/connect/plugutil.cpp index 6fb40c92a1b..a39c5846225 100644 --- a/storage/connect/plugutil.cpp +++ b/storage/connect/plugutil.cpp @@ -74,6 +74,7 @@ /***********************************************************************/ #define STORAGE /* Initialize global variables */ +#include "m_string.h" #include "osutil.h" #include "global.h" #include "plgdbsem.h" @@ -329,14 +330,15 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) switch (*direc) { case '\0': - strcpy(direc, defdir); + snprintf(direc, sizeof(direc), "%s", defdir); break; case '\\': case '/': break; default: // This supposes that defdir ends with a SLASH - strcpy(direc, strcat(defdir, direc)); + safe_strcat(defdir, sizeof(defdir), direc); + snprintf(direc, sizeof(direc), "%s", defdir); } // endswitch _makepath(newname, drive, direc, fname, ftype); @@ -607,7 +609,7 @@ char *PlugDup(PGLOBAL g, const char *str) if (str) { char *sm = (char*)PlugSubAlloc(g, NULL, strlen(str) + 1); - strcpy(sm, str); + snprintf(sm, strlen(str) + 1, "%s", str); return sm; } else return NULL; diff --git a/storage/connect/tabjmg.cpp b/storage/connect/tabjmg.cpp index 06a91f57dea..ab1ed102971 100644 --- a/storage/connect/tabjmg.cpp +++ b/storage/connect/tabjmg.cpp @@ -48,7 +48,7 @@ JMGDISC::JMGDISC(PGLOBAL g, int *lg) : MGODISC(g, lg) bool JMGDISC::Init(PGLOBAL g) { if (!(Jcp = ((TDBJMG*)tmgp)->Jcp)) { - strcpy(g->Message, "Init: Jcp is NULL"); + snprintf(g->Message, sizeof(g->Message), "Init: Jcp is NULL"); return true; } else if (Jcp->gmID(g, columnid, "ColumnDesc", "(Ljava/lang/Object;I[II)Ljava/lang/Object;")) @@ -86,7 +86,7 @@ bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, jintArray val = Jcp->env->NewIntArray(5); if (val == nullptr) { - strcpy(g->Message, "Cannot allocate jint array"); + snprintf(g->Message, sizeof(g->Message), "Cannot allocate jint array"); return true; } else if (!ncol) n = Jcp->env->GetIntArrayElements(val, 0); @@ -113,7 +113,7 @@ bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, z = 65 - strlen(colname); strncat(strncat(colname, "_", z), key, z - 1); } else - strcpy(colname, key); + snprintf(colname, sizeof(colname), key); if (pfmt) { strncpy(fmt, pfmt, 128); @@ -121,7 +121,7 @@ bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, z = 129 - strlen(fmt); strncat(strncat(fmt, ".", z), key, z - 1); } else - strcpy(fmt, key); + snprintf(fmt, sizeof(fmt), key); if (!jres) { bcol.Type = n[0]; @@ -318,7 +318,7 @@ bool TDBJMG::OpenDB(PGLOBAL g) /* First opening. */ /*********************************************************************/ if (Pipe && Mode != MODE_READ) { - strcpy(g->Message, "Pipeline tables are read only"); + snprintf(g->Message, sizeof(g->Message), "Pipeline tables are read only"); return true; } // endif Pipe @@ -353,7 +353,7 @@ bool TDBJMG::OpenDB(PGLOBAL g) /***********************************************************************/ bool TDBJMG::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) { - strcpy(g->Message, "MONGO tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "MONGO tables are not indexable"); return true; } // end of ReadKey @@ -601,7 +601,7 @@ bool JMGCOL::AddValue(PGLOBAL g, bson_t *doc, char *key, bool upd) } // endswitch Buf_Type if (!rc) { - strcpy(g->Message, "Adding value failed"); + snprintf(g->Message, sizeof(g->Message), "Adding value failed"); return true; } else return false; diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 26381e347ae..f9ac029acdb 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -112,7 +112,7 @@ bool MYSQLDEF::GetServerInfo(PGLOBAL g, const char *server_name) if (!server_name || !strlen(server_name)) { DBUG_PRINT("info", ("server_name not defined!")); - strcpy(g->Message, "server_name not defined!"); + snprintf(g->Message, sizeof(g->Message), "server_name not defined!"); DBUG_RETURN(true); } // endif server_name @@ -121,7 +121,7 @@ bool MYSQLDEF::GetServerInfo(PGLOBAL g, const char *server_name) if (!(server= get_server_by_name(mem, server_name, &server_buffer))) { DBUG_PRINT("info", ("get_server_by_name returned > 0 error condition!")); /* need to come up with error handling */ - strcpy(g->Message, "get_server_by_name returned > 0 error condition!"); + snprintf(g->Message, sizeof(g->Message), "get_server_by_name returned > 0 error condition!"); DBUG_RETURN(true); } // endif server @@ -214,21 +214,21 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) char *sport, *scheme = url; if (!(Username = strstr(url, "://"))) { - strcpy(g->Message, "Connection is not an URL"); + snprintf(g->Message, sizeof(g->Message), "Connection is not an URL"); return true; } // endif User scheme[Username - scheme] = 0; if (stricmp(scheme, "mysql")) { - strcpy(g->Message, "scheme must be mysql"); + snprintf(g->Message, sizeof(g->Message), "scheme must be mysql"); return true; } // endif scheme Username += 3; if (!(Hostname = (char*)strchr(Username, '@'))) { - strcpy(g->Message, "No host specified in URL"); + snprintf(g->Message, sizeof(g->Message), "No host specified in URL"); return true; } else { *Hostname++ = 0; // End Username @@ -240,7 +240,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // Make sure there isn't an extra / if (strchr(pwd, '/')) { - strcpy(g->Message, "Syntax error in URL"); + snprintf(g->Message, sizeof(g->Message), "Syntax error in URL"); return true; } // endif @@ -256,7 +256,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // Make sure there isn't an extra / or @ */ if ((strchr(Username, '/')) || (strchr(Hostname, '@'))) { - strcpy(g->Message, "Syntax error in URL"); + snprintf(g->Message, sizeof(g->Message), "Syntax error in URL"); return true; } // endif @@ -268,7 +268,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // Make sure there's not an extra / if ((strchr(tabn, '/'))) { - strcpy(g->Message, "Syntax error in URL"); + snprintf(g->Message, sizeof(g->Message), "Syntax error in URL"); return true; } // endif / @@ -574,7 +574,7 @@ bool TDBMYSQL::MakeSelect(PGLOBAL g, bool mx) len += (mx ? 256 : 1); if (Query->IsTruncated() || Query->Resize(len)) { - strcpy(g->Message, "MakeSelect: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "MakeSelect: Out of memory"); return true; } // endif Query @@ -599,7 +599,7 @@ bool TDBMYSQL::MakeInsert(PGLOBAL g) if (Prep) { #if !defined(MYSQL_PREPARED_STATEMENTS) - strcpy(g->Message, "Prepared statements not used (not supported)"); + snprintf(g->Message, sizeof(g->Message), "Prepared statements not used (not supported)"); PushWarning(g, this); Prep = false; #endif // !MYSQL_PREPARED_STATEMENTS @@ -607,7 +607,7 @@ bool TDBMYSQL::MakeInsert(PGLOBAL g) for (colp = Columns; colp; colp = colp->GetNext()) if (colp->IsSpecial()) { - strcpy(g->Message, MSG(NO_SPEC_COL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SPEC_COL)); return true; } else { len += (strlen(colp->GetName()) + 4); @@ -664,7 +664,7 @@ bool TDBMYSQL::MakeInsert(PGLOBAL g) #endif // MYSQL_PREPARED_STATEMENTS if ((oom = Query->IsTruncated())) - strcpy(g->Message, "MakeInsert: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "MakeInsert: Out of memory"); return oom; } // end of MakeInsert @@ -706,7 +706,7 @@ bool TDBMYSQL::MakeCommand(PGLOBAL g) Query->Append(Qrystr + (p - qrystr) + strlen(name)); if (Query->IsTruncated()) { - strcpy(g->Message, "MakeCommand: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "MakeCommand: Out of memory"); return true; } else strlwr(strcpy(qrystr, Query->GetStr())); @@ -742,7 +742,7 @@ int TDBMYSQL::MakeUpdate(PGLOBAL g) && !stricmp(tab, Name)) qc = (Quoted) ? "`" : ""; else { - strcpy(g->Message, "Cannot use this UPDATE command"); + snprintf(g->Message, sizeof(g->Message), "Cannot use this UPDATE command"); return RC_FX; } // endif sscanf @@ -769,7 +769,7 @@ int TDBMYSQL::MakeDelete(PGLOBAL g) else if (sscanf(Qrystr, "%s %s %s%511c", cmd, from, tab, end) > 2) qc = (Quoted) ? "`" : ""; else { - strcpy(g->Message, "Cannot use this DELETE command"); + snprintf(g->Message, sizeof(g->Message), "Cannot use this DELETE command"); return RC_FX; } // endif sscanf @@ -934,7 +934,7 @@ bool TDBMYSQL::OpenDB(PGLOBAL g) } else if (Mode == MODE_INSERT) { if (Srcdef) { - strcpy(g->Message, "No insert into anonym views"); + snprintf(g->Message, sizeof(g->Message), "No insert into anonym views"); Myc.Close(); return true; } // endif Srcdef @@ -946,7 +946,7 @@ bool TDBMYSQL::OpenDB(PGLOBAL g) if (Nparm != n) { if (n >= 0) // Other errors return negative values - strcpy(g->Message, MSG(BAD_PARM_COUNT)); + snprintf(g->Message, sizeof(g->Message), MSG(BAD_PARM_COUNT)); } else #endif // MYSQL_PREPARED_STATEMENTS @@ -1109,7 +1109,7 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) if (To_CondFil) if (Query->Append(" AND ") || Query->Append(To_CondFil->Body)) { - strcpy(g->Message, "Readkey: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "Readkey: Out of memory"); return true; } // endif Append @@ -1184,7 +1184,7 @@ int TDBMYSQL::WriteDB(PGLOBAL g) } // endfor colp if (unlikely(Query->IsTruncated())) { - strcpy(g->Message, "WriteDB: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "WriteDB: Out of memory"); rc = RC_FX; } else { Query->RepLast(')'); @@ -1530,13 +1530,13 @@ PCMD TDBMYEXC::MakeCMD(PGLOBAL g) (To_CondFil->Op == OP_EQ || To_CondFil->Op == OP_IN)) { xcmd = To_CondFil->Cmds; } else - strcpy(g->Message, "Invalid command specification filter"); + snprintf(g->Message, sizeof(g->Message), "Invalid command specification filter"); } else - strcpy(g->Message, "No command column in select list"); + snprintf(g->Message, sizeof(g->Message), "No command column in select list"); } else if (!Srcdef) - strcpy(g->Message, "No Srcdef default command"); + snprintf(g->Message, sizeof(g->Message), "No Srcdef default command"); else xcmd = new(g) CMD(g, Srcdef); @@ -1561,7 +1561,7 @@ int TDBMYEXC::GetMaxSize(PGLOBAL) bool TDBMYEXC::OpenDB(PGLOBAL g) { if (Use == USE_OPEN) { - strcpy(g->Message, "Multiple execution is not allowed"); + snprintf(g->Message, sizeof(g->Message), "Multiple execution is not allowed"); return true; } // endif use @@ -1579,7 +1579,7 @@ bool TDBMYEXC::OpenDB(PGLOBAL g) Use = USE_OPEN; // Do it now in case we are recursively called if (Mode != MODE_READ && Mode != MODE_READX) { - strcpy(g->Message, "No INSERT/DELETE/UPDATE of MYSQL EXEC tables"); + snprintf(g->Message, sizeof(g->Message), "No INSERT/DELETE/UPDATE of MYSQL EXEC tables"); return true; } // endif Mode @@ -1626,11 +1626,11 @@ int TDBMYEXC::ReadDB(PGLOBAL g) switch (rc = Myc.ExecSQLcmd(g, Query->GetStr(), &Warnings)) { case RC_NF: AftRows = Myc.m_Afrw; - strcpy(g->Message, "Affected rows"); + snprintf(g->Message, sizeof(g->Message), "Affected rows"); break; case RC_OK: AftRows = Myc.m_Fields; - strcpy(g->Message, "Result set columns"); + snprintf(g->Message, sizeof(g->Message), "Result set columns"); break; case RC_FX: AftRows = Myc.m_Afrw; @@ -1660,7 +1660,7 @@ int TDBMYEXC::ReadDB(PGLOBAL g) /***********************************************************************/ int TDBMYEXC::WriteDB(PGLOBAL g) { - strcpy(g->Message, "EXEC MYSQL tables are read only"); + snprintf(g->Message, sizeof(g->Message), "EXEC MYSQL tables are read only"); return RC_FX; } // end of WriteDB diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index d700cff0e41..f217c8fc158 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -120,7 +120,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) uint n = strlen(Skcol); skc = (char*)PlugSubAlloc(g, NULL, n + 2); - strcpy(skc, Skcol); + snprintf(skc, n + 2, "%s", Skcol); skc[n + 1] = 0; // Replace ; by nulls in skc @@ -133,9 +133,9 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!Tabsrc && Tabname) { // Locate the query query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 26); - sprintf(query, "SELECT * FROM `%s` LIMIT 1", Tabname); + snprintf(query, strlen(Tabname) + 26, "SELECT * FROM `%s` LIMIT 1", Tabname); } else if (!Tabsrc) { - strcpy(g->Message, MSG(SRC_TABLE_UNDEF)); + snprintf(g->Message, sizeof(g->Message), MSG(SRC_TABLE_UNDEF)); goto err; } else query = (char*)Tabsrc; @@ -167,7 +167,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) Fncol = crp->Name; if (!Fncol) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_FNCCOL)); goto err; } // endif Fncol @@ -180,7 +180,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) Picol = crp->Name; if (!Picol) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_PIVOTCOL)); goto err; } // endif Picol @@ -206,10 +206,10 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) pcrp = &crp->Next; if (!Rblkp) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_PIVOTCOL)); goto err; } else if (!fncrp) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_FNCCOL)); goto err; } // endif @@ -302,7 +302,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch err: @@ -443,7 +443,7 @@ bool TDBPIVOT::FindDefaultColumns(PGLOBAL g) Fncol = cdp->GetName(); if (!Fncol) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_FNCCOL)); return true; } // endif Fncol @@ -456,7 +456,7 @@ bool TDBPIVOT::FindDefaultColumns(PGLOBAL g) Picol = cdp->GetName(); if (!Picol) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_PIVOTCOL)); return true; } // endif Picol @@ -519,7 +519,7 @@ bool TDBPIVOT::GetSourceTable(PGLOBAL g) } // endif !GBdone } else if (!Tabsrc) { - strcpy(g->Message, MSG(SRC_TABLE_UNDEF)); + snprintf(g->Message, sizeof(g->Message), MSG(SRC_TABLE_UNDEF)); return true; } // endif @@ -588,18 +588,18 @@ bool TDBPIVOT::MakeViewColumns(PGLOBAL g) PTDBMY tdbp; if (Tdbp->GetAmType() != TYPE_AM_MYSQL) { - strcpy(g->Message, "View is not MySQL"); + snprintf(g->Message, sizeof(g->Message),"View is not MySQL"); return true; } else tdbp = (PTDBMY)Tdbp; if (!Fncol && !(Fncol = tdbp->FindFieldColumn(Picol))) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_FNCCOL)); return true; } // endif Fncol if (!Picol && !(Picol = tdbp->FindFieldColumn(Fncol))) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_PIVOTCOL)); return true; } // endif Picol @@ -679,7 +679,7 @@ bool TDBPIVOT::OpenDB(PGLOBAL g) /*******************************************************************/ /* Direct access of PIVOT tables is not implemented yet. */ /*******************************************************************/ - strcpy(g->Message, MSG(NO_PIV_DIR_ACC)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_PIV_DIR_ACC)); return TRUE; } // endif To_Key_Col @@ -780,7 +780,7 @@ int TDBPIVOT::ReadDB(PGLOBAL g) if (!colp && !(colp = Dcolp)) { if (!Accept) { - strcpy(g->Message, MSG(NO_MATCH_COL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_MATCH_COL)); return RC_FX; } else continue; diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index 7d90b467276..9e8a7d9dbfd 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -84,7 +84,7 @@ bool INIDEF::DefineAM(PGLOBAL g, LPCSTR, int) PlugSetPath(p, Fn, GetPath()); Fn = p; } else { - strcpy(g->Message, MSG(MISSING_FNAME)); + snprintf(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return true; } // endif Fn @@ -326,7 +326,7 @@ int TDBINI::DeleteDB(PGLOBAL g, int irc) break; default: if (!Section) { - strcpy(g->Message, MSG(NO_SECTION_NAME)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SECTION_NAME)); return RC_FX; } else if (!WritePrivateProfileString(Section, NULL, NULL, Ifile)) { @@ -514,7 +514,7 @@ void INICOL::WriteColumn(PGLOBAL g) throw 31; } else if (Flag == 1) { if (tdbp->Mode == MODE_UPDATE) { - strcpy(g->Message, MSG(NO_SEC_UPDATE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SEC_UPDATE)); throw 31; } else if (*p) { tdbp->Section = p; @@ -523,7 +523,7 @@ void INICOL::WriteColumn(PGLOBAL g) return; } else if (!tdbp->Section) { - strcpy(g->Message, MSG(SEC_NAME_FIRST)); + snprintf(g->Message, sizeof(g->Message), MSG(SEC_NAME_FIRST)); throw 31; } // endif's @@ -752,7 +752,7 @@ int TDBXIN::DeleteDB(PGLOBAL g, int irc) } // endif } else if (!Section) { - strcpy(g->Message, MSG(NO_SECTION_NAME)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SECTION_NAME)); return RC_FX; } else if (!WritePrivateProfileString(Section, Keycur, NULL, Ifile)) { @@ -840,7 +840,7 @@ void XINCOL::WriteColumn(PGLOBAL g) throw 31; } else if (Flag == 1) { if (tdbp->Mode == MODE_UPDATE) { - strcpy(g->Message, MSG(NO_SEC_UPDATE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SEC_UPDATE)); throw 31; } else if (*p) { tdbp->Section = p; @@ -850,7 +850,7 @@ void XINCOL::WriteColumn(PGLOBAL g) return; } else if (Flag == 2) { if (tdbp->Mode == MODE_UPDATE) { - strcpy(g->Message, MSG(NO_KEY_UPDATE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_KEY_UPDATE)); throw 31; } else if (*p) { tdbp->Keycur = p; @@ -859,7 +859,7 @@ void XINCOL::WriteColumn(PGLOBAL g) return; } else if (!tdbp->Section || !tdbp->Keycur) { - strcpy(g->Message, MSG(SEC_KEY_FIRST)); + snprintf(g->Message, sizeof(g->Message), MSG(SEC_KEY_FIRST)); throw 31; } // endif's diff --git a/storage/connect/tabwmi.cpp b/storage/connect/tabwmi.cpp index 935d21c59c9..1cd46a7442c 100644 --- a/storage/connect/tabwmi.cpp +++ b/storage/connect/tabwmi.cpp @@ -6,6 +6,7 @@ #error This is a WINDOWS only table type #endif // !_WIN32 #include "my_global.h" +#include "m_string.h" #include #include "global.h" @@ -49,7 +50,7 @@ PWMIUT InitWMI(PGLOBAL g, PCSZ nsp, PCSZ classname) else if (!stricmp(nsp, "root\\cli")) classname = "Msft_CliAlias"; else { - strcpy(g->Message, "Missing class name"); + safe_strcpy(g->Message, sizeof(g->Message), "Missing class name"); return NULL; } // endif classname @@ -512,7 +513,8 @@ char *TDBWMI::MakeWQL(PGLOBAL g) ncol++; if (ncol) { - colist = (char*)PlugSubAlloc(g, NULL, (NAM_LEN + 4) * ncol); + size_t colist_sz = (NAM_LEN + 4) * ncol; + colist = (char*)PlugSubAlloc(g, NULL, colist_sz); for (colp = Columns; colp; colp = colp->GetNext()) if (!colp->IsSpecial()) { @@ -521,10 +523,13 @@ char *TDBWMI::MakeWQL(PGLOBAL g) if (colp->GetColUse(U_P | U_J_EXT) || noloc) { if (first) { - strcpy(colist, colp->GetName()); + snprintf(colist, colist_sz, colp->GetName()); first = false; - } else + } else { strcat(strcat(colist, ", "), colp->GetName()); + safe_strcat(colist, colist_sz, ", "); + safe_strcat(colist, colist_sz, colp->GetName()); + } } // endif ColUse @@ -534,18 +539,19 @@ char *TDBWMI::MakeWQL(PGLOBAL g) // ncol == 0 can occur for queries such that sql count(*) from... // for which we will count the rows from sql * from... colist = (char*)PlugSubAlloc(g, NULL, 2); - strcpy(colist, "*"); + snprintf(colist, 2, "*"); } // endif ncol // Below 14 is length of 'select ' + length of ' from ' + 1 len = (strlen(colist) + strlen(Wclass) + 14); len += (To_CondFil ? strlen(To_CondFil->Body) + 7 : 0); wql = (char*)PlugSubAlloc(g, NULL, len); - strcat(strcat(strcpy(wql, "SELECT "), colist), " FROM "); - strcat(wql, Wclass); + snprintf(wql, len, "SELECT %s FROM %s", colist, Wclass); - if (To_CondFil) - strcat(strcat(wql, " WHERE "), To_CondFil->Body); + if (To_CondFil) { + safe_strcat(wql, len, " WHERE "); + safe_strcat(wql, len, To_CondFil->Body); + } return wql; } // end of MakeWQL @@ -654,13 +660,13 @@ bool TDBWMI::OpenDB(PGLOBAL g) /*******************************************************************/ /* WMI tables cannot be modified. */ /*******************************************************************/ - strcpy(g->Message, "WMI tables are read only"); + safe_strcpy(g->Message, sizeof(g->Message), "WMI tables are read only"); return true; } // endif Mode if (!To_CondFil && !stricmp(Wclass, "CIM_Datafile") && !stricmp(Nspace, "root\\cimv2")) { - strcpy(g->Message, + safe_strcpy(g->Message, sizeof(g->Message), "Would last forever when not filtered, use DIR table instead"); return true; } else @@ -697,7 +703,7 @@ int TDBWMI::ReadDB(PGLOBAL g) /***********************************************************************/ int TDBWMI::WriteDB(PGLOBAL g) { - strcpy(g->Message, "WMI tables are read only"); + safe_strcpy(g->Message, sizeof(g->Message), "WMI tables are read only"); return RC_FX; } // end of WriteDB @@ -706,7 +712,7 @@ int TDBWMI::WriteDB(PGLOBAL g) /***********************************************************************/ int TDBWMI::DeleteDB(PGLOBAL g, int irc) { - strcpy(g->Message, "Delete not enabled for WMI tables"); + safe_strcpy(g->Message, sizeof(g->Message), "Delete not enabled for WMI tables"); return RC_FX; } // end of DeleteDB diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index 6bc3209da59..bc8e3651e0c 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -140,7 +140,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) } // endif info if (GetIntegerTableOption(g, topt, "Multiple", 0)) { - strcpy(g->Message, "Cannot find column definition for multiple table"); + snprintf(g->Message, sizeof(g->Message), "Cannot find column definition for multiple table"); return NULL; } // endif Multiple @@ -152,7 +152,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) fn = GetStringTableOption(g, topt, "Subtype", NULL); if (!fn) { - strcpy(g->Message, MSG(MISSING_FNAME)); + snprintf(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return NULL; } else topt->subtype = NULL; @@ -483,12 +483,12 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Encoding = GetStringCatInfo(g, "Encoding", "UTF-8"); if (*Fn == '?') { - strcpy(g->Message, MSG(MISSING_FNAME)); + snprintf(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return true; } // endif fn if ((signed)GetIntCatInfo("Flag", -1) != -1) { - strcpy(g->Message, MSG(DEPREC_FLAG)); + snprintf(g->Message, sizeof(g->Message), MSG(DEPREC_FLAG)); return true; } // endif flag @@ -567,7 +567,7 @@ PTDB XMLDEF::GetTable(PGLOBAL g, MODE m) return new(g) TDBXCT(this); if (Zipped && !(m == MODE_READ || m == MODE_ANY)) { - strcpy(g->Message, "ZIpped XML tables are read only"); + snprintf(g->Message, sizeof(g->Message), "ZIpped XML tables are read only"); return NULL; } // endif Zipped @@ -857,16 +857,16 @@ bool TDBXML::Initialize(PGLOBAL g) // Get root node if (!(Root = Docp->GetRoot(g))) { // This should never happen as load should have failed - strcpy(g->Message, MSG(EMPTY_DOC)); + snprintf(g->Message, sizeof(g->Message), MSG(EMPTY_DOC)); goto error; } // endif Root // If tabname is not an Xpath, // construct one that will find it anywhere if (!strchr(Tabname, '/')) - strcat(strcpy(tabpath, "//"), Tabname); + snprintf(tabpath, sizeof(tabpath), "//%s", Tabname); else - strcpy(tabpath, Tabname); + snprintf(tabpath, sizeof(tabpath), "%s", Tabname); // Evaluate table xpath if ((TabNode = Root->SelectSingleNode(g, tabpath))) { @@ -911,7 +911,7 @@ bool TDBXML::Initialize(PGLOBAL g) // Create the XML node if (Docp->NewDoc(g, "1.0")) { - strcpy(g->Message, MSG(NEW_DOC_FAILED)); + snprintf(g->Message, sizeof(g->Message), MSG(NEW_DOC_FAILED)); goto error; } // endif NewDoc @@ -919,7 +919,7 @@ bool TDBXML::Initialize(PGLOBAL g) To_Xb = Docp->LinkXblock(g, Mode, rc, filename); // Add a CONNECT comment node - strcpy(buf, " Created by the MariaDB CONNECT Storage Engine"); + snprintf(buf, sizeof(buf), " Created by the MariaDB CONNECT Storage Engine"); Docp->AddComment(g, buf); if (XmlDB) { @@ -932,7 +932,7 @@ bool TDBXML::Initialize(PGLOBAL g) TabNode = Root = Docp->NewRoot(g, Tabname); if (TabNode == NULL || Root == NULL) { - strcpy(g->Message, MSG(XML_INIT_ERROR)); + snprintf(g->Message, sizeof(g->Message), MSG(XML_INIT_ERROR)); goto error; } else if (SetTabNode(g)) goto error; @@ -992,7 +992,7 @@ bool TDBXML::Initialize(PGLOBAL g) #if !defined(UNIX) } catch(...) { // Other errors - strcpy(g->Message, MSG(XMLTAB_INIT_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(XMLTAB_INIT_ERR)); goto error; #endif } // end of try-catches @@ -1037,7 +1037,7 @@ bool TDBXML::SetTabNode(PGLOBAL g) TabNode->AddText(g, "\n\t"); rn = TabNode->AddChildNode(g, Rowname, NULL); } else { - strcpy(g->Message, MSG(NO_ROW_NODE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_ROW_NODE)); return true; } // endif Rowname @@ -1293,7 +1293,7 @@ bool TDBXML::CheckRow(PGLOBAL g, bool b) TabNode->AddText(g, "\n\t"); RowNode = TabNode->AddChildNode(g, Rowname, RowNode); } else { - strcpy(g->Message, MSG(NO_ROW_NODE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_ROW_NODE)); return true; } // endif Rowname } @@ -1550,7 +1550,7 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode) if (Tdbp->Mulnode && !strncmp(p, Tdbp->Mulnode, p2 - p)) { if (!Tdbp->Xpand && mode) { - strcpy(g->Message, MSG(CONCAT_SUBNODE)); + snprintf(g->Message, sizeof(g->Message), MSG(CONCAT_SUBNODE)); return true; } else Inod = i; // Index of multiple node @@ -1843,7 +1843,7 @@ void XMLCOL::WriteColumn(PGLOBAL g) } // endfor k if (ColNode == NULL) { - strcpy(g->Message, MSG(COL_ALLOC_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(COL_ALLOC_ERR)); throw (int)TYPE_AM_XML; } // endif ColNode @@ -1862,7 +1862,7 @@ void XMLCOL::WriteColumn(PGLOBAL g) AttNode = ColNode->AddProperty(g, Xname, Vxap); if (ValNode == NULL && AttNode == NULL) { - strcpy(g->Message, MSG(VAL_ALLOC_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(VAL_ALLOC_ERR)); throw (int)TYPE_AM_XML; } // endif ValNode @@ -2104,7 +2104,7 @@ void XMULCOL::WriteColumn(PGLOBAL g) } // endfor k if (ColNode == NULL) { - strcpy(g->Message, MSG(COL_ALLOC_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(COL_ALLOC_ERR)); throw (int)TYPE_AM_XML; } // endif ColNode @@ -2123,7 +2123,7 @@ void XMULCOL::WriteColumn(PGLOBAL g) AttNode = ColNode->AddProperty(g, Xname, Vxap); if (ValNode == NULL && AttNode == NULL) { - strcpy(g->Message, MSG(VAL_ALLOC_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(VAL_ALLOC_ERR)); throw (int)TYPE_AM_XML; } // endif ValNode @@ -2165,7 +2165,7 @@ void XPOSCOL::ReadColumn(PGLOBAL g) return; // Same row than the last read if (Tdbp->Clist == NULL) { - strcpy(g->Message, MSG(MIS_TAG_LIST)); + snprintf(g->Message, sizeof(g->Message), MSG(MIS_TAG_LIST)); throw (int)TYPE_AM_XML; } // endif Clist @@ -2235,7 +2235,7 @@ void XPOSCOL::WriteColumn(PGLOBAL g) /* Find the column and value nodes to update or insert. */ /*********************************************************************/ if (Tdbp->Clist == NULL) { - strcpy(g->Message, MSG(MIS_TAG_LIST)); + snprintf(g->Message, sizeof(g->Message), MSG(MIS_TAG_LIST)); throw (int)TYPE_AM_XML; } // endif Clist diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 7265b2ed0ca..344b0dea50f 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -59,7 +59,7 @@ #if defined(_DEBUG) #define CheckType(V) if (Type != V->GetType()) { \ PGLOBAL& g = Global; \ - strcpy(g->Message, MSG(VALTYPE_NOMATCH)); \ + snprintf(g->Message, sizeof(g->Message), MSG(VALTYPE_NOMATCH)); \ throw Type; #else #define CheckType(V) @@ -556,7 +556,7 @@ BYTE VALUE::TestValue(PVAL vp) /***********************************************************************/ bool VALUE::Compute(PGLOBAL g, PVAL *, int, OPVAL) { - strcpy(g->Message, "Compute not implemented for this value type"); + snprintf(g->Message, sizeof(g->Message), "Compute not implemented for this value type"); return true; } // end of Compute @@ -1051,11 +1051,11 @@ TYPE TYPVAL::SafeAdd(TYPE n1, TYPE n2) if ((n2 > 0) && (n < n1)) { // Overflow - strcpy(g->Message, MSG(FIX_OVFLW_ADD)); + snprintf(g->Message, sizeof(g->Message), MSG(FIX_OVFLW_ADD)); throw 138; } else if ((n2 < 0) && (n > n1)) { // Underflow - strcpy(g->Message, MSG(FIX_UNFLW_ADD)); + snprintf(g->Message, sizeof(g->Message), MSG(FIX_UNFLW_ADD)); throw 138; } // endif's n2 @@ -1079,11 +1079,11 @@ TYPE TYPVAL::SafeMult(TYPE n1, TYPE n2) if (n > MinMaxVal(true)) { // Overflow - strcpy(g->Message, MSG(FIX_OVFLW_TIMES)); + snprintf(g->Message, sizeof(g->Message), MSG(FIX_OVFLW_TIMES)); throw 138; } else if (n < MinMaxVal(false)) { // Underflow - strcpy(g->Message, MSG(FIX_UNFLW_TIMES)); + snprintf(g->Message, sizeof(g->Message), MSG(FIX_UNFLW_TIMES)); throw 138; } // endif's n2 @@ -1119,7 +1119,7 @@ bool TYPVAL::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) break; case OP_DIV: if (!val[1]) { - strcpy(g->Message, MSG(ZERO_DIVIDE)); + snprintf(g->Message, sizeof(g->Message),MSG(ZERO_DIVIDE)); return true; } // endif @@ -1173,7 +1173,7 @@ bool TYPVAL::Compall(PGLOBAL g, PVAL *vp, int np, OPVAL op) case OP_DIV: if (val[0]) { if (!val[1]) { - strcpy(g->Message, MSG(ZERO_DIVIDE)); + snprintf(g->Message, sizeof(g->Message), MSG(ZERO_DIVIDE)); return true; } // endif @@ -1190,7 +1190,7 @@ bool TYPVAL::Compall(PGLOBAL g, PVAL *vp, int np, OPVAL op) break; default: // snprintf(g->Message, sizeof(g->Message), MSG(BAD_EXP_OPER), op); - strcpy(g->Message, "Function not supported"); + snprintf(g->Message, sizeof(g->Message), "Function not supported"); return true; } // endswitch op @@ -1701,7 +1701,7 @@ bool TYPVAL::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) break; default: // snprintf(g->Message, sizeof(g->Message), MSG(BAD_EXP_OPER), op); - strcpy(g->Message, "Function not supported"); + snprintf(g->Message, sizeof(g->Message), "Function not supported"); return true; } // endswitch op @@ -2616,7 +2616,7 @@ bool DTVAL::MakeDate(PGLOBAL g, int *val, int nval) if (MakeTime(&datm)) { if (g) { - strcpy(g->Message, MSG(BAD_DATETIME)); + snprintf(g->Message, sizeof(g->Message), MSG(BAD_DATETIME)); rc = true; } else Tval = 0; diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index ac76b42083e..6496c4dbce2 100644 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -45,6 +45,7 @@ //nclude "array.h" #include "filamtxt.h" #include "tabdos.h" +#include "m_string.h" #if defined(VCT_SUPPORT) #include "tabvct.h" #endif // VCT_SUPPORT @@ -857,7 +858,8 @@ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp) char fname[_MAX_FNAME]; _splitpath(defp->GetOfn(), drive, direc, fname, NULL); - strcat(strcat(fname, "_"), Xdp->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), Xdp->GetName()); _makepath(fn, drive, direc, fname, ftype); sxp = NULL; } else { @@ -1011,7 +1013,8 @@ bool XINDEX::Init(PGLOBAL g) char fname[_MAX_FNAME]; _splitpath(defp->GetOfn(), drive, direc, fname, NULL); - strcat(strcat(fname, "_"), Xdp->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), Xdp->GetName()); _makepath(fn, drive, direc, fname, ftype); } else { id = ID; @@ -1265,7 +1268,8 @@ bool XINDEX::MapInit(PGLOBAL g) char fname[_MAX_FNAME]; _splitpath(defp->GetOfn(), drive, direc, fname, NULL); - strcat(strcat(fname, "_"), Xdp->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), Xdp->GetName()); _makepath(fn, drive, direc, fname, ftype); } else { id = ID; @@ -1480,7 +1484,8 @@ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk) char fname[_MAX_FNAME]; _splitpath(defp->GetOfn(), drive, direc, fname, NULL); - strcat(strcat(fname, "_"), Xdp->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), Xdp->GetName()); _makepath(fn, drive, direc, fname, ftype); } else { id = ID; From 8810b1ecf109088963df98e30980f6ab6a85c6cb Mon Sep 17 00:00:00 2001 From: Andrew Hutchings Date: Sat, 13 May 2023 17:09:57 +0100 Subject: [PATCH 023/171] Fix Connect compile issue --- storage/connect/javaconn.cpp | 2 +- storage/connect/tabjmg.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/storage/connect/javaconn.cpp b/storage/connect/javaconn.cpp index 6078d51517f..95b008a13c1 100644 --- a/storage/connect/javaconn.cpp +++ b/storage/connect/javaconn.cpp @@ -167,7 +167,7 @@ bool JAVAConn::gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig mid = env->GetMethodID(jdi, name, sig); if (Check()) { - snprintf(g->Message, sizeof(g->Message), Msg); + snprintf(g->Message, sizeof(g->Message), "%s", Msg); return true; } else return false; diff --git a/storage/connect/tabjmg.cpp b/storage/connect/tabjmg.cpp index ab1ed102971..cf0fa73b5d5 100644 --- a/storage/connect/tabjmg.cpp +++ b/storage/connect/tabjmg.cpp @@ -113,7 +113,7 @@ bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, z = 65 - strlen(colname); strncat(strncat(colname, "_", z), key, z - 1); } else - snprintf(colname, sizeof(colname), key); + snprintf(colname, sizeof(colname), "%s", key); if (pfmt) { strncpy(fmt, pfmt, 128); @@ -121,7 +121,7 @@ bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, z = 129 - strlen(fmt); strncat(strncat(fmt, ".", z), key, z - 1); } else - snprintf(fmt, sizeof(fmt), key); + snprintf(fmt, sizeof(fmt), "%s", key); if (!jres) { bcol.Type = n[0]; From 996b040f9384cf03e814182053b12945d3df5732 Mon Sep 17 00:00:00 2001 From: Angelique Date: Fri, 12 May 2023 22:30:47 +0000 Subject: [PATCH 024/171] MDEV-30232: Increase timeouts to fix sporadic fails --- mysql-test/suite/rpl/r/rpl_gtid_crash.result | 6 +++--- mysql-test/suite/rpl/t/rpl_gtid_crash.test | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mysql-test/suite/rpl/r/rpl_gtid_crash.result b/mysql-test/suite/rpl/r/rpl_gtid_crash.result index 153081d9ca5..4e74a3b25ac 100644 --- a/mysql-test/suite/rpl/r/rpl_gtid_crash.result +++ b/mysql-test/suite/rpl/r/rpl_gtid_crash.result @@ -168,7 +168,7 @@ SELECT * from t1 WHERE a > 10 ORDER BY a; a gtid_check Binlog pos ok -# Wait 30 seconds for SQL thread to catch up with IO thread +# Wait 60 seconds for SQL thread to catch up with IO thread connection server_2; SELECT * from t1 WHERE a > 10 ORDER BY a; a @@ -224,7 +224,7 @@ gtid_check Binlog pos ok gtid_check Current pos ok -# Wait 30 seconds for SQL thread to catch up with IO thread +# Wait 60 seconds for SQL thread to catch up with IO thread connection server_2; SELECT * from t1 WHERE a > 10 ORDER BY a; a @@ -275,7 +275,7 @@ COMMIT; Got one of the listed errors connection server_1; connection server_2; -# Wait 30 seconds for IO thread to connect and SQL thread to catch up +# Wait 60 seconds for IO thread to connect and SQL thread to catch up # with IO thread. include/stop_slave.inc connection server_1; diff --git a/mysql-test/suite/rpl/t/rpl_gtid_crash.test b/mysql-test/suite/rpl/t/rpl_gtid_crash.test index d0af69a65ed..f2167911101 100644 --- a/mysql-test/suite/rpl/t/rpl_gtid_crash.test +++ b/mysql-test/suite/rpl/t/rpl_gtid_crash.test @@ -345,9 +345,9 @@ SELECT * from t1 WHERE a > 10 ORDER BY a; eval SELECT IF(INSTR(@@gtid_binlog_pos, '$saved_gtid'), "Binlog pos ok", CONCAT("Unexpected binlog pos: ", @@gtid_binlog_pos, "; does not contain the GTID $saved_gtid.")) AS gtid_check; --enable_query_log ---echo # Wait 30 seconds for SQL thread to catch up with IO thread +--echo # Wait 60 seconds for SQL thread to catch up with IO thread --connection server_2 ---let $wait_timeout= 300 +--let $wait_timeout= 600 while ($wait_timeout != 0) { --let $read_log_pos= query_get_value('SHOW SLAVE STATUS', Read_Master_Log_Pos, 1) @@ -442,9 +442,9 @@ eval SELECT IF(INSTR(@@gtid_binlog_pos, '$saved_gtid'), "Binlog pos ok", CONCAT( eval SELECT IF(INSTR(@@gtid_current_pos, '$saved_gtid'), "Current pos ok", CONCAT("Unexpected current pos: ", @@gtid_current_pos, "; does not contain the GTID $saved_gtid.")) AS gtid_check; --enable_query_log ---echo # Wait 30 seconds for SQL thread to catch up with IO thread +--echo # Wait 60 seconds for SQL thread to catch up with IO thread --connection server_2 ---let $wait_timeout= 300 +--let $wait_timeout= 600 while ($wait_timeout != 0) { --let $read_log_pos= query_get_value('SHOW SLAVE STATUS', Read_Master_Log_Pos, 1) @@ -533,9 +533,9 @@ EOF --source include/wait_until_connected_again.inc --connection server_2 ---echo # Wait 30 seconds for IO thread to connect and SQL thread to catch up +--echo # Wait 60 seconds for IO thread to connect and SQL thread to catch up --echo # with IO thread. ---let $wait_timeout= 300 +--let $wait_timeout= 600 while ($wait_timeout != 0) { --let $connected=`SELECT COUNT(*) > 0 FROM information_schema.processlist WHERE State = 'Waiting for master to send event'` From b7b8a9ee439f8d3c9457a6eb480001cae37307b8 Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Thu, 13 Apr 2023 16:43:30 +0530 Subject: [PATCH 025/171] MDEV-23187: Assorted assertion failures in json_find_path with certain collations Fix by Alexey Botchkov The 'value_len' is calculated wrong for the multibyte charsets. In the read_strn() function we get the length of the string with the final ' " ' character. So have to subtract it's length from the value_len. And the length of '1' isn't correct for the ucs2 charset (must be 2). --- include/json_lib.h | 3 ++- mysql-test/main/func_json.result | 8 +++++--- mysql-test/main/func_json.test | 11 ++++++----- strings/json_lib.c | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/json_lib.h b/include/json_lib.h index 2ec3e9de8f8..71e5d578855 100644 --- a/include/json_lib.h +++ b/include/json_lib.h @@ -35,6 +35,7 @@ typedef struct st_json_string_t const uchar *c_str; /* Current position in JSON string */ const uchar *str_end; /* The end on the string. */ my_wc_t c_next; /* UNICODE of the last read character */ + int c_next_len; /* character lenght of the last read character. */ int error; /* error code. */ CHARSET_INFO *cs; /* Character set of the JSON string. */ @@ -48,7 +49,7 @@ void json_string_set_cs(json_string_t *s, CHARSET_INFO *i_cs); void json_string_set_str(json_string_t *s, const uchar *str, const uchar *end); #define json_next_char(j) \ - (j)->wc((j)->cs, &(j)->c_next, (j)->c_str, (j)->str_end) + ((j)->c_next_len= (j)->wc((j)->cs, &(j)->c_next, (j)->c_str, (j)->str_end)) #define json_eos(j) ((j)->c_str >= (j)->str_end) /* read_string_const_chr() reads the next character of the string constant diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result index 415e367f455..ed719e7b453 100644 --- a/mysql-test/main/func_json.result +++ b/mysql-test/main/func_json.result @@ -1043,9 +1043,6 @@ SELECT JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a'); JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a') null # -# End of 10.3 tests -# -# # Start of 10.4 tests # # @@ -1295,6 +1292,11 @@ SELECT JSON_LENGTH('{"a":"b"}','$','$', 'foo'); ERROR 42000: Incorrect parameter count in the call to native function 'json_length' SELECT JSON_LENGTH(); ERROR 42000: Incorrect parameter count in the call to native function 'JSON_LENGTH' +# MDEV-23187: Assorted assertion failures in json_find_path with certain collations +SET COLLATION_CONNECTION= ucs2_unicode_ci; +SELECT JSON_VALUE('["foo"]', '$**[0]') AS f; +f +foo # # End of 10.4 tests # diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test index 56d90e93936..9cfde5489e7 100644 --- a/mysql-test/main/func_json.test +++ b/mysql-test/main/func_json.test @@ -665,11 +665,6 @@ SELECT 1 + JSON_VALUE('{"nulltest": null}', '$.nulltest'); SELECT NULL; SELECT JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a'); - ---echo # ---echo # End of 10.3 tests ---echo # - --echo # --echo # Start of 10.4 tests --echo # @@ -825,6 +820,12 @@ SELECT JSON_LENGTH('{"a":"b"}','$','$', 'foo'); --error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT SELECT JSON_LENGTH(); +--echo # MDEV-23187: Assorted assertion failures in json_find_path with certain collations + + +SET COLLATION_CONNECTION= ucs2_unicode_ci; +SELECT JSON_VALUE('["foo"]', '$**[0]') AS f; + --echo # --echo # End of 10.4 tests --echo # diff --git a/strings/json_lib.c b/strings/json_lib.c index 5c7747617e9..781172f0340 100644 --- a/strings/json_lib.c +++ b/strings/json_lib.c @@ -401,7 +401,7 @@ static int read_strn(json_engine_t *j) return 1; j->state= j->stack[j->stack_p]; - j->value_len= (int)(j->s.c_str - j->value) - 1; + j->value_len= (int)(j->s.c_str - j->value) - j->s.c_next_len; return 0; } From ffd5d74c4f0e0812b461b5c6990abdf99ed038bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Thu, 11 May 2023 07:46:57 +0300 Subject: [PATCH 026/171] MDEV-30013 : Assertion `state() == s_aborting || state() == s_must_replay' failed in int wsrep::transaction::after_rollback() This must be some kind of merge error because at ha_check_engine we just find out used engine or default engine. There is no need to roll-back transaction here even if engine is not supported as it will be handled later. Signed-off-by: Julius Goryavsky --- mysql-test/suite/galera/r/mdev-30013.result | 17 +++++++++++++++++ mysql-test/suite/galera/t/mdev-30013.test | 15 +++++++++++++++ sql/handler.cc | 3 --- 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 mysql-test/suite/galera/r/mdev-30013.result create mode 100644 mysql-test/suite/galera/t/mdev-30013.test diff --git a/mysql-test/suite/galera/r/mdev-30013.result b/mysql-test/suite/galera/r/mdev-30013.result new file mode 100644 index 00000000000..86016b09ca6 --- /dev/null +++ b/mysql-test/suite/galera/r/mdev-30013.result @@ -0,0 +1,17 @@ +connection node_2; +connection node_1; +INSTALL PLUGIN ARCHIVE SONAME 'ha_archive.so'; +CREATE TABLE t (a CHAR(1)) ENGINE=ARCHIVE; +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` char(1) DEFAULT NULL +) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO t VALUES ('A'); +UNINSTALL SONAME 'ha_archive'; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +ALTER TABLE t CHANGE COLUMN a a CHAR(2); +INSERT INTO t (a) VALUES ('AB'); +ERROR 42000: Unknown storage engine 'ARCHIVE' +DROP TABLE t; diff --git a/mysql-test/suite/galera/t/mdev-30013.test b/mysql-test/suite/galera/t/mdev-30013.test new file mode 100644 index 00000000000..038b66600ce --- /dev/null +++ b/mysql-test/suite/galera/t/mdev-30013.test @@ -0,0 +1,15 @@ +--source include/galera_cluster.inc + +if (!$HA_ARCHIVE_SO) { + skip Needs Archive loadable plugin; +} + +INSTALL PLUGIN ARCHIVE SONAME 'ha_archive.so'; +CREATE TABLE t (a CHAR(1)) ENGINE=ARCHIVE; +SHOW CREATE TABLE t; +INSERT INTO t VALUES ('A'); +UNINSTALL SONAME 'ha_archive'; +ALTER TABLE t CHANGE COLUMN a a CHAR(2); +--error ER_UNKNOWN_STORAGE_ENGINE +INSERT INTO t (a) VALUES ('AB'); +DROP TABLE t; diff --git a/sql/handler.cc b/sql/handler.cc index 7eaaaf63f00..455a5e509c8 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -299,9 +299,6 @@ handlerton *ha_checktype(THD *thd, handlerton *hton, bool no_substitute) if (no_substitute) return NULL; -#ifdef WITH_WSREP - (void)wsrep_after_rollback(thd, false); -#endif /* WITH_WSREP */ return ha_default_handlerton(thd); } /* ha_checktype */ From 956d6c4af9e353299cce6d2ccbd7c400a1d00d70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Thu, 20 Apr 2023 13:26:09 +0300 Subject: [PATCH 027/171] MDEV-21479 : Galera 4 unable to query cluster state if not primary component Set mysql.wsrep_cluster and mysql.wsrep_cluster_members as TABLE_CATEGORY_INFORMATION as mysql.wsrep_streaming_log so that they can be queried even if node is not primary component. Signed-off-by: Julius Goryavsky --- mysql-test/suite/galera/r/MDEV-21479.result | 95 ++++++++++++++++++++ mysql-test/suite/galera/t/MDEV-21479.test | 99 +++++++++++++++++++++ sql/table.cc | 13 ++- sql/wsrep_schema.cc | 5 -- sql/wsrep_schema.h | 5 ++ 5 files changed, 209 insertions(+), 8 deletions(-) create mode 100644 mysql-test/suite/galera/r/MDEV-21479.result create mode 100644 mysql-test/suite/galera/t/MDEV-21479.test diff --git a/mysql-test/suite/galera/r/MDEV-21479.result b/mysql-test/suite/galera/r/MDEV-21479.result new file mode 100644 index 00000000000..7d1220a038b --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-21479.result @@ -0,0 +1,95 @@ +connection node_2; +connection node_1; +# Lets first see that we can access wsrep schema tables +# Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 from mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 +connection node_2; +# Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 +connection node_1; +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; +SET GLOBAL wsrep_provider_options = 'pc.weight=2'; +connection node_2; +# Desync and disconnect node_2 +SET @@global.wsrep_desync = 1; +SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +VARIABLE_VALUE +non-Primary +connection node_1; +# Waiting until node_2 is not part of cluster anymore +# Verify that we can access wsrep schema tables +# Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster_members; +EXPECT_1 +1 +connection node_2; +# Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 +connection node_2; +# Reconnect node_2 back to cluster +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET wsrep_dirty_reads=0; +SHOW STATUS LIKE 'wsrep_desync_count'; +Variable_name Value +wsrep_desync_count 0 +SET @@global.wsrep_desync = 0; +CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); +connection node_1; +# Wait until both nodes are back to cluster +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=false'; +SET GLOBAL wsrep_provider_options = 'pc.weight=1'; +# Verify that we can access wsrep schema tables +# Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 +connection node_2; +# Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 diff --git a/mysql-test/suite/galera/t/MDEV-21479.test b/mysql-test/suite/galera/t/MDEV-21479.test new file mode 100644 index 00000000000..86de97ea77c --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-21479.test @@ -0,0 +1,99 @@ +# +# MDEV-21479 : Galera 4 unable to query cluster state if not primary component +# +--source include/galera_cluster.inc +--source include/have_innodb.inc + + +--echo # Lets first see that we can access wsrep schema tables +--echo # Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 from mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; + +--connection node_2 +--echo # Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; + +--connection node_1 +# Make node 1 tolerate split-brain +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; +SET GLOBAL wsrep_provider_options = 'pc.weight=2'; + +# Desync and disconnect node 2 from the PC: +--connection node_2 +--echo # Desync and disconnect node_2 +SET @@global.wsrep_desync = 1; +SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; + +# Wait until node 2 disappears from the PC: +--connection node_1 +--echo # Waiting until node_2 is not part of cluster anymore +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +--echo # Verify that we can access wsrep schema tables +--echo # Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster_members; + +--connection node_2 +# +# Here node2 remembers old configuration even when we are non-Primary +# +--echo # Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; + +# Reconnect node 2 to the PC: +--connection node_2 +--echo # Reconnect node_2 back to cluster +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET wsrep_dirty_reads=0; +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +# Must return 0: +SHOW STATUS LIKE 'wsrep_desync_count'; + +# Resync node_2, should pass: +SET @@global.wsrep_desync = 0; + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc + +CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); + +--connection node_1 +--echo # Wait until both nodes are back to cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=false'; +SET GLOBAL wsrep_provider_options = 'pc.weight=1'; + +--echo # Verify that we can access wsrep schema tables +--echo # Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; + +--connection node_2 +--echo # Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; diff --git a/sql/table.cc b/sql/table.cc index 0f296a85e58..44d639e27a4 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -45,6 +45,9 @@ #include "ha_sequence.h" #include "sql_show.h" #include "opt_trace.h" +#ifdef WITH_WSREP +#include "wsrep_schema.h" +#endif /* For MySQL 5.7 virtual fields */ #define MYSQL57_GENERATED_FIELD 128 @@ -264,10 +267,14 @@ TABLE_CATEGORY get_table_category(const LEX_CSTRING *db, DBUG_ASSERT(name != NULL); #ifdef WITH_WSREP - if (my_strcasecmp(system_charset_info, db->str, "mysql") == 0 && - my_strcasecmp(system_charset_info, name->str, "wsrep_streaming_log") == 0) + if (my_strcasecmp(system_charset_info, db->str, WSREP_SCHEMA) == 0) { - return TABLE_CATEGORY_INFORMATION; + if ((my_strcasecmp(system_charset_info, name->str, WSREP_STREAMING_TABLE) == 0 || + my_strcasecmp(system_charset_info, name->str, WSREP_CLUSTER_TABLE) == 0 || + my_strcasecmp(system_charset_info, name->str, WSREP_MEMBERS_TABLE) == 0)) + { + return TABLE_CATEGORY_INFORMATION; + } } #endif /* WITH_WSREP */ if (is_infoschema_db(db)) diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index 1bc8dd5c98f..94eef413dc5 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -35,11 +35,6 @@ #include #include -#define WSREP_SCHEMA "mysql" -#define WSREP_STREAMING_TABLE "wsrep_streaming_log" -#define WSREP_CLUSTER_TABLE "wsrep_cluster" -#define WSREP_MEMBERS_TABLE "wsrep_cluster_members" - const char* wsrep_sr_table_name_full= WSREP_SCHEMA "/" WSREP_STREAMING_TABLE; static const std::string wsrep_schema_str= WSREP_SCHEMA; diff --git a/sql/wsrep_schema.h b/sql/wsrep_schema.h index 36e23998d19..979b175481c 100644 --- a/sql/wsrep_schema.h +++ b/sql/wsrep_schema.h @@ -33,6 +33,11 @@ struct TABLE_LIST; struct st_mysql_lex_string; typedef struct st_mysql_lex_string LEX_STRING; +#define WSREP_SCHEMA "mysql" +#define WSREP_STREAMING_TABLE "wsrep_streaming_log" +#define WSREP_CLUSTER_TABLE "wsrep_cluster" +#define WSREP_MEMBERS_TABLE "wsrep_cluster_members" + /** Name of the table in `wsrep_schema_str` used for storing streaming replication data. In an InnoDB full format, e.g. "database/tablename". */ extern const char* wsrep_sr_table_name_full; From c205f6c127195753bc20ab0a2e3b45633c51f134 Mon Sep 17 00:00:00 2001 From: anson1014 <56494179+anson1014@users.noreply.github.com> Date: Fri, 2 Sep 2022 05:40:33 -0400 Subject: [PATCH 028/171] Remove unused French translations in Connect engine (#2252) These files are currently not being used nor compiled in MariaDB. The use of large lists of 'case' statements in these source files are also not a great way to represent translated strings. This git history can be referred to when a better translation interface can be implemented in the future. Therefore, these files can be removed to cleanup the MariaDB codebase. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc. --- storage/connect/frcas.h | 320 ----------- storage/connect/frids.h | 46 -- storage/connect/frmsg.h | 320 ----------- storage/connect/frmsg1.h | 1013 --------------------------------- storage/connect/frmsg2.h | 1013 --------------------------------- storage/connect/ha_connect.cc | 4 - storage/connect/messages.h | 8 - storage/connect/plgdbsem.h | 4 - storage/connect/rcmsg.c | 11 - 9 files changed, 2739 deletions(-) delete mode 100644 storage/connect/frcas.h delete mode 100644 storage/connect/frids.h delete mode 100644 storage/connect/frmsg.h delete mode 100644 storage/connect/frmsg1.h delete mode 100644 storage/connect/frmsg2.h diff --git a/storage/connect/frcas.h b/storage/connect/frcas.h deleted file mode 100644 index e9401d475ae..00000000000 --- a/storage/connect/frcas.h +++ /dev/null @@ -1,320 +0,0 @@ - case MSG_ACCESS_VIOLATN: p = "Violation accès mémoire"; break; - case MSG_ADD_BAD_TYPE: p = "Ajout d'une valeur de type %s non conforme dans un tableau %s"; break; - case MSG_ALLOC_ERROR: p = "Erreur d'allocation de %s"; break; - case MSG_ANSWER_TYPE: p = "Réponse de type"; break; - case MSG_API_CONF_ERROR: p = "Erreur SQL: API_CONFORMANCE"; break; - case MSG_APPL_NOT_INIT: p = "Application non initialisée"; break; - case MSG_ARRAY_BNDS_EXCD: p = "Hors limite de tableau"; break; - case MSG_BAD_ARRAY_OPER: p = "Les tableaux doivent utiliser l'opérateur IN"; break; - case MSG_BAD_ARRAY_TYPE: p = "Type=%d invalide pour un tableau"; break; - case MSG_BAD_ARRAY_VAL: p = "Les tableaux doivent avoir le même nombre de valeurs"; break; - case MSG_BAD_BIN_FMT: p = "Format invalide %c pour la colonne BIN %s"; break; - case MSG_BAD_BLK_ESTIM: p = "Nombre de blocs supérieur à l'estimation"; break; - case MSG_BAD_BLK_SIZE: p = "Taille du bloc %d non conforme"; break; - case MSG_BAD_BYTE_NUM: p = "Le nombre d'octets écrits est faux"; break; - case MSG_BAD_BYTE_READ: p = "Le nombre d'octets lus est faux"; break; - case MSG_BAD_COL_TYPE: p = "Type invalide %s pour la colonne %s"; break; - case MSG_BAD_COL_XPATH: p = "Xpath invalide colonne %s de la table HTML %s"; break; - case MSG_BAD_CONST_TYPE: p = "Type=%d invalide pour une constante"; break; - case MSG_BAD_CONV_TYPE: p = "Convertion de type invalide %d"; break; - case MSG_BAD_DATETIME: p = "Valeur date/temps invalide"; break; - case MSG_BAD_DBF_FILE: p = "Le fichier DBF %s est altéré"; break; - case MSG_BAD_DBF_REC: p = "Fichier DBF %s altéré enregistrement %d"; break; - case MSG_BAD_DBF_TYPE: p = "Type DBF %c non supporté colonne %s"; break; - case MSG_BAD_DIRECTORY: p = "Répertoire invalide %s: %s"; break; - case MSG_BAD_FIELD_RANK: p = "Rang %d invalide pour la colonne %s"; break; - case MSG_BAD_FIELD_TYPE: p = "Mauvais type de champ %s"; break; - case MSG_BAD_FILE_HANDLE: p = "Handle de fichier invalide: %s"; break; - case MSG_BAD_FILTER: p = "Mauvais filtre: Opc=%d B_T=%d %d Type=%d %d"; break; - case MSG_BAD_FILTER_CONV: p = "Conversion filtre incorrecte, B_T=%d,%d"; break; - case MSG_BAD_FILTER_OP: p = "Opérateur de filtre invalide %d"; break; - case MSG_BAD_FLD_FORMAT: p = "Format invalide pour le champs %d de %s"; break; - case MSG_BAD_FLD_LENGTH: p = "Champs %s trop long (%s --> %d) ligne %d de %s"; break; - case MSG_BAD_FREQ_SET: p = "Spécification erronnée de Freq pour la colonne %s"; break; - case MSG_BAD_FUNC_MODE: p = "%s: mode invalide %d"; break; - case MSG_BAD_HANDLE_VAL: p = "Valeur Handle invalide"; break; - case MSG_BAD_HEADER: p = "Fichier %s: bloc en-tête altéré"; break; - case MSG_BAD_HEAD_END: p = "Lecture fin d'en-tête impossible"; break; - case MSG_BAD_INDEX_FILE: p = "Fichier index %s corrompu"; break; - case MSG_BAD_LINEFLD_FMT: p = "Format invalide ligne %d champs %d de %s"; break; - case MSG_BAD_LINE_LEN: p = "Longueur ligne non égale à Lrecl"; break; - case MSG_BAD_LRECL: p = "Disparité lrecl table/fichier (%d,%hd)"; break; - case MSG_BAD_NODE_TYPE: p = "Type noeud erroné pour la table"; break; - case MSG_BAD_OFFSET_VAL: p = "Nul offset invalide pour une table CSV"; break; - case MSG_BAD_OPEN_MODE: p = "Mode d'ouverture invalide %d"; break; - case MSG_BAD_PARAM_TYPE: p = "%.8s: Paramètre de type=%d invalide"; break; - case MSG_BAD_PARM_COUNT: p = "Nombre de paramètres incohérent"; break; - case MSG_BAD_QUOTE_FIELD: p = "Quote manquante dans %s champs %d ligne %d"; break; - case MSG_BAD_READ_NUMBER: p = "Mauvais nombre %d de valeurs lues dans %s"; break; - case MSG_BAD_RECFM: p = "Recfm type %d invalide pour DOSCOL"; break; - case MSG_BAD_RECFM_VAL: p = "Valeur invalide %d de Recfm"; break; - case MSG_BAD_SET_CASE: p = "La casse d'un tableau ne peut pas passer de non respect à respecter"; break; - case MSG_BAD_SET_STRING: p = "SetValue: appel invalide pour STRING"; break; - case MSG_BAD_SPECIAL_COL: p = "Colonne spéciale invalide %s"; break; - case MSG_BAD_SPEC_COLUMN: p = "Colonne spéciale invalide pour ce type de table"; break; - case MSG_BAD_TABLE_TYPE: p = "Type invalide %s pour la table %s"; break; - case MSG_BAD_TYPE_LIKE: p = "Type(%d)= %d invalide pour LIKE"; break; - case MSG_BAD_VALBLK_INDX: p = "Valeur hors limites de l'index du bloc de valeurs"; break; - case MSG_BAD_VALBLK_TYPE: p = "Type=%d invalide pour un bloc de valeurs"; break; - case MSG_BAD_VALNODE: p = "Type %d invalide pour le noeud valeur colonne %s"; break; - case MSG_BAD_VALUE_TYPE: p = "Type de valeur invalide %d"; break; - case MSG_BAD_VAL_UPDATE: p = "Impossible de déterminer quelle valeur %s doit être mise à jour"; break; - case MSG_BAS_NS_LIST: p = "Format invalide de la liste des espace-noms"; break; - case MSG_BIN_F_TOO_LONG: p = "Valeur trop longue pour le champ %s (%d --> %d)"; break; - case MSG_BIN_MODE_FAIL: p = "Echec mode binaire: %s"; break; - case MSG_BLKTYPLEN_MISM: p = "Disparité types/longueurs de bloc dans SetValue"; break; - case MSG_BLK_IS_NULL: p = "Blk est nul"; break; - case MSG_BREAKPOINT: p = "Point de contrôle"; break; - case MSG_BUILD_INDEX: p = "Construction index %s sur %s"; break; - case MSG_CANNOT_OPEN: p = "Ouverture impossible de %s"; break; - case MSG_CHSIZE_ERROR: p = "Erreur dans chsize: %s"; break; - case MSG_COL_ALLOC_ERR: p = "Allocation impossible du noeud colonne"; break; - case MSG_COL_ISNOT_TABLE: p = "La colonne %s n'est pas dans la table %s"; break; - case MSG_COL_NOT_SORTED: p = "La colonne %s de la table %s n'est pas triée"; break; - case MSG_COL_NUM_MISM: p = "Disparité du nombre de colonnes"; break; - case MSG_COM_ERROR: p = "Erreur Com"; break; - case MSG_CONCAT_SUBNODE: p = "Concaténation de sous-noeuds impossible"; break; - case MSG_CONNECT_CANCEL: p = "Connection interrompue par l'utilisateur"; break; - case MSG_CONTROL_C_EXIT: p = "Exit par Ctrl-C"; break; - case MSG_DATABASE_LOADED: p = "Base de données %s chargée"; break; - case MSG_DATA_MISALIGN: p = "Mauvais alignement pour ce type de données"; break; - case MSG_DBASE_FILE: p = "Fichier dBASE dbf: "; break; - case MSG_DEF_ALLOC_ERROR: p = "Erreur d'allocation de la classe DEF %s"; break; - case MSG_DEL_FILE_ERR: p = "Erreur à l'effacement de %s"; break; - case MSG_DEL_READ_ERROR: p = "Delete: erreur en lecture req=%d len=%d"; break; - case MSG_DEL_WRITE_ERROR: p = "Delete: erreur en écriture: %s"; break; - case MSG_DEPREC_FLAG: p = "Option Flag périmée, utiliser Coltype"; break; - case MSG_DLL_LOAD_ERROR: p = "Erreur %d au chargement du module %s"; break; - case MSG_DOM_NOT_SUPP: p = "MS-DOM non supporté par cette version"; break; - case MSG_DVAL_NOTIN_LIST: p = "Valeur %s non trouvée dans la liste des valeurs distinctes de la colonne %s"; break; - case MSG_EMPTY_DOC: p = "Document vide"; break; - case MSG_EMPTY_FILE: p = "%s du fichier vide %s: "; break; - case MSG_EOF_AFTER_LINE: p = "Fin de fichier après la ligne %d"; break; - case MSG_EOF_INDEX_FILE: p = "EOF lisant le fichier index"; break; - case MSG_ERROR_IN_LSK: p = "Erreur %d dans lseek64"; break; - case MSG_ERROR_IN_SFP: p = "Erreur %d dans SetFilePointer"; break; - case MSG_ERR_READING_REC: p = "Erreur lisant l'enregistrement %d de %s"; break; - case MSG_FAIL_ADD_NODE: p = "L'ajout du noeud %s dans la table a échoué"; break; - case MSG_FETCH_NO_RES: p = "Fetch: Pas de Résultats"; break; - case MSG_FIELD_TOO_LONG: p = "Valeur trop longue pour le champs %d ligne %d"; break; - case MSG_FILELEN_ERROR: p = "Erreur dans %s pour %s"; break; - case MSG_FILE_IS_EMPTY: p = "Le fichier %s est vide"; break; - case MSG_FILE_MAP_ERR: p = "Erreur de File mapping"; break; - case MSG_FILE_MAP_ERROR: p = "CreateFileMapping %s erreur rc=%d"; break; - case MSG_FILE_OPEN_YET: p = "Fichier %s déjà ouvert"; break; - case MSG_FILE_UNFOUND: p = "Fichier %s non trouvé"; break; - case MSG_FLD_TOO_LNG_FOR: p = "Champs %d trop long pour %s ligne %d de %s"; break; - case MSG_FLT_BAD_RESULT: p = "Virgule flottante: résultat inexacte"; break; - case MSG_FLT_DENORMAL_OP: p = "Opérande virgule flottante non normalisé"; break; - case MSG_FLT_INVALID_OP: p = "Opération virgule flottante invalide"; break; - case MSG_FLT_OVERFLOW: p = "Dépassement de capacité virgule flottante"; break; - case MSG_FLT_STACK_CHECK: p = "Virgule flottante: Erreur de la pile"; break; - case MSG_FLT_UNDERFLOW: p = "Sous-dépassement de capacité virgule flottante"; break; - case MSG_FLT_ZERO_DIVIDE: p = "Virgule flottante: division par zéro"; break; - case MSG_FMT_WRITE_NIY: p = "L'écriture des fichiers %s n'est pas encore implémentée"; break; - case MSG_FOXPRO_FILE: p = "Fichier FoxPro: "; break; - case MSG_FPUTS_ERROR: p = "Erreur dans fputs: %s"; break; - case MSG_FSEEK_ERROR: p = "Erreur dans fseek: %s"; break; - case MSG_FSETPOS_ERROR: p = "Erreur dans fseek pour i=%d"; break; - case MSG_FTELL_ERROR: p = "Erreur dans ftell enregistrement=%d: %s"; break; - case MSG_FUNCTION_ERROR: p = "Erreur dans %s: %d"; break; - case MSG_FUNC_ERRNO: p = "Erreur %d dans %s"; break; - case MSG_FUNC_ERROR: p = "Erreur dans %s"; break; - case MSG_FUNC_ERR_S: p = "Erreur dans %s: %s"; break; - case MSG_FWRITE_ERROR: p = "Erreur dans fwrite: %s"; break; - case MSG_GET_DIST_VALS: p = "Récupération des valeurs distinctes de "; break; - case MSG_GET_FUNC_ERR: p = "Erreur en recherche de la fonction %s: %s"; break; - case MSG_GLOBAL_ERROR: p = "Erreur d'allocation de Global (taille=%d)\n"; break; - case MSG_GUARD_PAGE: p = "Violation de page de garde"; break; - case MSG_GZOPEN_ERROR: p = "gzopen %s: erreur %d sur %s"; break; - case MSG_ILLEGAL_INSTR: p = "Instruction illégale"; break; - case MSG_ILL_FILTER_CONV: p = "Conversion implicite illégale dans un filtre"; break; - case MSG_INDEX_NOT_UNIQ: p = "L'index n'est pas Unique"; break; - case MSG_INDEX_YET_ON: p = "L'index %s existe déjà sur %s"; break; - case MSG_INDX_COL_NOTIN: p = "La colonne index %s n'existe pas dans la table %s"; break; - case MSG_INDX_EXIST_YET: p = "L'entrée index existe déjà"; break; - case MSG_INIT_FAILED: p = "L'initialisation de %s a échoué"; break; - case MSG_INT_COL_ERROR: p = "Erreur interne sur la colonne index %s"; break; - case MSG_INT_OVERFLOW: p = "Dépassement de capacité sur entier"; break; - case MSG_INT_ZERO_DIVIDE: p = "Division entière par zéro"; break; - case MSG_INVALID_DISP: p = "Disposition invalide"; break; - case MSG_INVALID_FTYPE: p = "SBV: Ftype %d invalide"; break; - case MSG_INVALID_HANDLE: p = "Poignée invalide"; break; - case MSG_INVALID_OPER: p = "Opérateur invalide %d pour %s"; break; - case MSG_INV_COLUMN_TYPE: p = "Type %d Invalide pour la colonne %s"; break; - case MSG_INV_COL_TYPE: p = "Type de colonne %s invalide"; break; - case MSG_INV_DEF_READ: p = "Lecture différée invalide rc=%d"; break; - case MSG_INV_DIRCOL_OFST: p = "Offset invalide pour une colonne DIR"; break; - case MSG_INV_MAP_POS: p = "Position mémoire invalide"; break; - case MSG_INV_RAND_ACC: p = "L'accès aléatoire d'une table non optimisée est impossible"; break; - case MSG_INV_REC_POS: p = "Position d'enregistrement invalide"; break; - case MSG_INV_RESULT_TYPE: p = "Type de résultat invalide %s"; break; - case MSG_INV_UPDT_TABLE: p = "Table %s invalide pour Update"; break; - case MSG_IN_WITHOUT_SUB: p = "IN ou EXISTS sans tableau ou subquery"; break; - case MSG_KEY_ALLOC_ERR: p = "Erreur d'allocation d'un bloc offset clé"; break; - case MSG_KEY_ALLOC_ERROR: p = "Erreur d'allocation mémoire, Klen=%d n=%d"; break; - case MSG_LINE_TOO_LONG: p = "La nouvelle ligne est trop longue"; break; - case MSG_LIST: p = "--Liste--"; break; - case MSG_LOADING_FAILED: p = "Le chargement de %s a échoué"; break; - case MSG_LRECL_TOO_SMALL: p = "Lrecl trop petit (longueur en-tête = %d)"; break; - case MSG_MAKE_EMPTY_FILE: p = "Génération du fichier vide %s: %s"; break; - case MSG_MAKING: p = "Génération"; break; - case MSG_MALLOC_ERROR: p = "Allocation mémoire impossible par %s"; break; - case MSG_MAP_VIEW_ERROR: p = "MapViewOfFile %s erreur rc=%d"; break; - case MSG_MAXSIZE_ERROR: p = "Maxsize incalculable sur table ouverte"; break; - case MSG_MEM_ALLOC_ERR: p = "Erreur d'allocation mémoire, taille %s = %d"; break; - case MSG_MEM_ALLOC_ERROR: p = "Erreur d'allocation mémoire"; break; - case MSG_MISPLACED_QUOTE: p = "Appostrophe mal placée ligne %d"; break; - case MSG_MISSING_ARG: p = "Argument manquant pour l'opérateur %d"; break; - case MSG_MISSING_FIELD: p = "Champs %d manquant dans %s ligne %d"; break; - case MSG_MISSING_FNAME: p = "Nom du fichier manquant"; break; - case MSG_MISSING_NODE: p = "Noeud %s manquant dans %s"; break; - case MSG_MISSING_ROWNODE: p = "Impossible de trouver le noeud de la ligne %d"; break; - case MSG_MIS_TAG_LIST: p = "Liste des balises colonne manquante"; break; - case MSG_MUL_MAKECOL_ERR: p = "Erreur logique dans TABMUL::MakeCol"; break; - case MSG_NAME_CONV_ERR: p = "Erreur de convertion du nom de noeud"; break; - case MSG_NEW_DOC_FAILED: p = "Impossible de créer le nouveau document"; break; - case MSG_NEW_RETURN_NULL: p = "NULL renvoyé par New dans PlugEvalLike"; break; - case MSG_NEXT_FILE_ERROR: p = "Erreur en recherche du fichier suivant. rc=%s"; break; - case MSG_NONCONT_EXCEPT: p = "Exception non-continuable"; break; - case MSG_NOP_ZLIB_INDEX: p = "L'indexage d'une table zlib non optimisée est impossible"; break; - case MSG_NOT_A_DBF_FILE: p = "Le fichier n'a pas le format dBASE dbf "; break; - case MSG_NOT_FIXED_LEN: p = "Fichier %s non fixe, len=%d lrecl=%d"; break; - case MSG_NO_0DH_HEAD: p = "0DH manquant en fin d'en-tête (dbc=%d)"; break; - case MSG_NO_ACTIVE_DB: p = "Pas de base de données active"; break; - case MSG_NO_CHAR_FROM: p = "Conversion de type %d en caractères impossible"; break; - case MSG_NO_DATE_FMT: p = "Pas de format date pour le valblock de type %d"; break; - case MSG_NO_DEF_FNCCOL: p = "Colonne fonction par défaut introuvable"; break; - case MSG_NO_DEF_PIVOTCOL: p = "Colonne pivot par défaut introuvable"; break; - case MSG_NO_DIR_INDX_RD: p = "Pas d'accès directe des tables %s"; break; - case MSG_NO_FEAT_SUPPORT: p = "%s non supporté dans cette version"; break; - case MSG_NO_FLD_FORMAT: p = "Format absent pour le champs %d de %s"; break; - case MSG_NO_FORMAT_COL: p = "Type COLUMN informattable"; break; - case MSG_NO_FORMAT_TYPE: p = "Le format ne peut pas être défini à partir du type %d"; break; - case MSG_NO_INDEX_READ: p = "Pas d'accès directe des tables multiples"; break; - case MSG_NO_KEY_COL: p = "Pas de colonne clé trouvée"; break; - case MSG_NO_KEY_UPDATE: p = "Le nom des clés ne peut pas être modifié"; break; - case MSG_NO_MAP_INSERT: p = "MAP incompatible avec Insert"; break; - case MSG_NO_MATCHING_COL: p = "Pas de colonne correspondant à %s dans %s"; break; - case MSG_NO_MATCH_COL: p = "Colonne correspondante introuvable"; break; - case MSG_NO_MEMORY: p = "Mémoire pleine"; break; - case MSG_NO_MODE_PADDED: p = "Mode non supporté pour les fichiers 'padded'"; break; - case MSG_NO_MUL_VCT: p = "Les tables VCT ne peuvent pas être multiples"; break; - case MSG_NO_ODBC_DELETE: p = "Delete ne devrait pas être appelé pour les tables ODBC"; break; - case MSG_NO_ODBC_DIRECT: p = "Accès directe des tables ODBC non encore implémenté"; break; - case MSG_NO_ODBC_MUL: p = "Multiple(2) non supporté pour les tables ODBC"; break; - case MSG_NO_ODBC_SPECOL: p = "Pas de colonne spéciale ODBC"; break; - case MSG_NO_PART_DEL: p = "Delete partiel des fichier %s impossible"; break; - case MSG_NO_PART_MAP: p = "Mapping partiel non implémenté pour cet OS"; break; - case MSG_NO_PAR_BLK_INS: p = "Insertion de bloc partiel impossible"; break; - case MSG_NO_PIV_DIR_ACC: p = "Pas d'accès directe aux tables PIVOT"; break; - case MSG_NO_READ_32: p = "Lecture de 32 octets impossible"; break; - case MSG_NO_RECOV_SPACE: p = "Espace non recouvrable dans le fichier index"; break; - case MSG_NO_ROWID_FOR_AM: p = "Accès direct impossible de ROWID pour les tables de type %s"; break; - case MSG_NO_ROW_NODE: p = "Le nom du Rownode n'est pas défini"; break; - case MSG_NO_SECTION_NAME: p = "Nom de section manquant"; break; - case MSG_NO_SEC_UPDATE: p = "Les noms de section ne peuvent pas être modifiés"; break; - case MSG_NO_SETPOS_YET: p = "SetPos pas encore implémenté pour les fichier %s"; break; - case MSG_NO_SPEC_COL: p = "Pas de colonne spéciales MYSQL"; break; - case MSG_NO_SUB_VAL: p = "Pas de sous-value d'un tableau de type %d"; break; - case MSG_NO_TABCOL_DATA: p = "Pas de données pour la table %s colonne %s"; break; - case MSG_NO_TABLE_DEL: p = "Delete non autorisé pour les tables %s "; break; - case MSG_NO_TAB_DATA: p = "Pas de données pour la table %s"; break; - case MSG_NO_VCT_DELETE: p = "Délétion Partielle non implémentée pour les fichiers VCT"; break; - case MSG_NO_ZIP_DELETE: p = "Delete sur fichier Zip non encore implementé"; break; - case MSG_OPENING: p = "Ouverture"; break; - case MSG_OPEN_EMPTY_FILE: p = "Ouverture du fichier vide %s: %s"; break; - case MSG_OPEN_ERROR: p = "Erreur d'ouverture %d en mode %d sur %s: "; break; - case MSG_OPEN_ERROR_IS: p = "Erreur à l'ouverture de %s: %s"; break; - case MSG_OPEN_MODE_ERROR: p = "Erreur d'ouverture(%s) %d sur %s"; break; - case MSG_OPEN_STRERROR: p = "Erreur à l'ouverture: %s"; break; - case MSG_OPTBLK_RD_ERR: p = "Erreur à la lecture d'un bloc optimisation: %s"; break; - case MSG_OPTBLK_WR_ERR: p = "Erreur à l'écriture d'un bloc optimisation: %s"; break; - case MSG_OPTIMIZING: p = "Optimisation de "; break; - case MSG_OPT_BMAP_RD_ERR: p = "Erreur en lecture des bitmaps d'optimisation: %s"; break; - case MSG_OPT_BMAP_WR_ERR: p = "Erreur en écriture des bitmaps d'optimisation: %s"; break; - case MSG_OPT_CANCELLED: p = "Optimisation interrompue par l'utilisateur"; break; - case MSG_OPT_DVAL_RD_ERR: p = "Erreur en lecture des valeurs distinctes: %s"; break; - case MSG_OPT_DVAL_WR_ERR: p = "Erreur en écriture des valeurs distinctes: %s"; break; - case MSG_OPT_HEAD_RD_ERR: p = "Erreur en lecture de l'entête du fichier opt: %s"; break; - case MSG_OPT_HEAD_WR_ERR: p = "Erreur en écriture de l'entête du fichier opt: %s"; break; - case MSG_OPT_LOGIC_ERR: p = "Erreur logique dans SetBitmap, i=%d"; break; - case MSG_OPT_MAX_RD_ERR: p = "Erreur en lecture des valeurs maxi: %s"; break; - case MSG_OPT_MAX_WR_ERR: p = "Erreur en écriture des valeurs maxi: %s"; break; - case MSG_OPT_MIN_RD_ERR: p = "Erreur en lecture des valeurs mini: %s"; break; - case MSG_OPT_MIN_WR_ERR: p = "Erreur en écriture des valeurs mini: %s"; break; - case MSG_OPT_NOT_MATCH: p = "Le fichier opt %s n'est pas à jour"; break; - case MSG_PAGE_ERROR: p = "Erreur de pagination"; break; - case MSG_PARM_CNT_MISS: p = "Disparité du nombre de Paramètres"; break; - case MSG_PREC_VBLP_NULL: p = "ARRAY SetPrecision: Vblp est NULL"; break; - case MSG_PRIV_INSTR: p = "Instruction privilégiée"; break; - case MSG_PROCADD_ERROR: p = "Erreur %d sur l'adresse de %s"; break; - case MSG_QUERY_CANCELLED: p = "Requête interrompue par l'utilisateur"; break; - case MSG_RANGE_NO_JOIN: p = "Range non compatible avec les index de jointure"; break; - case MSG_RC_READING: p = "rc=%d en lecture de la table %s"; break; - case MSG_READY: p = "Prêt"; break; - case MSG_READ_ERROR: p = "Erreur en lecture sur %s: %s"; break; - case MSG_READ_ONLY: p = "Cette table protégée en lecture seule ne peut être modifiée"; break; - case MSG_READ_SEEK_ERROR: p = "Erreur de recherche en lecture: %s"; break; - case MSG_REGISTER_ERR: p = "Enregistrement NS impossible, préfix='%s' et href='%s'"; break; - case MSG_REMOVE_ERROR: p = "Erreur en supprimant %s: %s"; break; - case MSG_RENAME_ERROR: p = "Erreur renommant %s en %s: %s"; break; - case MSG_ROWID_NOT_IMPL: p = "RowNumber non implémenté pour les tables de type %s"; break; - case MSG_SEC_KEY_FIRST: p = "Les sections et clés doivent être insérées en premier"; break; - case MSG_SEC_NAME_FIRST: p = "Le nom de section doit être en tête de liste en insertion"; break; - case MSG_SEP_IN_FIELD: p = "Le champ %d contient le caractère séparateur"; break; - case MSG_SEQUENCE_ERROR: p = "HSTMT: Allocation hors séquence"; break; - case MSG_SETEOF_ERROR: p = "Erreur %d dans SetEndOfFile"; break; - case MSG_SETRECPOS_NIY: p = "SetRecpos non implémenté pour ce type de table"; break; - case MSG_SET_STR_TRUNC: p = "SetValue: Chaîne de caractères tronquée"; break; - case MSG_SFP_ERROR: p = "Erreur sur SetFilePointer: %s"; break; - case MSG_SHARED_LIB_ERR: p = "Erreur au chargement de la librairie partagée %s: %s"; break; - case MSG_SINGLE_STEP: p = "Pas à pas"; break; - case MSG_SORTING_VAL: p = "Tri de %d valeurs"; break; - case MSG_SPCOL_READONLY: p = "La colonne spéciale %s est en lecture seulement"; break; - case MSG_SQL_CONF_ERROR: p = "Erreur SQL: SQL_CONFORMANCE"; break; - case MSG_SRCH_CLOSE_ERR: p = "Erreur à la fermeture de l'Handle de recherche"; break; - case MSG_SRC_TABLE_UNDEF: p = "La table source n'est pas définie"; break; - case MSG_STACK_OVERFLOW: p = "Dépassement de capacité de la pile"; break; - case MSG_TABDIR_READONLY: p = "Les tables DIR sont en lecture seulement"; break; - case MSG_TABLE_NOT_OPT: p = "Table non optimisable"; break; - case MSG_TABLE_NO_INDEX: p = "La table %s n'est pas indexable"; break; - case MSG_TABLE_READ_ONLY: p = "Les tables %s sont en lecture seulement "; break; - case MSG_TABMUL_READONLY: p = "Les tables multiples sont en lecture seulement"; break; - case MSG_TOO_MANY_FIELDS: p = "Trop de champs ligne %d de %s"; break; - case MSG_TOO_MANY_JUMPS: p = "Trop de niveaux de saut"; break; - case MSG_TOO_MANY_KEYS: p = "Trop de clés (%d)"; break; - case MSG_TO_BLK_IS_NULL: p = "To Blk est nul"; break; - case MSG_TRUNCATE_ERROR: p = "Erreur en troncation: %s"; break; - case MSG_TRUNC_BY_ESTIM: p = "Tronqué par l'option Estimate"; break; - case MSG_TYPE_MISMATCH: p = "Clé et source ne sont pas du même type"; break; - case MSG_TYPE_VALUE_ERR: p = "Colonne %s: disparité type(%s)/valeur(%s)"; break; - case MSG_UNBALANCE_QUOTE: p = "Appostrophe en trop ligne %d"; break; - case MSG_UNDEFINED_AM: p = "COLBLK %s: méthode d'accès indéfinie"; break; - case MSG_UNKNOWN_EXCPT: p = "Exception non répertoriée"; break; - case MSG_UNMATCH_FIL_ARG: p = "Argument de filtre dépareillé"; break; - case MSG_UPDATE_ERROR: p = "Erreur en Update sur %s"; break; - case MSG_UPD_ZIP_NOT_IMP: p = "Mise à jour des tables ZDOS non encore implementé"; break; - case MSG_VALSTR_TOO_LONG: p = "Valeur %s trop longue pour une chaîne de longueur %d"; break; - case MSG_VALTYPE_NOMATCH: p = "Disparité types de valeur"; break; - case MSG_VALUE_ERROR: p = "Colonne %s: bloc valeur nul"; break; - case MSG_VALUE_TOO_BIG: p = "Valeur %lld trop grande pour la colonne %s"; break; - case MSG_VALUE_TOO_LONG: p = "Valeur %s trop longue pour la colonne %s de longueur %d"; break; - case MSG_VAL_ALLOC_ERR: p = "Allocation impossible du noeud valeur"; break; - case MSG_VIR_NO_DELETE: p = "Delete impossible sur les tables %s"; break; - case MSG_VIR_READ_ONLY: p = "Les tables virtuelles %s sont en lecture seulement"; break; - case MSG_VOID_FIRST_ARG: p = "Le premier argument ne doit pas être vide"; break; - case MSG_WORK_AREA: p = "Espace de travail: %s"; break; - case MSG_WRITE_SEEK_ERR: p = "Erreur de recherche en écriture: %s"; break; - case MSG_WRITE_STRERROR: p = "Erreur en écriture sur %s: %s"; break; - case MSG_WRITING: p = "Ecriture"; break; - case MSG_WRITING_ERROR: p = "Erreur à l'écriture de %s: %s"; break; - case MSG_WS_CONV_ERR: p = "Erreur de convertion de %s en WS"; break; - case MSG_XCOL_MISMATCH: p = "La colonne %s ne correspond pas à l'index"; break; - case MSG_XFILE_READERR: p = "Erreur %d en lisant le fichier index"; break; - case MSG_XFILE_WRITERR: p = "Erreur en écrivant le fichier index: %s"; break; - case MSG_XMLTAB_INIT_ERR: p = "Erreur d'initialisation de la table XML"; break; - case MSG_XML_INIT_ERROR: p = "Erreur d'initialisation du nouveau fichier XML"; break; - case MSG_XPATH_CNTX_ERR: p = "Le nouveau contexte XPath ne peut être créé"; break; - case MSG_XPATH_EVAL_ERR: p = "Impossible d'évaluer l'emplacement xpath '%s'"; break; - case MSG_XPATH_NOT_SUPP: p = "Xpath non supporté colonne %s"; break; diff --git a/storage/connect/frids.h b/storage/connect/frids.h deleted file mode 100644 index 561dbb68837..00000000000 --- a/storage/connect/frids.h +++ /dev/null @@ -1,46 +0,0 @@ - case IDS_TABLES: p = "Table Entêtes"; break; - case IDS_TAB_01: p = "Catalogue"; break; - case IDS_TAB_02: p = "Schéma"; break; - case IDS_TAB_03: p = "Nom"; break; - case IDS_TAB_04: p = "Type"; break; - case IDS_TAB_05: p = "Remarque"; break; - case IDS_COLUMNS: p = "Colonne Entêtes"; break; - case IDS_COL_01: p = "Cat_Table"; break; - case IDS_COL_02: p = "Schem_Table"; break; - case IDS_COL_03: p = "Nom_Table"; break; - case IDS_COL_04: p = "Nom_Colonne"; break; - case IDS_COL_05: p = "Type_Données"; break; - case IDS_COL_06: p = "Nom_Type"; break; - case IDS_COL_07: p = "Précision"; break; - case IDS_COL_08: p = "Longueur"; break; - case IDS_COL_09: p = "Echelle"; break; - case IDS_COL_10: p = "Base"; break; - case IDS_COL_11: p = "Nullifiable"; break; - case IDS_COL_12: p = "Remarques"; break; - case IDS_PKEY: p = "Clé Entêtes"; break; - case IDS_PKY_01: p = "Cat_Table"; break; - case IDS_PKY_02: p = "Schem_Table"; break; - case IDS_PKY_03: p = "Nom_Table"; break; - case IDS_PKY_04: p = "Nom_Colonne"; break; - case IDS_PKY_05: p = "Numéro_Clé"; break; - case IDS_PKY_06: p = "Nom_Clé"; break; - case IDS_STAT: p = "Stat Entêtes"; break; - case IDS_STA_01: p = "Table_Catalog"; break; - case IDS_STA_02: p = "Table_Schema"; break; - case IDS_STA_03: p = "Table_Name"; break; - case IDS_STA_04: p = "Non_Unique"; break; - case IDS_STA_05: p = "Index_Qualifier"; break; - case IDS_STA_06: p = "Index_Name"; break; - case IDS_STA_07: p = "Type"; break; - case IDS_STA_08: p = "Seq_in_Index"; break; - case IDS_STA_09: p = "Column_Name"; break; - case IDS_STA_10: p = "Collation"; break; - case IDS_STA_11: p = "Cardinality"; break; - case IDS_STA_12: p = "Pages"; break; - case IDS_STA_13: p = "Filter_Condition"; break; - case IDS_DRIVER: p = "Driver Entêtes"; break; - case IDS_DRV_01: p = "Description"; break; - case IDS_DRV_02: p = "Attributs"; break; - case IDS_DSRC: p = "DataSrc Entêtes"; break; - case IDS_DSC_01: p = "Nom"; break; - case IDS_DSC_02: p = "Description"; break; diff --git a/storage/connect/frmsg.h b/storage/connect/frmsg.h deleted file mode 100644 index d58779b948f..00000000000 --- a/storage/connect/frmsg.h +++ /dev/null @@ -1,320 +0,0 @@ -#define MSG_ACCESS_VIOLATN "Violation accès mémoire" -#define MSG_ADD_BAD_TYPE "Ajout d'une valeur de type %s non conforme dans un tableau %s" -#define MSG_ALLOC_ERROR "Erreur d'allocation de %s" -#define MSG_ANSWER_TYPE "Réponse de type" -#define MSG_API_CONF_ERROR "Erreur SQL: API_CONFORMANCE" -#define MSG_APPL_NOT_INIT "Application non initialisée" -#define MSG_ARRAY_BNDS_EXCD "Hors limite de tableau" -#define MSG_BAD_ARRAY_OPER "Les tableaux doivent utiliser l'opérateur IN" -#define MSG_BAD_ARRAY_TYPE "Type=%d invalide pour un tableau" -#define MSG_BAD_ARRAY_VAL "Les tableaux doivent avoir le même nombre de valeurs" -#define MSG_BAD_BIN_FMT "Format invalide %c pour la colonne BIN %s" -#define MSG_BAD_BLK_ESTIM "Nombre de blocs supérieur à l'estimation" -#define MSG_BAD_BLK_SIZE "Taille du bloc %d non conforme" -#define MSG_BAD_BYTE_NUM "Le nombre d'octets écrits est faux" -#define MSG_BAD_BYTE_READ "Le nombre d'octets lus est faux" -#define MSG_BAD_COL_TYPE "Type invalide %s pour la colonne %s" -#define MSG_BAD_COL_XPATH "Xpath invalide colonne %s de la table HTML %s" -#define MSG_BAD_CONST_TYPE "Type=%d invalide pour une constante" -#define MSG_BAD_CONV_TYPE "Convertion de type invalide %d" -#define MSG_BAD_DATETIME "Valeur date/temps invalide" -#define MSG_BAD_DBF_FILE "Le fichier DBF %s est altéré" -#define MSG_BAD_DBF_REC "Fichier DBF %s altéré enregistrement %d" -#define MSG_BAD_DBF_TYPE "Type DBF %c non supporté colonne %s" -#define MSG_BAD_DIRECTORY "Répertoire invalide %s: %s" -#define MSG_BAD_FIELD_RANK "Rang %d invalide pour la colonne %s" -#define MSG_BAD_FIELD_TYPE "Mauvais type de champ %s" -#define MSG_BAD_FILE_HANDLE "Handle de fichier invalide: %s" -#define MSG_BAD_FILTER "Mauvais filtre: Opc=%d B_T=%d %d Type=%d %d" -#define MSG_BAD_FILTER_CONV "Conversion filtre incorrecte, B_T=%d,%d" -#define MSG_BAD_FILTER_OP "Opérateur de filtre invalide %d" -#define MSG_BAD_FLD_FORMAT "Format invalide pour le champs %d de %s" -#define MSG_BAD_FLD_LENGTH "Champs %s trop long (%s --> %d) ligne %d de %s" -#define MSG_BAD_FREQ_SET "Spécification erronnée de Freq pour la colonne %s" -#define MSG_BAD_FUNC_MODE "%s: mode invalide %d" -#define MSG_BAD_HANDLE_VAL "Valeur Handle invalide" -#define MSG_BAD_HEADER "Fichier %s: bloc en-tête altéré" -#define MSG_BAD_HEAD_END "Lecture fin d'en-tête impossible" -#define MSG_BAD_INDEX_FILE "Fichier index %s corrompu" -#define MSG_BAD_LINEFLD_FMT "Format invalide ligne %d champs %d de %s" -#define MSG_BAD_LINE_LEN "Longueur ligne non égale à Lrecl" -#define MSG_BAD_LRECL "Disparité lrecl table/fichier (%d,%hd)" -#define MSG_BAD_NODE_TYPE "Type noeud erroné pour la table" -#define MSG_BAD_OFFSET_VAL "Nul offset invalide pour une table CSV" -#define MSG_BAD_OPEN_MODE "Mode d'ouverture invalide %d" -#define MSG_BAD_PARAM_TYPE "%.8s: Paramètre de type=%d invalide" -#define MSG_BAD_PARM_COUNT "Nombre de paramètres incohérent" -#define MSG_BAD_QUOTE_FIELD "Quote manquante dans %s champs %d ligne %d" -#define MSG_BAD_READ_NUMBER "Mauvais nombre %d de valeurs lues dans %s" -#define MSG_BAD_RECFM "Recfm type %d invalide pour DOSCOL" -#define MSG_BAD_RECFM_VAL "Valeur invalide %d de Recfm" -#define MSG_BAD_SET_CASE "La casse d'un tableau ne peut pas passer de non respect à respecter" -#define MSG_BAD_SET_STRING "SetValue: appel invalide pour STRING" -#define MSG_BAD_SPECIAL_COL "Colonne spéciale invalide %s" -#define MSG_BAD_SPEC_COLUMN "Colonne spéciale invalide pour ce type de table" -#define MSG_BAD_TABLE_TYPE "Type invalide %s pour la table %s" -#define MSG_BAD_TYPE_LIKE "Type(%d)= %d invalide pour LIKE" -#define MSG_BAD_VALBLK_INDX "Valeur hors limites de l'index du bloc de valeurs" -#define MSG_BAD_VALBLK_TYPE "Type=%d invalide pour un bloc de valeurs" -#define MSG_BAD_VALNODE "Type %d invalide pour le noeud valeur colonne %s" -#define MSG_BAD_VALUE_TYPE "Type de valeur invalide %d" -#define MSG_BAD_VAL_UPDATE "Impossible de déterminer quelle valeur %s doit être mise à jour" -#define MSG_BAS_NS_LIST "Format invalide de la liste des espace-noms" -#define MSG_BIN_F_TOO_LONG "Valeur trop longue pour le champ %s (%d --> %d)" -#define MSG_BIN_MODE_FAIL "Echec mode binaire: %s" -#define MSG_BLKTYPLEN_MISM "Disparité types/longueurs de bloc dans SetValue" -#define MSG_BLK_IS_NULL "Blk est nul" -#define MSG_BREAKPOINT "Point de contrôle" -#define MSG_BUILD_INDEX "Construction index %s sur %s" -#define MSG_CANNOT_OPEN "Ouverture impossible de %s" -#define MSG_CHSIZE_ERROR "Erreur dans chsize: %s" -#define MSG_COL_ALLOC_ERR "Allocation impossible du noeud colonne" -#define MSG_COL_ISNOT_TABLE "La colonne %s n'est pas dans la table %s" -#define MSG_COL_NOT_SORTED "La colonne %s de la table %s n'est pas triée" -#define MSG_COL_NUM_MISM "Disparité du nombre de colonnes" -#define MSG_COM_ERROR "Erreur Com" -#define MSG_CONCAT_SUBNODE "Concaténation de sous-noeuds impossible" -#define MSG_CONNECT_CANCEL "Connection interrompue par l'utilisateur" -#define MSG_CONTROL_C_EXIT "Exit par Ctrl-C" -#define MSG_DATABASE_LOADED "Base de données %s chargée" -#define MSG_DATA_MISALIGN "Mauvais alignement pour ce type de données" -#define MSG_DBASE_FILE "Fichier dBASE dbf: " -#define MSG_DEF_ALLOC_ERROR "Erreur d'allocation de la classe DEF %s" -#define MSG_DEL_FILE_ERR "Erreur à l'effacement de %s" -#define MSG_DEL_READ_ERROR "Delete: erreur en lecture req=%d len=%d" -#define MSG_DEL_WRITE_ERROR "Delete: erreur en écriture: %s" -#define MSG_DEPREC_FLAG "Option Flag périmée, utiliser Coltype" -#define MSG_DLL_LOAD_ERROR "Erreur %d au chargement du module %s" -#define MSG_DOM_NOT_SUPP "MS-DOM non supporté par cette version" -#define MSG_DVAL_NOTIN_LIST "Valeur %s non trouvée dans la liste des valeurs distinctes de la colonne %s" -#define MSG_EMPTY_DOC "Document vide" -#define MSG_EMPTY_FILE "%s du fichier vide %s: " -#define MSG_EOF_AFTER_LINE "Fin de fichier après la ligne %d" -#define MSG_EOF_INDEX_FILE "EOF lisant le fichier index" -#define MSG_ERROR_IN_LSK "Erreur %d dans lseek64" -#define MSG_ERROR_IN_SFP "Erreur %d dans SetFilePointer" -#define MSG_ERR_READING_REC "Erreur lisant l'enregistrement %d de %s" -#define MSG_FAIL_ADD_NODE "L'ajout du noeud %s dans la table a échoué" -#define MSG_FETCH_NO_RES "Fetch: Pas de Résultats" -#define MSG_FIELD_TOO_LONG "Valeur trop longue pour le champs %d ligne %d" -#define MSG_FILELEN_ERROR "Erreur dans %s pour %s" -#define MSG_FILE_IS_EMPTY "Le fichier %s est vide" -#define MSG_FILE_MAP_ERR "Erreur de File mapping" -#define MSG_FILE_MAP_ERROR "CreateFileMapping %s erreur rc=%d" -#define MSG_FILE_OPEN_YET "Fichier %s déjà ouvert" -#define MSG_FILE_UNFOUND "Fichier %s non trouvé" -#define MSG_FLD_TOO_LNG_FOR "Champs %d trop long pour %s ligne %d de %s" -#define MSG_FLT_BAD_RESULT "Virgule flottante: résultat inexacte" -#define MSG_FLT_DENORMAL_OP "Opérande virgule flottante non normalisé" -#define MSG_FLT_INVALID_OP "Opération virgule flottante invalide" -#define MSG_FLT_OVERFLOW "Dépassement de capacité virgule flottante" -#define MSG_FLT_STACK_CHECK "Virgule flottante: Erreur de la pile" -#define MSG_FLT_UNDERFLOW "Sous-dépassement de capacité virgule flottante" -#define MSG_FLT_ZERO_DIVIDE "Virgule flottante: division par zéro" -#define MSG_FMT_WRITE_NIY "L'écriture des fichiers %s n'est pas encore implémentée" -#define MSG_FOXPRO_FILE "Fichier FoxPro: " -#define MSG_FPUTS_ERROR "Erreur dans fputs: %s" -#define MSG_FSEEK_ERROR "Erreur dans fseek: %s" -#define MSG_FSETPOS_ERROR "Erreur dans fseek pour i=%d" -#define MSG_FTELL_ERROR "Erreur dans ftell enregistrement=%d: %s" -#define MSG_FUNCTION_ERROR "Erreur dans %s: %d" -#define MSG_FUNC_ERRNO "Erreur %d dans %s" -#define MSG_FUNC_ERROR "Erreur dans %s" -#define MSG_FUNC_ERR_S "Erreur dans %s: %s" -#define MSG_FWRITE_ERROR "Erreur dans fwrite: %s" -#define MSG_GET_DIST_VALS "Récupération des valeurs distinctes de " -#define MSG_GET_FUNC_ERR "Erreur en recherche de la fonction %s: %s" -#define MSG_GLOBAL_ERROR "Erreur d'allocation de Global (taille=%d)\n" -#define MSG_GUARD_PAGE "Violation de page de garde" -#define MSG_GZOPEN_ERROR "gzopen %s: erreur %d sur %s" -#define MSG_ILLEGAL_INSTR "Instruction illégale" -#define MSG_ILL_FILTER_CONV "Conversion implicite illégale dans un filtre" -#define MSG_INDEX_NOT_UNIQ "L'index n'est pas Unique" -#define MSG_INDEX_YET_ON "L'index %s existe déjà sur %s" -#define MSG_INDX_COL_NOTIN "La colonne index %s n'existe pas dans la table %s" -#define MSG_INDX_EXIST_YET "L'entrée index existe déjà" -#define MSG_INIT_FAILED "L'initialisation de %s a échoué" -#define MSG_INT_COL_ERROR "Erreur interne sur la colonne index %s" -#define MSG_INT_OVERFLOW "Dépassement de capacité sur entier" -#define MSG_INT_ZERO_DIVIDE "Division entière par zéro" -#define MSG_INVALID_DISP "Disposition invalide" -#define MSG_INVALID_FTYPE "SBV: Ftype %d invalide" -#define MSG_INVALID_HANDLE "Poignée invalide" -#define MSG_INVALID_OPER "Opérateur invalide %d pour %s" -#define MSG_INV_COLUMN_TYPE "Type %d Invalide pour la colonne %s" -#define MSG_INV_COL_TYPE "Type de colonne %s invalide" -#define MSG_INV_DEF_READ "Lecture différée invalide rc=%d" -#define MSG_INV_DIRCOL_OFST "Offset invalide pour une colonne DIR" -#define MSG_INV_MAP_POS "Position mémoire invalide" -#define MSG_INV_RAND_ACC "L'accès aléatoire d'une table non optimisée est impossible" -#define MSG_INV_REC_POS "Position d'enregistrement invalide" -#define MSG_INV_RESULT_TYPE "Type de résultat invalide %s" -#define MSG_INV_UPDT_TABLE "Table %s invalide pour Update" -#define MSG_IN_WITHOUT_SUB "IN ou EXISTS sans tableau ou subquery" -#define MSG_KEY_ALLOC_ERR "Erreur d'allocation d'un bloc offset clé" -#define MSG_KEY_ALLOC_ERROR "Erreur d'allocation mémoire, Klen=%d n=%d" -#define MSG_LINE_TOO_LONG "La nouvelle ligne est trop longue" -#define MSG_LIST "--Liste--" -#define MSG_LOADING_FAILED "Le chargement de %s a échoué" -#define MSG_LRECL_TOO_SMALL "Lrecl trop petit (longueur en-tête = %d)" -#define MSG_MAKE_EMPTY_FILE "Génération du fichier vide %s: %s" -#define MSG_MAKING "Génération" -#define MSG_MALLOC_ERROR "Allocation mémoire impossible par %s" -#define MSG_MAP_VIEW_ERROR "MapViewOfFile %s erreur rc=%d" -#define MSG_MAXSIZE_ERROR "Maxsize incalculable sur table ouverte" -#define MSG_MEM_ALLOC_ERR "Erreur d'allocation mémoire, taille %s = %d" -#define MSG_MEM_ALLOC_ERROR "Erreur d'allocation mémoire" -#define MSG_MISPLACED_QUOTE "Appostrophe mal placée ligne %d" -#define MSG_MISSING_ARG "Argument manquant pour l'opérateur %d" -#define MSG_MISSING_FIELD "Champs %d manquant dans %s ligne %d" -#define MSG_MISSING_FNAME "Nom du fichier manquant" -#define MSG_MISSING_NODE "Noeud %s manquant dans %s" -#define MSG_MISSING_ROWNODE "Impossible de trouver le noeud de la ligne %d" -#define MSG_MIS_TAG_LIST "Liste des balises colonne manquante" -#define MSG_MUL_MAKECOL_ERR "Erreur logique dans TABMUL::MakeCol" -#define MSG_NAME_CONV_ERR "Erreur de convertion du nom de noeud" -#define MSG_NEW_DOC_FAILED "Impossible de créer le nouveau document" -#define MSG_NEW_RETURN_NULL "NULL renvoyé par New dans PlugEvalLike" -#define MSG_NEXT_FILE_ERROR "Erreur en recherche du fichier suivant. rc=%s" -#define MSG_NONCONT_EXCEPT "Exception non-continuable" -#define MSG_NOP_ZLIB_INDEX "L'indexage d'une table zlib non optimisée est impossible" -#define MSG_NOT_A_DBF_FILE "Le fichier n'a pas le format dBASE dbf " -#define MSG_NOT_FIXED_LEN "Fichier %s non fixe, len=%d lrecl=%d" -#define MSG_NO_0DH_HEAD "0DH manquant en fin d'en-tête (dbc=%d)" -#define MSG_NO_ACTIVE_DB "Pas de base de données active" -#define MSG_NO_CHAR_FROM "Conversion de type %d en caractères impossible" -#define MSG_NO_DATE_FMT "Pas de format date pour le valblock de type %d" -#define MSG_NO_DEF_FNCCOL "Colonne fonction par défaut introuvable" -#define MSG_NO_DEF_PIVOTCOL "Colonne pivot par défaut introuvable" -#define MSG_NO_DIR_INDX_RD "Pas d'accès directe des tables %s" -#define MSG_NO_FEAT_SUPPORT "%s non supporté dans cette version" -#define MSG_NO_FLD_FORMAT "Format absent pour le champs %d de %s" -#define MSG_NO_FORMAT_COL "Type COLUMN informattable" -#define MSG_NO_FORMAT_TYPE "Le format ne peut pas être défini à partir du type %d" -#define MSG_NO_INDEX_READ "Pas d'accès directe des tables multiples" -#define MSG_NO_KEY_COL "Pas de colonne clé trouvée" -#define MSG_NO_KEY_UPDATE "Le nom des clés ne peut pas être modifié" -#define MSG_NO_MAP_INSERT "MAP incompatible avec Insert" -#define MSG_NO_MATCHING_COL "Pas de colonne correspondant à %s dans %s" -#define MSG_NO_MATCH_COL "Colonne correspondante introuvable" -#define MSG_NO_MEMORY "Mémoire pleine" -#define MSG_NO_MODE_PADDED "Mode non supporté pour les fichiers 'padded'" -#define MSG_NO_MUL_VCT "Les tables VCT ne peuvent pas être multiples" -#define MSG_NO_ODBC_DELETE "Delete ne devrait pas être appelé pour les tables ODBC" -#define MSG_NO_ODBC_DIRECT "Accès directe des tables ODBC non encore implémenté" -#define MSG_NO_ODBC_MUL "Multiple(2) non supporté pour les tables ODBC" -#define MSG_NO_ODBC_SPECOL "Pas de colonne spéciale ODBC" -#define MSG_NO_PART_DEL "Delete partiel des fichier %s impossible" -#define MSG_NO_PART_MAP "Mapping partiel non implémenté pour cet OS" -#define MSG_NO_PAR_BLK_INS "Insertion de bloc partiel impossible" -#define MSG_NO_PIV_DIR_ACC "Pas d'accès directe aux tables PIVOT" -#define MSG_NO_READ_32 "Lecture de 32 octets impossible" -#define MSG_NO_RECOV_SPACE "Espace non recouvrable dans le fichier index" -#define MSG_NO_ROWID_FOR_AM "Accès direct impossible de ROWID pour les tables de type %s" -#define MSG_NO_ROW_NODE "Le nom du Rownode n'est pas défini" -#define MSG_NO_SECTION_NAME "Nom de section manquant" -#define MSG_NO_SEC_UPDATE "Les noms de section ne peuvent pas être modifiés" -#define MSG_NO_SETPOS_YET "SetPos pas encore implémenté pour les fichier %s" -#define MSG_NO_SPEC_COL "Pas de colonne spéciales MYSQL" -#define MSG_NO_SUB_VAL "Pas de sous-value d'un tableau de type %d" -#define MSG_NO_TABCOL_DATA "Pas de données pour la table %s colonne %s" -#define MSG_NO_TABLE_DEL "Delete non autorisé pour les tables %s " -#define MSG_NO_TAB_DATA "Pas de données pour la table %s" -#define MSG_NO_VCT_DELETE "Délétion Partielle non implémentée pour les fichiers VCT" -#define MSG_NO_ZIP_DELETE "Delete sur fichier Zip non encore implementé" -#define MSG_OPENING "Ouverture" -#define MSG_OPEN_EMPTY_FILE "Ouverture du fichier vide %s: %s" -#define MSG_OPEN_ERROR "Erreur d'ouverture %d en mode %d sur %s: " -#define MSG_OPEN_ERROR_IS "Erreur à l'ouverture de %s: %s" -#define MSG_OPEN_MODE_ERROR "Erreur d'ouverture(%s) %d sur %s" -#define MSG_OPEN_STRERROR "Erreur à l'ouverture: %s" -#define MSG_OPTBLK_RD_ERR "Erreur à la lecture d'un bloc optimisation: %s" -#define MSG_OPTBLK_WR_ERR "Erreur à l'écriture d'un bloc optimisation: %s" -#define MSG_OPTIMIZING "Optimisation de " -#define MSG_OPT_BMAP_RD_ERR "Erreur en lecture des bitmaps d'optimisation: %s" -#define MSG_OPT_BMAP_WR_ERR "Erreur en écriture des bitmaps d'optimisation: %s" -#define MSG_OPT_CANCELLED "Optimisation interrompue par l'utilisateur" -#define MSG_OPT_DVAL_RD_ERR "Erreur en lecture des valeurs distinctes: %s" -#define MSG_OPT_DVAL_WR_ERR "Erreur en écriture des valeurs distinctes: %s" -#define MSG_OPT_HEAD_RD_ERR "Erreur en lecture de l'entête du fichier opt: %s" -#define MSG_OPT_HEAD_WR_ERR "Erreur en écriture de l'entête du fichier opt: %s" -#define MSG_OPT_LOGIC_ERR "Erreur logique dans SetBitmap, i=%d" -#define MSG_OPT_MAX_RD_ERR "Erreur en lecture des valeurs maxi: %s" -#define MSG_OPT_MAX_WR_ERR "Erreur en écriture des valeurs maxi: %s" -#define MSG_OPT_MIN_RD_ERR "Erreur en lecture des valeurs mini: %s" -#define MSG_OPT_MIN_WR_ERR "Erreur en écriture des valeurs mini: %s" -#define MSG_OPT_NOT_MATCH "Le fichier opt %s n'est pas à jour" -#define MSG_PAGE_ERROR "Erreur de pagination" -#define MSG_PARM_CNT_MISS "Disparité du nombre de Paramètres" -#define MSG_PREC_VBLP_NULL "ARRAY SetPrecision: Vblp est NULL" -#define MSG_PRIV_INSTR "Instruction privilégiée" -#define MSG_PROCADD_ERROR "Erreur %d sur l'adresse de %s" -#define MSG_QUERY_CANCELLED "Requête interrompue par l'utilisateur" -#define MSG_RANGE_NO_JOIN "Range non compatible avec les index de jointure" -#define MSG_RC_READING "rc=%d en lecture de la table %s" -#define MSG_READY "Prêt" -#define MSG_READ_ERROR "Erreur en lecture sur %s: %s" -#define MSG_READ_ONLY "Cette table protégée en lecture seule ne peut être modifiée" -#define MSG_READ_SEEK_ERROR "Erreur de recherche en lecture: %s" -#define MSG_REGISTER_ERR "Enregistrement NS impossible, préfix='%s' et href='%s'" -#define MSG_REMOVE_ERROR "Erreur en supprimant %s: %s" -#define MSG_RENAME_ERROR "Erreur renommant %s en %s: %s" -#define MSG_ROWID_NOT_IMPL "RowNumber non implémenté pour les tables de type %s" -#define MSG_SEC_KEY_FIRST "Les sections et clés doivent être insérées en premier" -#define MSG_SEC_NAME_FIRST "Le nom de section doit être en tête de liste en insertion" -#define MSG_SEP_IN_FIELD "Le champ %d contient le caractère séparateur" -#define MSG_SEQUENCE_ERROR "HSTMT: Allocation hors séquence" -#define MSG_SETEOF_ERROR "Erreur %d dans SetEndOfFile" -#define MSG_SETRECPOS_NIY "SetRecpos non implémenté pour ce type de table" -#define MSG_SET_STR_TRUNC "SetValue: Chaîne de caractères tronquée" -#define MSG_SFP_ERROR "Erreur sur SetFilePointer: %s" -#define MSG_SHARED_LIB_ERR "Erreur au chargement de la librairie partagée %s: %s" -#define MSG_SINGLE_STEP "Pas à pas" -#define MSG_SORTING_VAL "Tri de %d valeurs" -#define MSG_SPCOL_READONLY "La colonne spéciale %s est en lecture seulement" -#define MSG_SQL_CONF_ERROR "Erreur SQL: SQL_CONFORMANCE" -#define MSG_SRCH_CLOSE_ERR "Erreur à la fermeture de l'Handle de recherche" -#define MSG_SRC_TABLE_UNDEF "La table source n'est pas définie" -#define MSG_STACK_OVERFLOW "Dépassement de capacité de la pile" -#define MSG_TABDIR_READONLY "Les tables DIR sont en lecture seulement" -#define MSG_TABLE_NOT_OPT "Table non optimisable" -#define MSG_TABLE_NO_INDEX "La table %s n'est pas indexable" -#define MSG_TABLE_READ_ONLY "Les tables %s sont en lecture seulement " -#define MSG_TABMUL_READONLY "Les tables multiples sont en lecture seulement" -#define MSG_TOO_MANY_FIELDS "Trop de champs ligne %d de %s" -#define MSG_TOO_MANY_JUMPS "Trop de niveaux de saut" -#define MSG_TOO_MANY_KEYS "Trop de clés (%d)" -#define MSG_TO_BLK_IS_NULL "To Blk est nul" -#define MSG_TRUNCATE_ERROR "Erreur en troncation: %s" -#define MSG_TRUNC_BY_ESTIM "Tronqué par l'option Estimate" -#define MSG_TYPE_MISMATCH "Clé et source ne sont pas du même type" -#define MSG_TYPE_VALUE_ERR "Colonne %s: disparité type(%s)/valeur(%s)" -#define MSG_UNBALANCE_QUOTE "Appostrophe en trop ligne %d" -#define MSG_UNDEFINED_AM "COLBLK %s: méthode d'accès indéfinie" -#define MSG_UNKNOWN_EXCPT "Exception non répertoriée" -#define MSG_UNMATCH_FIL_ARG "Argument de filtre dépareillé" -#define MSG_UPDATE_ERROR "Erreur en Update sur %s" -#define MSG_UPD_ZIP_NOT_IMP "Mise à jour des tables ZDOS non encore implementé" -#define MSG_VALSTR_TOO_LONG "Valeur %s trop longue pour une chaîne de longueur %d" -#define MSG_VALTYPE_NOMATCH "Disparité types de valeur" -#define MSG_VALUE_ERROR "Colonne %s: bloc valeur nul" -#define MSG_VALUE_TOO_BIG "Valeur %lld trop grande pour la colonne %s" -#define MSG_VALUE_TOO_LONG "Valeur %s trop longue pour la colonne %s de longueur %d" -#define MSG_VAL_ALLOC_ERR "Allocation impossible du noeud valeur" -#define MSG_VIR_NO_DELETE "Delete impossible sur les tables %s" -#define MSG_VIR_READ_ONLY "Les tables virtuelles %s sont en lecture seulement" -#define MSG_VOID_FIRST_ARG "Le premier argument ne doit pas être vide" -#define MSG_WORK_AREA "Espace de travail: %s" -#define MSG_WRITE_SEEK_ERR "Erreur de recherche en écriture: %s" -#define MSG_WRITE_STRERROR "Erreur en écriture sur %s: %s" -#define MSG_WRITING "Ecriture" -#define MSG_WRITING_ERROR "Erreur à l'écriture de %s: %s" -#define MSG_WS_CONV_ERR "Erreur de convertion de %s en WS" -#define MSG_XCOL_MISMATCH "La colonne %s ne correspond pas à l'index" -#define MSG_XFILE_READERR "Erreur %d en lisant le fichier index" -#define MSG_XFILE_WRITERR "Erreur en écrivant le fichier index: %s" -#define MSG_XMLTAB_INIT_ERR "Erreur d'initialisation de la table XML" -#define MSG_XML_INIT_ERROR "Erreur d'initialisation du nouveau fichier XML" -#define MSG_XPATH_CNTX_ERR "Le nouveau contexte XPath ne peut être créé" -#define MSG_XPATH_EVAL_ERR "Impossible d'évaluer l'emplacement xpath '%s'" -#define MSG_XPATH_NOT_SUPP "Xpath non supporté colonne %s" diff --git a/storage/connect/frmsg1.h b/storage/connect/frmsg1.h deleted file mode 100644 index e88440a3a9c..00000000000 --- a/storage/connect/frmsg1.h +++ /dev/null @@ -1,1013 +0,0 @@ -#define MSG_ACCESS_VIOLATN "Violation accès mémoire" -#define MSG_ACT_ALLOC_FAIL "PlugInitLang: Erreur d'allocation du bloc Activity" -#define MSG_ADDVAL_ERROR "Erreur %d dans AddValue" -#define MSG_ADD_BAD_TYPE "Ajout d'une valeur de type %s non conforme dans un tableau %s" -#define MSG_ADD_NULL_DOM "Ajout de la chaîne %s à un domaine nul" -#define MSG_ADPOS_IN_DICTP "ADPOS au travail dans User_Dictp" -#define MSG_AFTER " après: " -#define MSG_ALG_CHOICE_AUTO "Le choix du meilleur algorithme est automatique" -#define MSG_ALG_CHOICE_BAD "Choix d'algorithme invalide, remis à AUTO" -#define MSG_ALG_CHOICE_QRY "Utilise l'algorithme 'Query'" -#define MSG_ALG_CURLY_BRK "Le choix de l'algorithme dépend des accolades externes" -#define MSG_ALLOC_ERROR "Erreur d'allocation de %s" -#define MSG_ALL_DELETED "Toutes les lignes enlevées en %.2lf sec" -#define MSG_ALTER_DB_ERR "Impossible de déterminer la base de données à modifier" -#define MSG_AMBIG_COL_QUAL "Qualificateur ambigu %s pour la colonne %s" -#define MSG_AMBIG_CORREL "Select %s.* corrélation ambigue" -#define MSG_AMBIG_SPEC_COL "Colonne spéciale ambiguë %s" -#define MSG_ANSWER_TYPE "Réponse de type" -#define MSG_API_CONF_ERROR "Erreur SQL: API_CONFORMANCE" -#define MSG_APPL_ACCESSIBLE "Application %s accessible" -#define MSG_APPL_ACTIVE "Application %s encore active" -#define MSG_APPL_BAD_SAVE "Application %s partiellement sauvegardée" -#define MSG_APPL_CREATED "Application %s crée" -#define MSG_APPL_IS_ACTIVE "Application déjà active" -#define MSG_APPL_NOT_INIT "Application non initialisée" -#define MSG_APPL_NOT_LOADED "Application non chargée" -#define MSG_APPL_QUIT "Fin de l'application %s" -#define MSG_APPL_SAVED "Application %s sauvegardée" -#define MSG_APP_STILL_ACTIV "Application du langage %s encore active (non libérable)" -#define MSG_AREAFILE_NOTFND "Fichier Area introuvable" -#define MSG_ARGS_SYNTAX_ERR "?SetArgs erreur de syntaxe: %s inattendu après %s" -#define MSG_ARG_ALREADY_SET "Argument %d déjà alloué" -#define MSG_ARG_NOT_AN_ATTR "L'argument n'est pas un attribut (type %d erroné)" -#define MSG_ARG_OUT_CONTEXT "Argument de type @ utilisé hors contexte" -#define MSG_ARG_OUT_RANGE "Argument de phrase valant %d hors limite" -#define MSG_ARG_PTR_NOSEM "Argument valant %d pointe sur un noeud sans Sem" -#define MSG_ARG_PTR_NOSEMS "Argument valant %d pointe sur un noeud sans sémantique" -#define MSG_ARG_REF_LOOP "?Bouclage entre références croisées des arguments" -#define MSG_ARG_TWO_CONST "Le 2ème argument de %s doit être constant" -#define MSG_ARRAY_ALLOC_ERR "Erreur d'allocation mémoire dans ARRAY" -#define MSG_ARRAY_BNDS_EXCD "Hors limite de tableau" -#define MSG_ARRAY_ERROR "Erreur de fonctionnement k=%d n=%d" -#define MSG_ATTRIBUTE_ERROR "Erreur règle %u attribut %s: " -#define MSG_ATT_NOT_CASE "Mauvaise valeur %d pour attribut (pas une CaseValue)" -#define MSG_ATT_POSCODE_BIG "Code attribut %d trop grand (max=%d)" -#define MSG_AVGLEN_ERROR "avglen doit être entre %d et %d" -#define MSG_BAD_AGGREG_FUNC "Fonction aggrégée %d non supportée" -#define MSG_BAD_ARGTYPES "Argument de type invalide pour %s" -#define MSG_BAD_ARGUMENTS "Argument not attachés pour %s" -#define MSG_BAD_ARG_NUM "Nombre d'arguments invalide %d" -#define MSG_BAD_ARG_TYPE "Type d'argument %d invalide" -#define MSG_BAD_ARRAY_OPER "Les tableaux doivent utiliser l'opérateur IN" -#define MSG_BAD_ARRAY_TYPE "Type=%d invalide pour un tableau" -#define MSG_BAD_ARRAY_VAL "Les tableaux doivent avoir le même nombre de valeurs" -#define MSG_BAD_BIN_FMT "Format invalide %c pour la colonne BIN %s" -#define MSG_BAD_BLK_ESTIM "Nombre de blocs supérieur à l'estimation" -#define MSG_BAD_BLK_SIZE "Taille du bloc %d non conforme" -#define MSG_BAD_BYTE_NUM "Le nombre d'octets écrits est faux" -#define MSG_BAD_BYTE_READ "Le nombre d'octets lus est faux" -#define MSG_BAD_CARDINALITY "Appel invalide de Cardinality pour une table multiple" -#define MSG_BAD_CASE_SPEC "Min/Maj: spécification %c incorrecte, recommencez: " -#define MSG_BAD_CHAR_SPEC "Spécification '%s' invalide pour caractère" -#define MSG_BAD_CHECK_TYPE "Sous-type %d invalide pour CheckColumn" -#define MSG_BAD_CHECK_VAL "Valeur pour Check invalide '%s'" -#define MSG_BAD_COLCRT_ARG "COLCRT: Arg invalide (type=%hd, domain=%hd)" -#define MSG_BAD_COLDEF_TYPE "Coldefs: type illégal %d" -#define MSG_BAD_COLIST_ITEM "Elément invalide dans une Colist" -#define MSG_BAD_COLIST_TYPE "Mauvais type=%d pour une Colist" -#define MSG_BAD_COLSIZE "Colsize %d trop petit pour cette base de données" -#define MSG_BAD_COL_ENTRY "Entrée invalide pour la colonne %s" -#define MSG_BAD_COL_FORMAT "Type de formattage %d invalide pour une colonne" -#define MSG_BAD_COL_IN_FILT "Colonne incorrecte dans un filtre" -#define MSG_BAD_COL_QUALIF "Qualificateur invalide %s pour la colonne %s" -#define MSG_BAD_COL_TYPE "Type invalide %s pour la colonne %s" -#define MSG_BAD_COL_XPATH "Xpath invalide colonne %s de la table HTML %s" -#define MSG_BAD_COMPARE_OP "Opérateur de comparaison %d invalide" -#define MSG_BAD_CONST_TYPE "Type=%d invalide pour une constante" -#define MSG_BAD_CONV_TYPE "Convertion de type invalide %d" -#define MSG_BAD_CORREL "Select %s.* corrélation absente" -#define MSG_BAD_DATETIME "Valeur date/temps invalide" -#define MSG_BAD_DATE_OPER "Opérateur de date inattendu %d" -#define MSG_BAD_DBF_FILE "Le fichier DBF %s est altéré" -#define MSG_BAD_DBF_REC "Fichier DBF %s altéré enregistrement %d" -#define MSG_BAD_DBF_TYPE "Type DBF %c non supporté" -#define MSG_BAD_DEF_ARG "Argument invalide pour INDEXDEF (type=%hd, domain=%hd)" -#define MSG_BAD_DEF_READ "EOF inattendue en lecture différée" -#define MSG_BAD_DEF_TYPE "Type de colonne invalide" -#define MSG_BAD_DIRECTORY "Répertoire invalide %s: %s" -#define MSG_BAD_DIST_JN_FIL "Filtre de jointure distincte invalide" -#define MSG_BAD_DIST_JOIN "Spécification invalide de jointure distincte" -#define MSG_BAD_DOM_COL_DEF "Définition de colonnes invalide pour un domaine" -#define MSG_BAD_DOM_VALUE "La valeur %d n'appartient pas au domaine" -#define MSG_BAD_EDIT_INIT "Coparm: édition %s initialisée improprement" -#define MSG_BAD_EVAL_TYPE "Fonction scalaire de type=%d invalide" -#define MSG_BAD_EXEC_MODE "Mode d'exécution invalide '%s'" -#define MSG_BAD_EXP_ARGTYPE "Argument de type %d invalide pour une expression" -#define MSG_BAD_EXP_OPER "Opérateur=%d invalide pour expression" -#define MSG_BAD_FETCH_RC "Code retour inattendu de Fetch %d" -#define MSG_BAD_FIELD_FMT "Format de champ invalide %c pour %s" -#define MSG_BAD_FIELD_RANK "Rang %d invalide pour la colonne %s" -#define MSG_BAD_FIELD_TYPE "Mauvais type de champ %s" -#define MSG_BAD_FILE_HANDLE "Handle de fichier invalide: %s" -#define MSG_BAD_FILE_LIST "La section liste de fichiers est erronée" -#define MSG_BAD_FILTER "Mauvais filtre: Opc=%d B_T=%d %d Type=%d %d" -#define MSG_BAD_FILTER_CONV "Conversion filtre incorrecte, B_T=%d,%d" -#define MSG_BAD_FILTER_LINK "Opérateur de chaînage illégal %d" -#define MSG_BAD_FILTER_OP "Opérateur de filtre invalide %d" -#define MSG_BAD_FILTEST_OP "Opérateur invalide %d %d pour FilTest" -#define MSG_BAD_FLD_FORMAT "Format invalide pour le champs %d de %s" -#define MSG_BAD_FLD_LENGTH "Champs %s trop long (%s --> %d) ligne %d de %s" -#define MSG_BAD_FLOAT_CONV "Convertion invalide d'un tableau flottant" -#define MSG_BAD_FPARM_NEXT "Coparm: FPARM avec Next non nul" -#define MSG_BAD_FREQ_SET "Spécification erronnée de Freq pour la colonne %s" -#define MSG_BAD_FUNC_ARG "Funcarg de type %d non implémenté" -#define MSG_BAD_FUNC_ARGTYP "Mauvais type d'argument=%d pour une fonction" -#define MSG_BAD_FUNC_MODE "%s: mode invalide %d" -#define MSG_BAD_GENRE "Genre est invalide" -#define MSG_BAD_GETVIEW_RET "GetView: type de retour %d invalide" -#define MSG_BAD_HANDLE_VAL "Valeur Handle invalide" -#define MSG_BAD_HAV_FILTER "Filtre Having sur une requête non groupée" -#define MSG_BAD_HAV_FILTYPE "Filtre invalide pour clause Having" -#define MSG_BAD_HEADER "Fichier %s: bloc en-tête altéré" -#define MSG_BAD_HEADER_VAL "Valeur invalide pour Header" -#define MSG_BAD_HEAD_END "Lecture fin d'en-tête impossible" -#define MSG_BAD_INDEX_COL "Colonne %s invalide pour index %s" -#define MSG_BAD_INDEX_DEF "Définition invalide pour index %s" -#define MSG_BAD_INDEX_FILE "Fichier index %s corrompu" -#define MSG_BAD_INDEX_PART "Définition colonne invalide pour index %s" -#define MSG_BAD_INPUT "Entrée incorrecte" -#define MSG_BAD_IN_ARGTYPE "Argument de type invalide pour l'opérateur IN" -#define MSG_BAD_IN_ENDING "Erreur: fin de chaîne IN invalide" -#define MSG_BAD_IN_STRING "La chaîne IN commence ou finie par des caractères invalides %c ... %c" -#define MSG_BAD_JCOL_TYPE "Erreur logique JCT: disparité des types colonnes" -#define MSG_BAD_JOIN_EXP "Expression invalide pour une jointure" -#define MSG_BAD_JOIN_FILTER "Filtre de jointure invalide" -#define MSG_BAD_JOIN_OP "Opérateur de joint invalide %d" -#define MSG_BAD_LANG_SIZE "Le fichier langage a une mauvaise taille %d" -#define MSG_BAD_LINEFLD_FMT "Format invalide ligne %d champs %d de %s" -#define MSG_BAD_LINE_LEN "Longueur ligne non égale à Lrecl" -#define MSG_BAD_LIST_TYPE "Type de liste invalide %d" -#define MSG_BAD_LOCALE "Locale invalide %s" -#define MSG_BAD_LOCDFON_ARG "Mauvais paramètre pour LOCDFON" -#define MSG_BAD_LOCNODE_USE "Usage inattendu de LOCNODE" -#define MSG_BAD_LRECL "Disparité lrecl table/fichier (%d,%hd)" -#define MSG_BAD_MAX_HAVING "MAXTMP trop petit pour Having" -#define MSG_BAD_MAX_NREC "MaxRec=%d ne correspond pas à MaxBlk=%d Nrec=%d" -#define MSG_BAD_MAX_PARAM "Mauvais paramètres pour spécifier une valeur maximum" -#define MSG_BAD_MAX_SETTING "Mauvaise valeur '%c' pour max" -#define MSG_BAD_MERGE_TYPE "Le type %d ne pas être intercallé" -#define MSG_BAD_NODE_TYPE "Type noeud erroné pour la table" -#define MSG_BAD_OFFSET_VAL "Nul offset invalide pour une table CSV" -#define MSG_BAD_OPEN_MODE "Mode d'ouverture invalide %d" -#define MSG_BAD_OPERATOR "Opérateur invalide %s" -#define MSG_BAD_ORDER_MODE "Mode de tri %c invalide" -#define MSG_BAD_ORDER_TYPE "Tri sur objet de type=%d invalide" -#define MSG_BAD_OUTER_JOIN "Jointure externe invalide sur table enfant" -#define MSG_BAD_PAD_ARGTYP "Argument de type invalide pour Pad ou Justify" -#define MSG_BAD_PARAMETERS "%.8s: Mauvais paramètres" -#define MSG_BAD_PARAM_TYPE "%.8s: Paramètre de type=%d invalide" -#define MSG_BAD_PARM_COUNT "Nombre de paramètres incohérent" -#define MSG_BAD_PHASE_NUM "Numéro de phrase %d hors limite" -#define MSG_BAD_PHRASE_NB "numéro de phrase hors limite %d rc=%d\n" -#define MSG_BAD_POS_CODE "POS_code invalide %d" -#define MSG_BAD_POS_TYPE "Type de POS_code invalide %d" -#define MSG_BAD_PROJNUM "Mauvais projnum %d pour la colonne %s" -#define MSG_BAD_QUERY_OPEN "Mode invalide %d pour l'ouverture d'une requête" -#define MSG_BAD_QUERY_TYPE "Type de requête %d invalide pour %s" -#define MSG_BAD_QUOTE_FIELD "Quote manquante dans %s champs %d ligne %d" -#define MSG_BAD_READ_NUMBER "Mauvais nombre %d de valeurs lues dans %s" -#define MSG_BAD_RECFM "Recfm type %d invalide pour DOSCOL" -#define MSG_BAD_RECFM_VAL "Valeur invalide %d de Recfm" -#define MSG_BAD_RESULT_TYPE "Mauvais type de résultat %d pour %s" -#define MSG_BAD_RETURN_TYPE "Type de retour %d incorrect" -#define MSG_BAD_ROW_VALIST "Liste de valeurs invalide pour ROW" -#define MSG_BAD_ROW_VALNB "Nombre de valeurs inégal dans la liste" -#define MSG_BAD_SCF_ARGTYPE "Argument %d de type=%s invalide pour %s" -#define MSG_BAD_SEM_DOMAIN "Domain .%d invalide" -#define MSG_BAD_SETTINGS "Certaines spécifications sont incompatibles avec le type de la table" -#define MSG_BAD_SET_CASE "La casse d'un tableau ne peut pas passer de non respect à respecter" -#define MSG_BAD_SET_STRING "SetValue: appel invalide pour STRING" -#define MSG_BAD_SET_TYPE "Set type %hd invalide" -#define MSG_BAD_SPECIAL_CMD "Commande spéciale invalide" -#define MSG_BAD_SPECIAL_COL "Colonne spéciale invalide %s" -#define MSG_BAD_SPEC_COLUMN "Colonne spéciale invalide pour ce type de table" -#define MSG_BAD_SQL_PARAM "Paramètre SQL invalide pour FindColblk" -#define MSG_BAD_SUBLST_TYPE "Coparm: type %d de sous-liste invalide" -#define MSG_BAD_SUBSEL_IN_X "Sub-select invalide pour une expression" -#define MSG_BAD_SUBSEL_TYPE "Type %d invalide retourné de Sub-Select" -#define MSG_BAD_SUB_RESULT "Résultat indéfini de fonction Sub-Select" -#define MSG_BAD_SUB_SELECT "Sub-select invalide comme argument de fonction" -#define MSG_BAD_TABLE_LINE "Ligne '%s' illégale ou tronquée dans la section Tables" -#define MSG_BAD_TABLE_LIST "Table %s absente de la liste des tables" -#define MSG_BAD_TABLE_TYPE "Type invalide %s pour la table %s" -#define MSG_BAD_TEST_TYPE "BlockTest sur tableau: types dépareillés %s %s" -#define MSG_BAD_TRIM_ARGTYP "Argument de type invalide pour Trim" -#define MSG_BAD_TYPE_FOR_IN "Types d'argument incompatibles pour la fonction IN" -#define MSG_BAD_TYPE_FOR_S "Type incorrecte %d pour %s(%d)" -#define MSG_BAD_TYPE_LIKE "Type(%d)= %d invalide pour LIKE" -#define MSG_BAD_UPD_COR "Le qualificateur %s de la colonne %s ne se refère pas à la table mise à jour %s" -#define MSG_BAD_USERBLK_LEN "Mauvaise longueur à l'écriture du bloc utilisateur" -#define MSG_BAD_USETEMP "Usetemp invalide '%s'" -#define MSG_BAD_USETEMP_VAL "Valeur pour Usetemp invalide %d" -#define MSG_BAD_VALBLK_INDX "Valeur hors limites de l'index du bloc de valeurs" -#define MSG_BAD_VALBLK_TYPE "Type=%d invalide pour un bloc de valeurs" -#define MSG_BAD_VALNODE "Type %d invalide pour le noeud valeur colonne %s" -#define MSG_BAD_VALUE_TYPE "Type de valeur invalide %d" -#define MSG_BAD_VAL_UPDATE "Impossible de déterminer quelle valeur %s doit être mise à jour" -#define MSG_BAD_VIEW_OPEN "Mode invalide %d pour l'ouverture d'une View" -#define MSG_BAD_XMODE_VAL "Mode d'exécution %d invalide" -#define MSG_BAD_XOBJ_TYPE "Mauvais type de Xobject %d" -#define MSG_BAS_NS_LIST "Format invalide de la liste des espace-noms" -#define MSG_BIN_F_TOO_LONG "Valeur trop longue pour le champ %s (%d --> %d)" -#define MSG_BIN_MODE_FAIL "Echec mode binaire: %s" -#define MSG_BLKTYPLEN_MISM "Disparité types/longueurs de bloc dans SetValue" -#define MSG_BLK_IS_NULL "Blk est nul" -#define MSG_BLOCK_NO_MATCH "Bloc non correspondant" -#define MSG_BREAKPOINT "Point de contrôle" -#define MSG_BUFF_TOO_SMALL "GetColData: Buffer trop petit" -#define MSG_BUFSIZE_ERROR "Erreur en recherchant la taille du buffer" -#define MSG_BUILDING_GROUPS "Formation des groupes" -#define MSG_BUILD_DIST_GRPS "Formation des groupes distinctes" -#define MSG_BUILD_INDEX "Construction index %s sur %s" -#define MSG_BXP_NULL "Bxp nul dans PUTFON" -#define MSG_CANNOT_OPEN "Ouverture impossible de %s" -#define MSG_CD_ONE_STEP "Count Distinct doit être exécuté en une seule étape" -#define MSG_CD_ORDER_ERROR "Erreur de tri dans Count Distinct" -#define MSG_CHECKING_ROWS "Test des lignes à mettre à jour" -#define MSG_CHECK_LEVEL "Niveau de vérification fixé à %u" -#define MSG_CHSIZE_ERROR "Erreur dans chsize: %s" -#define MSG_CLN_NOT_IN_JOIN "La colonne C%d n'est pas dans le join" -#define MSG_CNTDIS_COL_LOST "Colonne du Count Distinct perdue" -#define MSG_COLIST_BAD_TYPE "Type=%d invalide pour Colist" -#define MSG_COLNAM_TOO_LONG "Nom de colonne trop long" -#define MSG_COLSEC_TOO_BIG "Section colonne trop grande, table %s (%d)" -#define MSG_COLS_REDUCED " (réduit par Maxcol)" -#define MSG_COLUMN_ERROR "Erreur de colonne" -#define MSG_COLUMN_MISMATCH "Colonne %s dépareillée" -#define MSG_COLUMN_NOT_KEY "La colonne jointe R%d.%s n'est pas une clé" -#define MSG_COL_ALLOC_ERR "Allocation impossible du noeud colonne" -#define MSG_COL_ALLOC_ERROR "Erreur d'allocation mémoire pour la colonne %d" -#define MSG_COL_HAS_NO_DEF "La colonne %s n'est pas définie" -#define MSG_COL_INVAL_TABLE "La colonne %s.%s n'existe pas dans la table %s alias %s" -#define MSG_COL_ISNOT_TABLE "La colonne %s n'est pas dans la table %s" -#define MSG_COL_NB_MISM "Le nombre de colonnes ne correspond pas" -#define MSG_COL_NOTIN_GRPBY "La colonne %s n'est pas dans la liste de Group By" -#define MSG_COL_NOTIN_TABLE "La colonne %s n'est dans aucune table" -#define MSG_COL_NOTIN_UPDT "%s n'appartient pas à la table mise à jour %s" -#define MSG_COL_NOT_CODED "La colonne %s n'est pas codifiée" -#define MSG_COL_NOT_EXIST "La colonne %s n'existe pas dans %s" -#define MSG_COL_NOT_FOUND "La colonne %s n'est pas dans la table %s" -#define MSG_COL_NOT_IN_DB "La colonne %s de la table %s n'est pas dans la base de données" -#define MSG_COL_NOT_IN_JOIN "La colonne %s n'est pas dans le join" -#define MSG_COL_NOT_SORTED "La colonne %s de la table %s n'est pas triée" -#define MSG_COL_NUM_MISM "Disparité du nombre de colonnes" -#define MSG_COL_USED_TWICE "Colonne %s utilisée deux fois ???" -#define MSG_COMPUTE_ERROR "Erreur dans Compute, op=%d" -#define MSG_COMPUTE_NIY "Compute non implémenté pour TOKEN" -#define MSG_COMPUTING "Calculs en cours" -#define MSG_COMPUTING_DIST "Comptage des valeurs distinctes" -#define MSG_COMPUTING_FUNC "Calcul de(s) fonction(s)" -#define MSG_COM_ERROR "Erreur Com" -#define MSG_CONCAT_SUBNODE "Concaténation de sous-noeuds impossible" -#define MSG_CONNECTED "Connecté" -#define MSG_CONNECT_CANCEL "Connection interrompue par l'utilisateur" -#define MSG_CONNECT_ERROR "Erreur %d se connectant à %s" -#define MSG_CONN_CLOSED "%s(%d) fermée" -#define MSG_CONN_CREATED "Connexion %s crée" -#define MSG_CONN_DROPPED "Connexion %s supprimée" -#define MSG_CONN_OPEN "%s(%d) ouverte (%s)" -#define MSG_CONN_SUC_OPEN "%s(%d) ouverte avec succès" -#define MSG_CONTROL_C_EXIT "Exit par Ctrl-C" -#define MSG_COPY_BAD_PHASE "Copie de liste invalide en phase %d" -#define MSG_COPY_INV_TYPE "Coparm: type non supporté %d" -#define MSG_CORREL_NO_QRY "Les sous-requêtes corrélées ne peuvent pas être de type QRY" -#define MSG_CREATED_PLUGDB " Créé par PlugDB %s " -#define MSG_CURSOR_SET "Curseur remis à %d" -#define MSG_DATABASE_ACTIVE "Base de données %s activée" -#define MSG_DATABASE_LOADED "Base de données %s chargée" -#define MSG_DATA_IS_NULL "ExecSpecialCmd: data est NULL" -#define MSG_DATA_MISALIGN "Mauvais alignement pour ce type de données" -#define MSG_DBASE_FILE "Fichier dBASE dbf: " -#define MSG_DB_ALREADY_DEF "Base de données %s déjà définie" -#define MSG_DB_ALTERED "Base de données modifiée" -#define MSG_DB_CREATED "Base de données %s créée" -#define MSG_DB_NOT_SPEC "Base de données non spécifiée" -#define MSG_DB_REMOVED "Base de données %s retirée de la liste" -#define MSG_DB_SORT_ERROR "Erreur de tri DB" -#define MSG_DB_STOPPED "Arrêt de la base de données %s" -#define MSG_DEBUG_NOT_ACTIV "Mode Debug inactif" -#define MSG_DEBUG_SET_INV "Invalide pour Debug: %c" -#define MSG_DEF_ALLOC_ERROR "Erreur d'allocation de la classe DEF %s" -#define MSG_DELETING_ROWS "Suppression des lignes" -#define MSG_DEL_FILE_ERR "Erreur à l'effacement de %s" -#define MSG_DEL_READ_ERROR "Delete: erreur en lecture req=%d len=%d" -#define MSG_DEL_WRITE_ERROR "Delete: erreur en écriture: %s" -#define MSG_DEPREC_FLAG "Option Flag périmée, utiliser Coltype" -#define MSG_DICTIONARY "Dictionnaire " -#define MSG_DIRECT_VARTOK "Accès direct aux règles du Variable Token non implémenté" -#define MSG_DISCONNECTED "Déconnecté" -#define MSG_DISTINCT_ERROR "Plus d'un élément fonctionel DISTINCT" -#define MSG_DISTINCT_ROWS "Sélection des lignes distinctes" -#define MSG_DISTINCT_VALUES "Extraction des valeurs distinctes" -#define MSG_DIS_NOHEAD_JOIN "Jointure distincte sur une table non en tête" -#define MSG_DLL_LOAD_ERROR "Erreur %d au chargement du module %s" -#define MSG_DOMAIN_EMPTY "Le domaine %s est vide" -#define MSG_DOMAIN_ERROR "Colonne %s: disparité domaine(%s)/valeur(%s)" -#define MSG_DOMAIN_FULL "Le domaine %s est plein (max=%d)" -#define MSG_DOM_FILE_ERROR "Fichier domain %s introuvable" -#define MSG_DOM_NOT_SUPP "MS-DOM non supporté par cette version" -#define MSG_DOM_OPEN_ERROR "Erreur d'ouverture du domaine: %s" -#define MSG_DOM_READ_ERROR "Erreur %d en lecture de domaine: %s" -#define MSG_DOM_READ_ONLY "La table domaine %s est en lecture seulement" -#define MSG_DOM_WRITE_ERROR "Erreur %d en écriture de domaine: %s" -#define MSG_DONE "Effectué, rc=%d" -#define MSG_DOSALMEM_NOMEM "Erreur d'allocation, pas assez de mémoire" -#define MSG_DROP_DB_ERR "Echec du Drop sur le base de données %s" -#define MSG_DSORT_LOG_ERROR "Kindex: Erreur logique de tri distincte" -#define MSG_DUMMY_NO_COLS "Les tables DUMMY ne peuvent pas avoir de colonne" -#define MSG_DUPLICAT_COUNT "Count sur plus d'une colonne" -#define MSG_DUP_COL_NAME "La colonne %s existe en double" -#define MSG_DUP_PROJNUM "Non unique projnum %d pour la colonne %s" -#define MSG_DVAL_NOTIN_LIST "Valeur %s non trouvée dans la liste des valeurs distinctes de la colonne %s" -#define MSG_EMPTY_DOC "Document vide" -#define MSG_EMPTY_FILE "%s du fichier vide %s: " -#define MSG_ENDSTR_MISMATCH "Fins de chaîne et de noeud ne correspondent pas" -#define MSG_END_OF_DELETE "%d ligne(s) enlevée(s) en %.2lf sec" -#define MSG_END_OF_INSERT "%d ligne(s) insérée(s) en %.2lf sec" -#define MSG_END_OF_QUERY "%d ligne(s) extraite(s) en %.2lf sec" -#define MSG_END_OF_UPDATE "%d ligne(s) modifiée(s) en %.2lf sec" -#define MSG_EOF_AFTER_LINE "Fin de fichier après la ligne %d" -#define MSG_EOF_INDEX_FILE "EOF lisant le fichier index" -#define MSG_ERASED " et effacée" -#define MSG_ERASE_FAILED " (échec de l'effacement)" -#define MSG_ERROR "Erreur" -#define MSG_ERROR_IN_LSK "Erreur %d dans lseek64" -#define MSG_ERROR_IN_SFP "Erreur %d dans SetFilePointer" -#define MSG_ERROR_NO_PARM "Paramètre absent (valide seulement pour %.8s.1 et %.8s.5)" -#define MSG_ERROR_OPENING "Erreur à l'ouverture de : " -#define MSG_ERR_NUM_GT_MAX "Erreur: Numval (%d) plus grand que Maxnum (%d)" -#define MSG_ERR_READING_REC "Erreur lisant l'enregistrement %d de %s" -#define MSG_ERR_RET_RULE "Retour erreur, règle=%u" -#define MSG_ERR_RET_TYPE "Retour erreur, type=%d" -#define MSG_EVAL_EXPIRED "Cette version d'évaluation est expirée" -#define MSG_EVAL_ONLY "L'utilisation de cette Dll est pour évaluation seulement" -#define MSG_EXECUTING "Exécution" -#define MSG_EXECUTION_ERROR "Erreur d'exécution" -#define MSG_EXEC_MODE_IS "Le mode d'exécution est %s" -#define MSG_EXEC_MODE_RESET ". Mode remis à Execute" -#define MSG_EXEC_MODE_SET "Mode d'exécution fixé à %s" -#define MSG_EXIT_EVAL_ERR "Erreur pendant l'évaluation de Exit" -#define MSG_EXIT_FROM_LANG "Fin du langage %s version %d.%d" -#define MSG_FAIL_ADD_NODE "L'ajout du noeud %s dans la table a échoué" -#define MSG_FETCHING_DATA "Recherche des données" -#define MSG_FETCHING_ROWS "Recherche des lignes" -#define MSG_FETCH_NO_RES "Fetch: Pas de Résultats" -#define MSG_FIELD_TOO_LONG "Valeur trop longue pour le champs %d ligne %d" -#define MSG_FILELEN_ERROR "Erreur dans %s pour %s" -#define MSG_FILE_CLOSE_ERR "Erreur %d à la fermeture du fichier" -#define MSG_FILE_IS_EMPTY "Le fichier %s est vide" -#define MSG_FILE_MAP_ERR "Erreur de File mapping" -#define MSG_FILE_MAP_ERROR "CreateFileMapping %s erreur rc=%d" -#define MSG_FILE_NOT_FOUND "Fichier %s introuvable" -#define MSG_FILE_OPEN_YET "Fichier %s déjà ouvert" -#define MSG_FILE_UNFOUND "Fichier %s non trouvé" -#define MSG_FILGRP_NO_TABLE "Table %d manquante pour groupe filtre" -#define MSG_FILTER_ATTACH "Filtre passé à Attach" -#define MSG_FILTER_NO_TABLE "Filtre: première table manquante" -#define MSG_FIND_BAD_TYPE "Recherche dans un tableau: type non conforme %s %s" -#define MSG_FIX_OVFLW_ADD "Dépassement de capacité en addition" -#define MSG_FIX_OVFLW_TIMES "Dépassement de capacité en mutiplication" -#define MSG_FIX_UNFLW_ADD "Sous dépassement de capacité en addition" -#define MSG_FIX_UNFLW_TIMES "Sous dépassement de capacité en multiplication" -#define MSG_FLD_TOO_LNG_FOR "Champs %d trop long pour %s ligne %d de %s" -#define MSG_FLTST_NO_CORREL "FilTest ne devrait être appelé que pour les sous-requêtes corrélées" -#define MSG_FLT_BAD_RESULT "Virgule flottante: résultat inexacte" -#define MSG_FLT_DENORMAL_OP "Opérande virgule flottante non normalisé" -#define MSG_FLT_INVALID_OP "Opération virgule flottante invalide" -#define MSG_FLT_OVERFLOW "Dépassement de capacité virgule flottante" -#define MSG_FLT_STACK_CHECK "Virgule flottante: Erreur de la pile" -#define MSG_FLT_UNDERFLOW "Sous-dépassement de capacité virgule flottante" -#define MSG_FLT_ZERO_DIVIDE "Virgule flottante: division par zéro" -#define MSG_FMT_WRITE_NIY "L'écriture des fichiers %s n'est pas encore implémentée" -#define MSG_FNC_NOTIN_SLIST "Fonction de tri absente de la liste de sélection" -#define MSG_FORMAT_ERROR "Erreur de formattage" -#define MSG_FOXPRO_FILE "Fichier FoxPro: " -#define MSG_FPUTS_ERROR "Erreur dans fputs: %s" -#define MSG_FSBPARP_NULL "PUTFON: fsbparp est nul" -#define MSG_FSEEK_ERROR "Erreur dans fseek: %s" -#define MSG_FSETPOS_ERROR "Erreur dans fseek pour i=%d" -#define MSG_FTELL_ERROR "Erreur dans ftell enregistrement=%d: %s" -#define MSG_FUNCTION_ERROR "Erreur dans %s: %d" -#define MSG_FUNC_ERRNO "Erreur %d dans %s" -#define MSG_FUNC_ERROR "Erreur dans %s" -#define MSG_FUNC_ERR_S "Erreur dans %s: %s" -#define MSG_FUNC_REF_DEL "Référence à une fonction définie (règle %d) qui a été supprimée" -#define MSG_FWRITE_ERROR "Erreur dans fwrite: %s" -#define MSG_GETCWD_ERR_NO "?getcwd %s errno=%d" -#define MSG_GETFILESIZE_ERR "Erreur %d dans GetFileSize" -#define MSG_GET_DIST_VALS "Récupération des valeurs distinctes de " -#define MSG_GET_ERROR "Erreur dans %s (colonne %d)" -#define MSG_GET_FUNC_ERR "Erreur en recherche de la fonction %s: %s" -#define MSG_GET_NAME_ERR "Erreur en retrouvant le nom d'une table SYS" -#define MSG_GLOBAL_ERROR "Erreur d'allocation de Global (taille=%d)\n" -#define MSG_GRAM_ALLOC_ERR "Erreur d'allocation dans Grammar Up" -#define MSG_GRAM_MISMATCH "Avertissement: version de GRAMMAR perimée (sauvé sous GRAMMAR v%u)" -#define MSG_GRAM_SUBSET_ERR "Erreur d'initialisation du dictionnaire de la grammaire" -#define MSG_GRBY_TAB_NOTIMP "Group by avec tables jointes non implémenté" -#define MSG_GROUPBY_NOT_ALL "Group By doit inclure toutes les sélections non-fonctionnelles" -#define MSG_GROUP_ON_FUNC "Group by invalide sur colonne fonctionnelle" -#define MSG_GRP_COL_MISM "Disparité colonne des groupes" -#define MSG_GRP_LIST_MISMAT "Le groupement ne couvre pas la liste de sélection" -#define MSG_GUARD_PAGE "Violation de page de garde" -#define MSG_GZOPEN_ERROR "gzopen %s: erreur %d sur %s" -#define MSG_GZPUTS_ERROR "Erreur dans gzputs: %s" -#define MSG_HANDLE_IS_NULL "%s est NULL: erreur code: %d" -#define MSG_HARRY_COMP_NIY "Compute non implémenté pour les chaînes codées" -#define MSG_HAVING_FILTER "Traitement du Filtre Having" -#define MSG_HBUF_TOO_SMALL "Buffer(%d) trop petit pour entête(%d)" -#define MSG_HEAD_OPEN_ERROR "Erreur à l'ouverture du fichier header" -#define MSG_HEAD_READ_ERROR "Erreur en lecture du fichier header %s" -#define MSG_HEAD_WRITE_ERR "Erreur en écriture du fichier header" -#define MSG_HI_OFFSET_ERR "Offset supérieur non nul" -#define MSG_HUGE_DEFAULT "Huge est %d par défault" -#define MSG_HUGE_WARNING_1 "Mémoire Huge non compatible 16-bit pour %d\n" -#define MSG_HUGE_WARNING_2 "Résultats imprévisibles possibles\n" -#define MSG_IDLE "Au repos" -#define MSG_ILLEGAL_INSTR "Instruction illégale" -#define MSG_ILL_FILTER_CONV "Conversion implicite illégale dans un filtre" -#define MSG_INDEX_CREATED "Index %s créé sur %s" -#define MSG_INDEX_DEF_ERR "Erreur sauvegardant l'index définition pour %s" -#define MSG_INDEX_DROPPED "Index %s supprimé de %s" -#define MSG_INDEX_INIT_ERR "Echec de l'initialisation de l'index %s" -#define MSG_INDEX_NOT_DEF "Index %s non défini" -#define MSG_INDEX_NOT_UNIQ "L'index n'est pas Unique" -#define MSG_INDEX_ONE_SAVE "Les index sont sauvegardés dans un fichier unique" -#define MSG_INDEX_SEP_SAVE "Les index sont sauvegardés dans des fichiers séparés" -#define MSG_INDEX_YET_ON "L'index %s existe déjà sur %s" -#define MSG_INDX_ALL_DROP "Tous les index de %s supprimés" -#define MSG_INDX_COL_NOTIN "La colonne index %s n'existe pas dans la table %s" -#define MSG_INDX_EXIST_YET "L'entrée index existe déjà" -#define MSG_INIT_ERROR "Erreur à l'initialisation de %s" -#define MSG_INIT_FAILED "L'initialisation de %s a échoué" -#define MSG_INPUT "Entrée: " -#define MSG_INPUT_KEYBD_YET "L'entrée est déjà au clavier" -#define MSG_INSERTING "Insertion: " -#define MSG_INSERT_ERROR "Insert erreur: usage multiple du fichier %s" -#define MSG_INSERT_MISMATCH "Les listes colonne et valeur ne correspondent pas" -#define MSG_INTERNAL "interne" -#define MSG_INT_COL_ERROR "Erreur interne sur la colonne index %s" -#define MSG_INT_OVERFLOW "Dépassement de capacité sur entier" -#define MSG_INT_ZERO_DIVIDE "Division entière par zéro" -#define MSG_INVALID_BIP "Bip invalide .%d" -#define MSG_INVALID_DISP "Disposition invalide" -#define MSG_INVALID_FTYPE "SBV: Ftype %d invalide" -#define MSG_INVALID_HANDLE "Poignée invalide" -#define MSG_INVALID_OPER "Opérateur invalide %d pour %s" -#define MSG_INVALID_OPTION "Option invalide %s" -#define MSG_INV_COLUMN_TYPE "Type %d Invalide pour la colonne %s" -#define MSG_INV_COL_DATATYP "Type de données %d invalide pour la colonne %d" -#define MSG_INV_COL_NUM "Colonne invalide %d" -#define MSG_INV_COL_TYPE "Type de colonne %s invalide" -#define MSG_INV_CONC_BIP "Bip invalide (seuls valides: %.8s.0 .1 and .5)" -#define MSG_INV_DATA_PATH "Chemin vers les données invalide" -#define MSG_INV_DEF_READ "Lecture différée invalide rc=%d" -#define MSG_INV_DIRCOL_OFST "Offset invalide pour une colonne DIR" -#define MSG_INV_DOMAIN_TYPE "Type invalide %d" -#define MSG_INV_FILTER "Filtre résiduel dans %s" -#define MSG_INV_FNC_BUFTYPE "FNC: Type %d de l'argument invalide pour %s" -#define MSG_INV_INFO_TYPE "Type d'info catalog invalide %d" -#define MSG_INV_INIPATH "Inipath invalide " -#define MSG_INV_MAP_POS "Position mémoire invalide" -#define MSG_INV_OPERATOR "opérateur invalide %d\n" -#define MSG_INV_PARAMETER "Paramètre invalide %s" -#define MSG_INV_PARM_TYPE "Type de paramètre invalide" -#define MSG_INV_QUALIFIER "Qalificateur '%s' invalide" -#define MSG_INV_QUERY_TYPE "Type de requête %d invalide" -#define MSG_INV_RAND_ACC "L'accès aléatoire d'une table non optimisée est impossible" -#define MSG_INV_REC_POS "Position d'enregistrement invalide" -#define MSG_INV_RESULT_TYPE "Type de résultat invalide %s" -#define MSG_INV_SET_SUBTYPE "Type de formattage %d invalide" -#define MSG_INV_SPECIAL_CMD "%s: Commande spéciale invalide" -#define MSG_INV_SUBTYPE "Sous type invalide %s" -#define MSG_INV_TOK_DOMAIN "Le domaine %s n'existe pas" -#define MSG_INV_TOPSEM_CMD "Commande TopSem invalide %c" -#define MSG_INV_TRANSF_USE "Usage invalide en règle transformationnelle" -#define MSG_INV_TYPE_SPEC "Spécification de type invalide (%.8s.%d)" -#define MSG_INV_UPDT_TABLE "Table %s invalide pour Update" -#define MSG_INV_VALUE_LIST "Liste de valeurs invalide pour Insert" -#define MSG_INV_WHERE_JOIN "Clause Where invalide dans une requête de jointure" -#define MSG_INV_WORK_PATH "Chemin de travail invalide" -#define MSG_IN_ARGTYPE_MISM "Arguments de types incompatibles pour une expression IN" -#define MSG_IN_USE " et en activité" -#define MSG_IN_WITHOUT_SUB "IN ou EXISTS sans tableau ou subquery" -#define MSG_IS_NOT_CONN "%s n'est pas une connexion définie" -#define MSG_JCT_MISS_COLS "Colonnes manquantes pour une table JCT" -#define MSG_JCT_MISS_TABLE "Table jointe manquante pour JCT" -#define MSG_JCT_NO_FILTER "Filtrage impossible des tables virtuelles JCT" -#define MSG_JCT_NO_KEY "Erreur logique JCT: clé manquante" -#define MSG_JOIN_KEY_NO_COL "La clé de jointure n'est pas une colonne" -#define MSG_KEY_ALLOC_ERR "Erreur d'allocation d'un bloc offset clé" -#define MSG_KEY_ALLOC_ERROR "Erreur d'allocation mémoire, Klen=%d n=%d" -#define MSG_LANGUAGE_QUIT "%s libéré" -#define MSG_LANG_ACTIVE "Langage %s actif" -#define MSG_LANG_ALLOC_FAIL "PlugInitLang: Erreur d'allocation du bloc Lang" -#define MSG_LANG_ALREADY_UP "Langage déjà en édition" -#define MSG_LANG_BAD_SAVE "Langage %s peut-être incorrectement sauvegardé" -#define MSG_LANG_NOT_FREED "Langage %s non libérable (pas dans la chaîne principale)" -#define MSG_LANG_SAVED "Langage %s sauvegardé" -#define MSG_LANG_WR_LEN_ERR "Erreur de longueur à l'écriture du bloc Lang" -#define MSG_LDF_ALLOC_ERROR "Erreur d'allocation d'un LdfBlock" -#define MSG_LDF_RN_MISMATCH "LDF: décalage des numéros de règle" -#define MSG_LDF_WLEN_ERROR "Erreur de longueur en écrivant LdfData" -#define MSG_LDF_W_LEN_ERROR "Erreur de longueur pour LdfData en écriture" -#define MSG_LIC_NO_MYSQL "Votre licence actuelle ne permet pas l'utilisation du type MYSQL" -#define MSG_LINEAR_ERROR "Erreur de linéarisation" -#define MSG_LINE_LENGTH "Largeur d'impression fixée à %d" -#define MSG_LINE_MAXLIN "Nombre de lignes de travail plafonné à %d" -#define MSG_LINE_MAXRES "Nombre de lignes de résultat plafonné à %d" -#define MSG_LINE_MAXTMP "Nombre de lignes intermédiaires plafonné à %d" -#define MSG_LINE_TOO_LONG "La nouvelle ligne est trop longue" -#define MSG_LINJOINDB_ERROR "Erreur système: appel incorrecte à LinJoinDB" -#define MSG_LIST "--Liste--" -#define MSG_LNG_NOT_IN_LIST "Le langage %s n'est pas dans la liste" -#define MSG_LOADING_DB "Chargement description de la BD" -#define MSG_LOADING_FAILED "Le chargement de %s a échoué" -#define MSG_LOAD_CDLL_ERROR "Erreur au chargement de ConnDll: rc=%d" -#define MSG_LOCSTRG_TOO_BIG "LOCSTRG: n trop grand ? (%d)\n" -#define MSG_LOGICAL_ERROR "%s: Erreur logique" -#define MSG_LRECL_TOO_SMALL "Lrecl trop petit (longueur en-tête = %d)" -#define MSG_MAC_NO_DELETE "Pas de suppression de lignes pour les tables MAC" -#define MSG_MAC_NO_INDEX "Pas d'accès direct aux tables MAC" -#define MSG_MAC_READ_ONLY "Les tables MAC sont en lecture seulement" -#define MSG_MAC_WIN_ONLY "Les tables MAC sont seulement sous Windows" -#define MSG_MAKE_EMPTY_FILE "Génération du fichier vide %s: %s" -#define MSG_MAKING "Génération" -#define MSG_MAKING_DISTINCT "Regroupement des valeures distinctes" -#define MSG_MALLOC_ERROR "Allocation mémoire impossible par %s" -#define MSG_MALLOC_NULL "malloc retourne Null" -#define MSG_MAP_NO_MORE "Le type %s n'est plus supporté" -#define MSG_MAP_OBJ_ERR "Erreur %d à la fermeture du map objet" -#define MSG_MAP_VEC_ONLY "MAP Insert permis seulement pour les tables VEC Estimate" -#define MSG_MAP_VIEW_ERROR "MapViewOfFile %s erreur rc=%d" -#define MSG_MAXSIZE_ERROR "Maxsize incalculable sur table ouverte" -#define MSG_MAXTMP_TRUNCATE "Résultats intermédiaires tronqués par maxtmp=%d" -#define MSG_MAX_BITMAP "Taille maxi des bitmaps d'optimisation fixée à %d" -#define MSG_MEMSIZE_TOO_BIG "Erreur: memsize (%d) trop grand pour Length (%d)" -#define MSG_MEM_ALLOC_ERR "Erreur d'allocation mémoire, taille %s = %d" -#define MSG_MEM_ALLOC_ERROR "Erreur d'allocation mémoire" -#define MSG_MEM_ALLOC_YET "Mémoire déjà allouée" -#define MSG_METAFILE_NOTFND "Fichier Meta introuvable" -#define MSG_MISPLACED_QUOTE "Appostrophe mal placée ligne %d" -#define MSG_MISSING "Manquant: Value=%p Argval=%p Builtin=%d" -#define MSG_MISSING_ARG "Argument manquant pour l'opérateur %d" -#define MSG_MISSING_COL_DEF "Définition des colonnes manquante" -#define MSG_MISSING_CONNECT "Connection #1 manquante" -#define MSG_MISSING_EOL "Fin de ligne manquante dans %s" -#define MSG_MISSING_FIELD "Champs %d manquant dans %s ligne %d" -#define MSG_MISSING_FNAME "Nom du fichier manquant" -#define MSG_MISSING_NODE "Noeud %s manquant dans %s" -#define MSG_MISSING_POS "POS code manquant" -#define MSG_MISSING_ROWNODE "Impossible de trouver le noeud de la ligne %d" -#define MSG_MISSING_SERV_DB "Indication serveur et/ou base de données manquante" -#define MSG_MISS_LEAD_COL "Colonne majeure %s manquante" -#define MSG_MISS_NAME_LRECL "Nom du fichier et/ou LRECL manquant" -#define MSG_MISS_TABLE_LIST "Liste des tables manquante" -#define MSG_MISS_VCT_ELMT "Taille de bloc vectoriel manquante (Elements)" -#define MSG_MIS_TAG_LIST "Liste des balises colonne manquante" -#define MSG_MKEMPTY_NIY "MakeEmptyFile: pas encore implementé pour Huge et Unix" -#define MSG_MOVE_INV_TYPE "MOVPARM: paramètre de type invalide %d" -#define MSG_MULT_DISTINCT "Distinct utilisé plus d'une fois" -#define MSG_MULT_KEY_ERROR "Erreur sur clé multiple k=%d n=%d" -#define MSG_MUL_MAKECOL_ERR "Erreur logique dans TABMUL::MakeCol" -#define MSG_MYSQL_CNC_OFF "La connexion à MySQL est fermée" -#define MSG_MYSQL_CNC_ON "La connexion à MySQL est établie" -#define MSG_MYSQL_NOT_SUP "Pas de support de MySQL dans cette version" -#define MSG_MY_CNC_ALREADY "La connexion à MySQL est déjà active" -#define MSG_NAME_CONV_ERR "Erreur de convertion du nom de noeud" -#define MSG_NAME_IS_USED "Le nom %s est déjà utilisé" -#define MSG_NCOL_GT_MAXCOL "Trop de colonnes (%d > %d max)" -#define MSG_NEW_CHAR_NULL "new char(%d) retourne Null" -#define MSG_NEW_DOC_FAILED "Impossible de créer le nouveau document" -#define MSG_NEW_RETURN_NULL "NULL renvoyé par New dans PlugEvalLike" -#define MSG_NEW_TABLE_ERR "La nouvelle table %s ne peut pas être chargée" -#define MSG_NEXT_FILE_ERROR "Erreur en recherche du fichier suivant. rc=%s" -#define MSG_NODEF_FROM_VIEW "Pas de définition de table depuis une view" -#define MSG_NODE_FOR_CHAR "Noeud %s trouvé au lieu d'un caractère" -#define MSG_NODE_SUBSET_ERR "Erreur d'initialisation de la zone Noeud %d" -#define MSG_NONCONT_EXCEPT "Exception non-continuable" -#define MSG_NON_DUP_HAVING "Clause Having dans une requête non fonctionelle" -#define MSG_NON_EVAL_SEM "Sem non évaluée: p_no=%d" -#define MSG_NOP_ZLIB_INDEX "L'indexage d'une table zlib non optimisée est impossible" -#define MSG_NOT_A_DBF_FILE "Le fichier n'a pas le format dBASE dbf " -#define MSG_NOT_ENOUGH_COLS "Pas assez de colonnes dans %s" -#define MSG_NOT_ENOUGH_MEM "Mémoire insuffisante pour cette opération" -#define MSG_NOT_FIXED_LEN "Fichier %s non fixe, len=%d lrecl=%d" -#define MSG_NOT_IMPLEMENTED "Non implementé: %.8s" -#define MSG_NOT_IMPL_JOIN "Pas implémenté pour les jointures" -#define MSG_NOT_IMPL_SET "Pas implémenté pour les opérateurs d'ensembles" -#define MSG_NOT_IMPL_YET "Pas encore implementé" -#define MSG_NOT_LINEARIZED "Arborescence des tables non linéarisée" -#define MSG_NOT_MODIFIABLE " (non modifiable)" -#define MSG_NO_0DH_HEAD "0DH manquant en fin d'en-tête (dbc=%d)" -#define MSG_NO_ACTIVE_APPL "Pas d'application active" -#define MSG_NO_ACTIVE_DB "Pas de base de données active" -#define MSG_NO_ACTIVE_UDIC "Pas de dictionaire utilisateur actif" -#define MSG_NO_AGGR_FUNC "Fonction aggrégée %d illégale à cet endroit" -#define MSG_NO_AREA_FILE "Fichier Area introuvable" -#define MSG_NO_AVAIL_RESULT "Pas de résultat disponible" -#define MSG_NO_BIG_DELETE "Délétion Partielle non implémentée pour les fichiers HUGE" -#define MSG_NO_CHAR_FROM "Conversion de type %d en caractères impossible" -#define MSG_NO_CLUSTER_COL "Pas de colonne optimisable" -#define MSG_NO_COL_ADDING "Ajouter des colonnes dans une définition existante est impossible" -#define MSG_NO_COL_DEF_AS "La définitions des colonnes est incompatible avec AS Select" -#define MSG_NO_COL_FOUND "La section colonne %s est vide" -#define MSG_NO_COL_IN_TABLE "La colonne %d n'est pas dans la table %s" -#define MSG_NO_COL_SECTION "Section colonne manquante pour la table %s" -#define MSG_NO_CONNECT_ADDR "Adresse de connection non spécifiée" -#define MSG_NO_CONST_FILTER "Filtres constants non implementés" -#define MSG_NO_CURLY_BRKT "Pas d'accolade de fermeture" -#define MSG_NO_DATABASE "Base de données %s introuvable" -#define MSG_NO_DATE_FMT "Pas de format date pour le valblock de type %d" -#define MSG_NO_DBF_INSERT "Insert pas encore implémenté pour les fichier DBF" -#define MSG_NO_DEF_FNCCOL "Colonne fonction par défaut introuvable" -#define MSG_NO_DEF_PIVOTCOL "Colonne pivot par défaut introuvable" -#define MSG_NO_DIR_INDX_RD "Pas d'accès directe des tables %s" -#define MSG_NO_DMY_DIR_ACC "Pas d'accès direct aux tables virtuelles DUMMY" -#define MSG_NO_DOM_DELETE "Délétion Partielle non implémentée pour les domaines" -#define MSG_NO_DOM_MATCH "Chaîne %.8s... non touvée dans le domaine %s" -#define MSG_NO_EDITED_LANG "Coparm: Pas de langage en édition" -#define MSG_NO_EXP_LINK "Liaison par expression invalide pour une table JCT" -#define MSG_NO_EXT_FILTER "Le filtrage ne peut se référer à une autre table" -#define MSG_NO_EXT_UPDATE "Pas de mise à jour en référence à une autre table" -#define MSG_NO_FEAT_SUPPORT "%s non supporté dans cette version" -#define MSG_NO_FILE_LIST "La table %s n'a pas de liste de fichiers" -#define MSG_NO_FLD_FORMAT "Format absent pour le champs %d de %s" -#define MSG_NO_FORMAT_COL "Type COLUMN informattable" -#define MSG_NO_FORMAT_TYPE "Le format ne peut pas être défini à partir du type %d" -#define MSG_NO_FULL_JOIN "Jointures autorisées seulement à égalité sur clé(s)" -#define MSG_NO_FUL_OUT_JOIN "Jointures externes complètes non supportées" -#define MSG_NO_FUNC_ORDER "Tri non supporté sur élément fonctionnel" -#define MSG_NO_HEAD_JOIN "Jointure sur une table non en tête" -#define MSG_NO_HQL_CONV "Conversion en HQL non disponible" -#define MSG_NO_INDEX "La table %s n'a pas d'index" -#define MSG_NO_INDEX_GBX "Pas ou mauvais index pour SQLGBX" -#define MSG_NO_INDEX_IN "Pas d'index dans %s" -#define MSG_NO_INDEX_READ "Pas d'accès directe des tables multiples" -#define MSG_NO_INIT_LANG "Pas de langage initial" -#define MSG_NO_JOIN_TO_EXP "Jointure vers une expression impossible" -#define MSG_NO_JOIN_UPDEL "Pas de jointure avec Update/Delete" -#define MSG_NO_KEY_COL "Pas de colonne clé trouvée" -#define MSG_NO_KEY_UPDATE "Le nom des clés ne peut pas être modifié" -#define MSG_NO_LANGUAGE "Pas de langage opérationnel\n" -#define MSG_NO_LANG_TO_QUIT "Pas de langage à quitter" -#define MSG_NO_LISTVAL_HERE "LSTBLK: Liste de valeurs utilisée hors contexte" -#define MSG_NO_MAP_INSERT "MAP incompatible avec Insert" -#define MSG_NO_MATCHING_COL "Pas de colonne correspondant à %s dans %s" -#define MSG_NO_MATCH_COL "Colonne correspondante introuvable" -#define MSG_NO_MEMORY "Mémoire pleine" -#define MSG_NO_MEM_CORR_SUB "Subquery corrélée en mémoire non encore implémentée" -#define MSG_NO_MODE_PADDED "Mode non supporté pour les fichiers 'padded'" -#define MSG_NO_MORE_COL "La colonne %s n'est plus dans la table pivot" -#define MSG_NO_MORE_LANG "Plus de langage, exit de %s\n" -#define MSG_NO_MORE_VAR "Les fichiers VAR ne sont plus supportés" -#define MSG_NO_MULCOL_JOIN "Jointure vers un index multi-colonne pas encore possible" -#define MSG_NO_MULT_HAVING "Clauses Having multiples non implémentées" -#define MSG_NO_MUL_DIR_ACC "Accès direct des tables multiples pas encore implémenté" -#define MSG_NO_MUL_VCT "Les tables VCT ne peuvent pas être multiples" -#define MSG_NO_MYSQL_CONN "Aucune connexion MySQL ouverte" -#define MSG_NO_MYSQL_DELETE "Pas de Delete pour les tables MySQL" -#define MSG_NO_NBCOL "Pas de NBcol" -#define MSG_NO_NBLIN "Pas de NBlin, MaxSize ou Continued" -#define MSG_NO_NBLIN_CONT "Fetch: Pas de NBlin ou Continued" -#define MSG_NO_NULL_CONST "Les constantes ne sont pas prises en charge" -#define MSG_NO_ODBC_COL "Colonnes ODBC automatiques non supportées par cette version" -#define MSG_NO_ODBC_DELETE "Delete ne devrait pas être appelé pour les tables ODBC" -#define MSG_NO_ODBC_DIRECT "Accès directe des tables ODBC non encore implémenté" -#define MSG_NO_ODBC_MUL "Multiple(2) non supporté pour les tables ODBC" -#define MSG_NO_ODBC_SPECOL "Pas de colonne spéciale ODBC" -#define MSG_NO_OPT_COLUMN "Pas optimisable ou pas de colonne optimisées" -#define MSG_NO_OP_MODIF "Les modificateurs ne s'appliquent pas à %s" -#define MSG_NO_PARAMETER "Pas de paramètre" -#define MSG_NO_PART_DEL "Delete partiel des fichier %s impossible" -#define MSG_NO_PART_MAP "Mapping partiel non implémenté pour cet OS" -#define MSG_NO_PAR_BLK_INS "Insertion de bloc partiel impossible" -#define MSG_NO_PIV_DIR_ACC "Pas d'accès directe aux tables PIVOT" -#define MSG_NO_POS_ADDED "Pos_code non ajouté" -#define MSG_NO_PROMPTING "Relance impossible pour les tables distribuées" -#define MSG_NO_QRY_DELETE "Delete n'est pas utilisable pour les views QRY" -#define MSG_NO_QUERY_ARRAY "Tableaux avec QUERY non encore implémentés" -#define MSG_NO_RCUR_DSK_YET "Usage recursif de DISK non encore implementé" -#define MSG_NO_READ_32 "Lecture de 32 octets impossible" -#define MSG_NO_RECOV_SPACE "Espace non recouvrable dans le fichier index" -#define MSG_NO_REF_DELETE "Pas de suppression en référence à une autre table" -#define MSG_NO_REF_UPDATE "Pas de mise à jour en référence à une autre table" -#define MSG_NO_REMOTE_FNC "Certaines fonctions ne peuvent pas être exécutées à distance" -#define MSG_NO_ROWID_FOR_AM "Accès direct impossible de ROWID pour les tables de type %s" -#define MSG_NO_ROW_NODE "Le nom du Rownode n'est pas défini" -#define MSG_NO_SECTION_NAME "Nom de section manquant" -#define MSG_NO_SEC_UPDATE "Les noms de section ne peuvent pas être modifiés" -#define MSG_NO_SELECTED_DB "Aucune base de données sélectée" -#define MSG_NO_SELF_PIVOT "Une table ne peut se pivoter elle-même !" -#define MSG_NO_SERVER_FOUND "Serveur introuvable" -#define MSG_NO_SETPOS_YET "SetPos pas encore implémenté pour les fichier %s" -#define MSG_NO_SFEXIT_UNIX "Fonction %s non disponible sur Unix" -#define MSG_NO_SOURCE " (pas de source)" -#define MSG_NO_SPEC_COL "Pas de colonne spéciales MYSQL" -#define MSG_NO_SQL_DELETE "Delete n'est pas utilisable actuellement pour les views SQL" -#define MSG_NO_SUB_VAL "Pas de sous-value d'un tableau de type %d" -#define MSG_NO_SUCH_INDEX "La table %s n'a pas l'index %s" -#define MSG_NO_SUCH_SERVER "Serveur %s introuvable" -#define MSG_NO_SUCH_TABLE "Table %s pas dans la base de données" -#define MSG_NO_TABCOL_DATA "Pas de données pour la table %s colonne %s" -#define MSG_NO_TABLE_COL "Aucune colonne trouvée pour %s" -#define MSG_NO_TABLE_DEL "Delete non autorisé pour les tables %s " -#define MSG_NO_TABLE_DESC "Pas de bloc descriptif de table" -#define MSG_NO_TABLE_INDEX "La table %s n'a pas d'index" -#define MSG_NO_TABLE_LIST "Pas de liste de tables" -#define MSG_NO_TAB_DATA "Pas de données pour la table %s" -#define MSG_NO_TERM_IN_TOK "Les non-terminaux ne sont pas utilisables dans les règles de Token" -#define MSG_NO_TOKEN_DB "DB introuvable pour la colonne TOKEN %s" -#define MSG_NO_UNIX_CATINFO "Pas d'info catalogue sous Unix" -#define MSG_NO_UPDEL_JOIN "Pas de jointure de tables ODBC pour Update/Delete" -#define MSG_NO_VCT_DELETE "Délétion Partielle non implémentée pour les fichiers VCT" -#define MSG_NO_VIEW_COLDEF "Colonne définition impossible pour les views" -#define MSG_NO_VIEW_SORT "La View fonctionnelle %s ne peut pas être triée ou jointe" -#define MSG_NO_ZIP_DELETE "Delete sur fichier Zip non encore implementé" -#define MSG_NO_ZIP_DIR_ACC "Accès directe des tables ZDOS non encore implementé" -#define MSG_NULL_COL_VALUE "La colonne n'a pas de valeur" -#define MSG_NULL_ENTRY "InitLang, entrée nulle %d %s" -#define MSG_NULL_QUERY "Requête vide" -#define MSG_NUMVAL_NOMATCH "Disparité de Numval pour %s" -#define MSG_N_FULL_PARSES "%d significations" -#define MSG_ODBC_READ_ONLY "ODBC est actuellement en lecture seulement" -#define MSG_OFFSET_NOT_SUPP "Offset non supporté pour ce type de sous requête" -#define MSG_ONE_LANG_YET "Un langage est déjà en édition" -#define MSG_ONE_PARAM_ONLY "Un seul paramètre autorisé" -#define MSG_ONLY_LOG10_IMPL "Seul Log10 est implementé" -#define MSG_ON_LANGUAGE "Langage %.8s version %d niveau %d éditable" -#define MSG_OPENING "Ouverture" -#define MSG_OPENING_QUERY "Ouverture de la requête" -#define MSG_OPEN_EMPTY_FILE "Ouverture du fichier vide %s: %s" -#define MSG_OPEN_ERROR "Erreur d'ouverture %d en mode %d sur %s: " -#define MSG_OPEN_ERROR_IS "Erreur à l'ouverture de %s: %s" -#define MSG_OPEN_ERROR_ON "Erreur d'ouverture sur %s" -#define MSG_OPEN_MODE_ERROR "Erreur d'ouverture(%s) %d sur %s" -#define MSG_OPEN_SORT_ERROR "Erreur logique de tri dans QUERY Open" -#define MSG_OPEN_STRERROR "Erreur à l'ouverture: %s" -#define MSG_OPEN_W_ERROR "Erreur à l'ouverture de %s en écriture" -#define MSG_OPTBLK_RD_ERR "Erreur à la lecture d'un bloc optimisation: %s" -#define MSG_OPTBLK_WR_ERR "Erreur à l'écriture d'un bloc optimisation: %s" -#define MSG_OPTIMIZING "Optimisation de " -#define MSG_OPT_BMAP_RD_ERR "Erreur en lecture des bitmaps d'optimisation: %s" -#define MSG_OPT_BMAP_WR_ERR "Erreur en écriture des bitmaps d'optimisation: %s" -#define MSG_OPT_CANCELLED "Optimisation interrompue par l'utilisateur" -#define MSG_OPT_DVAL_RD_ERR "Erreur en lecture des valeurs distinctes: %s" -#define MSG_OPT_DVAL_WR_ERR "Erreur en écriture des valeurs distinctes: %s" -#define MSG_OPT_HEAD_RD_ERR "Erreur en lecture de l'entête du fichier opt: %s" -#define MSG_OPT_HEAD_WR_ERR "Erreur en écriture de l'entête du fichier opt: %s" -#define MSG_OPT_INIT "Optimisation initialisée" -#define MSG_OPT_LOGIC_ERR "Erreur logique dans SetBitmap, i=%d" -#define MSG_OPT_MAX_RD_ERR "Erreur en lecture des valeurs maxi: %s" -#define MSG_OPT_MAX_WR_ERR "Erreur en écriture des valeurs maxi: %s" -#define MSG_OPT_MIN_RD_ERR "Erreur en lecture des valeurs mini: %s" -#define MSG_OPT_MIN_WR_ERR "Erreur en écriture des valeurs mini: %s" -#define MSG_OPT_NOT_MATCH "Le fichier opt %s n'est pas à jour" -#define MSG_OP_RES_TOO_LONG "Résultat trop long pour l'opérateur=%d" -#define MSG_ORDER_OUT_RANGE "Tri: Order %d hors limite" -#define MSG_ORDER_TWICE "Un même élément est trié deux fois" -#define MSG_PAGE_ERROR "Erreur de pagination" -#define MSG_PARM_CNT_MISS "Disparité du nombre de Paramètres" -#define MSG_PARSE_NULL_SEM "Sémantique nulle" -#define MSG_PARSING_QUERY "Analyse de la requête" -#define MSG_PIX_ERROR "Pix %s erreur règle no=%u\n" -#define MSG_PIX_TEST_ERROR "Règle=%u: pix-TEST pas dans le premier noeud\n" -#define MSG_PLG_READ_ONLY "PLG est actuellement en lecture seulement" -#define MSG_PLM_NULL_SFP "TABPLM ReadDB: Sfp est NULL" -#define MSG_PLUG_NOT_INIT "Plug n'est pas initialisé\n" -#define MSG_PLUG_NOT_RUN "Plug n'est pas en marche" -#define MSG_PNODE_RULE "(Noeud %d règle %d) " -#define MSG_POS_TOO_LONG "%s trop long (>%d)" -#define MSG_PREC_VBLP_NULL "ARRAY SetPrecision: Vblp est NULL" -#define MSG_PRIV_INSTR "Instruction privilégiée" -#define MSG_PROCADD_ERROR "Erreur %d sur l'adresse de %s" -#define MSG_PROCESS_SUBQRY "Sub-Query en cours de traitement" -#define MSG_PROC_WOULD_LOOP "Bouclage du traitement (maxres=%d maxlin=%d)" -#define MSG_PROGRESS_INFO "Informations sur le traitement en cours" -#define MSG_PROMPT_CANCEL "Relance annulée" -#define MSG_PROMPT_NIY "Prompt non implémenté pour cette configuration" -#define MSG_PTR_NOT_FOUND "Pointeur introuvable Num=%d ti1=%d" -#define MSG_PXDEF_IS_NULL "Pxdef est NULL" -#define MSG_QRY_READ_ONLY "Les views QRY sont en lecture seulement" -#define MSG_QUERY_CANCELLED "Requête interrompue par l'utilisateur" -#define MSG_QUERY_NOT_EXEC "Requête non exécutée" -#define MSG_QUERY_SAVED "Requête %s sauvegardée" -#define MSG_QUOTE_IN_QUOTE "Appostrophe dans un champ entre appostrophe ligne %d" -#define MSG_RANGE_NIY "Range pas encore implémenté pour %s" -#define MSG_RANGE_NO_JOIN "Range non compatible avec les index de jointure" -#define MSG_RC_READING "rc=%d en lecture de la table %s" -#define MSG_READB_BAD_INIT "%s ReadDB appelé avec Init=0" -#define MSG_READCOL_ERROR "SQLCOL: erreur dans ReadColumn" -#define MSG_READING "Lecture" -#define MSG_READING_FROM "Lecture de %s" -#define MSG_READING_RECORD "Erreur en lecture de l'enregistrement %d de %s" -#define MSG_READY "Prêt" -#define MSG_READ_ERROR "Erreur en lecture sur %s: %s" -#define MSG_READ_ERROR_RC "Erreur en lecture, rc=%d" -#define MSG_READ_MEM_ERROR "Lecture mémoire %d: taille=%d" -#define MSG_READ_ONLY "Cette table protégée en lecture seule ne peut être modifiée" -#define MSG_READ_SEEK_ERROR "Erreur de recherche en lecture: %s" -#define MSG_READ_SEG_ERROR "Lecture segment %d: taille=%d" -#define MSG_RECEIVED "Reçu %c\n" -#define MSG_RECORD_ERROR "Erreur à la lecture de l'enregistrement %d de %s" -#define MSG_RECORD_NO_SEP "Enregistrement sans séparateur" -#define MSG_REC_SKIPPED " (%d lignes erronnées sautées par l'option MaxErr)" -#define MSG_REDUCE_INDEX "Réduction de l'index" -#define MSG_REGISTER_ERR "Enregistrement NS impossible, préfix='%s' et href='%s'" -#define MSG_REMOTE_CONN_ERR "La connection éloignée a échoué" -#define MSG_REMOVE_ERROR "Erreur en supprimant %s: %s" -#define MSG_REMOVE_NOT_IMPL "Remove non implémenté pour TDB non Table" -#define MSG_RENAME_ERROR "Erreur renommant %s en %s: %s" -#define MSG_RENUM_RULES "Renumérotez les règles et réentrez ADD (règle sauvegardée dans la zone tampon)" -#define MSG_REORDER_INDEX "Reclassement de l'index" -#define MSG_REQU_ARG_NUM "La fonction %s doit avoir %d arguments" -#define MSG_RESET_TO "%s remis à %d" -#define MSG_RES_NOT_UNIQUE "Le résultat n'est pas unique" -#define MSG_RET_FROM_LANG "Retour au language %s version %d.%d du language %s version %d.%d" -#define MSG_ROWID_NOT_IMPL "RowNumber non implémenté pour les tables de type %s" -#define MSG_ROWS_SELECTED "%d lignes sélectionnées en %.2lf sec" -#define MSG_ROWS_TRUNCATED " (tronqué par MAXRES, LIMIT, FREQ ou AreaSize)" -#define MSG_ROW_ARGNB_ERR "ROW: disparité du nombre d'arguments (%d,%d)" -#define MSG_RPC_SERVER_ERR "Erreur logique dans TABMUL::MakeCol" -#define MSG_RSC_ALLOC_ERROR "Erreur d'allocation mémoire dans Rescol %s" -#define MSG_RULE_ENTERED "Règle %d entrée" -#define MSG_RULE_SUBSET_ERR "Erreur d'initialisation de la zone Règles" -#define MSG_SAVING_INDEX "Sauvegarde du fichier index" -#define MSG_SCAN_NOT_IMP "Scan non implémenté" -#define MSG_SEC_KEY_FIRST "Les sections et clés doivent être insérées en premier" -#define MSG_SEC_NAME_FIRST "Le nom de section doit être en tête de liste en insertion" -#define MSG_SEC_NOT_FOUND "Section %s absente de %s" -#define MSG_SEEK_ERROR "Seek erreur dans CopyHeader" -#define MSG_SEMANTIC_TREE "Arbre sémantique" -#define MSG_SEM_BAD_REF "Sem @%d référence un argument de type non 0 ou 1" -#define MSG_SEM_UNKNOWN "inconnue, rc=%d" -#define MSG_SEP_IN_FIELD "Le champ %d contient le caractère séparateur" -#define MSG_SEQUENCE_ERROR "HSTMT: Allocation hors séquence" -#define MSG_SETEOF_ERROR "Erreur %d dans SetEndOfFile" -#define MSG_SETRECPOS_NIY "SetRecpos non implémenté pour ce type de table" -#define MSG_SET_LOCALE "Locale fixée à %s" -#define MSG_SET_NULL_DOM "Valeur %d donnée à un domaine nul" -#define MSG_SET_OP_NOT_IMPL "Opérateurs ensemblistes non implementés" -#define MSG_SET_STR_TRUNC "SetValue: Chaîne de caractères tronquée" -#define MSG_SEVERAL_TREES "Jointure non spécifiée pour certaines tables" -#define MSG_SFP_ERROR "Erreur sur SetFilePointer: %s" -#define MSG_SFUNC_NOT_IMPL "Fonction scalaire %s non implémentée" -#define MSG_SHARED_LIB_ERR "Erreur au chargement de la librairie partagée %s: %s" -#define MSG_SINGLE_STEP "Pas à pas" -#define MSG_SLEEP "J'ai dormi %d milliseconds" -#define MSG_SMART_SORTING "Récupération des lignes triées (passage %d de %d)" -#define MSG_SMART_SORT_ERR "Erreur logique 1 dans Smart Sort" -#define MSG_SORTING "Tri en cours" -#define MSG_SORTING_INDEX "Tri de l'index" -#define MSG_SORTING_VAL "Tri de %d valeurs" -#define MSG_SORT_JOIN_INDEX "Tri de l'index de jointure" -#define MSG_SPCOL_READONLY "La colonne spéciale %s est en lecture seulement" -#define MSG_SPEC_CMD_SEP "Les commandes spéciales doivent être exécutées séparément" -#define MSG_SQL_BAD_TYPE "RephraseSQL: type %d non supporté" -#define MSG_SQL_BLOCK_MISM "CheckColumn: bloc SQL courant non correspondant" -#define MSG_SQL_CONF_ERROR "Erreur SQL: SQL_CONFORMANCE" -#define MSG_SQL_READ_ONLY "Les views SQL sont actuellement en lecture seulement" -#define MSG_SRCH_CLOSE_ERR "Erreur à la fermeture de l'Handle de recherche" -#define MSG_SRC_TABLE_UNDEF "La table source n'est pas définie" -#define MSG_STACK_ERROR "Erreur sur la pile, i=%d\n" -#define MSG_STACK_OVERFLOW "Parser: Débordement de la pile\n" -#define MSG_STRG_NOT_FOUND "Chaîne introuvable" -#define MSG_STRING_INV_LIST "Liste invalide pour SemString" -#define MSG_STRING_TOO_BIG "Chaîne trop grande pour le domaine %s" -#define MSG_SUBALLOC_ERROR "Pas assez de mémoire en zone %p pour allouer %d (utilisé=%d libre=%d)" -#define MSG_SUBAL_HUGE_ERR "Pas assez de mémoire en zone huge %p pour allouer %d" -#define MSG_SUBARG_NOSEM "Argument @ ou sous-phrase de niveau %d pointe sur un noeud sans Sem" -#define MSG_SUBARG_OUTRANGE "Argument @ ou sous-phrase de niveau %d hors limite" -#define MSG_SUBQRY_ONEITEM "Une Sub-Query ne doit avoir qu'une sélection" -#define MSG_SUBSET_ERROR "SubSet erreur dans LoadDB" -#define MSG_SUB_OPEN_YET "Subquery déjà ouverte" -#define MSG_SUB_RES_TOO_LNG "Résultat trop long pour SUBSTR" -#define MSG_SYNTAX_ERROR "Erreur de syntaxe" -#define MSG_SYSTEM_ERROR "Erreur système %d" -#define MSG_S_ACCESS_DENIED "%s: accès non autorisé" -#define MSG_S_ERROR "%s erreur" -#define MSG_S_ERROR_NUM "%s: erreur=%d" -#define MSG_S_INTRUPT_ERROR "%s: erreur interruption" -#define MSG_S_INVALID_PARM "%s: paramètre invalide" -#define MSG_S_INV_ADDRESS "%s: adresse invalide" -#define MSG_S_UNKNOWN_ERROR "%s: erreur de code %u inconnu" -#define MSG_TABDIR_READONLY "Les tables DIR sont en lecture seulement" -#define MSG_TABLE_ALREADY "La table %s existe déjà" -#define MSG_TABLE_ALTERED "Table %s %s altérée" -#define MSG_TABLE_CREATED "%s table %s créée" -#define MSG_TABLE_DROPPED "Table %s supprimée" -#define MSG_TABLE_MULT_JOIN "Utilisation multiple de la table %s pour jointure" -#define MSG_TABLE_NOT_IN_DB "La table %s n'existe pas dans %s" -#define MSG_TABLE_NOT_OPT "Table non optimisable" -#define MSG_TABLE_NO_INDEX "La table %s n'est pas indexable" -#define MSG_TABLE_NO_OPT "La table %s n'existe pas ou de type non optimisable" -#define MSG_TABLE_READ_ONLY "Les tables %s sont en lecture seulement " -#define MSG_TABMUL_READONLY "Les tables multiples sont en lecture seulement" -#define MSG_TAB_NOT_LOADED " (certaines tables n'ont put être chargées)" -#define MSG_TAB_NOT_SPEC "Table non specifiée" -#define MSG_TB_VW_NOTIN_DB "Table ou view %s pas dans la base de données" -#define MSG_TDB_NXT_NOT_NUL "Tdb.Next non NULL" -#define MSG_TDB_USE_ERROR "Erreur, Tdbp->Use=%d" -#define MSG_TOO_MANY_COLS "Trop de colonnes" -#define MSG_TOO_MANY_COLTAB "Trop de colonnes dans %s (%d)" -#define MSG_TOO_MANY_FIELDS "Trop de champs ligne %d de %s" -#define MSG_TOO_MANY_JUMPS "Trop de niveaux de saut" -#define MSG_TOO_MANY_KEYS "Trop de clés (%d)" -#define MSG_TOO_MANY_POS "Trop de pos_codes" -#define MSG_TOO_MANY_TABLES "Trop de tables (%d)" -#define MSG_TOPSEM_ERROR "Erreur inconnue dans TopSem" -#define MSG_TO_BLK_IS_NULL "To Blk est nul" -#define MSG_TO_FTR_NOT_NULL "Set.To_Ftr n'est pas nul" -#define MSG_TO_PIX_NOT_NULL "Set.To_Pix n'est pas nul" -#define MSG_TO_SEM_NOT_NULL "Set.To_Sem n'est pas nul" -#define MSG_TRUNCATE_ERROR "Erreur en troncation: %s" -#define MSG_TRUNC_BY_ESTIM "Tronqué par l'option Estimate" -#define MSG_TYPES_ERROR "Erreur sur Types(%d)" -#define MSG_TYPE_CONV_ERROR "Type non convertible dans une expression" -#define MSG_TYPE_DEF_MISM "Disparité entre type et définition" -#define MSG_TYPE_MISMATCH "Clé et source ne sont pas du même type" -#define MSG_TYPE_RECFM_MISM "Disparité entre Type et Recfm" -#define MSG_TYPE_TO_VERIFY "Type à vérifier: %d" -#define MSG_TYPE_VALUE_ERR "Colonne %s: disparité type(%s)/valeur(%s)" -#define MSG_UNBALANCE_QUOTE "Appostrophe en trop ligne %d" -#define MSG_UNDEFINED_AM "COLBLK %s: méthode d'accès indéfinie" -#define MSG_UNDEFINED_PATH "Chemin d'accès indéfini pour Plgcnx.ini" -#define MSG_UNDEF_COL_COUNT "Count sur colonne non définie" -#define MSG_UNKNOWN_DOMAIN "Domaine inconnu %s" -#define MSG_UNKNOWN_ERROR "Erreur inconnue" -#define MSG_UNKNOWN_EXCPT "Exception non répertoriée" -#define MSG_UNKNOWN_NAME "Nom inconnu: %.8s" -#define MSG_UNKNOWN_PATH "Chemin d'accès inconnu pour Plgcnx.ini" -#define MSG_UNKNOWN_POS "Nom pos_code inconnu: %s" -#define MSG_UNKNOWN_SEM "Sem %.8s inconnue, rc=%d" -#define MSG_UNKNOWN_SYNONYM "Synonyme inconnu" -#define MSG_UNKNW_QRY_TYPE "ReadDB: type de requête inconnu" -#define MSG_UNKN_ERR_CODE "Erreur de code %d inconnu" -#define MSG_UNLOADABLE " inchargeable: " -#define MSG_UNLOADABLE_PRM "%s inchargeable: %s" -#define MSG_UNMATCH_FIL_ARG "Argument de filtre dépareillé" -#define MSG_UNQ_COL_SEV_TAB "La colonne %s non qualifiée est dans plusieurs tables" -#define MSG_UNRESOLVED_ARG "?Argument manquant: %s non résolu en %d ligne %d" -#define MSG_UPDATE_ERROR "Erreur en Update sur %s" -#define MSG_UPDATING_ROWS "Mise à jour des lignes" -#define MSG_UPD_ZIP_NOT_IMP "Mise à jour des tables ZDOS non encore implementé" -#define MSG_UP_LANGUAGE "Bloc langage %.8s version %d niveau %d chargé" -#define MSG_USED_FREE_MEM "Sarea: utilisé %d, libre %d" -#define MSG_USETEMP_IS "Usetemp est : %s" -#define MSG_USETEMP_RESET ". Usetemp remis à Auto" -#define MSG_USETEMP_SET "Usetemp fixé à %s" -#define MSG_USE_NO_MATCH "Use non correspondant : Use=%d, ti2=%d, ti3=%d" -#define MSG_USING_INDEX " (Indexé par" -#define MSG_VALIST_MISMATCH "Disparité des listes de valeurs" -#define MSG_VALSTR_TOO_LONG "Valeur %s trop longue pour une chaîne de longueur %d" -#define MSG_VALTYPE_NOMATCH "Disparité types de valeur" -#define MSG_VALUE_ERROR "Colonne %s: bloc valeur nul" -#define MSG_VALUE_NOT_ALLOC "Valeur non allouée pour la colonne R%d %s" -#define MSG_VALUE_TOO_BIG "Valeur %lld trop grande pour la colonne %s" -#define MSG_VALUE_TOO_LONG "Valeur %s trop longue pour la colonne %s de longueur %d" -#define MSG_VAL_ALLOC_ERR "Allocation impossible du noeud valeur" -#define MSG_VAL_TOO_LONG "Valeur %s trop longue pour le champ %s" -#define MSG_VIEW_ALREADY "La VIEW %s existe déjà" -#define MSG_VIEW_CREATED "%s view %s créée" -#define MSG_VIEW_DROPPED "View %s supprimée" -#define MSG_VIEW_NOT_IN_DB "%s n'est pas une View de %s" -#define MSG_VIR_NO_DELETE "Delete impossible sur les tables %s" -#define MSG_VIR_READ_ONLY "Les tables virtuelles %s sont en lecture seulement" -#define MSG_VM_LANG "Langage au format VM, non supporté" -#define MSG_VOID_FIRST_ARG "Le premier argument ne doit pas être vide" -#define MSG_VOID_IN_STRING "Erreur: chaîne IN vide" -#define MSG_VOID_ORDER_LIST "Liste de tri vide, erreur système ?" -#define MSG_VOID_POS_DICT "Dictionnaire interne du langage vide" -#define MSG_VOID_QUERY "Requête vide %s" -#define MSG_WORK_AREA "Espace de travail: %s" -#define MSG_WORK_TOO_SMALL "Zone de travail trop petite, accroître AreaSize" -#define MSG_WRITE_ERROR "Erreur à l'écriture de %s" -#define MSG_WRITE_SEEK_ERR "Erreur de recherche en écriture: %s" -#define MSG_WRITE_STRERROR "Erreur en écriture sur %s: %s" -#define MSG_WRITING "Ecriture" -#define MSG_WRITING_ERROR "Erreur à l'écriture de %s: %s" -#define MSG_WRITING_QUERY "Erreur à l'écriture de la requête: " -#define MSG_WRONG_ARG_NUM "La fonction %s ne prend pas %d arguments" -#define MSG_WRONG_COL_NUM "Numéro de colonne %d trop grand pour %s" -#define MSG_WRONG_DB_LIST "Liste des bases de données incorrecte ou vide" -#define MSG_WRONG_FUNCTION "Mauvaise fonction %d" -#define MSG_WRONG_OP_PARM "Mauvais opérateur ou paramètres pour %s" -#define MSG_WRONG_PARMS "Mauvais paramètres pour %s" -#define MSG_WRONG_PASSWORD "Mot de passe illégal pour %s" -#define MSG_WRONG_TYPE "type non supporté" -#define MSG_WRONG_USERFILE "La Userfile a une mauvaise taille %d" -#define MSG_WS_CONV_ERR "Erreur de convertion de %s en WS" -#define MSG_XCOL_MISMATCH "La colonne %s ne correspond pas à l'index" -#define MSG_XDB_DEL_ERROR "Erreur en supprimant des entrées du fichier XDB" -#define MSG_XFILE_READERR "Erreur %d en lisant le fichier index" -#define MSG_XFILE_TOO_SMALL "Le fichier index est plus petit que la taille de l'index" -#define MSG_XFILE_WRITERR "Erreur en écrivant le fichier index: %s" -#define MSG_XMLTAB_INIT_ERR "Erreur d'initialisation de la table XML" -#define MSG_XML_INIT_ERROR "Erreur d'initialisation du nouveau fichier XML" -#define MSG_XPATH_CNTX_ERR "Le nouveau contexte XPath ne peut être créé" -#define MSG_XPATH_EVAL_ERR "Impossible d'évaluer l'emplacement xpath '%s'" -#define MSG_XPATH_NOT_SUPP "Xpath non supporté colonne %s" -#define MSG_X_ARG_ADDED "%d arguments ajoutés" -#define MSG_X_ARG_SET "%d arguments ont été initialisés" -#define MSG_X_ON_TAB " %s sur %s(" -#define MSG_ZERO_DIVIDE "Division par zéro dans une expression" diff --git a/storage/connect/frmsg2.h b/storage/connect/frmsg2.h deleted file mode 100644 index 487db3395fb..00000000000 --- a/storage/connect/frmsg2.h +++ /dev/null @@ -1,1013 +0,0 @@ -#define MSG_ACCESS_VIOLATN "Violation accŠs m‚moire" -#define MSG_ACT_ALLOC_FAIL "PlugInitLang: Erreur d'allocation du bloc Activity" -#define MSG_ADDVAL_ERROR "Erreur %d dans AddValue" -#define MSG_ADD_BAD_TYPE "Ajout d'une valeur de type %s non conforme dans un tableau %s" -#define MSG_ADD_NULL_DOM "Ajout de la chaŒne %s … un domaine nul" -#define MSG_ADPOS_IN_DICTP "ADPOS au travail dans User_Dictp" -#define MSG_AFTER " aprŠs: " -#define MSG_ALG_CHOICE_AUTO "Le choix du meilleur algorithme est automatique" -#define MSG_ALG_CHOICE_BAD "Choix d'algorithme invalide, remis … AUTO" -#define MSG_ALG_CHOICE_QRY "Utilise l'algorithme 'Query'" -#define MSG_ALG_CURLY_BRK "Le choix de l'algorithme d‚pend des accolades externes" -#define MSG_ALLOC_ERROR "Erreur d'allocation de %s" -#define MSG_ALL_DELETED "Toutes les lignes enlev‚es en %.2lf sec" -#define MSG_ALTER_DB_ERR "Impossible de d‚terminer la base de donn‚es … modifier" -#define MSG_AMBIG_COL_QUAL "Qualificateur ambigu %s pour la colonne %s" -#define MSG_AMBIG_CORREL "Select %s.* corr‚lation ambigue" -#define MSG_AMBIG_SPEC_COL "Colonne sp‚ciale ambigue %s" -#define MSG_ANSWER_TYPE "R‚ponse de type" -#define MSG_API_CONF_ERROR "Erreur SQL: API_CONFORMANCE" -#define MSG_APPL_ACCESSIBLE "Application %s accessible" -#define MSG_APPL_ACTIVE "Application %s encore active" -#define MSG_APPL_BAD_SAVE "Application %s partiellement sauvegard‚e" -#define MSG_APPL_CREATED "Application %s cr‚‚" -#define MSG_APPL_IS_ACTIVE "Application d‚j… active" -#define MSG_APPL_NOT_INIT "Application non initialis‚e" -#define MSG_APPL_NOT_LOADED "Application non charg‚e" -#define MSG_APPL_QUIT "Fin de l'application %s" -#define MSG_APPL_SAVED "Application %s sauvegard‚e" -#define MSG_APP_STILL_ACTIV "Application du langage %s encore active (non lib‚rable)" -#define MSG_AREAFILE_NOTFND "Fichier Area introuvable" -#define MSG_ARGS_SYNTAX_ERR "?SetArgs erreur de syntaxe: %s inattendu aprŠs %s" -#define MSG_ARG_ALREADY_SET "Argument %d d‚j… allou‚" -#define MSG_ARG_NOT_AN_ATTR "L'argument n'est pas un attribut (type %d erron‚)" -#define MSG_ARG_OUT_CONTEXT "Argument de type @ utilis‚ hors contexte" -#define MSG_ARG_OUT_RANGE "Argument de phrase valant %d hors limite" -#define MSG_ARG_PTR_NOSEM "Argument valant %d pointe sur un noeud sans Sem" -#define MSG_ARG_PTR_NOSEMS "Argument valant %d pointe sur un noeud sans s‚mantique" -#define MSG_ARG_REF_LOOP "?Bouclage entre r‚f‚rences crois‚es des arguments" -#define MSG_ARG_TWO_CONST "Le 2Šme argument de %s doit ˆtre constant" -#define MSG_ARRAY_ALLOC_ERR "Erreur d'allocation m‚moire dans ARRAY" -#define MSG_ARRAY_BNDS_EXCD "Hors limite de tableau" -#define MSG_ARRAY_ERROR "Erreur de fonctionnement k=%d n=%d" -#define MSG_ATTRIBUTE_ERROR "Erreur rŠgle %u attribut %s: " -#define MSG_ATT_NOT_CASE "Mauvaise valeur %d pour attribut (pas une CaseValue)" -#define MSG_ATT_POSCODE_BIG "Code attribut %d trop grand (max=%d)" -#define MSG_AVGLEN_ERROR "avglen doit ˆtre entre %d et %d" -#define MSG_BAD_AGGREG_FUNC "Fonction aggr‚g‚e %d non support‚e" -#define MSG_BAD_ARGTYPES "Argument de type invalide pour %s" -#define MSG_BAD_ARGUMENTS "Argument non attach‚s pour %s" -#define MSG_BAD_ARG_NUM "Nombre d'arguments invalide %d" -#define MSG_BAD_ARG_TYPE "Type d'argument %d invalide" -#define MSG_BAD_ARRAY_OPER "Les tableaux doivent utiliser l'op‚rateur IN" -#define MSG_BAD_ARRAY_TYPE "Type=%d invalide pour un tableau" -#define MSG_BAD_ARRAY_VAL "Les tableaux doivent avoir le mˆme nombre de valeurs" -#define MSG_BAD_BIN_FMT "Format invalide %c pour la colonne BIN %s" -#define MSG_BAD_BLK_ESTIM "Nombre de blocs sup‚rieur … l'estimation" -#define MSG_BAD_BLK_SIZE "Taille du bloc %d non conforme" -#define MSG_BAD_BYTE_NUM "Le nombre d'octets ‚crits est faux" -#define MSG_BAD_BYTE_READ "Le nombre d'octets lus est faux" -#define MSG_BAD_CARDINALITY "Appel invalide de Cardinality pour une table multiple" -#define MSG_BAD_CASE_SPEC "Min/Maj: sp‚cification %c incorrecte, recommencez: " -#define MSG_BAD_CHAR_SPEC "Sp‚cification '%s' invalide pour caractŠre" -#define MSG_BAD_CHECK_TYPE "Sous-type %d invalide pour CheckColumn" -#define MSG_BAD_CHECK_VAL "Valeur pour Check invalide '%s'" -#define MSG_BAD_COLCRT_ARG "COLCRT: Arg invalide (type=%hd, domain=%hd)" -#define MSG_BAD_COLDEF_TYPE "Coldefs: type ill‚gal %d" -#define MSG_BAD_COLIST_ITEM "El‚ment invalide dans une Colist" -#define MSG_BAD_COLIST_TYPE "Mauvais type=%d pour une Colist" -#define MSG_BAD_COLSIZE "Colsize %d trop petit pour cette base de donn‚es" -#define MSG_BAD_COL_ENTRY "Entr‚e invalide pour la colonne %s" -#define MSG_BAD_COL_FORMAT "Type de formattage %d invalide pour une colonne" -#define MSG_BAD_COL_IN_FILT "Colonne incorrecte dans un filtre" -#define MSG_BAD_COL_QUALIF "Qualificateur invalide %s pour la colonne %s" -#define MSG_BAD_COL_TYPE "Type invalide %s pour la colonne %s" -#define MSG_BAD_COL_XPATH "Xpath invalide colonne %s de la table HTML %s" -#define MSG_BAD_COMPARE_OP "Op‚rateur de comparaison %d invalide" -#define MSG_BAD_CONST_TYPE "Type=%d invalide pour une constante" -#define MSG_BAD_CONV_TYPE "Convertion de type invalide %d" -#define MSG_BAD_CORREL "Select %s.* corr‚lation absente" -#define MSG_BAD_DATETIME "Valeur date/temps invalide" -#define MSG_BAD_DATE_OPER "Op‚rateur de date inattendu %d" -#define MSG_BAD_DBF_FILE "Le fichier DBF %s est alt‚r‚" -#define MSG_BAD_DBF_REC "Fichier DBF %s alt‚r‚ enregistrement %d" -#define MSG_BAD_DBF_TYPE "Type DBF %c non support‚" -#define MSG_BAD_DEF_ARG "Argument invalide pour INDEXDEF (type=%hd, domain=%hd)" -#define MSG_BAD_DEF_READ "EOF inattendue en lecture diff‚r‚e" -#define MSG_BAD_DEF_TYPE "Type de colonne invalide" -#define MSG_BAD_DIRECTORY "R‚pertoire invalide %s: %s" -#define MSG_BAD_DIST_JN_FIL "Filtre de jointure distincte invalide" -#define MSG_BAD_DIST_JOIN "Sp‚cification invalide de jointure distincte" -#define MSG_BAD_DOM_COL_DEF "D‚finition de colonnes invalide pour un domaine" -#define MSG_BAD_DOM_VALUE "La valeur %d n'appartient pas au domaine" -#define MSG_BAD_EDIT_INIT "Coparm: ‚dition %s initialis‚e improprement" -#define MSG_BAD_EVAL_TYPE "Fonction scalaire de type=%d invalide" -#define MSG_BAD_EXEC_MODE "Mode d'ex‚cution invalide '%s'" -#define MSG_BAD_EXP_ARGTYPE "Argument de type %d invalide pour une expression" -#define MSG_BAD_EXP_OPER "Op‚rateur=%d invalide pour expression" -#define MSG_BAD_FETCH_RC "Code retour inattendu de Fetch %d" -#define MSG_BAD_FIELD_FMT "Format de champ invalide %c pour %s" -#define MSG_BAD_FIELD_RANK "Rang %d invalide pour la colonne %s" -#define MSG_BAD_FIELD_TYPE "Mauvais type de champ %s" -#define MSG_BAD_FILE_HANDLE "Handle de fichier invalide: %s" -#define MSG_BAD_FILE_LIST "La section liste de fichiers est erron‚e" -#define MSG_BAD_FILTER "Mauvais filtre: Opc=%d B_T=%d %d Type=%d %d" -#define MSG_BAD_FILTER_CONV "Conversion filtre incorrecte, B_T=%d,%d" -#define MSG_BAD_FILTER_LINK "Op‚rateur de chaŒnage ill‚gal %d" -#define MSG_BAD_FILTER_OP "Op‚rateur de filtre invalide %d" -#define MSG_BAD_FILTEST_OP "Op‚rateur invalide %d %d pour FilTest" -#define MSG_BAD_FLD_FORMAT "Format invalide pour le champs %d de %s" -#define MSG_BAD_FLD_LENGTH "Champs %s trop long (%s --> %d) ligne %d de %s" -#define MSG_BAD_FLOAT_CONV "Convertion invalide d'un tableau flottant" -#define MSG_BAD_FPARM_NEXT "Coparm: FPARM avec Next non nul" -#define MSG_BAD_FREQ_SET "Sp‚cification erronn‚e de Freq pour la colonne %s" -#define MSG_BAD_FUNC_ARG "Funcarg de type %d non impl‚ment‚" -#define MSG_BAD_FUNC_ARGTYP "Mauvais type d'argument=%d pour une fonction" -#define MSG_BAD_FUNC_MODE "%s: mode invalide %d" -#define MSG_BAD_GENRE "Genre est invalide" -#define MSG_BAD_GETVIEW_RET "GetView: type de retour %d invalide" -#define MSG_BAD_HANDLE_VAL "Valeur Handle invalide" -#define MSG_BAD_HAV_FILTER "Filtre Having sur une requˆte non group‚e" -#define MSG_BAD_HAV_FILTYPE "Filtre invalide pour clause Having" -#define MSG_BAD_HEADER "Fichier %s: bloc en-tˆte alt‚r‚" -#define MSG_BAD_HEADER_VAL "Valeur invalide pour Header" -#define MSG_BAD_HEAD_END "Lecture fin d'en-tˆte impossible" -#define MSG_BAD_INDEX_COL "Colonne %s invalide pour index %s" -#define MSG_BAD_INDEX_DEF "D‚finition invalide pour index %s" -#define MSG_BAD_INDEX_FILE "Fichier index %s corrompu" -#define MSG_BAD_INDEX_PART "D‚finition colonne invalide pour index %s" -#define MSG_BAD_INPUT "Entr‚e incorrecte" -#define MSG_BAD_IN_ARGTYPE "Argument de type invalide pour l'op‚rateur IN" -#define MSG_BAD_IN_ENDING "Erreur: fin de chaŒne IN invalide" -#define MSG_BAD_IN_STRING "La chaŒne IN commence ou finie par des caractŠres invalides %c ... %c" -#define MSG_BAD_JCOL_TYPE "Erreur logique JCT: disparit‚ des types colonnes" -#define MSG_BAD_JOIN_EXP "Expression invalide pour une jointure" -#define MSG_BAD_JOIN_FILTER "Filtre de jointure invalide" -#define MSG_BAD_JOIN_OP "Op‚rateur de joint invalide %d" -#define MSG_BAD_LANG_SIZE "Le fichier langage a une mauvaise taille %d" -#define MSG_BAD_LINEFLD_FMT "Format invalide ligne %d champs %d de %s" -#define MSG_BAD_LINE_LEN "Longueur ligne non ‚gale … Lrecl" -#define MSG_BAD_LIST_TYPE "Type de liste invalide %d" -#define MSG_BAD_LOCALE "Locale invalide %s" -#define MSG_BAD_LOCDFON_ARG "Mauvais paramŠtre pour LOCDFON" -#define MSG_BAD_LOCNODE_USE "Usage inattendu de LOCNODE" -#define MSG_BAD_LRECL "Disparit‚ lrecl table/fichier (%d,%hd)" -#define MSG_BAD_MAX_HAVING "MAXTMP trop petit pour Having" -#define MSG_BAD_MAX_NREC "MaxRec=%d ne correspond pas … MaxBlk=%d Nrec=%d" -#define MSG_BAD_MAX_PARAM "Mauvais paramŠtres pour sp‚cifier une valeur maximum" -#define MSG_BAD_MAX_SETTING "Mauvaise valeur '%c' pour max" -#define MSG_BAD_MERGE_TYPE "Le type %d ne pas ˆtre intercall‚" -#define MSG_BAD_NODE_TYPE "Type noeud erron‚ pour la table" -#define MSG_BAD_OFFSET_VAL "Nul offset invalide pour une table CSV" -#define MSG_BAD_OPEN_MODE "Mode d'ouverture invalide %d" -#define MSG_BAD_OPERATOR "Op‚rateur invalide %s" -#define MSG_BAD_ORDER_MODE "Mode de tri %c invalide" -#define MSG_BAD_ORDER_TYPE "Tri sur objet de type=%d invalide" -#define MSG_BAD_OUTER_JOIN "Jointure externe invalide sur table enfant" -#define MSG_BAD_PAD_ARGTYP "Argument de type invalide pour Pad ou Justify" -#define MSG_BAD_PARAMETERS "%.8s: Mauvais paramŠtres" -#define MSG_BAD_PARAM_TYPE "%.8s: ParamŠtre de type=%d invalide" -#define MSG_BAD_PARM_COUNT "Nombre de paramŠtres incoh‚rent" -#define MSG_BAD_PHASE_NUM "Num‚ro de phrase %d hors limite" -#define MSG_BAD_PHRASE_NB "num‚ro de phrase hors limite %d rc=%d\n" -#define MSG_BAD_POS_CODE "POS_code invalide %d" -#define MSG_BAD_POS_TYPE "Type de POS_code invalide %d" -#define MSG_BAD_PROJNUM "Mauvais projnum %d pour la colonne %s" -#define MSG_BAD_QUERY_OPEN "Mode invalide %d pour l'ouverture d'une requˆte" -#define MSG_BAD_QUERY_TYPE "Type de requˆte %d invalide pour %s" -#define MSG_BAD_QUOTE_FIELD "Quote manquante dans %s champs %d ligne %d" -#define MSG_BAD_READ_NUMBER "Mauvais nombre %d de valeurs lues dans %s" -#define MSG_BAD_RECFM "Recfm type %d invalide pour DOSCOL" -#define MSG_BAD_RECFM_VAL "Valeur invalide %d de Recfm" -#define MSG_BAD_RESULT_TYPE "Mauvais type de r‚sultat %d pour %s" -#define MSG_BAD_RETURN_TYPE "Type de retour %d incorrect" -#define MSG_BAD_ROW_VALIST "Liste de valeurs invalide pour ROW" -#define MSG_BAD_ROW_VALNB "Nombre de valeurs in‚gal dans la liste" -#define MSG_BAD_SCF_ARGTYPE "Argument %d de type=%s invalide pour %s" -#define MSG_BAD_SEM_DOMAIN "Domain .%d invalide" -#define MSG_BAD_SETTINGS "Certaines sp‚cifications sont incompatibles avec le type de la table" -#define MSG_BAD_SET_CASE "La casse d'un tableau ne peut pas passer de non respect … respecter" -#define MSG_BAD_SET_STRING "SetValue: appel invalide pour STRING" -#define MSG_BAD_SET_TYPE "Set type %hd invalide" -#define MSG_BAD_SPECIAL_CMD "Commande sp‚ciale invalide" -#define MSG_BAD_SPECIAL_COL "Colonne sp‚ciale invalide %s" -#define MSG_BAD_SPEC_COLUMN "Colonne sp‚ciale invalide pour ce type de table" -#define MSG_BAD_SQL_PARAM "ParamŠtre SQL invalide pour FindColblk" -#define MSG_BAD_SUBLST_TYPE "Coparm: type %d de sous-liste invalide" -#define MSG_BAD_SUBSEL_IN_X "Sub-select invalide pour une expression" -#define MSG_BAD_SUBSEL_TYPE "Type %d invalide retourn‚ de Sub-Select" -#define MSG_BAD_SUB_RESULT "R‚sultat ind‚fini de fonction Sub-Select" -#define MSG_BAD_SUB_SELECT "Sub-select invalide comme argument de fonction" -#define MSG_BAD_TABLE_LINE "Ligne '%s' ill‚gale ou tronqu‚e dans la section Tables" -#define MSG_BAD_TABLE_LIST "Table %s absente de la liste des tables" -#define MSG_BAD_TABLE_TYPE "Type invalide %s pour la table %s" -#define MSG_BAD_TEST_TYPE "BlockTest sur tableau: types d‚pareill‚s %s %s" -#define MSG_BAD_TRIM_ARGTYP "Argument de type invalide pour Trim" -#define MSG_BAD_TYPE_FOR_IN "Types d'argument incompatibles pour la fonction IN" -#define MSG_BAD_TYPE_FOR_S "Type incorrecte %d pour %s(%d)" -#define MSG_BAD_TYPE_LIKE "Type(%d)= %d invalide pour LIKE" -#define MSG_BAD_UPD_COR "Le qualificateur %s de la colonne %s ne se refŠre pas … la table mise … jour %s" -#define MSG_BAD_USERBLK_LEN "Mauvaise longueur … l'‚criture du bloc utilisateur" -#define MSG_BAD_USETEMP "Usetemp invalide '%s'" -#define MSG_BAD_USETEMP_VAL "Valeur pour Usetemp invalide %d" -#define MSG_BAD_VALBLK_INDX "Valeur hors limites de l'index du bloc de valeurs" -#define MSG_BAD_VALBLK_TYPE "Type=%d invalide pour un bloc de valeurs" -#define MSG_BAD_VALNODE "Type %d invalide pour le noeud valeur colonne %s" -#define MSG_BAD_VALUE_TYPE "Type de valeur invalide %d" -#define MSG_BAD_VAL_UPDATE "Impossible de d‚terminer quelle valeur %s doit ˆtre mise … jour" -#define MSG_BAD_VIEW_OPEN "Mode invalide %d pour l'ouverture d'une View" -#define MSG_BAD_XMODE_VAL "Mode d'ex‚cution %d invalide" -#define MSG_BAD_XOBJ_TYPE "Mauvais type de Xobject %d" -#define MSG_BAS_NS_LIST "Format invalide de la liste des espace-noms" -#define MSG_BIN_F_TOO_LONG "Valeur trop longue pour le champ %s (%d --> %d)" -#define MSG_BIN_MODE_FAIL "Echec mode binaire: %s" -#define MSG_BLKTYPLEN_MISM "Disparit‚ types/longueurs de bloc dans SetValue" -#define MSG_BLK_IS_NULL "Blk est nul" -#define MSG_BLOCK_NO_MATCH "Bloc non correspondant" -#define MSG_BREAKPOINT "Point de controle" -#define MSG_BUFF_TOO_SMALL "GetColData: Buffer trop petit" -#define MSG_BUFSIZE_ERROR "Erreur en recherchant la taille du buffer" -#define MSG_BUILDING_GROUPS "Formation des groupes" -#define MSG_BUILD_DIST_GRPS "Formation des groupes distinctes" -#define MSG_BUILD_INDEX "Construction index %s sur %s" -#define MSG_BXP_NULL "Bxp nul dans PUTFON" -#define MSG_CANNOT_OPEN "Ouverture impossible de %s" -#define MSG_CD_ONE_STEP "Count Distinct doit ˆtre ex‚cut‚ en une seule ‚tape" -#define MSG_CD_ORDER_ERROR "Erreur de tri dans Count Distinct" -#define MSG_CHECKING_ROWS "Test des lignes … mettre … jour" -#define MSG_CHECK_LEVEL "Niveau de v‚rification fix‚ … %u" -#define MSG_CHSIZE_ERROR "Erreur dans chsize: %s" -#define MSG_CLN_NOT_IN_JOIN "La colonne C%d n'est pas dans le join" -#define MSG_CNTDIS_COL_LOST "Colonne du Count Distinct perdue" -#define MSG_COLIST_BAD_TYPE "Type=%d invalide pour Colist" -#define MSG_COLNAM_TOO_LONG "Nom de colonne trop long" -#define MSG_COLSEC_TOO_BIG "Section colonne trop grande, table %s (%d)" -#define MSG_COLS_REDUCED " (r‚duit par Maxcol)" -#define MSG_COLUMN_ERROR "Erreur de colonne" -#define MSG_COLUMN_MISMATCH "Colonne %s d‚pareill‚e" -#define MSG_COLUMN_NOT_KEY "La colonne jointe R%d.%s n'est pas une cl‚" -#define MSG_COL_ALLOC_ERR "Allocation impossible du noeud colonne" -#define MSG_COL_ALLOC_ERROR "Erreur d'allocation m‚moire pour la colonne %d" -#define MSG_COL_HAS_NO_DEF "La colonne %s n'est pas d‚finie" -#define MSG_COL_INVAL_TABLE "La colonne %s.%s n'existe pas dans la table %s alias %s" -#define MSG_COL_ISNOT_TABLE "La colonne %s n'est pas dans la table %s" -#define MSG_COL_NB_MISM "Le nombre de colonnes ne correspond pas" -#define MSG_COL_NOTIN_GRPBY "La colonne %s n'est pas dans la liste de Group By" -#define MSG_COL_NOTIN_TABLE "La colonne %s n'est dans aucune table" -#define MSG_COL_NOTIN_UPDT "%s n'appartient pas … la table mise … jour %s" -#define MSG_COL_NOT_CODED "La colonne %s n'est pas codifi‚e" -#define MSG_COL_NOT_EXIST "La colonne %s n'existe pas dans %s" -#define MSG_COL_NOT_FOUND "La colonne %s n'est pas dans la table %s" -#define MSG_COL_NOT_IN_DB "La colonne %s de la table %s n'est pas dans la base de donn‚es" -#define MSG_COL_NOT_IN_JOIN "La colonne %s n'est pas dans le join" -#define MSG_COL_NOT_SORTED "La colonne %s de la table %s n'est pas tri‚e" -#define MSG_COL_NUM_MISM "Disparit‚ du nombre de colonnes" -#define MSG_COL_USED_TWICE "Colonne %s utilis‚e deux fois ???" -#define MSG_COMPUTE_ERROR "Erreur dans Compute, op=%d" -#define MSG_COMPUTE_NIY "Compute non impl‚ment‚ pour TOKEN" -#define MSG_COMPUTING "Calculs en cours" -#define MSG_COMPUTING_DIST "Comptage des valeurs distinctes" -#define MSG_COMPUTING_FUNC "Calcul de(s) fonction(s)" -#define MSG_COM_ERROR "Erreur Com" -#define MSG_CONCAT_SUBNODE "Concat‚nation de sous-noeuds impossible" -#define MSG_CONNECTED "Connect‚e" -#define MSG_CONNECT_CANCEL "Connection interrompue par l'utilisateur" -#define MSG_CONNECT_ERROR "Erreur %d se connectant à %s" -#define MSG_CONN_CLOSED "%s(%d) ferm‚e" -#define MSG_CONN_CREATED "Connexion %s cr‚e" -#define MSG_CONN_DROPPED "Connexion %s supprim‚e" -#define MSG_CONN_OPEN "%s(%d) ouverte (%s)" -#define MSG_CONN_SUC_OPEN "%s(%d) ouverte avec succŠs" -#define MSG_CONTROL_C_EXIT "Exit par Ctrl-C" -#define MSG_COPY_BAD_PHASE "Copie de liste invalide en phase %d" -#define MSG_COPY_INV_TYPE "Coparm: type non support‚ %d" -#define MSG_CORREL_NO_QRY "Les sous-requˆtes corr‚l‚es ne peuvent pas ˆtre de type QRY" -#define MSG_CREATED_PLUGDB " Cr‚‚ par PlugDB %s " -#define MSG_CURSOR_SET "Curseur remis … %d" -#define MSG_DATABASE_ACTIVE "Base de donn‚es %s activ‚e" -#define MSG_DATABASE_LOADED "Base de donn‚es %s charg‚e" -#define MSG_DATA_IS_NULL "ExecSpecialCmd: data est NULL" -#define MSG_DATA_MISALIGN "Mauvais alignement pour ce type de donn‚es" -#define MSG_DBASE_FILE "Fichier dBASE dbf: " -#define MSG_DB_ALREADY_DEF "Base de donn‚es %s d‚j… d‚finie" -#define MSG_DB_ALTERED "Base de donn‚es modifi‚e" -#define MSG_DB_CREATED "Base de donn‚es %s cr‚‚e" -#define MSG_DB_NOT_SPEC "Base de donn‚es non sp‚cifi‚e" -#define MSG_DB_REMOVED "Base de donn‚es %s retir‚e de la liste" -#define MSG_DB_SORT_ERROR "Erreur de tri DB" -#define MSG_DB_STOPPED "Arrˆt de la base de donn‚es %s" -#define MSG_DEBUG_NOT_ACTIV "Mode Debug inactif" -#define MSG_DEBUG_SET_INV "Invalide pour Debug: %c" -#define MSG_DEF_ALLOC_ERROR "Erreur d'allocation de la classe DEF %s" -#define MSG_DELETING_ROWS "Suppression des lignes" -#define MSG_DEL_FILE_ERR "Erreur … l'effacement de %s" -#define MSG_DEL_READ_ERROR "Delete: erreur en lecture req=%d len=%d" -#define MSG_DEL_WRITE_ERROR "Delete: erreur en ‚criture: %s" -#define MSG_DEPREC_FLAG "Option Flag p‚rim‚e, utiliser Coltype" -#define MSG_DICTIONARY "Dictionnaire " -#define MSG_DIRECT_VARTOK "AccŠs direct aux rŠgles du Variable Token non impl‚ment‚" -#define MSG_DISCONNECTED "D‚connect‚" -#define MSG_DISTINCT_ERROR "Plus d'un ‚l‚ment fonctionel DISTINCT" -#define MSG_DISTINCT_ROWS "S‚lection des lignes distinctes" -#define MSG_DISTINCT_VALUES "Extraction des valeurs distinctes" -#define MSG_DIS_NOHEAD_JOIN "Jointure distincte sur une table non en tˆte" -#define MSG_DLL_LOAD_ERROR "Erreur %d au chargement du module %s" -#define MSG_DOMAIN_EMPTY "Le domaine %s est vide" -#define MSG_DOMAIN_ERROR "Colonne %s: disparit‚ domaine(%s)/valeur(%s)" -#define MSG_DOMAIN_FULL "Le domaine %s est plein (max=%d)" -#define MSG_DOM_FILE_ERROR "Fichier domain %s introuvable" -#define MSG_DOM_NOT_SUPP "MS-DOM non support‚ par cette version" -#define MSG_DOM_OPEN_ERROR "Erreur d'ouverture du domaine: %s" -#define MSG_DOM_READ_ERROR "Erreur %d en lecture de domaine: %s" -#define MSG_DOM_READ_ONLY "La table domaine %s est en lecture seulement" -#define MSG_DOM_WRITE_ERROR "Erreur %d en ‚criture de domaine: %s" -#define MSG_DONE "Effectu‚, rc=%d" -#define MSG_DOSALMEM_NOMEM "Erreur d'allocation, pas assez de m‚moire" -#define MSG_DROP_DB_ERR "Echec du Drop sur le base de donn‚es %s" -#define MSG_DSORT_LOG_ERROR "Kindex: Erreur logique de tri distincte" -#define MSG_DUMMY_NO_COLS "Les tables DUMMY ne peuvent pas avoir de colonne" -#define MSG_DUPLICAT_COUNT "Count sur plus d'une colonne" -#define MSG_DUP_COL_NAME "La colonne %s existe en double" -#define MSG_DUP_PROJNUM "Non unique projnum %d pour la colonne %s" -#define MSG_DVAL_NOTIN_LIST "Valeur %s non trouv‚e dans la liste des valeurs distinctes de la colonne %s" -#define MSG_EMPTY_DOC "Document vide" -#define MSG_EMPTY_FILE "%s du fichier vide %s: " -#define MSG_ENDSTR_MISMATCH "Fins de chaŒne et de noeud ne correspondent pas" -#define MSG_END_OF_DELETE "%d ligne(s) enlev‚e(s) en %.2lf sec" -#define MSG_END_OF_INSERT "%d ligne(s) ins‚r‚e(s) en %.2lf sec" -#define MSG_END_OF_QUERY "%d ligne(s) extraite(s) en %.2lf sec" -#define MSG_END_OF_UPDATE "%d ligne(s) modifi‚e(s) en %.2lf sec" -#define MSG_EOF_AFTER_LINE "Fin de fichier aprŠs la ligne %d" -#define MSG_EOF_INDEX_FILE "EOF lisant le fichier index" -#define MSG_ERASED " et effac‚e" -#define MSG_ERASE_FAILED " (‚chec de l'effacement)" -#define MSG_ERROR "Erreur" -#define MSG_ERROR_IN_LSK "Erreur %d dans lseek64" -#define MSG_ERROR_IN_SFP "Erreur %d dans SetFilePointer" -#define MSG_ERROR_NO_PARM "ParamŠtre absent (valide seulement pour %.8s.1 et %.8s.5)" -#define MSG_ERROR_OPENING "Erreur … l'ouverture de : " -#define MSG_ERR_NUM_GT_MAX "Erreur: Numval (%d) plus grand que Maxnum (%d)" -#define MSG_ERR_READING_REC "Erreur lisant l'enregistrement %d de %s" -#define MSG_ERR_RET_RULE "Retour erreur, rŠgle=%u" -#define MSG_ERR_RET_TYPE "Retour erreur, type=%d" -#define MSG_EVAL_EXPIRED "Cette version d'évaluation est expir‚e" -#define MSG_EVAL_ONLY "L'utilisation de cette Dll est pour ‚valuation seulement" -#define MSG_EXECUTING "Ex‚cution" -#define MSG_EXECUTION_ERROR "Erreur d'ex‚cution" -#define MSG_EXEC_MODE_IS "Le mode d'ex‚cution est %s" -#define MSG_EXEC_MODE_RESET ". Mode remis … Execute" -#define MSG_EXEC_MODE_SET "Mode d'ex‚cution fix‚ … %s" -#define MSG_EXIT_EVAL_ERR "Erreur pendant l'‚valuation de Exit" -#define MSG_EXIT_FROM_LANG "Fin du langage %s version %d.%d" -#define MSG_FAIL_ADD_NODE "L'ajout du noeud %s dans la table a ‚chou‚" -#define MSG_FETCHING_DATA "Recherche des donn‚es" -#define MSG_FETCHING_ROWS "Recherche des lignes" -#define MSG_FETCH_NO_RES "Fetch: Pas de R‚sultats" -#define MSG_FIELD_TOO_LONG "Valeur trop longue pour le champs %d ligne %d" -#define MSG_FILELEN_ERROR "Erreur dans %s pour %s" -#define MSG_FILE_CLOSE_ERR "Erreur %d … la fermeture du fichier" -#define MSG_FILE_IS_EMPTY "Le fichier %s est vide" -#define MSG_FILE_MAP_ERR "Erreur de File mapping" -#define MSG_FILE_MAP_ERROR "CreateFileMapping %s erreur rc=%d" -#define MSG_FILE_NOT_FOUND "Fichier %s introuvable" -#define MSG_FILE_OPEN_YET "Fichier %s d‚j… ouvert" -#define MSG_FILE_UNFOUND "Fichier %s non trouv‚" -#define MSG_FILGRP_NO_TABLE "Table %d manquante pour groupe filtre" -#define MSG_FILTER_ATTACH "Filtre pass‚ … Attach" -#define MSG_FILTER_NO_TABLE "Filtre: premiŠre table manquante" -#define MSG_FIND_BAD_TYPE "Recherche dans un tableau: type non conforme %s %s" -#define MSG_FIX_OVFLW_ADD "D‚passement de capacit‚ en addition" -#define MSG_FIX_OVFLW_TIMES "D‚passement de capacit‚ en mutiplication" -#define MSG_FIX_UNFLW_ADD "Sous d‚passement de capacit‚ en addition" -#define MSG_FIX_UNFLW_TIMES "Sous d‚passement de capacit‚ en multiplication" -#define MSG_FLD_TOO_LNG_FOR "Champs %d trop long pour %s ligne %d de %s" -#define MSG_FLTST_NO_CORREL "FilTest ne devrait ˆtre appel‚ que pour les sous-requˆtes corr‚l‚es" -#define MSG_FLT_BAD_RESULT "Virgule flottante: r‚sultat inexacte" -#define MSG_FLT_DENORMAL_OP "Op‚rande virgule flottante non normalis‚" -#define MSG_FLT_INVALID_OP "Op‚ration virgule flottante invalide" -#define MSG_FLT_OVERFLOW "D‚passement de capacit‚ virgule flottante" -#define MSG_FLT_STACK_CHECK "Virgule flottante: Erreur de la pile" -#define MSG_FLT_UNDERFLOW "Sous-d‚passement de capacit‚ virgule flottante" -#define MSG_FLT_ZERO_DIVIDE "Virgule flottante: division par z‚ro" -#define MSG_FMT_WRITE_NIY "L'‚criture des fichiers %s n'est pas encore impl‚ment‚e" -#define MSG_FNC_NOTIN_SLIST "Fonction de tri absente de la liste de s‚lection" -#define MSG_FORMAT_ERROR "Erreur de formattage" -#define MSG_FOXPRO_FILE "Fichier FoxPro: " -#define MSG_FPUTS_ERROR "Erreur dans fputs: %s" -#define MSG_FSBPARP_NULL "PUTFON: fsbparp est nul" -#define MSG_FSEEK_ERROR "Erreur dans fseek: %s" -#define MSG_FSETPOS_ERROR "Erreur dans fseek pour i=%d" -#define MSG_FTELL_ERROR "Erreur dans ftell enregistrement=%d: %s" -#define MSG_FUNCTION_ERROR "Erreur dans %s: %d" -#define MSG_FUNC_ERRNO "Erreur %d dans %s" -#define MSG_FUNC_ERROR "Erreur dans %s" -#define MSG_FUNC_ERR_S "Erreur dans %s: %s" -#define MSG_FUNC_REF_DEL "R‚f‚rence … une fonction d‚finie (rŠgle %d) qui a ‚t‚ supprim‚e" -#define MSG_FWRITE_ERROR "Erreur dans fwrite: %s" -#define MSG_GETCWD_ERR_NO "?getcwd %s errno=%d" -#define MSG_GETFILESIZE_ERR "Erreur %d dans GetFileSize" -#define MSG_GET_DIST_VALS "R‚cup‚ration des valeurs distinctes de " -#define MSG_GET_ERROR "Erreur dans %s (colonne %d)" -#define MSG_GET_FUNC_ERR "Erreur en recherche de la fonction %s: %s" -#define MSG_GET_NAME_ERR "Erreur en retrouvant le nom d'une table SYS" -#define MSG_GLOBAL_ERROR "Erreur d'allocation de Global (taille=%d)\n" -#define MSG_GRAM_ALLOC_ERR "Erreur d'allocation dans Grammar Up" -#define MSG_GRAM_MISMATCH "Avertissement: version de GRAMMAR p‚rim‚e (sauv‚ sous GRAMMAR v%u)" -#define MSG_GRAM_SUBSET_ERR "Erreur d'initialisation du dictionnaire de la grammaire" -#define MSG_GRBY_TAB_NOTIMP "Group by avec tables jointes non impl‚ment‚" -#define MSG_GROUPBY_NOT_ALL "Group By doit inclure toutes les s‚lections non-fonctionnelles" -#define MSG_GROUP_ON_FUNC "Group by invalide sur colonne fonctionnelle" -#define MSG_GRP_COL_MISM "Disparit‚ colonne des groupes" -#define MSG_GRP_LIST_MISMAT "Le groupement ne couvre pas la liste de s‚lection" -#define MSG_GUARD_PAGE "Violation de page de garde" -#define MSG_GZOPEN_ERROR "gzopen %s: erreur %d sur %s" -#define MSG_GZPUTS_ERROR "Erreur dans gzputs: %s" -#define MSG_HANDLE_IS_NULL "%s est NULL: erreur code: %d" -#define MSG_HARRY_COMP_NIY "Compute non impl‚ment‚ pour les chaŒnes cod‚es" -#define MSG_HAVING_FILTER "Traitement du Filtre Having" -#define MSG_HBUF_TOO_SMALL "Buffer(%d) trop petit pour entˆte(%d)" -#define MSG_HEAD_OPEN_ERROR "Erreur … l'ouverture du fichier header" -#define MSG_HEAD_READ_ERROR "Erreur en lecture du fichier header %s" -#define MSG_HEAD_WRITE_ERR "Erreur en ‚criture du fichier header" -#define MSG_HI_OFFSET_ERR "Offset sup‚rieur non nul" -#define MSG_HUGE_DEFAULT "Huge est %d par d‚fault" -#define MSG_HUGE_WARNING_1 "M‚moire Huge non compatible 16-bit pour %d\n" -#define MSG_HUGE_WARNING_2 "R‚sultats impr‚visibles possibles\n" -#define MSG_IDLE "Au repos" -#define MSG_ILLEGAL_INSTR "Instruction ill‚gale" -#define MSG_ILL_FILTER_CONV "Conversion implicite ill‚gale dans un filtre" -#define MSG_INDEX_CREATED "Index %s cr‚‚ sur %s" -#define MSG_INDEX_DEF_ERR "Erreur sauvegardant l'index d‚finition pour %s" -#define MSG_INDEX_DROPPED "Index %s supprim‚ de %s" -#define MSG_INDEX_INIT_ERR "Echec de l'initialisation de l'index %s" -#define MSG_INDEX_NOT_DEF "Index %s non d‚fini" -#define MSG_INDEX_NOT_UNIQ "L'index n'est pas Unique" -#define MSG_INDEX_ONE_SAVE "Les index sont sauvegard‚s dans un fichier unique" -#define MSG_INDEX_SEP_SAVE "Les index sont sauvegard‚s dans des fichiers s‚par‚s" -#define MSG_INDEX_YET_ON "L'index %s existe d‚j… sur %s" -#define MSG_INDX_ALL_DROP "Tous les index de %s supprim‚s" -#define MSG_INDX_COL_NOTIN "La colonne index %s n'existe pas dans la table %s" -#define MSG_INDX_EXIST_YET "L'entr‚e index existe d‚j…" -#define MSG_INIT_ERROR "Erreur à l'initialisation de %s" -#define MSG_INIT_FAILED "L'initialisation de %s a ‚chou‚" -#define MSG_INPUT "Entr‚e: " -#define MSG_INPUT_KEYBD_YET "L'entr‚e est d‚j… au clavier" -#define MSG_INSERTING "Insertion: " -#define MSG_INSERT_ERROR "Insert erreur: usage multiple du fichier %s" -#define MSG_INSERT_MISMATCH "Les listes colonne et valeur ne correspondent pas" -#define MSG_INTERNAL "interne" -#define MSG_INT_COL_ERROR "Erreur interne sur la colonne index %s" -#define MSG_INT_OVERFLOW "D‚passement de capacit‚ sur entier" -#define MSG_INT_ZERO_DIVIDE "Division entiŠre par z‚ro" -#define MSG_INVALID_BIP "Bip invalide .%d" -#define MSG_INVALID_DISP "Disposition invalide" -#define MSG_INVALID_FTYPE "SBV: Ftype %d invalide" -#define MSG_INVALID_HANDLE "Poign‚e invalide" -#define MSG_INVALID_OPER "Op‚rateur invalide %d pour %s" -#define MSG_INVALID_OPTION "Option invalide %s" -#define MSG_INV_COLUMN_TYPE "Type %d Invalide pour la colonne %s" -#define MSG_INV_COL_DATATYP "Type de donn‚es %d invalide pour la colonne %d" -#define MSG_INV_COL_NUM "Colonne invalide %d" -#define MSG_INV_COL_TYPE "Type de colonne %s invalide" -#define MSG_INV_CONC_BIP "Bip invalide (seuls valides: %.8s.0 .1 and .5)" -#define MSG_INV_DATA_PATH "Chemin vers les donn‚es invalide" -#define MSG_INV_DEF_READ "Lecture diff‚r‚e invalide rc=%d" -#define MSG_INV_DIRCOL_OFST "Offset invalide pour une colonne DIR" -#define MSG_INV_DOMAIN_TYPE "Type invalide %d" -#define MSG_INV_FILTER "Filtre r‚siduel dans %s" -#define MSG_INV_FNC_BUFTYPE "FNC: Type %d de l'argument invalide pour %s" -#define MSG_INV_INFO_TYPE "Type d'info catalog invalide %d" -#define MSG_INV_INIPATH "Inipath invalide " -#define MSG_INV_MAP_POS "Position m‚moire invalide" -#define MSG_INV_OPERATOR "op‚rateur invalide %d\n" -#define MSG_INV_PARAMETER "ParamŠtre invalide %s" -#define MSG_INV_PARM_TYPE "Type de paramŠtre invalide" -#define MSG_INV_QUALIFIER "Qalificateur '%s' invalide" -#define MSG_INV_QUERY_TYPE "Type de requˆte %d invalide" -#define MSG_INV_RAND_ACC "L'accŠs al‚atoire d'une table non optimis‚e est impossible" -#define MSG_INV_REC_POS "Position d'enregistrement invalide" -#define MSG_INV_RESULT_TYPE "Type de r‚sultat invalide %s" -#define MSG_INV_SET_SUBTYPE "Type de formattage %d invalide" -#define MSG_INV_SPECIAL_CMD "%s: Commande sp‚ciale invalide" -#define MSG_INV_SUBTYPE "Sous type invalide %s" -#define MSG_INV_TOK_DOMAIN "Le domaine %s n'existe pas" -#define MSG_INV_TOPSEM_CMD "Commande TopSem invalide %c" -#define MSG_INV_TRANSF_USE "Usage invalide en rŠgle transformationnelle" -#define MSG_INV_TYPE_SPEC "Sp‚cification de type invalide (%.8s.%d)" -#define MSG_INV_UPDT_TABLE "Table %s invalide pour Update" -#define MSG_INV_VALUE_LIST "Liste de valeurs invalide pour Insert" -#define MSG_INV_WHERE_JOIN "Clause Where invalide dans une requˆte de jointure" -#define MSG_INV_WORK_PATH "Chemin de travail invalide" -#define MSG_IN_ARGTYPE_MISM "Arguments de types incompatibles pour une expression IN" -#define MSG_IN_USE " et en activit‚" -#define MSG_IN_WITHOUT_SUB "IN ou EXISTS sans tableau ou subquery" -#define MSG_IS_NOT_CONN "%s n'est pas une connexion d‚finie" -#define MSG_JCT_MISS_COLS "Colonnes manquantes pour une table JCT" -#define MSG_JCT_MISS_TABLE "Table jointe manquante pour JCT" -#define MSG_JCT_NO_FILTER "Filtrage impossible des tables virtuelles JCT" -#define MSG_JCT_NO_KEY "Erreur logique JCT: cl‚ manquante" -#define MSG_JOIN_KEY_NO_COL "La cl‚ de jointure n'est pas une colonne" -#define MSG_KEY_ALLOC_ERR "Erreur d'allocation d'un bloc offset cl‚" -#define MSG_KEY_ALLOC_ERROR "Erreur d'allocation m‚moire, Klen=%d n=%d" -#define MSG_LANGUAGE_QUIT "%s lib‚r‚" -#define MSG_LANG_ACTIVE "Langage %s actif" -#define MSG_LANG_ALLOC_FAIL "PlugInitLang: Erreur d'allocation du bloc Lang" -#define MSG_LANG_ALREADY_UP "Langage d‚j… en ‚dition" -#define MSG_LANG_BAD_SAVE "Langage %s peut-ˆtre incorrectement sauvegard‚" -#define MSG_LANG_NOT_FREED "Langage %s non lib‚rable (pas dans la chaŒne principale)" -#define MSG_LANG_SAVED "Langage %s sauvegard‚" -#define MSG_LANG_WR_LEN_ERR "Erreur de longueur … l'‚criture du bloc Lang" -#define MSG_LDF_ALLOC_ERROR "Erreur d'allocation d'un LdfBlock" -#define MSG_LDF_RN_MISMATCH "LDF: d‚calage des num‚ros de rŠgle" -#define MSG_LDF_WLEN_ERROR "Erreur de longueur en ‚crivant LdfData" -#define MSG_LDF_W_LEN_ERROR "Erreur de longueur pour LdfData en ‚criture" -#define MSG_LIC_NO_MYSQL "Votre licence actuelle ne permet pas l'utilisation du type MYSQL" -#define MSG_LINEAR_ERROR "Erreur de lin‚arisation" -#define MSG_LINE_LENGTH "Largeur d'impression fix‚e … %d" -#define MSG_LINE_MAXLIN "Nombre de lignes de travail plafonn‚ … %d" -#define MSG_LINE_MAXRES "Nombre de lignes de r‚sultat plafonn‚ … %d" -#define MSG_LINE_MAXTMP "Nombre de lignes interm‚diaires plafonn‚ … %d" -#define MSG_LINE_TOO_LONG "La nouvelle ligne est trop longue" -#define MSG_LINJOINDB_ERROR "Erreur systŠme: appel incorrecte … LinJoinDB" -#define MSG_LIST "--Liste--" -#define MSG_LNG_NOT_IN_LIST "Le langage %s n'est pas dans la liste" -#define MSG_LOADING_DB "Chargement description de la BD" -#define MSG_LOADING_FAILED "Le chargement de %s a ‚chou‚" -#define MSG_LOAD_CDLL_ERROR "Erreur au chargement de ConnDll: rc=%d" -#define MSG_LOCSTRG_TOO_BIG "LOCSTRG: n trop grand ? (%d)\n" -#define MSG_LOGICAL_ERROR "%s: Erreur logique" -#define MSG_LRECL_TOO_SMALL "Lrecl trop petit (longueur en-tˆte = %d)" -#define MSG_MAC_NO_DELETE "Pas de suppression de lignes pour les tables MAC" -#define MSG_MAC_NO_INDEX "Pas d'accŠs direct aux tables MAC" -#define MSG_MAC_READ_ONLY "Les tables MAC sont en lecture seulement" -#define MSG_MAC_WIN_ONLY "Les tables MAC sont seulement sous Windows" -#define MSG_MAKE_EMPTY_FILE "G‚n‚ration du fichier vide %s: %s" -#define MSG_MAKING "G‚n‚ration" -#define MSG_MAKING_DISTINCT "Regroupement des valeures distinctes" -#define MSG_MALLOC_ERROR "Allocation m‚moire impossible par %s" -#define MSG_MALLOC_NULL "malloc retourne Null" -#define MSG_MAP_NO_MORE "Le type %s n'est plus support‚" -#define MSG_MAP_OBJ_ERR "Erreur %d … la fermeture du map objet" -#define MSG_MAP_VEC_ONLY "MAP Insert permis seulement pour les tables VEC Estimate" -#define MSG_MAP_VIEW_ERROR "MapViewOfFile %s erreur rc=%d" -#define MSG_MAXSIZE_ERROR "Maxsize incalculable sur table ouverte" -#define MSG_MAXTMP_TRUNCATE "R‚sultats interm‚diaires tronqu‚s par maxtmp=%d" -#define MSG_MAX_BITMAP "Taille maxi des bitmaps d'optimisation fix‚e … %d" -#define MSG_MEMSIZE_TOO_BIG "Erreur: memsize (%d) trop grand pour Length (%d)" -#define MSG_MEM_ALLOC_ERR "Erreur d'allocation m‚moire, taille %s = %d" -#define MSG_MEM_ALLOC_ERROR "Erreur d'allocation m‚moire" -#define MSG_MEM_ALLOC_YET "M‚moire d‚j… allou‚e" -#define MSG_METAFILE_NOTFND "Fichier Meta introuvable" -#define MSG_MISPLACED_QUOTE "Appostrophe mal plac‚e ligne %d" -#define MSG_MISSING "Manquant: Value=%p Argval=%p Builtin=%d" -#define MSG_MISSING_ARG "Argument manquant pour l'op‚rateur %d" -#define MSG_MISSING_COL_DEF "D‚finition des colonnes manquante" -#define MSG_MISSING_CONNECT "Connection #1 manquante" -#define MSG_MISSING_EOL "Fin de ligne manquante dans %s" -#define MSG_MISSING_FIELD "Champs %d manquant dans %s ligne %d" -#define MSG_MISSING_FNAME "Nom du fichier manquant" -#define MSG_MISSING_NODE "Noeud %s manquant dans %s" -#define MSG_MISSING_POS "POS code manquant" -#define MSG_MISSING_ROWNODE "Impossible de trouver le noeud de la ligne %d" -#define MSG_MISSING_SERV_DB "Indication serveur et/ou base de donn‚es manquante" -#define MSG_MISS_LEAD_COL "Colonne majeure %s manquante" -#define MSG_MISS_NAME_LRECL "Nom du fichier et/ou LRECL manquant" -#define MSG_MISS_TABLE_LIST "Liste des tables manquante" -#define MSG_MISS_VCT_ELMT "Taille de bloc vectoriel manquante (Elements)" -#define MSG_MIS_TAG_LIST "Liste des balises colonne manquante" -#define MSG_MKEMPTY_NIY "MakeEmptyFile: pas encore implement‚ pour Huge et Unix" -#define MSG_MOVE_INV_TYPE "MOVPARM: paramŠtre de type invalide %d" -#define MSG_MULT_DISTINCT "Distinct utilis‚ plus d'une fois" -#define MSG_MULT_KEY_ERROR "Erreur sur cl‚ multiple k=%d n=%d" -#define MSG_MUL_MAKECOL_ERR "Erreur logique dans TABMUL::MakeCol" -#define MSG_MYSQL_CNC_OFF "La connexion … MySQL est ferm‚e" -#define MSG_MYSQL_CNC_ON "La connexion … MySQL est ‚tablie" -#define MSG_MYSQL_NOT_SUP "Pas de support de MySQL dans cette version" -#define MSG_MY_CNC_ALREADY "La connexion … MySQL est d‚j… active" -#define MSG_NAME_CONV_ERR "Erreur de convertion du nom de noeud" -#define MSG_NAME_IS_USED "Le nom %s est d‚j… utilis‚" -#define MSG_NCOL_GT_MAXCOL "Trop de colonnes (%d > %d max)" -#define MSG_NEW_CHAR_NULL "new char(%d) retourne Null" -#define MSG_NEW_DOC_FAILED "Impossible de cr‚er le nouveau document" -#define MSG_NEW_RETURN_NULL "NULL renvoy‚ par New dans PlugEvalLike" -#define MSG_NEW_TABLE_ERR "La nouvelle table %s ne peut pas ˆtre charg‚e" -#define MSG_NEXT_FILE_ERROR "Erreur en recherche du fichier suivant. rc=%s" -#define MSG_NODEF_FROM_VIEW "Pas de d‚finition de table depuis une view" -#define MSG_NODE_FOR_CHAR "Noeud %s trouve au lieu d'un caractŠre" -#define MSG_NODE_SUBSET_ERR "Erreur d'initialisation de la zone Noeud %d" -#define MSG_NONCONT_EXCEPT "Exception non-continuable" -#define MSG_NON_DUP_HAVING "Clause Having dans une requˆte non fonctionelle" -#define MSG_NON_EVAL_SEM "Sem non ‚valu‚e: p_no=%d" -#define MSG_NOP_ZLIB_INDEX "L'indexage d'une table zlib non optimis‚e est impossible" -#define MSG_NOT_A_DBF_FILE "Le fichier n'a pas le format dBASE dbf " -#define MSG_NOT_ENOUGH_COLS "Pas assez de colonnes dans %s" -#define MSG_NOT_ENOUGH_MEM "M‚moire insuffisante pour cette op‚ration" -#define MSG_NOT_FIXED_LEN "Fichier %s non fixe, len=%d lrecl=%d" -#define MSG_NOT_IMPLEMENTED "Non implement‚: %.8s" -#define MSG_NOT_IMPL_JOIN "Pas impl‚ment‚ pour les jointures" -#define MSG_NOT_IMPL_SET "Pas impl‚ment‚ pour les op‚rateurs d'ensembles" -#define MSG_NOT_IMPL_YET "Pas encore implement‚" -#define MSG_NOT_LINEARIZED "Arborescence des tables non lin‚aris‚e" -#define MSG_NOT_MODIFIABLE " (non modifiable)" -#define MSG_NO_0DH_HEAD "0DH manquant en fin d'en-tˆte (dbc=%d)" -#define MSG_NO_ACTIVE_APPL "Pas d'application active" -#define MSG_NO_ACTIVE_DB "Pas de base de donn‚es active" -#define MSG_NO_ACTIVE_UDIC "Pas de dictionaire utilisateur actif" -#define MSG_NO_AGGR_FUNC "Fonction aggr‚g‚e %d ill‚gale … cet endroit" -#define MSG_NO_AREA_FILE "Fichier Area introuvable" -#define MSG_NO_AVAIL_RESULT "Pas de r‚sultat disponible" -#define MSG_NO_BIG_DELETE "D‚l‚tion Partielle non impl‚ment‚e pour les fichiers HUGE" -#define MSG_NO_CHAR_FROM "Conversion de type %d en caractŠres impossible" -#define MSG_NO_CLUSTER_COL "Pas de colonne optimisable" -#define MSG_NO_COL_ADDING "Ajouter des colonnes dans une d‚finition existante est impossible" -#define MSG_NO_COL_DEF_AS "La d‚finitions des colonnes est incompatible avec AS Select" -#define MSG_NO_COL_FOUND "La section colonne %s est vide" -#define MSG_NO_COL_IN_TABLE "La colonne %d n'est pas dans la table %s" -#define MSG_NO_COL_SECTION "Section colonne manquante pour la table %s" -#define MSG_NO_CONNECT_ADDR "Adresse de connection non sp‚cifi‚e" -#define MSG_NO_CONST_FILTER "Filtres constants non implement‚s" -#define MSG_NO_CURLY_BRKT "Pas d'accolade de fermeture" -#define MSG_NO_DATABASE "Base de donn‚es %s introuvable" -#define MSG_NO_DATE_FMT "Pas de format date pour le valblock de type %d" -#define MSG_NO_DBF_INSERT "Insert pas encore impl‚ment‚ pour les fichier DBF" -#define MSG_NO_DEF_FNCCOL "Colonne fonction par d‚faut introuvable" -#define MSG_NO_DEF_PIVOTCOL "Colonne pivot par d‚faut introuvable" -#define MSG_NO_DIR_INDX_RD "Pas d'accŠs directe des tables %s" -#define MSG_NO_DMY_DIR_ACC "Pas d'accŠs direct aux tables virtuelles DUMMY" -#define MSG_NO_DOM_DELETE "D‚l‚tion Partielle non impl‚ment‚e pour les domaines" -#define MSG_NO_DOM_MATCH "ChaŒne %.8s... non touv‚e dans le domaine %s" -#define MSG_NO_EDITED_LANG "Coparm: Pas de langage en ‚dition" -#define MSG_NO_EXP_LINK "Liaison par expression invalide pour une table JCT" -#define MSG_NO_EXT_FILTER "Le filtrage ne peut se r‚f‚rer … une autre table" -#define MSG_NO_EXT_UPDATE "Pas de mise … jour en r‚f‚rence … une autre table" -#define MSG_NO_FEAT_SUPPORT "%s non support‚ dans cette version" -#define MSG_NO_FILE_LIST "La table %s n'a pas de liste de fichiers" -#define MSG_NO_FLD_FORMAT "Format absent pour le champs %d de %s" -#define MSG_NO_FORMAT_COL "Type COLUMN informattable" -#define MSG_NO_FORMAT_TYPE "Le format ne peut pas ˆtre d‚fini … partir du type %d" -#define MSG_NO_FULL_JOIN "Jointures autoris‚es seulement … ‚galit‚ sur cl‚(s)" -#define MSG_NO_FUL_OUT_JOIN "Jointures externes complŠtes non support‚es" -#define MSG_NO_FUNC_ORDER "Tri non support‚ sur ‚l‚ment fonctionnel" -#define MSG_NO_HEAD_JOIN "Jointure sur une table non en tˆte" -#define MSG_NO_HQL_CONV "Conversion en HQL non disponible" -#define MSG_NO_INDEX "La table %s n'a pas d'index" -#define MSG_NO_INDEX_GBX "Pas ou mauvais index pour SQLGBX" -#define MSG_NO_INDEX_IN "Pas d'index dans %s" -#define MSG_NO_INDEX_READ "Pas d'accŠs directe des tables multiples" -#define MSG_NO_INIT_LANG "Pas de langage initial" -#define MSG_NO_JOIN_TO_EXP "Jointure vers une expression impossible" -#define MSG_NO_JOIN_UPDEL "Pas de jointure avec Update/Delete" -#define MSG_NO_KEY_COL "Pas de colonne cl‚ trouv‚e" -#define MSG_NO_KEY_UPDATE "Le nom des cl‚s ne peut pas ˆtre modifi‚" -#define MSG_NO_LANGUAGE "Pas de langage op‚rationnel\n" -#define MSG_NO_LANG_TO_QUIT "Pas de langage … quitter" -#define MSG_NO_LISTVAL_HERE "LSTBLK: Liste de valeurs utilis‚e hors contexte" -#define MSG_NO_MAP_INSERT "MAP incompatible avec Insert" -#define MSG_NO_MATCHING_COL "Pas de colonne correspondant … %s dans %s" -#define MSG_NO_MATCH_COL "Colonne correspondante introuvable" -#define MSG_NO_MEMORY "M‚moire pleine" -#define MSG_NO_MEM_CORR_SUB "Subquery corr‚l‚e en m‚moire non encore impl‚ment‚e" -#define MSG_NO_MODE_PADDED "Mode non support‚ pour les fichiers 'padded'" -#define MSG_NO_MORE_COL "La colonne %s n'est plus dans la table pivot" -#define MSG_NO_MORE_LANG "Plus de langage, exit de %s\n" -#define MSG_NO_MORE_VAR "Les fichiers VAR ne sont plus support‚s" -#define MSG_NO_MULCOL_JOIN "Jointure vers un index multi-colonne pas encore possible" -#define MSG_NO_MULT_HAVING "Clauses Having multiples non impl‚ment‚es" -#define MSG_NO_MUL_DIR_ACC "AccŠs direct des tables multiples pas encore impl‚ment‚" -#define MSG_NO_MUL_VCT "Les tables VCT ne peuvent pas ˆtre multiples" -#define MSG_NO_MYSQL_CONN "Aucune connexion MySQL ouverte" -#define MSG_NO_MYSQL_DELETE "Pas de Delete pour les tables MySQL" -#define MSG_NO_NBCOL "Pas de NBcol" -#define MSG_NO_NBLIN "Pas de NBlin, MaxSize ou Continued" -#define MSG_NO_NBLIN_CONT "Fetch: Pas de NBlin ou Continued" -#define MSG_NO_NULL_CONST "Les constantes ne sont pas prises en charge" -#define MSG_NO_ODBC_COL "Colonnes ODBC automatiques non support‚es par cette version" -#define MSG_NO_ODBC_DELETE "Delete ne devrait pas ˆtre appel‚ pour les tables ODBC" -#define MSG_NO_ODBC_DIRECT "AccŠs directe des tables ODBC non encore impl‚ment‚" -#define MSG_NO_ODBC_MUL "Multiple(2) non support‚ pour les tables ODBC" -#define MSG_NO_ODBC_SPECOL "Pas de colonne sp‚ciale ODBC" -#define MSG_NO_OPT_COLUMN "Pas optimisable ou pas de colonne optimis‚es" -#define MSG_NO_OP_MODIF "Les modificateurs ne s'appliquent pas … %s" -#define MSG_NO_PARAMETER "Pas de paramŠtre" -#define MSG_NO_PART_DEL "Delete partiel des fichier %s impossible" -#define MSG_NO_PART_MAP "Mapping partiel non impl‚ment‚ pour cet OS" -#define MSG_NO_PAR_BLK_INS "Insertion de bloc partiel impossible" -#define MSG_NO_PIV_DIR_ACC "Pas d'accŠs directe aux tables PIVOT" -#define MSG_NO_POS_ADDED "Pos_code non ajout‚" -#define MSG_NO_PROMPTING "Relance impossible pour les tables distribu‚es" -#define MSG_NO_QRY_DELETE "Delete n'est pas utilisable pour les views QRY" -#define MSG_NO_QUERY_ARRAY "Tableaux avec QUERY non encore impl‚ment‚s" -#define MSG_NO_RCUR_DSK_YET "Usage r‚cursif de DISK non encore implement‚" -#define MSG_NO_READ_32 "Lecture de 32 octets impossible" -#define MSG_NO_RECOV_SPACE "Espace non recouvrable dans le fichier index" -#define MSG_NO_REF_DELETE "Pas de suppression en r‚f‚rence … une autre table" -#define MSG_NO_REF_UPDATE "Pas de mise … jour en r‚f‚rence … une autre table" -#define MSG_NO_REMOTE_FNC "Certaines fonctions ne peuvent pas ˆtre ex‚cut‚es … distance" -#define MSG_NO_ROWID_FOR_AM "AccŠs direct impossible de ROWID pour les tables de type %s" -#define MSG_NO_ROW_NODE "Le nom du Rownode n'est pas d‚fini" -#define MSG_NO_SECTION_NAME "Nom de section manquant" -#define MSG_NO_SEC_UPDATE "Les noms de section ne peuvent pas ˆtre modifi‚s" -#define MSG_NO_SELECTED_DB "Aucune base de donn‚es s‚lect‚e" -#define MSG_NO_SELF_PIVOT "Une table ne peut se pivoter elle-mˆme !" -#define MSG_NO_SERVER_FOUND "Serveur introuvable" -#define MSG_NO_SETPOS_YET "SetPos pas encore impl‚ment‚ pour les fichier %s" -#define MSG_NO_SFEXIT_UNIX "Fonction %s non disponible sur Unix" -#define MSG_NO_SOURCE " (pas de source)" -#define MSG_NO_SPEC_COL "Pas de colonne sp‚ciales MYSQL" -#define MSG_NO_SQL_DELETE "Delete n'est pas utilisable actuellement pour les views SQL" -#define MSG_NO_SUB_VAL "Pas de sous-value d'un tableau de type %d" -#define MSG_NO_SUCH_INDEX "La table %s n'a pas l'index %s" -#define MSG_NO_SUCH_SERVER "Serveur %s introuvable" -#define MSG_NO_SUCH_TABLE "Table %s pas dans la base de donn‚es" -#define MSG_NO_TABCOL_DATA "Pas de donn‚es pour la table %s colonne %s" -#define MSG_NO_TABLE_COL "Aucune colonne trouv‚e pour %s" -#define MSG_NO_TABLE_DEL "Delete non autoris‚ pour les tables %s " -#define MSG_NO_TABLE_DESC "Pas de bloc descriptif de table" -#define MSG_NO_TABLE_INDEX "La table %s n'a pas d'index" -#define MSG_NO_TABLE_LIST "Pas de liste de tables" -#define MSG_NO_TAB_DATA "Pas de donn‚es pour la table %s" -#define MSG_NO_TERM_IN_TOK "Les non-terminaux ne sont pas utilisables dans les rŠgles de Token" -#define MSG_NO_TOKEN_DB "DB introuvable pour la colonne TOKEN %s" -#define MSG_NO_UNIX_CATINFO "Pas d'info catalogue sous Unix" -#define MSG_NO_UPDEL_JOIN "Pas de jointure de tables ODBC pour Update/Delete" -#define MSG_NO_VCT_DELETE "D‚l‚tion Partielle non impl‚ment‚e pour les fichiers VCT" -#define MSG_NO_VIEW_COLDEF "Colonne d‚finition impossible pour les views" -#define MSG_NO_VIEW_SORT "La View fonctionnelle %s ne peut pas ˆtre tri‚e ou jointe" -#define MSG_NO_ZIP_DELETE "Delete sur fichier Zip non encore implement‚" -#define MSG_NO_ZIP_DIR_ACC "AccŠs directe des tables ZDOS non encore implement‚" -#define MSG_NULL_COL_VALUE "La colonne n'a pas de valeur" -#define MSG_NULL_ENTRY "InitLang, entr‚e nulle %d %s" -#define MSG_NULL_QUERY "Requˆte vide" -#define MSG_NUMVAL_NOMATCH "Disparit‚ de Numval pour %s" -#define MSG_N_FULL_PARSES "%d significations" -#define MSG_ODBC_READ_ONLY "ODBC est actuellement en lecture seulement" -#define MSG_OFFSET_NOT_SUPP "Offset non support‚ pour ce type de sous requˆte" -#define MSG_ONE_LANG_YET "Un langage est d‚j… en ‚dition" -#define MSG_ONE_PARAM_ONLY "Un seul paramŠtre autoris‚" -#define MSG_ONLY_LOG10_IMPL "Seul Log10 est implement‚" -#define MSG_ON_LANGUAGE "Langage %.8s version %d niveau %d ‚ditable" -#define MSG_OPENING "Ouverture" -#define MSG_OPENING_QUERY "Ouverture de la requˆte" -#define MSG_OPEN_EMPTY_FILE "Ouverture du fichier vide %s: %s" -#define MSG_OPEN_ERROR "Erreur d'ouverture %d en mode %d sur %s: " -#define MSG_OPEN_ERROR_IS "Erreur … l'ouverture de %s: %s" -#define MSG_OPEN_ERROR_ON "Erreur d'ouverture sur %s" -#define MSG_OPEN_MODE_ERROR "Erreur d'ouverture(%s) %d sur %s" -#define MSG_OPEN_SORT_ERROR "Erreur logique de tri dans QUERY Open" -#define MSG_OPEN_STRERROR "Erreur … l'ouverture: %s" -#define MSG_OPEN_W_ERROR "Erreur … l'ouverture de %s en ‚criture" -#define MSG_OPTBLK_RD_ERR "Erreur … la lecture d'un bloc optimisation: %s" -#define MSG_OPTBLK_WR_ERR "Erreur … l'‚criture d'un bloc optimisation: %s" -#define MSG_OPTIMIZING "Optimisation de " -#define MSG_OPT_BMAP_RD_ERR "Erreur en lecture des bitmaps d'optimisation: %s" -#define MSG_OPT_BMAP_WR_ERR "Erreur en ‚criture des bitmaps d'optimisation: %s" -#define MSG_OPT_CANCELLED "Optimisation interrompue par l'utilisateur" -#define MSG_OPT_DVAL_RD_ERR "Erreur en lecture des valeurs distinctes: %s" -#define MSG_OPT_DVAL_WR_ERR "Erreur en ‚criture des valeurs distinctes: %s" -#define MSG_OPT_HEAD_RD_ERR "Erreur en lecture de l'entˆte du fichier opt: %s" -#define MSG_OPT_HEAD_WR_ERR "Erreur en ‚criture de l'entˆte du fichier opt: %s" -#define MSG_OPT_INIT "Optimisation initialis‚e" -#define MSG_OPT_LOGIC_ERR "Erreur logique dans SetBitmap, i=%d" -#define MSG_OPT_MAX_RD_ERR "Erreur en lecture des valeurs maxi: %s" -#define MSG_OPT_MAX_WR_ERR "Erreur en ‚criture des valeurs maxi: %s" -#define MSG_OPT_MIN_RD_ERR "Erreur en lecture des valeurs mini: %s" -#define MSG_OPT_MIN_WR_ERR "Erreur en ‚criture des valeurs mini: %s" -#define MSG_OPT_NOT_MATCH "Le fichier opt %s n'est pas … jour" -#define MSG_OP_RES_TOO_LONG "R‚sultat trop long pour l'op‚rateur=%d" -#define MSG_ORDER_OUT_RANGE "Tri: Order %d hors limite" -#define MSG_ORDER_TWICE "Un mˆme ‚l‚ment est tri‚ deux fois" -#define MSG_PAGE_ERROR "Erreur de pagination" -#define MSG_PARM_CNT_MISS "Disparit‚ du nombre de ParamŠtres" -#define MSG_PARSE_NULL_SEM "S‚mantique nulle" -#define MSG_PARSING_QUERY "Analyse de la requˆte" -#define MSG_PIX_ERROR "Pix %s erreur rŠgle no=%u\n" -#define MSG_PIX_TEST_ERROR "RŠgle=%u: pix-TEST pas dans le premier noeud\n" -#define MSG_PLG_READ_ONLY "PLG est actuellement en lecture seulement" -#define MSG_PLM_NULL_SFP "TABPLM ReadDB: Sfp est NULL" -#define MSG_PLUG_NOT_INIT "Plug n'est pas initialis‚\n" -#define MSG_PLUG_NOT_RUN "Plug n'est pas en marche" -#define MSG_PNODE_RULE "(Noeud %d rŠgle %d) " -#define MSG_POS_TOO_LONG "%s trop long (>%d)" -#define MSG_PREC_VBLP_NULL "ARRAY SetPrecision: Vblp est NULL" -#define MSG_PRIV_INSTR "Instruction privil‚gi‚e" -#define MSG_PROCADD_ERROR "Erreur %d sur l'adresse de %s" -#define MSG_PROCESS_SUBQRY "Sub-Query en cours de traitement" -#define MSG_PROC_WOULD_LOOP "Bouclage du traitement (maxres=%d maxlin=%d)" -#define MSG_PROGRESS_INFO "Informations sur le traitement en cours" -#define MSG_PROMPT_CANCEL "Relance annul‚e" -#define MSG_PROMPT_NIY "Prompt non impl‚ment‚ pour cette configuration" -#define MSG_PTR_NOT_FOUND "Pointeur introuvable Num=%d ti1=%d" -#define MSG_PXDEF_IS_NULL "Pxdef est NULL" -#define MSG_QRY_READ_ONLY "Les views QRY sont en lecture seulement" -#define MSG_QUERY_CANCELLED "Requˆte interrompue par l'utilisateur" -#define MSG_QUERY_NOT_EXEC "Requˆte non ex‚cut‚e" -#define MSG_QUERY_SAVED "Requˆte %s sauvegard‚e" -#define MSG_QUOTE_IN_QUOTE "Appostrophe dans un champ entre appostrophe ligne %d" -#define MSG_RANGE_NIY "Range pas encore impl‚ment‚ pour %s" -#define MSG_RANGE_NO_JOIN "Range non compatible avec les index de jointure" -#define MSG_RC_READING "rc=%d en lecture de la table %s" -#define MSG_READB_BAD_INIT "%s ReadDB appel‚ avec Init=0" -#define MSG_READCOL_ERROR "SQLCOL: erreur dans ReadColumn" -#define MSG_READING "Lecture" -#define MSG_READING_FROM "Lecture de %s" -#define MSG_READING_RECORD "Erreur en lecture de l'enregistrement %d de %s" -#define MSG_READY "Prˆt" -#define MSG_READ_ERROR "Erreur en lecture sur %s: %s" -#define MSG_READ_ERROR_RC "Erreur en lecture, rc=%d" -#define MSG_READ_MEM_ERROR "Lecture m‚moire %d: taille=%d" -#define MSG_READ_ONLY "Cette table prot‚g‚e en lecture seule ne peut ˆtre modifi‚e" -#define MSG_READ_SEEK_ERROR "Erreur de recherche en lecture: %s" -#define MSG_READ_SEG_ERROR "Lecture segment %d: taille=%d" -#define MSG_RECEIVED "Re‡u %c\n" -#define MSG_RECORD_ERROR "Erreur … la lecture de l'enregistrement %d de %s" -#define MSG_RECORD_NO_SEP "Enregistrement sans s‚parateur" -#define MSG_REC_SKIPPED " (%d lignes erronn‚es saut‚es par l'option MaxErr)" -#define MSG_REDUCE_INDEX "Réduction de l'index" -#define MSG_REGISTER_ERR "Enregistrement NS impossible, pr‚fix='%s' et href='%s'" -#define MSG_REMOTE_CONN_ERR "La connection ‚loign‚e a ‚chou‚" -#define MSG_REMOVE_ERROR "Erreur en supprimant %s: %s" -#define MSG_REMOVE_NOT_IMPL "Remove non impl‚ment‚ pour TDB non Table" -#define MSG_RENAME_ERROR "Erreur renommant %s en %s: %s" -#define MSG_RENUM_RULES "Renum‚rotez les rŠgles et r‚entrez ADD (rŠgle sauvegard‚e dans la zone tampon)" -#define MSG_REORDER_INDEX "Reclassement de l'index" -#define MSG_REQU_ARG_NUM "La fonction %s doit avoir %d arguments" -#define MSG_RESET_TO "%s remis … %d" -#define MSG_RES_NOT_UNIQUE "Le r‚sultat n'est pas unique" -#define MSG_RET_FROM_LANG "Retour au language %s version %d.%d du language %s version %d.%d" -#define MSG_ROWID_NOT_IMPL "RowNumber non impl‚ment‚ pour les tables de type %s" -#define MSG_ROWS_SELECTED "%d lignes s‚lectionn‚es en %.2lf sec" -#define MSG_ROWS_TRUNCATED " (tronqu‚ par MAXRES, LIMIT, FREQ ou AreaSize)" -#define MSG_ROW_ARGNB_ERR "ROW: disparit‚ du nombre d'arguments (%d,%d)" -#define MSG_RPC_SERVER_ERR "Erreur logique dans TABMUL::MakeCol" -#define MSG_RSC_ALLOC_ERROR "Erreur d'allocation m‚moire dans Rescol %s" -#define MSG_RULE_ENTERED "RŠgle %d entr‚e" -#define MSG_RULE_SUBSET_ERR "Erreur d'initialisation de la zone RŠgles" -#define MSG_SAVING_INDEX "Sauvegarde du fichier index" -#define MSG_SCAN_NOT_IMP "Scan non impl‚ment‚" -#define MSG_SEC_KEY_FIRST "Les sections et cl‚s doivent ˆtre ins‚r‚es en premier" -#define MSG_SEC_NAME_FIRST "Le nom de section doit ˆtre en tˆte de liste en insertion" -#define MSG_SEC_NOT_FOUND "Section %s absente de %s" -#define MSG_SEEK_ERROR "Seek erreur dans CopyHeader" -#define MSG_SEMANTIC_TREE "Arbre s‚mantique" -#define MSG_SEM_BAD_REF "Sem @%d r‚f‚rence un argument de type non 0 ou 1" -#define MSG_SEM_UNKNOWN "inconnue, rc=%d" -#define MSG_SEP_IN_FIELD "Le champ %d contient le caractŠre s‚parateur" -#define MSG_SEQUENCE_ERROR "HSTMT: Allocation hors s‚quence" -#define MSG_SETEOF_ERROR "Erreur %d dans SetEndOfFile" -#define MSG_SETRECPOS_NIY "SetRecpos non impl‚ment‚ pour ce type de table" -#define MSG_SET_LOCALE "Locale fix‚e … %s" -#define MSG_SET_NULL_DOM "Valeur %d donn‚e … un domaine nul" -#define MSG_SET_OP_NOT_IMPL "Op‚rateurs ensemblistes non impl‚ment‚s" -#define MSG_SET_STR_TRUNC "SetValue: ChaŒne de caractŠres tronqu‚e" -#define MSG_SEVERAL_TREES "Jointure non sp‚cifi‚e pour certaines tables" -#define MSG_SFP_ERROR "Erreur sur SetFilePointer: %s" -#define MSG_SFUNC_NOT_IMPL "Fonction scalaire %s non impl‚ment‚e" -#define MSG_SHARED_LIB_ERR "Erreur au chargement de la librairie partag‚e %s: %s" -#define MSG_SINGLE_STEP "Pas … pas" -#define MSG_SLEEP "J'ai dormi %d milliseconds" -#define MSG_SMART_SORTING "R‚cup‚ration des lignes tri‚es (passage %d de %d)" -#define MSG_SMART_SORT_ERR "Erreur logique 1 dans Smart Sort" -#define MSG_SORTING "Tri en cours" -#define MSG_SORTING_INDEX "Tri de l'index" -#define MSG_SORTING_VAL "Tri de %d valeurs" -#define MSG_SORT_JOIN_INDEX "Tri de l'index de jointure" -#define MSG_SPCOL_READONLY "La colonne sp‚ciale %s est en lecture seulement" -#define MSG_SPEC_CMD_SEP "Les commandes sp‚ciales doivent ˆtre ex‚cut‚es s‚par‚ment" -#define MSG_SQL_BAD_TYPE "RephraseSQL: type %d non support‚" -#define MSG_SQL_BLOCK_MISM "CheckColumn: bloc SQL courant non correspondant" -#define MSG_SQL_CONF_ERROR "Erreur SQL: SQL_CONFORMANCE" -#define MSG_SQL_READ_ONLY "Les views SQL sont actuellement en lecture seulement" -#define MSG_SRCH_CLOSE_ERR "Erreur … la fermeture de l'Handle de recherche" -#define MSG_SRC_TABLE_UNDEF "La table source n'est pas d‚finie" -#define MSG_STACK_ERROR "Erreur sur la pile, i=%d\n" -#define MSG_STACK_OVERFLOW "Parser: D‚bordement de la pile\n" -#define MSG_STRG_NOT_FOUND "ChaŒne introuvable" -#define MSG_STRING_INV_LIST "Liste invalide pour SemString" -#define MSG_STRING_TOO_BIG "ChaŒne trop grande pour le domaine %s" -#define MSG_SUBALLOC_ERROR "Pas assez de m‚moire en zone %p pour allouer %d (utilis‚=%d libre=%d)" -#define MSG_SUBAL_HUGE_ERR "Pas assez de m‚moire en zone huge %p pour allouer %d" -#define MSG_SUBARG_NOSEM "Argument @ ou sous-phrase de niveau %d pointe sur un noeud sans Sem" -#define MSG_SUBARG_OUTRANGE "Argument @ ou sous-phrase de niveau %d hors limite" -#define MSG_SUBQRY_ONEITEM "Une Sub-Query ne doit avoir qu'une s‚lection" -#define MSG_SUBSET_ERROR "SubSet erreur dans LoadDB" -#define MSG_SUB_OPEN_YET "Subquery d‚j… ouverte" -#define MSG_SUB_RES_TOO_LNG "R‚sultat trop long pour SUBSTR" -#define MSG_SYNTAX_ERROR "Erreur de syntaxe" -#define MSG_SYSTEM_ERROR "Erreur systŠme %d" -#define MSG_S_ACCESS_DENIED "%s: accŠs non autoris‚" -#define MSG_S_ERROR "%s erreur" -#define MSG_S_ERROR_NUM "%s: erreur=%d" -#define MSG_S_INTRUPT_ERROR "%s: erreur interruption" -#define MSG_S_INVALID_PARM "%s: paramŠtre invalide" -#define MSG_S_INV_ADDRESS "%s: adresse invalide" -#define MSG_S_UNKNOWN_ERROR "%s: erreur de code %u inconnu" -#define MSG_TABDIR_READONLY "Les tables DIR sont en lecture seulement" -#define MSG_TABLE_ALREADY "La table %s existe d‚j…" -#define MSG_TABLE_ALTERED "Table %s %s alt‚r‚e" -#define MSG_TABLE_CREATED "%s table %s cr‚‚e" -#define MSG_TABLE_DROPPED "Table %s supprim‚e" -#define MSG_TABLE_MULT_JOIN "Utilisation multiple de la table %s pour jointure" -#define MSG_TABLE_NOT_IN_DB "La table %s n'existe pas dans %s" -#define MSG_TABLE_NOT_OPT "Table non optimisable" -#define MSG_TABLE_NO_INDEX "La table %s n'est pas indexable" -#define MSG_TABLE_NO_OPT "La table %s n'existe pas ou de type non optimisable" -#define MSG_TABLE_READ_ONLY "Les tables %s sont en lecture seulement " -#define MSG_TABMUL_READONLY "Les tables multiples sont en lecture seulement" -#define MSG_TAB_NOT_LOADED " (certaines tables n'ont put ˆtre charg‚es)" -#define MSG_TAB_NOT_SPEC "Table non specifi‚e" -#define MSG_TB_VW_NOTIN_DB "Table ou view %s pas dans la base de donn‚es" -#define MSG_TDB_NXT_NOT_NUL "Tdb.Next non NULL" -#define MSG_TDB_USE_ERROR "Erreur, Tdbp->Use=%d" -#define MSG_TOO_MANY_COLS "Trop de colonnes" -#define MSG_TOO_MANY_COLTAB "Trop de colonnes dans %s (%d)" -#define MSG_TOO_MANY_FIELDS "Trop de champs ligne %d de %s" -#define MSG_TOO_MANY_JUMPS "Trop de niveaux de saut" -#define MSG_TOO_MANY_KEYS "Trop de cl‚s (%d)" -#define MSG_TOO_MANY_POS "Trop de pos_codes" -#define MSG_TOO_MANY_TABLES "Trop de tables (%d)" -#define MSG_TOPSEM_ERROR "Erreur inconnue dans TopSem" -#define MSG_TO_BLK_IS_NULL "To Blk est nul" -#define MSG_TO_FTR_NOT_NULL "Set.To_Ftr n'est pas nul" -#define MSG_TO_PIX_NOT_NULL "Set.To_Pix n'est pas nul" -#define MSG_TO_SEM_NOT_NULL "Set.To_Sem n'est pas nul" -#define MSG_TRUNCATE_ERROR "Erreur en troncation: %s" -#define MSG_TRUNC_BY_ESTIM "Tronqu‚ par l'option Estimate" -#define MSG_TYPES_ERROR "Erreur sur Types(%d)" -#define MSG_TYPE_CONV_ERROR "Type non convertible dans une expression" -#define MSG_TYPE_DEF_MISM "Disparit‚ entre type et d‚finition" -#define MSG_TYPE_MISMATCH "Cl‚ et source ne sont pas du mˆme type" -#define MSG_TYPE_RECFM_MISM "Disparit‚ entre Type et Recfm" -#define MSG_TYPE_TO_VERIFY "Type … v‚rifier: %d" -#define MSG_TYPE_VALUE_ERR "Colonne %s: disparit‚ type(%s)/valeur(%s)" -#define MSG_UNBALANCE_QUOTE "Appostrophe en trop ligne %d" -#define MSG_UNDEFINED_AM "COLBLK %s: m‚thode d'accŠs ind‚finie" -#define MSG_UNDEFINED_PATH "Chemin d'accŠs ind‚fini pour Plgcnx.ini" -#define MSG_UNDEF_COL_COUNT "Count sur colonne non d‚finie" -#define MSG_UNKNOWN_DOMAIN "Domaine inconnu %s" -#define MSG_UNKNOWN_ERROR "Erreur inconnue" -#define MSG_UNKNOWN_EXCPT "Exception non r‚pertori‚e" -#define MSG_UNKNOWN_NAME "Nom inconnu: %.8s" -#define MSG_UNKNOWN_PATH "Chemin d'accŠs inconnu pour Plgcnx.ini" -#define MSG_UNKNOWN_POS "Nom pos_code inconnu: %s" -#define MSG_UNKNOWN_SEM "Sem %.8s inconnue, rc=%d" -#define MSG_UNKNOWN_SYNONYM "Synonyme inconnu" -#define MSG_UNKNW_QRY_TYPE "ReadDB: type de requˆte inconnu" -#define MSG_UNKN_ERR_CODE "Erreur de code %d inconnu" -#define MSG_UNLOADABLE " inchargeable: " -#define MSG_UNLOADABLE_PRM "%s inchargeable: %s" -#define MSG_UNMATCH_FIL_ARG "Argument de filtre d‚pareill‚" -#define MSG_UNQ_COL_SEV_TAB "La colonne %s non qualifi‚e est dans plusieurs tables" -#define MSG_UNRESOLVED_ARG "?Argument manquant: %s non r‚solu en %d ligne %d" -#define MSG_UPDATE_ERROR "Erreur en Update sur %s" -#define MSG_UPDATING_ROWS "Mise … jour des lignes" -#define MSG_UPD_ZIP_NOT_IMP "Mise … jour des tables ZDOS non encore implement‚" -#define MSG_UP_LANGUAGE "Bloc langage %.8s version %d niveau %d charg‚" -#define MSG_USED_FREE_MEM "Sarea: utilis‚ %d, libre %d" -#define MSG_USETEMP_IS "Usetemp est : %s" -#define MSG_USETEMP_RESET ". Usetemp remis … Auto" -#define MSG_USETEMP_SET "Usetemp fix‚ … %s" -#define MSG_USE_NO_MATCH "Use non correspondant : Use=%d, ti2=%d, ti3=%d" -#define MSG_USING_INDEX " (Index‚ par" -#define MSG_VALIST_MISMATCH "Disparit‚ des listes de valeurs" -#define MSG_VALSTR_TOO_LONG "Valeur %s trop longue pour une chaŒne de longueur %d" -#define MSG_VALTYPE_NOMATCH "Disparit‚ types de valeur" -#define MSG_VALUE_ERROR "Colonne %s: bloc valeur nul" -#define MSG_VALUE_NOT_ALLOC "Valeur non allou‚e pour la colonne R%d %s" -#define MSG_VALUE_TOO_BIG "Valeur %lld trop grande pour la colonne %s" -#define MSG_VALUE_TOO_LONG "Valeur %s trop longue pour la colonne %s de longueur %d" -#define MSG_VAL_ALLOC_ERR "Allocation impossible du noeud valeur" -#define MSG_VAL_TOO_LONG "Valeur %s trop longue pour le champ %s" -#define MSG_VIEW_ALREADY "La VIEW %s existe d‚j…" -#define MSG_VIEW_CREATED "%s view %s cr‚‚e" -#define MSG_VIEW_DROPPED "View %s supprim‚e" -#define MSG_VIEW_NOT_IN_DB "%s n'est pas une View de %s" -#define MSG_VIR_NO_DELETE "Delete impossible sur les tables %s" -#define MSG_VIR_READ_ONLY "Les tables virtuelles %s sont en lecture seulement" -#define MSG_VM_LANG "Langage au format VM, non support‚" -#define MSG_VOID_FIRST_ARG "Le premier argument ne doit pas ˆtre vide" -#define MSG_VOID_IN_STRING "Erreur: chaŒne IN vide" -#define MSG_VOID_ORDER_LIST "Liste de tri vide, erreur systŠme ?" -#define MSG_VOID_POS_DICT "Dictionnaire interne du langage vide" -#define MSG_VOID_QUERY "Requˆte vide %s" -#define MSG_WORK_AREA "Espace de travail: %s" -#define MSG_WORK_TOO_SMALL "Zone de travail trop petite, accroŒtre AreaSize" -#define MSG_WRITE_ERROR "Erreur … l'‚criture de %s" -#define MSG_WRITE_SEEK_ERR "Erreur de recherche en ‚criture: %s" -#define MSG_WRITE_STRERROR "Erreur en ‚criture sur %s: %s" -#define MSG_WRITING "Ecriture" -#define MSG_WRITING_ERROR "Erreur … l'‚criture de %s: %s" -#define MSG_WRITING_QUERY "Erreur … l'‚criture de la requˆte: " -#define MSG_WRONG_ARG_NUM "La fonction %s ne prend pas %d arguments" -#define MSG_WRONG_COL_NUM "Num‚ro de colonne %d trop grand pour %s" -#define MSG_WRONG_DB_LIST "Liste des bases de donn‚es incorrecte ou vide" -#define MSG_WRONG_FUNCTION "Mauvaise fonction %d" -#define MSG_WRONG_OP_PARM "Mauvais op‚rateur ou paramŠtres pour %s" -#define MSG_WRONG_PARMS "Mauvais paramŠtres pour %s" -#define MSG_WRONG_PASSWORD "Mot de passe ill‚gal pour %s" -#define MSG_WRONG_TYPE "type non support‚" -#define MSG_WRONG_USERFILE "La Userfile a une mauvaise taille %d" -#define MSG_WS_CONV_ERR "Erreur de convertion de %s en WS" -#define MSG_XCOL_MISMATCH "La colonne %s ne correspond pas … l'index" -#define MSG_XDB_DEL_ERROR "Erreur en supprimant des entr‚es du fichier XDB" -#define MSG_XFILE_READERR "Erreur %d en lisant le fichier index" -#define MSG_XFILE_TOO_SMALL "Le fichier index est plus petit que la taille de l'index" -#define MSG_XFILE_WRITERR "Erreur en ‚crivant le fichier index: %s" -#define MSG_XMLTAB_INIT_ERR "Erreur d'initialisation de la table XML" -#define MSG_XML_INIT_ERROR "Erreur d'initialisation du nouveau fichier XML" -#define MSG_XPATH_CNTX_ERR "Le nouveau contexte XPath ne peut ˆtre cr‚‚" -#define MSG_XPATH_EVAL_ERR "Impossible d'‚valuer l'emplacement xpath '%s'" -#define MSG_XPATH_NOT_SUPP "Xpath non support‚ colonne %s" -#define MSG_X_ARG_ADDED "%d arguments ajout‚s" -#define MSG_X_ARG_SET "%d arguments ont ‚t‚ initialis‚s" -#define MSG_X_ON_TAB " %s sur %s(" -#define MSG_ZERO_DIVIDE "Division par z‚ro dans une expression" diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 0e91742b1fa..7479c898bfe 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -540,11 +540,7 @@ extern "C" const char *msglang(void) #else // !XMSG && !NEWMSG extern "C" const char *msglang(void) { -#if defined(FRENCH) - return "french"; -#else // DEFAULT return "english"; -#endif // DEFAULT } // end of msglang #endif // !XMSG && !NEWMSG diff --git a/storage/connect/messages.h b/storage/connect/messages.h index b55ec39b235..91e04f3d472 100644 --- a/storage/connect/messages.h +++ b/storage/connect/messages.h @@ -1,13 +1,5 @@ /**************************************************************************/ /* NLS messsages definition. */ /**************************************************************************/ -#if defined(FRENCH) -#if defined(CPX) -#include "frmsg1.h" -#else /* not CPX */ -#include "frmsg2.h" -#endif /* CPX */ -#else /* not FRENCH */ #include "engmsg.h" -#endif /* FRENCH */ /* ---------------------------------------------------------------------- */ diff --git a/storage/connect/plgdbsem.h b/storage/connect/plgdbsem.h index 370bf69ffa0..4371f90a21d 100644 --- a/storage/connect/plgdbsem.h +++ b/storage/connect/plgdbsem.h @@ -14,11 +14,7 @@ /***********************************************************************/ /* DB Constant definitions. */ /***********************************************************************/ -#if defined(FRENCH) -#define DEFAULT_LOCALE "French" -#else // !FRENCH #define DEFAULT_LOCALE "English" -#endif // !FRENCH #define DOS_MAX_PATH 144 /* Must be the same across systems */ #define DOS_BUFF_LEN 100 /* Number of lines in binary file buffer */ diff --git a/storage/connect/rcmsg.c b/storage/connect/rcmsg.c index 4cd443d88bb..e2fd08ba866 100644 --- a/storage/connect/rcmsg.c +++ b/storage/connect/rcmsg.c @@ -32,17 +32,6 @@ const char *GetMsgid(int id) const char *p = NULL; // This conditional until a real fix is found for MDEV-7304 -#if defined(FRENCH) - if (!stricmp(msglang(), "french")) - switch (id) { -#include "frids.h" -#if defined(NEWMSG) -#include "frcas.h" -#endif // NEWMSG - } // endswitch(id) - - else // English -#endif // FRENCH switch (id) { #include "enids.h" #if defined(NEWMSG) From 1db4fc543bba0cadbdcecdd82a6584875559a667 Mon Sep 17 00:00:00 2001 From: anson1014 <56494179+anson1014@users.noreply.github.com> Date: Tue, 30 Aug 2022 04:21:40 -0400 Subject: [PATCH 029/171] Ensure that source files contain only valid UTF8 encodings (#2188) Modern software (including text editors, static analysis software, and web-based code review interfaces) often requires source code files to be interpretable via a consistent character encoding, with UTF-8 or ASCII (a strict subset of UTF-8) as the default. Several of the MariaDB source files contain bytes that are not valid in either the UTF-8 or ASCII encodings, but instead represent strings encoded in the ISO-8859-1/Latin-1 or ISO-8859-2/Latin-2 encodings. These inconsistent encodings may prevent software from correctly presenting or processing such files. Converting all source files to valid UTF8 characters will ensure correct handling. Comments written in Czech were replaced with lightly-corrected translations from Google Translate. Additionally, comments describing the proper handling of special characters were changed so that the comments are now purely UTF8. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc. Co-authored-by: Andrew Hutchings --- mysys/my_win_popen.cc | 2 +- storage/connect/domdoc.cpp | 1 - strings/ctype-czech.c | 69 ++++++++++++-------------------------- strings/ctype-latin1.c | 16 ++++----- 4 files changed, 31 insertions(+), 57 deletions(-) diff --git a/mysys/my_win_popen.cc b/mysys/my_win_popen.cc index f41f54100f1..cceb77e9019 100644 --- a/mysys/my_win_popen.cc +++ b/mysys/my_win_popen.cc @@ -92,7 +92,7 @@ extern "C" FILE *my_win_popen(const char *cmd, const char *mode) goto error; break; default: - /* Unknown mode, éxpected "r", "rt", "w", "wt" */ + /* Unknown mode, expected "r", "rt", "w", "wt" */ abort(); } if (!SetHandleInformation(parent_pipe_end, HANDLE_FLAG_INHERIT, 0)) diff --git a/storage/connect/domdoc.cpp b/storage/connect/domdoc.cpp index 7d5b87a2640..268ad771ef9 100644 --- a/storage/connect/domdoc.cpp +++ b/storage/connect/domdoc.cpp @@ -642,7 +642,6 @@ bool DOMNODELIST::DropItem(PGLOBAL g, int n) if (Listp == NULL || Listp->length < n) return true; -//Listp->item[n] = NULL; La propriété n'a pas de méthode 'set' return false; } // end of DeleteItem diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 33d43d4dd4e..cb5205f315e 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -23,13 +23,13 @@ solution was needed than the one-to-one conversion table. To note a few, here is an example of a Czech sorting sequence: - co < hlaska < hláska < hlava < chlapec < krtek + co < hlaska < hláska < hlava < chlapec < krtek It because some of the rules are: double char 'ch' is sorted - between 'h' and 'i'. Accented character 'á' (a with acute) is + between 'h' and 'i'. Accented character 'á' (a with acute) is sorted after 'a' and before 'b', but only if the word is otherwise the same. However, because 's' is sorted before 'v' - in hlava, the accentness of 'á' is overridden. There are many + in hlava, the accentness of 'á' is overridden. There are many more rules. This file defines functions my_strxfrm and my_strcoll for @@ -42,8 +42,9 @@ passes, that's why we need four times more space for expanded string. - This file also contains the ISO-Latin-2 definitions of - characters. + The non-ASCII literal strings in this file are encoded + in the iso-8859-2 / latin-2 character set + (https://en.wikipedia.org/wiki/ISO/IEC_8859-2) Author: (c) 1997--1998 Jan Pazdziora, adelton@fi.muni.cz Jan Pazdziora has a shared copyright for this code @@ -111,7 +112,7 @@ static const struct wordvalue doubles[] = { }; /* - Unformal description of the algorithm: + Informal description of the algorithm: We walk the string left to right. @@ -126,7 +127,7 @@ static const struct wordvalue doubles[] = { End of pass is marked with value 1 on the output. - For each character, we read it's value from the table. + For each character, we read its value from the table. If the value is ignore (0), we go straight to the next character. @@ -138,31 +139,6 @@ static const struct wordvalue doubles[] = { exists behind it, find its value. We append 0 to the end. ---- - Neformální popis algoritmu: - - Procházíme øetìzec zleva doprava. - - Konec øetìzce je pøedán buï jako parametr, nebo je to *p == 0. - Toto je o¹etøeno makrem IS_END. - - Pokud jsme do¹li na konec øetìzce pøi prùchodu 0, nejdeme na - zaèátek, ale na ulo¾enou pozici, proto¾e první a druhý prùchod - bì¾í souèasnì. - - Konec vstupu (prùchodu) oznaèíme na výstupu hodnotou 1. - - Pro ka¾dý znak øetìzce naèteme hodnotu z tøídící tabulky. - - Jde-li o hodnotu ignorovat (0), skoèíme ihned na dal¹í znak.. - - Jde-li o hodnotu konec slova (2) a je to prùchod 0 nebo 1, - pøeskoèíme v¹echny dal¹í 0 -- 2 a prohodíme prùchody. - - Jde-li o kompozitní znak (255), otestujeme, zda následuje - správný do dvojice, dohledáme správnou hodnotu. - - Na konci pøipojíme znak 0 */ #define ADD_TO_RESULT(dest, len, totlen, value) \ @@ -335,24 +311,23 @@ my_strnxfrm_czech(CHARSET_INFO *cs __attribute__((unused)), /* - Neformální popis algoritmu: + Informal description of the algorithm: - procházíme øetìzec zleva doprava - konec øetìzce poznáme podle *p == 0 - pokud jsme do¹li na konec øetìzce pøi prùchodu 0, nejdeme na - zaèátek, ale na ulo¾enou pozici, proto¾e první a druhý - prùchod bì¾í souèasnì - konec vstupu (prùchodu) oznaèíme na výstupu hodnotou 1 + we pass the chain from left to right + we know the end of the string by *p == 0 + if we reached the end of the string on transition 0, then we don't go to + start, but to the saved position, because the first and second + the passage runs concurrently + we mark the end of the input (transition) with the value 1 on the output - naèteme hodnotu z tøídící tabulky - jde-li o hodnotu ignorovat (0), skoèíme na dal¹í prùchod - jde-li o hodnotu konec slova (2) a je to prùchod 0 nebo 1, - pøeskoèíme v¹echny dal¹í 0 -- 2 a prohodíme - prùchody - jde-li o kompozitní znak (255), otestujeme, zda následuje - správný do dvojice, dohledáme správnou hodnotu + then we load the value from the sorting table + if the value is ignore (0), we jump to the next pass + if the value is the end of the word (2) and it is a 0 or 1 transition, + we skip all the other 0 -- 2 and switch transitions + if it is a composite character (255), we test whether it follows + correct to the pair, we find the correct value - na konci pøipojíme znak 0 + then we add the character 0 at the end */ diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index bcf1cc6c9f1..b6ffd0906c8 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -499,19 +499,19 @@ struct charset_info_st my_charset_latin1_nopad= * * The modern sort order is used, where: * - * 'ä' -> "ae" - * 'ö' -> "oe" - * 'ü' -> "ue" - * 'ß' -> "ss" + * 'ä' -> "ae" + * 'ö' -> "oe" + * 'ü' -> "ue" + * 'ß' -> "ss" */ /* * This is a simple latin1 mapping table, which maps all accented * characters to their non-accented equivalents. Note: in this - * table, 'ä' is mapped to 'A', 'ÿ' is mapped to 'Y', etc. - all + * table, 'ä' is mapped to 'A', 'ÿ' is mapped to 'Y', etc. - all * accented characters except the following are treated the same way. - * Ü, ü, Ö, ö, Ä, ä + * Ü, ü, Ö, ö, Ä, ä */ static const uchar sort_order_latin1_de[] = { @@ -577,7 +577,7 @@ static const uchar combo2map[]={ my_strnxfrm_latin_de() on both strings and compared the result strings. This means that: - Ä must also matches ÁE and Aè, because my_strxn_frm_latin_de() will convert + Ä must also matches ÃE and Aè, because my_strxn_frm_latin_de() will convert both to AE. The other option would be to not do any accent removal in @@ -703,7 +703,7 @@ void my_hash_sort_latin1_de(CHARSET_INFO *cs __attribute__((unused)), /* Remove end space. We have to do this to be able to compare - 'AE' and 'Ä' as identical + 'AE' and 'Ä' as identical */ end= skip_trailing_space(key, len); From f4ce1e487e752cf6c9b8a2bcbe195440cfdfcbbe Mon Sep 17 00:00:00 2001 From: Robin Newhouse Date: Sat, 18 Mar 2023 00:19:08 +0000 Subject: [PATCH 030/171] All-green GitLab CI in 10.4 branch Note to mergers: Do not merge this commit to 10.5+. An additional PR will be created for the 10.5 branch which is compatible with later branches. Include cppcheck and FlawFinder for SAST scanning. From 10.6, cherry-picked 12bf5c46 (Remove unused French translations in Connect engine) and c6072ed9 (Ensure that source files contain only valid UTF8 encodings). Necessary for FlawFinder to execute and useful anyway. Removing MSAN build and test as it was not introduced until 10.5 and does not successfully build. Remove failing upgrade test since Fedora installs MariaDB 10.5 and the 10.5->10.4 upgrade rightfully complains Add to skiplist failing test: main.func_math (MDEV-20966) All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc. --- .gitlab-ci.yml | 125 ++-- tests/code_quality/cppcheck_ignorelist.txt | 251 +++++++ tests/code_quality/flawfinder_ignorelist.json | 622 ++++++++++++++++++ 3 files changed, 938 insertions(+), 60 deletions(-) create mode 100644 tests/code_quality/cppcheck_ignorelist.txt create mode 100644 tests/code_quality/flawfinder_ignorelist.json diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 39dae0facb8..14bd3eb2bec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,6 +27,7 @@ stages: - build - test - Salsa-CI + - sast default: # Base image for builds and tests unless otherwise defined @@ -42,7 +43,7 @@ variables: CMAKE_FLAGS: "-DPLUGIN_COLUMNSTORE=NO -DPLUGIN_ROCKSDB=NO -DPLUGIN_S3=NO -DPLUGIN_MROONGA=NO -DPLUGIN_CONNECT=NO -DPLUGIN_MROONGA=NO -DPLUGIN_TOKUDB=NO -DPLUGIN_PERFSCHEMA=NO -DWITH_WSREP=OFF" # Major version dictates which branches share the same ccache. E.g. 10.6-abc # and 10.6-xyz will have the same cache. - MARIADB_MAJOR_VERSION: "10.6" + MARIADB_MAJOR_VERSION: "10.4" # NOTE! Currently ccache is only used on the Centos8 build. As each job has # sufficiently different environments they are unable to benefit from each # other's ccaches. As each build generates about 1 GB of ccache, having @@ -206,7 +207,7 @@ fedora-sanitizer: - builddir/_CPack_Packages/Linux/RPM/SPECS/ parallel: matrix: - - SANITIZER: [-DWITH_ASAN=YES, -DWITH_TSAN=YES, -DWITH_UBSAN=YES, -DWITH_MSAN=YES] + - SANITIZER: [-DWITH_ASAN=YES, -DWITH_TSAN=YES, -DWITH_UBSAN=YES] centos8: stage: build @@ -298,6 +299,7 @@ centos7: main.mysqldump : Field separator argument is not what is expected; check the manual when executing 'SELECT INTO OUTFILE' main.flush_logs_not_windows : query 'flush logs' succeeded - should have failed with error ER_CANT_CREATE_FILE (1004) main.mysql_upgrade_noengine : upgrade output order does not match the expected + main.func_math : MDEV-20966 - Wrong error code " > skiplist - ./mtr --suite=main --force --parallel=auto --xml-report=$CI_PROJECT_DIR/junit.xml --skip-test-list=skiplist $RESTART_POLICY @@ -331,6 +333,7 @@ mysql-test-run-asan: needs: - "fedora-sanitizer: [-DWITH_ASAN=YES]" <<: *mysql-test-run-def + allow_failure: true artifacts: when: always # Also show results when tests fail reports: @@ -369,22 +372,6 @@ mysql-test-run-ubsan: junit: - junit.xml -mysql-test-run-msan: - stage: test - variables: - RESTART_POLICY: "--force-restart" - dependencies: - - "fedora-sanitizer: [-DWITH_MSAN=YES]" - needs: - - "fedora-sanitizer: [-DWITH_MSAN=YES]" - <<: *mysql-test-run-def - allow_failure: true - artifacts: - when: always # Also show results when tests fail - reports: - junit: - - junit.xml - rpmlint: stage: test dependencies: @@ -439,52 +426,70 @@ fedora install: - installed-database.sql - upgraded-database.sql -fedora upgrade: - stage: test - dependencies: - - fedora - needs: - - fedora +cppcheck: + stage: sast + needs: [] + variables: + GIT_STRATEGY: fetch + GIT_SUBMODULE_STRATEGY: normal script: - - dnf install -y mariadb-server - # Fedora does not support running services in Docker (like Debian packages do) so start it manually - - /usr/libexec/mariadb-check-socket - - /usr/libexec/mariadb-prepare-db-dir - - sudo -u mysql /usr/libexec/mariadbd --basedir=/usr & sleep 10 - # Dump database contents in installed state - - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > old-installed-database.sql - - /usr/libexec/mariadb-check-upgrade - # Dump database contents in upgraded state - - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > old-upgraded-database.sql - - mariadb --skip-column-names -e "SELECT @@version, @@version_comment" # Show version - # @TODO: Upgrade from Fedora 33 MariaDB 10.4 to MariaDB.org latest does not work - # so do this manual step to remove conflicts until packaging is fixed - - yum remove -y mariadb-server-utils mariadb-gssapi-server mariadb-cracklib-password-check mariadb-backup mariadb-connector-c-config - - rm -f rpm/*debuginfo* # Not relevant in this test - - yum install -y rpm/*.rpm - # nothing provides galera-4 on Fedora, so this step fails if built with wsrep - - mysql -e "SHUTDOWN;" - - /usr/bin/mariadb-install-db # This step should not do anything on upgrades, just exit - - sudo -u mysql /usr/sbin/mariadbd & sleep 10 - # Dump database contents in installed state - - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > new-installed-database.sql || true - # The step above fails on: mariadb-dump: Couldn't execute 'show events': Cannot proceed, because event scheduler is disabled (1577) - # @TODO: Since we did a manual start, we also need to run upgrade manually - - /usr/bin/mariadb-upgrade - # Dump database contents in upgraded state - - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > new-upgraded-database.sql - - | - mariadb --skip-column-names -e "SELECT @@version, @@version_comment" | tee /tmp/version - grep $MARIADB_MAJOR_VERSION /tmp/version || echo "MariaDB didn't upgrade properly" - - mariadb --table -e "SELECT * FROM mysql.global_priv; SHOW CREATE USER root@localhost; SHOW CREATE USER 'mariadb.sys'@localhost" - - mariadb --table -e "SELECT * FROM mysql.plugin; SHOW PLUGINS" + - yum install -y cppcheck diffutils + # --template: use a single-line template + # --force: check large directories without warning + # -i: ignore this directory when scanning + # -j: run multiple cppcheck threads + # Use newline to escape colon in yaml + - > + cppcheck --template="{file}:{line}: {severity}: {message}" --force + client dbug extra include libmariadb libmysqld libservices mysql-test mysys mysys_ssl pcre plugin + strings tests unittest vio wsrep-lib sql sql-common storage + -istorage/mroonga -istorage/tokudb -istorage/spider -istorage/rocksdb -iextra/ -ilibmariadb/ -istorage/columnstore + --output-file=cppcheck.txt -j $(nproc) + # Parallel jobs may output findings in an nondeterministic order. Sort to match ignorelist. + - cat cppcheck.txt | sort > cppcheck_sorted.txt + # Remove line numbers for diff + - sed 's/:[^:]*:/:/' cppcheck_sorted.txt > cppcheck_sorted_no_line_numbers.txt + # Only print new issues not found in ignore list + - echo "Problems found in ignore list that were not discovered by cppcheck (may have been fixed)." + - diff --changed-group-format='%>' --unchanged-group-format='' cppcheck_sorted_no_line_numbers.txt tests/code_quality/cppcheck_ignorelist.txt || true + - echo "Problems found by cppcheck that were not in ignore list." + - diff --changed-group-format='%<' --unchanged-group-format='' cppcheck_sorted_no_line_numbers.txt tests/code_quality/cppcheck_ignorelist.txt > lines_not_ignored.txt || true + - cat lines_not_ignored.txt && test ! -s lines_not_ignored.txt artifacts: + when: always paths: - - old-installed-database.sql - - old-upgraded-database.sql - - new-installed-database.sql - - new-upgraded-database.sql + - cppcheck_sorted.txt +flawfinder: + stage: sast + needs: [] + variables: + GIT_STRATEGY: fetch + GIT_SUBMODULE_STRATEGY: normal + script: + - yum install -y python3 python3-pip jq diffutils git + - pip install flawfinder + - flawfinder --falsepositive --quiet --html . > flawfinder-all-vulnerabilities.html + - cat flawfinder-all-vulnerabilities.html | grep "Hits =" + - flawfinder --falsepositive --quiet --minlevel=5 --sarif . > flawfinder-output.json + # FlawFinder's --sarif output will display all vulnerabilities despite having --minlevel=5 specified. + # Therefore, we postprocess the results with jq and filter out findings where the vulnerability level is less than 5. + # Also in the SARIF output format, the vulnerabilities are ranked as 0.2/0.4/0.6/0.8/1.0 which correspond to the --minlevel=1/2/3/4/5 of FlawFinder. + # Additionally, we sort the results because individual findings are consistent across different runs, but their ordering may not be. + # Vulnerabilities can also be ignored in-line (/* Flawfinder: ignore */), but this option was chosen as to not clutter the codebase. + - jq 'del(.runs[] | .tool | .driver | .rules) | del(.runs[] | .results[] | select(.rank < 1)) | del(.runs[] | .results[] | .locations[] | .physicalLocation | .region | .startLine) | .runs[0].results|=sort_by(.fingerprints)' flawfinder-output.json > flawfinder-min-level5.json + # Diff against known vulnerabilities, but ignore the line number. + - echo "Problems found in ignore list that were not discovered by flawfinder (may have been fixed)." + - diff --changed-group-format='%>' --unchanged-group-format='' flawfinder-min-level5.json tests/code_quality/flawfinder_ignorelist.json || true + - echo "Problems found by flawfinder that were not in ignore list." + - diff --changed-group-format='%<' --unchanged-group-format='' flawfinder-min-level5.json tests/code_quality/flawfinder_ignorelist.json > lines_not_ignored.txt || true + - cat lines_not_ignored.txt && test ! -s lines_not_ignored.txt + artifacts: + when: always + paths: + - flawfinder-all-vulnerabilities.html + - flawfinder-min-level5.json + # Once all RPM builds and tests have passed, also run the DEB builds and tests # @NOTE: This is likely to work well only on salsa.debian.org as the Gitlab.com # runners are too small for everything this stage does. diff --git a/tests/code_quality/cppcheck_ignorelist.txt b/tests/code_quality/cppcheck_ignorelist.txt new file mode 100644 index 00000000000..268bf8108d4 --- /dev/null +++ b/tests/code_quality/cppcheck_ignorelist.txt @@ -0,0 +1,251 @@ +client/mysql.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysql_upgrade.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqladmin.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqlbinlog.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqlcheck.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqlimport.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqlshow.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqltest.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +dbug/tests.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +lexyy.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +mysql-test/lib/My/SafeProcess/safe_process_win.cc: error: Uninitialized variable: message_text +mysys/mf_keycache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_fopen.c: error: Return value of allocation function 'freopen' is not stored. +mysys/my_getsystime.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_pread.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_rename.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_winfile.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_write.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +mysys/thr_lock.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_TABLE_WAIT_VARIABLES is a macro then please configure it. +mysys/tree.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +pcre/pcrecpp.cc: warning: Uninitialized variable: kmat +pcre/pcrecpp.h: error: syntax error +pcre/pcregrep.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/audit_null/audit_null.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_ed25519/server_ed25519.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/auth_0x0100.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/dialog_examples.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/qa_auth_interface.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/qa_auth_server.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/test_plugin.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_gssapi/server_plugin.cc: error: syntax error +plugin/auth_gssapi/sspi.h: error: #include nested too deeply +plugin/auth_pam/auth_pam.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_pam/auth_pam_v1.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_pipe/auth_pipe.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_socket/auth_socket.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/aws_key_management/aws_key_management_plugin.cc: error: syntax error +plugin/cracklib_password_check/cracklib_password_check.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/daemon_example/daemon_example.cc: error: syntax error +plugin/debug_key_management/debug_key_management_plugin.cc: error: syntax error +plugin/disks/information_schema_disks.cc: error: syntax error +plugin/example_key_management/example_key_management_plugin.cc: error: syntax error +plugin/feedback/feedback.cc: error: syntax error +plugin/file_key_management/file_key_management_plugin.cc: error: syntax error +plugin/fulltext/plugin_example.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/handler_socket/handlersocket/handlersocket.cpp: error: syntax error +plugin/locale_info/locale_info.cc: error: syntax error +plugin/metadata_lock_info/metadata_lock_info.cc: error: syntax error +plugin/metadata_lock_info/metadata_lock_info.cc: error: syntax error +plugin/qc_info/qc_info.cc: error: syntax error +plugin/query_response_time/plugin.cc: error: syntax error +plugin/query_response_time/query_response_time.cc: error: Array 'm_count[41]' accessed at index 43, which is out of bounds. +plugin/query_response_time/query_response_time.cc: error: Array 'm_total[41]' accessed at index 43, which is out of bounds. +plugin/server_audit/server_audit.c: error: Uninitialized variable: &tm_time +plugin/server_audit/server_audit.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/server_audit/server_audit.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/server_audit/server_audit.c: error: Uninitialized variable: &tm_time +plugin/simple_password_check/simple_password_check.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/sql_errlog/sql_errlog.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/sql_errlog/sql_errlog.c: error: Uninitialized variable: &t +plugin/user_variables/user_variables.cc: error: syntax error +plugin/userstat/userstat.cc: error: syntax error +plugin/versioning/versioning.cc: error: syntax error +plugin/wsrep_info/plugin.cc: error: syntax error +sql-common/client.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. +sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. +sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. +sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. +sql/debug_sync.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE is a macro then please configure it. +sql/gcalc_slicescan.cc: warning: Possible null pointer dereference: first_bottom_point +sql/gen_lex_hash.cc: error: Common realloc mistake: 'hash_map' nulled but not freed upon failure +sql/handler.h: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql/log.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +sql/log_event.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +sql/log_event_old.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql/net_serv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql/protocol.h: error: syntax error +sql/rpl_utility.h: error: There is an unknown macro here somewhere. Configuration is required. If CPP_UNNAMED_NS_START is a macro then please configure it. +sql/semisync_slave.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql/sql_select.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +sql/sql_string.cc: warning: Iterators to containers from different expressions 'to' and 'from' are used together. +sql/table.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +sql/winservice.c: error: Resource leak: mysql_upgrade_info +sql/wsrep_thd.h: error: failed to expand 'wsrep_create_appliers', Wrong number of parameters for macro 'wsrep_create_appliers'. +storage/archive/azio.c: error: Syntax Error: AST broken, 'if' doesn't have two operands. +storage/archive/ha_archive.cc: error: syntax error +storage/blackhole/ha_blackhole.cc: error: syntax error +storage/cassandra/gen-cpp/Cassandra_server.skeleton.cpp: error: Found a exit path from function with non-void return type that has missing return statement +storage/cassandra/ha_cassandra.cc: error: syntax error +storage/connect/connect.cc: error: Uninitialized variable: lg +storage/connect/domdoc.cpp: error: syntax error +storage/connect/ha_connect.cc: error: syntax error +storage/connect/myconn.cpp: error: Unmatched '{'. Configuration: 'ALPHA;MYSQL_PREPARED_STATEMENTS'. +storage/connect/myconn.cpp: error: Unmatched '{'. Configuration: 'MYSQL_PREPARED_STATEMENTS'. +storage/connect/odbconn.cpp: warning: Uninitialized variable: b +storage/connect/odbconn.cpp: warning: Uninitialized variable: b +storage/connect/odbconn.cpp: warning: Uninitialized variable: b +storage/connect/plugutil.cpp: error: Width 255 given in format string (no. 2) is larger than destination buffer 'stmsg[200]', use %199[^\"] to prevent overflowing it. +storage/connect/plugutil.cpp: error: Width 255 given in format string (no. 1) is larger than destination buffer 'stmsg[200]', use %199[^\"] to prevent overflowing it. +storage/connect/tabjson.cpp: warning: Possible null pointer dereference: Val +storage/connect/tabmul.cpp: error: Uninitialized variable: buf +storage/connect/tabmul.cpp: error: Uninitialized variable: buf +storage/connect/tabmul.cpp: error: Uninitialized variable: buf +storage/connect/taboccur.cpp: warning: Uninitialized variable: *pcrp +storage/connect/unzip.c: warning: Uninitialized variable: *pzlib_filefunc64_32_def.zopen32_file +storage/connect/value.cpp: error: Signed integer overflow for expression 'n*126230400'. +storage/connect/zip.c: warning: Uninitialized variable: *pzlib_filefunc64_32_def.zopen32_file +storage/csv/ha_tina.cc: error: syntax error +storage/example/ha_example.cc: error: syntax error +storage/federated/ha_federated.cc: error: syntax error +storage/heap/ha_heap.cc: error: syntax error +storage/innobase/btr/btr0btr.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/btr/btr0cur.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/btr/btr0defragment.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/btr/btr0sea.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/buf/buf0buf.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/buf/buf0dump.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/buf/buf0flu.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/buf/buf0lru.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/dict/dict0crea.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/dict/dict0dict.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/dict/dict0load.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/dict/dict0stats.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/dict/dict0stats_bg.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/fil/fil0crypt.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/fil/fil0fil.cc: error: syntax error +storage/innobase/fsp/fsp0file.cc: error: Resource leak: file +storage/innobase/fsp/fsp0fsp.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/fts/fts0fts.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/fts/fts0opt.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/fts/fts0que.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/gis/gis0rtree.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/gis/gis0sea.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/handler/ha_innodb.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/handler/handler0alter.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/handler/i_s.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/ibuf/ibuf0ibuf.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/ibuf/ibuf0ibuf.cc: error: failed to expand 'ibuf_bitmap_page_get_bits', Wrong number of parameters for macro 'ibuf_bitmap_page_get_bits'. +storage/innobase/lock/lock0lock.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/lock/lock0wait.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/lock/lock0wait.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/log/log0log.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/log/log0recv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/os/os0file.cc: error: syntax error +storage/innobase/page/page0page.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/page/page0zip.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/pars/pars0pars.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0ftsort.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0import.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/row/row0ins.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0log.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/row/row0merge.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/row/row0mysql.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0quiesce.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0sel.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/row/row0umod.cc: error: There is an unknown macro here somewhere. Configuration is required. If ut_d is a macro then please configure it. +storage/innobase/row/row0upd.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/row/row0vers.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/srv/srv0conc.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ALIGNED is a macro then please configure it. +storage/innobase/srv/srv0srv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/srv/srv0start.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/trx/trx0i_s.cc: error: Array 'table_cache->chunks[39]' accessed at index 39, which is out of bounds. +storage/innobase/trx/trx0i_s.cc: error: Array 'table_cache->chunks[39]' accessed at index 39, which is out of bounds. +storage/innobase/trx/trx0purge.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/trx/trx0rec.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/trx/trx0roll.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/trx/trx0trx.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/trx/trx0undo.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ha_maria.cc: error: syntax error +storage/maria/ma_bitmap.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_blockrec.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_check.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_checkpoint.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/maria/ma_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_ft_parser.c: error: Address of local auto-variable assigned to a function parameter. +storage/maria/ma_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_loghandler.c: warning: Uninitialized variable: data->current_offset +storage/maria/ma_open.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/maria/ma_pagecache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_pagecache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_range.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_recovery_util.c: error: va_start() or va_copy() called subsequently on 'args' without va_end() in between. +storage/maria/ma_rkey.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_rt_index.c: error: failed to expand 'rt_PAGE_END', Wrong number of parameters for macro 'rt_PAGE_END'. +storage/maria/ma_search.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_sp_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_update.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/maria/ma_update.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_write.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/maria/ma_write.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/maria_pack.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/ft_parser.c: error: Address of local auto-variable assigned to a function parameter. +storage/myisam/ha_myisam.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_check.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_close.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/myisam/mi_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_locking.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_open.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/myisam/mi_range.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_rkey.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_search.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_update.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_write.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/myisampack.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisammrg/ha_myisammrg.cc: error: syntax error +storage/oqgraph/ha_oqgraph.cc: error: syntax error +storage/perfschema/ha_perfschema.cc: error: syntax error +storage/perfschema/pfs_instr.h: error: Uninitialized variable: m_has_io_stats +storage/perfschema/pfs_instr.h: error: Uninitialized variable: m_has_lock_stats +storage/perfschema/pfs_instr_class.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ALIGNED is a macro then please configure it. +storage/perfschema/table_accounts.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esgs_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esgs_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esgs_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esms_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esms_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esms_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_events_waits.cc: error: Uninitialized struct member: wait.m_wait_class +storage/perfschema/table_events_waits.cc: error: Uninitialized variable: wait +storage/perfschema/table_events_waits.cc: error: Uninitialized struct member: wait.m_wait_class +storage/perfschema/table_ews_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_ews_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_ews_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_hosts.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_setup_actors.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_threads.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_users.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/sequence/sequence.cc: error: syntax error +storage/test_sql_discovery/test_sql_discovery.cc: error: syntax error +strings/decimal.c: warning: Possible null pointer dereference: to +strings/dump_map.c: error: Array 'fromstat[256]' accessed at index 256, which is out of bounds. +tests/mysql_client_fw.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +tests/thread_test.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +unittest/mysys/dynstring-t.c: error: syntax error +unittest/mysys/queues-t.c: error: Uninitialized variable: i +unittest/mysys/waiting_threads-t.c: error: Uninitialized variable: m +unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. +vio/viosocket.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_SOCKET_WAIT_VARIABLES is a macro then please configure it. +vio/viosocket.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_SOCKET_WAIT_VARIABLES is a macro then please configure it. +vio/viosslfactories.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +vio/viotest-sslconnect.cc: error: Memory pointed to by 'vio' is freed twice. +vio/viotest-sslconnect.cc: error: Memory pointed to by 'ssl_connector' is freed twice. +wsrep-lib/src/server_state.cpp: error: syntax error: keyword 'try' is not allowed in global scope +wsrep-lib/src/thread_service_v1.cpp: error: Rethrowing current exception with 'throw;', it seems there is no current exception to rethrow. If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object diff --git a/tests/code_quality/flawfinder_ignorelist.json b/tests/code_quality/flawfinder_ignorelist.json new file mode 100644 index 00000000000..7b598689693 --- /dev/null +++ b/tests/code_quality/flawfinder_ignorelist.json @@ -0,0 +1,622 @@ +{ + "$schema": "https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0-rtm.5.json", + "version": "2.1.0", + "runs": [ + { + "tool": { + "driver": { + "name": "Flawfinder", + "version": "2.0.19", + "informationUri": "https://dwheeler.com/flawfinder/", + "supportedTaxonomies": [ + { + "name": "CWE", + "guid": "FFC64C90-42B6-44CE-8BEB-F6B7DAE649E5" + } + ] + } + }, + "columnKind": "utf16CodeUnits", + "results": [ + { + "ruleId": "FF1010", + "level": "error", + "message": { + "text": "buffer/strncat:Easily used incorrectly (e.g., incorrectly computing the correct maximum size to add) [MS-banned] (CWE-120)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/portability/file.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 5, + "endColumn": 39, + "snippet": { + "text": " strncat(buf, path, TOKU_PATH_MAX);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "02af921b7054342955d8e30b196aa5ffdc3b1ac019e26c92823a7ab171d2b1fa" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 5, + "endColumn": 40, + "snippet": { + "text": " chmod(headerpath, S_IRUSR|S_IWUSR);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "085f579f942967e5c81fff75af832721b7b9bc59e54a7a9ebc086065cf56be13" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/portability/file.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 25, + "endColumn": 63, + "snippet": { + "text": " ssize_t s = readlink(fdname, lname, sizeof lname);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "0dba1d2cdc995ccf30ad8fe5ce3ccf8795bd4f5a207f65c627affa2ef388496c" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./extra/mariabackup/xtrabackup.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 17, + "endColumn": 57, + "snippet": { + "text": " ssize_t ret = readlink(\"/proc/self/exe\", buf, size-1);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "11523490c7f8cba115bce125bbce94de5cd5e7f66d4dd07a391aac70fbbdd353" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./client/mysqltest.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 13, + "endColumn": 38, + "snippet": { + "text": " err_code= chmod(ds_file.str, mode);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "12a7fa6bbd4c81be975838bae2b7b26fe841acaf9804e6d0299188683e230908" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 5, + "endColumn": 38, + "snippet": { + "text": " chmod(codepath, S_IRUSR|S_IWUSR);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "2827dedcdf10af2bf4105f3d48e30575238fa2552603cdcb09d536b288808f0e" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1014", + "level": "error", + "message": { + "text": "buffer/gets:Does not check for buffer overflows (CWE-120, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./extra/readline/tilde.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 12, + "endColumn": 24, + "snippet": { + "text": " if (!gets (line))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "34a940ccc6e0248a2cf725e8a0c3f808d1f36d47fc814bd9daadb17f5563d357" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./sql/sql_class.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 10, + "endColumn": 28, + "snippet": { + "text": " (void) chmod(path, 0644);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "3f97fd0452062ab69db87a04222a17c37c216c4e28e2ae3622730da8dd070d2e" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_chmod.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 7, + "endColumn": 25, + "snippet": { + "text": " if (chmod(name, mode))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "46805eec1d288b072d4edb3214822220d394307195be79a33ec3bce455d14750" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1010", + "level": "error", + "message": { + "text": "buffer/strncat:Easily used incorrectly (e.g., incorrectly computing the correct maximum size to add) [MS-banned] (CWE-120)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/tests/recovery-datadir-is-file.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 47, + "snippet": { + "text": " strncat(buf, testfile, TOKU_PATH_MAX);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "4ca2dff1e35445f7997a9979cdd006d89befcc89922cf5d4a60bc9c07126a78d" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_symlink.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 15, + "endColumn": 56, + "snippet": { + "text": " if ((length=readlink(filename, to, FN_REFLEN-1)) < 0)" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "7da5207ac0f5baba73c026472a2d3805eed92931852575db64f513702977dd70" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1031", + "level": "error", + "message": { + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_redel.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 7, + "endColumn": 49, + "snippet": { + "text": " if (chown(to, statbuf.st_uid, statbuf.st_gid))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "97d2cfe4cb9428e812b796eb39c27f28dc8b198ab9655c2aff8c442de39bdcfe" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 50, + "snippet": { + "text": " chmod(codepath, S_IRUSR|S_IRGRP|S_IROTH);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "a62b28fca5c6218ee4731e78bb3eacb93604fae20c91c69cccad3834973e70d5" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/rocksdb/rocksdb/port/stack_trace.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 15, + "endColumn": 54, + "snippet": { + "text": " auto read = readlink(link, name, sizeof(name) - 1);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "acb399f2a4a15ef8da36c47631bc4ee4bcc1bb0577dfbda141d2eb5d7723af40" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./sql/signal_handler.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 13, + "endColumn": 66, + "snippet": { + "text": " if ((len= readlink(\"/proc/self/cwd\", buff, sizeof(buff))) >= 0)" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "b55a5f3db29b1ce25e12f94e4ea344ed7fb0e63a230cf6b6deb42c28de924457" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_copy.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 46, + "snippet": { + "text": " if (chmod(to, stat_buff.st_mode & 07777))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "bddb795a7efbd73a4387bbd33fd4f9e505b4f759d784e5d51f60cc43011ee610" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1031", + "level": "error", + "message": { + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_copy.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 55, + "snippet": { + "text": " if (chown(to, stat_buff.st_uid, stat_buff.st_gid))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "c63a81105d753de4762cbcab48d9700f7069da3cd9d57bf4329a6d20fad288aa" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 52, + "snippet": { + "text": " chmod(headerpath, S_IRUSR|S_IRGRP|S_IROTH);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "cc51b21d9b803a08b6c619b63abf77f4ca9ce247db0ef1b81f4bd83dfb95f3d8" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./sql/mysqld.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 12, + "endColumn": 71, + "snippet": { + "text": " (void) chmod(mysqld_unix_port,S_IFSOCK);\t/* Fix solaris 2.6 bug */" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "d0c4f1302290e2367e246ef7c8d3ea69589cbc4bc148e0efdd4c283fa03cbe01" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_redel.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 7, + "endColumn": 42, + "snippet": { + "text": " if (chmod(to, statbuf.st_mode & 07777))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "e11b8df9cbb9e459e4d67a0af5e627b6b1285c78fe23f5a1c823285da96495a8" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/portability/file.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 29, + "endColumn": 67, + "snippet": { + "text": " ssize_t n = readlink(fname, symname, MY_MAX_PATH);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "e307b1923cc852324e3050b3e4423be7ac4d1d64af274b70b897a85b1cde815f" + }, + "rank": 1.0 + } + ], + "externalPropertyFileReferences": { + "taxonomies": [ + { + "location": { + "uri": "https://raw.githubusercontent.com/sarif-standard/taxonomies/main/CWE_v4.4.sarif" + }, + "guid": "FFC64C90-42B6-44CE-8BEB-F6B7DAE649E5" + } + ] + } + } + ] +} From b54e7b0cea5dffe57d71b4ec7486ecce700086df Mon Sep 17 00:00:00 2001 From: Vlad Lesin Date: Fri, 12 May 2023 12:11:53 +0300 Subject: [PATCH 031/171] MDEV-31185 rw_trx_hash_t::find() unpins pins too early MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rw_trx_hash_t::find() acquires element->mutex, then unpins pins, used for lf_hash element search. After that the "element" can be deallocated and reused by some other thread. If we take a look rw_trx_hash_t::insert()->lf_hash_insert()->lf_alloc_new() calls, we will not find any element->mutex acquisition, as it was not initialized yet before it's allocation. rw_trx_hash_t::insert() can reuse the chunk, unpinned in rw_trx_hash_t::find(). The scenario is the following: 1. Thread 1 have just executed lf_hash_search() in rw_trx_hash_t::find(), but have not acquired element->mutex yet. 2. Thread 2 have removed the element from hash table with rw_trx_hash_t::erase() call. 3. Thread 1 acquired element->mutex and unpinned pin 2 pin with lf_hash_search_unpin(pins) call. 4. Some thread purged memory of the element. 5. Thread 3 reused the memory for the element, filled element->id, element->trx. 6. Thread 1 crashes with failed "DBUG_ASSERT(trx_id == trx->id)" assertion. Note that trx_t objects are also reused, see the code around trx_pools for details. The fix is to invoke "lf_hash_search_unpin(pins);" after element->trx is stored in local variable in rw_trx_hash_t::find(). Reviewed by: Nikita Malyavin, Marko Mäkelä. --- .../r/trx_sys_t_find_lf_hash_error.result | 25 ++++++ .../t/trx_sys_t_find_lf_hash_error.test | 87 +++++++++++++++++++ mysys/lf_alloc-pin.c | 3 + sql/table_cache.cc | 4 + sql/xa.cc | 5 ++ storage/innobase/include/trx0sys.h | 21 ++++- 6 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/innodb/r/trx_sys_t_find_lf_hash_error.result create mode 100644 mysql-test/suite/innodb/t/trx_sys_t_find_lf_hash_error.test diff --git a/mysql-test/suite/innodb/r/trx_sys_t_find_lf_hash_error.result b/mysql-test/suite/innodb/r/trx_sys_t_find_lf_hash_error.result new file mode 100644 index 00000000000..11d3fb4a7a3 --- /dev/null +++ b/mysql-test/suite/innodb/r/trx_sys_t_find_lf_hash_error.result @@ -0,0 +1,25 @@ +create table t1 (a int) engine=innodb STATS_PERSISTENT=0; +create table t2 (a int) engine=innodb STATS_PERSISTENT=0; +BEGIN; +insert into t1 values(1); +connect con_1, localhost, root,,; +SET DEBUG_SYNC="before_trx_hash_find_element_mutex_enter SIGNAL before_mutex_enter WAIT_FOR cont1"; +SET DEBUG_SYNC="after_trx_hash_find_element_mutex_enter SIGNAL after_mutex_enter WAIT_FOR cont2"; +SELECT * FROM t1 WHERE a = 1 FOR UPDATE; +connection default; +SET DEBUG_SYNC="now WAIT_FOR before_mutex_enter"; +COMMIT; +SET DEBUG_SYNC="now SIGNAL cont1"; +SET DEBUG_SYNC="now WAIT_FOR after_mutex_enter"; +insert into t2 values(1); +BEGIN; +INSERT INTO t2 VALUES(2); +SET DEBUG_SYNC="now SIGNAL cont2"; +connection con_1; +a +1 +disconnect con_1; +connection default; +DROP TABLE t1; +DROP TABLE t2; +SET DEBUG_SYNC="reset"; diff --git a/mysql-test/suite/innodb/t/trx_sys_t_find_lf_hash_error.test b/mysql-test/suite/innodb/t/trx_sys_t_find_lf_hash_error.test new file mode 100644 index 00000000000..833919f9ad6 --- /dev/null +++ b/mysql-test/suite/innodb/t/trx_sys_t_find_lf_hash_error.test @@ -0,0 +1,87 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/count_sessions.inc + +create table t1 (a int) engine=innodb STATS_PERSISTENT=0; +create table t2 (a int) engine=innodb STATS_PERSISTENT=0; + +BEGIN; # trx1 +# register rw-transaction in trx_sys.rw_trx_hash +insert into t1 values(1); + +--connect (con_1, localhost, root,,) +SET DEBUG_SYNC="before_trx_hash_find_element_mutex_enter SIGNAL before_mutex_enter WAIT_FOR cont1"; +SET DEBUG_SYNC="after_trx_hash_find_element_mutex_enter SIGNAL after_mutex_enter WAIT_FOR cont2"; + +# trx2 is converting implicit lock of trx1 to explicit one, it's invoking +# â–¾ l_search +# â–¾ lf_hash_search_using_hash_value +# â–¾ lf_hash_search +# â–¾ rw_trx_hash_t::find +# â–¾ trx_sys_t::find +# â–¾ lock_rec_convert_impl_to_expl +# rw_trx_hash_t::find returns lf_hash element, pin 2 is pinned, +# but element->mutex has not been acquired yet, what allows trx1 element to be +# removed from trx_sys.rw_trx_hash at one hand, and at the other hand, the +# content of the element is still valid as it's pinned. +# +# trx2 +--send SELECT * FROM t1 WHERE a = 1 FOR UPDATE +--connection default +SET DEBUG_SYNC="now WAIT_FOR before_mutex_enter"; +--disable_query_log +SET @saved_dbug = @@debug_dbug; + +# Usually pinbox purgatory is purged either when the number of elements in +# purgatory is greater then some limit(see lf_pinbox_free()), or when thread +# invokes rw_trx_hash_t::put_pins() explicitly. For this test the first +# variant was choosen. The following option makes lf_pinbox_free() to purge +# pinbox purgatory on each call, ignoring pins->purgatory_count. +SET DEBUG_DBUG='+d,unconditional_pinbox_free'; +--enable_query_log + +# trx1 is committed and removed from trx_sys.rw_trx_hash. It can be done as +# trx2 has not been acquired element->mutex yet. +COMMIT; +--disable_query_log +SET DEBUG_DBUG = @saved_dbug; +--enable_query_log + +# Let trx2 to acquire element->mutex and unpin pin 2 +SET DEBUG_SYNC="now SIGNAL cont1"; +SET DEBUG_SYNC="now WAIT_FOR after_mutex_enter"; + +--disable_query_log +SET @saved_dbug = @@debug_dbug; +SET DEBUG_DBUG='+d,unconditional_pinbox_free'; +--enable_query_log +# trx3 commits and invokes lf_pinbox_free(), which purges pin 2 of trx2 and +# places its pointer on trx_sys.rw_trx_hash.hash.alloc.top. +insert into t2 values(1); +--disable_query_log +SET DEBUG_DBUG = @saved_dbug; +--enable_query_log + +BEGIN; # trx4 +# trx_sys.rw_trx_hash.hash.alloc.top points to "freed" trx2 lf_hash element, +# lf_alloc_new() gets the pointer from trx_sys.rw_trx_hash.hash.alloc.top, +# so the memory for lf_hash element will be reused for trx4 if MDEV-31185 is +# not fixed +INSERT INTO t2 VALUES(2); + +# let trx2 to invoke DBUG_ASSERT(trx_id == trx->id) and crash if MDEV-31185 +# is not fixed +SET DEBUG_SYNC="now SIGNAL cont2"; + +--connection con_1 +# trx 2 assertion failure if MDEV-31185 is not fixed +--reap +--disconnect con_1 +--connection default +DROP TABLE t1; +DROP TABLE t2; + +SET DEBUG_SYNC="reset"; + +--source include/wait_until_count_sessions.inc diff --git a/mysys/lf_alloc-pin.c b/mysys/lf_alloc-pin.c index f844920a664..6d80b381e5e 100644 --- a/mysys/lf_alloc-pin.c +++ b/mysys/lf_alloc-pin.c @@ -270,6 +270,9 @@ void lf_pinbox_free(LF_PINS *pins, void *addr) add_to_purgatory(pins, addr); if (pins->purgatory_count % LF_PURGATORY_SIZE == 0) lf_pinbox_real_free(pins); + DBUG_EXECUTE_IF("unconditional_pinbox_free", + if (pins->purgatory_count % LF_PURGATORY_SIZE) + lf_pinbox_real_free(pins);); } struct st_harvester { diff --git a/sql/table_cache.cc b/sql/table_cache.cc index 15255c56083..9b28e7b7b0f 100644 --- a/sql/table_cache.cc +++ b/sql/table_cache.cc @@ -824,6 +824,10 @@ retry: element= (TDC_element*) lf_hash_search_using_hash_value(&tdc_hash, thd->tdc_hash_pins, hash_value, (uchar*) key, key_length); + /* It's safe to unpin the pins here, because an empty element was inserted + above, "empty" means at least element->share = 0. Some other thread can't + delete it while element->share == 0. And element->share is also protected + with element->LOCK_table_share mutex. */ lf_hash_search_unpin(thd->tdc_hash_pins); DBUG_ASSERT(element); diff --git a/sql/xa.cc b/sql/xa.cc index 85fbe9358a3..7b5296f20f9 100644 --- a/sql/xa.cc +++ b/sql/xa.cc @@ -246,9 +246,14 @@ static XID_cache_element *xid_cache_search(THD *thd, XID *xid) xid->key(), xid->key_length()); if (element) { + /* The element can be removed from lf_hash by other thread, but + element->acquire_recovered() will return false in this case. */ if (!element->acquire_recovered()) element= 0; lf_hash_search_unpin(thd->xid_hash_pins); + /* Once the element is acquired (i.e. got the ACQUIRED bit) by this thread, + only this thread can delete it. The deletion happens in xid_cache_delete(). + See also the XID_cache_element documentation. */ DEBUG_SYNC(thd, "xa_after_search"); } return element; diff --git a/storage/innobase/include/trx0sys.h b/storage/innobase/include/trx0sys.h index 246af942419..0f12cd90495 100644 --- a/storage/innobase/include/trx0sys.h +++ b/storage/innobase/include/trx0sys.h @@ -632,9 +632,21 @@ public: sizeof(trx_id_t))); if (element) { + /* rw_trx_hash_t::erase() sets element->trx to nullptr under + element->mutex protection before removing the element from hash table. + If the element was removed before the mutex acquisition, element->trx + will be equal to nullptr. */ + DEBUG_SYNC_C("before_trx_hash_find_element_mutex_enter"); mutex_enter(&element->mutex); + /* element_trx can't point to reused object now. If transaction was + deregistered before element->mutex acquisition, element->trx is nullptr. + It can't be deregistered while element->mutex is held. */ + trx_t *element_trx = element->trx; lf_hash_search_unpin(pins); - if ((trx= element->trx)) { + /* The *element can be reused now, as element->trx value is stored + locally in element_trx. */ + DEBUG_SYNC_C("after_trx_hash_find_element_mutex_enter"); + if ((trx= element_trx)) { DBUG_ASSERT(trx_id == trx->id); ut_d(validate_element(trx)); if (do_ref_count) @@ -650,12 +662,19 @@ public: trx_mutex_enter(trx); const trx_state_t state= trx->state; trx_mutex_exit(trx); + /* trx_t::commit_in_memory() sets the state to + TRX_STATE_COMMITTED_IN_MEMORY before deregistering the transaction. + It also waits for any implicit-to-explicit lock conversions to cease + after deregistering. */ if (state == TRX_STATE_COMMITTED_IN_MEMORY) trx= NULL; else trx->reference(); } } + /* element's lifetime is equal to the hash lifetime, that's why + element->mutex is valid here despite the element is unpinned. In the + worst case some thread will wait for element->mutex releasing. */ mutex_exit(&element->mutex); } if (!caller_trx) From 131ef14a6e70eeaadf71f65e8463d59e30bf76c5 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Wed, 10 May 2023 20:08:33 +0300 Subject: [PATCH 032/171] Fix ./mtr --view-protocol opt_trace Follow the approach taken in the rest of the test. --- mysql-test/main/opt_trace.test | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mysql-test/main/opt_trace.test b/mysql-test/main/opt_trace.test index 2f1047df7c5..5f73e076fec 100644 --- a/mysql-test/main/opt_trace.test +++ b/mysql-test/main/opt_trace.test @@ -751,6 +751,11 @@ select * from from t10 left join t11 on t11.col1=t10.col1 group by grp_id) T on T.grp_id=t1.b; +# Not sure how MDEV-27871 is related but this test uses this reason +# all over the place: +#enable after fix MDEV-27871 +--disable_view_protocol + select json_detailed(json_extract(trace, '$**.check_split_materialized')) as JS from information_schema.optimizer_trace; @@ -763,6 +768,7 @@ select ) as JS from information_schema.optimizer_trace; +--enable_view_protocol drop table t1,t2,t3,t10,t11; set optimizer_trace=DEFAULT; From 60f0765b58ff2a1042b005cf629da30e3f730d3b Mon Sep 17 00:00:00 2001 From: Oleg Smirnov Date: Sun, 29 Jan 2023 19:39:14 +0700 Subject: [PATCH 033/171] MDEV-30143 Segfault on select query using index for group-by and filesort The problem was trying to access JOIN_TAB::select which is set to NULL when using the filesort. The correct way is accessing either JOIN_TAB::select or JOIN_TAB::filesort->select depending on whether the filesort is used. This commit introduces member function JOIN_TAB::get_sql_select() encapsulating that check so the code duplication is eliminated. The new condition (s->table->quick_keys.is_set(best_key->key)) was added to best_access_path() to eliminate a Valgrind error. The cause of that error was using TRASH_ALLOC(quick_key_parts) instead of bzero(quick_key_parts); hence, accessing s->table->quick_key_parts[best_key->key]) without prior checking for quick_keys.is_set() might have caused reading "dirty" memory --- mysql-test/main/group_min_max_innodb.result | 22 ++++++++++++++++++++ mysql-test/main/group_min_max_innodb.test | 23 ++++++++++++++++++++- sql/sql_select.cc | 6 +++--- sql/sql_select.h | 9 ++++++-- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/mysql-test/main/group_min_max_innodb.result b/mysql-test/main/group_min_max_innodb.result index 3586ad5237f..a2b06b0481b 100644 --- a/mysql-test/main/group_min_max_innodb.result +++ b/mysql-test/main/group_min_max_innodb.result @@ -308,6 +308,28 @@ NULL bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb NULL aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa drop table t1,t2; +# +# MDEV-30143: Segfault on select query using index for group-by and filesort +# +CREATE TABLE t1 (a varchar(35), b varchar(4)) ENGINE=InnoDB; +INSERT INTO t1 VALUES +('Albania','AXA'),('Australia','AUS'),('American Samoa','AMSA'),('Bahamas','BS'); +CREATE TABLE t2 (a varchar(4), b varchar(50), PRIMARY KEY (b,a), KEY (a)) ENGINE=InnoDB; +INSERT INTO t2 VALUES +('BERM','African Methodist Episcopal'),('AUS','Anglican'),('BERM','Anglican'),('BS','Anglican'),('BS','Baptist'),('BS','Methodist'); +EXPLAIN SELECT t1.a +FROM (SELECT a FROM t2 GROUP BY a ORDER BY COUNT(DISTINCT b) LIMIT 1) dt +JOIN t1 ON dt.a=t1.b; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY ALL NULL NULL NULL NULL # +1 PRIMARY t1 ALL NULL NULL NULL NULL # Using where; Using join buffer (flat, BNL join) +2 DERIVED t2 range a a 58 NULL # Using index for group-by (scanning); Using temporary; Using filesort +SELECT t1.a +FROM (SELECT a FROM t2 GROUP BY a ORDER BY COUNT(DISTINCT b) LIMIT 1) dt +JOIN t1 ON dt.a=t1.b; +a +Australia +DROP TABLES t1, t2; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; diff --git a/mysql-test/main/group_min_max_innodb.test b/mysql-test/main/group_min_max_innodb.test index 87a6e320887..fcecbec41b3 100644 --- a/mysql-test/main/group_min_max_innodb.test +++ b/mysql-test/main/group_min_max_innodb.test @@ -251,7 +251,28 @@ insert into t2 values (1,repeat("a",1000)),(2,repeat("a",1000)),(3,repeat("b",10 SELECT GROUP_CONCAT(t1.language_id SEPARATOR ',') AS `translation_resources`, `d`.`serialized_c` FROM t2 AS `d` LEFT JOIN t1 ON `d`.`voter_id` = t1.`voter_id` GROUP BY `d`.`voter_id` ORDER BY 10-d.voter_id+RAND()*0; drop table t1,t2; + +--echo # +--echo # MDEV-30143: Segfault on select query using index for group-by and filesort +--echo # +CREATE TABLE t1 (a varchar(35), b varchar(4)) ENGINE=InnoDB; +INSERT INTO t1 VALUES +('Albania','AXA'),('Australia','AUS'),('American Samoa','AMSA'),('Bahamas','BS'); + +CREATE TABLE t2 (a varchar(4), b varchar(50), PRIMARY KEY (b,a), KEY (a)) ENGINE=InnoDB; +INSERT INTO t2 VALUES +('BERM','African Methodist Episcopal'),('AUS','Anglican'),('BERM','Anglican'),('BS','Anglican'),('BS','Baptist'),('BS','Methodist'); + +let query= +SELECT t1.a +FROM (SELECT a FROM t2 GROUP BY a ORDER BY COUNT(DISTINCT b) LIMIT 1) dt +JOIN t1 ON dt.a=t1.b; +--replace_column 9 # +eval EXPLAIN $query; +eval $query; + +DROP TABLES t1, t2; + set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; - diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 34da8639d9a..53bdc567901 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -8120,6 +8120,7 @@ best_access_path(JOIN *join, if ((records >= s->found_records || best > s->read_time) && // (1) !(best_key && best_key->key == MAX_KEY) && // (2) !(s->quick && best_key && s->quick->index == best_key->key && // (2) + s->table->quick_keys.is_set(best_key->key) && // (2) best_max_key_part >= s->table->quick_key_parts[best_key->key]) &&// (2) !((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3) ! s->table->covering_keys.is_clear_all() && best_key && !s->quick) &&// (3) @@ -13791,7 +13792,7 @@ double JOIN_TAB::scan_time() ha_rows JOIN_TAB::get_examined_rows() { double examined_rows; - SQL_SELECT *sel= filesort? filesort->select : this->select; + const SQL_SELECT *sel= get_sql_select(); if (sel && sel->quick && use_quick != 2) examined_rows= (double)sel->quick->records; @@ -26858,13 +26859,12 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta, eta->key.clear(); eta->quick_info= NULL; - SQL_SELECT *tab_select; /* We assume that if this table does pre-sorting, then it doesn't do filtering with SQL_SELECT. */ DBUG_ASSERT(!(select && filesort)); - tab_select= (filesort)? filesort->select : select; + const SQL_SELECT *tab_select= get_sql_select(); if (filesort) { diff --git a/sql/sql_select.h b/sql/sql_select.h index d2d17611e48..f551126c7d7 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -546,14 +546,19 @@ typedef struct st_join_table { void cleanup(); inline bool is_using_loose_index_scan() { - const SQL_SELECT *sel= filesort ? filesort->select : select; + const SQL_SELECT *sel= get_sql_select(); return (sel && sel->quick && (sel->quick->get_type() == QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX)); } bool is_using_agg_loose_index_scan () { + const SQL_SELECT *sel= get_sql_select(); return (is_using_loose_index_scan() && - ((QUICK_GROUP_MIN_MAX_SELECT *)select->quick)->is_agg_distinct()); + ((QUICK_GROUP_MIN_MAX_SELECT *)sel->quick)->is_agg_distinct()); + } + const SQL_SELECT *get_sql_select() + { + return filesort ? filesort->select : select; } bool is_inner_table_of_semi_join_with_first_match() { From 6966d7fe4b7ccfb2b7d16ca4d7d5ab08234fa9ec Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Mon, 17 Apr 2023 16:04:01 +0300 Subject: [PATCH 034/171] MDEV-29293 MariaDB stuck on starting commit state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a backport from 10.5. The problem seems to be a deadlock between KILL command execution and BF abort issued by an applier, where: * KILL has locked victim's LOCK_thd_kill and LOCK_thd_data. * Applier has innodb side global lock mutex and victim trx mutex. * KILL is calling innobase_kill_query, and is blocked by innodb global lock mutex. * Applier is in wsrep_innobase_kill_one_trx and is blocked by victim's LOCK_thd_kill. The fix in this commit removes the TOI replication of KILL command and makes KILL execution less intrusive operation. Aborting the victim happens now by using awake_no_mutex() and ha_abort_transaction(). If the KILL happens when the transaction is committing, the KILL operation is postponed to happen after the statement has completed in order to avoid KILL to interrupt commit processing. Notable changes in this commit: * wsrep client connections's error state may remain sticky after client connection is closed. This error message will then pop up for the next client session issuing first SQL statement. This problem raised with test galera.galera_bf_kill. The fix is to reset wsrep client error state, before a THD is reused for next connetion. * Release THD locks in wsrep_abort_transaction when locking innodb mutexes. This guarantees same locking order as with applier BF aborting. * BF abort from MDL was changed to do BF abort on server/wsrep-lib side first, and only then do the BF abort on InnoDB side. This removes the need to call back from InnoDB for BF aborts which originate from MDL and simplifies the locking. * Removed wsrep_thd_set_wsrep_aborter() from service_wsrep.h. The manipulation of the wsrep_aborter can be done solely on server side. Moreover, it is now debug only variable and could be excluded from optimized builds. * Remove LOCK_thd_kill from wsrep_thd_LOCK/UNLOCK to allow more fine grained locking for SR BF abort which may require locking of victim LOCK_thd_kill. Added explicit call for wsrep_thd_kill_LOCK/UNLOCK where appropriate. * Wsrep-lib was updated to version which allows external locking for BF abort calls. Changes to MTR tests: * Disable galera_bf_abort_group_commit. This test is going to be removed (MDEV-30855). * Record galera_gcache_recover_manytrx as result file was incomplete. Trivial change. * Make galera_create_table_as_select more deterministic: Wait until CTAS execution has reached MDL wait for multi-master conflict case. Expected error from multi-master conflict is ER_QUERY_INTERRUPTED. This is because CTAS does not yet have open wsrep transaction when it is waiting for MDL, query gets interrupted instead of BF aborted. This should be addressed in separate task. * A new test galera_kill_group_commit to verify correct behavior when KILL is executed while the transaction is committing. Co-authored-by: Seppo Jaakola Co-authored-by: Jan Lindström Signed-off-by: Julius Goryavsky --- include/mysql/service_wsrep.h | 9 +- mysql-test/suite/galera/disabled.def | 1 + mysql-test/suite/galera/r/MDEV-29293.result | 21 ++ .../r/galera_create_table_as_select.result | 1 + .../galera/r/galera_kill_group_commit.result | 27 +++ mysql-test/suite/galera/t/MDEV-29293.test | 41 ++++ .../t/galera_create_table_as_select.test | 6 +- .../galera/t/galera_kill_group_commit.cnf | 5 + .../galera/t/galera_kill_group_commit.test | 69 ++++++ sql/handler.cc | 7 + sql/service_wsrep.cc | 38 +--- sql/sql_class.cc | 27 ++- sql/sql_class.h | 9 +- sql/sql_parse.cc | 58 +---- sql/sql_plugin_services.inl | 2 +- sql/wsrep_dummy.cc | 8 +- sql/wsrep_high_priority_service.cc | 1 + sql/wsrep_mysqld.cc | 45 ++-- sql/wsrep_server_service.cc | 8 +- sql/wsrep_server_service.h | 3 +- sql/wsrep_thd.cc | 213 +++++++++++++----- sql/wsrep_thd.h | 36 ++- sql/wsrep_trans_observer.h | 26 ++- storage/innobase/handler/ha_innodb.cc | 191 +++++++++------- wsrep-lib | 2 +- 25 files changed, 591 insertions(+), 263 deletions(-) create mode 100644 mysql-test/suite/galera/r/MDEV-29293.result create mode 100644 mysql-test/suite/galera/r/galera_kill_group_commit.result create mode 100644 mysql-test/suite/galera/t/MDEV-29293.test create mode 100644 mysql-test/suite/galera/t/galera_kill_group_commit.cnf create mode 100644 mysql-test/suite/galera/t/galera_kill_group_commit.test diff --git a/include/mysql/service_wsrep.h b/include/mysql/service_wsrep.h index 1e6aaa1b9b9..e1f7994f779 100644 --- a/include/mysql/service_wsrep.h +++ b/include/mysql/service_wsrep.h @@ -57,6 +57,7 @@ extern struct wsrep_service_st { my_bool (*wsrep_on_func)(const MYSQL_THD thd); bool (*wsrep_prepare_key_for_innodb_func)(MYSQL_THD thd, const unsigned char*, size_t, const unsigned char*, size_t, struct wsrep_buf*, size_t*); void (*wsrep_thd_LOCK_func)(const MYSQL_THD thd); + int (*wsrep_thd_TRYLOCK_func)(const MYSQL_THD thd); void (*wsrep_thd_UNLOCK_func)(const MYSQL_THD thd); const char * (*wsrep_thd_query_func)(const MYSQL_THD thd); int (*wsrep_thd_retry_counter_func)(const MYSQL_THD thd); @@ -83,7 +84,6 @@ extern struct wsrep_service_st { my_bool (*wsrep_get_debug_func)(); void (*wsrep_commit_ordered_func)(MYSQL_THD thd); my_bool (*wsrep_thd_is_applying_func)(const MYSQL_THD thd); - bool (*wsrep_thd_set_wsrep_aborter_func)(MYSQL_THD bf_thd, MYSQL_THD thd); void (*wsrep_report_bf_lock_wait_func)(const MYSQL_THD thd, unsigned long long trx_id); void (*wsrep_thd_kill_LOCK_func)(const MYSQL_THD thd); @@ -105,6 +105,7 @@ extern struct wsrep_service_st { #define wsrep_on(thd) (thd) && WSREP_ON && wsrep_service->wsrep_on_func(thd) #define wsrep_prepare_key_for_innodb(A,B,C,D,E,F,G) wsrep_service->wsrep_prepare_key_for_innodb_func(A,B,C,D,E,F,G) #define wsrep_thd_LOCK(T) wsrep_service->wsrep_thd_LOCK_func(T) +#define wsrep_thd_TRYLOCK(T) wsrep_service->wsrep_thd_TRYLOCK_func(T) #define wsrep_thd_UNLOCK(T) wsrep_service->wsrep_thd_UNLOCK_func(T) #define wsrep_thd_kill_LOCK(T) wsrep_service->wsrep_thd_kill_LOCK_func(T) #define wsrep_thd_kill_UNLOCK(T) wsrep_service->wsrep_thd_kill_UNLOCK_func(T) @@ -130,7 +131,6 @@ extern struct wsrep_service_st { #define wsrep_get_debug() wsrep_service->wsrep_get_debug_func() #define wsrep_commit_ordered(T) wsrep_service->wsrep_commit_ordered_func(T) #define wsrep_thd_is_applying(T) wsrep_service->wsrep_thd_is_applying_func(T) -#define wsrep_thd_set_wsrep_aborter(T) wsrep_service->wsrep_thd_set_wsrep_aborter_func(T1, T2) #define wsrep_report_bf_lock_wait(T,I) wsrep_service->wsrep_report_bf_lock_wait(T,I) #define wsrep_thd_set_PA_unsafe(T) wsrep_service->wsrep_thd_set_PA_unsafe_func(T) #else @@ -164,6 +164,8 @@ void wsrep_set_data_home_dir(const char *data_dir); extern "C" my_bool wsrep_on(const MYSQL_THD thd); /* Lock thd wsrep lock */ extern "C" void wsrep_thd_LOCK(const MYSQL_THD thd); +/* Try thd wsrep lock. Return non-zero if lock could not be taken. */ +extern "C" int wsrep_thd_TRYLOCK(const MYSQL_THD thd); /* Unlock thd wsrep lock */ extern "C" void wsrep_thd_UNLOCK(const MYSQL_THD thd); @@ -186,8 +188,6 @@ extern "C" my_bool wsrep_thd_is_local(const MYSQL_THD thd); /* Return true if thd is in high priority mode */ /* todo: rename to is_high_priority() */ extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); -/* set wsrep_aborter for the target THD */ -extern "C" bool wsrep_thd_set_wsrep_aborter(MYSQL_THD bf_thd, MYSQL_THD victim_thd); /* Return true if thd is in TOI mode */ extern "C" my_bool wsrep_thd_is_toi(const MYSQL_THD thd); /* Return true if thd is in replicating TOI mode */ @@ -228,7 +228,6 @@ extern "C" my_bool wsrep_get_debug(); extern "C" void wsrep_commit_ordered(MYSQL_THD thd); extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); -extern "C" bool wsrep_thd_set_wsrep_aborter(MYSQL_THD bf_thd, MYSQL_THD victim_thd); extern "C" void wsrep_report_bf_lock_wait(const THD *thd, unsigned long long trx_id); /* declare parallel applying unsafety for the THD */ diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index ce0e8d986a4..7bd12ba7514 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -19,3 +19,4 @@ galera_var_notify_ssl_ipv6 : MDEV-29861 Galera test case hangs galera_var_notify_cmd: MDEV-29861 Galera test case hangs galera_var_node_address : MDEV-20485 Galera test failure MDEV-26575 : MDEV-29878 Galera test failure on MDEV-26575 +galera_bf_abort_group_commit : MDEV-30855 PR to remove the test exists diff --git a/mysql-test/suite/galera/r/MDEV-29293.result b/mysql-test/suite/galera/r/MDEV-29293.result new file mode 100644 index 00000000000..70c0cc84a31 --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-29293.result @@ -0,0 +1,21 @@ +connection node_2; +connection node_1; +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; +set wsrep_sync_wait = 0; +CREATE TABLE t1(a int not null primary key auto_increment, b int) engine=InnoDB; +INSERT INTO t1 VALUES (1,2); +connection node_1a; +BEGIN; +UPDATE t1 SET b=3 WHERE a=1; +connection node_1; +set debug_sync='wsrep_kill_before_awake_no_mutex SIGNAL before_kill WAIT_FOR continue'; +connection node_1b; +set debug_sync= 'now WAIT_FOR before_kill'; +connection node_2; +UPDATE t1 SET b=7 WHERE a=1; +connection node_1b; +set debug_sync= 'now SIGNAL continue'; +connection node_1; +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; diff --git a/mysql-test/suite/galera/r/galera_create_table_as_select.result b/mysql-test/suite/galera/r/galera_create_table_as_select.result index 6f65ee99f0a..beda5f30fe2 100644 --- a/mysql-test/suite/galera/r/galera_create_table_as_select.result +++ b/mysql-test/suite/galera/r/galera_create_table_as_select.result @@ -82,6 +82,7 @@ connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; LOCK TABLE t2 WRITE; connection node_1; CREATE TABLE t1 AS SELECT * FROM t2;; +connection node_1a; connection node_2; SELECT COUNT(*) = 5 FROM t2; COUNT(*) = 5 diff --git a/mysql-test/suite/galera/r/galera_kill_group_commit.result b/mysql-test/suite/galera/r/galera_kill_group_commit.result new file mode 100644 index 00000000000..bb59ce1486f --- /dev/null +++ b/mysql-test/suite/galera/r/galera_kill_group_commit.result @@ -0,0 +1,27 @@ +connection node_2; +connection node_1; +connect node_1_kill, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect node_1_ctrl, 127.0.0.1, root, , test, $NODE_MYPORT_1; +SET SESSION wsrep_sync_wait = 0; +connect node_1_follower, 127.0.0.1, root, , test, $NODE_MYPORT_1; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; +SET SESSION DEBUG_SYNC = "commit_before_enqueue SIGNAL leader_before_enqueue_reached WAIT_FOR leader_before_enqueue_continue"; +INSERT INTO t1 VALUES (1); +connection node_1_ctrl; +SET DEBUG_SYNC = "now WAIT_FOR leader_before_enqueue_reached"; +connection node_1_follower; +INSERT INTO t1 VALUES (2);; +connection node_1_ctrl; +connection node_1_kill; +# Execute KILL QUERY for group commit follower +SET DEBUG_SYNC = "now SIGNAL leader_before_enqueue_continue"; +connection node_1_follower; +connection node_1; +SELECT * FROM t1; +f1 +1 +2 +SET DEBUG_SYNC = "RESET"; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-29293.test b/mysql-test/suite/galera/t/MDEV-29293.test new file mode 100644 index 00000000000..dacbf714c06 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-29293.test @@ -0,0 +1,41 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +set wsrep_sync_wait = 0; + +CREATE TABLE t1(a int not null primary key auto_increment, b int) engine=InnoDB; +INSERT INTO t1 VALUES (1,2); + +--connection node_1a +--let $victim_id = `SELECT CONNECTION_ID()` +BEGIN; +UPDATE t1 SET b=3 WHERE a=1; + +--connection node_1 +set debug_sync='wsrep_kill_before_awake_no_mutex SIGNAL before_kill WAIT_FOR continue'; +--disable_query_log +--disable_result_log +--send_eval KILL CONNECTION $victim_id +--enable_result_log +--enable_query_log + +--connection node_1b +set debug_sync= 'now WAIT_FOR before_kill'; + +--connection node_2 +UPDATE t1 SET b=7 WHERE a=1; + +--connection node_1b +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE User = 'system user' AND State LIKE 'Update_rows_log_event%'; +--source include/wait_condition.inc +set debug_sync= 'now SIGNAL continue'; + +--connection node_1 +--reap +DROP TABLE t1; +SET DEBUG_SYNC= 'RESET'; + diff --git a/mysql-test/suite/galera/t/galera_create_table_as_select.test b/mysql-test/suite/galera/t/galera_create_table_as_select.test index a6c1f657280..cfee63e5e27 100644 --- a/mysql-test/suite/galera/t/galera_create_table_as_select.test +++ b/mysql-test/suite/galera/t/galera_create_table_as_select.test @@ -113,6 +113,10 @@ LOCK TABLE t2 WRITE; --connection node_1 --send CREATE TABLE t1 AS SELECT * FROM t2; +--connection node_1a +--let $wait_condition = SELECT COUNT(*) = 1 FROM information_schema.processlist WHERE STATE LIKE 'Waiting for table metadata lock%' +--source include/wait_condition.inc + --connection node_2 SELECT COUNT(*) = 5 FROM t2; CREATE TABLE t1 AS SELECT * FROM t2; @@ -121,7 +125,7 @@ CREATE TABLE t1 AS SELECT * FROM t2; UNLOCK TABLES; --connection node_1 ---error ER_TABLE_EXISTS_ERROR,ER_LOCK_DEADLOCK +--error ER_TABLE_EXISTS_ERROR,ER_QUERY_INTERRUPTED --reap DROP TABLE t1, t2; diff --git a/mysql-test/suite/galera/t/galera_kill_group_commit.cnf b/mysql-test/suite/galera/t/galera_kill_group_commit.cnf new file mode 100644 index 00000000000..60f4f776409 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_kill_group_commit.cnf @@ -0,0 +1,5 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin +log-slave-updates diff --git a/mysql-test/suite/galera/t/galera_kill_group_commit.test b/mysql-test/suite/galera/t/galera_kill_group_commit.test new file mode 100644 index 00000000000..4b84f2d90ef --- /dev/null +++ b/mysql-test/suite/galera/t/galera_kill_group_commit.test @@ -0,0 +1,69 @@ +# +# Verify that transaction which has reached group commit queue +# cannot be killed. If the kill succeeds, assertion for +# wsrep transaction state will fail. +# +# If the bug is present, i.e. wsrep transaction gets killed during +# group commit wait, this test is enough to reproduce the crash +# most of the time. +# + +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_cluster.inc + +# Connection for KILL commands +--connect node_1_kill, 127.0.0.1, root, , test, $NODE_MYPORT_1 +# Connection for sync point control +--connect node_1_ctrl, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait = 0; +# Connection for group commit follower +--connect node_1_follower, 127.0.0.1, root, , test, $NODE_MYPORT_1 +# Need to disable sync wait to reach commit queue when leader +# is blocked. +SET SESSION wsrep_sync_wait = 0; +--let $follower_id = `SELECT CONNECTION_ID()` + +--connection node_1 +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +SET SESSION DEBUG_SYNC = "commit_before_enqueue SIGNAL leader_before_enqueue_reached WAIT_FOR leader_before_enqueue_continue"; +--send INSERT INTO t1 VALUES (1) + +--connection node_1_ctrl +SET DEBUG_SYNC = "now WAIT_FOR leader_before_enqueue_reached"; + +--connection node_1_follower +# SET SESSION DEBUG_SYNC = "group_commit_waiting_for_prior SIGNAL follower_waiting_for_prior_reached WAIT_FOR follower_waiting_for_prior_continue"; +--send INSERT INTO t1 VALUES (2); + +--connection node_1_ctrl +# TODO: Is it possible to use sync points to enforce group commit to happen? +# The leader will hold commit monitor in commit_before_enqueue sync point, +# which prevents the follower to reach the group commit wait state. +# We now sleep and expect the follower to reach group commit, but this +# may cause false negatives. +--sleep 1 + +--connection node_1_kill +--echo # Execute KILL QUERY for group commit follower +--disable_query_log +--disable_result_log +# Because it is currently impossible to verify that the +# follower has reached group commit queue, the KILL may +# sometimes return success. +--error 0,ER_KILL_DENIED_ERROR +--eval KILL QUERY $follower_id +--enable_result_log +--enable_query_log + +SET DEBUG_SYNC = "now SIGNAL leader_before_enqueue_continue"; +--connection node_1_follower +--reap + +--connection node_1 +--reap +SELECT * FROM t1; + +SET DEBUG_SYNC = "RESET"; +DROP TABLE t1; diff --git a/sql/handler.cc b/sql/handler.cc index 455a5e509c8..f7d781eb82f 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -7170,6 +7170,9 @@ Compare_keys handler::compare_key_parts(const Field &old_field, concurrent accesses. And it's an overkill to take LOCK_plugin and iterate the whole installed_htons[] array every time. + @note Object victim_thd is not guaranteed to exist after this + function returns. + @param bf_thd brute force THD asking for the abort @param victim_thd victim THD to be aborted @@ -7183,6 +7186,8 @@ int ha_abort_transaction(THD *bf_thd, THD *victim_thd, my_bool signal) if (!WSREP(bf_thd) && !(bf_thd->variables.wsrep_OSU_method == WSREP_OSU_RSU && wsrep_thd_is_toi(bf_thd))) { + mysql_mutex_unlock(&victim_thd->LOCK_thd_data); + mysql_mutex_unlock(&victim_thd->LOCK_thd_kill); DBUG_RETURN(0); } @@ -7194,6 +7199,8 @@ int ha_abort_transaction(THD *bf_thd, THD *victim_thd, my_bool signal) else { WSREP_WARN("Cannot abort InnoDB transaction"); + mysql_mutex_unlock(&victim_thd->LOCK_thd_data); + mysql_mutex_unlock(&victim_thd->LOCK_thd_kill); } DBUG_RETURN(0); diff --git a/sql/service_wsrep.cc b/sql/service_wsrep.cc index 722c22809de..6a2ee1dd3db 100644 --- a/sql/service_wsrep.cc +++ b/sql/service_wsrep.cc @@ -29,14 +29,17 @@ extern "C" my_bool wsrep_on(const THD *thd) extern "C" void wsrep_thd_LOCK(const THD *thd) { - mysql_mutex_lock(&thd->LOCK_thd_kill); mysql_mutex_lock(&thd->LOCK_thd_data); } +extern "C" int wsrep_thd_TRYLOCK(const THD *thd) +{ + return mysql_mutex_trylock(&thd->LOCK_thd_data); +} + extern "C" void wsrep_thd_UNLOCK(const THD *thd) { mysql_mutex_unlock(&thd->LOCK_thd_data); - mysql_mutex_unlock(&thd->LOCK_thd_kill); } extern "C" void wsrep_thd_kill_LOCK(const THD *thd) @@ -249,21 +252,13 @@ extern "C" my_bool wsrep_thd_bf_abort(THD *bf_thd, THD *victim_thd, if ((ret || !wsrep_on(victim_thd)) && signal) { - if (victim_thd->wsrep_aborter && victim_thd->wsrep_aborter != bf_thd->thread_id) - { - WSREP_DEBUG("victim is killed already by %llu, skipping awake", - victim_thd->wsrep_aborter); - wsrep_thd_UNLOCK(victim_thd); - return false; - } - victim_thd->wsrep_aborter= bf_thd->thread_id; victim_thd->awake_no_mutex(KILL_QUERY); } else - WSREP_DEBUG("wsrep_thd_bf_abort skipped awake for %llu", thd_get_thread_id(victim_thd)); + WSREP_DEBUG("wsrep_thd_bf_abort skipped awake for %llu", + thd_get_thread_id(victim_thd)); - wsrep_thd_UNLOCK(victim_thd); return ret; } @@ -349,25 +344,6 @@ extern "C" void wsrep_commit_ordered(THD *thd) } } -extern "C" bool wsrep_thd_set_wsrep_aborter(THD *bf_thd, THD *victim_thd) -{ - mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); - if (!bf_thd) - { - victim_thd->wsrep_aborter= 0; - WSREP_DEBUG("wsrep_thd_set_wsrep_aborter resetting wsrep_aborter"); - return false; - } - if (victim_thd->wsrep_aborter && victim_thd->wsrep_aborter != bf_thd->thread_id) - { - return true; - } - victim_thd->wsrep_aborter= bf_thd->thread_id; - WSREP_DEBUG("wsrep_thd_set_wsrep_aborter setting wsrep_aborter %u", - victim_thd->wsrep_aborter); - return false; -} - extern "C" void wsrep_report_bf_lock_wait(const THD *thd, unsigned long long trx_id) { diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 73bb654080a..dc58d2a250a 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1279,6 +1279,11 @@ void THD::init() m_wsrep_next_trx_id = WSREP_UNDEFINED_TRX_ID; wsrep_replicate_GTID = false; wsrep_aborter = 0; + wsrep_abort_by_kill = NOT_KILLED; + wsrep_abort_by_kill_err = 0; +#ifndef DBUG_OFF + wsrep_killed_state = 0; +#endif /* DBUG_OFF */ wsrep_desynced_backup_stage= false; #endif /* WITH_WSREP */ @@ -1637,6 +1642,13 @@ void THD::reset_for_reuse() #endif #ifdef WITH_WSREP wsrep_free_status(this); + wsrep_cs().reset_error(); + wsrep_aborter= 0; + wsrep_abort_by_kill= NOT_KILLED; + wsrep_abort_by_kill_err= 0; +#ifndef DBUG_OFF + wsrep_killed_state= 0; +#endif /* DBUG_OFF */ #endif /* WITH_WSREP */ } @@ -1886,7 +1898,9 @@ void THD::awake_no_mutex(killed_state state_to_set) } /* Interrupt target waiting inside a storage engine. */ - if (state_to_set != NOT_KILLED && !wsrep_is_bf_aborted(this)) + if (state_to_set != NOT_KILLED && + IF_WSREP(!wsrep_is_bf_aborted(this) && wsrep_abort_by_kill == NOT_KILLED, + true)) ha_kill_query(this, thd_kill_level(this)); abort_current_cond_wait(false); @@ -2128,6 +2142,17 @@ void THD::reset_killed() mysql_mutex_unlock(&LOCK_thd_kill); } #ifdef WITH_WSREP + if (WSREP_NNULL(this)) + { + if (wsrep_abort_by_kill != NOT_KILLED) + { + mysql_mutex_assert_not_owner(&LOCK_thd_kill); + mysql_mutex_lock(&LOCK_thd_kill); + wsrep_abort_by_kill= NOT_KILLED; + wsrep_abort_by_kill_err= 0; + mysql_mutex_unlock(&LOCK_thd_kill); + } + } mysql_mutex_assert_not_owner(&LOCK_thd_data); mysql_mutex_lock(&LOCK_thd_data); wsrep_aborter= 0; diff --git a/sql/sql_class.h b/sql/sql_class.h index d0c3e0244e7..4e5aba33443 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -4982,7 +4982,14 @@ public: bool wsrep_ignore_table; /* thread who has started kill for this THD protected by LOCK_thd_data*/ my_thread_id wsrep_aborter; - + /* Kill signal used, if thread was killed by manual KILL. Protected by + LOCK_thd_kill. */ + std::atomic wsrep_abort_by_kill; + /* */ + struct err_info* wsrep_abort_by_kill_err; +#ifndef DBUG_OFF + int wsrep_killed_state; +#endif /* DBUG_OFF */ /* true if BF abort is observed in do_command() right after reading client's packet, and if the client has sent PS execute command. */ bool wsrep_delayed_BF_abort; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 48d4f0cbd55..473b23fd20c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -7848,7 +7848,7 @@ static bool wsrep_mysql_parse(THD *thd, char *rawbuf, uint length, thd->wsrep_retry_counter < thd->variables.wsrep_retry_autocommit) { #ifdef ENABLED_DEBUG_SYNC - DBUG_EXECUTE_IF("sync.wsrep_retry_autocommit", + DBUG_EXECUTE_IF("sync.wsrep_retry_autocommit", { const char act[]= "now " @@ -9212,21 +9212,15 @@ kill_one_thread(THD *thd, my_thread_id id, killed_state kill_signal, killed_type thd->security_ctx->user_matches(tmp->security_ctx)) #endif /* WITH_WSREP */ { + { #ifdef WITH_WSREP - DEBUG_SYNC(thd, "before_awake_no_mutex"); - if (tmp->wsrep_aborter && tmp->wsrep_aborter != thd->thread_id) - { - /* victim is in hit list already, bail out */ - WSREP_DEBUG("victim %lld has wsrep aborter: %lu, skipping awake()", - id, tmp->wsrep_aborter); - error= 0; - } - else + if (WSREP(tmp)) + { + /* Object tmp is not guaranteed to exist after wsrep_kill_thd() + returns, so do early return from this function. */ + DBUG_RETURN(wsrep_kill_thd(thd, tmp, kill_signal)); + } #endif /* WITH_WSREP */ - { - WSREP_DEBUG("kill_one_thread victim: %lld wsrep_aborter %lu" - " by signal %d", - id, tmp->wsrep_aborter, kill_signal); tmp->awake_no_mutex(kill_signal); error= 0; } @@ -9350,18 +9344,6 @@ static void sql_kill(THD *thd, my_thread_id id, killed_state state, killed_type type) { uint error; -#ifdef WITH_WSREP - if (WSREP(thd)) - { - WSREP_DEBUG("sql_kill called"); - if (thd->wsrep_applier) - { - WSREP_DEBUG("KILL in applying, bailing out here"); - return; - } - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) - } -#endif /* WITH_WSREP */ if (likely(!(error= kill_one_thread(thd, id, state, type)))) { if (!thd->killed) @@ -9371,13 +9353,6 @@ void sql_kill(THD *thd, my_thread_id id, killed_state state, killed_type type) } else my_error(error, MYF(0), id); -#ifdef WITH_WSREP - return; - wsrep_error_label: - error= (type == KILL_TYPE_QUERY ? ER_KILL_QUERY_DENIED_ERROR : - ER_KILL_DENIED_ERROR); - my_error(error, MYF(0), (long long) id); -#endif /* WITH_WSREP */ } @@ -9386,18 +9361,6 @@ void sql_kill_user(THD *thd, LEX_USER *user, killed_state state) { uint error; ha_rows rows; -#ifdef WITH_WSREP - if (WSREP(thd)) - { - WSREP_DEBUG("sql_kill_user called"); - if (thd->wsrep_applier) - { - WSREP_DEBUG("KILL in applying, bailing out here"); - return; - } - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) - } -#endif /* WITH_WSREP */ switch (error= kill_threads_for_user(thd, user, state, &rows)) { case 0: @@ -9413,11 +9376,6 @@ void sql_kill_user(THD *thd, LEX_USER *user, killed_state state) default: my_error(error, MYF(0)); } -#ifdef WITH_WSREP - return; - wsrep_error_label: - my_error(ER_CANNOT_USER, MYF(0), user ? user->user.str : "NULL"); -#endif /* WITH_WSREP */ } diff --git a/sql/sql_plugin_services.inl b/sql/sql_plugin_services.inl index 60ba38eae61..519a21ee9c6 100644 --- a/sql/sql_plugin_services.inl +++ b/sql/sql_plugin_services.inl @@ -150,6 +150,7 @@ static struct wsrep_service_st wsrep_handler = { wsrep_on, wsrep_prepare_key_for_innodb, wsrep_thd_LOCK, + wsrep_thd_TRYLOCK, wsrep_thd_UNLOCK, wsrep_thd_query, wsrep_thd_retry_counter, @@ -173,7 +174,6 @@ static struct wsrep_service_st wsrep_handler = { wsrep_get_debug, wsrep_commit_ordered, wsrep_thd_is_applying, - wsrep_thd_set_wsrep_aborter, wsrep_report_bf_lock_wait, wsrep_thd_kill_LOCK, wsrep_thd_kill_UNLOCK, diff --git a/sql/wsrep_dummy.cc b/sql/wsrep_dummy.cc index 83bf4778d10..60e4449c9b8 100644 --- a/sql/wsrep_dummy.cc +++ b/sql/wsrep_dummy.cc @@ -56,6 +56,11 @@ my_bool wsrep_on(const THD *) void wsrep_thd_LOCK(const THD *) { } +int wsrep_thd_TRYLOCK(const THD *) +{ + return 0; +} + void wsrep_thd_UNLOCK(const THD *) { } @@ -141,9 +146,6 @@ void wsrep_log(void (*)(const char *, ...), const char *, ...) my_bool wsrep_thd_is_applying(const THD*) { return 0;} -bool wsrep_thd_set_wsrep_aborter(THD*, THD*) -{ return 0;} - void wsrep_report_bf_lock_wait(const THD*, unsigned long long) {} diff --git a/sql/wsrep_high_priority_service.cc b/sql/wsrep_high_priority_service.cc index 3c6524b7ddf..4874da51673 100644 --- a/sql/wsrep_high_priority_service.cc +++ b/sql/wsrep_high_priority_service.cc @@ -480,6 +480,7 @@ int Wsrep_high_priority_service::log_dummy_write_set(const wsrep::ws_handle& ws_ m_thd->wait_for_prior_commit(); } + WSREP_DEBUG("checkpointing dummy write set %lld", ws_meta.seqno().get()); wsrep_set_SE_checkpoint(ws_meta.gtid()); if (!WSREP_EMULATE_BINLOG(m_thd)) diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index a898b554a78..903ed56d948 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -2053,11 +2053,6 @@ static int wsrep_TOI_event_buf(THD* thd, uchar** buf, size_t* buf_len) case SQLCOM_DROP_TABLE: err= wsrep_drop_table_query(thd, buf, buf_len); break; - case SQLCOM_KILL: - WSREP_DEBUG("KILL as TOI: %s", thd->query()); - err= wsrep_to_buf_helper(thd, thd->query(), thd->query_length(), - buf, buf_len); - break; case SQLCOM_CREATE_ROLE: if (sp_process_definer(thd)) { @@ -2440,8 +2435,15 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, /* Here we will call wsrep_abort_transaction so we should hold THD::LOCK_thd_data to protect victim from concurrent usage - and THD::LOCK_thd_kill to protect from disconnect or delete. */ - wsrep_thd_LOCK(granted_thd); + and THD::LOCK_thd_kill to protect from disconnect or delete. + + Note that all calls to wsrep_abort_thd() and ha_abort_transaction() + unlock LOCK_thd_kill for granted_thd, so granted_thd must not be + accessed after any of those calls. Moreover all other if branches + must release those locks. + */ + mysql_mutex_lock(&granted_thd->LOCK_thd_kill); + mysql_mutex_lock(&granted_thd->LOCK_thd_data); if (wsrep_thd_is_toi(granted_thd) || wsrep_thd_is_applying(granted_thd)) @@ -2450,22 +2452,22 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, { WSREP_DEBUG("BF thread waiting for SR in aborting state"); ticket->wsrep_report(wsrep_debug); - wsrep_thd_UNLOCK(granted_thd); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); + mysql_mutex_unlock(&granted_thd->LOCK_thd_kill); } else if (wsrep_thd_is_SR(granted_thd) && !wsrep_thd_is_SR(request_thd)) { WSREP_MDL_LOG(INFO, "MDL conflict, DDL vs SR", schema, schema_len, request_thd, granted_thd); wsrep_abort_thd(request_thd, granted_thd, 1); - mysql_mutex_assert_not_owner(&granted_thd->LOCK_thd_data); - mysql_mutex_assert_not_owner(&granted_thd->LOCK_thd_kill); } else { WSREP_MDL_LOG(INFO, "MDL BF-BF conflict", schema, schema_len, request_thd, granted_thd); ticket->wsrep_report(true); - wsrep_thd_UNLOCK(granted_thd); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); + mysql_mutex_unlock(&granted_thd->LOCK_thd_kill); unireg_abort(1); } } @@ -2474,7 +2476,8 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, { WSREP_DEBUG("BF thread waiting for FLUSH"); ticket->wsrep_report(wsrep_debug); - wsrep_thd_UNLOCK(granted_thd); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); + mysql_mutex_unlock(&granted_thd->LOCK_thd_kill); } else if (request_thd->lex->sql_command == SQLCOM_DROP_TABLE) { @@ -2482,8 +2485,6 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, wsrep_thd_transaction_state_str(granted_thd)); ticket->wsrep_report(wsrep_debug); wsrep_abort_thd(request_thd, granted_thd, 1); - mysql_mutex_assert_not_owner(&granted_thd->LOCK_thd_data); - mysql_mutex_assert_not_owner(&granted_thd->LOCK_thd_kill); } else { @@ -2493,8 +2494,6 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, if (granted_thd->wsrep_trx().active()) { wsrep_abort_thd(request_thd, granted_thd, true); - mysql_mutex_assert_not_owner(&granted_thd->LOCK_thd_data); - mysql_mutex_assert_not_owner(&granted_thd->LOCK_thd_kill); } else { @@ -2504,15 +2503,16 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, */ if (wsrep_thd_is_BF(request_thd, FALSE)) { + granted_thd->awake_no_mutex(KILL_QUERY_HARD); ha_abort_transaction(request_thd, granted_thd, TRUE); - mysql_mutex_assert_not_owner(&granted_thd->LOCK_thd_data); - mysql_mutex_assert_not_owner(&granted_thd->LOCK_thd_kill); } else { WSREP_MDL_LOG(INFO, "MDL unknown BF-BF conflict", schema, schema_len, request_thd, granted_thd); ticket->wsrep_report(true); + mysql_mutex_unlock(&granted_thd->LOCK_thd_data); + mysql_mutex_unlock(&granted_thd->LOCK_thd_kill); unireg_abort(1); } } @@ -2528,17 +2528,22 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, static bool abort_replicated(THD *thd) { bool ret_code= false; + wsrep_thd_kill_LOCK(thd); wsrep_thd_LOCK(thd); if (thd->wsrep_trx().state() == wsrep::transaction::s_committing) { WSREP_DEBUG("aborting replicated trx: %llu", (ulonglong)(thd->real_id)); - (void)wsrep_abort_thd(thd, thd, TRUE); + wsrep_abort_thd(thd, thd, TRUE); ret_code= true; } else + { + /* wsrep_abort_thd() above releases LOCK_thd_data and LOCK_thd_kill, so + must do it here too. */ wsrep_thd_UNLOCK(thd); - + wsrep_thd_kill_UNLOCK(thd); + } return ret_code; } diff --git a/sql/wsrep_server_service.cc b/sql/wsrep_server_service.cc index cf6f76cf02e..71f5d20feba 100644 --- a/sql/wsrep_server_service.cc +++ b/sql/wsrep_server_service.cc @@ -143,9 +143,13 @@ void Wsrep_server_service::release_high_priority_service(wsrep::high_priority_se wsrep_delete_threadvars(); } -void Wsrep_server_service::background_rollback(wsrep::client_state& client_state) +void Wsrep_server_service::background_rollback( + wsrep::unique_lock &lock WSREP_UNUSED, + wsrep::client_state &client_state) { - Wsrep_client_state& cs= static_cast(client_state); + DBUG_ASSERT(lock.owns_lock()); + Wsrep_client_state &cs= static_cast(client_state); + mysql_mutex_assert_owner(&cs.thd()->LOCK_thd_data); wsrep_fire_rollbacker(cs.thd()); } diff --git a/sql/wsrep_server_service.h b/sql/wsrep_server_service.h index 168e98206e3..0fc48402024 100644 --- a/sql/wsrep_server_service.h +++ b/sql/wsrep_server_service.h @@ -46,7 +46,8 @@ public: void release_high_priority_service(wsrep::high_priority_service*); - void background_rollback(wsrep::client_state&); + void background_rollback(wsrep::unique_lock &, + wsrep::client_state &); void bootstrap(); void log_message(enum wsrep::log::level, const char*); diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index 05c96491906..950c1528141 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -307,50 +307,9 @@ void wsrep_fire_rollbacker(THD *thd) } } - -int wsrep_abort_thd(THD *bf_thd, - THD *victim_thd, - my_bool signal) +static bool wsrep_bf_abort_low(THD *bf_thd, THD *victim_thd) { - DBUG_ENTER("wsrep_abort_thd"); - mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); - mysql_mutex_assert_owner(&victim_thd->LOCK_thd_kill); - - /* Note that when you use RSU node is desynced from cluster, thus WSREP(thd) - might not be true. - */ - if ((WSREP(bf_thd) || - ((WSREP_ON || bf_thd->variables.wsrep_OSU_method == WSREP_OSU_RSU) && - wsrep_thd_is_toi(bf_thd))) && - !wsrep_thd_is_aborting(victim_thd)) - { - WSREP_DEBUG("wsrep_abort_thd, by: %llu, victim: %llu", - (long long)bf_thd->real_id, (long long)victim_thd->real_id); - ha_abort_transaction(bf_thd, victim_thd, signal); - } - else - { - WSREP_DEBUG("wsrep_abort_thd not effective: bf %llu victim %llu " - "wsrep %d wsrep_on %d RSU %d TOI %d aborting %d", - (long long)bf_thd->real_id, (long long)victim_thd->real_id, - WSREP_NNULL(bf_thd), WSREP_ON, - bf_thd->variables.wsrep_OSU_method == WSREP_OSU_RSU, - wsrep_thd_is_toi(bf_thd), - wsrep_thd_is_aborting(victim_thd)); - wsrep_thd_UNLOCK(victim_thd); - } - - DBUG_RETURN(1); -} - -bool wsrep_bf_abort(THD* bf_thd, THD* victim_thd) -{ - WSREP_LOG_THD(bf_thd, "BF aborter before"); - WSREP_LOG_THD(victim_thd, "victim before"); - - mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); - mysql_mutex_assert_owner(&victim_thd->LOCK_thd_kill); #ifdef ENABLED_DEBUG_SYNC DBUG_EXECUTE_IF("sync.wsrep_bf_abort", @@ -364,6 +323,87 @@ bool wsrep_bf_abort(THD* bf_thd, THD* victim_thd) };); #endif + wsrep::seqno bf_seqno(bf_thd->wsrep_trx().ws_meta().seqno()); + bool ret; + + { + /* Adopt the lock, it is being held by the caller. */ + Wsrep_mutex wsm{&victim_thd->LOCK_thd_data}; + wsrep::unique_lock lock{wsm, std::adopt_lock}; + + if (wsrep_thd_is_toi(bf_thd)) + { + ret= victim_thd->wsrep_cs().total_order_bf_abort(lock, bf_seqno); + } + else + { + DBUG_ASSERT(WSREP(victim_thd) ? victim_thd->wsrep_trx().active() : 1); + ret= victim_thd->wsrep_cs().bf_abort(lock, bf_seqno); + } + if (ret) + { + /* BF abort should be allowed only once by wsrep-lib.*/ + DBUG_ASSERT(victim_thd->wsrep_aborter == 0); + victim_thd->wsrep_aborter= bf_thd->thread_id; + wsrep_bf_aborts_counter++; + } + lock.release(); /* No unlock at the end of the scope. */ + } + + /* Sanity check for wsrep-lib calls to return with LOCK_thd_data held. */ + mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); + + return ret; +} + + +void wsrep_abort_thd(THD *bf_thd, + THD *victim_thd, + my_bool signal) +{ + DBUG_ENTER("wsrep_abort_thd"); + + mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); + mysql_mutex_assert_owner(&victim_thd->LOCK_thd_kill); + + /* Note that when you use RSU node is desynced from cluster, thus WSREP(thd) + might not be true. + */ + if ((WSREP(bf_thd) + || ((WSREP_ON || bf_thd->variables.wsrep_OSU_method == WSREP_OSU_RSU) + && wsrep_thd_is_toi(bf_thd))) + && !wsrep_thd_is_aborting(victim_thd) && + wsrep_bf_abort_low(bf_thd, victim_thd) && + !victim_thd->wsrep_cs().is_rollbacker_active()) + { + WSREP_DEBUG("wsrep_abort_thd, by: %llu, victim: %llu", + (long long)bf_thd->real_id, (long long)victim_thd->real_id); + victim_thd->awake_no_mutex(KILL_QUERY_HARD); + ha_abort_transaction(bf_thd, victim_thd, signal); + } + else + { + WSREP_DEBUG("wsrep_abort_thd not effective: bf %llu victim %llu " + "wsrep %d wsrep_on %d RSU %d TOI %d aborting %d", + (long long)bf_thd->real_id, (long long)victim_thd->real_id, + WSREP_NNULL(bf_thd), WSREP_ON, + bf_thd->variables.wsrep_OSU_method == WSREP_OSU_RSU, + wsrep_thd_is_toi(bf_thd), + wsrep_thd_is_aborting(victim_thd)); + mysql_mutex_unlock(&victim_thd->LOCK_thd_data); + mysql_mutex_unlock(&victim_thd->LOCK_thd_kill); + } + + DBUG_VOID_RETURN; +} + +bool wsrep_bf_abort(THD* bf_thd, THD* victim_thd) +{ + WSREP_LOG_THD(bf_thd, "BF aborter before"); + WSREP_LOG_THD(victim_thd, "victim before"); + + mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); + if (WSREP(victim_thd) && !victim_thd->wsrep_trx().active()) { WSREP_DEBUG("wsrep_bf_abort, BF abort for non active transaction"); @@ -385,32 +425,81 @@ bool wsrep_bf_abort(THD* bf_thd, THD* victim_thd) mysql_mutex_lock(&victim_thd->LOCK_thd_data); } - bool ret; - wsrep::seqno bf_seqno(bf_thd->wsrep_trx().ws_meta().seqno()); + return wsrep_bf_abort_low(bf_thd, victim_thd); +} - if (wsrep_thd_is_toi(bf_thd)) +uint wsrep_kill_thd(THD *thd, THD *victim_thd, killed_state kill_signal) +{ + DBUG_ENTER("wsrep_kill_thd"); + DBUG_ASSERT(WSREP(victim_thd)); + mysql_mutex_assert_owner(&victim_thd->LOCK_thd_kill); + mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); + using trans= wsrep::transaction; + auto trx_state= victim_thd->wsrep_trx().state(); +#ifndef DBUG_OFF + victim_thd->wsrep_killed_state= trx_state; +#endif /* DBUG_OFF */ + /* + Already killed or in commit codepath. Mark the victim as killed, + the killed status will be restored in wsrep_after_commit() and + will be processed after the commit is over. In case of multiple + KILLs happened on commit codepath, the last one will be effective. + */ + if (victim_thd->wsrep_abort_by_kill || + trx_state == trans::s_preparing || + trx_state == trans::s_committing || + trx_state == trans::s_ordered_commit) { - /* Here we enter wsrep-lib were LOCK_thd_data will be acquired, - thus we need to release it. However, we can still hold - LOCK_thd_kill to protect from disconnect or delete. */ + victim_thd->wsrep_abort_by_kill= kill_signal; mysql_mutex_unlock(&victim_thd->LOCK_thd_data); - ret= victim_thd->wsrep_cs().total_order_bf_abort(bf_seqno); - mysql_mutex_lock(&victim_thd->LOCK_thd_data); + mysql_mutex_unlock(&victim_thd->LOCK_thd_kill); + DBUG_RETURN(0); } - else + /* + Mark killed victim_thd with kill_signal so that awake_no_mutex does + not dive into storage engine. We use ha_abort_transaction() + to do the storage engine part for wsrep THDs. + */ + DEBUG_SYNC(thd, "wsrep_kill_before_awake_no_mutex"); + victim_thd->wsrep_abort_by_kill= kill_signal; + victim_thd->awake_no_mutex(kill_signal); + /* ha_abort_transaction() releases tmp->LOCK_thd_kill, so tmp + is not safe to access anymore. */ + ha_abort_transaction(thd, victim_thd, 1); + DBUG_RETURN(0); +} + +void wsrep_backup_kill_for_commit(THD *thd) +{ + DBUG_ASSERT(WSREP(thd)); + mysql_mutex_assert_owner(&thd->LOCK_thd_kill); + DBUG_ASSERT(thd->killed != NOT_KILLED); + mysql_mutex_lock(&thd->LOCK_thd_data); + /* If the transaction will roll back, keep the killed state. + For must replay, the replay will happen in different THD context + which is high priority and cannot be killed. The owning thread will + pick the killed state in after statement processing. */ + if (thd->wsrep_trx().state() != wsrep::transaction::s_cert_failed && + thd->wsrep_trx().state() != wsrep::transaction::s_must_abort && + thd->wsrep_trx().state() != wsrep::transaction::s_aborting && + thd->wsrep_trx().state() != wsrep::transaction::s_must_replay) { - /* Test: mysql-wsrep-features#165. Here we enter wsrep-lib - were LOCK_thd_data will be acquired and later LOCK_thd_kill - thus we need to release them. */ - wsrep_thd_UNLOCK(victim_thd); - ret= victim_thd->wsrep_cs().bf_abort(bf_seqno); - wsrep_thd_LOCK(victim_thd); + thd->wsrep_abort_by_kill= thd->killed; + thd->wsrep_abort_by_kill_err= thd->killed_err; + thd->killed= NOT_KILLED; + thd->killed_err= 0; } - if (ret) - { - wsrep_bf_aborts_counter++; - } - return ret; + mysql_mutex_unlock(&thd->LOCK_thd_data); +} + +void wsrep_restore_kill_after_commit(THD *thd) +{ + DBUG_ASSERT(WSREP(thd)); + mysql_mutex_assert_owner(&thd->LOCK_thd_kill); + thd->killed= thd->wsrep_abort_by_kill; + thd->killed_err= thd->wsrep_abort_by_kill_err; + thd->wsrep_abort_by_kill= NOT_KILLED; + thd->wsrep_abort_by_kill_err= 0; } int wsrep_create_threadvars() diff --git a/sql/wsrep_thd.h b/sql/wsrep_thd.h index a17de084c93..488268bde69 100644 --- a/sql/wsrep_thd.h +++ b/sql/wsrep_thd.h @@ -88,10 +88,44 @@ bool wsrep_create_appliers(long threads, bool mutex_protected=false); void wsrep_create_rollbacker(); bool wsrep_bf_abort(THD* bf_thd, THD* victim_thd); -int wsrep_abort_thd(THD *bf_thd, +/* + Abort transaction for victim_thd. This function is called from + MDL BF abort codepath. + + @note This thread unlocks victim_thd->LOCK_thd_kill, so accessing + victim_thd after the function returns is not safe anymore. +*/ +void wsrep_abort_thd(THD *bf_thd, THD *victim_thd, my_bool signal) __attribute__((nonnull(1,2))); +/** + Kill wsrep connection with kill_signal. Object thd is not + guaranteed to exist anymore when this function returns. + + Asserts that the caller holds victim_thd->LOCK_thd_kill, + victim_thd->LOCK_thd_data. + + Releases victim_thd->LOCK_thd_kill, victim_thd->LOCK_thd_data. + + @param thd THD object for connection that executes the KILL. + @param victim_thd THD object for connection to be killed. + @param kill_signal Kill signal. + + @return Zero if the kill was successful, otherwise non-zero error code. + */ +uint wsrep_kill_thd(THD *thd, THD *victim_thd, killed_state kill_signal); + +/* + Backup kill status for commit. + */ +void wsrep_backup_kill_for_commit(THD *); + +/* + Restore KILL status after commit. + */ +void wsrep_restore_kill_after_commit(THD *); + /* Helper methods to deal with thread local storage. The purpose of these methods is to hide the details of thread diff --git a/sql/wsrep_trans_observer.h b/sql/wsrep_trans_observer.h index 2d5e4d3a1f2..83079d5a083 100644 --- a/sql/wsrep_trans_observer.h +++ b/sql/wsrep_trans_observer.h @@ -252,6 +252,11 @@ static inline int wsrep_before_prepare(THD* thd, bool all) wsrep_xid_init(&thd->wsrep_xid, thd->wsrep_trx().ws_meta().gtid()); } + + mysql_mutex_lock(&thd->LOCK_thd_kill); + if (thd->killed) wsrep_backup_kill_for_commit(thd); + mysql_mutex_unlock(&thd->LOCK_thd_kill); + DBUG_RETURN(ret); } @@ -294,6 +299,11 @@ static inline int wsrep_before_commit(THD* thd, bool all) thd->wsrep_trx().ws_meta().gtid()); wsrep_register_for_group_commit(thd); } + + mysql_mutex_lock(&thd->LOCK_thd_kill); + if (thd->killed) wsrep_backup_kill_for_commit(thd); + mysql_mutex_unlock(&thd->LOCK_thd_kill); + DBUG_RETURN(ret); } @@ -314,7 +324,8 @@ static inline int wsrep_ordered_commit(THD* thd, const wsrep_apply_error&) { DBUG_ENTER("wsrep_ordered_commit"); - WSREP_DEBUG("wsrep_ordered_commit: %d", wsrep_is_real(thd, all)); + WSREP_DEBUG("wsrep_ordered_commit: %d %lld", wsrep_is_real(thd, all), + (long long) wsrep_thd_trx_seqno(thd)); DBUG_ASSERT(wsrep_run_commit_hook(thd, all)); DBUG_RETURN(thd->wsrep_cs().ordered_commit()); } @@ -420,9 +431,16 @@ int wsrep_after_statement(THD* thd) wsrep::to_c_string(thd->wsrep_cs().mode()), wsrep::to_c_string(thd->wsrep_cs().transaction().state()), wsrep_thd_query(thd)); - DBUG_RETURN((thd->wsrep_cs().state() != wsrep::client_state::s_none && - thd->wsrep_cs().mode() == Wsrep_client_state::m_local) ? - thd->wsrep_cs().after_statement() : 0); + int ret= ((thd->wsrep_cs().state() != wsrep::client_state::s_none && + thd->wsrep_cs().mode() == Wsrep_client_state::m_local) ? + thd->wsrep_cs().after_statement() : 0); + if (wsrep_is_active(thd)) + { + mysql_mutex_lock(&thd->LOCK_thd_kill); + wsrep_restore_kill_after_commit(thd); + mysql_mutex_unlock(&thd->LOCK_thd_kill); + } + DBUG_RETURN(ret); } static inline void wsrep_after_apply(THD* thd) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index c4a23a95d85..3a787da3fa8 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -18678,50 +18678,6 @@ static struct st_mysql_storage_engine innobase_storage_engine= #ifdef WITH_WSREP -static -void -wsrep_kill_victim( - MYSQL_THD const bf_thd, - MYSQL_THD thd, - trx_t* victim_trx, - my_bool signal) -{ - DBUG_ENTER("wsrep_kill_victim"); - - /* Mark transaction as a victim for Galera abort */ - victim_trx->lock.was_chosen_as_wsrep_victim= true; - if (wsrep_thd_set_wsrep_aborter(bf_thd, thd)) - { - WSREP_DEBUG("innodb kill transaction skipped due to wsrep_aborter set"); - wsrep_thd_UNLOCK(thd); - DBUG_VOID_RETURN; - } - - if (wsrep_thd_bf_abort(bf_thd, thd, signal)) - { - lock_t* wait_lock= victim_trx->lock.wait_lock; - if (wait_lock) - { - DBUG_ASSERT(victim_trx->is_wsrep()); - WSREP_DEBUG("victim has wait flag: %lu", thd_get_thread_id(thd)); - victim_trx->lock.was_chosen_as_deadlock_victim= TRUE; - lock_cancel_waiting_and_release(wait_lock); - } - } - else - { - wsrep_thd_LOCK(thd); - victim_trx->lock.was_chosen_as_wsrep_victim= false; - wsrep_thd_set_wsrep_aborter(NULL, thd); - wsrep_thd_UNLOCK(thd); - - WSREP_DEBUG("wsrep_thd_bf_abort has failed, victim %lu will survive", - thd_get_thread_id(thd)); - } - - DBUG_VOID_RETURN; -} - /** This function is used to kill one transaction. This transaction was open on this node (not-yet-committed), and a @@ -18768,10 +18724,45 @@ wsrep_innobase_kill_one_trx( DBUG_VOID_RETURN; } - /* Here we need to lock THD::LOCK_thd_data to protect from - concurrent usage or disconnect or delete. */ + /* Grab reference to victim_trx before releasing the mutex, this will + prevent victim to release locks or commit while the mutex is + unlocked. The state may change to TRX_STATE_COMMITTED_IN_MEMORY. + See skip_lock_inheritance_n_ref in trx0trx.h. */ + const trx_id_t victim_trx_id= victim_trx->id; +retry_lock: + victim_trx->reference(); + trx_mutex_exit(victim_trx); + DEBUG_SYNC(bf_thd, "wsrep_before_BF_victim_lock"); - wsrep_thd_LOCK(thd); + wsrep_thd_kill_LOCK(thd); + /* + There is now a cycle + + trx reference + -> LOCK_commit_order + -> LOCK_thd_data + -> trx reference + + which may prevent the transaction committing because reference was grabbed + above. Try to lock LOCK_thd_data, and if not successul, enter the + trx mutex again to release the reference and try again. + */ + if (wsrep_thd_TRYLOCK(thd)) + { + wsrep_thd_kill_UNLOCK(thd); + trx_mutex_enter(victim_trx); + victim_trx->release_reference(); + if (victim_trx_id != victim_trx->id || + victim_trx->state == TRX_STATE_COMMITTED_IN_MEMORY || + victim_trx->state == TRX_STATE_NOT_STARTED) + { + WSREP_DEBUG("wsrep_innobase_kill_one_trx: Victim committed in memory"); + DBUG_VOID_RETURN; + } + goto retry_lock; + } + + DEBUG_SYNC(bf_thd, "wsrep_after_BF_victim_lock"); WSREP_LOG_CONFLICT(bf_thd, thd, TRUE); @@ -18802,7 +18793,31 @@ wsrep_innobase_kill_one_trx( wsrep_thd_transaction_state_str(thd), wsrep_thd_query(thd)); - wsrep_kill_victim(bf_thd, thd, victim_trx, signal); + const bool success= wsrep_thd_bf_abort(bf_thd, thd, signal); + + wsrep_thd_UNLOCK(thd); + wsrep_thd_kill_UNLOCK(thd); + trx_mutex_enter(victim_trx); + + if (success && victim_trx->state == TRX_STATE_ACTIVE) + { + lock_t* wait_lock= victim_trx->lock.wait_lock; + if (wait_lock) + { + victim_trx->lock.was_chosen_as_deadlock_victim= TRUE; + DBUG_ASSERT(victim_trx->is_wsrep()); + WSREP_DEBUG("victim has wait flag: %lu", thd_get_thread_id(thd)); + lock_cancel_waiting_and_release(wait_lock); + } + } + else + { + victim_trx->lock.was_chosen_as_wsrep_victim= false; + WSREP_DEBUG("wsrep_thd_bf_abort has failed, victim %lu will survive", + thd_get_thread_id(thd)); + } + victim_trx->release_reference(); + DBUG_VOID_RETURN; } @@ -18823,43 +18838,61 @@ wsrep_abort_transaction( THD *victim_thd, my_bool signal) { - /* Note that victim thd is protected with - THD::LOCK_thd_data and THD::LOCK_thd_kill here. */ + /* Unlock LOCK_thd_kill and LOCK_thd_data temporarily to grab mutexes + in the right order: + lock_sys.mutex + LOCK_thd_kill + LOCK_thd_data + trx.mutex + */ trx_t* victim_trx= thd_to_trx(victim_thd); - trx_t* bf_trx= thd_to_trx(bf_thd); - WSREP_DEBUG("wsrep_abort_transaction: BF:" - " thread %ld client_state %s client_mode %s" - " trans_state %s query %s trx " TRX_ID_FMT, - thd_get_thread_id(bf_thd), - wsrep_thd_client_state_str(bf_thd), - wsrep_thd_client_mode_str(bf_thd), - wsrep_thd_transaction_state_str(bf_thd), - wsrep_thd_query(bf_thd), - bf_trx ? bf_trx->id : 0); + trx_id_t victim_trx_id= victim_trx ? victim_trx->id : 0; + wsrep_thd_UNLOCK(victim_thd); + wsrep_thd_kill_UNLOCK(victim_thd); + /* After this point must use find_thread_by_id() if victim_thd + is needed again. */ - WSREP_DEBUG("wsrep_abort_transaction: victim:" - " thread %ld client_state %s client_mode %s" - " trans_state %s query %s trx " TRX_ID_FMT, - thd_get_thread_id(victim_thd), - wsrep_thd_client_state_str(victim_thd), - wsrep_thd_client_mode_str(victim_thd), - wsrep_thd_transaction_state_str(victim_thd), - wsrep_thd_query(victim_thd), - victim_trx ? victim_trx->id : 0); - - if (victim_trx) + /* Victim didn't have active RW transaction. Note that tere is a possible + race when the victim transaction is just starting write operation + as is still read only. This however will be resolved eventually since + all the possible blocking transactions are also BF aborted, + and the victim will find that it was BF aborted on server level after + the write operation in InnoDB completes. */ + if (!victim_trx_id) { - lock_mutex_enter(); - trx_mutex_enter(victim_trx); - wsrep_kill_victim(bf_thd, victim_thd, victim_trx, signal); +#ifdef ENABLED_DEBUG_SYNC + DBUG_EXECUTE_IF( + "sync.wsrep_abort_transaction_read_only", + {const char act[]= + "now " + "SIGNAL sync.wsrep_abort_transaction_read_only_reached " + "WAIT_FOR signal.wsrep_abort_transaction_read_only"; + DBUG_ASSERT(!debug_sync_set_action(bf_thd, STRING_WITH_LEN(act))); + };); +#endif /* ENABLED_DEBUG_SYNC*/ + return; + } + lock_mutex_enter(); + + /* Check if victim trx still exists. */ + /* Note based on comment on trx0sys.h only ACTIVE or PREPARED trx + objects may participate in hash. However, transaction may get committed + before this method returns. */ + if(!(victim_trx= trx_sys.find(nullptr, victim_trx_id, true))) { + WSREP_DEBUG("wsrep_abort_transaction: Victim trx does not exist anymore"); lock_mutex_exit(); - trx_mutex_exit(victim_trx); - wsrep_srv_conc_cancel_wait(victim_trx); + return; } - else - { - wsrep_thd_bf_abort(bf_thd, victim_thd, signal); + trx_mutex_enter(victim_trx); + + if (victim_trx->state == TRX_STATE_ACTIVE && victim_trx->lock.wait_lock) { + victim_trx->lock.was_chosen_as_deadlock_victim= TRUE; + lock_cancel_waiting_and_release(victim_trx->lock.wait_lock); } + + trx_mutex_exit(victim_trx); + victim_trx->release_reference(); + lock_mutex_exit(); } static diff --git a/wsrep-lib b/wsrep-lib index 4951c383577..e238c0d240c 160000 --- a/wsrep-lib +++ b/wsrep-lib @@ -1 +1 @@ -Subproject commit 4951c38357737d568b554402bc5b6abe88a38fe1 +Subproject commit e238c0d240c2557229b0523a4a032f3cf8b41639 From 1ac00c5e9f6168cfbb1934e23fc81f4891a678c0 Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Wed, 15 Mar 2023 15:27:23 +0100 Subject: [PATCH 035/171] MDEV-30855 Remove test galera.galera_bf_abort_group_commit This test was re-enabled in commit 0174a9ff3d412ada22205edc19066, and has been failing since then. The test is configured such that Galera runs with commit ordering disabled, a configuration which is which was meant for testing the performance penalty of commit ordering (not meant to be used in practice). Moreover, we have test galera_sr.galera_sr_bf_abort, which is identical, but runs with commit ordering enabled. No reasons to keep the failing test around. --- .../galera/t/galera_bf_abort_group_commit.cnf | 15 ---- .../t/galera_bf_abort_group_commit.test | 77 ------------------- 2 files changed, 92 deletions(-) delete mode 100644 mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf delete mode 100644 mysql-test/suite/galera/t/galera_bf_abort_group_commit.test diff --git a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf b/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf deleted file mode 100644 index 612418c17c0..00000000000 --- a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf +++ /dev/null @@ -1,15 +0,0 @@ -!include ../galera_2nodes.cnf - -# We set repl.commit_order=1 in order to disable provider commit -# ordering. - -[mysqld.1] -log-bin -log-slave-updates -wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;repl.commit_order=1' - -[mysqld.2] - -log-bin -log-slave-updates -wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;repl.commit_order=1' \ No newline at end of file diff --git a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test b/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test deleted file mode 100644 index a828701cd0e..00000000000 --- a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test +++ /dev/null @@ -1,77 +0,0 @@ -# -# This test uses galera_sr_bf_abort.inc to probe various BF abort points -# for SR transactions with wsrep provider commit ordering disabled. -# - ---source include/galera_cluster.inc ---source include/have_innodb.inc ---source include/galera_have_debug_sync.inc - -# Control connection for manipulating sync points on node 1 ---connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 -SET SESSION wsrep_sync_wait = 0; - -# SR bf abort on fragment ---let $wsrep_trx_fragment_size = 1 ---echo galera_sr_bf_abort_at_commit = 0 ---let $galera_sr_bf_abort_at_commit = 0 - ---echo after_replicate_sync ---let $galera_sr_bf_abort_sync_point = after_replicate_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo local_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo apply_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo commit_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - -# SR bf abort on commit fragment ---let $wsrep_trx_fragment_size = 1 ---echo galera_sr_bf_abort_at_commit = 1 ---let $galera_sr_bf_abort_at_commit = 1 - ---echo after_replicate_sync ---let $galera_sr_bf_abort_sync_point = after_replicate_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo local_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo apply_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo commit_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync ---source suite/galera/t/galera_sr_bf_abort.inc - -# Normal bf abort on commit ---let $wsrep_trx_fragment_size = 0 ---echo galera_sr_bf_abort_at_commit = 1 ---let $galera_sr_bf_abort_at_commit = 1 - ---echo after_replicate_sync ---let $galera_sr_bf_abort_sync_point = after_replicate_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo local_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo apply_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo commit_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - -CALL mtr.add_suppression("WSREP: fragment replication failed: 1"); From 9f909e546e14ed9b529cddc2c1a5c2aa61d57e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Tue, 2 May 2023 12:42:13 +0300 Subject: [PATCH 036/171] MDEV-30197 : Missing DBUG_RETURN or DBUG_VOID_RETURN macro in function "Wsrep_schema::restore_view()" Here user is starting server with unsupported client charset. We need to create wsrep_schema tables using explicit latin1 charset to avoid errors in restoring view. --- sql/wsrep_schema.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index 94eef413dc5..a59d13dd839 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -50,7 +50,7 @@ static const std::string create_cluster_table_str= "view_seqno BIGINT NOT NULL," "protocol_version INT NOT NULL," "capabilities INT NOT NULL" - ") ENGINE=InnoDB STATS_PERSISTENT=0"; + ") ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1"; static const std::string create_members_table_str= "CREATE TABLE IF NOT EXISTS " + wsrep_schema_str + "." + members_table_str + @@ -59,7 +59,7 @@ static const std::string create_members_table_str= "cluster_uuid CHAR(36) NOT NULL," "node_name CHAR(32) NOT NULL," "node_incoming_address VARCHAR(256) NOT NULL" - ") ENGINE=InnoDB STATS_PERSISTENT=0"; + ") ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1"; #ifdef WSREP_SCHEMA_MEMBERS_HISTORY static const std::string cluster_member_history_table_str= "wsrep_cluster_member_history"; @@ -72,7 +72,7 @@ static const std::string create_members_history_table_str= "last_view_seqno BIGINT NOT NULL," "node_name CHAR(32) NOT NULL," "node_incoming_address VARCHAR(256) NOT NULL" - ") ENGINE=InnoDB STATS_PERSISTENT=0"; + ") ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1"; #endif /* WSREP_SCHEMA_MEMBERS_HISTORY */ static const std::string create_frag_table_str= @@ -84,7 +84,7 @@ static const std::string create_frag_table_str= "flags INT NOT NULL, " "frag LONGBLOB NOT NULL, " "PRIMARY KEY (node_uuid, trx_id, seqno)" - ") ENGINE=InnoDB STATS_PERSISTENT=0"; + ") ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1"; static const std::string delete_from_cluster_table= "DELETE FROM " + wsrep_schema_str + "." + cluster_table_str; @@ -96,21 +96,21 @@ static const std::string delete_from_members_table= persistent statistics to be collected from these tables. */ static const std::string alter_cluster_table= "ALTER TABLE " + wsrep_schema_str + "." + cluster_table_str + - " STATS_PERSISTENT=0"; + " STATS_PERSISTENT=0 CHARSET=latin1"; static const std::string alter_members_table= "ALTER TABLE " + wsrep_schema_str + "." + members_table_str + - " STATS_PERSISTENT=0"; + " STATS_PERSISTENT=0 CHARSET=latin1"; #ifdef WSREP_SCHEMA_MEMBERS_HISTORY static const std::string alter_members_history_table= "ALTER TABLE " + wsrep_schema_str + "." + members_history_table_str + - " STATS_PERSISTENT=0"; + " STATS_PERSISTENT=0 CHARSET=latin1"; #endif static const std::string alter_frag_table= "ALTER TABLE " + wsrep_schema_str + "." + sr_table_str + - " STATS_PERSISTENT=0"; + " STATS_PERSISTENT=0 CHARSET=latin1"; namespace Wsrep_schema_impl { From d1b1f8c9f2c52082e5794e99aa4cbe1f9125bf33 Mon Sep 17 00:00:00 2001 From: Monty Date: Wed, 24 May 2023 15:32:53 +0300 Subject: [PATCH 037/171] Updated some test result for 32 bit systems --- mysql-test/suite/maria/maria-64bit.result | 55 +++ mysql-test/suite/maria/maria-64bit.test | 41 +++ mysql-test/suite/maria/maria.result | 54 --- mysql-test/suite/maria/maria.test | 35 -- .../r/myisam_sort_buffer_size_basic.result | 8 +- .../suite/sys_vars/r/sysvars_aria,32bit.rdiff | 54 +-- .../r/sysvars_server_notembedded,32bit.rdiff | 315 +++++++++--------- .../t/aria_sort_buffer_size_basic.test | 3 +- .../t/myisam_sort_buffer_size_basic.test | 17 +- 9 files changed, 289 insertions(+), 293 deletions(-) create mode 100644 mysql-test/suite/maria/maria-64bit.result create mode 100644 mysql-test/suite/maria/maria-64bit.test diff --git a/mysql-test/suite/maria/maria-64bit.result b/mysql-test/suite/maria/maria-64bit.result new file mode 100644 index 00000000000..d558814a665 --- /dev/null +++ b/mysql-test/suite/maria/maria-64bit.result @@ -0,0 +1,55 @@ +set session storage_engine=aria; +# +# BUG#47444 - --myisam_repair_threads > 1 can result in all index +# cardinalities=1 +# +SET aria_repair_threads=2; +SET aria_sort_buffer_size=16384; +CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); +Warnings: +Note 1831 Duplicate index `a_2`. This is deprecated and will be disallowed in a future release +Note 1831 Duplicate index `a_3`. This is deprecated and will be disallowed in a future release +INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +CARDINALITY +14 +14 +14 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; +SET aria_repair_threads=@@global.aria_repair_threads; +# +# BUG#47073 - valgrind errs, corruption,failed repair of partition, +# low myisam_sort_buffer_size +# +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); +INSERT INTO t1 select seq,'0' from seq_1_to_65536; +SET aria_sort_buffer_size=16384; +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair error aria_sort_buffer_size is too small. X +test.t1 repair error Create index by sort failed +test.t1 repair info Retrying repair with keycache +test.t1 repair status OK +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SET aria_repair_threads=2; +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair error aria_sort_buffer_size is too small. X +test.t1 repair error Create index by sort failed +test.t1 repair info Retrying repair with keycache +test.t1 repair status OK +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SET aria_repair_threads=@@global.aria_repair_threads; +SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; +DROP TABLE t1; diff --git a/mysql-test/suite/maria/maria-64bit.test b/mysql-test/suite/maria/maria-64bit.test new file mode 100644 index 00000000000..117ace42f7c --- /dev/null +++ b/mysql-test/suite/maria/maria-64bit.test @@ -0,0 +1,41 @@ +--source include/have_maria.inc +--source include/have_sequence.inc +--source include/have_64bit.inc + +set session storage_engine=aria; + +--echo # +--echo # BUG#47444 - --myisam_repair_threads > 1 can result in all index +--echo # cardinalities=1 +--echo # + +SET aria_repair_threads=2; +SET aria_sort_buffer_size=16384; +CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); +INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); +--replace_regex /Current aria_sort_buffer_size.*/X/ +REPAIR TABLE t1; +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +CHECK TABLE t1; +DROP TABLE t1; +SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; +SET aria_repair_threads=@@global.aria_repair_threads; + +--echo # +--echo # BUG#47073 - valgrind errs, corruption,failed repair of partition, +--echo # low myisam_sort_buffer_size +--echo # +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); +INSERT INTO t1 select seq,'0' from seq_1_to_65536; +SET aria_sort_buffer_size=16384; +--replace_regex /Current aria_sort_buffer_size.*/X/ +REPAIR TABLE t1; +CHECK TABLE t1; +SET aria_repair_threads=2; +# May report different values depending on threads activity. +--replace_regex /Current aria_sort_buffer_size.*/X/ +REPAIR TABLE t1; +CHECK TABLE t1; +SET aria_repair_threads=@@global.aria_repair_threads; +SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; +DROP TABLE t1; diff --git a/mysql-test/suite/maria/maria.result b/mysql-test/suite/maria/maria.result index f8911bdde2b..e21d974625c 100644 --- a/mysql-test/suite/maria/maria.result +++ b/mysql-test/suite/maria/maria.result @@ -2809,60 +2809,6 @@ DROP TABLE t1; # # End of 5.5 tests # -# -# BUG#47444 - --myisam_repair_threads > 1 can result in all index -# cardinalities=1 -# -SET aria_repair_threads=2; -SET aria_sort_buffer_size=16384; -CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); -Warnings: -Note 1831 Duplicate index `a_2`. This is deprecated and will be disallowed in a future release -Note 1831 Duplicate index `a_3`. This is deprecated and will be disallowed in a future release -INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); -REPAIR TABLE t1; -Table Op Msg_type Msg_text -test.t1 repair status OK -SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; -CARDINALITY -14 -14 -14 -CHECK TABLE t1; -Table Op Msg_type Msg_text -test.t1 check status OK -DROP TABLE t1; -SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; -SET aria_repair_threads=@@global.aria_repair_threads; -# -# BUG#47073 - valgrind errs, corruption,failed repair of partition, -# low myisam_sort_buffer_size -# -CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); -INSERT INTO t1 select seq,'0' from seq_1_to_65536; -SET aria_sort_buffer_size=16384; -REPAIR TABLE t1; -Table Op Msg_type Msg_text -test.t1 repair error aria_sort_buffer_size is too small. X -test.t1 repair error Create index by sort failed -test.t1 repair info Retrying repair with keycache -test.t1 repair status OK -CHECK TABLE t1; -Table Op Msg_type Msg_text -test.t1 check status OK -SET aria_repair_threads=2; -REPAIR TABLE t1; -Table Op Msg_type Msg_text -test.t1 repair error aria_sort_buffer_size is too small. X -test.t1 repair error Create index by sort failed -test.t1 repair info Retrying repair with keycache -test.t1 repair status OK -CHECK TABLE t1; -Table Op Msg_type Msg_text -test.t1 check status OK -SET aria_repair_threads=@@global.aria_repair_threads; -SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; -DROP TABLE t1; CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), (6,'0'),(7,'0'); diff --git a/mysql-test/suite/maria/maria.test b/mysql-test/suite/maria/maria.test index f7a5b5c35b2..f0b665449dc 100644 --- a/mysql-test/suite/maria/maria.test +++ b/mysql-test/suite/maria/maria.test @@ -2030,41 +2030,6 @@ DROP TABLE t1; --echo # End of 5.5 tests --echo # ---echo # ---echo # BUG#47444 - --myisam_repair_threads > 1 can result in all index ---echo # cardinalities=1 ---echo # -SET aria_repair_threads=2; -SET aria_sort_buffer_size=16384; -CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); -INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); ---replace_regex /Current aria_sort_buffer_size.*/X/ -REPAIR TABLE t1; -SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; -CHECK TABLE t1; -DROP TABLE t1; -SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; -SET aria_repair_threads=@@global.aria_repair_threads; - ---echo # ---echo # BUG#47073 - valgrind errs, corruption,failed repair of partition, ---echo # low myisam_sort_buffer_size ---echo # -CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); -INSERT INTO t1 select seq,'0' from seq_1_to_65536; -SET aria_sort_buffer_size=16384; ---replace_regex /Current aria_sort_buffer_size.*/X/ -REPAIR TABLE t1; -CHECK TABLE t1; -SET aria_repair_threads=2; -# May report different values depending on threads activity. ---replace_regex /Current aria_sort_buffer_size.*/X/ -REPAIR TABLE t1; -CHECK TABLE t1; -SET aria_repair_threads=@@global.aria_repair_threads; -SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; -DROP TABLE t1; - # # Check FLUSH FOR EXPORT # diff --git a/mysql-test/suite/sys_vars/r/myisam_sort_buffer_size_basic.result b/mysql-test/suite/sys_vars/r/myisam_sort_buffer_size_basic.result index 6fbbdac5a45..0acb7878a75 100644 --- a/mysql-test/suite/sys_vars/r/myisam_sort_buffer_size_basic.result +++ b/mysql-test/suite/sys_vars/r/myisam_sort_buffer_size_basic.result @@ -26,10 +26,10 @@ Warning 1292 Truncated incorrect myisam_sort_buffer_size value: '4' SELECT @@global.myisam_sort_buffer_size ; @@global.myisam_sort_buffer_size 4096 -SET @@global.myisam_sort_buffer_size = 4294967295; +SET @@global.myisam_sort_buffer_size = 268435455; SELECT @@global.myisam_sort_buffer_size ; @@global.myisam_sort_buffer_size -4294967295 +268435455 SET @@global.myisam_sort_buffer_size = 655354; SELECT @@global.myisam_sort_buffer_size ; @@global.myisam_sort_buffer_size @@ -41,10 +41,10 @@ Warning 1292 Truncated incorrect myisam_sort_buffer_size value: '4' SELECT @@session.myisam_sort_buffer_size ; @@session.myisam_sort_buffer_size 4096 -SET @@session.myisam_sort_buffer_size = 4294967295; +SET @@session.myisam_sort_buffer_size = 268435455; SELECT @@session.myisam_sort_buffer_size ; @@session.myisam_sort_buffer_size -4294967295 +268435455 SET @@session.myisam_sort_buffer_size = 655345; SELECT @@session.myisam_sort_buffer_size ; @@session.myisam_sort_buffer_size diff --git a/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff index 979f9d8903a..80af54a1d3a 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff @@ -1,16 +1,16 @@ ---- sysvars_aria.result 2015-01-09 11:49:32.000000000 +0100 -+++ sysvars_aria,32bit.result 2015-01-09 17:30:11.000000000 +0100 -@@ -7,7 +7,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +--- suite/sys_vars/r/sysvars_aria.result 2023-05-02 23:37:10.180795104 +0300 ++++ suite/sys_vars/r/sysvars_aria,32bit.reject 2023-05-24 15:11:33.621611216 +0300 +@@ -5,7 +5,7 @@ + SESSION_VALUE NULL DEFAULT_VALUE 8192 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Block size to be used for Aria index pages. - NUMERIC_MIN_VALUE 1024 + NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 32768 -@@ -21,7 +21,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +@@ -17,7 +17,7 @@ + SESSION_VALUE NULL DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -18,8 +18,8 @@ VARIABLE_COMMENT Interval between tries to do an automatic checkpoints. In seconds; 0 means 'no automatic checkpoints' which makes sense only for testing. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -35,7 +35,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +@@ -29,7 +29,7 @@ + SESSION_VALUE NULL DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -27,8 +27,8 @@ VARIABLE_COMMENT Number of bytes that the transaction log has to grow between checkpoints before a new checkpoint is written to the log. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -63,7 +63,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +@@ -53,7 +53,7 @@ + SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -36,8 +36,8 @@ VARIABLE_COMMENT Number of consecutive log recovery failures after which logs will be automatically deleted to cure the problem; 0 (the default) disables the feature. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -91,7 +91,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +@@ -77,7 +77,7 @@ + SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -45,8 +45,8 @@ VARIABLE_COMMENT Interval between commite in microseconds (1/1000000c). 0 stands for no waiting for other threads to come and do a commit in "hard" mode and no sync()/commit at all in "soft" mode. Option has only an effect if aria_group_commit is used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -105,7 +105,7 @@ - GLOBAL_VALUE_ORIGIN CONFIG +@@ -101,7 +101,7 @@ + SESSION_VALUE NULL DEFAULT_VALUE 1073741824 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -54,8 +54,8 @@ VARIABLE_COMMENT Limit for transaction log size NUMERIC_MIN_VALUE 8388608 NUMERIC_MAX_VALUE 4294967295 -@@ -147,10 +147,10 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +@@ -137,10 +137,10 @@ + SESSION_VALUE NULL DEFAULT_VALUE 300 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -67,8 +67,8 @@ NUMERIC_BLOCK_SIZE 100 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -175,7 +175,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +@@ -161,7 +161,7 @@ + SESSION_VALUE NULL DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -76,8 +76,8 @@ VARIABLE_COMMENT The minimum percentage of warm blocks in key cache NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100 -@@ -189,7 +189,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +@@ -173,7 +173,7 @@ + SESSION_VALUE NULL DEFAULT_VALUE 512 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -85,8 +85,8 @@ VARIABLE_COMMENT Number of hash buckets for open and changed files. If you have a lot of Aria files open you should increase this for faster flush of changes. A good value is probably 1/10 of number of possible open Aria files. NUMERIC_MIN_VALUE 128 NUMERIC_MAX_VALUE 16384 -@@ -231,7 +231,7 @@ - GLOBAL_VALUE_ORIGIN COMPILE-TIME +@@ -209,7 +209,7 @@ + SESSION_VALUE 1 DEFAULT_VALUE 1 VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED @@ -94,12 +94,12 @@ VARIABLE_COMMENT Number of threads to use when repairing Aria tables. The value of 1 disables parallel repair. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -248,7 +248,7 @@ +@@ -224,7 +224,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. - NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 + NUMERIC_MIN_VALUE 16376 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff index bfe56dbc1a9..11f8189b592 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff @@ -1,6 +1,6 @@ ---- sysvars_server_notembedded.result -+++ sysvars_server_notembedded.result -@@ -34,7 +34,7 @@ READ_ONLY NO +--- suite/sys_vars/r/sysvars_server_notembedded.result 2023-05-02 23:37:10.180795104 +0300 ++++ suite/sys_vars/r/sysvars_server_notembedded,32bit.reject 2023-05-24 15:07:00.882252929 +0300 +@@ -34,7 +34,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_BLOCK_SIZE VARIABLE_SCOPE GLOBAL @@ -9,7 +9,7 @@ VARIABLE_COMMENT Block size to be used for Aria index pages. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 32768 -@@ -44,7 +44,7 @@ READ_ONLY YES +@@ -44,7 +44,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_CHECKPOINT_INTERVAL VARIABLE_SCOPE GLOBAL @@ -18,7 +18,7 @@ VARIABLE_COMMENT Interval between tries to do an automatic checkpoints. In seconds; 0 means 'no automatic checkpoints' which makes sense only for testing. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -54,7 +54,7 @@ READ_ONLY NO +@@ -54,7 +54,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_CHECKPOINT_LOG_ACTIVITY VARIABLE_SCOPE GLOBAL @@ -27,7 +27,7 @@ VARIABLE_COMMENT Number of bytes that the transaction log has to grow between checkpoints before a new checkpoint is written to the log. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -74,7 +74,7 @@ READ_ONLY NO +@@ -74,7 +74,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ARIA_FORCE_START_AFTER_RECOVERY_FAILURES VARIABLE_SCOPE GLOBAL @@ -36,7 +36,7 @@ VARIABLE_COMMENT Number of consecutive log recovery failures after which logs will be automatically deleted to cure the problem; 0 (the default) disables the feature. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -94,7 +94,7 @@ READ_ONLY NO +@@ -94,7 +94,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_GROUP_COMMIT_INTERVAL VARIABLE_SCOPE GLOBAL @@ -45,7 +45,7 @@ VARIABLE_COMMENT Interval between commite in microseconds (1/1000000c). 0 stands for no waiting for other threads to come and do a commit in "hard" mode and no sync()/commit at all in "soft" mode. Option has only an effect if aria_group_commit is used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -104,7 +104,7 @@ READ_ONLY NO +@@ -114,7 +114,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_LOG_FILE_SIZE VARIABLE_SCOPE GLOBAL @@ -54,7 +54,7 @@ VARIABLE_COMMENT Limit for transaction log size NUMERIC_MIN_VALUE 8388608 NUMERIC_MAX_VALUE 4294967295 -@@ -134,10 +134,10 @@ READ_ONLY NO +@@ -144,10 +144,10 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_AGE_THRESHOLD VARIABLE_SCOPE GLOBAL @@ -67,7 +67,7 @@ NUMERIC_BLOCK_SIZE 100 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -154,7 +154,7 @@ READ_ONLY YES +@@ -164,7 +164,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_DIVISION_LIMIT VARIABLE_SCOPE GLOBAL @@ -76,7 +76,7 @@ VARIABLE_COMMENT The minimum percentage of warm blocks in key cache NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100 -@@ -164,7 +164,7 @@ READ_ONLY NO +@@ -174,7 +174,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_FILE_HASH_SIZE VARIABLE_SCOPE GLOBAL @@ -85,7 +85,7 @@ VARIABLE_COMMENT Number of hash buckets for open and changed files. If you have a lot of Aria files open you should increase this for faster flush of changes. A good value is probably 1/10 of number of possible open Aria files. NUMERIC_MIN_VALUE 128 NUMERIC_MAX_VALUE 16384 -@@ -194,7 +194,7 @@ READ_ONLY NO +@@ -204,7 +204,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ARIA_REPAIR_THREADS VARIABLE_SCOPE SESSION @@ -94,16 +94,16 @@ VARIABLE_COMMENT Number of threads to use when repairing Aria tables. The value of 1 disables parallel repair. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -207,7 +207,7 @@ VARIABLE_SCOPE SESSION +@@ -217,7 +217,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. - NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 + NUMERIC_MIN_VALUE 16376 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -264,7 +264,7 @@ READ_ONLY NO +@@ -274,7 +274,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME AUTO_INCREMENT_INCREMENT VARIABLE_SCOPE SESSION @@ -112,7 +112,7 @@ VARIABLE_COMMENT Auto-increment columns are incremented by this NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -274,7 +274,7 @@ READ_ONLY NO +@@ -284,7 +284,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME AUTO_INCREMENT_OFFSET VARIABLE_SCOPE SESSION @@ -121,7 +121,7 @@ VARIABLE_COMMENT Offset added to Auto-increment columns. Used when auto-increment-increment != 1 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -284,7 +284,7 @@ READ_ONLY NO +@@ -294,7 +294,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME BACK_LOG VARIABLE_SCOPE GLOBAL @@ -130,7 +130,7 @@ VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -337,7 +337,7 @@ VARIABLE_SCOPE GLOBAL +@@ -347,7 +347,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the transactional cache for updates to transactional engines for the binary log. If you often use transactions containing many statements, you can increase this to get more performance NUMERIC_MIN_VALUE 4096 @@ -139,7 +139,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -354,20 +354,20 @@ READ_ONLY NO +@@ -364,20 +364,20 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME BINLOG_COMMIT_WAIT_COUNT VARIABLE_SCOPE GLOBAL @@ -164,7 +164,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -387,7 +387,7 @@ VARIABLE_SCOPE GLOBAL +@@ -397,7 +397,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of file cache for the binary log NUMERIC_MIN_VALUE 8192 @@ -173,7 +173,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -427,7 +427,7 @@ VARIABLE_SCOPE GLOBAL +@@ -437,7 +437,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance. NUMERIC_MIN_VALUE 4096 @@ -182,7 +182,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -437,7 +437,7 @@ VARIABLE_SCOPE SESSION +@@ -447,7 +447,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Size of tree cache used in bulk insert optimisation. Note that this is a limit per thread! NUMERIC_MIN_VALUE 0 @@ -191,7 +191,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -624,7 +624,7 @@ READ_ONLY NO +@@ -634,7 +634,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME CONNECT_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -200,7 +200,7 @@ VARIABLE_COMMENT The number of seconds the mysqld server is waiting for a connect packet before responding with 'Bad handshake' NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 31536000 -@@ -674,7 +674,7 @@ READ_ONLY YES +@@ -684,7 +684,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_SEARCH_DEPTH_LONG VARIABLE_SCOPE SESSION @@ -209,7 +209,7 @@ VARIABLE_COMMENT Long search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 33 -@@ -684,7 +684,7 @@ READ_ONLY NO +@@ -694,7 +694,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_SEARCH_DEPTH_SHORT VARIABLE_SCOPE SESSION @@ -218,7 +218,7 @@ VARIABLE_COMMENT Short search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 32 -@@ -694,7 +694,7 @@ READ_ONLY NO +@@ -704,7 +704,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_TIMEOUT_LONG VARIABLE_SCOPE SESSION @@ -227,7 +227,7 @@ VARIABLE_COMMENT Long timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -704,7 +704,7 @@ READ_ONLY NO +@@ -714,7 +714,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_TIMEOUT_SHORT VARIABLE_SCOPE SESSION @@ -236,7 +236,7 @@ VARIABLE_COMMENT Short timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -764,7 +764,7 @@ READ_ONLY NO +@@ -774,7 +774,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME DEFAULT_WEEK_FORMAT VARIABLE_SCOPE SESSION @@ -245,7 +245,7 @@ VARIABLE_COMMENT The default week format used by WEEK() functions NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 7 -@@ -774,7 +774,7 @@ READ_ONLY NO +@@ -784,7 +784,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_INSERT_LIMIT VARIABLE_SCOPE GLOBAL @@ -254,7 +254,7 @@ VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -784,7 +784,7 @@ READ_ONLY NO +@@ -794,7 +794,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_INSERT_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -263,7 +263,7 @@ VARIABLE_COMMENT How long a INSERT DELAYED thread should wait for INSERT statements before terminating NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -794,7 +794,7 @@ READ_ONLY NO +@@ -804,7 +804,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_QUEUE_SIZE VARIABLE_SCOPE GLOBAL @@ -272,7 +272,7 @@ VARIABLE_COMMENT What size queue (in rows) should be allocated for handling INSERT DELAYED. If the queue becomes full, any client that does INSERT DELAYED will wait until there is room in the queue again NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -824,7 +824,7 @@ READ_ONLY NO +@@ -834,7 +834,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME DIV_PRECISION_INCREMENT VARIABLE_SCOPE SESSION @@ -281,7 +281,7 @@ VARIABLE_COMMENT Precision of the result of '/' operator will be increased on that value NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 38 -@@ -914,7 +914,7 @@ READ_ONLY NO +@@ -924,7 +924,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME EXPIRE_LOGS_DAYS VARIABLE_SCOPE GLOBAL @@ -290,7 +290,7 @@ VARIABLE_COMMENT If non-zero, binary logs will be purged after expire_logs_days days; possible purges happen at startup and at binary log rotation NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 99 -@@ -944,7 +944,7 @@ READ_ONLY YES +@@ -954,7 +954,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME EXTRA_MAX_CONNECTIONS VARIABLE_SCOPE GLOBAL @@ -299,7 +299,7 @@ VARIABLE_COMMENT The number of connections on extra-port NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100000 -@@ -974,7 +974,7 @@ READ_ONLY NO +@@ -984,7 +984,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME FLUSH_TIME VARIABLE_SCOPE GLOBAL @@ -308,7 +308,7 @@ VARIABLE_COMMENT A dedicated thread is created to flush all tables at the given interval NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -1004,7 +1004,7 @@ READ_ONLY NO +@@ -1014,7 +1014,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_MAX_WORD_LEN VARIABLE_SCOPE GLOBAL @@ -317,7 +317,7 @@ VARIABLE_COMMENT The maximum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -1014,7 +1014,7 @@ READ_ONLY YES +@@ -1024,7 +1024,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_MIN_WORD_LEN VARIABLE_SCOPE GLOBAL @@ -326,7 +326,7 @@ VARIABLE_COMMENT The minimum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 84 -@@ -1024,7 +1024,7 @@ READ_ONLY YES +@@ -1034,7 +1034,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_QUERY_EXPANSION_LIMIT VARIABLE_SCOPE GLOBAL @@ -335,16 +335,7 @@ VARIABLE_COMMENT Number of best matches to use for query expansion NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -1067,7 +1067,7 @@ VARIABLE_SCOPE SESSION - VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT The maximum length of the result of function GROUP_CONCAT() - NUMERIC_MIN_VALUE 4 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 - ENUM_VALUE_LIST NULL - READ_ONLY NO -@@ -1274,7 +1274,7 @@ READ_ONLY YES +@@ -1284,7 +1284,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME HISTOGRAM_SIZE VARIABLE_SCOPE SESSION @@ -353,7 +344,7 @@ VARIABLE_COMMENT Number of bytes used for a histogram. If set to 0, no histograms are created by ANALYZE. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -1304,7 +1304,7 @@ READ_ONLY YES +@@ -1314,7 +1314,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME HOST_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -362,7 +353,7 @@ VARIABLE_COMMENT How many host names should be cached to avoid resolving. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65536 -@@ -1414,7 +1414,7 @@ READ_ONLY NO +@@ -1424,7 +1424,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME INTERACTIVE_TIMEOUT VARIABLE_SCOPE SESSION @@ -371,7 +362,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on an interactive connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -1447,7 +1447,7 @@ VARIABLE_SCOPE SESSION +@@ -1457,7 +1457,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the buffer that is used for joins NUMERIC_MIN_VALUE 128 @@ -380,7 +371,7 @@ NUMERIC_BLOCK_SIZE 128 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1464,7 +1464,7 @@ READ_ONLY NO +@@ -1474,7 +1474,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME JOIN_CACHE_LEVEL VARIABLE_SCOPE SESSION @@ -389,7 +380,7 @@ VARIABLE_COMMENT Controls what join operations can be executed with join buffers. Odd numbers are used for plain join buffers while even numbers are used for linked buffers NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 8 -@@ -1487,7 +1487,7 @@ VARIABLE_SCOPE GLOBAL +@@ -1497,7 +1497,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the buffer used for index blocks for MyISAM tables. Increase this to get better index handling (for all reads and multiple writes) to as much as you can afford NUMERIC_MIN_VALUE 0 @@ -398,7 +389,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1654,7 +1654,7 @@ READ_ONLY YES +@@ -1664,7 +1664,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME LOCK_WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -407,7 +398,7 @@ VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -1804,7 +1804,7 @@ READ_ONLY NO +@@ -1814,7 +1814,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_RATE_LIMIT VARIABLE_SCOPE SESSION @@ -416,7 +407,7 @@ VARIABLE_COMMENT Write to slow log every #th slow query. Set to 1 to log everything. Increase it to reduce the size of the slow or the performance impact of slow logging NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1834,7 +1834,7 @@ READ_ONLY NO +@@ -1844,7 +1844,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_WARNINGS VARIABLE_SCOPE SESSION @@ -425,7 +416,7 @@ VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1894,7 +1894,7 @@ READ_ONLY NO +@@ -1904,7 +1904,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MAX_ALLOWED_PACKET VARIABLE_SCOPE SESSION @@ -434,7 +425,7 @@ VARIABLE_COMMENT Max packet length to send to or receive from the server NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -1907,14 +1907,14 @@ VARIABLE_SCOPE GLOBAL +@@ -1917,14 +1917,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the transactional cache NUMERIC_MIN_VALUE 4096 @@ -451,7 +442,7 @@ VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 1073741824 -@@ -1927,14 +1927,14 @@ VARIABLE_SCOPE GLOBAL +@@ -1937,14 +1937,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the statement cache NUMERIC_MIN_VALUE 4096 @@ -468,7 +459,7 @@ VARIABLE_COMMENT The number of simultaneous clients allowed NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 100000 -@@ -1944,7 +1944,7 @@ READ_ONLY NO +@@ -1954,7 +1954,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_CONNECT_ERRORS VARIABLE_SCOPE GLOBAL @@ -477,7 +468,7 @@ VARIABLE_COMMENT If there is more than this number of interrupted connections from a host this host will be blocked from further connections NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1954,7 +1954,7 @@ READ_ONLY NO +@@ -1964,7 +1964,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_DELAYED_THREADS VARIABLE_SCOPE SESSION @@ -486,7 +477,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -1974,7 +1974,7 @@ READ_ONLY YES +@@ -1984,7 +1984,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_ERROR_COUNT VARIABLE_SCOPE SESSION @@ -495,7 +486,7 @@ VARIABLE_COMMENT Max number of errors/warnings to store for a statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -1987,14 +1987,14 @@ VARIABLE_SCOPE SESSION +@@ -1997,14 +1997,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't allow creation of heap tables bigger than this NUMERIC_MIN_VALUE 16384 @@ -512,7 +503,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -2014,7 +2014,7 @@ READ_ONLY NO +@@ -2024,7 +2024,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_LENGTH_FOR_SORT_DATA VARIABLE_SCOPE SESSION @@ -521,7 +512,7 @@ VARIABLE_COMMENT Max number of bytes in sorted records NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -2024,7 +2024,7 @@ READ_ONLY NO +@@ -2034,7 +2034,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_LONG_DATA_SIZE VARIABLE_SCOPE GLOBAL @@ -530,7 +521,7 @@ VARIABLE_COMMENT The maximum BLOB length to send to server from mysql_send_long_data API. Deprecated option; use max_allowed_packet instead. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -2054,7 +2054,7 @@ READ_ONLY NO +@@ -2064,7 +2064,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_RECURSIVE_ITERATIONS VARIABLE_SCOPE SESSION @@ -539,7 +530,7 @@ VARIABLE_COMMENT Maximum number of iterations when executing recursive queries NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2077,14 +2077,14 @@ VARIABLE_SCOPE SESSION +@@ -2087,14 +2087,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The maximum size of the container of a rowid filter NUMERIC_MIN_VALUE 1024 @@ -556,16 +547,16 @@ VARIABLE_COMMENT Limit assumed max number of seeks when looking up rows based on a key NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2104,7 +2104,7 @@ READ_ONLY NO +@@ -2114,7 +2114,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SORT_LENGTH VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored) - NUMERIC_MIN_VALUE 4 + NUMERIC_MIN_VALUE 64 NUMERIC_MAX_VALUE 8388608 -@@ -2114,7 +2114,7 @@ READ_ONLY NO +@@ -2124,7 +2124,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SP_RECURSION_DEPTH VARIABLE_SCOPE SESSION @@ -574,7 +565,7 @@ VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -2134,7 +2134,7 @@ READ_ONLY NO +@@ -2144,7 +2144,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_TMP_TABLES VARIABLE_SCOPE SESSION @@ -583,7 +574,7 @@ VARIABLE_COMMENT Unused, will be removed. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2154,7 +2154,7 @@ READ_ONLY NO +@@ -2164,7 +2164,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_WRITE_LOCK_COUNT VARIABLE_SCOPE GLOBAL @@ -592,7 +583,7 @@ VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2164,7 +2164,7 @@ READ_ONLY NO +@@ -2174,7 +2174,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -601,7 +592,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -2174,7 +2174,7 @@ READ_ONLY YES +@@ -2184,7 +2184,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_HASH_INSTANCES VARIABLE_SCOPE GLOBAL @@ -610,7 +601,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2184,7 +2184,7 @@ READ_ONLY YES +@@ -2194,7 +2194,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MIN_EXAMINED_ROW_LIMIT VARIABLE_SCOPE SESSION @@ -619,7 +610,7 @@ VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2194,7 +2194,7 @@ READ_ONLY NO +@@ -2204,7 +2204,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MRR_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -628,7 +619,7 @@ VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2204,17 +2204,17 @@ READ_ONLY NO +@@ -2214,17 +2214,17 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MULTI_RANGE_COUNT VARIABLE_SCOPE SESSION @@ -649,7 +640,7 @@ VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2224,7 +2224,7 @@ READ_ONLY YES +@@ -2234,7 +2234,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_DATA_POINTER_SIZE VARIABLE_SCOPE GLOBAL @@ -658,7 +649,7 @@ VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2247,7 +2247,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2257,7 +2257,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Restricts the total memory used for memory mapping of MySQL tables NUMERIC_MIN_VALUE 7 @@ -667,7 +658,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2264,10 +2264,10 @@ READ_ONLY YES +@@ -2274,10 +2274,10 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MYISAM_REPAIR_THREADS VARIABLE_SCOPE SESSION @@ -680,16 +671,16 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2277,7 +2277,7 @@ VARIABLE_SCOPE SESSION +@@ -2287,7 +2287,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2314,7 +2314,7 @@ READ_ONLY NO +@@ -2324,7 +2324,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME NET_BUFFER_LENGTH VARIABLE_SCOPE SESSION @@ -698,7 +689,7 @@ VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2324,7 +2324,7 @@ READ_ONLY NO +@@ -2334,7 +2334,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_READ_TIMEOUT VARIABLE_SCOPE SESSION @@ -707,7 +698,7 @@ VARIABLE_COMMENT Number of seconds to wait for more data from a connection before aborting the read NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2334,7 +2334,7 @@ READ_ONLY NO +@@ -2344,7 +2344,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_RETRY_COUNT VARIABLE_SCOPE SESSION @@ -716,7 +707,7 @@ VARIABLE_COMMENT If a read on a communication port is interrupted, retry this many times before giving up NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2344,7 +2344,7 @@ READ_ONLY NO +@@ -2354,7 +2354,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_WRITE_TIMEOUT VARIABLE_SCOPE SESSION @@ -725,7 +716,7 @@ VARIABLE_COMMENT Number of seconds to wait for a block to be written to a connection before aborting the write NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2394,7 +2394,7 @@ READ_ONLY NO +@@ -2404,7 +2404,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -734,7 +725,7 @@ VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 or autoset then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2404,7 +2404,7 @@ READ_ONLY YES +@@ -2414,7 +2414,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_PRUNE_LEVEL VARIABLE_SCOPE SESSION @@ -743,7 +734,7 @@ VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search; 1 - prune plans based on number of retrieved rows NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1 -@@ -2414,7 +2414,7 @@ READ_ONLY NO +@@ -2424,7 +2424,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SEARCH_DEPTH VARIABLE_SCOPE SESSION @@ -752,7 +743,7 @@ VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2424,7 +2424,7 @@ READ_ONLY NO +@@ -2434,7 +2434,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SELECTIVITY_SAMPLING_LIMIT VARIABLE_SCOPE SESSION @@ -761,7 +752,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2454,17 +2454,17 @@ READ_ONLY NO +@@ -2464,17 +2464,17 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_TRACE_MAX_MEM_SIZE VARIABLE_SCOPE SESSION @@ -782,7 +773,7 @@ VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join.5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2484,7 +2484,7 @@ READ_ONLY YES +@@ -2494,7 +2494,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME PERFORMANCE_SCHEMA_ACCOUNTS_SIZE VARIABLE_SCOPE GLOBAL @@ -791,7 +782,7 @@ VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2494,7 +2494,7 @@ READ_ONLY YES +@@ -2504,7 +2504,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_DIGESTS_SIZE VARIABLE_SCOPE GLOBAL @@ -799,8 +790,8 @@ +VARIABLE_TYPE INT VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 - NUMERIC_MAX_VALUE 200 -@@ -2504,7 +2504,7 @@ READ_ONLY YES + NUMERIC_MAX_VALUE 1048576 +@@ -2514,7 +2514,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -809,7 +800,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2514,7 +2514,7 @@ READ_ONLY YES +@@ -2524,7 +2524,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -818,7 +809,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2524,7 +2524,7 @@ READ_ONLY YES +@@ -2534,7 +2534,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -827,7 +818,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2534,7 +2534,7 @@ READ_ONLY YES +@@ -2544,7 +2544,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -836,7 +827,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2544,7 +2544,7 @@ READ_ONLY YES +@@ -2554,7 +2554,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -845,7 +836,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2554,7 +2554,7 @@ READ_ONLY YES +@@ -2564,7 +2564,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -854,7 +845,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2564,7 +2564,7 @@ READ_ONLY YES +@@ -2574,7 +2574,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_HOSTS_SIZE VARIABLE_SCOPE GLOBAL @@ -863,7 +854,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2574,7 +2574,7 @@ READ_ONLY YES +@@ -2584,7 +2584,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_CLASSES VARIABLE_SCOPE GLOBAL @@ -872,7 +863,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2584,7 +2584,7 @@ READ_ONLY YES +@@ -2594,7 +2594,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_INSTANCES VARIABLE_SCOPE GLOBAL @@ -881,7 +872,7 @@ VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2594,7 +2594,7 @@ READ_ONLY YES +@@ -2604,7 +2604,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_DIGEST_LENGTH VARIABLE_SCOPE GLOBAL @@ -890,7 +881,7 @@ VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2604,7 +2604,7 @@ READ_ONLY YES +@@ -2614,7 +2614,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_CLASSES VARIABLE_SCOPE GLOBAL @@ -899,7 +890,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2614,7 +2614,7 @@ READ_ONLY YES +@@ -2624,7 +2624,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_HANDLES VARIABLE_SCOPE GLOBAL @@ -908,7 +899,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2624,7 +2624,7 @@ READ_ONLY YES +@@ -2634,7 +2634,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -917,7 +908,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2634,7 +2634,7 @@ READ_ONLY YES +@@ -2644,7 +2644,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_CLASSES VARIABLE_SCOPE GLOBAL @@ -926,7 +917,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2644,7 +2644,7 @@ READ_ONLY YES +@@ -2654,7 +2654,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES VARIABLE_SCOPE GLOBAL @@ -935,7 +926,7 @@ VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2654,7 +2654,7 @@ READ_ONLY YES +@@ -2664,7 +2664,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_CLASSES VARIABLE_SCOPE GLOBAL @@ -944,7 +935,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2664,7 +2664,7 @@ READ_ONLY YES +@@ -2674,7 +2674,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_INSTANCES VARIABLE_SCOPE GLOBAL @@ -953,7 +944,7 @@ VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2674,7 +2674,7 @@ READ_ONLY YES +@@ -2684,7 +2684,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_CLASSES VARIABLE_SCOPE GLOBAL @@ -962,7 +953,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2684,7 +2684,7 @@ READ_ONLY YES +@@ -2694,7 +2694,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_INSTANCES VARIABLE_SCOPE GLOBAL @@ -971,7 +962,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2694,7 +2694,7 @@ READ_ONLY YES +@@ -2704,7 +2704,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STAGE_CLASSES VARIABLE_SCOPE GLOBAL @@ -980,7 +971,7 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2704,7 +2704,7 @@ READ_ONLY YES +@@ -2714,7 +2714,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES VARIABLE_SCOPE GLOBAL @@ -989,7 +980,7 @@ VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2714,7 +2714,7 @@ READ_ONLY YES +@@ -2724,7 +2724,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_HANDLES VARIABLE_SCOPE GLOBAL @@ -998,7 +989,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2724,7 +2724,7 @@ READ_ONLY YES +@@ -2734,7 +2734,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1007,7 +998,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2734,7 +2734,7 @@ READ_ONLY YES +@@ -2744,7 +2744,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_CLASSES VARIABLE_SCOPE GLOBAL @@ -1016,7 +1007,7 @@ VARIABLE_COMMENT Maximum number of thread instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2744,7 +2744,7 @@ READ_ONLY YES +@@ -2754,7 +2754,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1025,7 +1016,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2754,7 +2754,7 @@ READ_ONLY YES +@@ -2764,7 +2764,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SESSION_CONNECT_ATTRS_SIZE VARIABLE_SCOPE GLOBAL @@ -1034,7 +1025,7 @@ VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2764,7 +2764,7 @@ READ_ONLY YES +@@ -2774,7 +2774,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_ACTORS_SIZE VARIABLE_SCOPE GLOBAL @@ -1043,7 +1034,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2774,7 +2774,7 @@ READ_ONLY YES +@@ -2784,7 +2784,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_OBJECTS_SIZE VARIABLE_SCOPE GLOBAL @@ -1052,7 +1043,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2784,7 +2784,7 @@ READ_ONLY YES +@@ -2794,7 +2794,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_USERS_SIZE VARIABLE_SCOPE GLOBAL @@ -1061,7 +1052,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2834,7 +2834,7 @@ READ_ONLY YES +@@ -2844,7 +2844,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PRELOAD_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1070,7 +1061,7 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -2854,7 +2854,7 @@ READ_ONLY NO +@@ -2864,7 +2864,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME PROFILING_HISTORY_SIZE VARIABLE_SCOPE SESSION @@ -1079,7 +1070,7 @@ VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -2864,7 +2864,7 @@ READ_ONLY NO +@@ -2874,7 +2874,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PROGRESS_REPORT_TIME VARIABLE_SCOPE SESSION @@ -1088,7 +1079,7 @@ VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2924,7 +2924,7 @@ READ_ONLY NO +@@ -2934,7 +2934,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME QUERY_ALLOC_BLOCK_SIZE VARIABLE_SCOPE SESSION @@ -1097,7 +1088,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -2934,7 +2934,7 @@ READ_ONLY NO +@@ -2944,7 +2944,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_LIMIT VARIABLE_SCOPE GLOBAL @@ -1106,7 +1097,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2944,7 +2944,7 @@ READ_ONLY NO +@@ -2954,7 +2954,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_MIN_RES_UNIT VARIABLE_SCOPE GLOBAL @@ -1115,7 +1106,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2957,7 +2957,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2967,7 +2967,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1124,7 +1115,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2994,7 +2994,7 @@ READ_ONLY NO +@@ -3004,7 +3004,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME QUERY_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1133,7 +1124,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3007,7 +3007,7 @@ VARIABLE_SCOPE SESSION ONLY +@@ -3017,7 +3017,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1142,7 +1133,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3017,14 +3017,14 @@ VARIABLE_SCOPE SESSION ONLY +@@ -3027,14 +3027,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1159,7 +1150,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3037,14 +3037,14 @@ VARIABLE_SCOPE GLOBAL +@@ -3047,14 +3047,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Maximum speed(KB/s) to read binlog from master (0 = no limit) NUMERIC_MIN_VALUE 0 @@ -1176,7 +1167,7 @@ VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -3064,7 +3064,7 @@ READ_ONLY NO +@@ -3074,7 +3074,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME READ_RND_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1185,7 +1176,7 @@ VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -3264,10 +3264,10 @@ READ_ONLY YES +@@ -3274,10 +3274,10 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ROWID_MERGE_BUFF_SIZE VARIABLE_SCOPE SESSION @@ -1198,7 +1189,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3284,20 +3284,20 @@ READ_ONLY NO +@@ -3294,20 +3294,20 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME RPL_SEMI_SYNC_MASTER_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -1223,7 +1214,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3354,10 +3354,10 @@ READ_ONLY NO +@@ -3364,10 +3364,10 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_TRACE_LEVEL VARIABLE_SCOPE GLOBAL @@ -1236,7 +1227,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3394,7 +3394,7 @@ READ_ONLY YES +@@ -3404,7 +3404,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SERVER_ID VARIABLE_SCOPE SESSION @@ -1245,7 +1236,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -3524,7 +3524,7 @@ READ_ONLY NO +@@ -3534,7 +3534,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_DOMAIN_PARALLEL_THREADS VARIABLE_SCOPE GLOBAL @@ -1254,7 +1245,7 @@ VARIABLE_COMMENT Maximum number of parallel threads to use on slave for events in a single replication domain. When using multiple domains, this can be used to limit a single domain from grabbing all threads and thus stalling other domains. The default of 0 means to allow a domain to grab as many threads as it wants, up to the value of slave_parallel_threads. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3554,7 +3554,7 @@ READ_ONLY YES +@@ -3564,7 +3564,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_MAX_ALLOWED_PACKET VARIABLE_SCOPE GLOBAL @@ -1263,7 +1254,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3574,7 +3574,7 @@ READ_ONLY NO +@@ -3584,7 +3584,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_PARALLEL_MAX_QUEUED VARIABLE_SCOPE GLOBAL @@ -1272,7 +1263,7 @@ VARIABLE_COMMENT Limit on how much memory SQL threads should use per parallel replication thread when reading ahead in the relay log looking for opportunities for parallel replication. Only used when --slave-parallel-threads > 0. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2147483647 -@@ -3594,7 +3594,7 @@ READ_ONLY NO +@@ -3604,7 +3604,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME SLAVE_PARALLEL_THREADS VARIABLE_SCOPE GLOBAL @@ -1281,7 +1272,7 @@ VARIABLE_COMMENT If non-zero, number of threads to spawn to apply in parallel events on the slave that were group-committed on the master or were logged with GTID in different replication domains. Note that these threads are in addition to the IO and SQL threads, which are always created by a replication slave NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3604,7 +3604,7 @@ READ_ONLY NO +@@ -3614,7 +3614,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_PARALLEL_WORKERS VARIABLE_SCOPE GLOBAL @@ -1290,7 +1281,7 @@ VARIABLE_COMMENT Alias for slave_parallel_threads NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3644,7 +3644,7 @@ READ_ONLY NO +@@ -3654,7 +3654,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME SLAVE_TRANSACTION_RETRIES VARIABLE_SCOPE GLOBAL @@ -1299,7 +1290,7 @@ VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock, elapsed lock wait timeout or listed in slave_transaction_retry_errors, before giving up and stopping NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3664,7 +3664,7 @@ READ_ONLY YES +@@ -3674,7 +3674,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_TRANSACTION_RETRY_INTERVAL VARIABLE_SCOPE GLOBAL @@ -1308,7 +1299,7 @@ VARIABLE_COMMENT Interval of the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout or listed in slave_transaction_retry_errors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 3600 -@@ -3684,7 +3684,7 @@ READ_ONLY NO +@@ -3694,7 +3694,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLOW_LAUNCH_TIME VARIABLE_SCOPE GLOBAL @@ -1317,7 +1308,7 @@ VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -3727,7 +3727,7 @@ VARIABLE_SCOPE SESSION +@@ -3737,7 +3737,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1326,7 +1317,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3944,7 +3944,7 @@ READ_ONLY NO +@@ -3954,7 +3954,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME STORED_PROGRAM_CACHE VARIABLE_SCOPE GLOBAL @@ -1335,7 +1326,7 @@ VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -4044,7 +4044,7 @@ READ_ONLY NO +@@ -4054,7 +4054,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME TABLE_DEFINITION_CACHE VARIABLE_SCOPE GLOBAL @@ -1344,7 +1335,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 2097152 -@@ -4054,7 +4054,7 @@ READ_ONLY NO +@@ -4064,7 +4064,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE VARIABLE_SCOPE GLOBAL @@ -1353,7 +1344,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 -@@ -4114,7 +4114,7 @@ READ_ONLY NO +@@ -4124,7 +4124,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME THREAD_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -1362,7 +1353,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -4124,7 +4124,7 @@ READ_ONLY NO +@@ -4134,7 +4134,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME THREAD_CONCURRENCY VARIABLE_SCOPE GLOBAL @@ -1371,7 +1362,7 @@ VARIABLE_COMMENT Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.This variable has no effect, and is deprecated. It will be removed in a future release. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 512 -@@ -4287,7 +4287,7 @@ VARIABLE_SCOPE SESSION +@@ -4297,7 +4297,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 @@ -1380,7 +1371,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4297,7 +4297,7 @@ VARIABLE_SCOPE SESSION +@@ -4307,7 +4307,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. NUMERIC_MIN_VALUE 1024 @@ -1389,7 +1380,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4307,14 +4307,14 @@ VARIABLE_SCOPE SESSION +@@ -4317,14 +4317,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 @@ -1406,7 +1397,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4324,7 +4324,7 @@ READ_ONLY NO +@@ -4334,7 +4334,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TRANSACTION_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1415,7 +1406,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4464,7 +4464,7 @@ READ_ONLY YES +@@ -4474,7 +4474,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -1424,7 +1415,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -4491,7 +4491,7 @@ order by variable_name; +@@ -4501,7 +4501,7 @@ VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/t/aria_sort_buffer_size_basic.test b/mysql-test/suite/sys_vars/t/aria_sort_buffer_size_basic.test index 818d66328f8..0795d54910d 100644 --- a/mysql-test/suite/sys_vars/t/aria_sort_buffer_size_basic.test +++ b/mysql-test/suite/sys_vars/t/aria_sort_buffer_size_basic.test @@ -39,8 +39,7 @@ select @@global.aria_sort_buffer_size; --disable_warnings set session aria_sort_buffer_size=cast(-1 as unsigned int); --enable_warnings ---replace_result 4294967295 18446744073709551615 +--replace_result 4294967295 18446744073709551615 268435455 1152921504606846975 select @@session.aria_sort_buffer_size; SET @@global.aria_sort_buffer_size = @start_global_value; - diff --git a/mysql-test/suite/sys_vars/t/myisam_sort_buffer_size_basic.test b/mysql-test/suite/sys_vars/t/myisam_sort_buffer_size_basic.test index 81ff81ae935..ac1e9d615af 100644 --- a/mysql-test/suite/sys_vars/t/myisam_sort_buffer_size_basic.test +++ b/mysql-test/suite/sys_vars/t/myisam_sort_buffer_size_basic.test @@ -61,7 +61,7 @@ SELECT @@session.myisam_sort_buffer_size = @default_myisam_sort_buffer_size; SET @@global.myisam_sort_buffer_size = 4; SELECT @@global.myisam_sort_buffer_size ; -SET @@global.myisam_sort_buffer_size = 4294967295; +SET @@global.myisam_sort_buffer_size = 268435455; SELECT @@global.myisam_sort_buffer_size ; SET @@global.myisam_sort_buffer_size = 655354; @@ -76,7 +76,7 @@ SELECT @@global.myisam_sort_buffer_size ; SET @@session.myisam_sort_buffer_size = 4; SELECT @@session.myisam_sort_buffer_size ; -SET @@session.myisam_sort_buffer_size = 4294967295; +SET @@session.myisam_sort_buffer_size = 268435455; SELECT @@session.myisam_sort_buffer_size ; SET @@session.myisam_sort_buffer_size = 655345; @@ -96,33 +96,32 @@ SELECT @@global.myisam_sort_buffer_size ; --disable_warnings SET @@global.myisam_sort_buffer_size = 429496729533; --enable_warnings ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; - --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = 65530.34; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = test; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = "test"; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = 'test'; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = ON; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; From 832b157bbe3e22e36c75e5b80ee88bfe3d4359a5 Mon Sep 17 00:00:00 2001 From: Angelique Date: Thu, 25 May 2023 23:10:53 +0000 Subject: [PATCH 038/171] MDEV-30214: Generalize log filename in IO Error message --- mysql-test/suite/rpl/r/rpl_manual_change_index_file.result | 2 +- mysql-test/suite/rpl/t/rpl_manual_change_index_file.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result b/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result index 78a86437867..15ecb55b016 100644 --- a/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result +++ b/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result @@ -8,7 +8,7 @@ FLUSH LOGS; call mtr.add_suppression('Got fatal error 1236 from master when reading data from binary log: .*could not find next log'); connection slave; include/wait_for_slave_io_error.inc [errno=1236] -Last_IO_Error = 'Got fatal error 1236 from master when reading data from binary log: 'could not find next log; the first event 'master-bin.000001' at XXX, the last event read from 'master-bin.000002' at XXX, the last byte read from 'master-bin.000002' at XXX.'' +Last_IO_Error = 'Got fatal error 1236 from master when reading data from binary log: 'could not find next log; the first event 'FILE' at XXX, the last event read from 'master-bin.000002' at XXX, the last byte read from 'master-bin.000002' at XXX.'' connection master; CREATE TABLE t2(c1 INT); FLUSH LOGS; diff --git a/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test index 1c087c550d0..2b69ef2e82a 100644 --- a/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test +++ b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test @@ -62,7 +62,7 @@ connection slave; --let $slave_io_errno= 1236 --let $show_slave_io_error= 1 # Mask line numbers ---let $slave_io_error_replace= / at [0-9]*/ at XXX/ +--let $slave_io_error_replace= / at [0-9]*/ at XXX/ /the first event '(\.|master-bin.000001)'/the first event 'FILE'/ --source include/wait_for_slave_io_error.inc connection master; From d657f18ea787dbf31460c77cb8fc56c01730b895 Mon Sep 17 00:00:00 2001 From: Monty Date: Sat, 27 May 2023 16:31:22 +0300 Subject: [PATCH 039/171] MDEV-31226 Server crash or assertion failure with row size close to join_buffer_size The problem was that JOIN_CACHE::alloc_buffer() did not check if the given join_buffer_value is less than the query require. Added a check for this and disabled join cache if it cannot be used. --- mysql-test/main/join_cache.result | 23 +++++++++++++++++++++++ mysql-test/main/join_cache.test | 17 +++++++++++++++++ sql/sql_join_cache.cc | 3 +++ 3 files changed, 43 insertions(+) diff --git a/mysql-test/main/join_cache.result b/mysql-test/main/join_cache.result index 6b39f936628..20980d09001 100644 --- a/mysql-test/main/join_cache.result +++ b/mysql-test/main/join_cache.result @@ -6233,3 +6233,26 @@ set @@optimizer_switch=@save_optimizer_switch; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; +# +# MDEV-31226 Server crash or assertion failure with row size close to +# join_buffer_size +# +set @org_optimizer_switch=@@optimizer_switch; +set @org_join_buffer_size=@@join_buffer_size; +CREATE TABLE t (f VARCHAR(16384)) ENGINE=MyISAM CHARACTER SET utf8; +INSERT INTO t VALUES (REPEAT('a',16384)),(REPEAT('b',16384)); +SET OPTIMIZER_SWITCH = 'optimize_join_buffer_size=off'; +SET JOIN_BUFFER_SIZE = 16384; +explain SELECT length(concat(t1.f,t2.f)) FROM t t1, t t2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 +SELECT length(concat(t1.f,t2.f)) FROM t t1, t t2; +length(concat(t1.f,t2.f)) +32768 +32768 +32768 +32768 +DROP TABLE t; +set @@optimizer_switch=@org_optimizer_switch; +set @@join_buffer_size=@org_join_buffer_size; diff --git a/mysql-test/main/join_cache.test b/mysql-test/main/join_cache.test index 07ac0b760cf..6a5ee8cb533 100644 --- a/mysql-test/main/join_cache.test +++ b/mysql-test/main/join_cache.test @@ -4207,3 +4207,20 @@ set @@optimizer_switch=@save_optimizer_switch; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; + +--echo # +--echo # MDEV-31226 Server crash or assertion failure with row size close to +--echo # join_buffer_size +--echo # + +set @org_optimizer_switch=@@optimizer_switch; +set @org_join_buffer_size=@@join_buffer_size; +CREATE TABLE t (f VARCHAR(16384)) ENGINE=MyISAM CHARACTER SET utf8; +INSERT INTO t VALUES (REPEAT('a',16384)),(REPEAT('b',16384)); +SET OPTIMIZER_SWITCH = 'optimize_join_buffer_size=off'; +SET JOIN_BUFFER_SIZE = 16384; +explain SELECT length(concat(t1.f,t2.f)) FROM t t1, t t2; +SELECT length(concat(t1.f,t2.f)) FROM t t1, t t2; +DROP TABLE t; +set @@optimizer_switch=@org_optimizer_switch; +set @@join_buffer_size=@org_join_buffer_size; diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index 7d61ce31cca..1319fd59a99 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -945,6 +945,9 @@ int JOIN_CACHE::alloc_buffer() join_buff_space_limit)) goto fail; // Fatal error } + else if (curr_min_buff_space_sz > buff_size) + goto fail; + if (for_explain_only) return 0; From 1d0e3d80d84c2b375a444cdbb41c28afd78e98b0 Mon Sep 17 00:00:00 2001 From: Anel Husakovic Date: Tue, 9 May 2023 15:39:15 +0200 Subject: [PATCH 040/171] MDEV-31230: Fix CONNECT_JDBC in CMake - Fix feature summary - Use native CMake module instead of `CMAKE_MODULE_PATH` - Make Java and JNI package as required Reviewer: --- cmake/FindJNI.cmake | 13 --------- cmake/FindJava.cmake | 13 --------- storage/connect/CMakeLists.txt | 53 +++++++++++++++++----------------- 3 files changed, 26 insertions(+), 53 deletions(-) delete mode 100644 cmake/FindJNI.cmake delete mode 100644 cmake/FindJava.cmake diff --git a/cmake/FindJNI.cmake b/cmake/FindJNI.cmake deleted file mode 100644 index b2c6f849c87..00000000000 --- a/cmake/FindJNI.cmake +++ /dev/null @@ -1,13 +0,0 @@ -if(JAVA_AWT_LIBRARY AND JAVA_INCLUDE_PATH) - set(JNI_FOUND TRUE) - return() -endif() -if(DEFINED JAVA_AWT_LIBRARY) - set(JNI_FOUND FALSE) - return() -endif() - -set(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) -unset(CMAKE_MODULE_PATH) -include(FindJNI) -set(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH}) diff --git a/cmake/FindJava.cmake b/cmake/FindJava.cmake deleted file mode 100644 index 714f56b1f72..00000000000 --- a/cmake/FindJava.cmake +++ /dev/null @@ -1,13 +0,0 @@ -if(Java_JAVA_EXECUTABLE) - set(JAVA_FOUND TRUE) - return() -endif() -if(DEFINED Java_JAVA_EXECUTABLE) - set(JAVA_FOUND FALSE) - return() -endif() - -set(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) -unset(CMAKE_MODULE_PATH) -include(FindJava) -set(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH}) diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index d4c19e9e34b..d225f27c1c2 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -270,40 +270,39 @@ ADD_FEATURE_INFO(CONNECT_ODBC ODBC_LIBRARY "Support for ODBC in the CONNECT stor # # JDBC with MongoDB Java Driver included but disabled if without MONGO # + OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON) OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) IF(CONNECT_WITH_JDBC) - FIND_PACKAGE(Java 1.6) + SET(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) + UNSET(CMAKE_MODULE_PATH) + FIND_PACKAGE(Java 1.6 REQUIRED) SET_PACKAGE_PROPERTIES(Java PROPERTIES TYPE OPTIONAL) - FIND_PACKAGE(JNI) + FIND_PACKAGE(JNI REQUIRED) SET_PACKAGE_PROPERTIES(JNI PROPERTIES TYPE OPTIONAL) - IF (JAVA_FOUND AND JNI_FOUND) - INCLUDE(UseJava) - INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH}) - INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH2}) - # SET(JDBC_LIBRARY ${JAVA_JVM_LIBRARY}) will be dynamically linked + INCLUDE(UseJava) + INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH}) + INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH2}) + # SET(JDBC_LIBRARY ${JAVA_JVM_LIBRARY}) will be dynamically linked + SET(CONNECT_SOURCES ${CONNECT_SOURCES} + javaconn.cpp jdbconn.cpp tabjdbc.cpp + jmgfam.cpp jmgoconn.cpp mongo.cpp tabjmg.cpp + jdbccat.h javaconn.h jdbconn.h tabjdbc.h + jmgfam.h jmgoconn.h mongo.h tabjmg.h + JdbcInterface.java ApacheInterface.java MariadbInterface.java + MysqlInterface.java OracleInterface.java PostgresqlInterface.java + Mongo2Interface.java Mongo3Interface.java + mysql-test/connect/std_data/JavaWrappers.jar) + add_definitions(-DJAVA_SUPPORT) + IF(CONNECT_WITH_MONGO) SET(CONNECT_SOURCES ${CONNECT_SOURCES} - javaconn.cpp jdbconn.cpp tabjdbc.cpp - jmgfam.cpp jmgoconn.cpp mongo.cpp tabjmg.cpp - jdbccat.h javaconn.h jdbconn.h tabjdbc.h - jmgfam.h jmgoconn.h mongo.h tabjmg.h - JdbcInterface.java ApacheInterface.java MariadbInterface.java - MysqlInterface.java OracleInterface.java PostgresqlInterface.java - Mongo2Interface.java Mongo3Interface.java - mysql-test/connect/std_data/JavaWrappers.jar) - add_definitions(-DJAVA_SUPPORT) - ADD_FEATURE_INFO(CONNECT_JDBC "ON" "Support for JDBC in the CONNECT storage engine") - IF(CONNECT_WITH_MONGO) - SET(CONNECT_SOURCES ${CONNECT_SOURCES} - mysql-test/connect/std_data/Mongo2.jar - mysql-test/connect/std_data/Mongo3.jar) - add_definitions(-DMONGO_SUPPORT) - ENDIF() - ELSE() - SET(JDBC_LIBRARY "") - ADD_FEATURE_INFO(CONNECT_JDBC "OFF" "Support for JDBC in the CONNECT storage engine") - ENDIF() + mysql-test/connect/std_data/Mongo2.jar + mysql-test/connect/std_data/Mongo3.jar) + add_definitions(-DMONGO_SUPPORT) + ENDIF(CONNECT_WITH_MONGO) + SET(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH}) + ADD_FEATURE_INFO(CONNECT_JDBC "ON" "Support for JDBC in the CONNECT storage engine") ELSE(CONNECT_WITH_JDBC) ADD_FEATURE_INFO(CONNECT_JDBC "OFF" "Support for JDBC in the CONNECT storage engine") ENDIF(CONNECT_WITH_JDBC) From 94e5b43ff5affe8337c93ab6b8e13c827f132518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Thu, 25 May 2023 15:26:46 +0300 Subject: [PATCH 041/171] MDEV-31335 : Create sequence can cause inconsistency Do not start TOI for CREATE TEMPORARY SEQUENCE because object is local only and not replicated. Similarly, avoid starting RSU for TEMPORARY SEQUENCEs. Finally, we need to run commit hooks for TEMPORARY SEQUENCEs because CREATE TEMPORARY SEQUENCE does implicit commit for previous changes that need to be replicated and committed. Signed-off-by: Julius Goryavsky --- .../suite/galera/r/galera_sequences.result | 9 ++-- .../r/galera_temporary_sequences.result | 46 +++++++++++++++++++ .../suite/galera/t/galera_sequences.test | 16 +++---- .../galera/t/galera_temporary_sequences.test | 37 +++++++++++++++ sql/wsrep_mysqld.cc | 17 +++++++ sql/wsrep_trans_observer.h | 11 +++-- 6 files changed, 121 insertions(+), 15 deletions(-) create mode 100644 mysql-test/suite/galera/r/galera_temporary_sequences.result create mode 100644 mysql-test/suite/galera/t/galera_temporary_sequences.test diff --git a/mysql-test/suite/galera/r/galera_sequences.result b/mysql-test/suite/galera/r/galera_sequences.result index ec3adec8924..e696a707cdf 100644 --- a/mysql-test/suite/galera/r/galera_sequences.result +++ b/mysql-test/suite/galera/r/galera_sequences.result @@ -79,30 +79,31 @@ SET SESSION autocommit=1; DROP SEQUENCE seq1; DROP SEQUENCE seq2; DROP TABLE t2; +connection node_2; SET SESSION AUTOCOMMIT=0; SET SESSION wsrep_OSU_method='RSU'; CREATE TABLE t1(c1 VARCHAR(10)); -INSERT INTO t1 (c1) VALUES(''); create temporary sequence sq1 NOCACHE engine=innodb; create sequence sq2 NOCACHE engine=innodb; COMMIT; +SET SESSION wsrep_OSU_method='TOI'; SHOW CREATE SEQUENCE sq1; Table Create Table sq1 CREATE SEQUENCE `sq1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 nocache nocycle ENGINE=InnoDB SHOW CREATE SEQUENCE sq2; Table Create Table sq2 CREATE SEQUENCE `sq2` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 nocache nocycle ENGINE=InnoDB -connection node_2; +connection node_1; SHOW CREATE SEQUENCE sq1; ERROR 42S02: Table 'test.sq1' doesn't exist SHOW CREATE SEQUENCE sq2; ERROR 42S02: Table 'test.sq2' doesn't exist -connection node_1; +connection node_2; SET SESSION AUTOCOMMIT=1; DROP TABLE t1; DROP SEQUENCE sq1; DROP SEQUENCE sq2; -SET SESSION wsrep_OSU_method='TOI'; +connection node_1; CREATE TABLE t (f INT) engine=innodb; LOCK TABLE t WRITE; CREATE OR REPLACE SEQUENCE t MAXVALUE=13 INCREMENT BY 1 NOCACHE engine=innodb; diff --git a/mysql-test/suite/galera/r/galera_temporary_sequences.result b/mysql-test/suite/galera/r/galera_temporary_sequences.result new file mode 100644 index 00000000000..af80551c40b --- /dev/null +++ b/mysql-test/suite/galera/r/galera_temporary_sequences.result @@ -0,0 +1,46 @@ +connection node_2; +connection node_1; +connection node_2; +SET AUTOCOMMIT=0; +SET SESSION wsrep_OSU_method='RSU'; +CREATE TABLE t (i int primary key, j int); +CREATE TEMPORARY SEQUENCE seq2 NOCACHE ENGINE=InnoDB; +COMMIT; +SET SESSION wsrep_OSU_method='RSU'; +CREATE SEQUENCE seq1 NOCACHE ENGINE=InnoDB; +SET SESSION wsrep_OSU_method='TOI'; +DROP TABLE t; +DROP SEQUENCE seq2; +DROP SEQUENCE seq1; +connection node_1; +CREATE TABLE t (i int primary key, j int) ENGINE=InnoDB; +SET AUTOCOMMIT=0; +INSERT INTO t VALUES (3,0); +CREATE TEMPORARY SEQUENCE seq1 NOCACHE ENGINE=InnoDB; +COMMIT; +INSERT INTO t VALUES (4,0); +CREATE SEQUENCE seq2 NOCACHE ENGINE=InnoDB; +commit; +connection node_2; +SELECT * FROM t; +i j +3 0 +4 0 +SHOW CREATE TABLE seq1; +ERROR 42S02: Table 'test.seq1' doesn't exist +SHOW CREATE TABLE seq2; +Table Create Table +seq2 CREATE TABLE `seq2` ( + `next_not_cached_value` bigint(21) NOT NULL, + `minimum_value` bigint(21) NOT NULL, + `maximum_value` bigint(21) NOT NULL, + `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', + `increment` bigint(21) NOT NULL COMMENT 'increment value', + `cache_size` bigint(21) unsigned NOT NULL, + `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', + `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' +) ENGINE=InnoDB SEQUENCE=1 +connection node_1; +DROP TABLE t; +DROP SEQUENCE seq1; +DROP SEQUENCE seq2; diff --git a/mysql-test/suite/galera/t/galera_sequences.test b/mysql-test/suite/galera/t/galera_sequences.test index 2582c204435..5c03ab973e0 100644 --- a/mysql-test/suite/galera/t/galera_sequences.test +++ b/mysql-test/suite/galera/t/galera_sequences.test @@ -72,33 +72,33 @@ DROP TABLE t2; # # Case2 # +--connection node_2 SET SESSION AUTOCOMMIT=0; SET SESSION wsrep_OSU_method='RSU'; CREATE TABLE t1(c1 VARCHAR(10)); -INSERT INTO t1 (c1) VALUES(''); create temporary sequence sq1 NOCACHE engine=innodb; create sequence sq2 NOCACHE engine=innodb; COMMIT; +SET SESSION wsrep_OSU_method='TOI'; SHOW CREATE SEQUENCE sq1; SHOW CREATE SEQUENCE sq2; ---connection node_2 ---error ER_NO_SUCH_TABLE -SHOW CREATE SEQUENCE sq1; ---error ER_NO_SUCH_TABLE -SHOW CREATE SEQUENCE sq2; --connection node_1 +--error ER_NO_SUCH_TABLE +SHOW CREATE SEQUENCE sq1; +--error ER_NO_SUCH_TABLE +SHOW CREATE SEQUENCE sq2; +--connection node_2 SET SESSION AUTOCOMMIT=1; DROP TABLE t1; DROP SEQUENCE sq1; DROP SEQUENCE sq2; -SET SESSION wsrep_OSU_method='TOI'; # # MDEV-30388 Assertion `!wsrep_has_changes(thd) || (thd->lex->sql_command == SQLCOM_CREATE_TABLE # && !thd->is_current_stmt_binlog_format_row()) || # thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted' failed # - +--connection node_1 CREATE TABLE t (f INT) engine=innodb; LOCK TABLE t WRITE; CREATE OR REPLACE SEQUENCE t MAXVALUE=13 INCREMENT BY 1 NOCACHE engine=innodb; diff --git a/mysql-test/suite/galera/t/galera_temporary_sequences.test b/mysql-test/suite/galera/t/galera_temporary_sequences.test new file mode 100644 index 00000000000..c46c4243514 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_temporary_sequences.test @@ -0,0 +1,37 @@ +--source include/galera_cluster.inc +--source include/have_sequence.inc + +--connection node_2 +SET AUTOCOMMIT=0; +SET SESSION wsrep_OSU_method='RSU'; +CREATE TABLE t (i int primary key, j int); +CREATE TEMPORARY SEQUENCE seq2 NOCACHE ENGINE=InnoDB; +COMMIT; +SET SESSION wsrep_OSU_method='RSU'; +CREATE SEQUENCE seq1 NOCACHE ENGINE=InnoDB; +SET SESSION wsrep_OSU_method='TOI'; +DROP TABLE t; +DROP SEQUENCE seq2; +DROP SEQUENCE seq1; + +--connection node_1 +CREATE TABLE t (i int primary key, j int) ENGINE=InnoDB; +SET AUTOCOMMIT=0; +INSERT INTO t VALUES (3,0); +CREATE TEMPORARY SEQUENCE seq1 NOCACHE ENGINE=InnoDB; +COMMIT; +INSERT INTO t VALUES (4,0); +CREATE SEQUENCE seq2 NOCACHE ENGINE=InnoDB; +commit; + +--connection node_2 +SELECT * FROM t; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE seq1; +SHOW CREATE TABLE seq2; + + +--connection node_1 +DROP TABLE t; +DROP SEQUENCE seq1; +DROP SEQUENCE seq2; diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 903ed56d948..a8247f977cf 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1975,6 +1975,15 @@ static bool wsrep_can_run_in_toi(THD *thd, const char *db, const char *table, } return true; + case SQLCOM_CREATE_SEQUENCE: + /* No TOI for temporary sequences as they are + not replicated */ + if (thd->lex->tmp_table()) + { + return false; + } + return true; + default: if (table && !thd->find_temporary_table(db, table)) { @@ -2233,6 +2242,14 @@ static int wsrep_RSU_begin(THD *thd, const char *db_, const char *table_) { WSREP_DEBUG("RSU BEGIN: %lld, : %s", wsrep_thd_trx_seqno(thd), wsrep_thd_query(thd)); + + /* For CREATE TEMPORARY SEQUENCE we do not start RSU because + object is local only and actually CREATE TABLE + INSERT + */ + if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && + thd->lex->tmp_table()) + return 1; + if (thd->wsrep_cs().begin_rsu(5000)) { WSREP_WARN("RSU begin failed"); diff --git a/sql/wsrep_trans_observer.h b/sql/wsrep_trans_observer.h index 83079d5a083..4c9346739fe 100644 --- a/sql/wsrep_trans_observer.h +++ b/sql/wsrep_trans_observer.h @@ -217,13 +217,18 @@ static inline bool wsrep_run_commit_hook(THD* thd, bool all) mysql_mutex_lock(&thd->LOCK_thd_data); /* Transaction creating sequence is TOI or RSU, - CREATE [TEMPORARY] SEQUENCE = CREATE + INSERT (initial value) + CREATE SEQUENCE = CREATE + INSERT (initial value) and replicated using statement based replication, thus - the commit hooks will be skipped */ + the commit hooks will be skipped. + + For TEMPORARY SEQUENCES commit hooks will be done as + CREATE + INSERT is not replicated and needs to be + committed locally. */ if (ret && (thd->wsrep_cs().mode() == wsrep::client_state::m_toi || thd->wsrep_cs().mode() == wsrep::client_state::m_rsu) && - thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE) + thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && + !thd->lex->tmp_table()) ret= false; mysql_mutex_unlock(&thd->LOCK_thd_data); From 2771890bab51f716c36541e51940b8b056ca6933 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Thu, 18 May 2023 12:08:40 +1000 Subject: [PATCH 042/171] =?UTF-8?q?MDEV-31301=20sql/opt=5Fsplit.cc:1043:5:?= =?UTF-8?q?=20warning:=20=E2=80=98best=5Fparam=5Ftables=E2=80=99=20may=20b?= =?UTF-8?q?e=20used=20uninitialized?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The warning is true, it needs to be initialized. Caused by: MDEV-26301 / ce7ffe61d836 --- sql/opt_split.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/opt_split.cc b/sql/opt_split.cc index 6d816552baf..3b3658cb66b 100644 --- a/sql/opt_split.cc +++ b/sql/opt_split.cc @@ -963,7 +963,7 @@ SplM_plan_info * JOIN_TAB::choose_best_splitting(uint idx, SplM_plan_info *spl_plan= 0; uint best_key= 0; uint best_key_parts= 0; - table_map best_param_tables; + table_map best_param_tables= 0L; Json_writer_object trace_obj(thd, "choose_best_splitting"); Json_writer_array trace_arr(thd, "considered_keys"); /* From bd1eb89d7fa90b950bcf0dd0bfad4254965d1283 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Fri, 2 Jun 2023 10:52:28 +1000 Subject: [PATCH 043/171] Adding .ccls-cache/ to .gitignore generated by the language server ccls --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 437bd2023d7..afbd26ec2a5 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ *.rpm .*.swp *.ninja +.ccls-cache/ .ninja_* .gdb_history .vs/ From dc9498beb6f79f08edd02fb7f7153e5150a33f7d Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 2 Jun 2023 09:02:09 +0200 Subject: [PATCH 044/171] Revert "MDEV-31230: Fix CONNECT_JDBC in CMake" This reverts commit 1d0e3d80d84c2b375a444cdbb41c28afd78e98b0. --- cmake/FindJNI.cmake | 13 +++++++++ cmake/FindJava.cmake | 13 +++++++++ storage/connect/CMakeLists.txt | 53 +++++++++++++++++----------------- 3 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 cmake/FindJNI.cmake create mode 100644 cmake/FindJava.cmake diff --git a/cmake/FindJNI.cmake b/cmake/FindJNI.cmake new file mode 100644 index 00000000000..b2c6f849c87 --- /dev/null +++ b/cmake/FindJNI.cmake @@ -0,0 +1,13 @@ +if(JAVA_AWT_LIBRARY AND JAVA_INCLUDE_PATH) + set(JNI_FOUND TRUE) + return() +endif() +if(DEFINED JAVA_AWT_LIBRARY) + set(JNI_FOUND FALSE) + return() +endif() + +set(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) +unset(CMAKE_MODULE_PATH) +include(FindJNI) +set(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH}) diff --git a/cmake/FindJava.cmake b/cmake/FindJava.cmake new file mode 100644 index 00000000000..714f56b1f72 --- /dev/null +++ b/cmake/FindJava.cmake @@ -0,0 +1,13 @@ +if(Java_JAVA_EXECUTABLE) + set(JAVA_FOUND TRUE) + return() +endif() +if(DEFINED Java_JAVA_EXECUTABLE) + set(JAVA_FOUND FALSE) + return() +endif() + +set(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) +unset(CMAKE_MODULE_PATH) +include(FindJava) +set(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH}) diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index d225f27c1c2..d4c19e9e34b 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -270,39 +270,40 @@ ADD_FEATURE_INFO(CONNECT_ODBC ODBC_LIBRARY "Support for ODBC in the CONNECT stor # # JDBC with MongoDB Java Driver included but disabled if without MONGO # - OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON) OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) IF(CONNECT_WITH_JDBC) - SET(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) - UNSET(CMAKE_MODULE_PATH) - FIND_PACKAGE(Java 1.6 REQUIRED) + FIND_PACKAGE(Java 1.6) SET_PACKAGE_PROPERTIES(Java PROPERTIES TYPE OPTIONAL) - FIND_PACKAGE(JNI REQUIRED) + FIND_PACKAGE(JNI) SET_PACKAGE_PROPERTIES(JNI PROPERTIES TYPE OPTIONAL) - INCLUDE(UseJava) - INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH}) - INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH2}) - # SET(JDBC_LIBRARY ${JAVA_JVM_LIBRARY}) will be dynamically linked - SET(CONNECT_SOURCES ${CONNECT_SOURCES} - javaconn.cpp jdbconn.cpp tabjdbc.cpp - jmgfam.cpp jmgoconn.cpp mongo.cpp tabjmg.cpp - jdbccat.h javaconn.h jdbconn.h tabjdbc.h - jmgfam.h jmgoconn.h mongo.h tabjmg.h - JdbcInterface.java ApacheInterface.java MariadbInterface.java - MysqlInterface.java OracleInterface.java PostgresqlInterface.java - Mongo2Interface.java Mongo3Interface.java - mysql-test/connect/std_data/JavaWrappers.jar) - add_definitions(-DJAVA_SUPPORT) - IF(CONNECT_WITH_MONGO) + IF (JAVA_FOUND AND JNI_FOUND) + INCLUDE(UseJava) + INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH}) + INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH2}) + # SET(JDBC_LIBRARY ${JAVA_JVM_LIBRARY}) will be dynamically linked SET(CONNECT_SOURCES ${CONNECT_SOURCES} - mysql-test/connect/std_data/Mongo2.jar - mysql-test/connect/std_data/Mongo3.jar) - add_definitions(-DMONGO_SUPPORT) - ENDIF(CONNECT_WITH_MONGO) - SET(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH}) - ADD_FEATURE_INFO(CONNECT_JDBC "ON" "Support for JDBC in the CONNECT storage engine") + javaconn.cpp jdbconn.cpp tabjdbc.cpp + jmgfam.cpp jmgoconn.cpp mongo.cpp tabjmg.cpp + jdbccat.h javaconn.h jdbconn.h tabjdbc.h + jmgfam.h jmgoconn.h mongo.h tabjmg.h + JdbcInterface.java ApacheInterface.java MariadbInterface.java + MysqlInterface.java OracleInterface.java PostgresqlInterface.java + Mongo2Interface.java Mongo3Interface.java + mysql-test/connect/std_data/JavaWrappers.jar) + add_definitions(-DJAVA_SUPPORT) + ADD_FEATURE_INFO(CONNECT_JDBC "ON" "Support for JDBC in the CONNECT storage engine") + IF(CONNECT_WITH_MONGO) + SET(CONNECT_SOURCES ${CONNECT_SOURCES} + mysql-test/connect/std_data/Mongo2.jar + mysql-test/connect/std_data/Mongo3.jar) + add_definitions(-DMONGO_SUPPORT) + ENDIF() + ELSE() + SET(JDBC_LIBRARY "") + ADD_FEATURE_INFO(CONNECT_JDBC "OFF" "Support for JDBC in the CONNECT storage engine") + ENDIF() ELSE(CONNECT_WITH_JDBC) ADD_FEATURE_INFO(CONNECT_JDBC "OFF" "Support for JDBC in the CONNECT storage engine") ENDIF(CONNECT_WITH_JDBC) From 270c233847cb89ccab28c58c85251a8fba9fbcda Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 2 Jun 2023 10:46:02 +0200 Subject: [PATCH 045/171] clarify why cmake is looking for Java and JNI --- storage/connect/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index d4c19e9e34b..20cd4ad3ee1 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -275,9 +275,11 @@ OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) IF(CONNECT_WITH_JDBC) FIND_PACKAGE(Java 1.6) - SET_PACKAGE_PROPERTIES(Java PROPERTIES TYPE OPTIONAL) + SET_PACKAGE_PROPERTIES(Java PROPERTIES TYPE OPTIONAL + PURPOSE "Required for the CONNECT_JDBC feature") FIND_PACKAGE(JNI) - SET_PACKAGE_PROPERTIES(JNI PROPERTIES TYPE OPTIONAL) + SET_PACKAGE_PROPERTIES(JNI PROPERTIES TYPE OPTIONAL + PURPOSE "Required for the CONNECT_JDBC feature") IF (JAVA_FOUND AND JNI_FOUND) INCLUDE(UseJava) INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH}) From d785fa8d0bf3ca8521ef304838c6fa817e8f1b0c Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 2 Jun 2023 12:12:00 +0200 Subject: [PATCH 046/171] cmake warnings --- CMakeLists.txt | 4 ++-- storage/mroonga/vendor/groonga/CMakeLists.txt | 2 +- .../vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt | 2 +- storage/tokudb/CMakeLists.txt | 4 ++++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 78ff7c0fb9b..7e5f3e157c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,8 +27,6 @@ IF(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) "None" "Debug" "Release" "MinSizeRel" "RelWithDebInfo") ENDIF() -PROJECT(MySQL) - IF(POLICY CMP0022) CMAKE_POLICY(SET CMP0022 NEW) ENDIF() @@ -42,6 +40,8 @@ IF(POLICY CMP0075) CMAKE_POLICY(SET CMP0075 NEW) ENDIF() +PROJECT(MySQL) + MESSAGE(STATUS "Running cmake version ${CMAKE_VERSION}") SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} diff --git a/storage/mroonga/vendor/groonga/CMakeLists.txt b/storage/mroonga/vendor/groonga/CMakeLists.txt index 8afa53be1e0..1d106588fd8 100644 --- a/storage/mroonga/vendor/groonga/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/CMakeLists.txt @@ -15,7 +15,7 @@ # https://buildbot.askmonty.org/buildbot/builders/work-amd64-valgrind/builds/5263/steps/compile/logs/stdio # says CMake 2.6.2... We want to drop old software support... -cmake_minimum_required(VERSION 2.6.2) +cmake_minimum_required(VERSION 2.8.12) # cmake_minimum_required(VERSION 2.6.4) # CentOS 5 set(GRN_PROJECT_NAME "groonga") set(GRN_PROJECT_LABEL "Groonga") diff --git a/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt b/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt index 4c2aa343089..96f9b3e6bbf 100644 --- a/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt @@ -15,7 +15,7 @@ # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, # MA 02110-1335 USA -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 2.8.12) if(NOT DEFINED GROONGA_NORMALIZER_MYSQL_PROJECT_NAME) set(GROONGA_NORMALIZER_MYSQL_PROJECT_NAME "groonga-normalizer-mysql") endif() diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index ee91807c619..65110f7d8bd 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -3,6 +3,10 @@ SET(CPACK_RPM_tokudb-engine_PACKAGE_DESCRIPTION "The TokuDB storage engine is fo environments, offering increased compression and better performance based on fractal indexes." PARENT_SCOPE) +IF(POLICY CMP0115) + CMAKE_POLICY(SET CMP0115 OLD) +ENDIF() + SET(TOKUDB_VERSION 5.6.49-89.0) # PerconaFT only supports x86-64 and cmake-2.8.9+ IF(WIN32) From d14c485e1c5c9a53dcfc64ae17c66212cbbf7df5 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 2 Jun 2023 12:49:17 +0200 Subject: [PATCH 047/171] test fixes for 32bit * disable main.join_cache_notasan on 32bit as it uses join_buffer_size=5250229460064350213; * update sysvars_server_embedded,32bit.rdiff --- mysql-test/main/join_cache_notasan.test | 1 + .../r/sysvars_server_embedded,32bit.rdiff | 277 +++++++++--------- 2 files changed, 135 insertions(+), 143 deletions(-) diff --git a/mysql-test/main/join_cache_notasan.test b/mysql-test/main/join_cache_notasan.test index 7fd5e4e80b1..cfdfe4eff18 100644 --- a/mysql-test/main/join_cache_notasan.test +++ b/mysql-test/main/join_cache_notasan.test @@ -1,6 +1,7 @@ # # Tests that should be in join_cache but cannot be run with ASAN +--source include/have_64bit.inc --source include/not_asan.inc --source include/have_innodb.inc diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff index 6fa25546ad1..d869b2812f0 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff @@ -1,7 +1,7 @@ --- ../../mysql-test/suite/sys_vars/r/sysvars_server_embedded.result 2022-01-27 20:42:19.039084441 +0200 +++ ../../mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.result~ 2022-01-28 16:12:40.038627481 +0200 -@@ -14,7 +14,7 @@ - order by variable_name; +@@ -34,7 +34,7 @@ READ_ONLY NO + COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_BLOCK_SIZE VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED @@ -45,7 +45,7 @@ VARIABLE_COMMENT Interval between commite in microseconds (1/1000000c). 0 stands for no waiting for other threads to come and do a commit in "hard" mode and no sync()/commit at all in "soft" mode. Option has only an effect if aria_group_commit is used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -104,7 +104,7 @@ READ_ONLY NO +@@ -114,7 +114,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_LOG_FILE_SIZE VARIABLE_SCOPE GLOBAL @@ -54,7 +54,7 @@ VARIABLE_COMMENT Limit for transaction log size NUMERIC_MIN_VALUE 8388608 NUMERIC_MAX_VALUE 4294967295 -@@ -134,10 +134,10 @@ READ_ONLY NO +@@ -144,10 +144,10 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_AGE_THRESHOLD VARIABLE_SCOPE GLOBAL @@ -67,7 +67,7 @@ NUMERIC_BLOCK_SIZE 100 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -154,7 +154,7 @@ READ_ONLY YES +@@ -164,7 +164,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_DIVISION_LIMIT VARIABLE_SCOPE GLOBAL @@ -76,7 +76,7 @@ VARIABLE_COMMENT The minimum percentage of warm blocks in key cache NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100 -@@ -164,7 +164,7 @@ READ_ONLY NO +@@ -174,7 +174,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_FILE_HASH_SIZE VARIABLE_SCOPE GLOBAL @@ -85,7 +85,7 @@ VARIABLE_COMMENT Number of hash buckets for open and changed files. If you have a lot of Aria files open you should increase this for faster flush of changes. A good value is probably 1/10 of number of possible open Aria files. NUMERIC_MIN_VALUE 128 NUMERIC_MAX_VALUE 16384 -@@ -194,7 +194,7 @@ READ_ONLY NO +@@ -204,7 +204,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ARIA_REPAIR_THREADS VARIABLE_SCOPE SESSION @@ -94,16 +94,16 @@ VARIABLE_COMMENT Number of threads to use when repairing Aria tables. The value of 1 disables parallel repair. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -207,7 +207,7 @@ VARIABLE_SCOPE SESSION +@@ -217,7 +217,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. NUMERIC_MIN_VALUE 16376 --NUMERIC_MAX_VALUE 18446744073709551615 +-NUMERIC_MAX_VALUE 1152921504606846975 +NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -264,7 +264,7 @@ READ_ONLY NO +@@ -274,7 +274,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME AUTO_INCREMENT_INCREMENT VARIABLE_SCOPE SESSION @@ -112,7 +112,7 @@ VARIABLE_COMMENT Auto-increment columns are incremented by this NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -274,7 +274,7 @@ READ_ONLY NO +@@ -284,7 +284,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME AUTO_INCREMENT_OFFSET VARIABLE_SCOPE SESSION @@ -121,7 +121,7 @@ VARIABLE_COMMENT Offset added to Auto-increment columns. Used when auto-increment-increment != 1 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -284,7 +284,7 @@ READ_ONLY NO +@@ -294,7 +294,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME BACK_LOG VARIABLE_SCOPE GLOBAL @@ -130,7 +130,7 @@ VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -337,7 +337,7 @@ VARIABLE_SCOPE GLOBAL +@@ -347,7 +347,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the transactional cache for updates to transactional engines for the binary log. If you often use transactions containing many statements, you can increase this to get more performance NUMERIC_MIN_VALUE 4096 @@ -139,7 +139,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -354,20 +354,20 @@ READ_ONLY NO +@@ -364,20 +364,20 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME BINLOG_COMMIT_WAIT_COUNT VARIABLE_SCOPE GLOBAL @@ -164,7 +164,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -387,7 +387,7 @@ VARIABLE_SCOPE GLOBAL +@@ -397,7 +397,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of file cache for the binary log NUMERIC_MIN_VALUE 8192 @@ -173,7 +173,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -427,7 +427,7 @@ VARIABLE_SCOPE GLOBAL +@@ -437,7 +437,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance. NUMERIC_MIN_VALUE 4096 @@ -182,7 +182,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -437,7 +437,7 @@ VARIABLE_SCOPE SESSION +@@ -447,7 +447,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Size of tree cache used in bulk insert optimisation. Note that this is a limit per thread! NUMERIC_MIN_VALUE 0 @@ -191,7 +191,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -624,7 +624,7 @@ READ_ONLY NO +@@ -634,7 +634,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME CONNECT_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -200,7 +200,7 @@ VARIABLE_COMMENT The number of seconds the mysqld server is waiting for a connect packet before responding with 'Bad handshake' NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 31536000 -@@ -674,7 +674,7 @@ READ_ONLY YES +@@ -684,7 +684,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_SEARCH_DEPTH_LONG VARIABLE_SCOPE SESSION @@ -209,7 +209,7 @@ VARIABLE_COMMENT Long search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 33 -@@ -684,7 +684,7 @@ READ_ONLY NO +@@ -694,7 +694,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_SEARCH_DEPTH_SHORT VARIABLE_SCOPE SESSION @@ -218,7 +218,7 @@ VARIABLE_COMMENT Short search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 32 -@@ -694,7 +694,7 @@ READ_ONLY NO +@@ -704,7 +704,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_TIMEOUT_LONG VARIABLE_SCOPE SESSION @@ -227,7 +227,7 @@ VARIABLE_COMMENT Long timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -704,7 +704,7 @@ READ_ONLY NO +@@ -714,7 +714,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_TIMEOUT_SHORT VARIABLE_SCOPE SESSION @@ -236,7 +236,7 @@ VARIABLE_COMMENT Short timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -754,7 +754,7 @@ READ_ONLY NO +@@ -764,7 +764,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME DEFAULT_WEEK_FORMAT VARIABLE_SCOPE SESSION @@ -245,7 +245,7 @@ VARIABLE_COMMENT The default week format used by WEEK() functions NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 7 -@@ -764,7 +764,7 @@ READ_ONLY NO +@@ -774,7 +774,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_INSERT_LIMIT VARIABLE_SCOPE GLOBAL @@ -254,7 +254,7 @@ VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -774,7 +774,7 @@ READ_ONLY NO +@@ -784,7 +784,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_INSERT_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -263,7 +263,7 @@ VARIABLE_COMMENT How long a INSERT DELAYED thread should wait for INSERT statements before terminating NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -784,7 +784,7 @@ READ_ONLY NO +@@ -794,7 +794,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_QUEUE_SIZE VARIABLE_SCOPE GLOBAL @@ -272,7 +272,7 @@ VARIABLE_COMMENT What size queue (in rows) should be allocated for handling INSERT DELAYED. If the queue becomes full, any client that does INSERT DELAYED will wait until there is room in the queue again NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -814,7 +814,7 @@ READ_ONLY NO +@@ -824,7 +824,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME DIV_PRECISION_INCREMENT VARIABLE_SCOPE SESSION @@ -281,7 +281,7 @@ VARIABLE_COMMENT Precision of the result of '/' operator will be increased on that value NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 38 -@@ -894,7 +894,7 @@ READ_ONLY NO +@@ -904,7 +904,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME EXPIRE_LOGS_DAYS VARIABLE_SCOPE GLOBAL @@ -290,7 +290,7 @@ VARIABLE_COMMENT If non-zero, binary logs will be purged after expire_logs_days days; possible purges happen at startup and at binary log rotation NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 99 -@@ -924,7 +924,7 @@ READ_ONLY YES +@@ -934,7 +934,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME EXTRA_MAX_CONNECTIONS VARIABLE_SCOPE GLOBAL @@ -299,7 +299,7 @@ VARIABLE_COMMENT The number of connections on extra-port NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100000 -@@ -954,7 +954,7 @@ READ_ONLY NO +@@ -964,7 +964,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME FLUSH_TIME VARIABLE_SCOPE GLOBAL @@ -308,7 +308,7 @@ VARIABLE_COMMENT A dedicated thread is created to flush all tables at the given interval NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -984,7 +984,7 @@ READ_ONLY NO +@@ -994,7 +994,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_MAX_WORD_LEN VARIABLE_SCOPE GLOBAL @@ -317,7 +317,7 @@ VARIABLE_COMMENT The maximum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -994,7 +994,7 @@ READ_ONLY YES +@@ -1004,7 +1004,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_MIN_WORD_LEN VARIABLE_SCOPE GLOBAL @@ -326,7 +326,7 @@ VARIABLE_COMMENT The minimum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 84 -@@ -1004,7 +1004,7 @@ READ_ONLY YES +@@ -1014,7 +1014,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_QUERY_EXPANSION_LIMIT VARIABLE_SCOPE GLOBAL @@ -335,16 +335,7 @@ VARIABLE_COMMENT Number of best matches to use for query expansion NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -1047,7 +1047,7 @@ VARIABLE_SCOPE SESSION - VARIABLE_TYPE BIGINT UNSIGNED - VARIABLE_COMMENT The maximum length of the result of function GROUP_CONCAT() - NUMERIC_MIN_VALUE 4 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 1 - ENUM_VALUE_LIST NULL - READ_ONLY NO -@@ -1174,7 +1174,7 @@ READ_ONLY YES +@@ -1184,7 +1184,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME HISTOGRAM_SIZE VARIABLE_SCOPE SESSION @@ -353,7 +344,7 @@ VARIABLE_COMMENT Number of bytes used for a histogram. If set to 0, no histograms are created by ANALYZE. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -1204,7 +1204,7 @@ READ_ONLY YES +@@ -1214,7 +1214,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME HOST_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -362,7 +353,7 @@ VARIABLE_COMMENT How many host names should be cached to avoid resolving. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65536 -@@ -1314,7 +1314,7 @@ READ_ONLY NO +@@ -1324,7 +1324,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME INTERACTIVE_TIMEOUT VARIABLE_SCOPE SESSION @@ -371,7 +362,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on an interactive connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -1347,7 +1347,7 @@ VARIABLE_SCOPE SESSION +@@ -1357,7 +1357,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the buffer that is used for joins NUMERIC_MIN_VALUE 128 @@ -380,7 +371,7 @@ NUMERIC_BLOCK_SIZE 128 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1364,7 +1364,7 @@ READ_ONLY NO +@@ -1374,7 +1374,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME JOIN_CACHE_LEVEL VARIABLE_SCOPE SESSION @@ -389,7 +380,7 @@ VARIABLE_COMMENT Controls what join operations can be executed with join buffers. Odd numbers are used for plain join buffers while even numbers are used for linked buffers NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 8 -@@ -1387,7 +1387,7 @@ VARIABLE_SCOPE GLOBAL +@@ -1397,7 +1397,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the buffer used for index blocks for MyISAM tables. Increase this to get better index handling (for all reads and multiple writes) to as much as you can afford NUMERIC_MIN_VALUE 0 @@ -398,7 +389,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1544,7 +1544,7 @@ READ_ONLY YES +@@ -1554,7 +1554,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME LOCK_WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -407,7 +398,7 @@ VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -1664,7 +1664,7 @@ READ_ONLY NO +@@ -1674,7 +1674,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_RATE_LIMIT VARIABLE_SCOPE SESSION @@ -416,7 +407,7 @@ VARIABLE_COMMENT Write to slow log every #th slow query. Set to 1 to log everything. Increase it to reduce the size of the slow or the performance impact of slow logging NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1694,7 +1694,7 @@ READ_ONLY NO +@@ -1704,7 +1704,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_WARNINGS VARIABLE_SCOPE SESSION @@ -425,7 +416,7 @@ VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1744,7 +1744,7 @@ READ_ONLY NO +@@ -1754,7 +1754,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MAX_ALLOWED_PACKET VARIABLE_SCOPE SESSION @@ -434,7 +425,7 @@ VARIABLE_COMMENT Max packet length to send to or receive from the server NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -1757,14 +1757,14 @@ VARIABLE_SCOPE GLOBAL +@@ -1767,14 +1767,14 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the transactional cache NUMERIC_MIN_VALUE 4096 @@ -451,7 +442,7 @@ VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 1073741824 -@@ -1777,14 +1777,14 @@ VARIABLE_SCOPE GLOBAL +@@ -1787,14 +1787,14 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the statement cache NUMERIC_MIN_VALUE 4096 @@ -468,7 +459,7 @@ VARIABLE_COMMENT The number of simultaneous clients allowed NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 100000 -@@ -1794,7 +1794,7 @@ READ_ONLY NO +@@ -1804,7 +1804,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_CONNECT_ERRORS VARIABLE_SCOPE GLOBAL @@ -477,7 +468,7 @@ VARIABLE_COMMENT If there is more than this number of interrupted connections from a host this host will be blocked from further connections NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1804,7 +1804,7 @@ READ_ONLY NO +@@ -1814,7 +1814,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_DELAYED_THREADS VARIABLE_SCOPE SESSION @@ -486,7 +477,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -1824,7 +1824,7 @@ READ_ONLY YES +@@ -1834,7 +1834,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_ERROR_COUNT VARIABLE_SCOPE SESSION @@ -495,7 +486,7 @@ VARIABLE_COMMENT Max number of errors/warnings to store for a statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -1837,14 +1837,14 @@ VARIABLE_SCOPE SESSION +@@ -1847,14 +1847,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't allow creation of heap tables bigger than this NUMERIC_MIN_VALUE 16384 @@ -512,7 +503,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -1864,7 +1864,7 @@ READ_ONLY NO +@@ -1874,7 +1874,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_LENGTH_FOR_SORT_DATA VARIABLE_SCOPE SESSION @@ -521,7 +512,7 @@ VARIABLE_COMMENT Max number of bytes in sorted records NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -1874,7 +1874,7 @@ READ_ONLY NO +@@ -1884,7 +1884,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_LONG_DATA_SIZE VARIABLE_SCOPE GLOBAL @@ -530,7 +521,7 @@ VARIABLE_COMMENT The maximum BLOB length to send to server from mysql_send_long_data API. Deprecated option; use max_allowed_packet instead. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -1904,7 +1904,7 @@ READ_ONLY NO +@@ -1914,7 +1914,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_RECURSIVE_ITERATIONS VARIABLE_SCOPE SESSION @@ -539,7 +530,7 @@ VARIABLE_COMMENT Maximum number of iterations when executing recursive queries NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1917,14 +1917,14 @@ VARIABLE_SCOPE SESSION +@@ -1927,14 +1927,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The maximum size of the container of a rowid filter NUMERIC_MIN_VALUE 1024 @@ -556,7 +547,7 @@ VARIABLE_COMMENT Limit assumed max number of seeks when looking up rows based on a key NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1944,7 +1944,7 @@ READ_ONLY NO +@@ -1954,7 +1954,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SORT_LENGTH VARIABLE_SCOPE SESSION @@ -565,7 +556,7 @@ VARIABLE_COMMENT The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored) NUMERIC_MIN_VALUE 64 NUMERIC_MAX_VALUE 8388608 -@@ -1954,7 +1954,7 @@ READ_ONLY NO +@@ -1964,7 +1964,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SP_RECURSION_DEPTH VARIABLE_SCOPE SESSION @@ -574,7 +565,7 @@ VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -1974,7 +1974,7 @@ READ_ONLY NO +@@ -1984,7 +1984,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_TMP_TABLES VARIABLE_SCOPE SESSION @@ -583,7 +574,7 @@ VARIABLE_COMMENT Unused, will be removed. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1994,7 +1994,7 @@ READ_ONLY NO +@@ -2004,7 +2004,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_WRITE_LOCK_COUNT VARIABLE_SCOPE GLOBAL @@ -592,7 +583,7 @@ VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2004,7 +2004,7 @@ READ_ONLY NO +@@ -2014,7 +2014,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -601,7 +592,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -2014,7 +2014,7 @@ READ_ONLY YES +@@ -2024,7 +2024,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_HASH_INSTANCES VARIABLE_SCOPE GLOBAL @@ -610,7 +601,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2024,7 +2024,7 @@ READ_ONLY YES +@@ -2034,7 +2034,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MIN_EXAMINED_ROW_LIMIT VARIABLE_SCOPE SESSION @@ -619,7 +610,7 @@ VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2034,7 +2034,7 @@ READ_ONLY NO +@@ -2044,7 +2044,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MRR_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -628,7 +619,7 @@ VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2044,17 +2044,17 @@ READ_ONLY NO +@@ -2054,17 +2054,17 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MULTI_RANGE_COUNT VARIABLE_SCOPE SESSION @@ -649,7 +640,7 @@ VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2064,7 +2064,7 @@ READ_ONLY YES +@@ -2074,7 +2074,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_DATA_POINTER_SIZE VARIABLE_SCOPE GLOBAL @@ -658,7 +649,7 @@ VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2087,7 +2087,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2097,7 +2097,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Restricts the total memory used for memory mapping of MySQL tables NUMERIC_MIN_VALUE 7 @@ -667,7 +658,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2104,10 +2104,10 @@ READ_ONLY YES +@@ -2114,10 +2114,10 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MYISAM_REPAIR_THREADS VARIABLE_SCOPE SESSION @@ -680,7 +671,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2117,7 +2117,7 @@ VARIABLE_SCOPE SESSION +@@ -2127,7 +2127,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 @@ -689,7 +680,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2154,7 +2154,7 @@ READ_ONLY NO +@@ -2164,7 +2164,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME NET_BUFFER_LENGTH VARIABLE_SCOPE SESSION @@ -698,7 +689,7 @@ VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2164,7 +2164,7 @@ READ_ONLY NO +@@ -2174,7 +2174,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_READ_TIMEOUT VARIABLE_SCOPE SESSION @@ -707,7 +698,7 @@ VARIABLE_COMMENT Number of seconds to wait for more data from a connection before aborting the read NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2174,7 +2174,7 @@ READ_ONLY NO +@@ -2184,7 +2184,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_RETRY_COUNT VARIABLE_SCOPE SESSION @@ -716,7 +707,7 @@ VARIABLE_COMMENT If a read on a communication port is interrupted, retry this many times before giving up NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2184,7 +2184,7 @@ READ_ONLY NO +@@ -2194,7 +2194,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_WRITE_TIMEOUT VARIABLE_SCOPE SESSION @@ -725,7 +716,7 @@ VARIABLE_COMMENT Number of seconds to wait for a block to be written to a connection before aborting the write NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2234,7 +2234,7 @@ READ_ONLY NO +@@ -2244,7 +2244,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -734,7 +725,7 @@ VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 or autoset then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2244,7 +2244,7 @@ READ_ONLY YES +@@ -2254,7 +2254,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_PRUNE_LEVEL VARIABLE_SCOPE SESSION @@ -743,7 +734,7 @@ VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search; 1 - prune plans based on number of retrieved rows NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1 -@@ -2254,7 +2254,7 @@ READ_ONLY NO +@@ -2264,7 +2264,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SEARCH_DEPTH VARIABLE_SCOPE SESSION @@ -752,7 +743,7 @@ VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2264,7 +2264,7 @@ READ_ONLY NO +@@ -2274,7 +2274,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SELECTIVITY_SAMPLING_LIMIT VARIABLE_SCOPE SESSION @@ -761,7 +752,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2294,17 +2294,17 @@ READ_ONLY NO +@@ -2304,17 +2304,17 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_TRACE_MAX_MEM_SIZE VARIABLE_SCOPE SESSION @@ -782,7 +773,7 @@ VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join.5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2324,7 +2324,7 @@ READ_ONLY YES +@@ -2334,7 +2334,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME PERFORMANCE_SCHEMA_ACCOUNTS_SIZE VARIABLE_SCOPE GLOBAL @@ -791,7 +782,7 @@ VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2334,7 +2334,7 @@ READ_ONLY YES +@@ -2344,7 +2344,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_DIGESTS_SIZE VARIABLE_SCOPE GLOBAL @@ -800,7 +791,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2144,7 +2144,7 @@ +@@ -2354,7 +2354,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -809,7 +800,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2354,7 +2354,7 @@ READ_ONLY YES +@@ -2364,7 +2364,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -818,7 +809,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2364,7 +2364,7 @@ READ_ONLY YES +@@ -2374,7 +2374,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -827,7 +818,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2374,7 +2374,7 @@ READ_ONLY YES +@@ -2384,7 +2384,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -836,7 +827,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2384,7 +2384,7 @@ READ_ONLY YES +@@ -2394,7 +2394,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -845,7 +836,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2394,7 +2394,7 @@ READ_ONLY YES +@@ -2404,7 +2404,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -854,7 +845,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2404,7 +2404,7 @@ READ_ONLY YES +@@ -2414,7 +2414,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_HOSTS_SIZE VARIABLE_SCOPE GLOBAL @@ -863,7 +854,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2414,7 +2414,7 @@ READ_ONLY YES +@@ -2424,7 +2424,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_CLASSES VARIABLE_SCOPE GLOBAL @@ -872,7 +863,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2424,7 +2424,7 @@ READ_ONLY YES +@@ -2434,7 +2434,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_INSTANCES VARIABLE_SCOPE GLOBAL @@ -881,7 +872,7 @@ VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2434,7 +2434,7 @@ READ_ONLY YES +@@ -2444,7 +2444,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_DIGEST_LENGTH VARIABLE_SCOPE GLOBAL @@ -890,7 +881,7 @@ VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2444,7 +2444,7 @@ READ_ONLY YES +@@ -2454,7 +2454,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_CLASSES VARIABLE_SCOPE GLOBAL @@ -899,7 +890,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2454,7 +2454,7 @@ READ_ONLY YES +@@ -2464,7 +2464,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_HANDLES VARIABLE_SCOPE GLOBAL @@ -908,7 +899,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2464,7 +2464,7 @@ READ_ONLY YES +@@ -2474,7 +2474,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -917,7 +908,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2474,7 +2474,7 @@ READ_ONLY YES +@@ -2484,7 +2484,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_CLASSES VARIABLE_SCOPE GLOBAL @@ -926,7 +917,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2484,7 +2484,7 @@ READ_ONLY YES +@@ -2494,7 +2494,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES VARIABLE_SCOPE GLOBAL @@ -935,7 +926,7 @@ VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2494,7 +2494,7 @@ READ_ONLY YES +@@ -2504,7 +2504,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_CLASSES VARIABLE_SCOPE GLOBAL @@ -944,7 +935,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2504,7 +2504,7 @@ READ_ONLY YES +@@ -2514,7 +2514,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_INSTANCES VARIABLE_SCOPE GLOBAL @@ -953,7 +944,7 @@ VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2514,7 +2514,7 @@ READ_ONLY YES +@@ -2524,7 +2524,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_CLASSES VARIABLE_SCOPE GLOBAL @@ -962,7 +953,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2524,7 +2524,7 @@ READ_ONLY YES +@@ -2534,7 +2534,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_INSTANCES VARIABLE_SCOPE GLOBAL @@ -971,7 +962,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2534,7 +2534,7 @@ READ_ONLY YES +@@ -2544,7 +2544,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STAGE_CLASSES VARIABLE_SCOPE GLOBAL @@ -980,7 +971,7 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2544,7 +2544,7 @@ READ_ONLY YES +@@ -2554,7 +2554,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES VARIABLE_SCOPE GLOBAL @@ -989,7 +980,7 @@ VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2554,7 +2554,7 @@ READ_ONLY YES +@@ -2564,7 +2564,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_HANDLES VARIABLE_SCOPE GLOBAL @@ -998,7 +989,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2564,7 +2564,7 @@ READ_ONLY YES +@@ -2574,7 +2574,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1007,7 +998,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2574,7 +2574,7 @@ READ_ONLY YES +@@ -2584,7 +2584,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_CLASSES VARIABLE_SCOPE GLOBAL @@ -1016,7 +1007,7 @@ VARIABLE_COMMENT Maximum number of thread instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2584,7 +2584,7 @@ READ_ONLY YES +@@ -2594,7 +2594,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1025,7 +1016,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2594,7 +2594,7 @@ READ_ONLY YES +@@ -2604,7 +2604,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SESSION_CONNECT_ATTRS_SIZE VARIABLE_SCOPE GLOBAL @@ -1034,7 +1025,7 @@ VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2604,7 +2604,7 @@ READ_ONLY YES +@@ -2614,7 +2614,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_ACTORS_SIZE VARIABLE_SCOPE GLOBAL @@ -1043,7 +1034,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2614,7 +2614,7 @@ READ_ONLY YES +@@ -2624,7 +2624,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_OBJECTS_SIZE VARIABLE_SCOPE GLOBAL @@ -1052,7 +1043,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2624,7 +2624,7 @@ READ_ONLY YES +@@ -2634,7 +2634,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_USERS_SIZE VARIABLE_SCOPE GLOBAL @@ -1061,7 +1052,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2674,7 +2674,7 @@ READ_ONLY YES +@@ -2684,7 +2684,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PRELOAD_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1070,7 +1061,7 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -2694,7 +2694,7 @@ READ_ONLY NO +@@ -2704,7 +2704,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME PROFILING_HISTORY_SIZE VARIABLE_SCOPE SESSION @@ -1079,7 +1070,7 @@ VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -2704,7 +2704,7 @@ READ_ONLY NO +@@ -2714,7 +2714,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PROGRESS_REPORT_TIME VARIABLE_SCOPE SESSION @@ -1088,7 +1079,7 @@ VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2764,7 +2764,7 @@ READ_ONLY NO +@@ -2774,7 +2774,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME QUERY_ALLOC_BLOCK_SIZE VARIABLE_SCOPE SESSION @@ -1097,7 +1088,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -2774,7 +2774,7 @@ READ_ONLY NO +@@ -2784,7 +2784,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_LIMIT VARIABLE_SCOPE GLOBAL @@ -1106,7 +1097,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2784,7 +2784,7 @@ READ_ONLY NO +@@ -2794,7 +2794,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_MIN_RES_UNIT VARIABLE_SCOPE GLOBAL @@ -1115,7 +1106,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2797,7 +2797,7 @@ VARIABLE_SCOPE GLOBAL +@@ -2807,7 +2807,7 @@ VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1124,7 +1115,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2834,7 +2834,7 @@ READ_ONLY NO +@@ -2844,7 +2844,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME QUERY_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1133,7 +1124,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -2847,7 +2847,7 @@ VARIABLE_SCOPE SESSION ONLY +@@ -2857,7 +2857,7 @@ VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1142,7 +1133,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2857,14 +2857,14 @@ VARIABLE_SCOPE SESSION ONLY +@@ -2867,14 +2867,14 @@ VARIABLE_SCOPE SESSION ONLY VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1159,7 +1150,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -2874,7 +2874,7 @@ READ_ONLY NO +@@ -2884,7 +2884,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME READ_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1168,7 +1159,7 @@ VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2894,7 +2894,7 @@ READ_ONLY NO +@@ -2904,7 +2904,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME READ_RND_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1177,7 +1168,7 @@ VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -2904,10 +2904,10 @@ READ_ONLY NO +@@ -2914,10 +2914,10 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ROWID_MERGE_BUFF_SIZE VARIABLE_SCOPE SESSION @@ -1190,7 +1181,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2944,7 +2944,7 @@ READ_ONLY YES +@@ -2954,7 +2954,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SERVER_ID VARIABLE_SCOPE SESSION @@ -1199,7 +1190,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -3014,7 +3014,7 @@ READ_ONLY NO +@@ -3024,7 +3024,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME SLAVE_MAX_ALLOWED_PACKET VARIABLE_SCOPE GLOBAL @@ -1208,7 +1199,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3024,7 +3024,7 @@ READ_ONLY NO +@@ -3034,7 +3034,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLOW_LAUNCH_TIME VARIABLE_SCOPE GLOBAL @@ -1217,7 +1208,7 @@ VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -3067,7 +3067,7 @@ VARIABLE_SCOPE SESSION +@@ -3077,7 +3077,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1226,7 +1217,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3274,7 +3274,7 @@ READ_ONLY NO +@@ -3284,7 +3284,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME STORED_PROGRAM_CACHE VARIABLE_SCOPE GLOBAL @@ -1235,7 +1226,7 @@ VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -3354,7 +3354,7 @@ READ_ONLY NO +@@ -3364,7 +3364,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME TABLE_DEFINITION_CACHE VARIABLE_SCOPE GLOBAL @@ -1244,7 +1235,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 2097152 -@@ -3364,7 +3364,7 @@ READ_ONLY NO +@@ -3374,7 +3374,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE VARIABLE_SCOPE GLOBAL @@ -1253,7 +1244,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 -@@ -3424,7 +3424,7 @@ READ_ONLY NO +@@ -3434,7 +3434,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME THREAD_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -1262,7 +1253,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -3434,7 +3434,7 @@ READ_ONLY NO +@@ -3444,7 +3444,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME THREAD_CONCURRENCY VARIABLE_SCOPE GLOBAL @@ -1271,7 +1262,7 @@ VARIABLE_COMMENT Permits the application to give the threads system a hint for the desired number of threads that should be run at the same time.This variable has no effect, and is deprecated. It will be removed in a future release. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 512 -@@ -3527,7 +3527,7 @@ VARIABLE_SCOPE SESSION +@@ -3537,7 +3537,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 @@ -1280,7 +1271,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3537,7 +3537,7 @@ VARIABLE_SCOPE SESSION +@@ -3547,7 +3547,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. NUMERIC_MIN_VALUE 1024 @@ -1289,7 +1280,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3547,14 +3547,14 @@ VARIABLE_SCOPE SESSION +@@ -3557,14 +3557,14 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 @@ -1306,7 +1297,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -3564,7 +3564,7 @@ READ_ONLY NO +@@ -3574,7 +3574,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TRANSACTION_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1315,7 +1306,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -3704,7 +3704,7 @@ READ_ONLY YES +@@ -3714,7 +3714,7 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -1324,7 +1315,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -3731,7 +3731,7 @@ order by variable_name; +@@ -3741,7 +3741,7 @@ order by variable_name; VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO VARIABLE_SCOPE GLOBAL From aca641da288b91f4b4e90bb3eb3d6ecca52186fa Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 31 May 2023 14:40:17 +0200 Subject: [PATCH 048/171] mtr: handle the case of existing but unreadable /proc/cpuinfo --- mysql-test/lib/My/SysInfo.pm | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/mysql-test/lib/My/SysInfo.pm b/mysql-test/lib/My/SysInfo.pm index 1e5ac353def..211f72c0561 100644 --- a/mysql-test/lib/My/SysInfo.pm +++ b/mysql-test/lib/My/SysInfo.pm @@ -68,7 +68,7 @@ sub _cpuinfo { } } $F= undef; # Close file - return $self; + return $self->{cpus}; } @@ -95,12 +95,7 @@ sub _kstat { push(@{$self->{cpus}}, $cpuinfo); } - # At least one cpu should have been found - # if this method worked - if ( $self->{cpus} ) { - return $self; - } - return undef; + return $self->{cpus}; } From c0463704c228647096986a437e33329ba0429f9a Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 1 Jun 2023 17:28:41 +0200 Subject: [PATCH 049/171] fix the test for --view --- mysql-test/main/derived_cond_pushdown.result | 22 ++++++-------------- mysql-test/main/derived_cond_pushdown.test | 2 +- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/mysql-test/main/derived_cond_pushdown.result b/mysql-test/main/derived_cond_pushdown.result index a4fc7a7447d..eacda88ffeb 100644 --- a/mysql-test/main/derived_cond_pushdown.result +++ b/mysql-test/main/derived_cond_pushdown.result @@ -18384,7 +18384,7 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as sq from t1 limit 5; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 @@ -18398,14 +18398,9 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as sq from t1 limit 5; -a ( select concat(t3.a,'=',dt.s) -from -(select a, sum(b) as s from t2 group by a) as dt, -t3 -where dt.a=t1.a and t3.a < 3 -) +a sq 1 1=804 2 1=1056 3 1=846 @@ -18424,7 +18419,7 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as sq from t1 limit 5; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 @@ -18438,14 +18433,9 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as sq from t1 limit 5; -a ( select concat(t3.a,'=',dt.s) -from -(select a, sum(b) as s from t2 group by a) as dt, -t3 -where dt.a=t1.a and t3.a < 3 -) +a sq 1 1=11858 2 1=11380 3 1=11588 diff --git a/mysql-test/main/derived_cond_pushdown.test b/mysql-test/main/derived_cond_pushdown.test index 7a4d9b4ad7d..deb6a64f393 100644 --- a/mysql-test/main/derived_cond_pushdown.test +++ b/mysql-test/main/derived_cond_pushdown.test @@ -3997,7 +3997,7 @@ select (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 - ) + ) as sq from t1 limit 5; eval explain $q; From 69684f689c0f4ab4ac97cdd7652e778d304ce9aa Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 1 Jun 2023 18:31:08 +0200 Subject: [PATCH 050/171] use correct collation_connection in --view mysqltest should use the same collation_connection in the service connection (that creates views) as in the main connection this makes weight_string("aaa") to return the expected value in --view and fixes main.func_str failure in --view --- client/mysqltest.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/mysqltest.cc b/client/mysqltest.cc index e745f8a3d2f..219b5532a70 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -8943,6 +8943,8 @@ int util_query(MYSQL* org_mysql, const char* query){ org_mysql->unix_socket); cur_con->util_mysql= mysql; + if (mysql->charset != org_mysql->charset) + mysql_set_character_set(mysql, org_mysql->charset->csname); } } else From c05ecda61fb54613d9f1c9da1fbc63779391bbdb Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 1 Jun 2023 22:15:41 +0200 Subject: [PATCH 051/171] fix string literal escaping in views process multibyte characters correctly, don't escape half of the character --- mysql-test/include/ctype_E05C.inc | 11 +++++++- mysql-test/main/ctype_big5.result | 13 +++++++--- mysql-test/main/ctype_big5.test | 7 ++--- mysql-test/main/ctype_cp932_binlog_stm.result | 7 ++++- mysql-test/main/ctype_gbk.result | 7 ++++- mysql-test/main/ctype_sjis.result | 7 ++++- sql/sql_string.cc | 26 ++++++++++++------- 7 files changed, 55 insertions(+), 23 deletions(-) diff --git a/mysql-test/include/ctype_E05C.inc b/mysql-test/include/ctype_E05C.inc index 71861044664..d157d8a7c88 100644 --- a/mysql-test/include/ctype_E05C.inc +++ b/mysql-test/include/ctype_E05C.inc @@ -76,6 +76,15 @@ INSERT INTO t1 VALUES (_BINARY'\\'' SELECT a, HEX(a) FROM t1; DROP TABLE t1; +# +# test how strings are written into view's frm +# +disable_view_protocol; +create view v1 as select hex('à\'), hex('à\t'); +select * from v1; +drop view v1; +enable_view_protocol; + # Checking that with character_set_client=binary 0x5C in 0xE05C # is treated as escape rather than the second byte of a multi-byte character, # even if character_set_connection is big5/cp932/gbk/sjis. @@ -109,5 +118,5 @@ SELECT HEX(a) FROM t1; DROP TABLE t1; --enable_view_protocol ---echo # Start of ctype_E05C.inc +--echo # End of ctype_E05C.inc diff --git a/mysql-test/main/ctype_big5.result b/mysql-test/main/ctype_big5.result index 402eec27ce8..b4c394f178b 100644 --- a/mysql-test/main/ctype_big5.result +++ b/mysql-test/main/ctype_big5.result @@ -537,15 +537,15 @@ create table t1 (a blob); insert into t1 values (0xEE00); select * into outfile 'test/t1.txt' from t1; delete from t1; -select hex(load_file('MYSQLD_DATADIR/test/t1.txt'));; -hex(load_file('MYSQLD_DATADIR/test/t1.txt')) +select hex(load_file('MYSQLD_DATADIR/test/t1.txt')) as lf; +lf 5CEE5C300A load data infile 't1.txt' into table t1; select hex(a) from t1; hex(a) EE00 drop table t1; -End of 5.0 tests +# End of 5.0 tests # # Start of 5.5 tests # @@ -4705,6 +4705,11 @@ a HEX(a) \'à\ 5C27E05C à\'\ E05C275C DROP TABLE t1; +create view v1 as select hex('à\'), hex('à\t'); +select * from v1; +hex('à\') hex('à\t') +E05C E05C74 +drop view v1; SET character_set_client=binary, character_set_results=binary; SELECT @@character_set_client, @@character_set_connection, @@character_set_results; @@character_set_client @@character_set_connection @@character_set_results @@ -4744,7 +4749,7 @@ HEX(a) E05C5B E05B DROP TABLE t1; -# Start of ctype_E05C.inc +# End of ctype_E05C.inc SET NAMES big5; CREATE TABLE t1 (a ENUM('È@') CHARACTER SET big5); SHOW CREATE TABLE t1; diff --git a/mysql-test/main/ctype_big5.test b/mysql-test/main/ctype_big5.test index e5a3c5b976f..c859670169c 100644 --- a/mysql-test/main/ctype_big5.test +++ b/mysql-test/main/ctype_big5.test @@ -79,18 +79,15 @@ create table t1 (a blob); insert into t1 values (0xEE00); select * into outfile 'test/t1.txt' from t1; delete from t1; -#enable after fix MDEV-27871 ---disable_view_protocol let $MYSQLD_DATADIR= `select @@datadir`; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR ---eval select hex(load_file('$MYSQLD_DATADIR/test/t1.txt')); +--eval select hex(load_file('$MYSQLD_DATADIR/test/t1.txt')) as lf load data infile 't1.txt' into table t1; select hex(a) from t1; --remove_file $MYSQLD_DATADIR/test/t1.txt drop table t1; -#enable_view_protocol # ---echo End of 5.0 tests +--echo # End of 5.0 tests --echo # diff --git a/mysql-test/main/ctype_cp932_binlog_stm.result b/mysql-test/main/ctype_cp932_binlog_stm.result index 1de52ba5f6e..66f015141c8 100644 --- a/mysql-test/main/ctype_cp932_binlog_stm.result +++ b/mysql-test/main/ctype_cp932_binlog_stm.result @@ -20413,6 +20413,11 @@ a HEX(a) \'à\ 5C27E05C à\'\ E05C275C DROP TABLE t1; +create view v1 as select hex('à\'), hex('à\t'); +select * from v1; +hex('à\') hex('à\t') +E05C E05C74 +drop view v1; SET character_set_client=binary, character_set_results=binary; SELECT @@character_set_client, @@character_set_connection, @@character_set_results; @@character_set_client @@character_set_connection @@character_set_results @@ -20452,7 +20457,7 @@ HEX(a) E05C5B E05B DROP TABLE t1; -# Start of ctype_E05C.inc +# End of ctype_E05C.inc # # End of 10.0 tests # diff --git a/mysql-test/main/ctype_gbk.result b/mysql-test/main/ctype_gbk.result index feb0bf46199..c16be59ae99 100644 --- a/mysql-test/main/ctype_gbk.result +++ b/mysql-test/main/ctype_gbk.result @@ -5053,6 +5053,11 @@ a HEX(a) \'à\ 5C27E05C à\'\ E05C275C DROP TABLE t1; +create view v1 as select hex('à\'), hex('à\t'); +select * from v1; +hex('à\') hex('à\t') +E05C E05C74 +drop view v1; SET character_set_client=binary, character_set_results=binary; SELECT @@character_set_client, @@character_set_connection, @@character_set_results; @@character_set_client @@character_set_connection @@character_set_results @@ -5092,7 +5097,7 @@ HEX(a) E05C5B E05B DROP TABLE t1; -# Start of ctype_E05C.inc +# End of ctype_E05C.inc SET NAMES utf8, character_set_connection=gbk; # # MDEV-13118 Wrong results with LOWER and UPPER and subquery diff --git a/mysql-test/main/ctype_sjis.result b/mysql-test/main/ctype_sjis.result index a48212bf7e2..c929c6d893c 100644 --- a/mysql-test/main/ctype_sjis.result +++ b/mysql-test/main/ctype_sjis.result @@ -18677,6 +18677,11 @@ a HEX(a) \'à\ 5C27E05C à\'\ E05C275C DROP TABLE t1; +create view v1 as select hex('à\'), hex('à\t'); +select * from v1; +hex('à\') hex('à\t') +E05C E05C74 +drop view v1; SET character_set_client=binary, character_set_results=binary; SELECT @@character_set_client, @@character_set_connection, @@character_set_results; @@character_set_client @@character_set_connection @@character_set_results @@ -18716,7 +18721,7 @@ HEX(a) E05C5B E05B DROP TABLE t1; -# Start of ctype_E05C.inc +# End of ctype_E05C.inc # # End of 10.0 tests # diff --git a/sql/sql_string.cc b/sql/sql_string.cc index c6b7f3e68ed..6de1207db95 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -1115,22 +1115,28 @@ String_copier::well_formed_copy(CHARSET_INFO *to_cs, characters with backslashes as necessary. Does not add the enclosing quotes, this is left up to caller. */ -#define APPEND(X) if (append(X)) return 1; else break +#define APPEND(...) if (append(__VA_ARGS__)) return 1; bool String::append_for_single_quote(const char *st, size_t len) { const char *end= st+len; + int chlen; for (; st < end; st++) { - uchar c= *st; - switch (c) + switch (*st) { - case '\\': APPEND(STRING_WITH_LEN("\\\\")); - case '\0': APPEND(STRING_WITH_LEN("\\0")); - case '\'': APPEND(STRING_WITH_LEN("\\'")); - case '\n': APPEND(STRING_WITH_LEN("\\n")); - case '\r': APPEND(STRING_WITH_LEN("\\r")); - case '\032': APPEND(STRING_WITH_LEN("\\Z")); - default: APPEND(c); + case '\\': APPEND(STRING_WITH_LEN("\\\\")); break; + case '\0': APPEND(STRING_WITH_LEN("\\0")); break; + case '\'': APPEND(STRING_WITH_LEN("\\'")); break; + case '\n': APPEND(STRING_WITH_LEN("\\n")); break; + case '\r': APPEND(STRING_WITH_LEN("\\r")); break; + case '\032': APPEND(STRING_WITH_LEN("\\Z")); break; + default: if ((chlen= my_charlen(charset(), st, end)) > 0) + { + APPEND(st, chlen); + st+= chlen-1; + } + else + APPEND(*st); } } return 0; From 8de6740a2ff13b95282595dcb817bcc16960b6d8 Mon Sep 17 00:00:00 2001 From: heyingquan0030 <15198894161@139.com> Date: Sun, 4 Jun 2023 19:04:49 +0800 Subject: [PATCH 052/171] MDEV-31205 Typo: complatible > compatible --- cmake/aws_sdk.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/aws_sdk.cmake b/cmake/aws_sdk.cmake index f6f88f2b880..a0d46e1a892 100644 --- a/cmake/aws_sdk.cmake +++ b/cmake/aws_sdk.cmake @@ -10,7 +10,7 @@ FUNCTION (CHECK_AWS_SDK RETVAL REASON) SKIP_AWS_SDK("AWS_SDK_EXTERNAL_PROJECT is not ON") ENDIF() IF(NOT NOT_FOR_DISTRIBUTION) - SKIP_AWS_SDK("AWS SDK has Apache 2.0 License which is not complatible with GPLv2. Set -DNOT_FOR_DISTRIBUTION=ON if you need it") + SKIP_AWS_SDK("AWS SDK has Apache 2.0 License which is not compatible with GPLv2. Set -DNOT_FOR_DISTRIBUTION=ON if you need it") ENDIF() # Check compiler support IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU") From 0a99d457b3cff4d08d01c2a5a74dcf81f45d79ec Mon Sep 17 00:00:00 2001 From: Brandon Nesterenko Date: Wed, 8 Mar 2023 13:49:32 -0700 Subject: [PATCH 053/171] MDEV-13915: STOP SLAVE takes very long time on a busy system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The problem is that a parallel replica would not immediately stop running/queued transactions when issued STOP SLAVE. That is, it allowed the current group of transactions to run, and sometimes the transactions which belong to the next group could be started and run through commit after STOP SLAVE was issued too, if the last group had started committing. This would lead to long periods to wait for all waiting transactions to finish. This patch updates a parallel replica to try and abort immediately and roll-back any ongoing transactions. The exception to this is any transactions which are non-transactional (e.g. those modifying sequences or non-transactional tables), and any prior transactions, will be run to completion. The specifics are as follows: 1. A new stage was added to SHOW PROCESSLIST output for the SQL Thread when it is waiting for a replica thread to either rollback or finish its transaction before stopping. This stage presents as “Waiting for worker thread to stop†2. Worker threads which error or are killed no longer perform GCO cleanup if there is a concurrently running prior transaction. This is because a worker thread scheduled to run in a future GCO could be killed and incorrectly perform cleanup of the active GCO. 3. Refined cases when the FL_TRANSACTIONAL flag is added to GTID binlog events to disallow adding it to transactions which modify both transactional and non-transactional engines when the binlogging configuration allow the modifications to exist in the same event, i.e. when using binlog_direct_non_trans_update == 0 and binlog_format == statement. 4. A few existing MTR tests relied on the completion of certain transactions after issuing STOP SLAVE, and were re-recorded (potentially with added synchronizations) under the new rollback behavior. Reviewed By =========== Andrei Elkin --- .../binlog_encryption/rpl_parallel.result | 7 +- .../rpl_par_stop_slave_quick_common.test | 608 ++++++++++++++++++ mysql-test/suite/rpl/r/rpl_parallel.result | 7 +- mysql-test/suite/rpl/r/rpl_parallel2.result | 1 + .../rpl/r/rpl_row_par_stop_slave_quick.result | 507 +++++++++++++++ .../rpl/r/rpl_stm_par_stop_slave_quick.result | 461 +++++++++++++ mysql-test/suite/rpl/t/rpl_parallel.test | 20 +- mysql-test/suite/rpl/t/rpl_parallel2.test | 1 + .../t/rpl_parallel_optimistic_error_stop.test | 6 +- .../rpl/t/rpl_row_par_stop_slave_quick.test | 268 ++++++++ .../rpl/t/rpl_stm_par_stop_slave_quick.test | 200 ++++++ sql/log_event.cc | 25 +- sql/mysqld.cc | 1 + sql/mysqld.h | 1 + sql/rpl_parallel.cc | 37 +- sql/rpl_parallel.h | 26 +- sql/rpl_rli.cc | 1 + sql/slave.cc | 7 + sql/sql_class.cc | 21 +- sql/sql_class.h | 6 +- 20 files changed, 2187 insertions(+), 24 deletions(-) create mode 100644 mysql-test/suite/rpl/include/rpl_par_stop_slave_quick_common.test create mode 100644 mysql-test/suite/rpl/r/rpl_row_par_stop_slave_quick.result create mode 100644 mysql-test/suite/rpl/r/rpl_stm_par_stop_slave_quick.result create mode 100644 mysql-test/suite/rpl/t/rpl_row_par_stop_slave_quick.test create mode 100644 mysql-test/suite/rpl/t/rpl_stm_par_stop_slave_quick.test diff --git a/mysql-test/suite/binlog_encryption/rpl_parallel.result b/mysql-test/suite/binlog_encryption/rpl_parallel.result index b75a66a634a..610e87e850e 100644 --- a/mysql-test/suite/binlog_encryption/rpl_parallel.result +++ b/mysql-test/suite/binlog_encryption/rpl_parallel.result @@ -732,7 +732,7 @@ SET debug_sync='now WAIT_FOR t3_waiting'; SET debug_sync='now SIGNAL d2_cont'; SET debug_sync='now WAIT_FOR t4_waiting'; KILL THD_ID; -SET debug_sync='now WAIT_FOR t3_killed'; +# Wait for replica to signal worker threads to stop SET debug_sync='now SIGNAL t1_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; @@ -742,7 +742,6 @@ a b 61 61 62 62 63 63 -64 64 68 68 69 69 70 70 @@ -816,6 +815,7 @@ connection server_2; SET debug_sync='now WAIT_FOR wait_queue_ready'; KILL THD_ID; SET debug_sync='now WAIT_FOR wait_queue_killed'; +# Wait for replica to signal worker threads to stop SET debug_sync='now SIGNAL query_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; @@ -827,6 +827,8 @@ SET binlog_format=@old_format; connection server_2; SET debug_sync='RESET'; include/start_slave.inc +SET debug_sync='now WAIT_FOR query_waiting'; +SET debug_sync='now SIGNAL query_cont'; SELECT * FROM t3 WHERE a >= 80 ORDER BY a; a b 80 0 @@ -1215,6 +1217,7 @@ connection server_2; include/wait_for_slave_sql_to_stop.inc SELECT * FROM t2 WHERE a >= 40 ORDER BY a; a +40 41 42 include/start_slave.inc diff --git a/mysql-test/suite/rpl/include/rpl_par_stop_slave_quick_common.test b/mysql-test/suite/rpl/include/rpl_par_stop_slave_quick_common.test new file mode 100644 index 00000000000..deac78660e8 --- /dev/null +++ b/mysql-test/suite/rpl/include/rpl_par_stop_slave_quick_common.test @@ -0,0 +1,608 @@ +# +# The stop_slave_quick suite of tests aims to validate that stopping a replica +# with parallelization enabled will stop in a timely manner. That is, a +# parallel replica should try to immediately stop and roll-back any ongoing +# transactions. If any threads have a non-transactional workload, then it +# along with all prior transactions are executed before stopping. +# +# This file provides test cases that should be binlog format independent. There +# is, however, behavior that is specific to either statement or row format, +# which each have their own test files that include this file. +# +# Requirements: +# 1. Tables named `ti`, `ti2`, and `ti3` have already been created with +# storage engine InnoDB; and a table named `tm` has been created with +# storage engine MyIsam. +# 2. Test variables ti_ctr, ti2_ctr, ti3_ctr, and tm_ctr have been created +# to serve as dynamic values to insert into their respective tables +# +# References: +# MDEV-13915: STOP SLAVE takes very long time on a busy system +# + +--echo # +--echo # Common Test Case 1: +--echo # Using one parallel replication worker thread on workload {T,T}, ensure +--echo # the replica immediately rolls back the transaction and stops the +--echo # SQL thread +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_threads=1; +--let $row_count_initial=`select count(*) from ti` + +--connection master +--source include/save_master_gtid.inc +BEGIN; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +COMMIT; + +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr + +--connection slave +LOCK TABLES ti WRITE; +--source include/start_slave.inc + +--echo # Wait for replica to begin executing the first transaction +--connection slave +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +--connection slave +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc + +UNLOCK TABLES; +--source include/wait_for_slave_sql_to_stop.inc + +--connection slave1 +--reap +--connection slave + +--let $row_count_end=`select count(*) from ti` +--let $row_count_diff=`select ($row_count_end-$row_count_initial)` +--let $assert_text= No new rows should have been inserted +--let $assert_cond= $row_count_diff = 0 +--source include/assert.inc + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--let $assert_text= GTID slave state should not change +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +--connection master +--source include/save_master_gtid.inc +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Common Test Case 2: +--echo # Using multiple parallel replication threads (two) on workload {T,T}, +--echo # ensure both transactions are rolled back if stop slave is issued +--echo # in the middle of the first transaction. + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_threads=2; +--let $row_count_initial=`select count(*) from ti` + +--connection master +--source include/save_master_gtid.inc +BEGIN; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +COMMIT; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr + +--connection slave +LOCK TABLES ti WRITE; +--source include/start_slave.inc + +--echo # Wait for replica to begin executing the first transaction +--connection slave +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # Wait for second transaction to begin +--connection slave +--let $wait_condition= SELECT count(*)=0 FROM information_schema.processlist WHERE state LIKE 'Waiting for work from SQL thread' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +--connection slave +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc + +UNLOCK TABLES; +--source include/wait_for_slave_sql_to_stop.inc + +--connection slave1 +--reap +--connection slave + +--let $row_count_end=`select count(*) from ti` +--let $row_count_diff=`select ($row_count_end-$row_count_initial)` +--let $assert_text= No insertions should have committed +--let $assert_cond= $row_count_diff = 0 +--source include/assert.inc + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--let $assert_text= GTID slave state should not change +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +--echo # Slave should be error-free +let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); +--let $assert_text= Slave should be error free +--let $assert_cond= $last_error = 0 +--source include/assert.inc + +--connection master +--source include/save_master_gtid.inc +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Common Test Case 3: +--echo # Using multiple parallel replication threads (two) on workload {T,T}, +--echo # with the same commit id (cid), ensure both transactions are rolled +--echo # back if stop slave is issued + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_mode=AGGRESSIVE; +set @@global.slave_parallel_threads=2; +--let $row_count_initial=`select count(*) from ti` + +--connection master +--source include/save_master_gtid.inc +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10000; +BEGIN; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +COMMIT; +--eval insert into ti2 values ($ti2_ctr) +--inc $ti2_ctr + +SET @@SESSION.debug_dbug=@old_dbug; + +--connection slave +LOCK TABLES ti WRITE; +--source include/start_slave.inc + +--echo # Wait for replica to begin executing the first transactions +--connection slave +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # Wait for second transaction to start group commit +--connection slave +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +--connection slave +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc + +UNLOCK TABLES; +--source include/wait_for_slave_sql_to_stop.inc + +--connection slave1 +--reap +--connection slave + +--let $row_count_end=`select count(*) from ti` +--let $row_count_diff=`select ($row_count_end-$row_count_initial)` +--let $assert_text= No insertions should have committed +--let $assert_cond= $row_count_diff = 0 +--source include/assert.inc + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--let $assert_text= GTID slave state should not change +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +--connection master +--source include/save_master_gtid.inc + +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Common Test Case 4: +--echo # Using multiple parallel replication threads (4) on workload +--echo # T (long running); should commit +--echo # N (waiting for prior commit); should commit +--echo # T (long running); should rollback +--echo # T (waiting for prior commit); should rollback +--echo # Issuing STOP SLAVE should allow the first two transactions to commit +--echo # while preventing and rolling back the third +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_mode=optimistic; +set @@global.slave_parallel_threads=4; + +--connection master +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10001; +BEGIN; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +COMMIT; + +--connection master +--eval insert into tm values ($tm_ctr) +--inc $tm_ctr +--source include/save_master_gtid.inc + +--eval insert into ti2 values ($ti2_ctr) +--inc $ti2_ctr + +--eval insert into ti3 values ($ti3_ctr) +--inc $ti3_ctr + +SET @@SESSION.debug_dbug=@old_dbug; + +--connection slave +LOCK TABLES ti WRITE, ti2 WRITE; +--source include/start_slave.inc + +--echo # Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. +--let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # Wait for replica to progress until unblocked transactions are queued for group commit.. +--connection slave +--let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +--connection slave +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc + +UNLOCK TABLES; +--source include/wait_for_slave_sql_to_stop.inc + +--connection slave1 +--reap +--connection slave + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--let $assert_text= GTID slave state should reach first N transaction +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +set @@global.slave_parallel_mode=CONSERVATIVE; + +--connection master +--source include/save_master_gtid.inc +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Common Test Case 5: +--echo # Using multiple parallel replication threads (5) on workload +--echo # T (long running); should commit +--echo # N (waiting for prior commit); should commit +--echo # T (waiting for prior commit); should commit +--echo # N (waiting for prior commit); should commit +--echo # T (long running); should rollback +--echo # Issuing STOP SLAVE should allow all transactions up to and including +--echo # the last N (4th) to commit, while preventing and rolling back the +--echo # final transaction (5th) + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_mode=optimistic; +set @@global.slave_parallel_threads=5; + +--connection master +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10002; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr + +--eval insert into tm values ($tm_ctr) +--inc $tm_ctr + +--eval insert into ti2 values ($ti2_ctr) +--inc $ti2_ctr + +--eval insert into tm2 values ($tm2_ctr) +--inc $tm2_ctr +--source include/save_master_gtid.inc + +--eval insert into ti3 values ($ti3_ctr) +--inc $ti3_ctr + +SET @@SESSION.debug_dbug=@old_dbug; + +--connection slave +LOCK TABLES ti WRITE, ti3 WRITE; +--source include/start_slave.inc + +--echo # Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. +--let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # Wait for replica to progress until unblocked transactions are queued for group commit.. +--connection slave +--let $wait_condition= SELECT count(*)=3 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +--connection slave +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc + +UNLOCK TABLES; +--source include/wait_for_slave_sql_to_stop.inc + +--connection slave1 +--reap +--connection slave + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--let $assert_text= GTID slave state should reach second N transaction +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +set @@global.slave_parallel_mode=CONSERVATIVE; + +--connection master +--source include/save_master_gtid.inc +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Common Test Case 6: +--echo # If retrying a T transaction while STOP SLAVE is issued, the +--echo # transaction should be rolled back and the slave abruptly stopped + +--connection master +--eval insert into ti values ($ti_ctr) +--source include/save_master_gtid.inc + +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +set @@global.slave_parallel_threads=1; + +--let $save_innodb_lock_wait_timeout= `SELECT @@global.innodb_lock_wait_timeout` +# 2 second buffer to give ample time to wait for transaction and issue stop slave +set @@global.innodb_lock_wait_timeout= 2; +BEGIN; +--eval SELECT * FROM ti WHERE a=$ti_ctr FOR UPDATE + +--connection master +--source include/save_master_gtid.inc +--eval update ti set a=a+1 where a=$ti_ctr +--inc $ti_ctr +--inc $ti_ctr + +--connection slave +--source include/start_slave.inc +--let $retried_tx_initial= query_get_value(SHOW ALL SLAVES STATUS, Retried_transactions, 1) + +if (`SELECT @@global.binlog_format = 'ROW'`) +{ + --let $update_state=Update_rows_log_event::find_row(-1) +} +if (`SELECT @@global.binlog_format = 'STATEMENT'`) +{ + --let $update_state=Updating +} +--echo # Wait for replicating transaction to wait for innodb table lock +--source include/start_slave.inc +--let $wait_condition= SELECT COUNT(*) > 0 FROM information_schema.processlist WHERE state LIKE "$update_state" and command like 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +connection slave; +--source include/wait_for_slave_sql_to_stop.inc +--let $retried_tx_test= query_get_value(SHOW ALL SLAVES STATUS, Retried_transactions, 1) +if ($retried_tx_initial != $retried_tx_test) +{ + --echo T transaction should have been rolled back without retry + --die T transaction should have been rolled back without retry +} + +# End the SELECT ... FOR UPDATE +ROLLBACK; + +--connection slave1 +--reap +--connection slave + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--let $assert_text= The retried T transaction should have been rolled back +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +--eval set @@global.innodb_lock_wait_timeout= $save_innodb_lock_wait_timeout + +--echo # +--echo # Common Test Case 7: +--echo # Using multiple parallel replication threads on a workload with a +--echo # non-transactional transaction in-between transactional transactions.. +--echo # 7a: with AGGRESSIVE replication where the N statement has been +--echo # executed already, all transactions up to and including N should +--echo # be replicated, and all transactions afterwards should be rolled +--echo # back. +--echo # 7b: with MINIMAL replication, the N statement should not execute +--echo # concurrently, but should wait along with the other later +--echo # transactions, and all future transactions except the first should +--echo # be rolled back. + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_threads=4; + +--let $mode_ctr=2 +while ($mode_ctr) +{ + --connection slave + if ($mode_ctr == 2) + { + --echo # + --echo # 7a: slave_parallel_mode=AGGRESSIVE + set @@global.slave_parallel_mode=AGGRESSIVE; + } + if ($mode_ctr == 1) + { + --echo # + --echo # 7b: slave_parallel_mode=MINIMAL + set @@global.slave_parallel_mode=MINIMAL; + } + + --connection slave + --let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm UNION ALL select * from ti2 UNION ALL select * from tm2 UNION ALL select * from ti3) t` + + --connection master + if ($mode_ctr == 1) + { + --let $master_gtid_cmp= `select @@global.gtid_binlog_pos` + } + + --connection master + --eval insert into ti values ($ti_ctr) + --inc $ti_ctr + + --eval insert into tm values ($tm_ctr) + if ($mode_ctr == 2) + { + # AGGRESSIVE mode should allow N trx to complete + --let $master_gtid_cmp= `select @@global.gtid_binlog_pos` + } + --eval insert into ti2 values ($ti2_ctr) + --inc $ti2_ctr + --eval insert into ti values ($ti_ctr) + --inc $ti_ctr + --source include/save_master_gtid.inc + + --connection slave + LOCK TABLES ti WRITE; + --connection slave_lock_extra + LOCK TABLES ti2 WRITE; + + --source include/start_slave.inc + + --echo # Wait for replica to halt due to locks and dependency requirements + --connection slave + + if ($mode_ctr == 2) + { + # AGGRESSIVE allows for more concurrency that we need to wait for + --let $wait_condition= SELECT count(*)=3 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; + --source include/wait_condition.inc + --let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; + --source include/wait_condition.inc + } + if ($mode_ctr == 1) + { + # MINIMAL will only have the first transaction begun + --let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; + --source include/wait_condition.inc + --let $wait_condition= SELECT count(*)=3 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; + --source include/wait_condition.inc + } + + --connection slave1 + --send STOP SLAVE; + + --connection slave + --echo # Wait for replica to signal worker threads to stop + --let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; + --source include/wait_condition.inc + + UNLOCK TABLES; + --connection slave_lock_extra + UNLOCK TABLES; + + --connection slave1 + --reap + --connection slave + --source include/wait_for_slave_sql_to_stop.inc + + --let $row_count_end=`select count(*) from (select * from ti UNION ALL select * from tm UNION ALL select * from ti2 UNION ALL select * from tm2 UNION ALL select * from ti3) t` + --let $row_count_diff=`select ($row_count_end-$row_count_initial)` + + if ($mode_ctr == 2) + { + --let $assert_text= The entirety of the first two transactions should have committed with AGGRESSIVE parallelization + --let $assert_cond= $row_count_diff = 2 + } + if ($mode_ctr == 1) + { + --let $assert_text= All transactions should have rolled back with MINIMAL parallelization + --let $assert_cond= $row_count_diff = 0 + } + + --source include/assert.inc + + --let $slave_gtid= `select @@global.gtid_slave_pos` + --let $assert_text= Slave state should be consistent + --let $assert_cond= $master_gtid_cmp = $slave_gtid + --source include/assert.inc + + --connection master + --source include/save_master_gtid.inc + --connection slave + --source include/start_slave.inc + --source include/sync_with_master_gtid.inc + + --source include/stop_slave.inc + --dec $mode_ctr +} +--source include/start_slave.inc + +--connection master +--source include/save_master_gtid.inc +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc diff --git a/mysql-test/suite/rpl/r/rpl_parallel.result b/mysql-test/suite/rpl/r/rpl_parallel.result index 9b2e68d366e..4f4a1c7dbcd 100644 --- a/mysql-test/suite/rpl/r/rpl_parallel.result +++ b/mysql-test/suite/rpl/r/rpl_parallel.result @@ -731,7 +731,7 @@ SET debug_sync='now WAIT_FOR t3_waiting'; SET debug_sync='now SIGNAL d2_cont'; SET debug_sync='now WAIT_FOR t4_waiting'; KILL THD_ID; -SET debug_sync='now WAIT_FOR t3_killed'; +# Wait for replica to signal worker threads to stop SET debug_sync='now SIGNAL t1_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; @@ -741,7 +741,6 @@ a b 61 61 62 62 63 63 -64 64 68 68 69 69 70 70 @@ -815,6 +814,7 @@ connection server_2; SET debug_sync='now WAIT_FOR wait_queue_ready'; KILL THD_ID; SET debug_sync='now WAIT_FOR wait_queue_killed'; +# Wait for replica to signal worker threads to stop SET debug_sync='now SIGNAL query_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; @@ -826,6 +826,8 @@ SET binlog_format=@old_format; connection server_2; SET debug_sync='RESET'; include/start_slave.inc +SET debug_sync='now WAIT_FOR query_waiting'; +SET debug_sync='now SIGNAL query_cont'; SELECT * FROM t3 WHERE a >= 80 ORDER BY a; a b 80 0 @@ -1214,6 +1216,7 @@ connection server_2; include/wait_for_slave_sql_to_stop.inc SELECT * FROM t2 WHERE a >= 40 ORDER BY a; a +40 41 42 include/start_slave.inc diff --git a/mysql-test/suite/rpl/r/rpl_parallel2.result b/mysql-test/suite/rpl/r/rpl_parallel2.result index 559c56271b8..aeedb4bafee 100644 --- a/mysql-test/suite/rpl/r/rpl_parallel2.result +++ b/mysql-test/suite/rpl/r/rpl_parallel2.result @@ -1,6 +1,7 @@ include/rpl_init.inc [topology=1->2] *** MDEV-5509: Incorrect value for Seconds_Behind_Master if parallel replication *** connection server_2; +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; set @old_parallel_mode= @@GLOBAL.slave_parallel_mode; include/stop_slave.inc diff --git a/mysql-test/suite/rpl/r/rpl_row_par_stop_slave_quick.result b/mysql-test/suite/rpl/r/rpl_row_par_stop_slave_quick.result new file mode 100644 index 00000000000..6fd5b448b47 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_row_par_stop_slave_quick.result @@ -0,0 +1,507 @@ +include/master-slave.inc +[connection master] +# +# Setup +connection slave; +include/stop_slave.inc +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Can't find record"); +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure"); +set @@global.slave_parallel_mode=CONSERVATIVE; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +connect slave_lock_extra,127.0.0.1,root,,test,$SLAVE_MYPORT; +CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS; +include/start_slave.inc +# +# Initialize test data +connection master; +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); +create sequence s1; +create table ti (a int) engine=innodb; +create table ti2 (a int) engine=innodb; +create table ti3 (a int) engine=innodb; +create table tm (a int) engine=myisam; +create table tm2 (a int) engine=myisam; +connection slave; +# Run binlog format independent test cases +# +# Common Test Case 1: +# Using one parallel replication worker thread on workload {T,T}, ensure +# the replica immediately rolls back the transaction and stops the +# SQL thread +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_threads=1; +connection master; +include/save_master_gtid.inc +BEGIN; +insert into ti values (100); +insert into ti values (101); +COMMIT; +insert into ti values (102); +connection slave; +LOCK TABLES ti WRITE; +include/start_slave.inc +# Wait for replica to begin executing the first transaction +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [No new rows should have been inserted] +include/assert.inc [GTID slave state should not change] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 2: +# Using multiple parallel replication threads (two) on workload {T,T}, +# ensure both transactions are rolled back if stop slave is issued +# in the middle of the first transaction. +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_threads=2; +connection master; +include/save_master_gtid.inc +BEGIN; +insert into ti values (103); +insert into ti values (104); +COMMIT; +insert into ti values (105); +connection slave; +LOCK TABLES ti WRITE; +include/start_slave.inc +# Wait for replica to begin executing the first transaction +connection slave; +# Wait for second transaction to begin +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [No insertions should have committed] +include/assert.inc [GTID slave state should not change] +# Slave should be error-free +include/assert.inc [Slave should be error free] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 3: +# Using multiple parallel replication threads (two) on workload {T,T}, +# with the same commit id (cid), ensure both transactions are rolled +# back if stop slave is issued +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_mode=AGGRESSIVE; +set @@global.slave_parallel_threads=2; +connection master; +include/save_master_gtid.inc +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10000; +BEGIN; +insert into ti values (106); +insert into ti values (107); +COMMIT; +insert into ti2 values (400); +SET @@SESSION.debug_dbug=@old_dbug; +connection slave; +LOCK TABLES ti WRITE; +include/start_slave.inc +# Wait for replica to begin executing the first transactions +connection slave; +# Wait for second transaction to start group commit +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [No insertions should have committed] +include/assert.inc [GTID slave state should not change] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 4: +# Using multiple parallel replication threads (4) on workload +# T (long running); should commit +# N (waiting for prior commit); should commit +# T (long running); should rollback +# T (waiting for prior commit); should rollback +# Issuing STOP SLAVE should allow the first two transactions to commit +# while preventing and rolling back the third +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_mode=optimistic; +set @@global.slave_parallel_threads=4; +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10001; +BEGIN; +insert into ti values (108); +insert into ti values (109); +COMMIT; +connection master; +insert into tm values (200); +include/save_master_gtid.inc +insert into ti2 values (401); +insert into ti3 values (500); +SET @@SESSION.debug_dbug=@old_dbug; +connection slave; +LOCK TABLES ti WRITE, ti2 WRITE; +include/start_slave.inc +# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. +# Wait for replica to progress until unblocked transactions are queued for group commit.. +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [GTID slave state should reach first N transaction] +set @@global.slave_parallel_mode=CONSERVATIVE; +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 5: +# Using multiple parallel replication threads (5) on workload +# T (long running); should commit +# N (waiting for prior commit); should commit +# T (waiting for prior commit); should commit +# N (waiting for prior commit); should commit +# T (long running); should rollback +# Issuing STOP SLAVE should allow all transactions up to and including +# the last N (4th) to commit, while preventing and rolling back the +# final transaction (5th) +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_mode=optimistic; +set @@global.slave_parallel_threads=5; +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10002; +insert into ti values (110); +insert into tm values (201); +insert into ti2 values (402); +insert into tm2 values (300); +include/save_master_gtid.inc +insert into ti3 values (501); +SET @@SESSION.debug_dbug=@old_dbug; +connection slave; +LOCK TABLES ti WRITE, ti3 WRITE; +include/start_slave.inc +# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. +# Wait for replica to progress until unblocked transactions are queued for group commit.. +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [GTID slave state should reach second N transaction] +set @@global.slave_parallel_mode=CONSERVATIVE; +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 6: +# If retrying a T transaction while STOP SLAVE is issued, the +# transaction should be rolled back and the slave abruptly stopped +connection master; +insert into ti values (111); +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +Warnings: +Note 1254 Slave is already running +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@global.slave_parallel_threads=1; +set @@global.innodb_lock_wait_timeout= 2; +BEGIN; +SELECT * FROM ti WHERE a=111 FOR UPDATE; +a +111 +connection master; +include/save_master_gtid.inc +update ti set a=a+1 where a=111; +connection slave; +include/start_slave.inc +# Wait for replicating transaction to wait for innodb table lock +include/start_slave.inc +Warnings: +Note 1254 Slave is already running +connection slave1; +STOP SLAVE;; +connection slave; +include/wait_for_slave_sql_to_stop.inc +ROLLBACK; +connection slave1; +connection slave; +include/assert.inc [The retried T transaction should have been rolled back] +set @@global.innodb_lock_wait_timeout= 50; +# +# Common Test Case 7: +# Using multiple parallel replication threads on a workload with a +# non-transactional transaction in-between transactional transactions.. +# 7a: with AGGRESSIVE replication where the N statement has been +# executed already, all transactions up to and including N should +# be replicated, and all transactions afterwards should be rolled +# back. +# 7b: with MINIMAL replication, the N statement should not execute +# concurrently, but should wait along with the other later +# transactions, and all future transactions except the first should +# be rolled back. +connection slave; +include/stop_slave.inc +Warnings: +Note 1255 Slave already has been stopped +set @@global.slave_parallel_threads=4; +connection slave; +# +# 7a: slave_parallel_mode=AGGRESSIVE +set @@global.slave_parallel_mode=AGGRESSIVE; +connection slave; +connection master; +connection master; +insert into ti values (113); +insert into tm values (202); +insert into ti2 values (403); +insert into ti values (114); +include/save_master_gtid.inc +connection slave; +LOCK TABLES ti WRITE; +connection slave_lock_extra; +LOCK TABLES ti2 WRITE; +include/start_slave.inc +# Wait for replica to halt due to locks and dependency requirements +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +connection slave_lock_extra; +UNLOCK TABLES; +connection slave1; +connection slave; +include/wait_for_slave_sql_to_stop.inc +include/assert.inc [The entirety of the first two transactions should have committed with AGGRESSIVE parallelization] +include/assert.inc [Slave state should be consistent] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +connection slave; +# +# 7b: slave_parallel_mode=MINIMAL +set @@global.slave_parallel_mode=MINIMAL; +connection slave; +connection master; +connection master; +insert into ti values (115); +insert into tm values (202); +insert into ti2 values (404); +insert into ti values (116); +include/save_master_gtid.inc +connection slave; +LOCK TABLES ti WRITE; +connection slave_lock_extra; +LOCK TABLES ti2 WRITE; +include/start_slave.inc +# Wait for replica to halt due to locks and dependency requirements +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +connection slave_lock_extra; +UNLOCK TABLES; +connection slave1; +connection slave; +include/wait_for_slave_sql_to_stop.inc +include/assert.inc [All transactions should have rolled back with MINIMAL parallelization] +include/assert.inc [Slave state should be consistent] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +include/start_slave.inc +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +Warnings: +Note 1254 Slave is already running +include/sync_with_master_gtid.inc +# +# ROW Test Case 1: +# Using an N multi-statement transaction, ensure if STOP SLAVE is +# issued in-between row updates, that the transaction is finished. +connection master; +truncate table ti; +truncate table tm; +# Set up multiple rows to allow a multi-statement update rows event +insert into tm values (202); +insert into tm values (203); +connection slave; +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_threads=1; +connection master; +# Next-to-commit non-transactional transaction should finish +update tm set a=a+1; +include/save_master_gtid.inc +# This should not be committed because it is after next-to-commit +insert into ti values (117); +connection slave; +set @@global.debug_dbug="+d,pause_after_next_row_exec"; +START SLAVE; +set debug_sync= "now WAIT_FOR row_executed"; +connection slave1; +STOP SLAVE;; +connection slave; +set @@global.debug_dbug=""; +set debug_sync= "now SIGNAL continue_row_execution"; +connection slave1; +include/wait_for_slave_sql_to_stop.inc +# Slave should be error-free +include/assert.inc [Slave should be error free] +set debug_sync= "RESET"; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# ROW Test Case 2: +# Using a T multi-statement transaction, ensure if STOP SLAVE is +# issued in-between row updates, that the transaction is rolled back. +connection master; +truncate table ti; +truncate table ti2; +truncate table tm; +insert into ti values (118); +insert into ti values (119); +connection slave; +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_threads=1; +connection master; +# Next-to-commit transactional multi-row event should be rolled back +include/save_master_gtid.inc +update ti set a=a+1; +insert into ti values (120); +connection slave; +set @@global.debug_dbug="+d,pause_after_next_row_exec"; +START SLAVE; +set debug_sync= "now WAIT_FOR row_executed"; +connection slave1; +STOP SLAVE;; +connection slave; +set @@global.debug_dbug=""; +set debug_sync= "now SIGNAL continue_row_execution"; +connection slave1; +include/wait_for_slave_sql_to_stop.inc +include/assert.inc [No new rows should have been inserted] +# Comparing master gtid 0-1-42 to slaves 0-1-42 +include/assert.inc [No transactions should have committed] +# Slave should be error-free +include/assert.inc [Slave should be error free] +connection master; +include/save_master_gtid.inc +connection slave; +set debug_sync= "RESET"; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Row Test Case 3: +# A workload with a later transaction that updates a sequence table +# should complete all transactions up to the sequence table update. +# Workload: +# T (long running); should commit +# S (waiting for prior commit); should commit +# T (long running); should rollback +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_mode=AGGRESSIVE; +set @@global.slave_parallel_threads=3; +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10002; +insert into ti values (121); +select next value for s1; +next value for s1 +1 +include/save_master_gtid.inc +insert into ti2 values (405); +SET @@SESSION.debug_dbug=@old_dbug; +connection slave; +LOCK TABLES ti write, ti2 WRITE; +include/start_slave.inc +# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. +# Wait for replica to progress until unblocked transactions are queued for group commit.. +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [GTID slave state should not change] +set @@global.slave_parallel_mode=CONSERVATIVE; +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Cleanup +connection master; +DROP TABLE ti, ti2, ti3, tm, tm2, s1; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@global.debug_dbug=""; +set @@global.slave_parallel_threads=0; +set @@global.slave_parallel_mode=conservative; +include/start_slave.inc +include/rpl_end.inc +# End of tests diff --git a/mysql-test/suite/rpl/r/rpl_stm_par_stop_slave_quick.result b/mysql-test/suite/rpl/r/rpl_stm_par_stop_slave_quick.result new file mode 100644 index 00000000000..18b06f5054f --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_stm_par_stop_slave_quick.result @@ -0,0 +1,461 @@ +include/master-slave.inc +[connection master] +# +# Setup +connection slave; +include/stop_slave.inc +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); +set @@global.slave_parallel_mode=CONSERVATIVE; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +change master to master_use_gtid=slave_pos; +include/start_slave.inc +connect slave_lock_extra,127.0.0.1,root,,test,$SLAVE_MYPORT; +# +# Initialize test data +connection master; +set statement sql_log_bin=0 for call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); +create table ti (a int primary key) engine=innodb; +create table ti2 (a int) engine=innodb; +create table ti3 (a int) engine=innodb; +create table tm (a int) engine=myisam; +create table tm2 (a int) engine=myisam; +connection slave; +# Run binlog format independent test cases +# +# Common Test Case 1: +# Using one parallel replication worker thread on workload {T,T}, ensure +# the replica immediately rolls back the transaction and stops the +# SQL thread +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_threads=1; +connection master; +include/save_master_gtid.inc +BEGIN; +insert into ti values (100); +insert into ti values (101); +COMMIT; +insert into ti values (102); +connection slave; +LOCK TABLES ti WRITE; +include/start_slave.inc +# Wait for replica to begin executing the first transaction +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [No new rows should have been inserted] +include/assert.inc [GTID slave state should not change] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 2: +# Using multiple parallel replication threads (two) on workload {T,T}, +# ensure both transactions are rolled back if stop slave is issued +# in the middle of the first transaction. +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_threads=2; +connection master; +include/save_master_gtid.inc +BEGIN; +insert into ti values (103); +insert into ti values (104); +COMMIT; +insert into ti values (105); +connection slave; +LOCK TABLES ti WRITE; +include/start_slave.inc +# Wait for replica to begin executing the first transaction +connection slave; +# Wait for second transaction to begin +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [No insertions should have committed] +include/assert.inc [GTID slave state should not change] +# Slave should be error-free +include/assert.inc [Slave should be error free] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 3: +# Using multiple parallel replication threads (two) on workload {T,T}, +# with the same commit id (cid), ensure both transactions are rolled +# back if stop slave is issued +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_mode=AGGRESSIVE; +set @@global.slave_parallel_threads=2; +connection master; +include/save_master_gtid.inc +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10000; +BEGIN; +insert into ti values (106); +insert into ti values (107); +COMMIT; +insert into ti2 values (400); +SET @@SESSION.debug_dbug=@old_dbug; +connection slave; +LOCK TABLES ti WRITE; +include/start_slave.inc +# Wait for replica to begin executing the first transactions +connection slave; +# Wait for second transaction to start group commit +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [No insertions should have committed] +include/assert.inc [GTID slave state should not change] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 4: +# Using multiple parallel replication threads (4) on workload +# T (long running); should commit +# N (waiting for prior commit); should commit +# T (long running); should rollback +# T (waiting for prior commit); should rollback +# Issuing STOP SLAVE should allow the first two transactions to commit +# while preventing and rolling back the third +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_mode=optimistic; +set @@global.slave_parallel_threads=4; +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10001; +BEGIN; +insert into ti values (108); +insert into ti values (109); +COMMIT; +connection master; +insert into tm values (200); +include/save_master_gtid.inc +insert into ti2 values (401); +insert into ti3 values (500); +SET @@SESSION.debug_dbug=@old_dbug; +connection slave; +LOCK TABLES ti WRITE, ti2 WRITE; +include/start_slave.inc +# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. +# Wait for replica to progress until unblocked transactions are queued for group commit.. +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [GTID slave state should reach first N transaction] +set @@global.slave_parallel_mode=CONSERVATIVE; +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 5: +# Using multiple parallel replication threads (5) on workload +# T (long running); should commit +# N (waiting for prior commit); should commit +# T (waiting for prior commit); should commit +# N (waiting for prior commit); should commit +# T (long running); should rollback +# Issuing STOP SLAVE should allow all transactions up to and including +# the last N (4th) to commit, while preventing and rolling back the +# final transaction (5th) +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_mode=optimistic; +set @@global.slave_parallel_threads=5; +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10002; +insert into ti values (110); +insert into tm values (201); +insert into ti2 values (402); +insert into tm2 values (300); +include/save_master_gtid.inc +insert into ti3 values (501); +SET @@SESSION.debug_dbug=@old_dbug; +connection slave; +LOCK TABLES ti WRITE, ti3 WRITE; +include/start_slave.inc +# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. +# Wait for replica to progress until unblocked transactions are queued for group commit.. +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [GTID slave state should reach second N transaction] +set @@global.slave_parallel_mode=CONSERVATIVE; +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Common Test Case 6: +# If retrying a T transaction while STOP SLAVE is issued, the +# transaction should be rolled back and the slave abruptly stopped +connection master; +insert into ti values (111); +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +Warnings: +Note 1254 Slave is already running +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@global.slave_parallel_threads=1; +set @@global.innodb_lock_wait_timeout= 2; +BEGIN; +SELECT * FROM ti WHERE a=111 FOR UPDATE; +a +111 +connection master; +include/save_master_gtid.inc +update ti set a=a+1 where a=111; +connection slave; +include/start_slave.inc +# Wait for replicating transaction to wait for innodb table lock +include/start_slave.inc +Warnings: +Note 1254 Slave is already running +connection slave1; +STOP SLAVE;; +connection slave; +include/wait_for_slave_sql_to_stop.inc +ROLLBACK; +connection slave1; +connection slave; +include/assert.inc [The retried T transaction should have been rolled back] +set @@global.innodb_lock_wait_timeout= 50; +# +# Common Test Case 7: +# Using multiple parallel replication threads on a workload with a +# non-transactional transaction in-between transactional transactions.. +# 7a: with AGGRESSIVE replication where the N statement has been +# executed already, all transactions up to and including N should +# be replicated, and all transactions afterwards should be rolled +# back. +# 7b: with MINIMAL replication, the N statement should not execute +# concurrently, but should wait along with the other later +# transactions, and all future transactions except the first should +# be rolled back. +connection slave; +include/stop_slave.inc +Warnings: +Note 1255 Slave already has been stopped +set @@global.slave_parallel_threads=4; +connection slave; +# +# 7a: slave_parallel_mode=AGGRESSIVE +set @@global.slave_parallel_mode=AGGRESSIVE; +connection slave; +connection master; +connection master; +insert into ti values (113); +insert into tm values (202); +insert into ti2 values (403); +insert into ti values (114); +include/save_master_gtid.inc +connection slave; +LOCK TABLES ti WRITE; +connection slave_lock_extra; +LOCK TABLES ti2 WRITE; +include/start_slave.inc +# Wait for replica to halt due to locks and dependency requirements +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +connection slave_lock_extra; +UNLOCK TABLES; +connection slave1; +connection slave; +include/wait_for_slave_sql_to_stop.inc +include/assert.inc [The entirety of the first two transactions should have committed with AGGRESSIVE parallelization] +include/assert.inc [Slave state should be consistent] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +connection slave; +# +# 7b: slave_parallel_mode=MINIMAL +set @@global.slave_parallel_mode=MINIMAL; +connection slave; +connection master; +connection master; +insert into ti values (115); +insert into tm values (202); +insert into ti2 values (404); +insert into ti values (116); +include/save_master_gtid.inc +connection slave; +LOCK TABLES ti WRITE; +connection slave_lock_extra; +LOCK TABLES ti2 WRITE; +include/start_slave.inc +# Wait for replica to halt due to locks and dependency requirements +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +connection slave_lock_extra; +UNLOCK TABLES; +connection slave1; +connection slave; +include/wait_for_slave_sql_to_stop.inc +include/assert.inc [All transactions should have rolled back with MINIMAL parallelization] +include/assert.inc [Slave state should be consistent] +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +include/start_slave.inc +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +Warnings: +Note 1254 Slave is already running +include/sync_with_master_gtid.inc +# +# Statement Test Case 1: +# Using one parallel replication worker thread on workload {N,T}, ensure +# the replica finishes the non-transactional transaction, and does not +# start the next +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_threads=1; +connection master; +SET @@session.binlog_direct_non_transactional_updates= 0; +BEGIN; +insert into ti values (117); +insert into tm values (202); +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction +insert into tm2 values (301); +Warnings: +Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction +COMMIT; +include/save_master_gtid.inc +insert into ti values (118); +connection slave; +lock tables tm2 write; +START SLAVE; +# Wait for replica to get stuck on held lock +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +# Unlock row-level lock holding transaction +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [Transaction should have committed] +include/assert.inc [N should have been applied] +# Slave should be error-free +include/assert.inc [Slave should be error free] +connection master; +include/save_master_gtid.inc +SET @@session.binlog_direct_non_transactional_updates= 1; +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Statement Test Case 2: +# If STOP SLAVE is issued on a parallel slave, such that the next to +# commit transaction is T; even if the next event from the group will +# commit the transaction (e.g. XID_EVENT), the transaction should be +# stopped and rolled back. +connection slave; +include/stop_slave.inc +set @@global.slave_parallel_threads=1; +connection master; +insert into ti values (119); +insert into ti values (120); +include/save_master_gtid.inc +connection slave; +LOCK TABLES ti WRITE; +include/start_slave.inc +# Wait for replica to begin executing the first transaction +connection slave; +connection slave1; +STOP SLAVE;; +connection slave; +# Wait for replica to signal worker threads to stop +UNLOCK TABLES; +include/wait_for_slave_sql_to_stop.inc +connection slave1; +connection slave; +include/assert.inc [No insertions should have committed] +include/assert.inc [GTID slave state should increment to the first transaction] +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# Cleanup +connection master; +DROP TABLE ti, tm, ti2, tm2, ti3; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@global.slave_parallel_threads=0; +set @@global.slave_domain_parallel_threads=0; +set @@global.slave_parallel_mode=conservative; +set @@global.debug_dbug=""; +include/start_slave.inc +include/rpl_end.inc +# End of tests diff --git a/mysql-test/suite/rpl/t/rpl_parallel.test b/mysql-test/suite/rpl/t/rpl_parallel.test index 9ba7a30f2eb..433e7c9d8c4 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel.test +++ b/mysql-test/suite/rpl/t/rpl_parallel.test @@ -949,8 +949,9 @@ SET debug_sync='now WAIT_FOR t4_waiting'; --replace_result $d1_thd_id THD_ID eval KILL $d1_thd_id; -# Wait until T3 has reacted on the kill. -SET debug_sync='now WAIT_FOR t3_killed'; +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc # Now we can allow T1 to proceed. SET debug_sync='now SIGNAL t1_cont'; @@ -959,7 +960,7 @@ SET debug_sync='now SIGNAL t1_cont'; --source include/wait_for_slave_sql_error.inc STOP SLAVE IO_THREAD; # Since T2, T3, and T4 run in parallel, we can not be sure if T2 will have time -# to commit or not before the stop. However, T1 should commit, and T3/T4 may +# to commit or not before the stop. However, T1 should rollback, and T3/T4 may # not have committed. (After slave restart we check that all become committed # eventually). SELECT * FROM t3 WHERE a >= 60 AND a != 65 ORDER BY a; @@ -1058,6 +1059,11 @@ SET debug_sync='now WAIT_FOR wait_queue_ready'; eval KILL $thd_id; SET debug_sync='now WAIT_FOR wait_queue_killed'; + +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc + SET debug_sync='now SIGNAL query_cont'; --let $slave_sql_errno= 1317,1927,1964 @@ -1075,6 +1081,14 @@ SET binlog_format=@old_format; --connection server_2 SET debug_sync='RESET'; --source include/start_slave.inc + +# Test amendment from MDEV-13915: +# A worker thread's event queue is no longer executed on replica stop. +# The signal query_cont needs to be re-sent because the transaction was +# aborted. +SET debug_sync='now WAIT_FOR query_waiting'; +SET debug_sync='now SIGNAL query_cont'; + --sync_with_master SELECT * FROM t3 WHERE a >= 80 ORDER BY a; diff --git a/mysql-test/suite/rpl/t/rpl_parallel2.test b/mysql-test/suite/rpl/t/rpl_parallel2.test index 8934b15e546..506e074110c 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel2.test +++ b/mysql-test/suite/rpl/t/rpl_parallel2.test @@ -7,6 +7,7 @@ --echo *** MDEV-5509: Incorrect value for Seconds_Behind_Master if parallel replication *** --connection server_2 +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; set @old_parallel_mode= @@GLOBAL.slave_parallel_mode; --source include/stop_slave.inc diff --git a/mysql-test/suite/rpl/t/rpl_parallel_optimistic_error_stop.test b/mysql-test/suite/rpl/t/rpl_parallel_optimistic_error_stop.test index 27f38d47bdb..35f28073a74 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel_optimistic_error_stop.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_optimistic_error_stop.test @@ -122,10 +122,10 @@ SELECT COUNT(*) = 1 as "W4 remains with the same status" FROM information_schema --echo # Slave_SQL_Running YES = $status # B. In the fixed version W3 is waiting for W2,... ---let $wait_condition= SELECT count(*) = 1 as "W4 is waiting" FROM information_schema.processlist WHERE state LIKE "Waiting for prior transaction to commit%" +--let $wait_condition= SELECT count(*) = 1 as "W3 is waiting" FROM information_schema.processlist WHERE state LIKE "Waiting for prior transaction to commit%" --source include/wait_condition.inc --echo # while W2 is held back ... ---let $wait_condition= SELECT count(*) = 1 as "W2 simulates slowness" FROM information_schema.processlist WHERE state LIKE "debug sync point: now" +--let $wait_condition= SELECT count(*) >= 1 as "W2 simulates slowness" FROM information_schema.processlist WHERE state LIKE "debug sync point: now" --source include/wait_condition.inc # C. # ...until NOW. @@ -143,7 +143,7 @@ if ($old_version_regression) --let $wait_condition= SELECT count(*) = 0 as "W3 does not wait on W2" FROM information_schema.processlist WHERE state LIKE "Waiting for prior transaction to commit%" --source include/wait_condition.inc - --let $wait_condition= SELECT count(*) = 1 as "W2 simulates slowness" FROM information_schema.processlist WHERE state LIKE "debug sync point: now" + --let $wait_condition= SELECT count(*) >= 1 as "W2 simulates slowness" FROM information_schema.processlist WHERE state LIKE "debug sync point: now" --source include/wait_condition.inc # Like above, but signaling is done after W4 is done to violate the commit order diff --git a/mysql-test/suite/rpl/t/rpl_row_par_stop_slave_quick.test b/mysql-test/suite/rpl/t/rpl_row_par_stop_slave_quick.test new file mode 100644 index 00000000000..56ad9e34a93 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_row_par_stop_slave_quick.test @@ -0,0 +1,268 @@ +# +# Validate that STOP SLAVE works in a timely manner on a parallel replica with +# ROW binary logging format. +# +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/master-slave.inc +--source include/have_innodb.inc +--source include/have_binlog_format_row.inc + +--echo # +--echo # Setup +--connection slave +--source include/stop_slave.inc +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Can't find record"); +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure"); +--let $old_debug= `SELECT @@global.debug_dbug` +--let $old_threads= `SELECT @@global.slave_parallel_threads` +--let $old_slave_mode= `SELECT @@global.slave_parallel_mode` +set @@global.slave_parallel_mode=CONSERVATIVE; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +--connect(slave_lock_extra,127.0.0.1,root,,test,$SLAVE_MYPORT) +CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS; +--source include/start_slave.inc + +--echo # +--echo # Initialize test data +--connection master +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); + +# Needed by this test and include/rpl_par_stop_slave_quick.inc + +create sequence s1; +create table ti (a int) engine=innodb; +create table ti2 (a int) engine=innodb; +create table ti3 (a int) engine=innodb; +create table tm (a int) engine=myisam; +create table tm2 (a int) engine=myisam; +--let $ti_ctr= 100 +--let $tm_ctr= 200 +--let $tm2_ctr= 300 +--let $ti2_ctr= 400 +--let $ti3_ctr= 500 +--sync_slave_with_master + +--echo # Run binlog format independent test cases +--source include/rpl_par_stop_slave_quick_common.test + +--echo # +--echo # ROW Test Case 1: +--echo # Using an N multi-statement transaction, ensure if STOP SLAVE is +--echo # issued in-between row updates, that the transaction is finished. + +--connection master +truncate table ti; +truncate table tm; +--echo # Set up multiple rows to allow a multi-statement update rows event +--eval insert into tm values ($tm_ctr) +--inc $tm_ctr +--eval insert into tm values ($tm_ctr) +--inc $tm_ctr +--sync_slave_with_master + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_threads=1; +--let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm) t` + +--connection master + +--echo # Next-to-commit non-transactional transaction should finish +--eval update tm set a=a+1 +--source include/save_master_gtid.inc +--let $master_gtid_after_update= `select @@global.gtid_binlog_pos` + +--echo # This should not be committed because it is after next-to-commit +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr + +--connection slave +set @@global.debug_dbug="+d,pause_after_next_row_exec"; + +START SLAVE; +set debug_sync= "now WAIT_FOR row_executed"; + +--connection slave1 +--send STOP SLAVE; + +--connection slave +set @@global.debug_dbug=""; +set debug_sync= "now SIGNAL continue_row_execution"; + +--connection slave1 +--reap +--source include/wait_for_slave_sql_to_stop.inc + +--echo # Slave should be error-free +let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); +--let $assert_text= Slave should be error free +--let $assert_cond= $last_error = 0 +--source include/assert.inc + +set debug_sync= "RESET"; +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # ROW Test Case 2: +--echo # Using a T multi-statement transaction, ensure if STOP SLAVE is +--echo # issued in-between row updates, that the transaction is rolled back. + +--connection master +truncate table ti; +truncate table ti2; +truncate table tm; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--sync_slave_with_master + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_threads=1; +--let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm) t` + +--connection master + +--echo # Next-to-commit transactional multi-row event should be rolled back +--source include/save_master_gtid.inc +--let $master_gtid_initial= `select @@global.gtid_binlog_pos` +--eval update ti set a=a+1 + +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr + +--connection slave +set @@global.debug_dbug="+d,pause_after_next_row_exec"; +START SLAVE; +set debug_sync= "now WAIT_FOR row_executed"; + +--connection slave1 +--send STOP SLAVE; + +--connection slave +set @@global.debug_dbug=""; +set debug_sync= "now SIGNAL continue_row_execution"; + +--connection slave1 +--reap +--source include/wait_for_slave_sql_to_stop.inc + +--let $row_count_end=`select count(*) from (select * from ti UNION ALL select * from tm) t` +--let $row_count_diff=`select ($row_count_end-$row_count_initial)` +--let $assert_text= No new rows should have been inserted +--let $assert_cond= $row_count_diff = 0 +--source include/assert.inc + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--echo # Comparing master gtid $master_pos to slaves $slave_gtid +--let $assert_text= No transactions should have committed +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +--echo # Slave should be error-free +let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); +--let $assert_text= Slave should be error free +--let $assert_cond= $last_error = 0 +--source include/assert.inc + +--connection master +--source include/save_master_gtid.inc + +--connection slave +set debug_sync= "RESET"; +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Row Test Case 3: +--echo # A workload with a later transaction that updates a sequence table +--echo # should complete all transactions up to the sequence table update. +--echo # Workload: +--echo # T (long running); should commit +--echo # S (waiting for prior commit); should commit +--echo # T (long running); should rollback + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_mode=AGGRESSIVE; +set @@global.slave_parallel_threads=3; + +--connection master +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10002; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr + +select next value for s1; +--source include/save_master_gtid.inc + +--eval insert into ti2 values ($ti2_ctr) +--inc $ti2_ctr + +SET @@SESSION.debug_dbug=@old_dbug; + +--connection slave +LOCK TABLES ti write, ti2 WRITE; +--source include/start_slave.inc + +--echo # Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. +--let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # Wait for replica to progress until unblocked transactions are queued for group commit.. +--connection slave +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +--connection slave +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc + +UNLOCK TABLES; +--source include/wait_for_slave_sql_to_stop.inc + +--connection slave1 +--reap +--connection slave + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--let $assert_text= GTID slave state should not change +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +set @@global.slave_parallel_mode=CONSERVATIVE; + +--connection master +--source include/save_master_gtid.inc +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Cleanup +--connection master +DROP TABLE ti, ti2, ti3, tm, tm2, s1; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--eval set @@global.debug_dbug="$old_debug" +--eval set @@global.slave_parallel_threads=$old_threads +--eval set @@global.slave_parallel_mode=$old_slave_mode +--source include/start_slave.inc + +--source include/rpl_end.inc + +--echo # End of tests diff --git a/mysql-test/suite/rpl/t/rpl_stm_par_stop_slave_quick.test b/mysql-test/suite/rpl/t/rpl_stm_par_stop_slave_quick.test new file mode 100644 index 00000000000..b76979c62da --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_stm_par_stop_slave_quick.test @@ -0,0 +1,200 @@ +# +# Validate that STOP SLAVE works in a timely manner on a parallel replica with +# STATEMENT binary logging format. +# +--source include/have_debug.inc +--source include/master-slave.inc +--source include/have_innodb.inc +--source include/have_binlog_format_statement.inc + +--echo # +--echo # Setup +--connection slave +--source include/stop_slave.inc +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); +SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); +--let $old_threads= `SELECT @@global.slave_parallel_threads` +--let $old_domain_threads= `SELECT @@global.slave_domain_parallel_threads` +--let $old_slave_mode= `SELECT @@global.slave_parallel_mode` +--let $old_debug_dbug= `SELECT @@global.debug_dbug` +set @@global.slave_parallel_mode=CONSERVATIVE; + +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +change master to master_use_gtid=slave_pos; +--source include/start_slave.inc +--connect(slave_lock_extra,127.0.0.1,root,,test,$SLAVE_MYPORT) + +--echo # +--echo # Initialize test data +--connection master +set statement sql_log_bin=0 for call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); +create table ti (a int primary key) engine=innodb; +create table ti2 (a int) engine=innodb; +create table ti3 (a int) engine=innodb; +create table tm (a int) engine=myisam; +create table tm2 (a int) engine=myisam; +--let $ti_ctr= 100 +--let $tm_ctr= 200 +--let $tm2_ctr= 300 +--let $ti2_ctr= 400 +--let $ti3_ctr= 500 +--sync_slave_with_master + +--echo # Run binlog format independent test cases +--source include/rpl_par_stop_slave_quick_common.test + +--echo # +--echo # Statement Test Case 1: +--echo # Using one parallel replication worker thread on workload {N,T}, ensure +--echo # the replica finishes the non-transactional transaction, and does not +--echo # start the next + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_threads=1; +--let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm UNION ALL select * from tm2) t` + +--connection master +--let $old_binlog_direct= `SELECT @@global.binlog_direct_non_transactional_updates` +SET @@session.binlog_direct_non_transactional_updates= 0; +BEGIN; +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--eval insert into tm values ($tm_ctr) +--inc $tm_ctr +--eval insert into tm2 values ($tm2_ctr) +--inc $tm_ctr +COMMIT; +--source include/save_master_gtid.inc + +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr + +--connection slave +lock tables tm2 write; +START SLAVE; + +--echo # Wait for replica to get stuck on held lock +--connection slave +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +--connection slave +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc + +--echo # Unlock row-level lock holding transaction +UNLOCK TABLES; +--source include/wait_for_slave_sql_to_stop.inc + +--connection slave1 +--reap +--connection slave + +--let $row_count_end=`select count(*) from (select * from ti UNION ALL select * from tm UNION ALL select * from tm2) t` +--let $row_count_diff=`select ($row_count_end-$row_count_initial)` +--let $assert_text= Transaction should have committed +--let $assert_cond= $row_count_diff = 3 +--source include/assert.inc + +--let $slave_gtid= `select @@global.gtid_slave_pos` +# N is the non-transactional transaction +--let $assert_text= N should have been applied +--let $assert_cond= $master_pos = $slave_gtid +--source include/assert.inc + +--echo # Slave should be error-free +let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); +--let $assert_text= Slave should be error free +--let $assert_cond= $last_error = 0 +--source include/assert.inc + +--connection master +--source include/save_master_gtid.inc +--eval SET @@session.binlog_direct_non_transactional_updates= $old_binlog_direct + +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Statement Test Case 2: +--echo # If STOP SLAVE is issued on a parallel slave, such that the next to +--echo # commit transaction is T; even if the next event from the group will +--echo # commit the transaction (e.g. XID_EVENT), the transaction should be +--echo # stopped and rolled back. + +--connection slave +--source include/stop_slave.inc +set @@global.slave_parallel_threads=1; +--let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm) t` + +--connection master +--let $master_gtid_cmp= `select @@global.gtid_binlog_pos` +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--eval insert into ti values ($ti_ctr) +--inc $ti_ctr +--source include/save_master_gtid.inc + +--connection slave +LOCK TABLES ti WRITE; +--source include/start_slave.inc + +--echo # Wait for replica to begin executing the first transaction +--connection slave +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +--send STOP SLAVE; + +--connection slave +--echo # Wait for replica to signal worker threads to stop +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; +--source include/wait_condition.inc +UNLOCK TABLES; +--source include/wait_for_slave_sql_to_stop.inc + +--connection slave1 +--reap +--connection slave + +--let $row_count_end=`select count(*) from (select * from ti UNION ALL select * from tm) t` +--let $row_count_diff=`select ($row_count_end-$row_count_initial)` +--let $assert_text= No insertions should have committed +--let $assert_cond= $row_count_diff = 0 +--source include/assert.inc + +--let $slave_gtid= `select @@global.gtid_slave_pos` +--let $assert_text= GTID slave state should increment to the first transaction +--let $assert_cond= $master_gtid_cmp = $slave_gtid +--source include/assert.inc + +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +--echo # +--echo # Cleanup +--connection master +DROP TABLE ti, tm, ti2, tm2, ti3; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--eval set @@global.slave_parallel_threads=$old_threads +--eval set @@global.slave_domain_parallel_threads=$old_domain_threads +--eval set @@global.slave_parallel_mode=$old_slave_mode +--eval set @@global.debug_dbug="$old_debug_dbug" +--source include/start_slave.inc + +--source include/rpl_end.inc + +--echo # End of tests diff --git a/sql/log_event.cc b/sql/log_event.cc index bafcf34cc2e..0bd1e28abfe 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -8013,7 +8013,10 @@ Gtid_log_event::Gtid_log_event(THD *thd_arg, uint64 seq_no_arg, thd_arg->transaction.all.has_created_dropped_temp_table() || thd_arg->transaction.all.trans_executed_admin_cmd()) flags2|= FL_DDL; - else if (is_transactional && !is_tmp_table) + else if (is_transactional && !is_tmp_table && + !(thd_arg->transaction.all.modified_non_trans_table && + thd->variables.binlog_direct_non_trans_update == 0 && + !thd->is_current_stmt_binlog_format_row())) flags2|= FL_TRANSACTIONAL; if (!(thd_arg->variables.option_bits & OPTION_RPL_SKIP_PARALLEL)) flags2|= FL_ALLOW_PARALLEL; @@ -8144,7 +8147,6 @@ Gtid_log_event::do_apply_event(rpl_group_info *rgi) thd->variables.server_id= this->server_id; thd->variables.gtid_domain_id= this->domain_id; thd->variables.gtid_seq_no= this->seq_no; - rgi->gtid_ev_flags2= flags2; thd->reset_for_next_command(); if (opt_gtid_strict_mode && opt_bin_log && opt_log_slave_updates) @@ -11672,8 +11674,27 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi) if (!table->in_use) table->in_use= thd; + /* + Exit early, and let the Event-level exit logic take care of the cleanup + and rollback. + */ + if (rgi->rli->mi->using_parallel() && + rgi->parallel_entry->stop_abrupt(rgi->rli) && + rgi->parallel_entry->rgi_is_safe_to_terminate(rgi)) + break; + error= do_exec_row(rgi); + + DBUG_EXECUTE_IF( + "pause_after_next_row_exec", + { + DBUG_ASSERT(!debug_sync_set_action( + thd, + STRING_WITH_LEN( + "now SIGNAL row_executed WAIT_FOR continue_row_execution"))); + }); + if (unlikely(error)) DBUG_PRINT("info", ("error: %s", HA_ERR(error))); DBUG_ASSERT(error != HA_ERR_RECORD_DELETED); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index c110baa9634..b18f14d1de3 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -9560,6 +9560,7 @@ PSI_stage_info stage_waiting_for_work_from_sql_thread= { 0, "Waiting for work fr PSI_stage_info stage_waiting_for_prior_transaction_to_commit= { 0, "Waiting for prior transaction to commit", 0}; PSI_stage_info stage_waiting_for_prior_transaction_to_start_commit= { 0, "Waiting for prior transaction to start commit before starting next transaction", 0}; PSI_stage_info stage_waiting_for_room_in_worker_thread= { 0, "Waiting for room in worker thread event queue", 0}; +PSI_stage_info stage_waiting_for_worker_stop= { 0, "Waiting for worker thread to stop", 0}; PSI_stage_info stage_waiting_for_workers_idle= { 0, "Waiting for worker threads to be idle", 0}; PSI_stage_info stage_waiting_for_ftwrl= { 0, "Waiting due to global read lock", 0}; PSI_stage_info stage_waiting_for_ftwrl_threads_to_pause= { 0, "Waiting for worker threads to pause for global read lock", 0}; diff --git a/sql/mysqld.h b/sql/mysqld.h index f521ea23638..0c80792168e 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -535,6 +535,7 @@ extern PSI_stage_info stage_waiting_for_work_from_sql_thread; extern PSI_stage_info stage_waiting_for_prior_transaction_to_commit; extern PSI_stage_info stage_waiting_for_prior_transaction_to_start_commit; extern PSI_stage_info stage_waiting_for_room_in_worker_thread; +extern PSI_stage_info stage_waiting_for_worker_stop; extern PSI_stage_info stage_waiting_for_workers_idle; extern PSI_stage_info stage_waiting_for_ftwrl; extern PSI_stage_info stage_waiting_for_ftwrl_threads_to_pause; diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 6ca582e4f21..2dce2880218 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -96,7 +96,7 @@ handle_queued_pos_update(THD *thd, rpl_parallel_thread::queued_event *qev) rli= qev->rgi->rli; e= qev->entry_for_queued; if (e->stop_on_error_sub_id < (uint64)ULONGLONG_MAX || - (e->force_abort && !rli->stop_for_until)) + (e->stop_abrupt(rli))) return; mysql_mutex_lock(&rli->data_lock); @@ -173,7 +173,7 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, mark_start_commit() calls can be made and it is safe to de-allocate the GCO. */ - err= wfc->wait_for_prior_commit(thd); + err= wfc->wait_for_prior_commit(thd, true); if (unlikely(err) && !rgi->worker_error) signal_error_to_sql_driver_thread(thd, rgi, err); thd->wait_for_commit_ptr= NULL; @@ -395,13 +395,14 @@ do_gco_wait(rpl_group_info *rgi, group_commit_orderer *gco, } while (wait_count > entry->count_committing_event_groups); } - if (entry->force_abort && wait_count > entry->stop_count) + if (entry->force_abort && wait_count >= entry->stop_count) { /* We are stopping (STOP SLAVE), and this event group is beyond the point where we can safely stop. So return a flag that will cause us to skip, rather than execute, the following events. */ + DBUG_ASSERT(entry->rgi_is_safe_to_terminate(rgi)); return true; } else @@ -461,6 +462,16 @@ do_ftwrl_wait(rpl_group_info *rgi, if (sub_id > entry->largest_started_sub_id) entry->largest_started_sub_id= sub_id; + /* + If this rgi is non-transactional, and the state of our current entry + (incorrectly) views the rgi as safe to terminate, we change our state + to disallow this rgi from stop/rollback in the event of STOP SLAVE. + */ + if (!(rgi->gtid_ev_flags2 & Gtid_log_event::FL_TRANSACTIONAL) && + entry->unsafe_rollback_marker_sub_id.load(std::memory_order_relaxed) < + rgi->gtid_sub_id) + entry->unsafe_rollback_marker_sub_id= sub_id; + DBUG_RETURN(aborted); } @@ -1370,7 +1381,9 @@ handle_rpl_parallel_thread(void *arg) if (!err) #endif { - if (unlikely(thd->check_killed())) + if (unlikely(thd->check_killed()) || + (entry->stop_abrupt(rgi->rli) && + entry->rgi_is_safe_to_terminate(rgi))) { thd->clear_error(); thd->get_stmt_da()->reset_diagnostics_area(); @@ -2339,6 +2352,7 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli) struct rpl_parallel_entry *e; rpl_parallel_thread *rpt; uint32 i, j; + PSI_stage_info old_stage; /* First signal all workers that they must force quit; no more events will @@ -2399,9 +2413,11 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli) if ((rpt= e->rpl_threads[j])) { mysql_mutex_lock(&rpt->LOCK_rpl_thread); + thd->ENTER_COND(&rpt->COND_rpl_thread_stop, &rpt->LOCK_rpl_thread, + &stage_waiting_for_worker_stop, &old_stage); while (rpt->current_owner == &e->rpl_threads[j]) mysql_cond_wait(&rpt->COND_rpl_thread_stop, &rpt->LOCK_rpl_thread); - mysql_mutex_unlock(&rpt->LOCK_rpl_thread); + thd->EXIT_COND(&old_stage); } } } @@ -2501,6 +2517,17 @@ rpl_parallel_entry::queue_master_restart(rpl_group_info *rgi, return 0; } +bool rpl_parallel_entry::stop_abrupt(Relay_log_info *rli) +{ + return force_abort.load(std::memory_order_relaxed) && !rli->stop_for_until; +} + +bool rpl_parallel_entry::rgi_is_safe_to_terminate(rpl_group_info *rgi) +{ + return unsafe_rollback_marker_sub_id.load(std::memory_order_relaxed) < + rgi->gtid_sub_id; +} + int rpl_parallel::wait_for_workers_idle(THD *thd) diff --git a/sql/rpl_parallel.h b/sql/rpl_parallel.h index 650aa06e504..9ad9b0b61dd 100644 --- a/sql/rpl_parallel.h +++ b/sql/rpl_parallel.h @@ -272,7 +272,7 @@ struct rpl_parallel_entry { so worker threads must force abort any current transactions without waiting for event groups to complete. */ - bool force_abort; + std::atomic force_abort; /* At STOP SLAVE (force_abort=true), we do not want to process all events in the queue (which could unnecessarily delay stop, if a lot of events happen @@ -349,10 +349,34 @@ struct rpl_parallel_entry { /* The group_commit_orderer object for the events currently being queued. */ group_commit_orderer *current_gco; + /* + Marks the highest sub id that all transactions up to it must be executed to + allow for a consistent replication state; and all active transactions + afterwards can safely be stopped and rolled back. + */ + std::atomic unsafe_rollback_marker_sub_id; + rpl_parallel_thread * choose_thread(rpl_group_info *rgi, bool *did_enter_cond, PSI_stage_info *old_stage, bool reuse); int queue_master_restart(rpl_group_info *rgi, Format_description_log_event *fdev); + + /* + Check if we are stopping the slave as a direct command from the user, as + opposed to force_abort being set due to the UNTIL clause from START SLAVE. + + Returns 1 if the slave has been explicitly ordered to stop, 0 otherwise. + */ + bool stop_abrupt(Relay_log_info *rli); + + /* + Check if the rgi is safe to stop and rollback in the event of an abrupt + stop of the parallel slave. + + Returns 1 if we can safely terminate and rollback the transaction, 0 + otherwise + */ + bool rgi_is_safe_to_terminate(rpl_group_info *rgi); }; struct rpl_parallel { HASH domain_hash; diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc index 04fddb3e74b..48fd9b1f435 100644 --- a/sql/rpl_rli.cc +++ b/sql/rpl_rli.cc @@ -2188,6 +2188,7 @@ event_group_new_gtid(rpl_group_info *rgi, Gtid_log_event *gev) rgi->current_gtid.server_id= gev->server_id; rgi->current_gtid.seq_no= gev->seq_no; rgi->commit_id= gev->commit_id; + rgi->gtid_ev_flags2= gev->flags2; rgi->gtid_pending= true; return 0; } diff --git a/sql/slave.cc b/sql/slave.cc index f43240a8866..647756482d5 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3631,6 +3631,8 @@ int has_temporary_error(THD *thd) { uint current_errno; + rpl_group_info *rgi= thd->rgi_slave; + Relay_log_info *rli= rgi->rli; DBUG_ENTER("has_temporary_error"); DBUG_EXECUTE_IF("all_errors_are_temporary_errors", @@ -3648,6 +3650,11 @@ has_temporary_error(THD *thd) if (!likely(thd->is_error())) DBUG_RETURN(0); + if (rgi->rli->mi->using_parallel() && + rgi->parallel_entry->stop_abrupt(rli) && + rgi->parallel_entry->rgi_is_safe_to_terminate(rgi)) + DBUG_RETURN(0); + current_errno= thd->get_stmt_da()->sql_errno(); for (uint i= 0; i < slave_transaction_retry_error_length; i++) { diff --git a/sql/sql_class.cc b/sql/sql_class.cc index dc58d2a250a..81fcfa272a3 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -7639,7 +7639,7 @@ wait_for_commit::register_wait_for_prior_commit(wait_for_commit *waitee) */ int -wait_for_commit::wait_for_prior_commit2(THD *thd) +wait_for_commit::wait_for_prior_commit2(THD *thd, bool force_wait) { PSI_stage_info old_stage; wait_for_commit *loc_waitee; @@ -7664,9 +7664,24 @@ wait_for_commit::wait_for_prior_commit2(THD *thd) &stage_waiting_for_prior_transaction_to_commit, &old_stage); while ((loc_waitee= this->waitee.load(std::memory_order_relaxed)) && - likely(!thd->check_killed(1))) + (likely(!thd->check_killed(1)) || force_wait)) mysql_cond_wait(&COND_wait_commit, &LOCK_wait_commit); - if (!loc_waitee) + if (!loc_waitee +#ifndef EMBEDDED_LIBRARY + /* + If a worker has been killed prior to this wait, e.g. in do_gco_wait(), + then it should not perform thread cleanup if there are threads which + have yet to commit. This is to prevent the cleanup of resources that + the prior RGI may need, e.g. its GCO. This is achieved by skipping + the unregistration of the waitee, such that each subsequent call to + wait_for_prior_commit() will exit early (while maintaining the + dependence), thus allowing the final call to + thd->wait_for_prior_commit() within finish_event_group() to wait. + */ + || (thd->rgi_slave && (thd->rgi_slave->worker_error && + !thd->rgi_slave->did_mark_start_commit)) +#endif + ) { if (wakeup_error) my_error(ER_PRIOR_COMMIT_FAILED, MYF(0)); diff --git a/sql/sql_class.h b/sql/sql_class.h index 4e5aba33443..e177fc55d9d 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2144,14 +2144,14 @@ struct wait_for_commit bool commit_started; void register_wait_for_prior_commit(wait_for_commit *waitee); - int wait_for_prior_commit(THD *thd) + int wait_for_prior_commit(THD *thd, bool force_wait= false) { /* Quick inline check, to avoid function call and locking in the common case where no wakeup is registered, or a registered wait was already signalled. */ if (waitee.load(std::memory_order_acquire)) - return wait_for_prior_commit2(thd); + return wait_for_prior_commit2(thd, force_wait); else { if (wakeup_error) @@ -2205,7 +2205,7 @@ struct wait_for_commit void wakeup(int wakeup_error); - int wait_for_prior_commit2(THD *thd); + int wait_for_prior_commit2(THD *thd, bool force_wait= false); void wakeup_subsequent_commits2(int wakeup_error); void unregister_wait_for_prior_commit2(); From 677d6f0f23355b1c3d7bdb71b3f881dfef60d489 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 1 Jun 2023 16:44:35 +0200 Subject: [PATCH 054/171] MDEV-31183 binlog_encryption.encrypted_master_switch_to_unencrypted_gtid fails in BB with UBSAN runtime error: downcast of address sql/log.cc:11101:56: runtime error: downcast of address 0x7f9dc801e9c8 which does not point to an object of type 'Gtid_list_log_event' sql/sql_repl.cc:1429:12: runtime error: member call on address 0x7f1ca401ea48 which does not point to an object of type 'Gtid_list_log_event' --- sql/log.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/log.cc b/sql/log.cc index 38ab6db746c..67e2d2f5b2a 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -10788,7 +10788,7 @@ get_gtid_list_event(IO_CACHE *cache, Gtid_list_log_event **out_gtid_list) if (fdle->start_decryption((Start_encryption_log_event*) ev)) { errormsg= "Could not set up decryption for binlog."; - break; + typ= UNKNOWN_EVENT; // to cleanup and abort below } } delete ev; From 8ed88e3455a20a72e6abdc5ff08d6d5cb612013e Mon Sep 17 00:00:00 2001 From: Brandon Nesterenko Date: Tue, 6 Jun 2023 08:11:38 -0600 Subject: [PATCH 055/171] Revert "MDEV-13915: STOP SLAVE takes very long time on a busy system" This reverts commit 0a99d457b3cff4d08d01c2a5a74dcf81f45d79ec because it should go into only 10.5+ --- .../binlog_encryption/rpl_parallel.result | 7 +- .../rpl_par_stop_slave_quick_common.test | 608 ------------------ mysql-test/suite/rpl/r/rpl_parallel.result | 7 +- mysql-test/suite/rpl/r/rpl_parallel2.result | 1 - .../rpl/r/rpl_row_par_stop_slave_quick.result | 507 --------------- .../rpl/r/rpl_stm_par_stop_slave_quick.result | 461 ------------- mysql-test/suite/rpl/t/rpl_parallel.test | 20 +- mysql-test/suite/rpl/t/rpl_parallel2.test | 1 - .../t/rpl_parallel_optimistic_error_stop.test | 6 +- .../rpl/t/rpl_row_par_stop_slave_quick.test | 268 -------- .../rpl/t/rpl_stm_par_stop_slave_quick.test | 200 ------ sql/log_event.cc | 25 +- sql/mysqld.cc | 1 - sql/mysqld.h | 1 - sql/rpl_parallel.cc | 37 +- sql/rpl_parallel.h | 26 +- sql/rpl_rli.cc | 1 - sql/slave.cc | 7 - sql/sql_class.cc | 21 +- sql/sql_class.h | 6 +- 20 files changed, 24 insertions(+), 2187 deletions(-) delete mode 100644 mysql-test/suite/rpl/include/rpl_par_stop_slave_quick_common.test delete mode 100644 mysql-test/suite/rpl/r/rpl_row_par_stop_slave_quick.result delete mode 100644 mysql-test/suite/rpl/r/rpl_stm_par_stop_slave_quick.result delete mode 100644 mysql-test/suite/rpl/t/rpl_row_par_stop_slave_quick.test delete mode 100644 mysql-test/suite/rpl/t/rpl_stm_par_stop_slave_quick.test diff --git a/mysql-test/suite/binlog_encryption/rpl_parallel.result b/mysql-test/suite/binlog_encryption/rpl_parallel.result index 610e87e850e..b75a66a634a 100644 --- a/mysql-test/suite/binlog_encryption/rpl_parallel.result +++ b/mysql-test/suite/binlog_encryption/rpl_parallel.result @@ -732,7 +732,7 @@ SET debug_sync='now WAIT_FOR t3_waiting'; SET debug_sync='now SIGNAL d2_cont'; SET debug_sync='now WAIT_FOR t4_waiting'; KILL THD_ID; -# Wait for replica to signal worker threads to stop +SET debug_sync='now WAIT_FOR t3_killed'; SET debug_sync='now SIGNAL t1_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; @@ -742,6 +742,7 @@ a b 61 61 62 62 63 63 +64 64 68 68 69 69 70 70 @@ -815,7 +816,6 @@ connection server_2; SET debug_sync='now WAIT_FOR wait_queue_ready'; KILL THD_ID; SET debug_sync='now WAIT_FOR wait_queue_killed'; -# Wait for replica to signal worker threads to stop SET debug_sync='now SIGNAL query_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; @@ -827,8 +827,6 @@ SET binlog_format=@old_format; connection server_2; SET debug_sync='RESET'; include/start_slave.inc -SET debug_sync='now WAIT_FOR query_waiting'; -SET debug_sync='now SIGNAL query_cont'; SELECT * FROM t3 WHERE a >= 80 ORDER BY a; a b 80 0 @@ -1217,7 +1215,6 @@ connection server_2; include/wait_for_slave_sql_to_stop.inc SELECT * FROM t2 WHERE a >= 40 ORDER BY a; a -40 41 42 include/start_slave.inc diff --git a/mysql-test/suite/rpl/include/rpl_par_stop_slave_quick_common.test b/mysql-test/suite/rpl/include/rpl_par_stop_slave_quick_common.test deleted file mode 100644 index deac78660e8..00000000000 --- a/mysql-test/suite/rpl/include/rpl_par_stop_slave_quick_common.test +++ /dev/null @@ -1,608 +0,0 @@ -# -# The stop_slave_quick suite of tests aims to validate that stopping a replica -# with parallelization enabled will stop in a timely manner. That is, a -# parallel replica should try to immediately stop and roll-back any ongoing -# transactions. If any threads have a non-transactional workload, then it -# along with all prior transactions are executed before stopping. -# -# This file provides test cases that should be binlog format independent. There -# is, however, behavior that is specific to either statement or row format, -# which each have their own test files that include this file. -# -# Requirements: -# 1. Tables named `ti`, `ti2`, and `ti3` have already been created with -# storage engine InnoDB; and a table named `tm` has been created with -# storage engine MyIsam. -# 2. Test variables ti_ctr, ti2_ctr, ti3_ctr, and tm_ctr have been created -# to serve as dynamic values to insert into their respective tables -# -# References: -# MDEV-13915: STOP SLAVE takes very long time on a busy system -# - ---echo # ---echo # Common Test Case 1: ---echo # Using one parallel replication worker thread on workload {T,T}, ensure ---echo # the replica immediately rolls back the transaction and stops the ---echo # SQL thread ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_threads=1; ---let $row_count_initial=`select count(*) from ti` - ---connection master ---source include/save_master_gtid.inc -BEGIN; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr -COMMIT; - ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr - ---connection slave -LOCK TABLES ti WRITE; ---source include/start_slave.inc - ---echo # Wait for replica to begin executing the first transaction ---connection slave ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - ---connection slave ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc - -UNLOCK TABLES; ---source include/wait_for_slave_sql_to_stop.inc - ---connection slave1 ---reap ---connection slave - ---let $row_count_end=`select count(*) from ti` ---let $row_count_diff=`select ($row_count_end-$row_count_initial)` ---let $assert_text= No new rows should have been inserted ---let $assert_cond= $row_count_diff = 0 ---source include/assert.inc - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---let $assert_text= GTID slave state should not change ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - ---connection master ---source include/save_master_gtid.inc ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Common Test Case 2: ---echo # Using multiple parallel replication threads (two) on workload {T,T}, ---echo # ensure both transactions are rolled back if stop slave is issued ---echo # in the middle of the first transaction. - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_threads=2; ---let $row_count_initial=`select count(*) from ti` - ---connection master ---source include/save_master_gtid.inc -BEGIN; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr -COMMIT; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr - ---connection slave -LOCK TABLES ti WRITE; ---source include/start_slave.inc - ---echo # Wait for replica to begin executing the first transaction ---connection slave ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---echo # Wait for second transaction to begin ---connection slave ---let $wait_condition= SELECT count(*)=0 FROM information_schema.processlist WHERE state LIKE 'Waiting for work from SQL thread' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - ---connection slave ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc - -UNLOCK TABLES; ---source include/wait_for_slave_sql_to_stop.inc - ---connection slave1 ---reap ---connection slave - ---let $row_count_end=`select count(*) from ti` ---let $row_count_diff=`select ($row_count_end-$row_count_initial)` ---let $assert_text= No insertions should have committed ---let $assert_cond= $row_count_diff = 0 ---source include/assert.inc - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---let $assert_text= GTID slave state should not change ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - ---echo # Slave should be error-free -let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); ---let $assert_text= Slave should be error free ---let $assert_cond= $last_error = 0 ---source include/assert.inc - ---connection master ---source include/save_master_gtid.inc ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Common Test Case 3: ---echo # Using multiple parallel replication threads (two) on workload {T,T}, ---echo # with the same commit id (cid), ensure both transactions are rolled ---echo # back if stop slave is issued - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_mode=AGGRESSIVE; -set @@global.slave_parallel_threads=2; ---let $row_count_initial=`select count(*) from ti` - ---connection master ---source include/save_master_gtid.inc -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10000; -BEGIN; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr -COMMIT; ---eval insert into ti2 values ($ti2_ctr) ---inc $ti2_ctr - -SET @@SESSION.debug_dbug=@old_dbug; - ---connection slave -LOCK TABLES ti WRITE; ---source include/start_slave.inc - ---echo # Wait for replica to begin executing the first transactions ---connection slave ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---echo # Wait for second transaction to start group commit ---connection slave ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - ---connection slave ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc - -UNLOCK TABLES; ---source include/wait_for_slave_sql_to_stop.inc - ---connection slave1 ---reap ---connection slave - ---let $row_count_end=`select count(*) from ti` ---let $row_count_diff=`select ($row_count_end-$row_count_initial)` ---let $assert_text= No insertions should have committed ---let $assert_cond= $row_count_diff = 0 ---source include/assert.inc - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---let $assert_text= GTID slave state should not change ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - ---connection master ---source include/save_master_gtid.inc - ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Common Test Case 4: ---echo # Using multiple parallel replication threads (4) on workload ---echo # T (long running); should commit ---echo # N (waiting for prior commit); should commit ---echo # T (long running); should rollback ---echo # T (waiting for prior commit); should rollback ---echo # Issuing STOP SLAVE should allow the first two transactions to commit ---echo # while preventing and rolling back the third ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_mode=optimistic; -set @@global.slave_parallel_threads=4; - ---connection master -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10001; -BEGIN; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr -COMMIT; - ---connection master ---eval insert into tm values ($tm_ctr) ---inc $tm_ctr ---source include/save_master_gtid.inc - ---eval insert into ti2 values ($ti2_ctr) ---inc $ti2_ctr - ---eval insert into ti3 values ($ti3_ctr) ---inc $ti3_ctr - -SET @@SESSION.debug_dbug=@old_dbug; - ---connection slave -LOCK TABLES ti WRITE, ti2 WRITE; ---source include/start_slave.inc - ---echo # Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. ---let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---echo # Wait for replica to progress until unblocked transactions are queued for group commit.. ---connection slave ---let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - ---connection slave ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc - -UNLOCK TABLES; ---source include/wait_for_slave_sql_to_stop.inc - ---connection slave1 ---reap ---connection slave - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---let $assert_text= GTID slave state should reach first N transaction ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - -set @@global.slave_parallel_mode=CONSERVATIVE; - ---connection master ---source include/save_master_gtid.inc ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Common Test Case 5: ---echo # Using multiple parallel replication threads (5) on workload ---echo # T (long running); should commit ---echo # N (waiting for prior commit); should commit ---echo # T (waiting for prior commit); should commit ---echo # N (waiting for prior commit); should commit ---echo # T (long running); should rollback ---echo # Issuing STOP SLAVE should allow all transactions up to and including ---echo # the last N (4th) to commit, while preventing and rolling back the ---echo # final transaction (5th) - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_mode=optimistic; -set @@global.slave_parallel_threads=5; - ---connection master -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10002; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr - ---eval insert into tm values ($tm_ctr) ---inc $tm_ctr - ---eval insert into ti2 values ($ti2_ctr) ---inc $ti2_ctr - ---eval insert into tm2 values ($tm2_ctr) ---inc $tm2_ctr ---source include/save_master_gtid.inc - ---eval insert into ti3 values ($ti3_ctr) ---inc $ti3_ctr - -SET @@SESSION.debug_dbug=@old_dbug; - ---connection slave -LOCK TABLES ti WRITE, ti3 WRITE; ---source include/start_slave.inc - ---echo # Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. ---let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---echo # Wait for replica to progress until unblocked transactions are queued for group commit.. ---connection slave ---let $wait_condition= SELECT count(*)=3 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - ---connection slave ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc - -UNLOCK TABLES; ---source include/wait_for_slave_sql_to_stop.inc - ---connection slave1 ---reap ---connection slave - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---let $assert_text= GTID slave state should reach second N transaction ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - -set @@global.slave_parallel_mode=CONSERVATIVE; - ---connection master ---source include/save_master_gtid.inc ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Common Test Case 6: ---echo # If retrying a T transaction while STOP SLAVE is issued, the ---echo # transaction should be rolled back and the slave abruptly stopped - ---connection master ---eval insert into ti values ($ti_ctr) ---source include/save_master_gtid.inc - ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc ---source include/stop_slave.inc -set @@global.slave_parallel_threads=1; - ---let $save_innodb_lock_wait_timeout= `SELECT @@global.innodb_lock_wait_timeout` -# 2 second buffer to give ample time to wait for transaction and issue stop slave -set @@global.innodb_lock_wait_timeout= 2; -BEGIN; ---eval SELECT * FROM ti WHERE a=$ti_ctr FOR UPDATE - ---connection master ---source include/save_master_gtid.inc ---eval update ti set a=a+1 where a=$ti_ctr ---inc $ti_ctr ---inc $ti_ctr - ---connection slave ---source include/start_slave.inc ---let $retried_tx_initial= query_get_value(SHOW ALL SLAVES STATUS, Retried_transactions, 1) - -if (`SELECT @@global.binlog_format = 'ROW'`) -{ - --let $update_state=Update_rows_log_event::find_row(-1) -} -if (`SELECT @@global.binlog_format = 'STATEMENT'`) -{ - --let $update_state=Updating -} ---echo # Wait for replicating transaction to wait for innodb table lock ---source include/start_slave.inc ---let $wait_condition= SELECT COUNT(*) > 0 FROM information_schema.processlist WHERE state LIKE "$update_state" and command like 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - -connection slave; ---source include/wait_for_slave_sql_to_stop.inc ---let $retried_tx_test= query_get_value(SHOW ALL SLAVES STATUS, Retried_transactions, 1) -if ($retried_tx_initial != $retried_tx_test) -{ - --echo T transaction should have been rolled back without retry - --die T transaction should have been rolled back without retry -} - -# End the SELECT ... FOR UPDATE -ROLLBACK; - ---connection slave1 ---reap ---connection slave - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---let $assert_text= The retried T transaction should have been rolled back ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - ---eval set @@global.innodb_lock_wait_timeout= $save_innodb_lock_wait_timeout - ---echo # ---echo # Common Test Case 7: ---echo # Using multiple parallel replication threads on a workload with a ---echo # non-transactional transaction in-between transactional transactions.. ---echo # 7a: with AGGRESSIVE replication where the N statement has been ---echo # executed already, all transactions up to and including N should ---echo # be replicated, and all transactions afterwards should be rolled ---echo # back. ---echo # 7b: with MINIMAL replication, the N statement should not execute ---echo # concurrently, but should wait along with the other later ---echo # transactions, and all future transactions except the first should ---echo # be rolled back. - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_threads=4; - ---let $mode_ctr=2 -while ($mode_ctr) -{ - --connection slave - if ($mode_ctr == 2) - { - --echo # - --echo # 7a: slave_parallel_mode=AGGRESSIVE - set @@global.slave_parallel_mode=AGGRESSIVE; - } - if ($mode_ctr == 1) - { - --echo # - --echo # 7b: slave_parallel_mode=MINIMAL - set @@global.slave_parallel_mode=MINIMAL; - } - - --connection slave - --let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm UNION ALL select * from ti2 UNION ALL select * from tm2 UNION ALL select * from ti3) t` - - --connection master - if ($mode_ctr == 1) - { - --let $master_gtid_cmp= `select @@global.gtid_binlog_pos` - } - - --connection master - --eval insert into ti values ($ti_ctr) - --inc $ti_ctr - - --eval insert into tm values ($tm_ctr) - if ($mode_ctr == 2) - { - # AGGRESSIVE mode should allow N trx to complete - --let $master_gtid_cmp= `select @@global.gtid_binlog_pos` - } - --eval insert into ti2 values ($ti2_ctr) - --inc $ti2_ctr - --eval insert into ti values ($ti_ctr) - --inc $ti_ctr - --source include/save_master_gtid.inc - - --connection slave - LOCK TABLES ti WRITE; - --connection slave_lock_extra - LOCK TABLES ti2 WRITE; - - --source include/start_slave.inc - - --echo # Wait for replica to halt due to locks and dependency requirements - --connection slave - - if ($mode_ctr == 2) - { - # AGGRESSIVE allows for more concurrency that we need to wait for - --let $wait_condition= SELECT count(*)=3 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; - --source include/wait_condition.inc - --let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; - --source include/wait_condition.inc - } - if ($mode_ctr == 1) - { - # MINIMAL will only have the first transaction begun - --let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; - --source include/wait_condition.inc - --let $wait_condition= SELECT count(*)=3 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; - --source include/wait_condition.inc - } - - --connection slave1 - --send STOP SLAVE; - - --connection slave - --echo # Wait for replica to signal worker threads to stop - --let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; - --source include/wait_condition.inc - - UNLOCK TABLES; - --connection slave_lock_extra - UNLOCK TABLES; - - --connection slave1 - --reap - --connection slave - --source include/wait_for_slave_sql_to_stop.inc - - --let $row_count_end=`select count(*) from (select * from ti UNION ALL select * from tm UNION ALL select * from ti2 UNION ALL select * from tm2 UNION ALL select * from ti3) t` - --let $row_count_diff=`select ($row_count_end-$row_count_initial)` - - if ($mode_ctr == 2) - { - --let $assert_text= The entirety of the first two transactions should have committed with AGGRESSIVE parallelization - --let $assert_cond= $row_count_diff = 2 - } - if ($mode_ctr == 1) - { - --let $assert_text= All transactions should have rolled back with MINIMAL parallelization - --let $assert_cond= $row_count_diff = 0 - } - - --source include/assert.inc - - --let $slave_gtid= `select @@global.gtid_slave_pos` - --let $assert_text= Slave state should be consistent - --let $assert_cond= $master_gtid_cmp = $slave_gtid - --source include/assert.inc - - --connection master - --source include/save_master_gtid.inc - --connection slave - --source include/start_slave.inc - --source include/sync_with_master_gtid.inc - - --source include/stop_slave.inc - --dec $mode_ctr -} ---source include/start_slave.inc - ---connection master ---source include/save_master_gtid.inc ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc diff --git a/mysql-test/suite/rpl/r/rpl_parallel.result b/mysql-test/suite/rpl/r/rpl_parallel.result index 4f4a1c7dbcd..9b2e68d366e 100644 --- a/mysql-test/suite/rpl/r/rpl_parallel.result +++ b/mysql-test/suite/rpl/r/rpl_parallel.result @@ -731,7 +731,7 @@ SET debug_sync='now WAIT_FOR t3_waiting'; SET debug_sync='now SIGNAL d2_cont'; SET debug_sync='now WAIT_FOR t4_waiting'; KILL THD_ID; -# Wait for replica to signal worker threads to stop +SET debug_sync='now WAIT_FOR t3_killed'; SET debug_sync='now SIGNAL t1_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; @@ -741,6 +741,7 @@ a b 61 61 62 62 63 63 +64 64 68 68 69 69 70 70 @@ -814,7 +815,6 @@ connection server_2; SET debug_sync='now WAIT_FOR wait_queue_ready'; KILL THD_ID; SET debug_sync='now WAIT_FOR wait_queue_killed'; -# Wait for replica to signal worker threads to stop SET debug_sync='now SIGNAL query_cont'; include/wait_for_slave_sql_error.inc [errno=1317,1927,1964] STOP SLAVE IO_THREAD; @@ -826,8 +826,6 @@ SET binlog_format=@old_format; connection server_2; SET debug_sync='RESET'; include/start_slave.inc -SET debug_sync='now WAIT_FOR query_waiting'; -SET debug_sync='now SIGNAL query_cont'; SELECT * FROM t3 WHERE a >= 80 ORDER BY a; a b 80 0 @@ -1216,7 +1214,6 @@ connection server_2; include/wait_for_slave_sql_to_stop.inc SELECT * FROM t2 WHERE a >= 40 ORDER BY a; a -40 41 42 include/start_slave.inc diff --git a/mysql-test/suite/rpl/r/rpl_parallel2.result b/mysql-test/suite/rpl/r/rpl_parallel2.result index aeedb4bafee..559c56271b8 100644 --- a/mysql-test/suite/rpl/r/rpl_parallel2.result +++ b/mysql-test/suite/rpl/r/rpl_parallel2.result @@ -1,7 +1,6 @@ include/rpl_init.inc [topology=1->2] *** MDEV-5509: Incorrect value for Seconds_Behind_Master if parallel replication *** connection server_2; -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; set @old_parallel_mode= @@GLOBAL.slave_parallel_mode; include/stop_slave.inc diff --git a/mysql-test/suite/rpl/r/rpl_row_par_stop_slave_quick.result b/mysql-test/suite/rpl/r/rpl_row_par_stop_slave_quick.result deleted file mode 100644 index 6fd5b448b47..00000000000 --- a/mysql-test/suite/rpl/r/rpl_row_par_stop_slave_quick.result +++ /dev/null @@ -1,507 +0,0 @@ -include/master-slave.inc -[connection master] -# -# Setup -connection slave; -include/stop_slave.inc -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Can't find record"); -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure"); -set @@global.slave_parallel_mode=CONSERVATIVE; -ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; -connect slave_lock_extra,127.0.0.1,root,,test,$SLAVE_MYPORT; -CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS; -include/start_slave.inc -# -# Initialize test data -connection master; -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); -create sequence s1; -create table ti (a int) engine=innodb; -create table ti2 (a int) engine=innodb; -create table ti3 (a int) engine=innodb; -create table tm (a int) engine=myisam; -create table tm2 (a int) engine=myisam; -connection slave; -# Run binlog format independent test cases -# -# Common Test Case 1: -# Using one parallel replication worker thread on workload {T,T}, ensure -# the replica immediately rolls back the transaction and stops the -# SQL thread -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_threads=1; -connection master; -include/save_master_gtid.inc -BEGIN; -insert into ti values (100); -insert into ti values (101); -COMMIT; -insert into ti values (102); -connection slave; -LOCK TABLES ti WRITE; -include/start_slave.inc -# Wait for replica to begin executing the first transaction -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [No new rows should have been inserted] -include/assert.inc [GTID slave state should not change] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 2: -# Using multiple parallel replication threads (two) on workload {T,T}, -# ensure both transactions are rolled back if stop slave is issued -# in the middle of the first transaction. -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_threads=2; -connection master; -include/save_master_gtid.inc -BEGIN; -insert into ti values (103); -insert into ti values (104); -COMMIT; -insert into ti values (105); -connection slave; -LOCK TABLES ti WRITE; -include/start_slave.inc -# Wait for replica to begin executing the first transaction -connection slave; -# Wait for second transaction to begin -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [No insertions should have committed] -include/assert.inc [GTID slave state should not change] -# Slave should be error-free -include/assert.inc [Slave should be error free] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 3: -# Using multiple parallel replication threads (two) on workload {T,T}, -# with the same commit id (cid), ensure both transactions are rolled -# back if stop slave is issued -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_mode=AGGRESSIVE; -set @@global.slave_parallel_threads=2; -connection master; -include/save_master_gtid.inc -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10000; -BEGIN; -insert into ti values (106); -insert into ti values (107); -COMMIT; -insert into ti2 values (400); -SET @@SESSION.debug_dbug=@old_dbug; -connection slave; -LOCK TABLES ti WRITE; -include/start_slave.inc -# Wait for replica to begin executing the first transactions -connection slave; -# Wait for second transaction to start group commit -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [No insertions should have committed] -include/assert.inc [GTID slave state should not change] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 4: -# Using multiple parallel replication threads (4) on workload -# T (long running); should commit -# N (waiting for prior commit); should commit -# T (long running); should rollback -# T (waiting for prior commit); should rollback -# Issuing STOP SLAVE should allow the first two transactions to commit -# while preventing and rolling back the third -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_mode=optimistic; -set @@global.slave_parallel_threads=4; -connection master; -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10001; -BEGIN; -insert into ti values (108); -insert into ti values (109); -COMMIT; -connection master; -insert into tm values (200); -include/save_master_gtid.inc -insert into ti2 values (401); -insert into ti3 values (500); -SET @@SESSION.debug_dbug=@old_dbug; -connection slave; -LOCK TABLES ti WRITE, ti2 WRITE; -include/start_slave.inc -# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. -# Wait for replica to progress until unblocked transactions are queued for group commit.. -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [GTID slave state should reach first N transaction] -set @@global.slave_parallel_mode=CONSERVATIVE; -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 5: -# Using multiple parallel replication threads (5) on workload -# T (long running); should commit -# N (waiting for prior commit); should commit -# T (waiting for prior commit); should commit -# N (waiting for prior commit); should commit -# T (long running); should rollback -# Issuing STOP SLAVE should allow all transactions up to and including -# the last N (4th) to commit, while preventing and rolling back the -# final transaction (5th) -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_mode=optimistic; -set @@global.slave_parallel_threads=5; -connection master; -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10002; -insert into ti values (110); -insert into tm values (201); -insert into ti2 values (402); -insert into tm2 values (300); -include/save_master_gtid.inc -insert into ti3 values (501); -SET @@SESSION.debug_dbug=@old_dbug; -connection slave; -LOCK TABLES ti WRITE, ti3 WRITE; -include/start_slave.inc -# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. -# Wait for replica to progress until unblocked transactions are queued for group commit.. -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [GTID slave state should reach second N transaction] -set @@global.slave_parallel_mode=CONSERVATIVE; -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 6: -# If retrying a T transaction while STOP SLAVE is issued, the -# transaction should be rolled back and the slave abruptly stopped -connection master; -insert into ti values (111); -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -Warnings: -Note 1254 Slave is already running -include/sync_with_master_gtid.inc -include/stop_slave.inc -set @@global.slave_parallel_threads=1; -set @@global.innodb_lock_wait_timeout= 2; -BEGIN; -SELECT * FROM ti WHERE a=111 FOR UPDATE; -a -111 -connection master; -include/save_master_gtid.inc -update ti set a=a+1 where a=111; -connection slave; -include/start_slave.inc -# Wait for replicating transaction to wait for innodb table lock -include/start_slave.inc -Warnings: -Note 1254 Slave is already running -connection slave1; -STOP SLAVE;; -connection slave; -include/wait_for_slave_sql_to_stop.inc -ROLLBACK; -connection slave1; -connection slave; -include/assert.inc [The retried T transaction should have been rolled back] -set @@global.innodb_lock_wait_timeout= 50; -# -# Common Test Case 7: -# Using multiple parallel replication threads on a workload with a -# non-transactional transaction in-between transactional transactions.. -# 7a: with AGGRESSIVE replication where the N statement has been -# executed already, all transactions up to and including N should -# be replicated, and all transactions afterwards should be rolled -# back. -# 7b: with MINIMAL replication, the N statement should not execute -# concurrently, but should wait along with the other later -# transactions, and all future transactions except the first should -# be rolled back. -connection slave; -include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped -set @@global.slave_parallel_threads=4; -connection slave; -# -# 7a: slave_parallel_mode=AGGRESSIVE -set @@global.slave_parallel_mode=AGGRESSIVE; -connection slave; -connection master; -connection master; -insert into ti values (113); -insert into tm values (202); -insert into ti2 values (403); -insert into ti values (114); -include/save_master_gtid.inc -connection slave; -LOCK TABLES ti WRITE; -connection slave_lock_extra; -LOCK TABLES ti2 WRITE; -include/start_slave.inc -# Wait for replica to halt due to locks and dependency requirements -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -connection slave_lock_extra; -UNLOCK TABLES; -connection slave1; -connection slave; -include/wait_for_slave_sql_to_stop.inc -include/assert.inc [The entirety of the first two transactions should have committed with AGGRESSIVE parallelization] -include/assert.inc [Slave state should be consistent] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -include/stop_slave.inc -connection slave; -# -# 7b: slave_parallel_mode=MINIMAL -set @@global.slave_parallel_mode=MINIMAL; -connection slave; -connection master; -connection master; -insert into ti values (115); -insert into tm values (202); -insert into ti2 values (404); -insert into ti values (116); -include/save_master_gtid.inc -connection slave; -LOCK TABLES ti WRITE; -connection slave_lock_extra; -LOCK TABLES ti2 WRITE; -include/start_slave.inc -# Wait for replica to halt due to locks and dependency requirements -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -connection slave_lock_extra; -UNLOCK TABLES; -connection slave1; -connection slave; -include/wait_for_slave_sql_to_stop.inc -include/assert.inc [All transactions should have rolled back with MINIMAL parallelization] -include/assert.inc [Slave state should be consistent] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -include/stop_slave.inc -include/start_slave.inc -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -Warnings: -Note 1254 Slave is already running -include/sync_with_master_gtid.inc -# -# ROW Test Case 1: -# Using an N multi-statement transaction, ensure if STOP SLAVE is -# issued in-between row updates, that the transaction is finished. -connection master; -truncate table ti; -truncate table tm; -# Set up multiple rows to allow a multi-statement update rows event -insert into tm values (202); -insert into tm values (203); -connection slave; -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_threads=1; -connection master; -# Next-to-commit non-transactional transaction should finish -update tm set a=a+1; -include/save_master_gtid.inc -# This should not be committed because it is after next-to-commit -insert into ti values (117); -connection slave; -set @@global.debug_dbug="+d,pause_after_next_row_exec"; -START SLAVE; -set debug_sync= "now WAIT_FOR row_executed"; -connection slave1; -STOP SLAVE;; -connection slave; -set @@global.debug_dbug=""; -set debug_sync= "now SIGNAL continue_row_execution"; -connection slave1; -include/wait_for_slave_sql_to_stop.inc -# Slave should be error-free -include/assert.inc [Slave should be error free] -set debug_sync= "RESET"; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# ROW Test Case 2: -# Using a T multi-statement transaction, ensure if STOP SLAVE is -# issued in-between row updates, that the transaction is rolled back. -connection master; -truncate table ti; -truncate table ti2; -truncate table tm; -insert into ti values (118); -insert into ti values (119); -connection slave; -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_threads=1; -connection master; -# Next-to-commit transactional multi-row event should be rolled back -include/save_master_gtid.inc -update ti set a=a+1; -insert into ti values (120); -connection slave; -set @@global.debug_dbug="+d,pause_after_next_row_exec"; -START SLAVE; -set debug_sync= "now WAIT_FOR row_executed"; -connection slave1; -STOP SLAVE;; -connection slave; -set @@global.debug_dbug=""; -set debug_sync= "now SIGNAL continue_row_execution"; -connection slave1; -include/wait_for_slave_sql_to_stop.inc -include/assert.inc [No new rows should have been inserted] -# Comparing master gtid 0-1-42 to slaves 0-1-42 -include/assert.inc [No transactions should have committed] -# Slave should be error-free -include/assert.inc [Slave should be error free] -connection master; -include/save_master_gtid.inc -connection slave; -set debug_sync= "RESET"; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Row Test Case 3: -# A workload with a later transaction that updates a sequence table -# should complete all transactions up to the sequence table update. -# Workload: -# T (long running); should commit -# S (waiting for prior commit); should commit -# T (long running); should rollback -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_mode=AGGRESSIVE; -set @@global.slave_parallel_threads=3; -connection master; -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10002; -insert into ti values (121); -select next value for s1; -next value for s1 -1 -include/save_master_gtid.inc -insert into ti2 values (405); -SET @@SESSION.debug_dbug=@old_dbug; -connection slave; -LOCK TABLES ti write, ti2 WRITE; -include/start_slave.inc -# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. -# Wait for replica to progress until unblocked transactions are queued for group commit.. -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [GTID slave state should not change] -set @@global.slave_parallel_mode=CONSERVATIVE; -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Cleanup -connection master; -DROP TABLE ti, ti2, ti3, tm, tm2, s1; -include/save_master_gtid.inc -connection slave; -include/sync_with_master_gtid.inc -include/stop_slave.inc -set @@global.debug_dbug=""; -set @@global.slave_parallel_threads=0; -set @@global.slave_parallel_mode=conservative; -include/start_slave.inc -include/rpl_end.inc -# End of tests diff --git a/mysql-test/suite/rpl/r/rpl_stm_par_stop_slave_quick.result b/mysql-test/suite/rpl/r/rpl_stm_par_stop_slave_quick.result deleted file mode 100644 index 18b06f5054f..00000000000 --- a/mysql-test/suite/rpl/r/rpl_stm_par_stop_slave_quick.result +++ /dev/null @@ -1,461 +0,0 @@ -include/master-slave.inc -[connection master] -# -# Setup -connection slave; -include/stop_slave.inc -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); -set @@global.slave_parallel_mode=CONSERVATIVE; -ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; -change master to master_use_gtid=slave_pos; -include/start_slave.inc -connect slave_lock_extra,127.0.0.1,root,,test,$SLAVE_MYPORT; -# -# Initialize test data -connection master; -set statement sql_log_bin=0 for call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); -create table ti (a int primary key) engine=innodb; -create table ti2 (a int) engine=innodb; -create table ti3 (a int) engine=innodb; -create table tm (a int) engine=myisam; -create table tm2 (a int) engine=myisam; -connection slave; -# Run binlog format independent test cases -# -# Common Test Case 1: -# Using one parallel replication worker thread on workload {T,T}, ensure -# the replica immediately rolls back the transaction and stops the -# SQL thread -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_threads=1; -connection master; -include/save_master_gtid.inc -BEGIN; -insert into ti values (100); -insert into ti values (101); -COMMIT; -insert into ti values (102); -connection slave; -LOCK TABLES ti WRITE; -include/start_slave.inc -# Wait for replica to begin executing the first transaction -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [No new rows should have been inserted] -include/assert.inc [GTID slave state should not change] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 2: -# Using multiple parallel replication threads (two) on workload {T,T}, -# ensure both transactions are rolled back if stop slave is issued -# in the middle of the first transaction. -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_threads=2; -connection master; -include/save_master_gtid.inc -BEGIN; -insert into ti values (103); -insert into ti values (104); -COMMIT; -insert into ti values (105); -connection slave; -LOCK TABLES ti WRITE; -include/start_slave.inc -# Wait for replica to begin executing the first transaction -connection slave; -# Wait for second transaction to begin -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [No insertions should have committed] -include/assert.inc [GTID slave state should not change] -# Slave should be error-free -include/assert.inc [Slave should be error free] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 3: -# Using multiple parallel replication threads (two) on workload {T,T}, -# with the same commit id (cid), ensure both transactions are rolled -# back if stop slave is issued -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_mode=AGGRESSIVE; -set @@global.slave_parallel_threads=2; -connection master; -include/save_master_gtid.inc -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10000; -BEGIN; -insert into ti values (106); -insert into ti values (107); -COMMIT; -insert into ti2 values (400); -SET @@SESSION.debug_dbug=@old_dbug; -connection slave; -LOCK TABLES ti WRITE; -include/start_slave.inc -# Wait for replica to begin executing the first transactions -connection slave; -# Wait for second transaction to start group commit -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [No insertions should have committed] -include/assert.inc [GTID slave state should not change] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 4: -# Using multiple parallel replication threads (4) on workload -# T (long running); should commit -# N (waiting for prior commit); should commit -# T (long running); should rollback -# T (waiting for prior commit); should rollback -# Issuing STOP SLAVE should allow the first two transactions to commit -# while preventing and rolling back the third -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_mode=optimistic; -set @@global.slave_parallel_threads=4; -connection master; -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10001; -BEGIN; -insert into ti values (108); -insert into ti values (109); -COMMIT; -connection master; -insert into tm values (200); -include/save_master_gtid.inc -insert into ti2 values (401); -insert into ti3 values (500); -SET @@SESSION.debug_dbug=@old_dbug; -connection slave; -LOCK TABLES ti WRITE, ti2 WRITE; -include/start_slave.inc -# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. -# Wait for replica to progress until unblocked transactions are queued for group commit.. -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [GTID slave state should reach first N transaction] -set @@global.slave_parallel_mode=CONSERVATIVE; -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 5: -# Using multiple parallel replication threads (5) on workload -# T (long running); should commit -# N (waiting for prior commit); should commit -# T (waiting for prior commit); should commit -# N (waiting for prior commit); should commit -# T (long running); should rollback -# Issuing STOP SLAVE should allow all transactions up to and including -# the last N (4th) to commit, while preventing and rolling back the -# final transaction (5th) -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_mode=optimistic; -set @@global.slave_parallel_threads=5; -connection master; -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10002; -insert into ti values (110); -insert into tm values (201); -insert into ti2 values (402); -insert into tm2 values (300); -include/save_master_gtid.inc -insert into ti3 values (501); -SET @@SESSION.debug_dbug=@old_dbug; -connection slave; -LOCK TABLES ti WRITE, ti3 WRITE; -include/start_slave.inc -# Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. -# Wait for replica to progress until unblocked transactions are queued for group commit.. -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [GTID slave state should reach second N transaction] -set @@global.slave_parallel_mode=CONSERVATIVE; -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Common Test Case 6: -# If retrying a T transaction while STOP SLAVE is issued, the -# transaction should be rolled back and the slave abruptly stopped -connection master; -insert into ti values (111); -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -Warnings: -Note 1254 Slave is already running -include/sync_with_master_gtid.inc -include/stop_slave.inc -set @@global.slave_parallel_threads=1; -set @@global.innodb_lock_wait_timeout= 2; -BEGIN; -SELECT * FROM ti WHERE a=111 FOR UPDATE; -a -111 -connection master; -include/save_master_gtid.inc -update ti set a=a+1 where a=111; -connection slave; -include/start_slave.inc -# Wait for replicating transaction to wait for innodb table lock -include/start_slave.inc -Warnings: -Note 1254 Slave is already running -connection slave1; -STOP SLAVE;; -connection slave; -include/wait_for_slave_sql_to_stop.inc -ROLLBACK; -connection slave1; -connection slave; -include/assert.inc [The retried T transaction should have been rolled back] -set @@global.innodb_lock_wait_timeout= 50; -# -# Common Test Case 7: -# Using multiple parallel replication threads on a workload with a -# non-transactional transaction in-between transactional transactions.. -# 7a: with AGGRESSIVE replication where the N statement has been -# executed already, all transactions up to and including N should -# be replicated, and all transactions afterwards should be rolled -# back. -# 7b: with MINIMAL replication, the N statement should not execute -# concurrently, but should wait along with the other later -# transactions, and all future transactions except the first should -# be rolled back. -connection slave; -include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped -set @@global.slave_parallel_threads=4; -connection slave; -# -# 7a: slave_parallel_mode=AGGRESSIVE -set @@global.slave_parallel_mode=AGGRESSIVE; -connection slave; -connection master; -connection master; -insert into ti values (113); -insert into tm values (202); -insert into ti2 values (403); -insert into ti values (114); -include/save_master_gtid.inc -connection slave; -LOCK TABLES ti WRITE; -connection slave_lock_extra; -LOCK TABLES ti2 WRITE; -include/start_slave.inc -# Wait for replica to halt due to locks and dependency requirements -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -connection slave_lock_extra; -UNLOCK TABLES; -connection slave1; -connection slave; -include/wait_for_slave_sql_to_stop.inc -include/assert.inc [The entirety of the first two transactions should have committed with AGGRESSIVE parallelization] -include/assert.inc [Slave state should be consistent] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -include/stop_slave.inc -connection slave; -# -# 7b: slave_parallel_mode=MINIMAL -set @@global.slave_parallel_mode=MINIMAL; -connection slave; -connection master; -connection master; -insert into ti values (115); -insert into tm values (202); -insert into ti2 values (404); -insert into ti values (116); -include/save_master_gtid.inc -connection slave; -LOCK TABLES ti WRITE; -connection slave_lock_extra; -LOCK TABLES ti2 WRITE; -include/start_slave.inc -# Wait for replica to halt due to locks and dependency requirements -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -connection slave_lock_extra; -UNLOCK TABLES; -connection slave1; -connection slave; -include/wait_for_slave_sql_to_stop.inc -include/assert.inc [All transactions should have rolled back with MINIMAL parallelization] -include/assert.inc [Slave state should be consistent] -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -include/stop_slave.inc -include/start_slave.inc -connection master; -include/save_master_gtid.inc -connection slave; -include/start_slave.inc -Warnings: -Note 1254 Slave is already running -include/sync_with_master_gtid.inc -# -# Statement Test Case 1: -# Using one parallel replication worker thread on workload {N,T}, ensure -# the replica finishes the non-transactional transaction, and does not -# start the next -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_threads=1; -connection master; -SET @@session.binlog_direct_non_transactional_updates= 0; -BEGIN; -insert into ti values (117); -insert into tm values (202); -Warnings: -Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction -insert into tm2 values (301); -Warnings: -Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction -COMMIT; -include/save_master_gtid.inc -insert into ti values (118); -connection slave; -lock tables tm2 write; -START SLAVE; -# Wait for replica to get stuck on held lock -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -# Unlock row-level lock holding transaction -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [Transaction should have committed] -include/assert.inc [N should have been applied] -# Slave should be error-free -include/assert.inc [Slave should be error free] -connection master; -include/save_master_gtid.inc -SET @@session.binlog_direct_non_transactional_updates= 1; -connection slave; -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Statement Test Case 2: -# If STOP SLAVE is issued on a parallel slave, such that the next to -# commit transaction is T; even if the next event from the group will -# commit the transaction (e.g. XID_EVENT), the transaction should be -# stopped and rolled back. -connection slave; -include/stop_slave.inc -set @@global.slave_parallel_threads=1; -connection master; -insert into ti values (119); -insert into ti values (120); -include/save_master_gtid.inc -connection slave; -LOCK TABLES ti WRITE; -include/start_slave.inc -# Wait for replica to begin executing the first transaction -connection slave; -connection slave1; -STOP SLAVE;; -connection slave; -# Wait for replica to signal worker threads to stop -UNLOCK TABLES; -include/wait_for_slave_sql_to_stop.inc -connection slave1; -connection slave; -include/assert.inc [No insertions should have committed] -include/assert.inc [GTID slave state should increment to the first transaction] -include/start_slave.inc -include/sync_with_master_gtid.inc -# -# Cleanup -connection master; -DROP TABLE ti, tm, ti2, tm2, ti3; -include/save_master_gtid.inc -connection slave; -include/sync_with_master_gtid.inc -include/stop_slave.inc -set @@global.slave_parallel_threads=0; -set @@global.slave_domain_parallel_threads=0; -set @@global.slave_parallel_mode=conservative; -set @@global.debug_dbug=""; -include/start_slave.inc -include/rpl_end.inc -# End of tests diff --git a/mysql-test/suite/rpl/t/rpl_parallel.test b/mysql-test/suite/rpl/t/rpl_parallel.test index 433e7c9d8c4..9ba7a30f2eb 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel.test +++ b/mysql-test/suite/rpl/t/rpl_parallel.test @@ -949,9 +949,8 @@ SET debug_sync='now WAIT_FOR t4_waiting'; --replace_result $d1_thd_id THD_ID eval KILL $d1_thd_id; ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc +# Wait until T3 has reacted on the kill. +SET debug_sync='now WAIT_FOR t3_killed'; # Now we can allow T1 to proceed. SET debug_sync='now SIGNAL t1_cont'; @@ -960,7 +959,7 @@ SET debug_sync='now SIGNAL t1_cont'; --source include/wait_for_slave_sql_error.inc STOP SLAVE IO_THREAD; # Since T2, T3, and T4 run in parallel, we can not be sure if T2 will have time -# to commit or not before the stop. However, T1 should rollback, and T3/T4 may +# to commit or not before the stop. However, T1 should commit, and T3/T4 may # not have committed. (After slave restart we check that all become committed # eventually). SELECT * FROM t3 WHERE a >= 60 AND a != 65 ORDER BY a; @@ -1059,11 +1058,6 @@ SET debug_sync='now WAIT_FOR wait_queue_ready'; eval KILL $thd_id; SET debug_sync='now WAIT_FOR wait_queue_killed'; - ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc - SET debug_sync='now SIGNAL query_cont'; --let $slave_sql_errno= 1317,1927,1964 @@ -1081,14 +1075,6 @@ SET binlog_format=@old_format; --connection server_2 SET debug_sync='RESET'; --source include/start_slave.inc - -# Test amendment from MDEV-13915: -# A worker thread's event queue is no longer executed on replica stop. -# The signal query_cont needs to be re-sent because the transaction was -# aborted. -SET debug_sync='now WAIT_FOR query_waiting'; -SET debug_sync='now SIGNAL query_cont'; - --sync_with_master SELECT * FROM t3 WHERE a >= 80 ORDER BY a; diff --git a/mysql-test/suite/rpl/t/rpl_parallel2.test b/mysql-test/suite/rpl/t/rpl_parallel2.test index 506e074110c..8934b15e546 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel2.test +++ b/mysql-test/suite/rpl/t/rpl_parallel2.test @@ -7,7 +7,6 @@ --echo *** MDEV-5509: Incorrect value for Seconds_Behind_Master if parallel replication *** --connection server_2 -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; set @old_parallel_mode= @@GLOBAL.slave_parallel_mode; --source include/stop_slave.inc diff --git a/mysql-test/suite/rpl/t/rpl_parallel_optimistic_error_stop.test b/mysql-test/suite/rpl/t/rpl_parallel_optimistic_error_stop.test index 35f28073a74..27f38d47bdb 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel_optimistic_error_stop.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_optimistic_error_stop.test @@ -122,10 +122,10 @@ SELECT COUNT(*) = 1 as "W4 remains with the same status" FROM information_schema --echo # Slave_SQL_Running YES = $status # B. In the fixed version W3 is waiting for W2,... ---let $wait_condition= SELECT count(*) = 1 as "W3 is waiting" FROM information_schema.processlist WHERE state LIKE "Waiting for prior transaction to commit%" +--let $wait_condition= SELECT count(*) = 1 as "W4 is waiting" FROM information_schema.processlist WHERE state LIKE "Waiting for prior transaction to commit%" --source include/wait_condition.inc --echo # while W2 is held back ... ---let $wait_condition= SELECT count(*) >= 1 as "W2 simulates slowness" FROM information_schema.processlist WHERE state LIKE "debug sync point: now" +--let $wait_condition= SELECT count(*) = 1 as "W2 simulates slowness" FROM information_schema.processlist WHERE state LIKE "debug sync point: now" --source include/wait_condition.inc # C. # ...until NOW. @@ -143,7 +143,7 @@ if ($old_version_regression) --let $wait_condition= SELECT count(*) = 0 as "W3 does not wait on W2" FROM information_schema.processlist WHERE state LIKE "Waiting for prior transaction to commit%" --source include/wait_condition.inc - --let $wait_condition= SELECT count(*) >= 1 as "W2 simulates slowness" FROM information_schema.processlist WHERE state LIKE "debug sync point: now" + --let $wait_condition= SELECT count(*) = 1 as "W2 simulates slowness" FROM information_schema.processlist WHERE state LIKE "debug sync point: now" --source include/wait_condition.inc # Like above, but signaling is done after W4 is done to violate the commit order diff --git a/mysql-test/suite/rpl/t/rpl_row_par_stop_slave_quick.test b/mysql-test/suite/rpl/t/rpl_row_par_stop_slave_quick.test deleted file mode 100644 index 56ad9e34a93..00000000000 --- a/mysql-test/suite/rpl/t/rpl_row_par_stop_slave_quick.test +++ /dev/null @@ -1,268 +0,0 @@ -# -# Validate that STOP SLAVE works in a timely manner on a parallel replica with -# ROW binary logging format. -# ---source include/have_debug.inc ---source include/have_debug_sync.inc ---source include/master-slave.inc ---source include/have_innodb.inc ---source include/have_binlog_format_row.inc - ---echo # ---echo # Setup ---connection slave ---source include/stop_slave.inc -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Can't find record"); -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure"); ---let $old_debug= `SELECT @@global.debug_dbug` ---let $old_threads= `SELECT @@global.slave_parallel_threads` ---let $old_slave_mode= `SELECT @@global.slave_parallel_mode` -set @@global.slave_parallel_mode=CONSERVATIVE; -ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; ---connect(slave_lock_extra,127.0.0.1,root,,test,$SLAVE_MYPORT) -CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS; ---source include/start_slave.inc - ---echo # ---echo # Initialize test data ---connection master -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); - -# Needed by this test and include/rpl_par_stop_slave_quick.inc - -create sequence s1; -create table ti (a int) engine=innodb; -create table ti2 (a int) engine=innodb; -create table ti3 (a int) engine=innodb; -create table tm (a int) engine=myisam; -create table tm2 (a int) engine=myisam; ---let $ti_ctr= 100 ---let $tm_ctr= 200 ---let $tm2_ctr= 300 ---let $ti2_ctr= 400 ---let $ti3_ctr= 500 ---sync_slave_with_master - ---echo # Run binlog format independent test cases ---source include/rpl_par_stop_slave_quick_common.test - ---echo # ---echo # ROW Test Case 1: ---echo # Using an N multi-statement transaction, ensure if STOP SLAVE is ---echo # issued in-between row updates, that the transaction is finished. - ---connection master -truncate table ti; -truncate table tm; ---echo # Set up multiple rows to allow a multi-statement update rows event ---eval insert into tm values ($tm_ctr) ---inc $tm_ctr ---eval insert into tm values ($tm_ctr) ---inc $tm_ctr ---sync_slave_with_master - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_threads=1; ---let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm) t` - ---connection master - ---echo # Next-to-commit non-transactional transaction should finish ---eval update tm set a=a+1 ---source include/save_master_gtid.inc ---let $master_gtid_after_update= `select @@global.gtid_binlog_pos` - ---echo # This should not be committed because it is after next-to-commit ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr - ---connection slave -set @@global.debug_dbug="+d,pause_after_next_row_exec"; - -START SLAVE; -set debug_sync= "now WAIT_FOR row_executed"; - ---connection slave1 ---send STOP SLAVE; - ---connection slave -set @@global.debug_dbug=""; -set debug_sync= "now SIGNAL continue_row_execution"; - ---connection slave1 ---reap ---source include/wait_for_slave_sql_to_stop.inc - ---echo # Slave should be error-free -let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); ---let $assert_text= Slave should be error free ---let $assert_cond= $last_error = 0 ---source include/assert.inc - -set debug_sync= "RESET"; ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # ROW Test Case 2: ---echo # Using a T multi-statement transaction, ensure if STOP SLAVE is ---echo # issued in-between row updates, that the transaction is rolled back. - ---connection master -truncate table ti; -truncate table ti2; -truncate table tm; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---sync_slave_with_master - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_threads=1; ---let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm) t` - ---connection master - ---echo # Next-to-commit transactional multi-row event should be rolled back ---source include/save_master_gtid.inc ---let $master_gtid_initial= `select @@global.gtid_binlog_pos` ---eval update ti set a=a+1 - ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr - ---connection slave -set @@global.debug_dbug="+d,pause_after_next_row_exec"; -START SLAVE; -set debug_sync= "now WAIT_FOR row_executed"; - ---connection slave1 ---send STOP SLAVE; - ---connection slave -set @@global.debug_dbug=""; -set debug_sync= "now SIGNAL continue_row_execution"; - ---connection slave1 ---reap ---source include/wait_for_slave_sql_to_stop.inc - ---let $row_count_end=`select count(*) from (select * from ti UNION ALL select * from tm) t` ---let $row_count_diff=`select ($row_count_end-$row_count_initial)` ---let $assert_text= No new rows should have been inserted ---let $assert_cond= $row_count_diff = 0 ---source include/assert.inc - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---echo # Comparing master gtid $master_pos to slaves $slave_gtid ---let $assert_text= No transactions should have committed ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - ---echo # Slave should be error-free -let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); ---let $assert_text= Slave should be error free ---let $assert_cond= $last_error = 0 ---source include/assert.inc - ---connection master ---source include/save_master_gtid.inc - ---connection slave -set debug_sync= "RESET"; ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Row Test Case 3: ---echo # A workload with a later transaction that updates a sequence table ---echo # should complete all transactions up to the sequence table update. ---echo # Workload: ---echo # T (long running); should commit ---echo # S (waiting for prior commit); should commit ---echo # T (long running); should rollback - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_mode=AGGRESSIVE; -set @@global.slave_parallel_threads=3; - ---connection master -SET @old_dbug= @@SESSION.debug_dbug; -SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; -SET @commit_id= 10002; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr - -select next value for s1; ---source include/save_master_gtid.inc - ---eval insert into ti2 values ($ti2_ctr) ---inc $ti2_ctr - -SET @@SESSION.debug_dbug=@old_dbug; - ---connection slave -LOCK TABLES ti write, ti2 WRITE; ---source include/start_slave.inc - ---echo # Wait for replica to progress until the transactions targeting locked tables are stuck on their locks.. ---let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---echo # Wait for replica to progress until unblocked transactions are queued for group commit.. ---connection slave ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - ---connection slave ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc - -UNLOCK TABLES; ---source include/wait_for_slave_sql_to_stop.inc - ---connection slave1 ---reap ---connection slave - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---let $assert_text= GTID slave state should not change ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - -set @@global.slave_parallel_mode=CONSERVATIVE; - ---connection master ---source include/save_master_gtid.inc ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Cleanup ---connection master -DROP TABLE ti, ti2, ti3, tm, tm2, s1; ---source include/save_master_gtid.inc - ---connection slave ---source include/sync_with_master_gtid.inc ---source include/stop_slave.inc ---eval set @@global.debug_dbug="$old_debug" ---eval set @@global.slave_parallel_threads=$old_threads ---eval set @@global.slave_parallel_mode=$old_slave_mode ---source include/start_slave.inc - ---source include/rpl_end.inc - ---echo # End of tests diff --git a/mysql-test/suite/rpl/t/rpl_stm_par_stop_slave_quick.test b/mysql-test/suite/rpl/t/rpl_stm_par_stop_slave_quick.test deleted file mode 100644 index b76979c62da..00000000000 --- a/mysql-test/suite/rpl/t/rpl_stm_par_stop_slave_quick.test +++ /dev/null @@ -1,200 +0,0 @@ -# -# Validate that STOP SLAVE works in a timely manner on a parallel replica with -# STATEMENT binary logging format. -# ---source include/have_debug.inc ---source include/master-slave.inc ---source include/have_innodb.inc ---source include/have_binlog_format_statement.inc - ---echo # ---echo # Setup ---connection slave ---source include/stop_slave.inc -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); -SET STATEMENT sql_log_bin=0 FOR call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); ---let $old_threads= `SELECT @@global.slave_parallel_threads` ---let $old_domain_threads= `SELECT @@global.slave_domain_parallel_threads` ---let $old_slave_mode= `SELECT @@global.slave_parallel_mode` ---let $old_debug_dbug= `SELECT @@global.debug_dbug` -set @@global.slave_parallel_mode=CONSERVATIVE; - -ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; -change master to master_use_gtid=slave_pos; ---source include/start_slave.inc ---connect(slave_lock_extra,127.0.0.1,root,,test,$SLAVE_MYPORT) - ---echo # ---echo # Initialize test data ---connection master -set statement sql_log_bin=0 for call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); -create table ti (a int primary key) engine=innodb; -create table ti2 (a int) engine=innodb; -create table ti3 (a int) engine=innodb; -create table tm (a int) engine=myisam; -create table tm2 (a int) engine=myisam; ---let $ti_ctr= 100 ---let $tm_ctr= 200 ---let $tm2_ctr= 300 ---let $ti2_ctr= 400 ---let $ti3_ctr= 500 ---sync_slave_with_master - ---echo # Run binlog format independent test cases ---source include/rpl_par_stop_slave_quick_common.test - ---echo # ---echo # Statement Test Case 1: ---echo # Using one parallel replication worker thread on workload {N,T}, ensure ---echo # the replica finishes the non-transactional transaction, and does not ---echo # start the next - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_threads=1; ---let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm UNION ALL select * from tm2) t` - ---connection master ---let $old_binlog_direct= `SELECT @@global.binlog_direct_non_transactional_updates` -SET @@session.binlog_direct_non_transactional_updates= 0; -BEGIN; ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---eval insert into tm values ($tm_ctr) ---inc $tm_ctr ---eval insert into tm2 values ($tm2_ctr) ---inc $tm_ctr -COMMIT; ---source include/save_master_gtid.inc - ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr - ---connection slave -lock tables tm2 write; -START SLAVE; - ---echo # Wait for replica to get stuck on held lock ---connection slave ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - ---connection slave ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc - ---echo # Unlock row-level lock holding transaction -UNLOCK TABLES; ---source include/wait_for_slave_sql_to_stop.inc - ---connection slave1 ---reap ---connection slave - ---let $row_count_end=`select count(*) from (select * from ti UNION ALL select * from tm UNION ALL select * from tm2) t` ---let $row_count_diff=`select ($row_count_end-$row_count_initial)` ---let $assert_text= Transaction should have committed ---let $assert_cond= $row_count_diff = 3 ---source include/assert.inc - ---let $slave_gtid= `select @@global.gtid_slave_pos` -# N is the non-transactional transaction ---let $assert_text= N should have been applied ---let $assert_cond= $master_pos = $slave_gtid ---source include/assert.inc - ---echo # Slave should be error-free -let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); ---let $assert_text= Slave should be error free ---let $assert_cond= $last_error = 0 ---source include/assert.inc - ---connection master ---source include/save_master_gtid.inc ---eval SET @@session.binlog_direct_non_transactional_updates= $old_binlog_direct - ---connection slave ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Statement Test Case 2: ---echo # If STOP SLAVE is issued on a parallel slave, such that the next to ---echo # commit transaction is T; even if the next event from the group will ---echo # commit the transaction (e.g. XID_EVENT), the transaction should be ---echo # stopped and rolled back. - ---connection slave ---source include/stop_slave.inc -set @@global.slave_parallel_threads=1; ---let $row_count_initial=`select count(*) from (select * from ti UNION ALL select * from tm) t` - ---connection master ---let $master_gtid_cmp= `select @@global.gtid_binlog_pos` ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---eval insert into ti values ($ti_ctr) ---inc $ti_ctr ---source include/save_master_gtid.inc - ---connection slave -LOCK TABLES ti WRITE; ---source include/start_slave.inc - ---echo # Wait for replica to begin executing the first transaction ---connection slave ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock' and command LIKE 'Slave_worker'; ---source include/wait_condition.inc - ---connection slave1 ---send STOP SLAVE; - ---connection slave ---echo # Wait for replica to signal worker threads to stop ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for worker thread to stop'; ---source include/wait_condition.inc -UNLOCK TABLES; ---source include/wait_for_slave_sql_to_stop.inc - ---connection slave1 ---reap ---connection slave - ---let $row_count_end=`select count(*) from (select * from ti UNION ALL select * from tm) t` ---let $row_count_diff=`select ($row_count_end-$row_count_initial)` ---let $assert_text= No insertions should have committed ---let $assert_cond= $row_count_diff = 0 ---source include/assert.inc - ---let $slave_gtid= `select @@global.gtid_slave_pos` ---let $assert_text= GTID slave state should increment to the first transaction ---let $assert_cond= $master_gtid_cmp = $slave_gtid ---source include/assert.inc - ---source include/start_slave.inc ---source include/sync_with_master_gtid.inc - - ---echo # ---echo # Cleanup ---connection master -DROP TABLE ti, tm, ti2, tm2, ti3; ---source include/save_master_gtid.inc - ---connection slave ---source include/sync_with_master_gtid.inc ---source include/stop_slave.inc ---eval set @@global.slave_parallel_threads=$old_threads ---eval set @@global.slave_domain_parallel_threads=$old_domain_threads ---eval set @@global.slave_parallel_mode=$old_slave_mode ---eval set @@global.debug_dbug="$old_debug_dbug" ---source include/start_slave.inc - ---source include/rpl_end.inc - ---echo # End of tests diff --git a/sql/log_event.cc b/sql/log_event.cc index 0bd1e28abfe..bafcf34cc2e 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -8013,10 +8013,7 @@ Gtid_log_event::Gtid_log_event(THD *thd_arg, uint64 seq_no_arg, thd_arg->transaction.all.has_created_dropped_temp_table() || thd_arg->transaction.all.trans_executed_admin_cmd()) flags2|= FL_DDL; - else if (is_transactional && !is_tmp_table && - !(thd_arg->transaction.all.modified_non_trans_table && - thd->variables.binlog_direct_non_trans_update == 0 && - !thd->is_current_stmt_binlog_format_row())) + else if (is_transactional && !is_tmp_table) flags2|= FL_TRANSACTIONAL; if (!(thd_arg->variables.option_bits & OPTION_RPL_SKIP_PARALLEL)) flags2|= FL_ALLOW_PARALLEL; @@ -8147,6 +8144,7 @@ Gtid_log_event::do_apply_event(rpl_group_info *rgi) thd->variables.server_id= this->server_id; thd->variables.gtid_domain_id= this->domain_id; thd->variables.gtid_seq_no= this->seq_no; + rgi->gtid_ev_flags2= flags2; thd->reset_for_next_command(); if (opt_gtid_strict_mode && opt_bin_log && opt_log_slave_updates) @@ -11674,27 +11672,8 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi) if (!table->in_use) table->in_use= thd; - /* - Exit early, and let the Event-level exit logic take care of the cleanup - and rollback. - */ - if (rgi->rli->mi->using_parallel() && - rgi->parallel_entry->stop_abrupt(rgi->rli) && - rgi->parallel_entry->rgi_is_safe_to_terminate(rgi)) - break; - error= do_exec_row(rgi); - - DBUG_EXECUTE_IF( - "pause_after_next_row_exec", - { - DBUG_ASSERT(!debug_sync_set_action( - thd, - STRING_WITH_LEN( - "now SIGNAL row_executed WAIT_FOR continue_row_execution"))); - }); - if (unlikely(error)) DBUG_PRINT("info", ("error: %s", HA_ERR(error))); DBUG_ASSERT(error != HA_ERR_RECORD_DELETED); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index b18f14d1de3..c110baa9634 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -9560,7 +9560,6 @@ PSI_stage_info stage_waiting_for_work_from_sql_thread= { 0, "Waiting for work fr PSI_stage_info stage_waiting_for_prior_transaction_to_commit= { 0, "Waiting for prior transaction to commit", 0}; PSI_stage_info stage_waiting_for_prior_transaction_to_start_commit= { 0, "Waiting for prior transaction to start commit before starting next transaction", 0}; PSI_stage_info stage_waiting_for_room_in_worker_thread= { 0, "Waiting for room in worker thread event queue", 0}; -PSI_stage_info stage_waiting_for_worker_stop= { 0, "Waiting for worker thread to stop", 0}; PSI_stage_info stage_waiting_for_workers_idle= { 0, "Waiting for worker threads to be idle", 0}; PSI_stage_info stage_waiting_for_ftwrl= { 0, "Waiting due to global read lock", 0}; PSI_stage_info stage_waiting_for_ftwrl_threads_to_pause= { 0, "Waiting for worker threads to pause for global read lock", 0}; diff --git a/sql/mysqld.h b/sql/mysqld.h index 0c80792168e..f521ea23638 100644 --- a/sql/mysqld.h +++ b/sql/mysqld.h @@ -535,7 +535,6 @@ extern PSI_stage_info stage_waiting_for_work_from_sql_thread; extern PSI_stage_info stage_waiting_for_prior_transaction_to_commit; extern PSI_stage_info stage_waiting_for_prior_transaction_to_start_commit; extern PSI_stage_info stage_waiting_for_room_in_worker_thread; -extern PSI_stage_info stage_waiting_for_worker_stop; extern PSI_stage_info stage_waiting_for_workers_idle; extern PSI_stage_info stage_waiting_for_ftwrl; extern PSI_stage_info stage_waiting_for_ftwrl_threads_to_pause; diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 2dce2880218..6ca582e4f21 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -96,7 +96,7 @@ handle_queued_pos_update(THD *thd, rpl_parallel_thread::queued_event *qev) rli= qev->rgi->rli; e= qev->entry_for_queued; if (e->stop_on_error_sub_id < (uint64)ULONGLONG_MAX || - (e->stop_abrupt(rli))) + (e->force_abort && !rli->stop_for_until)) return; mysql_mutex_lock(&rli->data_lock); @@ -173,7 +173,7 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, mark_start_commit() calls can be made and it is safe to de-allocate the GCO. */ - err= wfc->wait_for_prior_commit(thd, true); + err= wfc->wait_for_prior_commit(thd); if (unlikely(err) && !rgi->worker_error) signal_error_to_sql_driver_thread(thd, rgi, err); thd->wait_for_commit_ptr= NULL; @@ -395,14 +395,13 @@ do_gco_wait(rpl_group_info *rgi, group_commit_orderer *gco, } while (wait_count > entry->count_committing_event_groups); } - if (entry->force_abort && wait_count >= entry->stop_count) + if (entry->force_abort && wait_count > entry->stop_count) { /* We are stopping (STOP SLAVE), and this event group is beyond the point where we can safely stop. So return a flag that will cause us to skip, rather than execute, the following events. */ - DBUG_ASSERT(entry->rgi_is_safe_to_terminate(rgi)); return true; } else @@ -462,16 +461,6 @@ do_ftwrl_wait(rpl_group_info *rgi, if (sub_id > entry->largest_started_sub_id) entry->largest_started_sub_id= sub_id; - /* - If this rgi is non-transactional, and the state of our current entry - (incorrectly) views the rgi as safe to terminate, we change our state - to disallow this rgi from stop/rollback in the event of STOP SLAVE. - */ - if (!(rgi->gtid_ev_flags2 & Gtid_log_event::FL_TRANSACTIONAL) && - entry->unsafe_rollback_marker_sub_id.load(std::memory_order_relaxed) < - rgi->gtid_sub_id) - entry->unsafe_rollback_marker_sub_id= sub_id; - DBUG_RETURN(aborted); } @@ -1381,9 +1370,7 @@ handle_rpl_parallel_thread(void *arg) if (!err) #endif { - if (unlikely(thd->check_killed()) || - (entry->stop_abrupt(rgi->rli) && - entry->rgi_is_safe_to_terminate(rgi))) + if (unlikely(thd->check_killed())) { thd->clear_error(); thd->get_stmt_da()->reset_diagnostics_area(); @@ -2352,7 +2339,6 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli) struct rpl_parallel_entry *e; rpl_parallel_thread *rpt; uint32 i, j; - PSI_stage_info old_stage; /* First signal all workers that they must force quit; no more events will @@ -2413,11 +2399,9 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli) if ((rpt= e->rpl_threads[j])) { mysql_mutex_lock(&rpt->LOCK_rpl_thread); - thd->ENTER_COND(&rpt->COND_rpl_thread_stop, &rpt->LOCK_rpl_thread, - &stage_waiting_for_worker_stop, &old_stage); while (rpt->current_owner == &e->rpl_threads[j]) mysql_cond_wait(&rpt->COND_rpl_thread_stop, &rpt->LOCK_rpl_thread); - thd->EXIT_COND(&old_stage); + mysql_mutex_unlock(&rpt->LOCK_rpl_thread); } } } @@ -2517,17 +2501,6 @@ rpl_parallel_entry::queue_master_restart(rpl_group_info *rgi, return 0; } -bool rpl_parallel_entry::stop_abrupt(Relay_log_info *rli) -{ - return force_abort.load(std::memory_order_relaxed) && !rli->stop_for_until; -} - -bool rpl_parallel_entry::rgi_is_safe_to_terminate(rpl_group_info *rgi) -{ - return unsafe_rollback_marker_sub_id.load(std::memory_order_relaxed) < - rgi->gtid_sub_id; -} - int rpl_parallel::wait_for_workers_idle(THD *thd) diff --git a/sql/rpl_parallel.h b/sql/rpl_parallel.h index 9ad9b0b61dd..650aa06e504 100644 --- a/sql/rpl_parallel.h +++ b/sql/rpl_parallel.h @@ -272,7 +272,7 @@ struct rpl_parallel_entry { so worker threads must force abort any current transactions without waiting for event groups to complete. */ - std::atomic force_abort; + bool force_abort; /* At STOP SLAVE (force_abort=true), we do not want to process all events in the queue (which could unnecessarily delay stop, if a lot of events happen @@ -349,34 +349,10 @@ struct rpl_parallel_entry { /* The group_commit_orderer object for the events currently being queued. */ group_commit_orderer *current_gco; - /* - Marks the highest sub id that all transactions up to it must be executed to - allow for a consistent replication state; and all active transactions - afterwards can safely be stopped and rolled back. - */ - std::atomic unsafe_rollback_marker_sub_id; - rpl_parallel_thread * choose_thread(rpl_group_info *rgi, bool *did_enter_cond, PSI_stage_info *old_stage, bool reuse); int queue_master_restart(rpl_group_info *rgi, Format_description_log_event *fdev); - - /* - Check if we are stopping the slave as a direct command from the user, as - opposed to force_abort being set due to the UNTIL clause from START SLAVE. - - Returns 1 if the slave has been explicitly ordered to stop, 0 otherwise. - */ - bool stop_abrupt(Relay_log_info *rli); - - /* - Check if the rgi is safe to stop and rollback in the event of an abrupt - stop of the parallel slave. - - Returns 1 if we can safely terminate and rollback the transaction, 0 - otherwise - */ - bool rgi_is_safe_to_terminate(rpl_group_info *rgi); }; struct rpl_parallel { HASH domain_hash; diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc index 48fd9b1f435..04fddb3e74b 100644 --- a/sql/rpl_rli.cc +++ b/sql/rpl_rli.cc @@ -2188,7 +2188,6 @@ event_group_new_gtid(rpl_group_info *rgi, Gtid_log_event *gev) rgi->current_gtid.server_id= gev->server_id; rgi->current_gtid.seq_no= gev->seq_no; rgi->commit_id= gev->commit_id; - rgi->gtid_ev_flags2= gev->flags2; rgi->gtid_pending= true; return 0; } diff --git a/sql/slave.cc b/sql/slave.cc index 647756482d5..f43240a8866 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3631,8 +3631,6 @@ int has_temporary_error(THD *thd) { uint current_errno; - rpl_group_info *rgi= thd->rgi_slave; - Relay_log_info *rli= rgi->rli; DBUG_ENTER("has_temporary_error"); DBUG_EXECUTE_IF("all_errors_are_temporary_errors", @@ -3650,11 +3648,6 @@ has_temporary_error(THD *thd) if (!likely(thd->is_error())) DBUG_RETURN(0); - if (rgi->rli->mi->using_parallel() && - rgi->parallel_entry->stop_abrupt(rli) && - rgi->parallel_entry->rgi_is_safe_to_terminate(rgi)) - DBUG_RETURN(0); - current_errno= thd->get_stmt_da()->sql_errno(); for (uint i= 0; i < slave_transaction_retry_error_length; i++) { diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 81fcfa272a3..dc58d2a250a 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -7639,7 +7639,7 @@ wait_for_commit::register_wait_for_prior_commit(wait_for_commit *waitee) */ int -wait_for_commit::wait_for_prior_commit2(THD *thd, bool force_wait) +wait_for_commit::wait_for_prior_commit2(THD *thd) { PSI_stage_info old_stage; wait_for_commit *loc_waitee; @@ -7664,24 +7664,9 @@ wait_for_commit::wait_for_prior_commit2(THD *thd, bool force_wait) &stage_waiting_for_prior_transaction_to_commit, &old_stage); while ((loc_waitee= this->waitee.load(std::memory_order_relaxed)) && - (likely(!thd->check_killed(1)) || force_wait)) + likely(!thd->check_killed(1))) mysql_cond_wait(&COND_wait_commit, &LOCK_wait_commit); - if (!loc_waitee -#ifndef EMBEDDED_LIBRARY - /* - If a worker has been killed prior to this wait, e.g. in do_gco_wait(), - then it should not perform thread cleanup if there are threads which - have yet to commit. This is to prevent the cleanup of resources that - the prior RGI may need, e.g. its GCO. This is achieved by skipping - the unregistration of the waitee, such that each subsequent call to - wait_for_prior_commit() will exit early (while maintaining the - dependence), thus allowing the final call to - thd->wait_for_prior_commit() within finish_event_group() to wait. - */ - || (thd->rgi_slave && (thd->rgi_slave->worker_error && - !thd->rgi_slave->did_mark_start_commit)) -#endif - ) + if (!loc_waitee) { if (wakeup_error) my_error(ER_PRIOR_COMMIT_FAILED, MYF(0)); diff --git a/sql/sql_class.h b/sql/sql_class.h index e177fc55d9d..4e5aba33443 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2144,14 +2144,14 @@ struct wait_for_commit bool commit_started; void register_wait_for_prior_commit(wait_for_commit *waitee); - int wait_for_prior_commit(THD *thd, bool force_wait= false) + int wait_for_prior_commit(THD *thd) { /* Quick inline check, to avoid function call and locking in the common case where no wakeup is registered, or a registered wait was already signalled. */ if (waitee.load(std::memory_order_acquire)) - return wait_for_prior_commit2(thd, force_wait); + return wait_for_prior_commit2(thd); else { if (wakeup_error) @@ -2205,7 +2205,7 @@ struct wait_for_commit void wakeup(int wakeup_error); - int wait_for_prior_commit2(THD *thd, bool force_wait= false); + int wait_for_prior_commit2(THD *thd); void wakeup_subsequent_commits2(int wakeup_error); void unregister_wait_for_prior_commit2(); From 7e17a88e75ea4a818fab7a706ac6415106dc56d1 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Thu, 25 May 2023 12:52:38 +1000 Subject: [PATCH 056/171] MDEV-30435 MDEV-30981 Fix ubsan errors w.r.t. memcpy in spd_trx.cc Extract the indexed string memcopy pattern in spd_trx.cc to a static inline function. Also updated the ubsan check in mdev_26541.test (h/t roel). --- .../spider/bugfix/r/mdev_30981.result | 12 ++ .../spider/bugfix/t/mdev_26541.test | 2 +- .../spider/bugfix/t/mdev_30981.test | 24 +++ storage/spider/spd_trx.cc | 193 +++++++----------- 4 files changed, 106 insertions(+), 125 deletions(-) create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_30981.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_30981.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_30981.result new file mode 100644 index 00000000000..6db36e2b46c --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_30981.result @@ -0,0 +1,12 @@ +# +# MDEV-30981 Spider UBSAN: null pointer passed as argument 2, which is declared to never be null in spider_create_trx_alter_table on ALTER +# +for master_1 +for child2 +for child3 +CREATE TABLE t (c INT) ENGINE=Spider PARTITION BY LIST (c) (PARTITION p VALUES IN (1,2)); +ALTER TABLE t ENGINE=InnoDB; +drop table t; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test index ffd99390748..b32e1630494 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test @@ -2,7 +2,7 @@ --echo # MDEV-26541 Undefined symbol: _ZTI12ha_partition when attempting to use ha_spider.so in UBSAN builds --echo # -if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value="UBSAN"`) +if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%UBSAN%"`) { --skip test needs to be run with UBSAN } diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test new file mode 100644 index 00000000000..cc24ce82ce4 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test @@ -0,0 +1,24 @@ +--echo # +--echo # MDEV-30981 Spider UBSAN: null pointer passed as argument 2, which is declared to never be null in spider_create_trx_alter_table on ALTER +--echo # + +if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%UBSAN%"`) +{ +--skip test needs to be run with UBSAN +} + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +CREATE TABLE t (c INT) ENGINE=Spider PARTITION BY LIST (c) (PARTITION p VALUES IN (1,2)); +ALTER TABLE t ENGINE=InnoDB; +drop table t; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc index b0b1e9c36bd..d64393fb445 100644 --- a/storage/spider/spd_trx.cc +++ b/storage/spider/spd_trx.cc @@ -482,12 +482,28 @@ int spider_free_trx_alter_table( DBUG_RETURN(0); } +/** Copy a string from one array to another */ +static inline void spider_maybe_memcpy_indexed_string( + char **dests, + char **srcs, + const uint* lengths, + const int idx, + char *&ptr) +{ + if (size_t len= sizeof(char) * lengths[idx]) + { + dests[idx]= ptr; + memcpy(ptr, srcs[idx], len); + ptr+= len + 1; + } +} + int spider_create_trx_alter_table( SPIDER_TRX *trx, SPIDER_SHARE *share, bool now_create ) { - int error_num, roop_count; + int error_num, link_idx; SPIDER_ALTER_TABLE *alter_table, *share_alter; char *tmp_name; char **tmp_server_names; @@ -682,145 +698,74 @@ int spider_create_trx_alter_table( alter_table->tmp_tgt_default_groups_lengths = tmp_tgt_default_groups_lengths; alter_table->tmp_static_link_ids_lengths = tmp_static_link_ids_lengths; - size_t len; - for(roop_count = 0; roop_count < (int) share->all_link_count; roop_count++) + for(link_idx = 0; link_idx < (int) share->all_link_count; link_idx++) { - if ((len= - sizeof(char) * share_alter->tmp_server_names_lengths[roop_count])) - { - tmp_server_names[roop_count]= tmp_server_names_char; - memcpy(tmp_server_names_char, share_alter->tmp_server_names[roop_count], - len); - tmp_server_names_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_server_names, share_alter->tmp_server_names, + share_alter->tmp_server_names_lengths, link_idx, tmp_server_names_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_table_names_lengths[roop_count])) - { - tmp_tgt_table_names[roop_count]= tmp_tgt_table_names_char; - memcpy(tmp_tgt_table_names_char, - share_alter->tmp_tgt_table_names[roop_count], len); - tmp_tgt_table_names_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_table_names, share_alter->tmp_tgt_table_names, + share_alter->tmp_tgt_table_names_lengths, link_idx, tmp_tgt_table_names_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_dbs_lengths[roop_count])) - { - tmp_tgt_dbs[roop_count]= tmp_tgt_dbs_char; - memcpy(tmp_tgt_dbs_char, share_alter->tmp_tgt_dbs[roop_count], len); - tmp_tgt_dbs_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_dbs, share_alter->tmp_tgt_dbs, + share_alter->tmp_tgt_dbs_lengths, link_idx, tmp_tgt_dbs_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_hosts_lengths[roop_count])) - { - tmp_tgt_hosts[roop_count]= tmp_tgt_hosts_char; - memcpy(tmp_tgt_hosts_char, share_alter->tmp_tgt_hosts[roop_count], len); - tmp_tgt_hosts_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_hosts, share_alter->tmp_tgt_hosts, + share_alter->tmp_tgt_hosts_lengths, link_idx, tmp_tgt_hosts_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_usernames_lengths[roop_count])) - { - tmp_tgt_usernames[roop_count]= tmp_tgt_usernames_char; - memcpy(tmp_tgt_usernames_char, - share_alter->tmp_tgt_usernames[roop_count], len); - tmp_tgt_usernames_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_usernames, share_alter->tmp_tgt_usernames, + share_alter->tmp_tgt_usernames_lengths, link_idx, tmp_tgt_usernames_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_passwords_lengths[roop_count])) - { - tmp_tgt_passwords[roop_count]= tmp_tgt_passwords_char; - memcpy(tmp_tgt_passwords_char, - share_alter->tmp_tgt_passwords[roop_count], len); - tmp_tgt_passwords_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_passwords, share_alter->tmp_tgt_passwords, + share_alter->tmp_tgt_passwords_lengths, link_idx, tmp_tgt_passwords_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_sockets_lengths[roop_count])) - { - tmp_tgt_sockets[roop_count]= tmp_tgt_sockets_char; - memcpy(tmp_tgt_sockets_char, share_alter->tmp_tgt_sockets[roop_count], - len); - tmp_tgt_sockets_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_sockets, share_alter->tmp_tgt_sockets, + share_alter->tmp_tgt_sockets_lengths, link_idx, tmp_tgt_sockets_char); - if ((len= - sizeof(char) * share_alter->tmp_tgt_wrappers_lengths[roop_count])) - { - tmp_tgt_wrappers[roop_count]= tmp_tgt_wrappers_char; - memcpy(tmp_tgt_wrappers_char, share_alter->tmp_tgt_wrappers[roop_count], - len); - tmp_tgt_wrappers_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_wrappers, share_alter->tmp_tgt_wrappers, + share_alter->tmp_tgt_wrappers_lengths, link_idx, tmp_tgt_wrappers_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_ssl_cas_lengths[roop_count])) - { - tmp_tgt_ssl_cas[roop_count]= tmp_tgt_ssl_cas_char; - memcpy(tmp_tgt_ssl_cas_char, share_alter->tmp_tgt_ssl_cas[roop_count], - len); - tmp_tgt_ssl_cas_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_cas, share_alter->tmp_tgt_ssl_cas, + share_alter->tmp_tgt_ssl_cas_lengths, link_idx, tmp_tgt_ssl_cas_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_ssl_capaths_lengths[roop_count])) - { - tmp_tgt_ssl_capaths[roop_count]= tmp_tgt_ssl_capaths_char; - memcpy(tmp_tgt_ssl_capaths_char, - share_alter->tmp_tgt_ssl_capaths[roop_count], len); - tmp_tgt_ssl_capaths_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_capaths, share_alter->tmp_tgt_ssl_capaths, + share_alter->tmp_tgt_ssl_capaths_lengths, link_idx, tmp_tgt_ssl_capaths_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_ssl_certs_lengths[roop_count])) - { - tmp_tgt_ssl_certs[roop_count]= tmp_tgt_ssl_certs_char; - memcpy(tmp_tgt_ssl_certs_char, - share_alter->tmp_tgt_ssl_certs[roop_count], len); - tmp_tgt_ssl_certs_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_certs, share_alter->tmp_tgt_ssl_certs, + share_alter->tmp_tgt_ssl_certs_lengths, link_idx, tmp_tgt_ssl_certs_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_ssl_ciphers_lengths[roop_count])) - { - tmp_tgt_ssl_ciphers[roop_count]= tmp_tgt_ssl_ciphers_char; - memcpy(tmp_tgt_ssl_ciphers_char, - share_alter->tmp_tgt_ssl_ciphers[roop_count], len); - tmp_tgt_ssl_ciphers_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_ciphers, share_alter->tmp_tgt_ssl_ciphers, + share_alter->tmp_tgt_ssl_ciphers_lengths, link_idx, tmp_tgt_ssl_ciphers_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_ssl_keys_lengths[roop_count])) - { - tmp_tgt_ssl_keys[roop_count]= tmp_tgt_ssl_keys_char; - memcpy(tmp_tgt_ssl_keys_char, share_alter->tmp_tgt_ssl_keys[roop_count], - len); - tmp_tgt_ssl_keys_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_keys, share_alter->tmp_tgt_ssl_keys, + share_alter->tmp_tgt_ssl_keys_lengths, link_idx, tmp_tgt_ssl_keys_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_default_files_lengths[roop_count])) - { - tmp_tgt_default_files[roop_count]= tmp_tgt_default_files_char; - memcpy(tmp_tgt_default_files_char, - share_alter->tmp_tgt_default_files[roop_count], len); - tmp_tgt_default_files_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_default_files, share_alter->tmp_tgt_default_files, + share_alter->tmp_tgt_default_files_lengths, link_idx, tmp_tgt_default_files_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_default_groups_lengths[roop_count])) - { - tmp_tgt_default_groups[roop_count]= tmp_tgt_default_groups_char; - memcpy(tmp_tgt_default_groups_char, - share_alter->tmp_tgt_default_groups[roop_count], len); - tmp_tgt_default_groups_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_default_groups, share_alter->tmp_tgt_default_groups, + share_alter->tmp_tgt_default_groups_lengths, link_idx, tmp_tgt_default_groups_char); - if ((len= sizeof(char) * - share_alter->tmp_static_link_ids_lengths[roop_count])) - { - tmp_static_link_ids[roop_count] = tmp_static_link_ids_char; - memcpy(tmp_static_link_ids_char, - share_alter->tmp_static_link_ids[roop_count], len); - tmp_static_link_ids_char += len + 1; - } + /* Notes on merge conflicts (remove this comment after merging): + for 10.5 see 3b2d1d135155fe3adf1bc28f8b0be1ecc2ea4f40 + for 10.6+ see d74103292c7be236f3da71c86249d37295f57bbc */ + spider_maybe_memcpy_indexed_string( + tmp_static_link_ids, share_alter->tmp_static_link_ids, + share_alter->tmp_static_link_ids_lengths, link_idx, tmp_static_link_ids_char); } memcpy(tmp_tgt_ports, share_alter->tmp_tgt_ports, From 78a1f3ce81162cb25d78f4667b36adc30eed898b Mon Sep 17 00:00:00 2001 From: Daniel Bartholomew Date: Wed, 7 Jun 2023 08:09:02 -0400 Subject: [PATCH 057/171] bump the VERSION --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 91b253ca00c..8c23df65833 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=4 -MYSQL_VERSION_PATCH=30 +MYSQL_VERSION_PATCH=31 SERVER_MATURITY=stable From 2165c30486da10b6e889acc127ee87ee2d888626 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Thu, 8 Jun 2023 11:35:21 +0300 Subject: [PATCH 058/171] Fix testcase for MDEV-31240 to work with --view-protocol. --- mysql-test/main/derived_cond_pushdown.result | 22 ++++++-------------- mysql-test/main/derived_cond_pushdown.test | 2 +- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/mysql-test/main/derived_cond_pushdown.result b/mysql-test/main/derived_cond_pushdown.result index a4fc7a7447d..1e23b1aa3a9 100644 --- a/mysql-test/main/derived_cond_pushdown.result +++ b/mysql-test/main/derived_cond_pushdown.result @@ -18384,7 +18384,7 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as SUBQ from t1 limit 5; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 @@ -18398,14 +18398,9 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as SUBQ from t1 limit 5; -a ( select concat(t3.a,'=',dt.s) -from -(select a, sum(b) as s from t2 group by a) as dt, -t3 -where dt.a=t1.a and t3.a < 3 -) +a SUBQ 1 1=804 2 1=1056 3 1=846 @@ -18424,7 +18419,7 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as SUBQ from t1 limit 5; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 @@ -18438,14 +18433,9 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as SUBQ from t1 limit 5; -a ( select concat(t3.a,'=',dt.s) -from -(select a, sum(b) as s from t2 group by a) as dt, -t3 -where dt.a=t1.a and t3.a < 3 -) +a SUBQ 1 1=11858 2 1=11380 3 1=11588 diff --git a/mysql-test/main/derived_cond_pushdown.test b/mysql-test/main/derived_cond_pushdown.test index 7a4d9b4ad7d..fa22ba9513b 100644 --- a/mysql-test/main/derived_cond_pushdown.test +++ b/mysql-test/main/derived_cond_pushdown.test @@ -3997,7 +3997,7 @@ select (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 - ) + ) as SUBQ from t1 limit 5; eval explain $q; From f5dceafd0ba211405e04be4c778d69e8a7533d8d Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Wed, 29 Mar 2023 19:42:21 +0300 Subject: [PATCH 059/171] MDEV-30964: MAX_SEL_ARG memory exhaustion is not visible in the optimizer trace Add printing --- mysql-test/main/opt_trace.result | 41 ++++++++++++++++++++++++++++++++ mysql-test/main/opt_trace.test | 33 +++++++++++++++++++++++++ sql/opt_range.cc | 7 ++++++ 3 files changed, 81 insertions(+) diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result index 7856f9248ba..fc29d128bd4 100644 --- a/mysql-test/main/opt_trace.result +++ b/mysql-test/main/opt_trace.result @@ -8515,6 +8515,47 @@ SELECT a FROM t1 WHERE (a,b) in (SELECT @c,@d); a DROP TABLE t1; # +# MDEV-30964: MAX_SEL_ARG memory exhaustion is not visible in the optimizer trace +# +create table t1 ( +c1 int, +c2 int, +c3 int, +c4 int, +c5 int, +c6 int, +c7 int, +c8 int, +key(c1,c2,c3,c4,c5,c6,c7,c8) +); +insert into t1 () values (),(),(); +explain select * +from t1 +where +(c1 in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) and c2=1) and +c3 in (1,2,3,4,5,6,7,8,9,10) and +c4 in (1,2,3,4,5,6,7,8,9,10) and +c5 in (1,2,3,4,5,6,7,8,9,10) and +c6 in (1,2,3,4); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 40 NULL 3 Using where; Using index +select +json_detailed(json_extract(trace, '$**.setup_range_conditions')) +from +information_schema.optimizer_trace; +json_detailed(json_extract(trace, '$**.setup_range_conditions')) +[ + [ + { + "sel_arg_alloc_limit_hit": + { + "alloced_sel_args": 16001 + } + } + ] +] +drop table t1; +# # MDEV-31085: multi-update using view with optimizer trace enabled # SET SESSION optimizer_trace = 'enabled=on'; diff --git a/mysql-test/main/opt_trace.test b/mysql-test/main/opt_trace.test index 5f73e076fec..52b3bee0fe4 100644 --- a/mysql-test/main/opt_trace.test +++ b/mysql-test/main/opt_trace.test @@ -677,6 +677,39 @@ INSERT INTO t1 VALUES (0,0); SELECT a FROM t1 WHERE (a,b) in (SELECT @c,@d); DROP TABLE t1; + +--echo # +--echo # MDEV-30964: MAX_SEL_ARG memory exhaustion is not visible in the optimizer trace +--echo # +create table t1 ( + c1 int, + c2 int, + c3 int, + c4 int, + c5 int, + c6 int, + c7 int, + c8 int, + key(c1,c2,c3,c4,c5,c6,c7,c8) +); +insert into t1 () values (),(),(); + +explain select * +from t1 +where + (c1 in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) and c2=1) and + c3 in (1,2,3,4,5,6,7,8,9,10) and + c4 in (1,2,3,4,5,6,7,8,9,10) and + c5 in (1,2,3,4,5,6,7,8,9,10) and + c6 in (1,2,3,4); + +select + json_detailed(json_extract(trace, '$**.setup_range_conditions')) +from + information_schema.optimizer_trace; + +drop table t1; + --echo # --echo # MDEV-31085: multi-update using view with optimizer trace enabled --echo # diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 69a95f8da44..6ada4675ae6 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -2853,6 +2853,13 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, Json_writer_array trace_range_summary(thd, "setup_range_conditions"); tree= cond->get_mm_tree(¶m, &cond); + if (thd->trace_started() && + param.alloced_sel_args >= SEL_ARG::MAX_SEL_ARGS) + { + Json_writer_object wrapper(thd); + Json_writer_object obj(thd, "sel_arg_alloc_limit_hit"); + obj.add("alloced_sel_args", param.alloced_sel_args); + } } if (tree) { From d32fc5b8e073bf5b4ec5c68875477ae6c8ca8721 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 12 Jun 2023 22:16:49 +0200 Subject: [PATCH 060/171] MDEV-31461 mariadb SIGSEGV when built with -DCLIENT_PLUGIN_DIALOG=STATIC --- client/mysql.cc | 4 ++-- client/mysql_upgrade.c | 2 +- client/mysqladmin.cc | 6 +++--- client/mysqlbinlog.cc | 2 +- client/mysqlcheck.c | 2 +- client/mysqldump.c | 2 +- client/mysqlimport.c | 2 +- client/mysqlshow.c | 2 +- client/mysqlslap.c | 2 +- client/mysqltest.cc | 2 +- include/my_sys.h | 2 +- libmysqld/libmysqld.c | 4 ++++ mysys/get_password.c | 8 ++++---- tests/async_queries.c | 2 +- tests/mysql_client_fw.c | 2 +- tests/thread_test.c | 2 +- 16 files changed, 25 insertions(+), 21 deletions(-) diff --git a/client/mysql.cc b/client/mysql.cc index b1042d1be00..214b0d51a32 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1958,7 +1958,7 @@ static int get_options(int argc, char **argv) current_db= my_strdup(*argv, MYF(MY_WME)); } if (tty_password) - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); if (debug_info_flag) my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO; if (debug_check_flag) @@ -4659,7 +4659,7 @@ char *mysql_authentication_dialog_ask(MYSQL *mysql, int type, if (type == 2) /* password */ { - s= get_tty_password(""); + s= my_get_tty_password(""); strnmov(buf, s, buf_len); buf[buf_len-1]= 0; my_free(s); diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index 78297320b6e..ea18c1c5ba7 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -1350,7 +1350,7 @@ int main(int argc, char **argv) if (tty_password) { - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); /* add password to defaults file */ add_one_option_cnf_file(&ds_args, "password", opt_password); } diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc index fadefaed449..0b31ca3a5ce 100644 --- a/client/mysqladmin.cc +++ b/client/mysqladmin.cc @@ -339,7 +339,7 @@ int main(int argc,char *argv[]) } commands = temp_argv; if (tty_password) - opt_password = get_tty_password(NullS); + opt_password = my_get_tty_password(NullS); (void) signal(SIGINT,endprog); /* Here if abort */ (void) signal(SIGTERM,endprog); /* Here if abort */ @@ -1128,8 +1128,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) else if (argc == 1) { /* prompt for password */ - typed_password= get_tty_password("New password: "); - verified= get_tty_password("Confirm new password: "); + typed_password= my_get_tty_password("New password: "); + verified= my_get_tty_password("Confirm new password: "); if (strcmp(typed_password, verified) != 0) { my_printf_error(0,"Passwords don't match",MYF(ME_BELL)); diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index ec0cae5328c..269ed6a1f00 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -2095,7 +2095,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; } if (tty_password) - pass= get_tty_password(NullS); + pass= my_get_tty_password(NullS); return 0; } diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index b32e21ff18f..9c0fa3e9f4e 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -458,7 +458,7 @@ static int get_options(int *argc, char ***argv) DBUG_RETURN(1); } if (tty_password) - opt_password = get_tty_password(NullS); + opt_password = my_get_tty_password(NullS); if (debug_info_flag) my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO; if (debug_check_flag) diff --git a/client/mysqldump.c b/client/mysqldump.c index cf943918084..a961071bf79 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -1233,7 +1233,7 @@ static int get_options(int *argc, char ***argv) return EX_USAGE; } if (tty_password) - opt_password=get_tty_password(NullS); + opt_password=my_get_tty_password(NullS); return(0); } /* get_options */ diff --git a/client/mysqlimport.c b/client/mysqlimport.c index ac0ad793c3f..ff77b6cc555 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -299,7 +299,7 @@ static int get_options(int *argc, char ***argv) current_db= *((*argv)++); (*argc)--; if (tty_password) - opt_password=get_tty_password(NullS); + opt_password=my_get_tty_password(NullS); return(0); } diff --git a/client/mysqlshow.c b/client/mysqlshow.c index 0a59f6ac54f..93bdc5cb7e3 100644 --- a/client/mysqlshow.c +++ b/client/mysqlshow.c @@ -352,7 +352,7 @@ get_options(int *argc,char ***argv) exit(ho_error); if (tty_password) - opt_password=get_tty_password(NullS); + opt_password=my_get_tty_password(NullS); if (opt_count) { /* diff --git a/client/mysqlslap.c b/client/mysqlslap.c index 78e9b6aa646..60499411ebf 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -1523,7 +1523,7 @@ get_options(int *argc,char ***argv) } if (tty_password) - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); DBUG_RETURN(0); } diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 219b5532a70..6558436bbca 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -7293,7 +7293,7 @@ int parse_args(int argc, char **argv) if (argc == 1) opt_db= *argv; if (tty_password) - opt_pass= get_tty_password(NullS); /* purify tested */ + opt_pass= my_get_tty_password(NullS); /* purify tested */ if (debug_info_flag) my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO; if (debug_check_flag) diff --git a/include/my_sys.h b/include/my_sys.h index 87df04c6087..017968ab6ce 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -1058,7 +1058,7 @@ extern void add_compiled_collation(struct charset_info_st *cs); extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, size_t to_length, const char *from, size_t length); -extern char *get_tty_password(const char *opt_message); +extern char *my_get_tty_password(const char *opt_message); #ifdef __WIN__ #define BACKSLASH_MBTAIL /* File system character set */ diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 6de86927a38..1c7ab651a7e 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -226,3 +226,7 @@ error: DBUG_RETURN(0); } +char *get_tty_password(const char *opt_message) +{ + return my_get_tty_password(opt_message); +} diff --git a/mysys/get_password.c b/mysys/get_password.c index e20800f4213..1d60ec3d2d6 100644 --- a/mysys/get_password.c +++ b/mysys/get_password.c @@ -60,11 +60,11 @@ /* were just going to fake it here and get input from the keyboard */ -char *get_tty_password(const char *opt_message) +char *my_get_tty_password(const char *opt_message) { char to[80]; char *pos=to,*end=to+sizeof(to)-1; - DBUG_ENTER("get_tty_password"); + DBUG_ENTER("my_get_tty_password"); _cputs(opt_message ? opt_message : "Enter password: "); for (;;) { @@ -145,7 +145,7 @@ static void get_password(char *to,uint length,int fd, my_bool echo) #endif /* ! HAVE_GETPASS */ -char *get_tty_password(const char *opt_message) +char *my_get_tty_password(const char *opt_message) { #ifdef HAVE_GETPASS char *passbuff; @@ -154,7 +154,7 @@ char *get_tty_password(const char *opt_message) #endif /* HAVE_GETPASS */ char buff[80]; - DBUG_ENTER("get_tty_password"); + DBUG_ENTER("my_get_tty_password"); #ifdef HAVE_GETPASS passbuff = getpass(opt_message ? opt_message : "Enter password: "); diff --git a/tests/async_queries.c b/tests/async_queries.c index a8889fc8d5a..d11a9ccfbbf 100644 --- a/tests/async_queries.c +++ b/tests/async_queries.c @@ -371,7 +371,7 @@ main(int argc, char *argv[]) if (err) exit(err); if (tty_password) - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); if (opt_query_file) { diff --git a/tests/mysql_client_fw.c b/tests/mysql_client_fw.c index e8d628e7b52..75425aa98e4 100644 --- a/tests/mysql_client_fw.c +++ b/tests/mysql_client_fw.c @@ -1362,7 +1362,7 @@ static void get_options(int *argc, char ***argv) exit(ho_error); if (tty_password) - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); return; } diff --git a/tests/thread_test.c b/tests/thread_test.c index 0fa92d505a3..d0c33b47b9c 100644 --- a/tests/thread_test.c +++ b/tests/thread_test.c @@ -174,7 +174,7 @@ static void get_options(int argc, char **argv) free_defaults(argv); if (tty_password) - password=get_tty_password(NullS); + password=my_get_tty_password(NullS); return; } From 1f72450260ed345dc5a0abec2870399acac61d41 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 22 Jun 2023 15:24:09 +0200 Subject: [PATCH 061/171] Revert "MDEV-23925: Fixed warnings generated during compilation of mysys_ssl/openssl.c on MacOS" This reverts commit a1b6691f93e50ad4a8a53dbf89ba578d6a64b2cb. because #ifdef checks the symbol defined in ssl_compat.h, so #include cannot be inside #ifdef --- mysys_ssl/openssl.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mysys_ssl/openssl.c b/mysys_ssl/openssl.c index b38d4ba309c..e0f3d646ca9 100644 --- a/mysys_ssl/openssl.c +++ b/mysys_ssl/openssl.c @@ -15,6 +15,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include +#include /* The check is only done for OpenSSL 1.1.x. @@ -24,14 +25,12 @@ */ #ifndef HAVE_OPENSSL11 -#include int check_openssl_compatibility() { return 0; } #else #include -#include static uint testing; size_t alloc_size, alloc_count; From 9c0e91a27cc58d1b5076435e125c70cd277fd989 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 22 Jun 2023 15:26:23 +0200 Subject: [PATCH 062/171] Adjust OpenSSL context sizes for CiscoSSL also, add static --- include/ssl_compat.h | 4 ++-- mysys_ssl/openssl.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/ssl_compat.h b/include/ssl_compat.h index 9541a68cbdc..7b4a828a4d9 100644 --- a/include/ssl_compat.h +++ b/include/ssl_compat.h @@ -24,8 +24,8 @@ #define HAVE_OPENSSL11 1 #define SSL_LIBRARY OpenSSL_version(OPENSSL_VERSION) #define ERR_remove_state(X) ERR_clear_error() -#define EVP_CIPHER_CTX_SIZE 176 -#define EVP_MD_CTX_SIZE 48 +#define EVP_CIPHER_CTX_SIZE 200 +#define EVP_MD_CTX_SIZE 80 #undef EVP_MD_CTX_init #define EVP_MD_CTX_init(X) do { memset((X), 0, EVP_MD_CTX_SIZE); EVP_MD_CTX_reset(X); } while(0) #undef EVP_CIPHER_CTX_init diff --git a/mysys_ssl/openssl.c b/mysys_ssl/openssl.c index e0f3d646ca9..340ba34ba78 100644 --- a/mysys_ssl/openssl.c +++ b/mysys_ssl/openssl.c @@ -33,7 +33,7 @@ int check_openssl_compatibility() #include static uint testing; -size_t alloc_size, alloc_count; +static size_t alloc_size, alloc_count; static void *coc_malloc(size_t size, const char *f __attribute__((unused)), int l __attribute__((unused))) From b37357eb4613b20ad00dad49184739fc113a8206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 26 Jun 2023 11:03:15 +0300 Subject: [PATCH 063/171] Fix GCC 13 -Wmaybe-uninitialized --- libmariadb | 2 +- sql/item_xmlfunc.cc | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/libmariadb b/libmariadb index a3bba4639f5..d543bed61ba 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit a3bba4639f55148c59a28a506df8a2b88e5e83ab +Subproject commit d543bed61ba9a117e95764dd1429b21c3e0579d1 diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc index 28bddb75df2..cdaa8177cb1 100644 --- a/sql/item_xmlfunc.cc +++ b/sql/item_xmlfunc.cc @@ -2638,19 +2638,21 @@ static int my_xpath_parse_VariableReference(MY_XPATH *xpath) { LEX_CSTRING name; - int user_var; - const char *dollar_pos; THD *thd= xpath->thd; - if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_DOLLAR) || - (!(dollar_pos= xpath->prevtok.beg)) || - (!((user_var= my_xpath_parse_term(xpath, MY_XPATH_LEX_AT) && + if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_DOLLAR)) + return 0; + const char *dollar_pos= xpath->prevtok.beg; + if (!dollar_pos) + return 0; + int user_var= my_xpath_parse_term(xpath, MY_XPATH_LEX_AT); + if (!((user_var && my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT))) && - !my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT))) + !my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT)) return 0; name.length= xpath->prevtok.end - xpath->prevtok.beg; name.str= (char*) xpath->prevtok.beg; - + if (user_var) xpath->item= new (thd->mem_root) Item_func_get_user_var(thd, &name); else From 423c28f0aa47df796ac4eda5a2288b9fd12d5d31 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Tue, 3 Jan 2023 16:24:04 +1100 Subject: [PATCH 064/171] MDEV-29447 MDEV-26285 MDEV-31338 Refactor spider_db_mbase_util::open_item_func spider_db_mbase_util::open_item_func() is a monster function. It is difficult to maintain while it is expected that we need to modify it when a new SQL function or a new func_type is added. We split the function into two distinct functions: one handles the case of str != NULL and the other handles the case of str == NULL. This refactoring was done in a conservative way because we do not have comprehensive tests on the function. It also fixes MDEV-29447 and MDEV-31338 where field items that are arguments of a func item may be used before created / initialised. Note this commit is adapted from a patch by Nayuta for MDEV-26285. --- .../spider/bugfix/r/mdev_29447.result | 33 + .../spider/bugfix/r/mdev_31338.result | 15 + .../mysql-test/spider/bugfix/t/mdev_29447.cnf | 3 + .../spider/bugfix/t/mdev_29447.test | 37 + .../spider/bugfix/t/mdev_31338.test | 22 + storage/spider/spd_db_mysql.cc | 1078 ++++++++--------- storage/spider/spd_db_mysql.h | 19 + 7 files changed, 645 insertions(+), 562 deletions(-) create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_29447.result create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_29447.cnf create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_29447.test create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29447.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29447.result new file mode 100644 index 00000000000..358e131fcf2 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29447.result @@ -0,0 +1,33 @@ +# +# MDEV-29447 SIGSEGV in spider_db_open_item_field and SIGSEGV spider_db_print_item_type, on SELECT +# +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +CREATE TABLE tbl_a ( +a INT +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +CREATE TABLE tbl_a ( +a INT +) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"'; +SELECT TRIM(LEADING 'c' FROM a) FROM tbl_a; +TRIM(LEADING 'c' FROM a) +connection child2_1; +DROP DATABASE auto_test_remote; +connection master_1; +DROP DATABASE auto_test_local; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result new file mode 100644 index 00000000000..dd951933fff --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result @@ -0,0 +1,15 @@ +# +# MDEV-31338 UBSAN: runtime error: member access within null pointer of type 'struct SPIDER_FIELD_CHAIN' and SIGSEGV in spider_db_open_item_ident on SELECT +# +for master_1 +for child2 +for child3 +CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c BLOB) ENGINE=InnoDB; +CREATE TABLE ts (c BLOB) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +SELECT TRIM(BOTH ' ' FROM c) FROM ts ORDER BY c; +TRIM(BOTH ' ' FROM c) +drop table t, ts; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.test new file mode 100644 index 00000000000..60250be6481 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.test @@ -0,0 +1,37 @@ +--echo # +--echo # MDEV-29447 SIGSEGV in spider_db_open_item_field and SIGSEGV spider_db_print_item_type, on SELECT +--echo # + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--connection child2_1 +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +eval CREATE TABLE tbl_a ( + a INT +) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; + +--connection master_1 +CREATE DATABASE auto_test_local; +USE auto_test_local; +eval CREATE TABLE tbl_a ( + a INT +) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"'; + +SELECT TRIM(LEADING 'c' FROM a) FROM tbl_a; + +--connection child2_1 +DROP DATABASE auto_test_remote; + +--connection master_1 +DROP DATABASE auto_test_local; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test new file mode 100644 index 00000000000..95ca7c1253c --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test @@ -0,0 +1,22 @@ +--echo # +--echo # MDEV-31338 UBSAN: runtime error: member access within null pointer of type 'struct SPIDER_FIELD_CHAIN' and SIGSEGV in spider_db_open_item_ident on SELECT +--echo # +--source include/have_innodb.inc + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c BLOB) ENGINE=InnoDB; +CREATE TABLE ts (c BLOB) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +SELECT TRIM(BOTH ' ' FROM c) FROM ts ORDER BY c; +drop table t, ts; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index a51c1497b02..e2f31b537e9 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -5501,6 +5501,13 @@ int spider_db_mbase_util::append_unlock_table( DBUG_RETURN(0); } +/** + The function check if the given item_func and its arguments can be pushed + down to a data node. If so and str != NULL, the function also print, to str, + the string corresponding to the item_func. + + @return 0: success, otherwise: error + */ int spider_db_mbase_util::open_item_func( Item_func *item_func, ha_spider *spider, @@ -5509,6 +5516,174 @@ int spider_db_mbase_util::open_item_func( uint alias_length, bool use_fields, spider_fields *fields +) { + DBUG_ENTER("spider_db_mbase_util::open_item_func"); + + int error = check_item_func(item_func, spider, alias, + alias_length, use_fields, fields); + if (error) + DBUG_RETURN(error); + if (!str) + DBUG_RETURN(0); + + DBUG_RETURN(print_item_func(item_func, spider, str, alias, + alias_length, use_fields, fields)); +} + +static bool item_func_is_timestampdiff( + const char *func_name, + int func_name_length +) { + return func_name_length == 13 && + !strncasecmp("timestampdiff", func_name, func_name_length); +} + +static bool not_func_should_be_skipped( + Item_func *item_func +){ + DBUG_ENTER("not_func_should_be_skipped"); + DBUG_ASSERT(item_func->functype() == Item_func::NOT_FUNC); + Item **item_list = item_func->arguments(); + + if (item_list[0]->type() == Item::COND_ITEM) + { + DBUG_PRINT("info",("spider item_list[0] is COND_ITEM")); + Item_cond *item_cond = (Item_cond *) item_list[0]; + if (item_cond->functype() == Item_func::COND_AND_FUNC) + { + DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC")); + List_iterator_fast lif(*(item_cond->argument_list())); + bool has_expr_cache_item = FALSE; + bool has_isnotnull_func = FALSE; + bool has_other_item = FALSE; + while(Item *item = lif++) + { + if ( + item->type() == Item::EXPR_CACHE_ITEM + ) { + DBUG_PRINT("info",("spider EXPR_CACHE_ITEM")); + has_expr_cache_item = TRUE; + } else + if ( + item->type() == Item::FUNC_ITEM && + ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC + ) { + DBUG_PRINT("info",("spider ISNOTNULL_FUNC")); + has_isnotnull_func = TRUE; + } else { + DBUG_PRINT("info",("spider has other item")); + DBUG_PRINT("info",("spider COND type=%d", item->type())); + has_other_item = TRUE; + } + } + if (has_expr_cache_item && has_isnotnull_func && !has_other_item) + { + DBUG_PRINT("info",("spider NOT EXISTS skip")); + DBUG_RETURN(TRUE); + } + } + } + DBUG_RETURN(FALSE); +} + +/** + Check if the given item_func and its arguments can be pushed down to + a data node. This function is recursive because we need to also check + the arguments of the item_func. + + @return 0: success, otherwise: error + */ +int spider_db_mbase_util::check_item_func( + Item_func *item_func, + ha_spider *spider, + const char *alias, + uint alias_length, + bool use_fields, + spider_fields *fields +) { + int use_pushdown_udf; + DBUG_ENTER("spider_db_mbase_util::check_item_func"); + + Item_func::Functype func_type = item_func->functype(); + DBUG_PRINT("info",("spider functype = %d", func_type)); + + const char *func_name = (char*) item_func->func_name(); + int func_name_length = strlen(func_name); + DBUG_PRINT("info",("spider func_name = %s", func_name)); + + /* The blacklist of the functions that cannot be pushed down */ + switch (func_type) + { + case Item_func::TRIG_COND_FUNC: + case Item_func::CASE_SEARCHED_FUNC: + case Item_func::CASE_SIMPLE_FUNC: + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + case Item_func::NOT_FUNC: + /* Why the following check is necessary? */ + if (not_func_should_be_skipped(item_func)) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + break; + case Item_func::FUNC_SP: + case Item_func::UDF_FUNC: + /* Notes on merging regarding MDEV-29447: please refer to the + following commits for build error or merge conflicts: + 10.5: d7b564da2a634dcf86798d6b86bd127e7eef9286 + 10.6: 1ed20b993b0dd4e95450cab2e8347e5bf4617a69 + 10.9: dd316b6e20265cfd832bb5585cb4c96e716387c8 + 10.10-11: 3f67f110ba1b23a89c5ede0fbeeb203cf5e164f4 + 11.0-1: 17ba6748afa8834df5658361088e6c8e65aca16f + Please remove this comment after merging. */ + use_pushdown_udf= spider_param_use_pushdown_udf( + spider->trx->thd, spider->share->use_pushdown_udf); + if (!use_pushdown_udf) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + break; + case Item_func::FT_FUNC: + if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + break; +#ifndef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC + case Item_func::UNKNOWN_FUNC: + if (item_func_is_timestampdiff(func_name, func_name_length)) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + break; +#endif + default: + break; + } + /* End of the blacklist */ + + /* Check the arguments recursively */ + if (uint item_count = item_func->argument_count()) + { + Item **item_list = item_func->arguments(); + for (uint roop_count = 0; roop_count < item_count; roop_count++) + { + Item *item = item_list[roop_count]; + if (int error_num = spider_db_print_item_type(item, NULL, spider, NULL, + alias, alias_length, dbton_id, use_fields, fields)) + DBUG_RETURN(error_num); + } + } + + DBUG_RETURN(0); +} + +/** + The function print the string corresponding to the given item_func to str. + The function is assumed to be called only when the check by the function + check_item_func() has passed. + + @return 0: success, otherwise: error + */ +int spider_db_mbase_util::print_item_func( + Item_func *item_func, + ha_spider *spider, + spider_string *str, + const char *alias, + uint alias_length, + bool use_fields, + spider_fields *fields ) { int error_num; Item *item, **item_list = item_func->arguments(); @@ -5523,13 +5698,15 @@ int spider_db_mbase_util::open_item_func( last_str_length = SPIDER_SQL_NULL_CHAR_LEN; int use_pushdown_udf; bool merge_func = FALSE; - DBUG_ENTER("spider_db_mbase_util::open_item_func"); - if (str) - { - if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + DBUG_ENTER("spider_db_mbase_util::print_item_func"); + DBUG_ASSERT(!check_item_func(item_func, spider, alias, alias_length, + use_fields, fields)); + DBUG_ASSERT(str); + + if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + DBUG_PRINT("info",("spider functype = %d", item_func->functype())); switch (item_func->functype()) { @@ -5577,14 +5754,9 @@ int spider_db_mbase_util::open_item_func( { if ( !strncasecmp("rand", func_name, func_name_length) && -#ifdef SPIDER_Item_args_arg_count_IS_PROTECTED !item_func->argument_count() -#else - !item_func->arg_count -#endif ) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if ( @@ -5594,38 +5766,36 @@ int spider_db_mbase_util::open_item_func( /* item_count == 1 means this TRIM() is without a remove_str */ item = item_list[0]; Item *item_tmp = item_list[1]; - if (str) + + if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) { - if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) - { - /* 1. append 'TRIM(BOTH ' */ - if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + - SPIDER_SQL_TRIM_BOTH_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN); - /* 2. append "remove_str"*/ - if ((error_num = spider_db_print_item_type( - item_tmp, NULL, spider, str, alias, alias_length, dbton_id, - use_fields, fields))) - DBUG_RETURN(error_num); - /* 3. append ' FROM ' */ - if (str->reserve(SPIDER_SQL_FROM_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); - /* 4. append `field` */ - if ((error_num = spider_db_print_item_type( - item, NULL, spider, str, alias, alias_length, dbton_id, - use_fields, fields))) - DBUG_RETURN(error_num); - /* 5. append ')' */ - if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - } + /* 1. append 'TRIM(BOTH ' */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_BOTH_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN); + /* 2. append "remove_str"*/ + if ((error_num = spider_db_print_item_type( + item_tmp, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 3. append ' FROM ' */ + if (str->reserve(SPIDER_SQL_FROM_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); + /* 4. append `field` */ + if ((error_num = spider_db_print_item_type( + item, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 5. append ')' */ + if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); } item_count -= 2; break; @@ -5641,50 +5811,47 @@ int spider_db_mbase_util::open_item_func( /* item_count == 2 means this TRIM(LEADING/TRAILING ...) is with a remove_str */ item = item_list[0]; Item *item_tmp = item_list[1]; - if (str) + if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) { - if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) - { - /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */ - if (func_name[0] == 'l' || func_name[0] == 'L') - { /* ltrim */ - if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + - SPIDER_SQL_TRIM_LEADING_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN); - } else - { /* rtrim */ - if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + - SPIDER_SQL_TRIM_TRAILING_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN); - } - /* 2. append "remove_str"*/ - if ((error_num = spider_db_print_item_type( - item_tmp, NULL, spider, str, alias, alias_length, dbton_id, - use_fields, fields))) - DBUG_RETURN(error_num); - /* 3. append ' FROM ' */ - if (str->reserve(SPIDER_SQL_FROM_LEN)) + /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */ + if (func_name[0] == 'l' || func_name[0] == 'L') + { /* ltrim */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_LEADING_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); - /* 4. append `field` */ - if ((error_num = spider_db_print_item_type( - item, NULL, spider, str, alias, alias_length, dbton_id, - use_fields, fields))) - DBUG_RETURN(error_num); - /* 5. append ')' */ - if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN); + } else + { /* rtrim */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_TRAILING_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN); } + /* 2. append "remove_str"*/ + if ((error_num = spider_db_print_item_type( + item_tmp, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 3. append ' FROM ' */ + if (str->reserve(SPIDER_SQL_FROM_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); + /* 4. append `field` */ + if ((error_num = spider_db_print_item_type( + item, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 5. append ')' */ + if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); } item_count -= 2; break; @@ -5707,23 +5874,19 @@ int spider_db_mbase_util::open_item_func( !strncasecmp("curdate", func_name, func_name_length) || !strncasecmp("curtime", func_name, func_name_length) ) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if ( !strncasecmp("convert", func_name, func_name_length) ) { - if (str) - { - if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - last_str = SPIDER_SQL_CLOSE_PAREN_STR; - last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; - } + if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + last_str = SPIDER_SQL_CLOSE_PAREN_STR; + last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; } } else if (func_name_length == 8 && @@ -5732,8 +5895,7 @@ int spider_db_mbase_util::open_item_func( !strncasecmp("utc_time", func_name, func_name_length) ) ) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if (func_name_length == 9 && @@ -5751,14 +5913,12 @@ int spider_db_mbase_util::open_item_func( break; } else if (!strncasecmp("column_get", func_name, func_name_length)) { - if (str) - { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -5792,15 +5952,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_DATE_STR; last_str_length = SPIDER_SQL_AS_DATE_LEN; @@ -5830,15 +5987,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_TIME_STR; last_str_length = SPIDER_SQL_AS_TIME_LEN; @@ -5848,8 +6002,7 @@ int spider_db_mbase_util::open_item_func( { if (!strncasecmp("utc_timestamp", func_name, func_name_length)) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if (!strncasecmp("timestampdiff", func_name, func_name_length)) @@ -5857,64 +6010,62 @@ int spider_db_mbase_util::open_item_func( #ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC Item_func_timestamp_diff *item_func_timestamp_diff = (Item_func_timestamp_diff *) item_func; - if (str) + const char *interval_str; + uint interval_len; + switch (item_func_timestamp_diff->int_type) { - const char *interval_str; - uint interval_len; - switch (item_func_timestamp_diff->int_type) - { - case INTERVAL_YEAR: - interval_str = SPIDER_SQL_YEAR_STR; - interval_len = SPIDER_SQL_YEAR_LEN; - break; - case INTERVAL_QUARTER: - interval_str = SPIDER_SQL_QUARTER_STR; - interval_len = SPIDER_SQL_QUARTER_LEN; - break; - case INTERVAL_MONTH: - interval_str = SPIDER_SQL_MONTH_STR; - interval_len = SPIDER_SQL_MONTH_LEN; - break; - case INTERVAL_WEEK: - interval_str = SPIDER_SQL_WEEK_STR; - interval_len = SPIDER_SQL_WEEK_LEN; - break; - case INTERVAL_DAY: - interval_str = SPIDER_SQL_DAY_STR; - interval_len = SPIDER_SQL_DAY_LEN; - break; - case INTERVAL_HOUR: - interval_str = SPIDER_SQL_HOUR_STR; - interval_len = SPIDER_SQL_HOUR_LEN; - break; - case INTERVAL_MINUTE: - interval_str = SPIDER_SQL_MINUTE_STR; - interval_len = SPIDER_SQL_MINUTE_LEN; - break; - case INTERVAL_SECOND: - interval_str = SPIDER_SQL_SECOND_STR; - interval_len = SPIDER_SQL_SECOND_LEN; - break; - case INTERVAL_MICROSECOND: - interval_str = SPIDER_SQL_MICROSECOND_STR; - interval_len = SPIDER_SQL_MICROSECOND_LEN; - break; - default: - interval_str = ""; - interval_len = 0; - break; - } - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN + - interval_len + SPIDER_SQL_COMMA_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - str->q_append(interval_str, interval_len); - str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + case INTERVAL_YEAR: + interval_str = SPIDER_SQL_YEAR_STR; + interval_len = SPIDER_SQL_YEAR_LEN; + break; + case INTERVAL_QUARTER: + interval_str = SPIDER_SQL_QUARTER_STR; + interval_len = SPIDER_SQL_QUARTER_LEN; + break; + case INTERVAL_MONTH: + interval_str = SPIDER_SQL_MONTH_STR; + interval_len = SPIDER_SQL_MONTH_LEN; + break; + case INTERVAL_WEEK: + interval_str = SPIDER_SQL_WEEK_STR; + interval_len = SPIDER_SQL_WEEK_LEN; + break; + case INTERVAL_DAY: + interval_str = SPIDER_SQL_DAY_STR; + interval_len = SPIDER_SQL_DAY_LEN; + break; + case INTERVAL_HOUR: + interval_str = SPIDER_SQL_HOUR_STR; + interval_len = SPIDER_SQL_HOUR_LEN; + break; + case INTERVAL_MINUTE: + interval_str = SPIDER_SQL_MINUTE_STR; + interval_len = SPIDER_SQL_MINUTE_LEN; + break; + case INTERVAL_SECOND: + interval_str = SPIDER_SQL_SECOND_STR; + interval_len = SPIDER_SQL_SECOND_LEN; + break; + case INTERVAL_MICROSECOND: + interval_str = SPIDER_SQL_MICROSECOND_STR; + interval_len = SPIDER_SQL_MICROSECOND_LEN; + break; + default: + interval_str = ""; + interval_len = 0; + break; } + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN + + interval_len + SPIDER_SQL_COMMA_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(interval_str, interval_len); + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider, - str, alias, alias_length, dbton_id, use_fields, fields))) + str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); if (str) { @@ -5923,14 +6074,14 @@ int spider_db_mbase_util::open_item_func( str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider, - str, alias, alias_length, dbton_id, use_fields, fields))) + str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); if (str) { if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); + SPIDER_SQL_CLOSE_PAREN_LEN); } DBUG_RETURN(0); #else @@ -5964,35 +6115,28 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + char *tmp_ptr, *tmp_ptr2; + DBUG_ASSERT(tmp_str.length() == 0); + tmp_str.set_charset(str->charset()); + tmp_str.init_calc_mem(123); + tmp_str.reserve(MAX_FIELD_WIDTH); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - char *tmp_ptr, *tmp_ptr2; - DBUG_ASSERT(tmp_str.length() == 0); - tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(123); - tmp_str.reserve(MAX_FIELD_WIDTH); - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } -#if MYSQL_VERSION_ID < 50500 - item_func->print(tmp_str.get_str(), QT_IS); -#else - item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); -#endif - tmp_str.mem_calc(); - if (tmp_str.reserve(1)) + if (str->reserve(SPIDER_SQL_CAST_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - tmp_ptr = tmp_str.c_ptr_quick(); - DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); - while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR))) - tmp_ptr = tmp_ptr2 + 1; - last_str = tmp_ptr - 1; - last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } + item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); + tmp_str.mem_calc(); + if (tmp_str.reserve(1)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + tmp_ptr = tmp_str.c_ptr_quick(); + DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); + while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR))) + tmp_ptr = tmp_ptr2 + 1; + last_str = tmp_ptr - 1; + last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; break; } else if (!strncasecmp("cast_as_signed", func_name, func_name_length)) { @@ -6019,15 +6163,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_SIGNED_STR; last_str_length = SPIDER_SQL_AS_SIGNED_LEN; @@ -6060,15 +6201,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_UNSIGNED_STR; last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN; @@ -6099,35 +6237,28 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + char *tmp_ptr, *tmp_ptr2; + DBUG_ASSERT(tmp_str.length() == 0); + tmp_str.set_charset(str->charset()); + tmp_str.init_calc_mem(124); + tmp_str.reserve(MAX_FIELD_WIDTH); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - char *tmp_ptr, *tmp_ptr2; - DBUG_ASSERT(tmp_str.length() == 0); - tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(124); - tmp_str.reserve(MAX_FIELD_WIDTH); - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } -#if MYSQL_VERSION_ID < 50500 - item_func->print(tmp_str.get_str(), QT_IS); -#else - item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); -#endif - tmp_str.mem_calc(); - if (tmp_str.reserve(1)) + if (str->reserve(SPIDER_SQL_CAST_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - tmp_ptr = tmp_str.c_ptr_quick(); - DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); - while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR))) - tmp_ptr = tmp_ptr2 + 1; - last_str = tmp_ptr - 1; - last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } + item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); + tmp_str.mem_calc(); + if (tmp_str.reserve(1)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + tmp_ptr = tmp_str.c_ptr_quick(); + DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); + while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR))) + tmp_ptr = tmp_ptr2 + 1; + last_str = tmp_ptr - 1; + last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; break; } else if (!strncasecmp("cast_as_datetime", func_name, func_name_length)) @@ -6155,15 +6286,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_DATETIME_STR; last_str_length = SPIDER_SQL_AS_DATETIME_LEN; @@ -6181,41 +6309,32 @@ int spider_db_mbase_util::open_item_func( if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); - if (str) + if (item_date_add_interval->date_sub_interval) { - if (item_date_add_interval->date_sub_interval) - { - if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_NEGINTERVAL_STR, - SPIDER_SQL_NEGINTERVAL_LEN); - } else { - if (str->reserve(SPIDER_SQL_INTERVAL_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN); - } + if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_NEGINTERVAL_STR, + SPIDER_SQL_NEGINTERVAL_LEN); + } else { + if (str->reserve(SPIDER_SQL_INTERVAL_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN); } if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); - if (str) - { - if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - } + if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); DBUG_RETURN(0); } } - if (str) - { - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6224,8 +6343,7 @@ int spider_db_mbase_util::open_item_func( last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; case Item_func::NOW_FUNC: - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); case Item_func::CHAR_TYPECAST_FUNC: @@ -6254,99 +6372,48 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + char *tmp_ptr, *tmp_ptr2; + DBUG_ASSERT(tmp_str.length() == 0); + tmp_str.set_charset(str->charset()); + tmp_str.init_calc_mem(125); + tmp_str.reserve(MAX_FIELD_WIDTH); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - char *tmp_ptr, *tmp_ptr2; - DBUG_ASSERT(tmp_str.length() == 0); - tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(125); - tmp_str.reserve(MAX_FIELD_WIDTH); - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } -#if MYSQL_VERSION_ID < 50500 - item_func->print(tmp_str.get_str(), QT_IS); -#else - item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); -#endif - tmp_str.mem_calc(); - if (tmp_str.reserve(1)) + if (str->reserve(SPIDER_SQL_CAST_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - tmp_ptr = tmp_str.c_ptr_quick(); - DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); - while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR))) - tmp_ptr = tmp_ptr2 + 1; - last_str = tmp_ptr - 1; - last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } + item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); + tmp_str.mem_calc(); + if (tmp_str.reserve(1)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + tmp_ptr = tmp_str.c_ptr_quick(); + DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); + while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR))) + tmp_ptr = tmp_ptr2 + 1; + last_str = tmp_ptr - 1; + last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; } break; case Item_func::NOT_FUNC: DBUG_PRINT("info",("spider NOT_FUNC")); - if (item_list[0]->type() == Item::COND_ITEM) - { - DBUG_PRINT("info",("spider item_list[0] is COND_ITEM")); - Item_cond *item_cond = (Item_cond *) item_list[0]; - if (item_cond->functype() == Item_func::COND_AND_FUNC) - { - DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC")); - List_iterator_fast lif(*(item_cond->argument_list())); - bool has_expr_cache_item = FALSE; - bool has_isnotnull_func = FALSE; - bool has_other_item = FALSE; - while((item = lif++)) - { -#ifdef SPIDER_HAS_EXPR_CACHE_ITEM - if ( - item->type() == Item::EXPR_CACHE_ITEM - ) { - DBUG_PRINT("info",("spider EXPR_CACHE_ITEM")); - has_expr_cache_item = TRUE; - } else -#endif - if ( - item->type() == Item::FUNC_ITEM && - ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC - ) { - DBUG_PRINT("info",("spider ISNOTNULL_FUNC")); - has_isnotnull_func = TRUE; - } else { - DBUG_PRINT("info",("spider has other item")); - DBUG_PRINT("info",("spider COND type=%d", item->type())); - has_other_item = TRUE; - } - } - if (has_expr_cache_item && has_isnotnull_func && !has_other_item) - { - DBUG_PRINT("info",("spider NOT EXISTS skip")); - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); - } - } - } - if (str) - { - func_name = (char*) item_func->func_name(); - func_name_length = strlen(func_name); - if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); - } + if (not_func_should_be_skipped(item_func)) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + func_name = (char*) item_func->func_name(); + func_name_length = strlen(func_name); + if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); break; case Item_func::NEG_FUNC: - if (str) - { - func_name = (char*) item_func->func_name(); - func_name_length = strlen(func_name); - if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); - } + func_name = (char*) item_func->func_name(); + func_name_length = strlen(func_name); + if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); break; case Item_func::IN_FUNC: if (((Item_func_opt_neg *) item_func)->negated) @@ -6391,17 +6458,14 @@ int spider_db_mbase_util::open_item_func( definition). Users can turn it on if they know what they are doing. */ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); - if (str) - { - func_name = (char*) item_func->func_name(); - func_name_length = strlen(func_name); - DBUG_PRINT("info",("spider func_name = %s", func_name)); - DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + func_name = (char*) item_func->func_name(); + func_name_length = strlen(func_name); + DBUG_PRINT("info",("spider func_name = %s", func_name)); + DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6412,8 +6476,7 @@ int spider_db_mbase_util::open_item_func( case Item_func::TRIG_COND_FUNC: DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::GUSERVAR_FUNC: - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); if (item_func->result_type() == STRING_RESULT) DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); @@ -6424,28 +6487,22 @@ int spider_db_mbase_util::open_item_func( if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); start_item = 1; - if (str) - { - if (str->reserve(SPIDER_SQL_MATCH_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN); - } + if (str->reserve(SPIDER_SQL_MATCH_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN); separator_str = SPIDER_SQL_COMMA_STR; separator_str_length = SPIDER_SQL_COMMA_LEN; last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; case Item_func::SP_EQUALS_FUNC: - if (str) - { - func_name = SPIDER_SQL_MBR_EQUAL_STR; - func_name_length = SPIDER_SQL_MBR_EQUAL_LEN; - DBUG_PRINT("info",("spider func_name = %s", func_name)); - DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); - if (str->reserve(func_name_length)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - } + func_name = SPIDER_SQL_MBR_EQUAL_STR; + func_name_length = SPIDER_SQL_MBR_EQUAL_LEN; + DBUG_PRINT("info",("spider func_name = %s", func_name)); + DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); + if (str->reserve(func_name_length)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6460,24 +6517,14 @@ int spider_db_mbase_util::open_item_func( case Item_func::SP_WITHIN_FUNC: case Item_func::SP_CONTAINS_FUNC: case Item_func::SP_OVERLAPS_FUNC: - if (str) - { - func_name = (char*) item_func->func_name(); - func_name_length = strlen(func_name); - DBUG_PRINT("info",("spider func_name = %s", func_name)); - DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); - if (str->reserve( -#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR - SPIDER_SQL_MBR_LEN + -#endif - func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + func_name = (char*) item_func->func_name(); + func_name_length = strlen(func_name); + DBUG_PRINT("info",("spider func_name = %s", func_name)); + DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); -#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR - str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN); -#endif - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6493,107 +6540,32 @@ int spider_db_mbase_util::open_item_func( case Item_func::GE_FUNC: case Item_func::GT_FUNC: case Item_func::XOR_FUNC: - if (str) + func_name = (char*) item_func->func_name(); + func_name_length = strlen(func_name); + break; + case Item_func::LIKE_FUNC: + if (((Item_func_like *)item_func)->get_negated()) { - func_name = (char*) item_func->func_name(); + func_name = SPIDER_SQL_NOT_LIKE_STR; + func_name_length = SPIDER_SQL_NOT_LIKE_LEN; + } + else + { + func_name = (char*)item_func->func_name(); func_name_length = strlen(func_name); } break; - case Item_func::LIKE_FUNC: -#ifdef SPIDER_LIKE_FUNC_HAS_GET_NEGATED - if (str) - { - if (((Item_func_like *)item_func)->get_negated()) - { - func_name = SPIDER_SQL_NOT_LIKE_STR; - func_name_length = SPIDER_SQL_NOT_LIKE_LEN; - } - else - { - func_name = (char*)item_func->func_name(); - func_name_length = strlen(func_name); - } - } - break; -#else DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); -#endif case Item_func::CASE_SEARCHED_FUNC: case Item_func::CASE_SIMPLE_FUNC: -#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC - Item_func_case *item_func_case = (Item_func_case *) item_func; - if (str) - { - if (str->reserve(SPIDER_SQL_CASE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN); - } - if (item_func_case->first_expr_num != -1) - { - if ((error_num = spider_db_print_item_type( - item_list[item_func_case->first_expr_num], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - for (roop_count = 0; roop_count < item_func_case->ncases; - roop_count += 2) - { - if (str) - { - if (str->reserve(SPIDER_SQL_WHEN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[roop_count], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - if (str) - { - if (str->reserve(SPIDER_SQL_THEN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[roop_count + 1], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - if (item_func_case->else_expr_num != -1) - { - if (str) - { - if (str->reserve(SPIDER_SQL_ELSE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[item_func_case->else_expr_num], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - if (str) - { - if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - } - DBUG_RETURN(0); -#else DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); -#endif case Item_func::JSON_EXTRACT_FUNC: func_name = (char*) item_func->func_name(); func_name_length = strlen(func_name); - if (str) - { - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6607,11 +6579,8 @@ int spider_db_mbase_util::open_item_func( if (spider_param_skip_default_condition(thd, share->skip_default_condition)) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); - if (str) - { - func_name = (char*) item_func->func_name(); - func_name_length = strlen(func_name); - } + func_name = (char*) item_func->func_name(); + func_name_length = strlen(func_name); break; } DBUG_PRINT("info",("spider func_name = %s", func_name)); @@ -6644,14 +6613,11 @@ int spider_db_mbase_util::open_item_func( func_name = separator_str; func_name_length = separator_str_length; } - if (str) - { - if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); - } + if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } /* Print the last operand value */ @@ -6664,61 +6630,49 @@ int spider_db_mbase_util::open_item_func( if (item_func->functype() == Item_func::FT_FUNC) { Item_func_match *item_func_match = (Item_func_match *)item_func; - if (str) - { - if (str->reserve(SPIDER_SQL_AGAINST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN); - } + if (str->reserve(SPIDER_SQL_AGAINST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN); item = item_list[0]; if ((error_num = spider_db_print_item_type(item, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); - if (str) - { - if (str->reserve( - ((item_func_match->flags & FT_BOOL) ? - SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) + - ((item_func_match->flags & FT_EXPAND) ? - SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0) - )) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - if (item_func_match->flags & FT_BOOL) - str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR, - SPIDER_SQL_IN_BOOLEAN_MODE_LEN); - if (item_func_match->flags & FT_EXPAND) - str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR, - SPIDER_SQL_WITH_QUERY_EXPANSION_LEN); - } + if (str->reserve( + ((item_func_match->flags & FT_BOOL) ? + SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) + + ((item_func_match->flags & FT_EXPAND) ? + SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0) + )) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if (item_func_match->flags & FT_BOOL) + str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR, + SPIDER_SQL_IN_BOOLEAN_MODE_LEN); + if (item_func_match->flags & FT_EXPAND) + str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR, + SPIDER_SQL_WITH_QUERY_EXPANSION_LEN); } else if (item_func->functype() == Item_func::UNKNOWN_FUNC) { if ( func_name_length == 7 && !strncasecmp("convert", func_name, func_name_length) ) { - if (str) - { - Item_func_conv_charset *item_func_conv_charset = - (Item_func_conv_charset *)item_func; - CHARSET_INFO *conv_charset = - item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset; - uint cset_length = strlen(conv_charset->csname); - if (str->reserve(SPIDER_SQL_USING_LEN + cset_length)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN); - str->q_append(conv_charset->csname, cset_length); - } + Item_func_conv_charset *item_func_conv_charset = + (Item_func_conv_charset *)item_func; + CHARSET_INFO *conv_charset = + item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset; + uint cset_length = strlen(conv_charset->csname); + if (str->reserve(SPIDER_SQL_USING_LEN + cset_length)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN); + str->q_append(conv_charset->csname, cset_length); } } - if (str) - { - if (merge_func) - str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN); - if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(last_str, last_str_length); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); - } + if (merge_func) + str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN); + if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(last_str, last_str_length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); DBUG_RETURN(0); } diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index bc7b0baa9b5..c866376095a 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -122,6 +122,25 @@ public: bool use_fields, spider_fields *fields ) override; +protected: + int check_item_func( + Item_func *item_func, + ha_spider *spider, + const char *alias, + uint alias_length, + bool use_fields, + spider_fields *fields + ); + int print_item_func( + Item_func *item_func, + ha_spider *spider, + spider_string *str, + const char *alias, + uint alias_length, + bool use_fields, + spider_fields *fields + ); +public: #ifdef HANDLER_HAS_DIRECT_AGGREGATE int open_item_sum_func( Item_sum *item_sum, From 5f09b53bdb4e973e7c7ec2c53a24c98321223f98 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Mon, 5 Jun 2023 19:09:38 +0530 Subject: [PATCH 065/171] MDEV-31086 MODIFY COLUMN can break FK constraints, and lead to unrestorable dumps - When foreign_key_check is disabled, allowing to modify the column which is part of foreign key constraint can lead to refusal of TRUNCATE TABLE, OPTIMIZE TABLE later. So it make sense to block the column modify operation when foreign key is involved irrespective of foreign_key_check variable. Correct way to modify the charset of the column when fk is involved: SET foreign_key_checks=OFF; ALTER TABLE child DROP FOREIGN KEY fk, MODIFY m VARCHAR(200) CHARSET utf8mb4; ALTER TABLE parent MODIFY m VARCHAR(200) CHARSET utf8mb4; ALTER TABLE child ADD CONSTRAINT FOREIGN KEY (m) REFERENCES PARENT(m); SET foreign_key_checks=ON; fk_check_column_changes(): Remove the FOREIGN_KEY_CHECKS while checking the column change for foreign key constraint. This is the partial revert of commit 5f1f2fc0e443f098af24d21f7d1ec1a8166a4030 and it changes the behaviour of copy alter algorithm ha_innobase::prepare_inplace_alter_table(): Find the modified column and check whether it is part of existing and newly added foreign key constraint. --- mysql-test/suite/innodb/r/fk_col_alter.result | 77 +++++++++++++ mysql-test/suite/innodb/r/foreign_key.result | 3 + mysql-test/suite/innodb/r/innodb.result | 2 + mysql-test/suite/innodb/t/fk_col_alter.test | 106 ++++++++++++++++++ mysql-test/suite/innodb/t/foreign_key.test | 3 + mysql-test/suite/innodb/t/innodb.test | 2 + sql/sql_table.cc | 17 +-- storage/innobase/handler/handler0alter.cc | 102 ++++++++++++++++- 8 files changed, 298 insertions(+), 14 deletions(-) create mode 100644 mysql-test/suite/innodb/r/fk_col_alter.result create mode 100644 mysql-test/suite/innodb/t/fk_col_alter.test diff --git a/mysql-test/suite/innodb/r/fk_col_alter.result b/mysql-test/suite/innodb/r/fk_col_alter.result new file mode 100644 index 00000000000..edd90e05ecd --- /dev/null +++ b/mysql-test/suite/innodb/r/fk_col_alter.result @@ -0,0 +1,77 @@ +# +# MDEV-31086 MODIFY COLUMN can break FK constraints, and +# lead to unrestorable dumps +# +CREATE TABLE t1( +id SERIAL, +msg VARCHAR(100) CHARACTER SET utf8mb3, +KEY(msg))ENGINE=InnoDB; +CREATE TABLE t2( +id SERIAL, +msg varchar(100) CHARACTER SET utf8mb4, +CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg))ENGINE=InnoDB; +ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") +CREATE TABLE t2( +id SERIAL, +msg varchar(100) CHARACTER SET utf8mb3, +msg_1 varchar(100) CHARACTER SET utf8mb3, +INDEX (msg_1), +INDEX (msg), +CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg) +ON DELETE CASCADE)ENGINE=InnoDB; +SET FOREIGN_KEY_CHECKS=1; +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(400) character set utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' +SET FOREIGN_KEY_CHECKS=1; +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Collation change on an indexed column. Try ALGORITHM=COPY +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Collation change on an indexed column. Try ALGORITHM=COPY +SET FOREIGN_KEY_CHECKS=1; +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Adding foreign keys needs foreign_key_checks=OFF. Try ALGORITHM=COPY +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Collation change on an indexed column. Try ALGORITHM=COPY +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(200) CHARACTER SET utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg_1': used in a foreign key constraint 'test/t2_ibfk_0' +SET FOREIGN_KEY_CHECKS=1; +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' of table 'test.t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' of table 'test/t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' of table 'test.t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Collation change on an indexed column. Try ALGORITHM=COPY +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' of table 'test.t2' +ALTER TABLE t1 MODIFY msg VARCHAR(400) CHARSET utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' of table 'test/t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' of table 'test.t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Collation change on an indexed column. Try ALGORITHM=COPY +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 DROP FOREIGN KEY fk_t1, MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY (msg) REFERENCES t1(msg), aLGORITHM=INPLACE; +SET FOREIGN_KEY_CHECKS=1; +DROP TABLE t2, t1; diff --git a/mysql-test/suite/innodb/r/foreign_key.result b/mysql-test/suite/innodb/r/foreign_key.result index 802019d493e..68a54344519 100644 --- a/mysql-test/suite/innodb/r/foreign_key.result +++ b/mysql-test/suite/innodb/r/foreign_key.result @@ -246,8 +246,11 @@ CREATE TABLE t1 (a INT, UNIQUE(a), KEY(a)) ENGINE=InnoDB; ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (a); SET SESSION FOREIGN_KEY_CHECKS = OFF; ALTER TABLE t1 CHANGE COLUMN a a TIME NOT NULL; +ERROR HY000: Cannot change column 'a': used in a foreign key constraint 't1_ibfk_1' of table 'test.t1' ALTER TABLE t1 ADD pk INT NOT NULL AUTO_INCREMENT PRIMARY KEY; ALTER TABLE t1 CHANGE COLUMN a b TIME; +ERROR 0A000: ALGORITHM=COPY is not supported. Reason: Columns participating in a foreign key are renamed. Try ALGORITHM=INPLACE +ALTER TABLE t1 CHANGE COLUMN a b TIME, DROP FOREIGN KEY t1_ibfk_1; SET SESSION FOREIGN_KEY_CHECKS = ON; DROP TABLE t1; # diff --git a/mysql-test/suite/innodb/r/innodb.result b/mysql-test/suite/innodb/r/innodb.result index 23f9ac89495..5e0f231d419 100644 --- a/mysql-test/suite/innodb/r/innodb.result +++ b/mysql-test/suite/innodb/r/innodb.result @@ -2544,12 +2544,14 @@ set foreign_key_checks=0; create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb; create table t1(a varchar(10) primary key) engine = innodb; alter table t1 modify column a int; +ERROR HY000: Cannot change column 'a': used in a foreign key constraint 't2_ibfk_1' of table 'test.t2' set foreign_key_checks=1; drop table t2,t1; set foreign_key_checks=0; create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=latin1; create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1; alter table t1 convert to character set utf8; +ERROR HY000: Cannot change column 'a': used in a foreign key constraint 't2_ibfk_1' of table 'test.t2' set foreign_key_checks=1; drop table t2,t1; call mtr.add_suppression("\\[Warning\\] InnoDB: In ALTER TABLE `test`.`t1` has or is referenced in foreign key constraints which are not compatible with the new table definition."); diff --git a/mysql-test/suite/innodb/t/fk_col_alter.test b/mysql-test/suite/innodb/t/fk_col_alter.test new file mode 100644 index 00000000000..d8b9afc92ad --- /dev/null +++ b/mysql-test/suite/innodb/t/fk_col_alter.test @@ -0,0 +1,106 @@ +--source include/have_innodb.inc +--echo # +--echo # MDEV-31086 MODIFY COLUMN can break FK constraints, and +--echo # lead to unrestorable dumps +--echo # +CREATE TABLE t1( + id SERIAL, + msg VARCHAR(100) CHARACTER SET utf8mb3, + KEY(msg))ENGINE=InnoDB; + +--error ER_CANT_CREATE_TABLE +CREATE TABLE t2( +id SERIAL, +msg varchar(100) CHARACTER SET utf8mb4, +CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg))ENGINE=InnoDB; + +CREATE TABLE t2( +id SERIAL, +msg varchar(100) CHARACTER SET utf8mb3, +msg_1 varchar(100) CHARACTER SET utf8mb3, +INDEX (msg_1), +INDEX (msg), +CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg) +ON DELETE CASCADE)ENGINE=InnoDB; + +# Changing column used in FK constraint +SET FOREIGN_KEY_CHECKS=1; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=INPLACE; + +SET FOREIGN_KEY_CHECKS=0; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(400) character set utf8mb3, ALGORITHM=INPLACE; + +# Changing column charset used in FK constraint +SET FOREIGN_KEY_CHECKS=1; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; + +SET FOREIGN_KEY_CHECKS=0; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=COPY; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=INPLACE; + +# Modify the column in the newly added foreign constraint +SET FOREIGN_KEY_CHECKS=1; +--error ER_CANT_CREATE_TABLE +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; + + +SET FOREIGN_KEY_CHECKS=0; +--error ER_CANT_CREATE_TABLE +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; + +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(200) CHARACTER SET utf8mb3, ALGORITHM=INPLACE; + +# Change referenced table column +SET FOREIGN_KEY_CHECKS=1; +# Change referenced column length +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=INPLACE; +# Change referenced column character set +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE; + +SET FOREIGN_KEY_CHECKS=0; +# Change referenced column length +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(400) CHARSET utf8mb3, ALGORITHM=INPLACE; + +# Change referenced column character set +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE; + +# Correct way to change character set in foreign key constraint +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 DROP FOREIGN KEY fk_t1, MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY (msg) REFERENCES t1(msg), aLGORITHM=INPLACE; +SET FOREIGN_KEY_CHECKS=1; + +DROP TABLE t2, t1; diff --git a/mysql-test/suite/innodb/t/foreign_key.test b/mysql-test/suite/innodb/t/foreign_key.test index 4f3f07757d5..4caa4cc2431 100644 --- a/mysql-test/suite/innodb/t/foreign_key.test +++ b/mysql-test/suite/innodb/t/foreign_key.test @@ -239,9 +239,12 @@ DROP TABLE t3,t1; CREATE TABLE t1 (a INT, UNIQUE(a), KEY(a)) ENGINE=InnoDB; ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (a); SET SESSION FOREIGN_KEY_CHECKS = OFF; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD ALTER TABLE t1 CHANGE COLUMN a a TIME NOT NULL; ALTER TABLE t1 ADD pk INT NOT NULL AUTO_INCREMENT PRIMARY KEY; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON ALTER TABLE t1 CHANGE COLUMN a b TIME; +ALTER TABLE t1 CHANGE COLUMN a b TIME, DROP FOREIGN KEY t1_ibfk_1; SET SESSION FOREIGN_KEY_CHECKS = ON; DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb.test b/mysql-test/suite/innodb/t/innodb.test index ba5126e4757..b50fd995e83 100644 --- a/mysql-test/suite/innodb/t/innodb.test +++ b/mysql-test/suite/innodb/t/innodb.test @@ -1626,6 +1626,7 @@ drop table t1; set foreign_key_checks=0; create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb; create table t1(a varchar(10) primary key) engine = innodb; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD alter table t1 modify column a int; set foreign_key_checks=1; drop table t2,t1; @@ -1635,6 +1636,7 @@ drop table t2,t1; set foreign_key_checks=0; create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=latin1; create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD alter table t1 convert to character set utf8; set foreign_key_checks=1; drop table t2,t1; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index b0f7d848068..100436ae1ef 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -9143,17 +9143,12 @@ fk_check_column_changes(THD *thd, Alter_info *alter_info, ((new_field->flags & NOT_NULL_FLAG) && !(old_field->flags & NOT_NULL_FLAG))) { - if (!(thd->variables.option_bits & OPTION_NO_FOREIGN_KEY_CHECKS)) - { - /* - Column in a FK has changed significantly. Unless - foreign_key_checks are off we prohibit this since this - means values in this column might be changed by ALTER - and thus referential integrity might be broken, - */ - *bad_column_name= column->str; - return FK_COLUMN_DATA_CHANGE; - } + /* + Column in a FK has changed significantly and it + may break referential intergrity. + */ + *bad_column_name= column->str; + return FK_COLUMN_DATA_CHANGE; } } else diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 17fe6014fea..9ec025d6141 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -7662,6 +7662,71 @@ static bool alter_templ_needs_rebuild(const TABLE* altered_table, const Alter_inplace_info* ha_alter_info, const dict_table_t* table); +/** Check whether the column is present in table foreign key +relations. +@param table table which has foreign key relation +@param col column to be checked +@param col_name column name to be display during error +@param drop_fk Drop foreign key constraint +@param n_drop_fk number of drop foreign keys +@param add_fk Newly added foreign key constraint +@param n_add_fk number of newly added foreign constraint */ +static +bool check_col_is_in_fk_indexes( + const dict_table_t *table, const dict_col_t *col, + const char* col_name, + span drop_fk, + span add_fk) +{ + char *fk_id= nullptr; + + for (dict_foreign_set::iterator it= table->foreign_set.begin(); + it!= table->foreign_set.end();) + { + if (std::find(drop_fk.begin(), drop_fk.end(), (*it)) + != drop_fk.end()) + goto next_item; + for (ulint i= 0; i < (*it)->n_fields; i++) + if ((*it)->foreign_index->fields[i].col == col) + { + fk_id= (*it)->id; + goto err_exit; + } +next_item: + it++; + } + + for (const auto &a : add_fk) + { + for (ulint i= 0; i < a->n_fields; i++) + { + if (a->foreign_index->fields[i].col == col) + { + fk_id= a->id; + goto err_exit; + } + } + } + + for (const auto &f : table->referenced_set) + { + for (ulint i= 0; i < f->n_fields; i++) + { + if (f->referenced_index->fields[i].col == col) + { + my_error(ER_FK_COLUMN_CANNOT_CHANGE_CHILD, MYF(0), + col_name, f->id, f->foreign_table_name); + return true; + } + } + } + return false; +err_exit: + my_error(ER_FK_COLUMN_CANNOT_CHANGE, MYF(0), col_name, + fk_id ? fk_id : + (std::string(table->name.m_name) + "_ibfk_0").c_str()); + return true; +} /** Allows InnoDB to update internal structures with concurrent writes blocked (provided that check_if_supported_inplace_alter() @@ -7687,7 +7752,7 @@ ha_innobase::prepare_inplace_alter_table( dict_foreign_t**drop_fk; /*!< Foreign key constraints to drop */ ulint n_drop_fk; /*!< Number of foreign keys to drop */ dict_foreign_t**add_fk = NULL; /*!< Foreign key constraints to drop */ - ulint n_add_fk; /*!< Number of foreign keys to drop */ + ulint n_add_fk= 0; /*!< Number of foreign keys to drop */ dict_table_t* indexed_table; /*!< Table where indexes are created */ mem_heap_t* heap; const char** col_names; @@ -8204,8 +8269,6 @@ check_if_can_drop_indexes: } } - n_add_fk = 0; - if (ha_alter_info->handler_flags & ALTER_ADD_FOREIGN_KEY) { ut_ad(!m_prebuilt->trx->check_foreigns); @@ -8239,6 +8302,12 @@ err_exit: m_prebuilt->trx); } + for (uint i = 0; i < n_add_fk; i++) { + if (add_fk[i]) { + dict_foreign_free(add_fk[i]); + } + } + if (heap) { mem_heap_free(heap); } @@ -8257,6 +8326,33 @@ err_exit: } } + /** Alter shouldn't support if the foreign and referenced + index columns are modified */ + if (ha_alter_info->handler_flags + & ALTER_COLUMN_TYPE_CHANGE_BY_ENGINE) { + List_iterator it( + ha_alter_info->alter_info->create_list); + for (uint i = 0; i < table->s->fields; i++) { + Field* field = table->field[i]; + Create_field *f= it++; + if (!f->field || field->is_equal(*f)) + continue; + + const char* col_name= field->field_name.str; + dict_col_t *col= dict_table_get_nth_col( + m_prebuilt->table, i); + if (check_col_is_in_fk_indexes( + m_prebuilt->table, col, col_name, + span( + const_cast( + drop_fk), n_drop_fk), + span( + const_cast( + add_fk), n_add_fk))) + goto err_exit; + } + } + if (ha_alter_info->handler_flags & ALTER_RENAME_INDEX) { for (const Alter_inplace_info::Rename_key_pair& pair : ha_alter_info->rename_keys) { From d214628af47b2335a9da03a3f7ae54d7ea3241f0 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Sun, 7 May 2023 11:33:07 +0200 Subject: [PATCH 066/171] mtr: fix the help text for debuggers --- mysql-test/lib/My/Debugger.pm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mysql-test/lib/My/Debugger.pm b/mysql-test/lib/My/Debugger.pm index e7428572ca4..b1a287d660d 100644 --- a/mysql-test/lib/My/Debugger.pm +++ b/mysql-test/lib/My/Debugger.pm @@ -116,19 +116,19 @@ for my $k (sort keys %debuggers) { my $v = $debuggers{$k}; $v = $debuggers{$k} = $debuggers{$v} if not ref $v; # resolve aliases - sub register_opt($$) { - my ($name, $msg) = @_; - $opts{"$name=s"} = \$opt_vals{$name}; - $help .= wrap(sprintf(" %-23s", $name), ' 'x25, "$msg under $name\n"); + sub register_opt($$$) { + my ($prefix, $name, $msg) = @_; + $opts{"$prefix$name=s"} = \$opt_vals{$prefix.$name}; + $help .= wrap(sprintf(" %-23s", $prefix.$name), ' 'x25, "$msg under $name\n"); } $v->{script} = '' unless $v->{script}; $v->{options} =~ s/(\{exe\}|$)/ {options} $&/ unless $v->{options} =~ /\{options\}/; - register_opt "$k" => "Start mysqld"; - register_opt "client-$k" => "Start mysqltest client"; - register_opt "boot-$k" => "Start bootstrap server"; - register_opt "manual-$k" => "Before running test(s) let user manually start mysqld"; + register_opt "", $k, "Start mysqld"; + register_opt "client-", $k, "Start mysqltest client"; + register_opt "boot-", $k, "Start bootstrap server"; + register_opt "manual-", "$k", "Before running test(s) let user manually start mysqld"; } sub subst($%) { From ea4b8d4ce99d0f427dd7ed40b5eeb15e41eec01e Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Wed, 28 Jun 2023 14:41:24 +1000 Subject: [PATCH 067/171] MDEV-31101 Spider: temporarily disable mdev_29904.test Will re-enable once MDEV-31101 is no longer blocked by MDEV-22979, as the patch for the latter might fix the former. --- storage/spider/mysql-test/spider/bugfix/disabled.def | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/spider/mysql-test/spider/bugfix/disabled.def b/storage/spider/mysql-test/spider/bugfix/disabled.def index e19ea07b76b..99443c854e5 100644 --- a/storage/spider/mysql-test/spider/bugfix/disabled.def +++ b/storage/spider/mysql-test/spider/bugfix/disabled.def @@ -1 +1,2 @@ wait_timeout : MDEV-26045 +mdev_29904 : MDEV-31101 From 428c7964a23a63eeb0155e46a2e94948391cb981 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Thu, 29 Jun 2023 11:22:13 +1000 Subject: [PATCH 068/171] MDEV-30370 [fixup] Spider: mdev_30370.test needs wsrep to run. --- storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test index 788ea2323f7..955e77b4175 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test @@ -1,3 +1,4 @@ +--source include/have_wsrep.inc --echo # --echo # MDEV-30370 mariadbd hangs when running with --wsrep-recover and --plugin-load-add=ha_spider.so --echo # From 67657a01bff98ac19c4188f13b52509a255a0daf Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 28 Jun 2023 16:47:27 +0400 Subject: [PATCH 069/171] MDEV-30932 UBSAN: negation of -X cannot be represented in type .. 'long long int'; cast to an unsigned type to negate this value .. to itself in Item_func_mul::int_op and Item_func_round::int_op Problems: The code in multiple places in the following methods: - Item_func_mul::int_op() - longlong Item_func_int_div::val_int() - Item_func_mod::int_op() - Item_func_round::int_op() did not properly check for corner values LONGLONG_MIN and (LONGLONG_MAX+1) before doing negation. This cuased UBSAN to complain about undefined behaviour. Fix summary: - Adding helper classes ULonglong, ULonglong_null, ULonglong_hybrid (in addition to their signed couterparts in sql/sql_type_int.h). - Moving the code performing multiplication of ulonglong numbers from Item_func_mul::int_op() to ULonglong_hybrid::ullmul(). - Moving the code responsible for extracting absolute values from negative numbers to Longlong::abs(). It makes sure to perform negation without undefinite behavior: LONGLONG_MIN is handled in a special way. - Moving negation related code to ULonglong::operator-(). It makes sure to perform negation without undefinite behavior: (LONGLONG_MAX + 1) is handled in a special way. - Moving signed<=>unsigned conversion code to Longlong_hybrid::val_int() and ULonglong_hybrid::val_int(). - Reusing old and new sql_type_int.h classes in multiple places in Item_func_xxx::int_op(). Fix details (explain how sql_type_int.h classes are reused): - Instead of straight negation of negative "longlong" arguments *before* performing unsigned multiplication, Item_func_mul::int_op() now calls ULonglong_null::ullmul() using Longlong_hybrid_null::abs() to pass arguments. This fixes undefined behavior N1. - Instead of straight negation of "ulonglong" result *after* performing unsigned multiplication, Item_func_mul::int_op() now calls ULonglong_hybrid::val_int(), which recursively calls ULonglong::operator-(). This fixes undefined behavior N2. - Removing duplicate negating code from Item_func_mod::int_op(). Using ULonglong_hybrid::val_int() instead. This fixes undefinite behavior N3. - Removing literal "longlong" negation from Item_func_round::int_op(). Using Longlong::abs() instead, which correctly handler LONGLONG_MIN. This fixes undefinite behavior N4. - Removing the duplicate (negation related) code from Item_func_int_div::val_int(). Reusing class ULonglong_hybrid. There were no undefinite behavior in here. However, this change allowed to reveal a bug in "-9223372036854775808 DIV 1". The removed negation code appeared to be incorrect when negating +9223372036854775808. It returned the "out of range" error. ULonglong_hybrid::operator-() now handles all values correctly and returns +9223372036854775808 as a negation for -9223372036854775808. Re-recording wrong results for SELECT -9223372036854775808 DIV 1; Now instead of "out of range", it returns -9223372036854775808, which is the smallest possible value for the expression data type (signed) BIGINT. - Removing "no UBSAN" branch from Item_func_splus::int_opt() and Item_func_minus::int_opt(), as it made UBSAN happy but in RelWithDebInfo some MTR tests started to fail. --- mysql-test/main/func_math.result | 29 +++++- mysql-test/main/func_math.test | 27 ++++- sql/item_func.cc | 102 +++---------------- sql/item_func.h | 21 +++- sql/sql_type_int.h | 163 ++++++++++++++++++++++++++++++- 5 files changed, 245 insertions(+), 97 deletions(-) diff --git a/mysql-test/main/func_math.result b/mysql-test/main/func_math.result index 47de1170691..c3d7ee20f50 100644 --- a/mysql-test/main/func_math.result +++ b/mysql-test/main/func_math.result @@ -972,7 +972,8 @@ SELECT 9223372036854775808 DIV 1; SELECT 9223372036854775808 DIV -1; ERROR 22003: BIGINT UNSIGNED value is out of range in '9223372036854775808 DIV -1' SELECT -9223372036854775808 DIV 1; -ERROR 22003: BIGINT value is out of range in '-9223372036854775808 DIV 1' +-9223372036854775808 DIV 1 +-9223372036854775808 SELECT -9223372036854775808 DIV -1; ERROR 22003: BIGINT value is out of range in '-9223372036854775808 DIV -1' SELECT 9223372036854775808 MOD 1; @@ -3546,5 +3547,31 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1,t2; # +# MDEV-30932 UBSAN: negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in Item_func_mul::int_op and Item_func_round::int_op +# +SELECT (1 DIV(-1/POW(807,14))*1); +ERROR 22003: BIGINT value is out of range in '1 DIV (-1 / pow(807,14))' +DO((-9223372036854775808)*(1)); +SELECT (-9223372036854775808)*(1); +(-9223372036854775808)*(1) +-9223372036854775808 +SELECT (GET_FORMAT(TIME,'JIS'))DIV(POW(-40,65)DIV(1)*2); +ERROR 22003: BIGINT value is out of range in 'pow(-40,65) DIV 1' +SELECT -9223372036854775808 MOD 9223372036854775810; +-9223372036854775808 MOD 9223372036854775810 +-9223372036854775808 +CREATE TABLE t1 (c INT); +INSERT INTO t1 VALUES(TRUNCATE(0,-1.e+30)); +DROP TABLE t1; +SELECT TRUNCATE(0, -9223372036854775808); +TRUNCATE(0, -9223372036854775808) +0 +SELECT GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))); +GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))) +NULL +SELECT (GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)); +(GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)) +NULL +# # End of 10.4 tests # diff --git a/mysql-test/main/func_math.test b/mysql-test/main/func_math.test index 51452d3e6af..4007f81fbee 100644 --- a/mysql-test/main/func_math.test +++ b/mysql-test/main/func_math.test @@ -710,7 +710,6 @@ DROP TABLE t1; SELECT 9223372036854775808 DIV 1; --error ER_DATA_OUT_OF_RANGE SELECT 9223372036854775808 DIV -1; ---error ER_DATA_OUT_OF_RANGE SELECT -9223372036854775808 DIV 1; --error ER_DATA_OUT_OF_RANGE SELECT -9223372036854775808 DIV -1; @@ -1867,6 +1866,32 @@ SELECT * FROM t2; SHOW CREATE TABLE t2; DROP TABLE t1,t2; +--echo # +--echo # MDEV-30932 UBSAN: negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in Item_func_mul::int_op and Item_func_round::int_op +--echo # + +--error ER_DATA_OUT_OF_RANGE +SELECT (1 DIV(-1/POW(807,14))*1); + +DO((-9223372036854775808)*(1)); + +SELECT (-9223372036854775808)*(1); + +--error ER_DATA_OUT_OF_RANGE +SELECT (GET_FORMAT(TIME,'JIS'))DIV(POW(-40,65)DIV(1)*2); + +SELECT -9223372036854775808 MOD 9223372036854775810; + +CREATE TABLE t1 (c INT); +INSERT INTO t1 VALUES(TRUNCATE(0,-1.e+30)); +DROP TABLE t1; +SELECT TRUNCATE(0, -9223372036854775808); + +--disable_warnings +SELECT GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))); +SELECT (GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)); +--enable_warnings + --echo # --echo # End of 10.4 tests --echo # diff --git a/sql/item_func.cc b/sql/item_func.cc index e0d30b94067..4575990a7a2 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -78,7 +78,7 @@ bool check_reserved_words(const LEX_CSTRING *name) */ static inline bool test_if_sum_overflows_ull(ulonglong arg1, ulonglong arg2) { - return ULONGLONG_MAX - arg1 < arg2; + return ULonglong::test_if_sum_overflows_ull(arg1, arg2); } @@ -1157,14 +1157,10 @@ longlong Item_func_plus::int_op() } } -#ifndef WITH_UBSAN - res= val0 + val1; -#else if (res_unsigned) res= (longlong) ((ulonglong) val0 + (ulonglong) val1); else res= val0+val1; -#endif /* WITH_UBSAN */ return check_integer_overflow(res, res_unsigned); @@ -1325,14 +1321,10 @@ longlong Item_func_minus::int_op() goto err; } } -#ifndef WITH_UBSAN - res= val0 - val1; -#else if (res_unsigned) res= (longlong) ((ulonglong) val0 - (ulonglong) val1); else res= val0 - val1; -#endif /* WITH_UBSAN */ return check_integer_overflow(res, res_unsigned); @@ -1375,79 +1367,23 @@ double Item_func_mul::real_op() longlong Item_func_mul::int_op() { DBUG_ASSERT(fixed == 1); - longlong a= args[0]->val_int(); - longlong b= args[1]->val_int(); - longlong res; - ulonglong res0, res1; - ulong a0, a1, b0, b1; - bool res_unsigned= FALSE; - bool a_negative= FALSE, b_negative= FALSE; - - if ((null_value= args[0]->null_value || args[1]->null_value)) - return 0; - /* - First check whether the result can be represented as a - (bool unsigned_flag, longlong value) pair, then check if it is compatible - with this Item's unsigned_flag by calling check_integer_overflow(). - - Let a = a1 * 2^32 + a0 and b = b1 * 2^32 + b0. Then - a * b = (a1 * 2^32 + a0) * (b1 * 2^32 + b0) = a1 * b1 * 2^64 + - + (a1 * b0 + a0 * b1) * 2^32 + a0 * b0; - We can determine if the above sum overflows the ulonglong range by - sequentially checking the following conditions: - 1. If both a1 and b1 are non-zero. - 2. Otherwise, if (a1 * b0 + a0 * b1) is greater than ULONG_MAX. - 3. Otherwise, if (a1 * b0 + a0 * b1) * 2^32 + a0 * b0 is greater than - ULONGLONG_MAX. - Since we also have to take the unsigned_flag for a and b into account, it is easier to first work with absolute values and set the correct sign later. */ - if (!args[0]->unsigned_flag && a < 0) - { - a_negative= TRUE; - a= -a; - } - if (!args[1]->unsigned_flag && b < 0) - { - b_negative= TRUE; - b= -b; - } + Longlong_hybrid_null ha= args[0]->to_longlong_hybrid_null(); + Longlong_hybrid_null hb= args[1]->to_longlong_hybrid_null(); - a0= 0xFFFFFFFFUL & a; - a1= ((ulonglong) a) >> 32; - b0= 0xFFFFFFFFUL & b; - b1= ((ulonglong) b) >> 32; + if ((null_value= ha.is_null() || hb.is_null())) + return 0; - if (a1 && b1) - goto err; + ULonglong_null ures= ULonglong_null::ullmul(ha.abs(), hb.abs()); + if (ures.is_null()) + return raise_integer_overflow(); - res1= (ulonglong) a1 * b0 + (ulonglong) a0 * b1; - if (res1 > 0xFFFFFFFFUL) - goto err; - - res1= res1 << 32; - res0= (ulonglong) a0 * b0; - - if (test_if_sum_overflows_ull(res1, res0)) - goto err; - res= res1 + res0; - - if (a_negative != b_negative) - { - if ((ulonglong) res > (ulonglong) LONGLONG_MIN + 1) - goto err; - res= -res; - } - else - res_unsigned= TRUE; - - return check_integer_overflow(res, res_unsigned); - -err: - return raise_integer_overflow(); + return check_integer_overflow(ULonglong_hybrid(ures.value(), + ha.neg() != hb.neg())); } @@ -1645,15 +1581,8 @@ longlong Item_func_int_div::val_int() return 0; } - bool res_negative= val0.neg() != val1.neg(); - ulonglong res= val0.abs() / val1.abs(); - if (res_negative) - { - if (res > (ulonglong) LONGLONG_MAX) - return raise_integer_overflow(); - res= (ulonglong) (-(longlong) res); - } - return check_integer_overflow(res, !res_negative); + return check_integer_overflow(ULonglong_hybrid(val0.abs() / val1.abs(), + val0.neg() != val1.neg())); } @@ -1687,9 +1616,8 @@ longlong Item_func_mod::int_op() LONGLONG_MIN by -1 generates SIGFPE, we calculate using unsigned values and then adjust the sign appropriately. */ - ulonglong res= val0.abs() % val1.abs(); - return check_integer_overflow(val0.neg() ? -(longlong) res : res, - !val0.neg()); + return check_integer_overflow(ULonglong_hybrid(val0.abs() % val1.abs(), + val0.neg())); } double Item_func_mod::real_op() @@ -2669,7 +2597,7 @@ longlong Item_func_round::int_op() if ((dec >= 0) || args[1]->unsigned_flag) return value; // integer have not digits after point - abs_dec= -dec; + abs_dec= Longlong(dec).abs(); // Avoid undefined behavior longlong tmp; if(abs_dec >= array_elements(log_10_int)) diff --git a/sql/item_func.h b/sql/item_func.h index 3afe0d00661..7828078ac7b 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -252,12 +252,23 @@ public: */ inline longlong check_integer_overflow(longlong value, bool val_unsigned) { - if ((unsigned_flag && !val_unsigned && value < 0) || - (!unsigned_flag && val_unsigned && - (ulonglong) value > (ulonglong) LONGLONG_MAX)) - return raise_integer_overflow(); - return value; + return check_integer_overflow(Longlong_hybrid(value, val_unsigned)); } + + // Check if the value is compatible with Item::unsigned_flag. + inline longlong check_integer_overflow(const Longlong_hybrid &sval) + { + Longlong_null res= sval.val_int(unsigned_flag); + return res.is_null() ? raise_integer_overflow() : res.value(); + } + + // Check if the value is compatible with Item::unsigned_flag. + longlong check_integer_overflow(const ULonglong_hybrid &uval) + { + Longlong_null res= uval.val_int(unsigned_flag); + return res.is_null() ? raise_integer_overflow() : res.value(); + } + /** Throw an error if the error code of a DECIMAL operation is E_DEC_OVERFLOW. */ diff --git a/sql/sql_type_int.h b/sql/sql_type_int.h index d3e9d0318cf..7bb9200c4e1 100644 --- a/sql/sql_type_int.h +++ b/sql/sql_type_int.h @@ -34,6 +34,12 @@ protected: public: longlong value() const { return m_value; } Longlong(longlong nr) :m_value(nr) { } + ulonglong abs() + { + if (m_value == LONGLONG_MIN) // avoid undefined behavior + return ((ulonglong) LONGLONG_MAX) + 1; + return m_value < 0 ? -m_value : m_value; + } }; @@ -46,6 +52,86 @@ public: }; +class ULonglong +{ +protected: + ulonglong m_value; +public: + ulonglong value() const { return m_value; } + explicit ULonglong(ulonglong nr) :m_value(nr) { } + + static bool test_if_sum_overflows_ull(ulonglong arg1, ulonglong arg2) + { + return ULONGLONG_MAX - arg1 < arg2; + } + + Longlong_null operator-() const + { + if (m_value > (ulonglong) LONGLONG_MAX) // Avoid undefined behaviour + { + return m_value == (ulonglong) LONGLONG_MAX + 1 ? + Longlong_null(LONGLONG_MIN, false) : + Longlong_null(0, true); + } + return Longlong_null(-(longlong) m_value, false); + } + + // Convert to Longlong_null with the range check + Longlong_null to_longlong_null() const + { + if (m_value > (ulonglong) LONGLONG_MAX) + return Longlong_null(0, true); + return Longlong_null((longlong) m_value, false); + } + +}; + + +class ULonglong_null: public ULonglong, public Null_flag +{ +public: + ULonglong_null(ulonglong nr, bool is_null) + :ULonglong(nr), Null_flag(is_null) + { } + + /* + Multiply two ulonglong values. + + Let a = a1 * 2^32 + a0 and b = b1 * 2^32 + b0. Then + a * b = (a1 * 2^32 + a0) * (b1 * 2^32 + b0) = a1 * b1 * 2^64 + + + (a1 * b0 + a0 * b1) * 2^32 + a0 * b0; + We can determine if the above sum overflows the ulonglong range by + sequentially checking the following conditions: + 1. If both a1 and b1 are non-zero. + 2. Otherwise, if (a1 * b0 + a0 * b1) is greater than ULONG_MAX. + 3. Otherwise, if (a1 * b0 + a0 * b1) * 2^32 + a0 * b0 is greater than + ULONGLONG_MAX. + */ + static ULonglong_null ullmul(ulonglong a, ulonglong b) + { + ulong a1= a >> 32; + ulong b1= b >> 32; + + if (a1 && b1) + return ULonglong_null(0, true); + + ulong a0= 0xFFFFFFFFUL & a; + ulong b0= 0xFFFFFFFFUL & b; + + ulonglong res1= (ulonglong) a1 * b0 + (ulonglong) a0 * b1; + if (res1 > 0xFFFFFFFFUL) + return ULonglong_null(0, true); + + res1= res1 << 32; + ulonglong res0= (ulonglong) a0 * b0; + + if (test_if_sum_overflows_ull(res1, res0)) + return ULonglong_null(0, true); + return ULonglong_null(res1 + res0, false); + } +}; + + // A longlong/ulonglong hybrid. Good to store results of val_int(). class Longlong_hybrid: public Longlong { @@ -74,9 +160,7 @@ public: { if (m_unsigned) return (ulonglong) m_value; - if (m_value == LONGLONG_MIN) // avoid undefined behavior - return ((ulonglong) LONGLONG_MAX) + 1; - return m_value < 0 ? -m_value : m_value; + return Longlong(m_value).abs(); } /* Convert to an unsigned number: @@ -94,6 +178,33 @@ public: { return (uint) to_ulonglong(upper_bound); } + + + Longlong_null val_int_signed() const + { + if (m_unsigned) + return ULonglong((ulonglong) m_value).to_longlong_null(); + return Longlong_null(m_value, false); + } + + Longlong_null val_int_unsigned() const + { + if (!m_unsigned && m_value < 0) + return Longlong_null(0, true); + return Longlong_null(m_value, false); + } + + /* + Return in Item compatible val_int() format: + - signed numbers as a straight longlong value + - unsigned numbers as a ulonglong value reinterpreted to longlong + */ + Longlong_null val_int(bool want_unsigned_value) const + { + return want_unsigned_value ? val_int_unsigned() : + val_int_signed(); + } + int cmp(const Longlong_hybrid& other) const { if (m_unsigned == other.m_unsigned) @@ -143,4 +254,50 @@ public: }; +/* + Stores the absolute value of a number, and the sign. + Value range: -ULONGLONG_MAX .. +ULONGLONG_MAX. + + Provides a wider range for negative numbers than Longlong_hybrid does. + Usefull to store intermediate results of an expression whose value + is further needed to be negated. For example, these methods: + - Item_func_mul::int_op() + - Item_func_int_div::val_int() + - Item_func_mod::int_op() + calculate the result of absolute values of the arguments, + then optionally negate the result. +*/ +class ULonglong_hybrid: public ULonglong +{ + bool m_neg; +public: + ULonglong_hybrid(ulonglong value, bool neg) + :ULonglong(value), m_neg(neg) + { + if (m_neg && !m_value) + m_neg= false; // convert -0 to +0 + } + Longlong_null val_int_unsigned() const + { + return m_neg ? Longlong_null(0, true) : + Longlong_null((longlong) m_value, false); + } + Longlong_null val_int_signed() const + { + return m_neg ? -ULonglong(m_value) : ULonglong::to_longlong_null(); + } + + /* + Return in Item compatible val_int() format: + - signed numbers as a straight longlong value + - unsigned numbers as a ulonglong value reinterpreted to longlong + */ + Longlong_null val_int(bool want_unsigned_value) const + { + return want_unsigned_value ? val_int_unsigned() : + val_int_signed(); + } +}; + + #endif // SQL_TYPE_INT_INCLUDED From e146940ab3532ae324ff5c596a1222f7cdb1e3f7 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 30 Jun 2023 01:28:29 +0200 Subject: [PATCH 070/171] MDEV-31480 RPM packages fail to install because they require /bin/sh for %pretrans workaround cmake bug #25044 https://gitlab.kitware.com/cmake/cmake/-/issues/25044 --- cmake/cpack_rpm.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/cpack_rpm.cmake b/cmake/cpack_rpm.cmake index 713141e2349..642b699c6a5 100644 --- a/cmake/cpack_rpm.cmake +++ b/cmake/cpack_rpm.cmake @@ -106,6 +106,8 @@ SET(CPACK_RPM_SPEC_MORE_DEFINE " %define restart_flag_dir %{_localstatedir}/lib/rpm-state/mariadb %define restart_flag %{restart_flag_dir}/need-restart +%define pretrans %{nil} + %{?filter_setup: %filter_provides_in \\\\.\\\\(test\\\\|result\\\\|h\\\\|cc\\\\|c\\\\|inc\\\\|opt\\\\|ic\\\\|cnf\\\\|rdiff\\\\|cpp\\\\)$ %filter_requires_in \\\\.\\\\(test\\\\|result\\\\|h\\\\|cc\\\\|c\\\\|inc\\\\|opt\\\\|ic\\\\|cnf\\\\|rdiff\\\\|cpp\\\\)$ From 77a229cd2d6bfa288d0da96cbd6c2856c279489c Mon Sep 17 00:00:00 2001 From: Anel Husakovic Date: Tue, 30 May 2023 16:08:41 +0200 Subject: [PATCH 071/171] MDEV-31358: Update description for MariaDB debian/rpm packages Reviewer: --- cmake/cpack_rpm.cmake | 2 +- debian/control | 65 ++++++++++--------- plugin/cracklib_password_check/CMakeLists.txt | 4 +- storage/cassandra/CMakeLists.txt | 10 +-- storage/connect/CMakeLists.txt | 2 +- storage/oqgraph/CMakeLists.txt | 2 +- storage/rocksdb/CMakeLists.txt | 2 +- storage/tokudb/CMakeLists.txt | 2 +- 8 files changed, 47 insertions(+), 42 deletions(-) diff --git a/cmake/cpack_rpm.cmake b/cmake/cpack_rpm.cmake index 642b699c6a5..87a84a1361b 100644 --- a/cmake/cpack_rpm.cmake +++ b/cmake/cpack_rpm.cmake @@ -71,7 +71,7 @@ It was originally forked from Percona XtraBackup 2.3.8.") # Packages with default description SET(CPACK_RPM_client_PACKAGE_SUMMARY "MariaDB database client binaries") SET(CPACK_RPM_client_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") -SET(CPACK_RPM_common_PACKAGE_SUMMARY "MariaDB database common files (e.g. /etc/mysql/conf.d/mariadb.cnf)") +SET(CPACK_RPM_common_PACKAGE_SUMMARY "MariaDB database common configuration files (e.g. /etc/mysql/conf.d/mariadb.cnf)") SET(CPACK_RPM_common_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") SET(CPACK_RPM_compat_PACKAGE_SUMMARY "MariaDB database client library MySQL compat package") SET(CPACK_RPM_compat_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") diff --git a/debian/control b/debian/control index c14a6f7dd93..f927ba0c5ea 100644 --- a/debian/control +++ b/debian/control @@ -103,9 +103,9 @@ Description: MariaDB database development files language in the world. The main goals of MariaDB are speed, robustness and ease of use. . - This package includes development libraries and header files. To allow sources + This package includes development libraries and header files to allow sources expecting the MariaDB Connector/C to build. Sources that expect the MySQL - Client libraries should use files from the libmariadb-dev-compat package. + client libraries should use files from the libmariadb-dev-compat package. Package: libmariadb-dev-compat Architecture: any @@ -198,19 +198,19 @@ Depends: libmariadb-dev (= ${binary:Version}), Breaks: libmysqld-dev, libmariadbd-dev (<= 10.2) Replaces: libmysqld-dev -Description: MariaDB embedded database, development files +Description: MariaDB embedded database, development files package MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and ease of use. . - This package includes the embedded server library development and header files. + This package includes the MariaDB embedded server library development and header files. Package: mysql-common Architecture: all Depends: ${misc:Depends}, ${shlibs:Depends} -Description: MariaDB database common files (e.g. /etc/mysql/my.cnf) +Description: MariaDB client common configuration files package (e.g. /etc/mysql/my.cnf) MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and @@ -224,7 +224,7 @@ Architecture: all Depends: mysql-common, ${misc:Depends}, ${shlibs:Depends} -Description: MariaDB database common files (e.g. /etc/mysql/mariadb.conf.d/) +Description: MariaDB client common configuration files package (e.g. /etc/mysql/mariadb.conf.d/) MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and @@ -507,7 +507,7 @@ Package: mariadb-server Architecture: all Depends: mariadb-server-10.4 (>= ${source:Version}), ${misc:Depends} -Description: MariaDB database server (metapackage depending on the latest version) +Description: MariaDB database server binaries (metapackage depending on the latest version) This is an empty package that depends on the current "best" version of mariadb-server (currently mariadb-server-10.4), as determined by the MariaDB maintainers. Install this package if in doubt about which MariaDB @@ -523,11 +523,16 @@ Package: mariadb-client Architecture: all Depends: mariadb-client-10.4 (>= ${source:Version}), ${misc:Depends} -Description: MariaDB database client (metapackage depending on the latest version) +Description: MariaDB database client binaries (metapackage depending on the latest version) This is an empty package that depends on the current "best" version of mariadb-client (currently mariadb-client-10.4), as determined by the MariaDB maintainers. Install this package if in doubt about which MariaDB version you want, as this is the one considered to be in the best shape. + . + MariaDB is a fast, stable and true multi-user, multi-threaded SQL database + server. SQL (Structured Query Language) is the most popular database query + language in the world. The main goals of MariaDB are speed, robustness and + ease of use. Package: mariadb-backup Architecture: any @@ -539,8 +544,8 @@ Depends: mariadb-client-core-10.4 (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} Description: Backup tool for MariaDB server - This backup tool is guaranteed to be compatible with MariaDB. - Based on Xtrabackup, but improved to work with MariaDB. + Based on Xtrabackup, but improved to work with MariaDB server. + This backup tool is guaranteed to be compatible with MariaDB server. . Plese refer to the MariaDB Knowledge Base on more information on how to use this tool. @@ -559,11 +564,11 @@ Breaks: mariadb-connect-engine-10.1, Replaces: mariadb-connect-engine-10.1, mariadb-connect-engine-10.2, mariadb-connect-engine-10.3 -Description: Connect storage engine for MariaDB +Description: Connect storage engine for MariaDB server Connect engine supports a number of file formats (dbf, xml, txt, bin, etc), connections to ODBC tables and remote MySQL tables, as well as a number of other interesting features. - This package contains the Connect plugin for MariaDB. + This package contains the Connect plugin for MariaDB server. Package: mariadb-plugin-rocksdb Architecture: amd64 arm64 mips64el ppc64el @@ -575,10 +580,10 @@ Breaks: mariadb-rocksdb-engine-10.2, Replaces: mariadb-rocksdb-engine-10.2, mariadb-rocksdb-engine-10.3 Recommends: python-mysqldb -Description: RocksDB storage engine for MariaDB +Description: RocksDB storage engine for MariaDB server The RocksDB storage engine is a high performance storage engine, aimed at maximising storage efficiency while maintaining InnoDB-like performance. - This package contains the RocksDB plugin for MariaDB. + This package contains the RocksDB plugin for MariaDB server. Package: mariadb-plugin-oqgraph Architecture: any @@ -592,10 +597,10 @@ Breaks: mariadb-oqgraph-engine-10.1, Replaces: mariadb-oqgraph-engine-10.1, mariadb-oqgraph-engine-10.2, mariadb-oqgraph-engine-10.3 -Description: OQGraph storage engine for MariaDB +Description: OQGraph storage engine for MariaDB server The OQGraph engine is a computation engine plugin for handling hierarchies (trees) and graphs (friend-of-a-friend, etc) cleanly through standard SQL. - This package contains the OQGraph plugin for MariaDB. + This package contains the OQGraph plugin for MariaDB server. Package: mariadb-plugin-tokudb Architecture: amd64 @@ -611,11 +616,11 @@ Replaces: mariadb-server-10.0, mariadb-server-10.1, mariadb-server-10.2, mariadb-server-10.3 -Description: TokuDB storage engine for MariaDB +Description: TokuDB storage engine for MariaDB server The TokuDB storage engine is for use in high-performance and write-intensive environments, offering increased compression and better performance based on fractal indexes. - This package contains the TokuDB plugin for MariaDB. + This package contains the TokuDB plugin for MariaDB server. Package: mariadb-plugin-mroonga Architecture: any-alpha any-amd64 any-arm any-arm64 any-i386 any-ia64 any-mips64el any-mips64r6el any-mipsel any-mipsr6el any-nios2 any-powerpcel any-ppc64el any-sh3 any-sh4 any-tilegx @@ -630,10 +635,10 @@ Replaces: mariadb-server-10.0, mariadb-server-10.1, mariadb-server-10.2, mariadb-server-10.3 -Description: Mroonga storage engine for MariaDB +Description: Mroonga storage engine for MariaDB server Mroonga (formerly named Groonga Storage Engine) is a storage engine that provides fast CJK-ready full text searching using column store. - This package contains the Mroonga plugin for MariaDB. + This package contains the Mroonga plugin for MariaDB server. Package: mariadb-plugin-spider Architecture: any @@ -648,9 +653,9 @@ Replaces: mariadb-server-10.0, mariadb-server-10.1, mariadb-server-10.2, mariadb-server-10.3 -Description: Spider storage engine for MariaDB +Description: Spider storage engine for MariaDB server The Spider storage engine with built-in sharding features. It supports - partitioning and xa transactions, and allows tables of different MariaDB + partitioning and xa transactions, and allows tables of different MariaDB server instances to be handled as if they were on the same insctance. It refers to one possible implementation of ISO/IEC 9075-9:2008 SQL/MED. @@ -667,12 +672,12 @@ Replaces: mariadb-server-10.0, mariadb-server-10.1, mariadb-server-10.2, mariadb-server-10.3 -Description: Cassandra storage engine for MariaDB - The Cassandra Storage Engine allows access to data in a Cassandra cluster from - MariaDB, combining the best of SQL and no-SQL worlds. Cassandra SE (storage - engine) makes Cassandra's column family appear as a table in MariaDB that you +Description: Cassandra storage engine for MariaDB server + The Cassandra storage engine allows access to data in a Cassandra cluster from + MariaDB server, combining the best of SQL and no-SQL worlds. Cassandra SE (storage + engine) makes Cassandra's column family appear as a table in MariaDB server that you can insert to, update, and select from. You can write joins against this table, - it is possible to join data that's stored in MariaDB with data that's stored in + it is possible to join data that's stored in MariaDB server with data that's stored in Cassandra. Package: mariadb-plugin-gssapi-server @@ -717,11 +722,11 @@ Depends: libcrack2 (>= 2.9.0), mariadb-server-10.4 (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} -Description: CrackLib Password Validation Plugin for MariaDB +Description: CrackLib Password Validation Plugin for MariaDB server This password validation plugin uses cracklib to allow only - sufficiently secure (as defined by cracklib) user passwords in MariaDB. + sufficiently secure (as defined by cracklib) user passwords in MariaDB server. . - Install and configure this to enforce stronger passwords for MariaDB users. + Install and configure this to enforce stronger passwords for MariaDB server users. Package: mariadb-test Architecture: any diff --git a/plugin/cracklib_password_check/CMakeLists.txt b/plugin/cracklib_password_check/CMakeLists.txt index 620234ccd3f..5d5466fb84e 100644 --- a/plugin/cracklib_password_check/CMakeLists.txt +++ b/plugin/cracklib_password_check/CMakeLists.txt @@ -1,9 +1,9 @@ INCLUDE (CheckIncludeFiles) INCLUDE (CheckLibraryExists) -SET(CPACK_RPM_cracklib-password-check_PACKAGE_SUMMARY "CrackLib Password Validation Plugin for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_cracklib-password-check_PACKAGE_SUMMARY "CrackLib Password Validation Plugin for MariaDB server" PARENT_SCOPE) SET(CPACK_RPM_cracklib-password-check_PACKAGE_DESCRIPTION "This password validation plugin uses cracklib to allow only -sufficiently secure (as defined by cracklib) user passwords in MariaDB." PARENT_SCOPE) +sufficiently secure (as defined by cracklib) user passwords in MariaDB server." PARENT_SCOPE) CHECK_LIBRARY_EXISTS(crack FascistCheckUser "" HAVE_LIBCRACK) diff --git a/storage/cassandra/CMakeLists.txt b/storage/cassandra/CMakeLists.txt index fe32f69c10b..1e696bcb1e9 100644 --- a/storage/cassandra/CMakeLists.txt +++ b/storage/cassandra/CMakeLists.txt @@ -1,10 +1,10 @@ -SET(CPACK_RPM_cassandra-engine_PACKAGE_SUMMARY "Cassandra storage engine for MariaDB" PARENT_SCOPE) -SET(CPACK_RPM_cassandra-engine_PACKAGE_DESCRIPTION "The Cassandra Storage Engine allows access to data in a Cassandra cluster from -MariaDB, combining the best of SQL and no-SQL worlds. Cassandra SE (storage -engine) makes Cassandra's column family appear as a table in MariaDB that you +SET(CPACK_RPM_cassandra-engine_PACKAGE_SUMMARY "Cassandra storage engine for MariaDB server" PARENT_SCOPE) +SET(CPACK_RPM_cassandra-engine_PACKAGE_DESCRIPTION "The Cassandra storage engine allows access to data in a Cassandra cluster from +MariaDB server, combining the best of SQL and no-SQL worlds. Cassandra SE (storage +engine) makes Cassandra's column family appear as a table in MariaDB server that you can insert to, update, and select from. You can write joins against this table, -it is possible to join data that's stored in MariaDB with data that's stored in +it is possible to join data that's stored in MariaDB server with data that's stored in Cassandra." PARENT_SCOPE) # use the first path that has Thrift.h included, if found diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index 20cd4ad3ee1..1bef8f122f0 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -17,7 +17,7 @@ IF(WITHOUT_DYNAMIC_PLUGINS OR WITH_NONE OR ("${PLUGIN_CONNECT}" STREQUAL "NO")) RETURN() ENDIF() -SET(CPACK_RPM_connect-engine_PACKAGE_SUMMARY "Connect storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_connect-engine_PACKAGE_SUMMARY "Connect storage engine for MariaDB server" PARENT_SCOPE) SET(CPACK_RPM_connect-engine_PACKAGE_DESCRIPTION "Connect engine supports a number of file formats (dbf, xml, txt, bin, etc), connections to ODBC tables and remote MySQL tables, as well as a number of other interesting features." PARENT_SCOPE) diff --git a/storage/oqgraph/CMakeLists.txt b/storage/oqgraph/CMakeLists.txt index e725f9712ea..2cb02727a64 100644 --- a/storage/oqgraph/CMakeLists.txt +++ b/storage/oqgraph/CMakeLists.txt @@ -1,6 +1,6 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") -SET(CPACK_RPM_oqgraph-engine_PACKAGE_SUMMARY "OQGraph storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_oqgraph-engine_PACKAGE_SUMMARY "OQGraph storage engine for MariaDB server" PARENT_SCOPE) SET(CPACK_RPM_oqgraph-engine_PACKAGE_DESCRIPTION "The Open Query GRAPH computation engine, or OQGRAPH as the engine itself is called, allows you to handle hierarchies (tree structures) and complex graphs (nodes having many connections in several directions). diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index 71259703e5a..cf8a821a3e4 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -1,6 +1,6 @@ # TODO: Copyrights -SET(CPACK_RPM_rocksdb-engine_PACKAGE_SUMMARY "RocksDB storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_rocksdb-engine_PACKAGE_SUMMARY "RocksDB storage engine for MariaDB server" PARENT_SCOPE) SET(CPACK_RPM_rocksdb-engine_PACKAGE_DESCRIPTION "The RocksDB storage engine is a high performance storage engine, aimed at maximising storage efficiency while maintaining InnoDB-like performance." PARENT_SCOPE) diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index 65110f7d8bd..78e7fd88d7f 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -1,4 +1,4 @@ -SET(CPACK_RPM_tokudb-engine_PACKAGE_SUMMARY "TokuDB storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_tokudb-engine_PACKAGE_SUMMARY "TokuDB storage engine for MariaDB server" PARENT_SCOPE) SET(CPACK_RPM_tokudb-engine_PACKAGE_DESCRIPTION "The TokuDB storage engine is for use in high-performance and write-intensive environments, offering increased compression and better performance based on fractal indexes." PARENT_SCOPE) From 0105220e3bb939846459c068dc49e6fd89ee3279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 3 Jul 2023 16:06:10 +0300 Subject: [PATCH 072/171] Remove tests that duplicate innodb.max_record_size --- .../innodb/r/innodb_max_recordsize_32k.result | 338 ------------ .../innodb/r/innodb_max_recordsize_64k.result | 520 ------------------ .../innodb/t/innodb_max_recordsize_32k.opt | 4 - .../innodb/t/innodb_max_recordsize_32k.test | 327 ----------- .../innodb/t/innodb_max_recordsize_64k.opt | 4 - .../innodb/t/innodb_max_recordsize_64k.test | 508 ----------------- 6 files changed, 1701 deletions(-) delete mode 100644 mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result delete mode 100644 mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result delete mode 100644 mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt delete mode 100644 mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test delete mode 100644 mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt delete mode 100644 mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test diff --git a/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result b/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result deleted file mode 100644 index fc41d0b1471..00000000000 --- a/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result +++ /dev/null @@ -1,338 +0,0 @@ -SELECT @@innodb_page_size; -@@innodb_page_size -32768 -SET innodb_strict_mode=ON; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=FIXED; -ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -show warnings; -Level Code Message -Warning 1478 InnoDB: invalid ROW_FORMAT specifier. -Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -show warnings; -Level Code Message -Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. -Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB -SET @@innodb_strict_mode=OFF; -SELECT @@innodb_strict_mode; -@@innodb_strict_mode -0 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPACT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); -ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPACT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); -ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); -ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=REDUNDANT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255)); -ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=REDUNDANT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',89),NULL); -ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',88),NULL); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -Warnings: -Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=DYNAMIC. -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -DROP TABLE tab5; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -7 -DROP TABLE t; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -5 -DROP TABLE t; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -5 -DROP TABLE t; diff --git a/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result b/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result deleted file mode 100644 index a9683016925..00000000000 --- a/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result +++ /dev/null @@ -1,520 +0,0 @@ -SELECT @@innodb_page_size; -@@innodb_page_size -65536 -SET innodb_strict_mode=ON; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=FIXED; -ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -show warnings; -Level Code Message -Warning 1478 InnoDB: invalid ROW_FORMAT specifier. -Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -show warnings; -Level Code Message -Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. -Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB -SET @@innodb_strict_mode=OFF; -SELECT @@innodb_strict_mode; -@@innodb_strict_mode -0 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=COMPACT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); -ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=COMPACT; -Warnings: -Warning 139 Row size too large (> 32702). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=REDUNDANT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=REDUNDANT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',27),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',26),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -Warnings: -Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=DYNAMIC. -DROP TABLE tab5; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -5 -DROP TABLE t; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -4 -DROP TABLE t; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -4 -DROP TABLE t; diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt b/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt deleted file mode 100644 index 587a2d7e6c1..00000000000 --- a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt +++ /dev/null @@ -1,4 +0,0 @@ ---innodb-page-size=32K ---innodb_buffer_pool_size=32M ---skip-innodb-stats-persistent ---innodb-sys-tablestats diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test b/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test deleted file mode 100644 index 89bace5d9b1..00000000000 --- a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test +++ /dev/null @@ -1,327 +0,0 @@ ---source include/have_innodb.inc ---source include/have_innodb_32k.inc - -# Check page size 32k -SELECT @@innodb_page_size; - -SET innodb_strict_mode=ON; - -# FIXED not supported --- error 1005 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=FIXED; -show warnings; - --- error 1005 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -show warnings; - ---disable_warnings -SET @@innodb_strict_mode=OFF; -SELECT @@innodb_strict_mode; ---enable_warnings - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPACT; - -# row size 16353 > 16K ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPACT; - -# row size 16318 : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); - -# row size 16317 -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=DYNAMIC; - -# row size 16318 : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); - -# row size 16317 -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=REDUNDANT; - -# 65 * 255 = 16575 ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255)); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=REDUNDANT; - -# row size 16315 : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',89),NULL); - -# row size 16314 -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',88),NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=COMPACT ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; - -DROP TABLE tab5; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt b/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt deleted file mode 100644 index 1a8442b841f..00000000000 --- a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt +++ /dev/null @@ -1,4 +0,0 @@ ---innodb-page-size=64K ---innodb_buffer_pool_size=32M ---skip-innodb-stats-persistent ---innodb-sys-tablestats diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test b/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test deleted file mode 100644 index 4b4faf16f58..00000000000 --- a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test +++ /dev/null @@ -1,508 +0,0 @@ ---source include/have_innodb.inc ---source include/have_innodb_64k.inc - -# Check page size 64k -SELECT @@innodb_page_size; - -SET innodb_strict_mode=ON; - -# FIXED not supported --- error 1005 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=FIXED; -show warnings; - --- error 1005 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -show warnings; - ---disable_warnings -SET @@innodb_strict_mode=OFF; -SELECT @@innodb_strict_mode; ---enable_warnings - -# Check the Warning | 139 | Row size too large ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=COMPACT; - -# row size 32936 : should fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=COMPACT; - -# row size 16384 >= 16K : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -# row size 16383 < 16K : expected to pass -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=DYNAMIC; - -# row size 16384 >= 16K : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -# row size 16383 < 16K : expected to pass -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=REDUNDANT; - -# 65 * 255 = 16575 ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=REDUNDANT; - -# row size 16383 >= 16K-1 : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',27),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -# row size 16382 < 16K-1 : expected to pass -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',26),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=COMPACT ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; - -DROP TABLE tab5; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; From b8088487e4067bcf78ddd510dd0bcefa3f9c72dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 3 Jul 2023 16:09:18 +0300 Subject: [PATCH 073/171] MDEV-19216 Assertion ...SYS_FOREIGN failed in btr_node_ptr_max_size btr_node_ptr_max_size(): Handle BINARY(0) and VARBINARY(0) as special cases, similar to CHAR(0) and VARCHAR(0). --- mysql-test/suite/innodb/r/data_types.result | 7 +++++++ mysql-test/suite/innodb/t/data_types.test | 10 ++++++++++ storage/innobase/btr/btr0cur.cc | 5 ++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/innodb/r/data_types.result b/mysql-test/suite/innodb/r/data_types.result index 1394431b09d..146f9bb080f 100644 --- a/mysql-test/suite/innodb/r/data_types.result +++ b/mysql-test/suite/innodb/r/data_types.result @@ -174,3 +174,10 @@ DROP TABLE t1; CREATE TABLE t1 (c VARCHAR(0), KEY(c)) ENGINE=InnoDB; INSERT INTO t1 VALUES (''); DROP TABLE t1; +# +# MDEV-19216 Assertion ...SYS_FOREIGN failed in btr_node_ptr_max_size +# +CREATE TABLE t1 (b BINARY(0), v VARBINARY(0), KEY(b), KEY(v)) ENGINE=InnoDB; +INSERT INTO t1 SET b='',v=''; +DROP TABLE t1; +# End of 10.4 tests diff --git a/mysql-test/suite/innodb/t/data_types.test b/mysql-test/suite/innodb/t/data_types.test index cfdd5201af2..eda6579ba4a 100644 --- a/mysql-test/suite/innodb/t/data_types.test +++ b/mysql-test/suite/innodb/t/data_types.test @@ -136,3 +136,13 @@ DROP TABLE t1; CREATE TABLE t1 (c VARCHAR(0), KEY(c)) ENGINE=InnoDB; INSERT INTO t1 VALUES (''); DROP TABLE t1; + +--echo # +--echo # MDEV-19216 Assertion ...SYS_FOREIGN failed in btr_node_ptr_max_size +--echo # + +CREATE TABLE t1 (b BINARY(0), v VARBINARY(0), KEY(b), KEY(v)) ENGINE=InnoDB; +INSERT INTO t1 SET b='',v=''; +DROP TABLE t1; + +--echo # End of 10.4 tests diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index d4e1497d9b3..0f6cdf25ca2 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -1148,10 +1148,13 @@ static ulint btr_node_ptr_max_size(const dict_index_t* index) break; } /* fall through */ + case DATA_FIXBINARY: + case DATA_BINARY: case DATA_VARMYSQL: case DATA_CHAR: case DATA_MYSQL: - /* CHAR(0) and VARCHAR(0) are possible + /* BINARY(0), VARBINARY(0), + CHAR(0) and VARCHAR(0) are possible data type definitions in MariaDB. The InnoDB internal SQL parser maps CHAR to DATA_VARCHAR, so DATA_CHAR (or From d458136e7d38457e3e978d23ceceff8f18bc5d84 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 30 Jun 2023 19:22:21 +0200 Subject: [PATCH 074/171] cleanup: ER_QUERY_TIMEOUT -> ER_UNUSED_1 also make sure all unused error messages are "You should never see it" and have no translations --- sql/share/errmsg-utf8.txt | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 8bc2b784830..dff2319a99c 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -2476,7 +2476,6 @@ ER_TABLE_NOT_LOCKED swe "Tabell '%-.192s' är inte lÃ¥st med LOCK TABLES" ukr "Таблицю '%-.192s' не було блоковано з LOCK TABLES" ER_UNUSED_17 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_WRONG_DB_NAME 42000 chi "æ•°æ®åº“åç§°ä¸æ­£ç¡®'%-.100T'" @@ -4270,7 +4269,6 @@ ER_NEW_ABORTING_CONNECTION 08S01 swe "Avbröt länken för trÃ¥d %lld till db '%-.192s', användare '%-.48s', host '%-.64s' (%-.64s)" ukr "Перервано з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ %lld до бази данних: '%-.192s' кориÑтувач: '%-.48s' хоÑÑ‚: '%-.64s' (%-.64s)" ER_UNUSED_10 - chi "你应当永远看ä¸åˆ°è¿™ä¸ª" eng "You should never see it" ER_FLUSH_MASTER_BINLOG_CLOSED chi "Binlog 已关闭, ä¸èƒ½ RESET MASTER" @@ -6589,10 +6587,8 @@ ER_EVENT_NEITHER_M_EXPR_NOR_M_AT eng "No datetime expression provided" ger "Kein DATETIME-Ausdruck angegeben" ER_UNUSED_2 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_UNUSED_3 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_EVENT_CANNOT_DELETE chi "无法从mysql.event删除该事件" @@ -6630,7 +6626,6 @@ ER_CANT_LOCK_LOG_TABLE eng "You can't use locks with log tables" ger "Log-Tabellen können nicht gesperrt werden" ER_UNUSED_4 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE chi "mysql的列计数。%s是错误的。预期%d,找到%d。使用MariaDB%d创建,现在è¿è¡Œ%d。请使用mysql_upgradeæ¥ä¿®å¤æ­¤é”™è¯¯" @@ -6645,7 +6640,6 @@ ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT eng "Cannot change the binary logging format inside a stored function or trigger" ger "Das Binärlog-Format kann innerhalb einer gespeicherten Funktion oder eines Triggers nicht geändert werden" ER_UNUSED_13 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_PARTITION_NO_TEMPORARY chi "无法使用分区创建临时表" @@ -6866,7 +6860,6 @@ ER_CANT_CREATE_SROUTINE eng "Cannot create stored routine %`s. Check warnings" ger "Kann gespeicherte Routine %`s nicht erzeugen. Beachten Sie die Warnungen" ER_UNUSED_11 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT chi "类型%sçš„Binlogè¯­å¥æœªåœ¨æ ¼å¼æè¿°binlog语å¥ä¹‹å‰" @@ -6930,7 +6923,6 @@ ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE chi "心跳周期的请求值是负的或超过å…许的最大值(%u秒)" eng "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%u seconds)" ER_UNUSED_14 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_CONFLICT_FN_PARSE_ERROR chi "è§£æžå†²çªåŠŸèƒ½æ—¶å‡ºé”™ã€‚æ¶ˆæ¯ï¼š%-.64s" @@ -7319,11 +7311,9 @@ ER_BINLOG_UNSAFE_UPDATE_IGNORE eng "UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave" ER_UNUSED_15 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_UNUSED_16 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT @@ -7434,7 +7424,6 @@ ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET swe "Hittade en rad som inte passar i nÃ¥gon given partition" ER_UNUSED_5 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE @@ -7670,7 +7659,6 @@ ER_SLAVE_SILENT_RETRY_TRANSACTION eng "Slave must silently retry current transaction" ER_UNUSED_22 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_TABLE_SCHEMA_MISMATCH @@ -8006,12 +7994,12 @@ ER_LAST_MYSQL_ERROR_MESSAGE start-error-number 1900 ER_UNUSED_18 - eng "" + eng "You should never see it" ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED chi "函数或表达å¼'%s'ä¸èƒ½ç”¨äºŽ%sçš„%`s" eng "Function or expression '%s' cannot be used in the %s clause of %`s" ER_UNUSED_19 - eng "" + eng "You should never see it" ER_PRIMARY_KEY_BASED_ON_GENERATED_COLUMN chi "主键无法在生æˆçš„列上定义" eng "Primary key cannot be defined upon a generated column" @@ -8028,9 +8016,9 @@ ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN chi "生æˆçš„列尚未支æŒè¿™ä¸€ç‚¹" eng "This is not yet supported for generated columns" ER_UNUSED_20 - eng "" + eng "You should never see it" ER_UNUSED_21 - eng "" + eng "You should never see it" ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS chi "%så­˜å‚¨å¼•æ“Žä¸æ”¯æŒç”Ÿæˆçš„列" eng "%s storage engine does not support generated columns" @@ -8044,13 +8032,10 @@ ER_BAD_OPTION_VALUE eng "Incorrect value '%-.64T' for option '%-.64s'" hindi "गलत मान '%-.64T' विकलà¥à¤ª '%-.64s' के लिà¤" ER_UNUSED_6 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_UNUSED_7 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_UNUSED_8 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_DATA_OVERFLOW 22003 chi "转æ¢'%-.128s'到%-.32s时溢出。值截断" @@ -8092,7 +8077,6 @@ ER_CONNECTION_KILLED 70100 eng "Connection was killed" hindi "कनेकà¥à¤¶à¤¨ को समापà¥à¤¤ कर दिया गया है" ER_UNUSED_12 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SKIP_REPLICATION chi "无法修改事务中的@@session.skip_replication" @@ -8242,7 +8226,6 @@ ER_SET_STATEMENT_NOT_SUPPORTED 42000 chi "系统å˜é‡%.200s无法在set语å¥ä¸­è®¾ç½®ã€‚“" eng "The system variable %.200s cannot be set in SET STATEMENT." ER_UNUSED_9 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_USER_CREATE_EXISTS chi "无法创建用户'%-.64s'@'%-.64s';它已ç»å­˜åœ¨" @@ -8390,9 +8373,8 @@ ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS chi "使用CHANGE MASTER TO master_log_fileå­å¥æ›´æ”¹master,但没有master_log_poså­å¥å¯èƒ½ä¸å®‰å…¨ã€‚æ—§ä½ç½®å€¼å¯èƒ½å¯¹æ–°çš„二进制日志文件无效。" eng "CHANGE MASTER TO with a MASTER_LOG_FILE clause but no MASTER_LOG_POS clause may not be safe. The old position value may not be valid for the new binary log file." -ER_QUERY_TIMEOUT - chi "æŸ¥è¯¢æ‰§è¡Œä¸­æ–­ï¼Œè¶…è¿‡äº†æœ€å¤§è¯­å¥æ‰§è¡Œæ—¶é—´" - eng "Query execution was interrupted, maximum statement execution time exceeded" +ER_UNUSED_1 + eng "You should never see it" ER_NON_RO_SELECT_DISABLE_TIMER chi "SELECT䏿˜¯åªè¯»è¯­å¥ï¼Œç¦ç”¨è®¡æ—¶å™¨" @@ -8921,7 +8903,6 @@ ER_VERS_ENGINE_UNSUPPORTED eng "Transaction-precise system versioning for %`s is not supported" ER_UNUSED_23 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_PARTITION_WRONG_TYPE @@ -8941,7 +8922,6 @@ ER_VERS_DROP_PARTITION_INTERVAL eng "Can only drop oldest partitions when rotating by INTERVAL" ER_UNUSED_25 - chi "你永远ä¸åº”该看到它" eng "You should never see it" WARN_VERS_PART_NON_HISTORICAL chi "分区%`s包å«éžåކ岿•°æ®" @@ -9016,7 +8996,6 @@ ER_VERS_ALREADY_VERSIONED eng "Table %`s is already system-versioned" ER_UNUSED_24 - chi "你永远ä¸åº”该看到它" eng "You should never see it" ER_VERS_NOT_SUPPORTED From 22e5a5ff6eb5e92a049c688953115f8a4bae1a41 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 30 Jun 2023 20:51:17 +0200 Subject: [PATCH 075/171] generalize ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT make it "query reached result may be incomplete" --- include/mysql.h | 1 + mysql-test/main/information_schema.result | 2 +- mysql-test/main/limit_rows_examined.result | 124 ++++++++++----------- mysql-test/main/subselect4.result | 2 +- sql/share/errmsg-utf8.txt | 5 +- sql/sql_select.cc | 6 +- sql/sql_union.cc | 6 +- 7 files changed, 73 insertions(+), 73 deletions(-) diff --git a/include/mysql.h b/include/mysql.h index 2a96effcf93..3bc07d9c480 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -148,6 +148,7 @@ typedef unsigned long long my_ulonglong; #define ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN #define ER_UNSUPPORTED_ACTION_ON_VIRTUAL_COLUMN ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN #define ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS +#define ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT ER_QUERY_RESULT_INCOMPLETE typedef struct st_mysql_rows { struct st_mysql_rows *next; /* list of rows */ diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index 6686d451dd8..2160eee08a7 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -2228,7 +2228,7 @@ SCHEMA_NAME SELECT * FROM INFORMATION_SCHEMA.`COLUMNS` LIMIT ROWS EXAMINED 10; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT IS_GENERATED GENERATION_EXPRESSION Warnings: -Warning 1931 Query execution was interrupted. The query examined at least ### rows, which exceeds LIMIT ROWS EXAMINED (10). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 10. The query result may be incomplete # # MDEV-24179: AAssertion `m_status == DA_ERROR || m_status == DA_OK || # m_status == DA_OK_BULK' failed in Diagnostics_area::message() diff --git a/mysql-test/main/limit_rows_examined.result b/mysql-test/main/limit_rows_examined.result index e87dd25cac9..dfeb61043f9 100644 --- a/mysql-test/main/limit_rows_examined.result +++ b/mysql-test/main/limit_rows_examined.result @@ -22,7 +22,7 @@ select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 2; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete explain select * from t1i, t2i where c1 = c2 LIMIT ROWS EXAMINED 4; id select_type table type possible_keys key key_len ref rows Extra @@ -32,7 +32,7 @@ select * from t1i, t2i where c1 = c2 LIMIT ROWS EXAMINED 4; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 5 rows, which exceeds LIMIT ROWS EXAMINED (4). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 4. The query result may be incomplete Blocked nested loops join, empty result set because of blocking set @@join_cache_level=1; explain @@ -44,7 +44,7 @@ select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 6; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete explain select * from t1i, t2i where c1 = c2 LIMIT ROWS EXAMINED 6; id select_type table type possible_keys key key_len ref rows Extra @@ -55,7 +55,7 @@ c1 c2 bb bb cc cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete set @@join_cache_level=6; explain select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 3; @@ -65,7 +65,7 @@ id select_type table type possible_keys key key_len ref rows Extra select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 3; c1 c2 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 4 rows, which exceeds LIMIT ROWS EXAMINED (3). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 3. The query result may be incomplete explain select * from t1i, t2i where c1 = c2 LIMIT ROWS EXAMINED 6; id select_type table type possible_keys key key_len ref rows Extra @@ -76,7 +76,7 @@ c1 c2 bb bb cc cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete Mix LIMIT ROWS EXAMINED with LIMIT set @@join_cache_level=0; explain @@ -125,7 +125,7 @@ id select_type table type possible_keys key key_len ref rows Extra select * from t0, t1 where c0 = 'bb' and c1 > c0 LIMIT ROWS EXAMINED 0; c0 c1 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 2 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete set @@join_cache_level = @save_join_cache_level; drop table t0; ========================================================================= @@ -139,7 +139,7 @@ execute st1 using @l; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete deallocate prepare st1; User variable (not supported for LIMIT in MariaDB 5.3/MySQL 5.1) select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED @l; @@ -153,7 +153,7 @@ call test_limit_rows(3); c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 4 rows, which exceeds LIMIT ROWS EXAMINED (3). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 3. The query result may be incomplete drop procedure test_limit_rows; set @@join_cache_level = @save_join_cache_level; ========================================================================= @@ -165,14 +165,14 @@ UNION c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete (select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 0) UNION (select * from t1, t2 where c1 < c2 LIMIT ROWS EXAMINED 6); c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 0 UNION select * from t1, t2 where c1 < c2 LIMIT ROWS EXAMINED 6; @@ -185,7 +185,7 @@ LIMIT ROWS EXAMINED 6; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete (select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 0) UNION (select * from t1, t2 where c1 < c2 LIMIT ROWS EXAMINED 0) @@ -193,7 +193,7 @@ LIMIT 1 ROWS EXAMINED 6; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete (select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 0) UNION (select * from t1, t2 where c1 < c2 LIMIT ROWS EXAMINED 0) @@ -202,7 +202,7 @@ c1 c2 bb bb cc cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (10). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 10. The query result may be incomplete ========================================================================= Subqueries (with several LIMIT ROWS EXAMINED clauses) ========================================================================= @@ -219,7 +219,7 @@ where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 11); c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ') @@ -234,7 +234,7 @@ LIMIT ROWS EXAMINED 11; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0) @@ -249,7 +249,7 @@ LIMIT ROWS EXAMINED 11; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete explain select * from t1i where c1 IN (select * from t2i where c2 > ' ') @@ -264,7 +264,7 @@ c1 bb cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete Subqueries with IN-TO-EXISTS set @@optimizer_switch='semijoin=off,in_to_exists=on,materialization=off'; explain @@ -278,7 +278,7 @@ where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 4); c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 5 rows, which exceeds LIMIT ROWS EXAMINED (4). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 4. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ') @@ -292,7 +292,7 @@ LIMIT ROWS EXAMINED 4; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 5 rows, which exceeds LIMIT ROWS EXAMINED (4). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 4. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0) @@ -306,7 +306,7 @@ LIMIT ROWS EXAMINED 4; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 5 rows, which exceeds LIMIT ROWS EXAMINED (4). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 4. The query result may be incomplete explain select * from t1i where c1 IN (select * from t2i where c2 > ' ') @@ -320,7 +320,7 @@ LIMIT ROWS EXAMINED 9; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (9). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 9. The query result may be incomplete Same as above, without subquery cache set @@optimizer_switch='subquery_cache=off'; select * from t1 @@ -328,28 +328,28 @@ where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 2); c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete select * from t1 where c1 IN (select * from t2 where c2 > ' ') LIMIT ROWS EXAMINED 2; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0) LIMIT ROWS EXAMINED 2; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete select * from t1i where c1 IN (select * from t2i where c2 > ' ') LIMIT ROWS EXAMINED 5; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete Subqueries with materialization set @@optimizer_switch='semijoin=off,in_to_exists=off,materialization=on,subquery_cache=on'; explain @@ -363,7 +363,7 @@ where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 13); c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 14 rows, which exceeds LIMIT ROWS EXAMINED (13). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 13. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ') LIMIT ROWS EXAMINED 13; @@ -375,7 +375,7 @@ where c1 IN (select * from t2 where c2 > ' ') LIMIT ROWS EXAMINED 13; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 14 rows, which exceeds LIMIT ROWS EXAMINED (13). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 13. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0) @@ -389,7 +389,7 @@ LIMIT ROWS EXAMINED 13; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 14 rows, which exceeds LIMIT ROWS EXAMINED (13). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 13. The query result may be incomplete explain select * from t1i where c1 IN (select * from t2i where c2 > ' ') LIMIT ROWS EXAMINED 17; @@ -401,7 +401,7 @@ where c1 IN (select * from t2i where c2 > ' ') LIMIT ROWS EXAMINED 17; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 18 rows, which exceeds LIMIT ROWS EXAMINED (17). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 17. The query result may be incomplete set @@optimizer_switch='default'; ========================================================================= Views and derived tables @@ -422,18 +422,18 @@ bb cc dd Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 18 rows, which exceeds LIMIT ROWS EXAMINED (17). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 17. The query result may be incomplete select * from v1 LIMIT ROWS EXAMINED 16; c1 bb cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 17 rows, which exceeds LIMIT ROWS EXAMINED (16). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 16. The query result may be incomplete select * from v1 LIMIT ROWS EXAMINED 11; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete drop view v1; explain select * @@ -451,7 +451,7 @@ LIMIT ROWS EXAMINED 11; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete ========================================================================= Aggregation ========================================================================= @@ -474,16 +474,16 @@ id select_type table type possible_keys key key_len ref rows Extra select c1, sum(c2) from t3 group by c1 LIMIT ROWS EXAMINED 0; c1 sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete select c1, sum(c2) from t3 group by c1 LIMIT ROWS EXAMINED 1; c1 sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (1). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 1. The query result may be incomplete select c1, sum(c2) from t3 group by c1 LIMIT ROWS EXAMINED 20; c1 sum(c2) aa 3 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 21 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 20. The query result may be incomplete select c1, sum(c2) from t3 group by c1 LIMIT ROWS EXAMINED 21; c1 sum(c2) aa 3 @@ -501,16 +501,16 @@ id select_type table type possible_keys key key_len ref rows Extra select c1, sum(c2) from t3i group by c1 LIMIT ROWS EXAMINED 0; c1 sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete select c1, sum(c2) from t3i group by c1 LIMIT ROWS EXAMINED 1; c1 sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (1). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 1. The query result may be incomplete select c1, sum(c2) from t3i group by c1 LIMIT ROWS EXAMINED 20; c1 sum(c2) aa 3 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 21 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 20. The query result may be incomplete select c1, sum(c2) from t3i group by c1 LIMIT ROWS EXAMINED 21; c1 sum(c2) aa 3 @@ -523,14 +523,14 @@ id select_type table type possible_keys key key_len ref rows Extra select min(c2) from t3 LIMIT ROWS EXAMINED 5; min(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select max(c2) from t3 LIMIT ROWS EXAMINED 6; max(c2) 5 select max(c2) from t3 LIMIT ROWS EXAMINED 0; max(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete explain select max(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 5; id select_type table type possible_keys key key_len ref rows Extra @@ -538,14 +538,14 @@ id select_type table type possible_keys key key_len ref rows Extra select max(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 5; max(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select max(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 6; max(c2) NULL select max(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 0; max(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete explain select count(c2) from t3 LIMIT ROWS EXAMINED 5; id select_type table type possible_keys key key_len ref rows Extra @@ -553,14 +553,14 @@ id select_type table type possible_keys key key_len ref rows Extra select count(c2) from t3 LIMIT ROWS EXAMINED 5; count(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select count(c2) from t3 LIMIT ROWS EXAMINED 6; count(c2) 5 select count(c2) from t3 LIMIT ROWS EXAMINED 0; count(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete explain select count(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 5; id select_type table type possible_keys key key_len ref rows Extra @@ -568,7 +568,7 @@ id select_type table type possible_keys key key_len ref rows Extra select count(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 5; count(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select count(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 6; count(c2) 0 @@ -579,7 +579,7 @@ id select_type table type possible_keys key key_len ref rows Extra select sum(c2) from t3 LIMIT ROWS EXAMINED 5; sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select sum(c2) from t3 LIMIT ROWS EXAMINED 6; sum(c2) 15 @@ -618,7 +618,7 @@ c1 c2 aa 1 aa 2 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete explain select c1, c2 from t3i order by c2, c1 desc LIMIT ROWS EXAMINED 2; id select_type table type possible_keys key key_len ref rows Extra @@ -634,14 +634,14 @@ CREATE TABLE t4 (a int); INSERT INTO t4 values (1), (2); INSERT IGNORE INTO t4 SELECT a + 2 FROM t4 LIMIT ROWS EXAMINED 0; Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete select * from t4; a 1 2 INSERT INTO t4 SELECT a + 2 FROM t4 LIMIT ROWS EXAMINED 6; Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete select * from t4; a 1 @@ -692,7 +692,7 @@ WHERE EXISTS (SELECT c FROM t3 LEFT JOIN t2 ON b = d) HAVING field1 > 'aaa' LIMIT ROWS EXAMINED 20; field1 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 21 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 20. The query result may be incomplete EXPLAIN SELECT DISTINCT a FROM t1, t2 HAVING a > ' ' LIMIT ROWS EXAMINED 14; id select_type table type possible_keys key key_len ref rows Extra @@ -702,13 +702,13 @@ SELECT DISTINCT a FROM t1, t2 HAVING a > ' ' LIMIT ROWS EXAMINED 14; a USA Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 15 rows, which exceeds LIMIT ROWS EXAMINED (14). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 14. The query result may be incomplete SELECT DISTINCT a FROM t1, t2 HAVING a > ' ' LIMIT ROWS EXAMINED 15; a USA CAN Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 16 rows, which exceeds LIMIT ROWS EXAMINED (15). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 15. The query result may be incomplete SELECT DISTINCT a FROM t1, t2 HAVING a > ' ' LIMIT ROWS EXAMINED 16; a USA @@ -753,7 +753,7 @@ GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 120; field1 field2 field3 field4 field5 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 121 rows, which exceeds LIMIT ROWS EXAMINED (120). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 120. The query result may be incomplete SHOW STATUS LIKE 'Handler_read%'; Variable_name Value Handler_read_first 1 @@ -778,8 +778,8 @@ GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 124; field1 field2 field3 field4 field5 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 125 rows, which exceeds LIMIT ROWS EXAMINED (124). The query result may be incomplete -Warning 1931 Query execution was interrupted. The query examined at least 127 rows, which exceeds LIMIT ROWS EXAMINED (124). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 124. The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 124. The query result may be incomplete SHOW STATUS LIKE 'Handler_read%'; Variable_name Value Handler_read_first 1 @@ -822,7 +822,7 @@ WHERE b <= alias1.b OR e != alias2.c ) LIMIT ROWS EXAMINED 20; a b c Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 25 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 20. The query result may be incomplete drop table t1, t2, t3; MDEV-174: LIMIT ROWS EXAMINED: Assertion `0' failed in net_end_statement(THD*) @@ -839,7 +839,7 @@ WHERE c = (SELECT MAX(b) FROM t2) LIMIT ROWS EXAMINED 3; (SELECT MAX(c) FROM t1, t2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (3). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 3. The query result may be incomplete drop table t1, t2; MDEV-178: LIMIT ROWS EXAMINED: Assertion `0' failed in net_end_statement(THD*) on the @@ -856,12 +856,12 @@ EXECUTE ps; a 3 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 22 rows, which exceeds LIMIT ROWS EXAMINED (21). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 21. The query result may be incomplete EXECUTE ps; a 3 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 22 rows, which exceeds LIMIT ROWS EXAMINED (21). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 21. The query result may be incomplete drop view v; drop table t1, t2; # @@ -876,7 +876,7 @@ INSERT INTO t1 (k,c) VALUES(0,'0'), (0,'0'),(0,'0'),(0,'0'),(0,'0'),(0,'0'),(0,' SET @@sql_mode='STRICT_TRANS_TABLES'; INSERT INTO t1 (c) SELECT k FROM t1 LIMIT ROWS EXAMINED 2; Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete SET @@sql_mode=@old_mode; DROP TABLE t1; # diff --git a/mysql-test/main/subselect4.result b/mysql-test/main/subselect4.result index 259337cf646..9dcf05c8565 100644 --- a/mysql-test/main/subselect4.result +++ b/mysql-test/main/subselect4.result @@ -2760,7 +2760,7 @@ from t2 join t1 on ('i','w') not in (select t1.v1,t4.v2 from t4,t1,t3 where t3.v2 = t1.v1) LIMIT ROWS EXAMINED 500; 1 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3020 rows, which exceeds LIMIT ROWS EXAMINED (500). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 500. The query result may be incomplete SET join_cache_level= @save_join_cache_level; DROP TABLE t1,t2,t3,t4; # diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index dff2319a99c..eda61fbe218 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -8084,9 +8084,8 @@ ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SKIP_REPLICATION ER_STORED_FUNCTION_PREVENTS_SWITCH_SKIP_REPLICATION chi "无法修改存储函数或触å‘器内的@@session.skip_replication" eng "Cannot modify @@session.skip_replication inside a stored function or trigger" -ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT - chi "查询执行被中断。查询检查至少%llu行,超过é™åˆ¶è¡Œï¼ˆ%llu)。查询结果å¯èƒ½æ˜¯ä¸å®Œæ•´çš„" - eng "Query execution was interrupted. The query examined at least %llu rows, which exceeds LIMIT ROWS EXAMINED (%llu). The query result may be incomplete" +ER_QUERY_RESULT_INCOMPLETE + eng "Query execution was interrupted. The query exceeded %s %llu. The query result may be incomplete" ER_NO_SUCH_TABLE_IN_ENGINE 42S02 chi "表'%-.192s.%-.192s'在引擎中ä¸å­˜åœ¨" eng "Table '%-.192s.%-.192s' doesn't exist in engine" diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 821394cf6d0..5955cbef8dd 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -467,9 +467,9 @@ bool handle_select(THD *thd, LEX *lex, select_result *result, bool saved_abort_on_warning= thd->abort_on_warning; thd->abort_on_warning= false; push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT, - ER_THD(thd, ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT), - thd->accessed_rows_and_keys, + ER_QUERY_RESULT_INCOMPLETE, + ER_THD(thd, ER_QUERY_RESULT_INCOMPLETE), + "LIMIT ROWS EXAMINED", thd->lex->limit_rows_examined->val_uint()); thd->abort_on_warning= saved_abort_on_warning; thd->reset_killed(); diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 0f218b73b16..bc33f827084 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1658,9 +1658,9 @@ bool st_select_lex_unit::exec() the current result. */ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT, - ER_THD(thd, ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT), - thd->accessed_rows_and_keys, + ER_QUERY_RESULT_INCOMPLETE, + ER_THD(thd, ER_QUERY_RESULT_INCOMPLETE), + "LIMIT ROWS EXAMINED", thd->lex->limit_rows_examined->val_uint()); thd->reset_killed(); break; From 5c81c50f107896feb930cd3aaf795fe8e1635eec Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 30 Jun 2023 21:03:29 +0200 Subject: [PATCH 076/171] MDEV-31214 Recursive CTE execution is interrupted without errors or warnings --- mysql-test/main/cte_recursive.result | 4 ++++ sql/sql_derived.cc | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/mysql-test/main/cte_recursive.result b/mysql-test/main/cte_recursive.result index 8de8a571052..0b7b216f1fe 100644 --- a/mysql-test/main/cte_recursive.result +++ b/mysql-test/main/cte_recursive.result @@ -1214,6 +1214,8 @@ generation name 2 Grandma Ann 2 Grandma Sally 2 Grandpa Ben +Warnings: +Warning 1931 Query execution was interrupted. The query exceeded max_recursive_iterations = 1. The query result may be incomplete # query with recursive tables using key access alter table folks add primary key (id); explain @@ -2592,6 +2594,8 @@ select * from applied_modules; m m1 m2 +Warnings: +Warning 1931 Query execution was interrupted. The query exceeded max_recursive_iterations = 2. The query result may be incomplete drop table value_nodes, module_nodes, module_arguments, module_results; # # mdev-12519: recursive references in subqueries diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index c8a335497e9..107ac31cd4e 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -1142,7 +1142,14 @@ bool TABLE_LIST::fill_recursive(THD *thd) while (!rc && !with->all_are_stabilized()) { if (with->level > thd->variables.max_recursive_iterations) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_QUERY_RESULT_INCOMPLETE, + ER_THD(thd, ER_QUERY_RESULT_INCOMPLETE), + "max_recursive_iterations =", + (ulonglong)thd->variables.max_recursive_iterations); break; + } with->prepare_for_next_iteration(); rc= unit->exec_recursive(); } From ea386c9d06ec6bb47e91258d7f0b1f5daf937463 Mon Sep 17 00:00:00 2001 From: Vicentiu Ciorbaru Date: Mon, 5 Jun 2023 11:00:44 +0300 Subject: [PATCH 077/171] Fix use of uninitialized variable The original code generated a warning in gcc 13.1 --- storage/maria/ma_blockrec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index 667cc26758d..436f07ff7e3 100644 --- a/storage/maria/ma_blockrec.c +++ b/storage/maria/ma_blockrec.c @@ -4713,7 +4713,7 @@ int _ma_read_block_record2(MARIA_HA *info, uchar *record, uchar *data, uchar *end_of_data) { MARIA_SHARE *share= info->s; - uchar *UNINIT_VAR(field_length_data), *UNINIT_VAR(blob_buffer), *start_of_data; + uchar *field_length_data= 0, *UNINIT_VAR(blob_buffer), *start_of_data; uint flag, null_bytes, cur_null_bytes, row_extents, field_lengths; my_bool found_blob= 0; MARIA_EXTENT_CURSOR extent; From 922db0642b6321ece41adb3232c1616812143573 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Wed, 28 Jun 2023 14:25:53 +1000 Subject: [PATCH 078/171] MDEV-31421 Fix spider test cleanup This fixes mdev_26541.test, and the new clean_up_spider.inc will be useful for other tests where part of deinit_spider does not apply, e.g. those testing spider initialisation only. --- .../spider/bugfix/r/mdev_26541.result | 5 ++--- .../spider/bugfix/t/mdev_26541.test | 21 ++----------------- .../spider/include/clean_up_spider.inc | 15 +++++++++++++ .../spider/include/deinit_spider.inc | 17 +-------------- 4 files changed, 20 insertions(+), 38 deletions(-) create mode 100644 storage/spider/mysql-test/spider/include/clean_up_spider.inc diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result index b2edaff6918..72921d2e695 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result @@ -1,14 +1,13 @@ # # MDEV-26541 Undefined symbol: _ZTI12ha_partition when attempting to use ha_spider.so in UBSAN builds # -INSTALL PLUGIN spider SONAME 'ha_spider.so'; +INSTALL SONAME 'ha_spider.so'; DROP FUNCTION spider_flush_table_mon_cache; DROP FUNCTION spider_copy_tables; DROP FUNCTION spider_ping_table; DROP FUNCTION spider_bg_direct_sql; DROP FUNCTION spider_direct_sql; -UNINSTALL PLUGIN spider_alloc_mem; -UNINSTALL PLUGIN spider; +UNINSTALL SONAME IF EXISTS "ha_spider"; DROP TABLE IF EXISTS mysql.spider_xa; DROP TABLE IF EXISTS mysql.spider_xa_member; DROP TABLE IF EXISTS mysql.spider_xa_failed_log; diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test index b32e1630494..bf6cb255d02 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test @@ -9,7 +9,7 @@ if (`select not(count(*)) from information_schema.system_variables where variabl # init spider -INSTALL PLUGIN spider SONAME 'ha_spider.so'; +INSTALL SONAME 'ha_spider.so'; let $PLUGIN_NAME= spider_flush_table_mon_cache; let $PLUGIN_EXIST= @@ -20,21 +20,4 @@ while (!$PLUGIN_EXIST) `SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`; } -# deinit spider - -DROP FUNCTION spider_flush_table_mon_cache; -DROP FUNCTION spider_copy_tables; -DROP FUNCTION spider_ping_table; -DROP FUNCTION spider_bg_direct_sql; -DROP FUNCTION spider_direct_sql; -UNINSTALL PLUGIN spider_alloc_mem; -UNINSTALL PLUGIN spider; -DROP TABLE IF EXISTS mysql.spider_xa; -DROP TABLE IF EXISTS mysql.spider_xa_member; -DROP TABLE IF EXISTS mysql.spider_xa_failed_log; -DROP TABLE IF EXISTS mysql.spider_tables; -DROP TABLE IF EXISTS mysql.spider_link_mon_servers; -DROP TABLE IF EXISTS mysql.spider_link_failed_log; -DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery; -DROP TABLE IF EXISTS mysql.spider_table_sts; -DROP TABLE IF EXISTS mysql.spider_table_crd; +--source ../../include/clean_up_spider.inc diff --git a/storage/spider/mysql-test/spider/include/clean_up_spider.inc b/storage/spider/mysql-test/spider/include/clean_up_spider.inc new file mode 100644 index 00000000000..1f0659dc98a --- /dev/null +++ b/storage/spider/mysql-test/spider/include/clean_up_spider.inc @@ -0,0 +1,15 @@ +DROP FUNCTION spider_flush_table_mon_cache; +DROP FUNCTION spider_copy_tables; +DROP FUNCTION spider_ping_table; +DROP FUNCTION spider_bg_direct_sql; +DROP FUNCTION spider_direct_sql; +UNINSTALL SONAME IF EXISTS "ha_spider"; +DROP TABLE IF EXISTS mysql.spider_xa; +DROP TABLE IF EXISTS mysql.spider_xa_member; +DROP TABLE IF EXISTS mysql.spider_xa_failed_log; +DROP TABLE IF EXISTS mysql.spider_tables; +DROP TABLE IF EXISTS mysql.spider_link_mon_servers; +DROP TABLE IF EXISTS mysql.spider_link_failed_log; +DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery; +DROP TABLE IF EXISTS mysql.spider_table_sts; +DROP TABLE IF EXISTS mysql.spider_table_crd; diff --git a/storage/spider/mysql-test/spider/include/deinit_spider.inc b/storage/spider/mysql-test/spider/include/deinit_spider.inc index 51cc075edaa..71c198f95c2 100644 --- a/storage/spider/mysql-test/spider/include/deinit_spider.inc +++ b/storage/spider/mysql-test/spider/include/deinit_spider.inc @@ -28,22 +28,7 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) DROP TABLE IF EXISTS mysql.spider_rewritten_tables; } } -DROP FUNCTION spider_flush_table_mon_cache; -DROP FUNCTION spider_copy_tables; -DROP FUNCTION spider_ping_table; -DROP FUNCTION spider_bg_direct_sql; -DROP FUNCTION spider_direct_sql; -UNINSTALL PLUGIN spider_alloc_mem; -UNINSTALL PLUGIN spider; -DROP TABLE IF EXISTS mysql.spider_xa; -DROP TABLE IF EXISTS mysql.spider_xa_member; -DROP TABLE IF EXISTS mysql.spider_xa_failed_log; -DROP TABLE IF EXISTS mysql.spider_tables; -DROP TABLE IF EXISTS mysql.spider_link_mon_servers; -DROP TABLE IF EXISTS mysql.spider_link_failed_log; -DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery; -DROP TABLE IF EXISTS mysql.spider_table_sts; -DROP TABLE IF EXISTS mysql.spider_table_crd; +--source clean_up_spider.inc if ($VERSION_COMPILE_OS_WIN) { if ($CHILD2_1_MYPORT) From 9856bb4245177cb290f771f1010299acf221c869 Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Sun, 2 Jul 2023 21:16:03 +0200 Subject: [PATCH 079/171] MDEV-31602: Race on rpl_global_gtid_slave_state when starting IO thread Fix that rpl_slave_state::load() was calling rpl_slave_state::update() without holding LOCK_slave_state. Reviewed-by: Monty Signed-off-by: Kristian Nielsen --- sql/rpl_gtid.cc | 17 ++++++++++++++--- sql/rpl_gtid.h | 2 ++ sql/rpl_rli.cc | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/sql/rpl_gtid.cc b/sql/rpl_gtid.cc index 6f2c01383ab..e7ff8924874 100644 --- a/sql/rpl_gtid.cc +++ b/sql/rpl_gtid.cc @@ -45,9 +45,7 @@ rpl_slave_state::update_state_hash(uint64 sub_id, rpl_gtid *gtid, void *hton, there will not be an attempt to delete the corresponding table row before it is even committed. */ - mysql_mutex_lock(&LOCK_slave_state); err= update(gtid->domain_id, gtid->server_id, sub_id, gtid->seq_no, hton, rgi); - mysql_mutex_unlock(&LOCK_slave_state); if (err) { sql_print_warning("Slave: Out of memory during slave state maintenance. " @@ -290,11 +288,24 @@ rpl_slave_state::truncate_hash() int rpl_slave_state::update(uint32 domain_id, uint32 server_id, uint64 sub_id, uint64 seq_no, void *hton, rpl_group_info *rgi) +{ + int res; + mysql_mutex_lock(&LOCK_slave_state); + res= update_nolock(domain_id, server_id, sub_id, seq_no, hton, rgi); + mysql_mutex_unlock(&LOCK_slave_state); + return res; +} + + +int +rpl_slave_state::update_nolock(uint32 domain_id, uint32 server_id, uint64 sub_id, + uint64 seq_no, void *hton, rpl_group_info *rgi) { element *elem= NULL; list_element *list_elem= NULL; DBUG_ASSERT(hton || !loaded); + mysql_mutex_assert_owner(&LOCK_slave_state); if (!(elem= get_element(domain_id))) return 1; @@ -308,7 +319,6 @@ rpl_slave_state::update(uint32 domain_id, uint32 server_id, uint64 sub_id, of all pending MASTER_GTID_WAIT(), so we do not slow down the replication SQL thread. */ - mysql_mutex_assert_owner(&LOCK_slave_state); elem->gtid_waiter= NULL; mysql_cond_broadcast(&elem->COND_wait_gtid); } @@ -1356,6 +1366,7 @@ rpl_slave_state::load(THD *thd, const char *state_from_master, size_t len, { const char *end= state_from_master + len; + mysql_mutex_assert_not_owner(&LOCK_slave_state); if (reset) { if (truncate_state_table(thd)) diff --git a/sql/rpl_gtid.h b/sql/rpl_gtid.h index 081f7e309f4..1a2fb2bae85 100644 --- a/sql/rpl_gtid.h +++ b/sql/rpl_gtid.h @@ -231,6 +231,8 @@ struct rpl_slave_state ulong count() const { return hash.records; } int update(uint32 domain_id, uint32 server_id, uint64 sub_id, uint64 seq_no, void *hton, rpl_group_info *rgi); + int update_nolock(uint32 domain_id, uint32 server_id, uint64 sub_id, + uint64 seq_no, void *hton, rpl_group_info *rgi); int truncate_state_table(THD *thd); void select_gtid_pos_table(THD *thd, LEX_CSTRING *out_tablename); int record_gtid(THD *thd, const rpl_gtid *gtid, uint64 sub_id, diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc index 04fddb3e74b..214650f1e29 100644 --- a/sql/rpl_rli.cc +++ b/sql/rpl_rli.cc @@ -1927,7 +1927,7 @@ rpl_load_gtid_slave_state(THD *thd) for (i= 0; i < array.elements; ++i) { get_dynamic(&array, (uchar *)&tmp_entry, i); - if ((err= rpl_global_gtid_slave_state->update(tmp_entry.gtid.domain_id, + if ((err= rpl_global_gtid_slave_state->update_nolock(tmp_entry.gtid.domain_id, tmp_entry.gtid.server_id, tmp_entry.sub_id, tmp_entry.gtid.seq_no, From 23e252aef2260172c30740391ce2923ae9f59f9b Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Wed, 5 Jul 2023 16:35:01 +0530 Subject: [PATCH 080/171] MDEV-23187 misses resetting collation connection MDEV-23187 misses resetting collation connection causing test failures for 10.5+ bugs. --- mysql-test/main/func_json.result | 2 ++ mysql-test/main/func_json.test | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result index ed719e7b453..a6a8f39bd2d 100644 --- a/mysql-test/main/func_json.result +++ b/mysql-test/main/func_json.result @@ -1293,10 +1293,12 @@ ERROR 42000: Incorrect parameter count in the call to native function 'json_leng SELECT JSON_LENGTH(); ERROR 42000: Incorrect parameter count in the call to native function 'JSON_LENGTH' # MDEV-23187: Assorted assertion failures in json_find_path with certain collations +SET @old_collation_connection= @@COLLATION_CONNECTION; SET COLLATION_CONNECTION= ucs2_unicode_ci; SELECT JSON_VALUE('["foo"]', '$**[0]') AS f; f foo +SET @@COLLATION_CONNECTION= @old_collation_connection; # # End of 10.4 tests # diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test index 9cfde5489e7..ef747efb79d 100644 --- a/mysql-test/main/func_json.test +++ b/mysql-test/main/func_json.test @@ -823,9 +823,13 @@ SELECT JSON_LENGTH(); --echo # MDEV-23187: Assorted assertion failures in json_find_path with certain collations +SET @old_collation_connection= @@COLLATION_CONNECTION; + SET COLLATION_CONNECTION= ucs2_unicode_ci; SELECT JSON_VALUE('["foo"]', '$**[0]') AS f; +SET @@COLLATION_CONNECTION= @old_collation_connection; + --echo # --echo # End of 10.4 tests --echo # From 19cdddf17db22eb19626ffdd2565fe04a347af92 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 6 Jul 2023 13:49:06 +0400 Subject: [PATCH 081/171] A cleanup for MDEV-30932 UBSAN: negation of -X cannot be represented in type .. "mtr --view-protocol func_math" failed because of a too long column names imlicitly generated for the underlying expressions. With --view-protocol they were replaced to "Name_exp_1". Adding column aliases for these expressions. --- mysql-test/main/func_math.result | 8 ++++---- mysql-test/main/func_math.test | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mysql-test/main/func_math.result b/mysql-test/main/func_math.result index c3d7ee20f50..81d0395fe69 100644 --- a/mysql-test/main/func_math.result +++ b/mysql-test/main/func_math.result @@ -3566,11 +3566,11 @@ DROP TABLE t1; SELECT TRUNCATE(0, -9223372036854775808); TRUNCATE(0, -9223372036854775808) 0 -SELECT GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))); -GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))) +SELECT GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))) AS col1; +col1 NULL -SELECT (GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)); -(GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)) +SELECT (GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)) AS col1; +col1 NULL # # End of 10.4 tests diff --git a/mysql-test/main/func_math.test b/mysql-test/main/func_math.test index 4007f81fbee..9db00a54b80 100644 --- a/mysql-test/main/func_math.test +++ b/mysql-test/main/func_math.test @@ -1888,8 +1888,8 @@ DROP TABLE t1; SELECT TRUNCATE(0, -9223372036854775808); --disable_warnings -SELECT GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))); -SELECT (GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)); +SELECT GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))) AS col1; +SELECT (GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)) AS col1; --enable_warnings --echo # From 29bc61912e44996643c1095399406b0106c1d7f4 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 5 Jul 2023 23:27:17 +0400 Subject: [PATCH 082/171] A cleanup for MDEV-31578 DECLARE CURSOR: "Memory not freed: 280 bytes lost" on syntax error Removing the method LEX::delete_if_not_sp_lex_in_use(). It was not really used. --- sql/sql_lex.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 5538fdd04e6..2e3ce7d7503 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -3429,11 +3429,7 @@ public: sp_head *sphead; sp_name *spname; bool sp_lex_in_use; // Keep track on lex usage in SPs for error handling - void delete_if_not_sp_lex_in_use() - { - if (!sp_lex_in_use) - delete this; - } + sp_pcontext *spcont; st_sp_chistics sp_chistics; From 1bfd3cc457c46b7a5f070f9395146cf815c100d7 Mon Sep 17 00:00:00 2001 From: Vlad Lesin Date: Mon, 3 Jul 2023 16:04:15 +0300 Subject: [PATCH 083/171] MDEV-10962 Deadlock with 3 concurrent DELETEs by unique key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PROBLEM: A deadlock was possible when a transaction tried to "upgrade" an already held Record Lock to Next Key Lock. SOLUTION: This patch is based on observations that: (1) a Next Key Lock is equivalent to Record Lock combined with Gap Lock (2) a GAP Lock never has to wait for any other lock In case we request a Next Key Lock, we check if we already own a Record Lock of equal or stronger mode, and if so, then we change the requested lock type to GAP Lock, which we either already have, or can be granted immediately, as GAP locks don't conflict with any other lock types. (We don't consider Insert Intention Locks a Gap Lock in above statements). The reason of why we don't upgrage Record Lock to Next Key Lock is the following. Imagine a transaction which does something like this: for each row { request lock in LOCK_X|LOCK_REC_NOT_GAP mode request lock in LOCK_S mode } If we upgraded lock from Record Lock to Next Key lock, there would be created only two lock_t structs for each page, one for LOCK_X|LOCK_REC_NOT_GAP mode and one for LOCK_S mode, and then used their bitmaps to mark all records from the same page. The situation would look like this: request lock in LOCK_X|LOCK_REC_NOT_GAP mode on row 1: // -> creates new lock_t for LOCK_X|LOCK_REC_NOT_GAP mode and sets bit for // 1 request lock in LOCK_S mode on row 1: // -> notices that we already have LOCK_X|LOCK_REC_NOT_GAP on the row 1, // so it upgrades it to X request lock in LOCK_X|LOCK_REC_NOT_GAP mode on row 2: // -> creates a new lock_t for LOCK_X|LOCK_REC_NOT_GAP mode (because we // don't have any after we've upgraded!) and sets bit for 2 request lock in LOCK_S mode on row 2: // -> notices that we already have LOCK_X|LOCK_REC_NOT_GAP on the row 2, // so it upgrades it to X ...etc...etc.. Each iteration of the loop creates a new lock_t struct, and in the end we have a lot (one for each record!) of LOCK_X locks, each with single bit set in the bitmap. Soon we run out of space for lock_t structs. If we create LOCK_GAP instead of lock upgrading, the above scenario works like the following: // -> creates new lock_t for LOCK_X|LOCK_REC_NOT_GAP mode and sets bit for // 1 request lock in LOCK_S mode on row 1: // -> notices that we already have LOCK_X|LOCK_REC_NOT_GAP on the row 1, // so it creates LOCK_S|LOCK_GAP only and sets bit for 1 request lock in LOCK_X|LOCK_REC_NOT_GAP mode on row 2: // -> reuses the lock_t for LOCK_X|LOCK_REC_NOT_GAP by setting bit for 2 request lock in LOCK_S mode on row 2: // -> notices that we already have LOCK_X|LOCK_REC_NOT_GAP on the row 2, // so it reuses LOCK_S|LOCK_GAP setting bit for 2 In the end we have just two locks per page, one for each mode: LOCK_X|LOCK_REC_NOT_GAP and LOCK_S|LOCK_GAP. Another benefit of this solution is that it avoids not-entirely const-correct, (and otherwise looking risky) "upgrading". The fix was ported from mysql/mysql-server@bfba840dfa7794b988c59c94658920dbe556075d mysql/mysql-server@75cefdb1f73b8f8ac8e22b10dfb5073adbdfdfb0 Reviewed by: Marko Mäkelä --- .../innodb/r/deadlock_on_lock_upgrade.result | 78 ++++++++++ .../innodb/t/deadlock_on_lock_upgrade.test | 143 ++++++++++++++++++ storage/innobase/include/lock0types.h | 27 ++++ storage/innobase/lock/lock0lock.cc | 71 ++++++++- 4 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/innodb/r/deadlock_on_lock_upgrade.result create mode 100644 mysql-test/suite/innodb/t/deadlock_on_lock_upgrade.test diff --git a/mysql-test/suite/innodb/r/deadlock_on_lock_upgrade.result b/mysql-test/suite/innodb/r/deadlock_on_lock_upgrade.result new file mode 100644 index 00000000000..d015e74c65d --- /dev/null +++ b/mysql-test/suite/innodb/r/deadlock_on_lock_upgrade.result @@ -0,0 +1,78 @@ +# +# Bug #23755664 DEADLOCK WITH 3 CONCURRENT DELETES BY UNIQUE KEY +# +connection default; +CREATE TABLE `t`( +`id` INT, +`a` INT DEFAULT NULL, +PRIMARY KEY(`id`), +UNIQUE KEY `u`(`a`) +) ENGINE=InnoDB; +INSERT INTO t (`id`,`a`) VALUES +(1,1), +(2,9999), +(3,10000); +connect deleter,localhost,root,,; +connect holder,localhost,root,,; +connect waiter,localhost,root,,; +connection deleter; +SET DEBUG_SYNC = +'lock_sec_rec_read_check_and_lock_has_locked + SIGNAL deleter_has_locked + WAIT_FOR waiter_has_locked'; +DELETE FROM t WHERE a = 9999; +connection holder; +SET DEBUG_SYNC= +'now WAIT_FOR deleter_has_locked'; +SET DEBUG_SYNC= +'lock_sec_rec_read_check_and_lock_has_locked SIGNAL holder_has_locked'; +DELETE FROM t WHERE a = 9999; +connection waiter; +SET DEBUG_SYNC= +'now WAIT_FOR holder_has_locked'; +SET DEBUG_SYNC= +'lock_sec_rec_read_check_and_lock_has_locked SIGNAL waiter_has_locked'; +DELETE FROM t WHERE a = 9999; +connection deleter; +connection holder; +connection waiter; +connection default; +disconnect deleter; +disconnect holder; +disconnect waiter; +DROP TABLE `t`; +SET DEBUG_SYNC='reset'; +CREATE TABLE `t`( +`id` INT NOT NULL PRIMARY KEY +) ENGINE=InnoDB; +INSERT INTO t (`id`) VALUES (1), (2); +connect holder,localhost,root,,; +connect waiter,localhost,root,,; +connection holder; +BEGIN; +SELECT id FROM t WHERE id=1 FOR UPDATE; +id +1 +SELECT id FROM t WHERE id=2 FOR UPDATE; +id +2 +connection waiter; +SET DEBUG_SYNC= +'lock_wait_suspend_thread_enter SIGNAL waiter_will_wait'; +SELECT id FROM t WHERE id = 1 FOR UPDATE; +connection holder; +SET DEBUG_SYNC= +'now WAIT_FOR waiter_will_wait'; +SELECT * FROM t FOR UPDATE; +id +1 +2 +COMMIT; +connection waiter; +id +1 +connection default; +disconnect holder; +disconnect waiter; +DROP TABLE `t`; +SET DEBUG_SYNC='reset'; diff --git a/mysql-test/suite/innodb/t/deadlock_on_lock_upgrade.test b/mysql-test/suite/innodb/t/deadlock_on_lock_upgrade.test new file mode 100644 index 00000000000..7f3f34ce063 --- /dev/null +++ b/mysql-test/suite/innodb/t/deadlock_on_lock_upgrade.test @@ -0,0 +1,143 @@ +--echo # +--echo # Bug #23755664 DEADLOCK WITH 3 CONCURRENT DELETES BY UNIQUE KEY +--echo # + +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/count_sessions.inc + +--connection default +# There are various scenarious in which a transaction already holds "half" +# of a record lock (for example, a lock on the record but not on the gap) +# and wishes to "upgrade it" to a full lock (i.e. on both gap and record). +# This is often a cause for a deadlock, if there is another transaction +# which is already waiting for the lock being blocked by us: +# 1. our granted lock for one half +# 2. her waiting lock for the same half +# 3. our waiting lock for the whole + +# +# SCENARIO 1 +# +# In this scenario, three different threads try to delete the same row, +# identified by a secondary index key. +# This kind of operation (besides LOCK_IX on a table) requires +# an LOCK_REC_NOT_GAP|LOCK_REC|LOCK_X lock on a secondary index +# 1. `deleter` is the first to get the required lock +# 2. `holder` enqueues a waiting lock +# 3. `waiter` enqueues right after `holder` +# 4. `deleter` commits, releasing the lock, and granting it to `holder` +# 5. `holder` now observes that the row was deleted, so it needs to +# "seal the gap", by obtaining a LOCK_X|LOCK_REC, but.. +# 6. this causes a deadlock between `holder` and `waiter` +# +# This scenario does not fail if MDEV-10962 is not fixed because of MDEV-30225 +# fix, as the 'holder' does not "seal the gap" after 'deleter' was committed, +# because it was initially sealed, as row_search_mvcc() requests next-key lock +# after MDEV-30225 fix in the case when it requested not-gap lock before the +# fix. +# +# But let the scenario be in the tests, because it can fail if MDEV-30225 +# related code is changed + +CREATE TABLE `t`( + `id` INT, + `a` INT DEFAULT NULL, + PRIMARY KEY(`id`), + UNIQUE KEY `u`(`a`) +) ENGINE=InnoDB; + +INSERT INTO t (`id`,`a`) VALUES + (1,1), + (2,9999), + (3,10000); + +--connect(deleter,localhost,root,,) +--connect(holder,localhost,root,,) +--connect(waiter,localhost,root,,) + + +--connection deleter + SET DEBUG_SYNC = + 'lock_sec_rec_read_check_and_lock_has_locked + SIGNAL deleter_has_locked + WAIT_FOR waiter_has_locked'; + --send DELETE FROM t WHERE a = 9999 + +--connection holder + SET DEBUG_SYNC= + 'now WAIT_FOR deleter_has_locked'; + SET DEBUG_SYNC= + 'lock_sec_rec_read_check_and_lock_has_locked SIGNAL holder_has_locked'; + --send DELETE FROM t WHERE a = 9999 + +--connection waiter + SET DEBUG_SYNC= + 'now WAIT_FOR holder_has_locked'; + SET DEBUG_SYNC= + 'lock_sec_rec_read_check_and_lock_has_locked SIGNAL waiter_has_locked'; + --send DELETE FROM t WHERE a = 9999 + +--connection deleter + --reap + +--connection holder + --reap + +--connection waiter + --reap + +--connection default + +--disconnect deleter +--disconnect holder +--disconnect waiter + +DROP TABLE `t`; +SET DEBUG_SYNC='reset'; + +# SCENARIO 2 +# +# Here, we form a situation in which con1 has LOCK_REC_NOT_GAP on rows 1 and 2 +# con2 waits for lock on row 1, and then con1 wants to upgrade the lock on row 1, +# which might cause a deadlock, unless con1 properly notices that even though the +# lock on row 1 can not be upgraded, a separate LOCK_GAP can be obtaied easily. + +CREATE TABLE `t`( + `id` INT NOT NULL PRIMARY KEY +) ENGINE=InnoDB; + +INSERT INTO t (`id`) VALUES (1), (2); + +--connect(holder,localhost,root,,) +--connect(waiter,localhost,root,,) + +--connection holder + BEGIN; + SELECT id FROM t WHERE id=1 FOR UPDATE; + SELECT id FROM t WHERE id=2 FOR UPDATE; + +--connection waiter + SET DEBUG_SYNC= + 'lock_wait_suspend_thread_enter SIGNAL waiter_will_wait'; + --send SELECT id FROM t WHERE id = 1 FOR UPDATE + +--connection holder + SET DEBUG_SYNC= + 'now WAIT_FOR waiter_will_wait'; + SELECT * FROM t FOR UPDATE; + COMMIT; + +--connection waiter + --reap + +--connection default + +--disconnect holder +--disconnect waiter + +DROP TABLE `t`; +SET DEBUG_SYNC='reset'; + +--source include/wait_until_count_sessions.inc diff --git a/storage/innobase/include/lock0types.h b/storage/innobase/include/lock0types.h index cb04afdf9db..861885fc7a2 100644 --- a/storage/innobase/include/lock0types.h +++ b/storage/innobase/include/lock0types.h @@ -175,6 +175,26 @@ operator<<(std::ostream& out, const lock_rec_t& lock) #endif /* @} */ +/** +Checks if the `mode` is LOCK_S or LOCK_X (possibly ORed with LOCK_WAIT or +LOCK_REC) which means the lock is a +Next Key Lock, a.k.a. LOCK_ORDINARY, as opposed to Predicate Lock, +GAP lock, Insert Intention or Record Lock. +@param mode A mode and flags, of a lock. +@return true if the only bits set in `mode` are LOCK_S or LOCK_X and optionally +LOCK_WAIT or LOCK_REC */ +static inline bool lock_mode_is_next_key_lock(ulint mode) +{ + static_assert(LOCK_ORDINARY == 0, "LOCK_ORDINARY must be 0 (no flags)"); + ut_ad((mode & LOCK_TABLE) == 0); + mode&= ~(LOCK_WAIT | LOCK_REC); + ut_ad((mode & LOCK_WAIT) == 0); + ut_ad((mode & LOCK_TYPE_MASK) == 0); + ut_ad(((mode & ~(LOCK_MODE_MASK)) == LOCK_ORDINARY) == + (mode == LOCK_S || mode == LOCK_X)); + return (mode & ~(LOCK_MODE_MASK)) == LOCK_ORDINARY; +} + /** Lock struct; protected by lock_sys.mutex */ struct ib_lock_t { @@ -231,6 +251,13 @@ struct ib_lock_t return(type_mode & LOCK_REC_NOT_GAP); } + /** @return true if the lock is a Next Key Lock */ + bool is_next_key_lock() const + { + return is_record_lock() + && lock_mode_is_next_key_lock(type_mode); + } + bool is_insert_intention() const { return(type_mode & LOCK_INSERT_INTENTION); diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 26388ad95e2..8e75955c8af 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -1054,6 +1054,14 @@ lock_rec_has_expl( static_cast( precise_mode & LOCK_MODE_MASK)) && !lock_get_wait(lock) + /* If we unfold the following expression, we will see it's + true when: + (heap_no is supremum) + or + (the found lock is LOCK_ORDINARY) + or + (the requested and the found lock modes are equal to each + other and equal to LOCK_REC_GAP | LOCK_REC_NOT_GAP). */ && (!lock_rec_get_rec_not_gap(lock) || (precise_mode & LOCK_REC_NOT_GAP) || heap_no == PAGE_HEAP_NO_SUPREMUM) @@ -1900,6 +1908,46 @@ lock_rec_add_to_queue( type_mode, block, heap_no, index, trx, caller_owns_trx_mutex); } +/** A helper function for lock_rec_lock_slow(), which grants a Next Key Lock +(either LOCK_X or LOCK_S as specified by `mode`) on <`block`,`heap_no`> in the +`index` to the `trx`, assuming that it already has a granted `held_lock`, which +is at least as strong as mode|LOCK_REC_NOT_GAP. It does so by either reusing the +lock if it already covers the gap, or by ensuring a separate GAP Lock, which in +combination with Record Lock satisfies the request. +@param[in] held_lock a lock granted to `trx` which is at least as strong + as mode|LOCK_REC_NOT_GAP +@param[in] mode requested lock mode: LOCK_X or LOCK_S +@param[in] block buffer block containing the record to be locked +@param[in] heap_no heap number of the record to be locked +@param[in] index index of record to be locked +@param[in] trx the transaction requesting the Next Key Lock */ +static void lock_reuse_for_next_key_lock(const lock_t *held_lock, ulint mode, + const buf_block_t *block, + ulint heap_no, dict_index_t *index, + trx_t *trx) +{ + ut_ad(lock_mutex_own()); + ut_ad(trx_mutex_own(trx)); + ut_ad(mode == LOCK_S || mode == LOCK_X); + ut_ad(lock_mode_is_next_key_lock(mode)); + + if (!held_lock->is_record_not_gap()) + { + ut_ad(held_lock->is_next_key_lock()); + return; + } + + /* We have a Record Lock granted, so we only need a GAP Lock. We assume + that GAP Locks do not conflict with anything. Therefore a GAP Lock + could be granted to us right now if we've requested: */ + mode|= LOCK_GAP; + ut_ad(nullptr == lock_rec_other_has_conflicting(mode, block, heap_no, trx)); + + /* It might be the case we already have one, so we first check that. */ + if (lock_rec_has_expl(mode, block, heap_no, trx) == nullptr) + lock_rec_add_to_queue(LOCK_REC | mode, block, heap_no, index, trx, true); +} + /*********************************************************************//** Tries to lock the specified record in the mode requested. If not immediately possible, enqueues a waiting lock request. This is a low-level function @@ -1950,8 +1998,17 @@ lock_rec_lock( lock->type_mode != (ulint(mode) | LOCK_REC) || lock_rec_get_n_bits(lock) <= heap_no) { + + ulint checked_mode= (heap_no != PAGE_HEAP_NO_SUPREMUM && + lock_mode_is_next_key_lock(mode)) + ? mode | LOCK_REC_NOT_GAP + : mode; + + const lock_t *held_lock= + lock_rec_has_expl(checked_mode, block, heap_no, trx); + /* Do nothing if the trx already has a strong enough lock on rec */ - if (!lock_rec_has_expl(mode, block, heap_no, trx)) + if (!held_lock) { if ( #ifdef WITH_WSREP @@ -1978,6 +2035,16 @@ lock_rec_lock( err= DB_SUCCESS_LOCKED_REC; } } + /* If checked_mode == mode, trx already has a strong enough lock on rec */ + else if (checked_mode != mode) + { + /* As check_mode != mode, the mode is Next Key Lock, which can not be + emulated by implicit lock (which are LOCK_REC_NOT_GAP only). */ + ut_ad(!impl); + + lock_reuse_for_next_key_lock(held_lock, mode, block, heap_no, index, + trx); + } } else if (!impl) { @@ -5844,6 +5911,8 @@ lock_sec_rec_read_check_and_lock( ut_ad(lock_rec_queue_validate(FALSE, block, rec, index, offsets)); + DEBUG_SYNC_C("lock_sec_rec_read_check_and_lock_has_locked"); + return(err); } From 94a8921e9dfde960f0ca802f53c4e13f8d5a66bb Mon Sep 17 00:00:00 2001 From: Oleg Smirnov Date: Wed, 5 Jul 2023 19:28:27 +0700 Subject: [PATCH 084/171] MDEV-29284 ANALYZE doesn't work with pushed derived tables There was no actual execution of the SQL of a pushed derived table, which caused "r_rows" to be always displayed as 0 and "r_total_time_ms" to show inaccurate numbers. This commit makes a derived table SQL to be executed by the storage engine, so the server is able to calculate the number of rows returned and measure the execution time more accurately --- .../suite/federated/federatedx_create_handlers.result | 4 ++-- sql/derived_handler.cc | 7 ------- sql/sql_select.h | 2 -- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/mysql-test/suite/federated/federatedx_create_handlers.result b/mysql-test/suite/federated/federatedx_create_handlers.result index 612b89fa04e..666b6863295 100644 --- a/mysql-test/suite/federated/federatedx_create_handlers.result +++ b/mysql-test/suite/federated/federatedx_create_handlers.result @@ -190,7 +190,7 @@ FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t WHERE federated.t3.name=t.name; id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra 1 PRIMARY t3 ALL NULL NULL NULL NULL 7 7.00 100.00 100.00 -1 PRIMARY ref key0 key0 18 federated.t3.name 2 0.00 100.00 100.00 +1 PRIMARY ref key0 key0 18 federated.t3.name 2 1.00 100.00 100.00 2 PUSHED DERIVED NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL SELECT * FROM federated.t3, (SELECT t1.name FROM federated.t1 @@ -241,7 +241,7 @@ ANALYZE "ref": ["federated.t3.name"], "r_loops": 7, "rows": 2, - "r_rows": 0, + "r_rows": 0.1429, "r_total_time_ms": "REPLACED", "filtered": 100, "r_filtered": 100, diff --git a/sql/derived_handler.cc b/sql/derived_handler.cc index adb04e08c63..cddd1200f5d 100644 --- a/sql/derived_handler.cc +++ b/sql/derived_handler.cc @@ -40,7 +40,6 @@ Pushdown_derived::Pushdown_derived(TABLE_LIST *tbl, derived_handler *h) : derived(tbl), handler(h) { - is_analyze= handler->thd->lex->analyze_stmt; } @@ -57,12 +56,6 @@ int Pushdown_derived::execute() if ((err= handler->init_scan())) goto error; - if (is_analyze) - { - handler->end_scan(); - DBUG_RETURN(0); - } - while (!(err= handler->next_row())) { if (unlikely(thd->check_killed())) diff --git a/sql/sql_select.h b/sql/sql_select.h index 9b8bc72bbf9..5c00a77638a 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -2545,8 +2545,6 @@ class derived_handler; class Pushdown_derived: public Sql_alloc { -private: - bool is_analyze; public: TABLE_LIST *derived; derived_handler *handler; From 8fb863e6a4fd322d704088dc39a5849c49549292 Mon Sep 17 00:00:00 2001 From: Yury Chaikou Date: Fri, 7 Jul 2023 10:33:47 +0200 Subject: [PATCH 085/171] MDEV-24712 get_partition_set is never executed in ha_partition::multi_range_key_create_key due to bitwise & with 0 constant use == to compare enum (despite the name it is not a bit flag) --- sql/ha_partition.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index ca02bf16d5e..7dfbf0268b4 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -6265,7 +6265,7 @@ int ha_partition::multi_range_key_create_key(RANGE_SEQ_IF *seq, m_mrr_range_current->ptr= m_mrr_range_current->key_multi_range.ptr; m_mrr_range_current->key_multi_range.ptr= m_mrr_range_current; - if (start_key->key && (start_key->flag & HA_READ_KEY_EXACT)) + if (start_key->key && (start_key->flag == HA_READ_KEY_EXACT)) get_partition_set(table, table->record[0], active_index, start_key, &m_part_spec); else From 02cd3675c4d211118c06478c50a7a515251bc2fc Mon Sep 17 00:00:00 2001 From: Lawrin Novitsky Date: Mon, 22 May 2023 15:07:05 +0200 Subject: [PATCH 086/171] MDEV-31064 Changes in a SP are not immediately seen in I_S.parameters If procedure is changed in one connection, and other procedure has already called the initial version of the procedure, the query to INFORMATION_SCHEMA.PARAMETERS would use obsolete information from sp cache for that connection. That happens because cache invalidating method only increments cache version, and does not flush (all) the cache(s), and changing of a procedure only invalidates cache, and removes the procedure's cache entry from local thread cache only. The fix adds the check if sp info obtained from the cache for forming of results for the query to I_S, is not obsoleted, and does not use it, if it is. The test has been added to main.information_schema. It changes the SP in one connection, and ensures, that the change is seen in the query to the I_S.PARAMETERS in other connection, that already has called the procedure before the change. --- mysql-test/main/information_schema.result | 22 ++++++++++++++++++++++ mysql-test/main/information_schema.test | 22 ++++++++++++++++++++++ sql/sp.cc | 4 +++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index 2160eee08a7..e17bb73d4e7 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -2401,3 +2401,25 @@ progress # # End of 10.3 tests # +# +# MDEV-MDEV-31064 Changes of the procedure are not immediatly seen in queries to I_S.parameter from other connections +# +CREATE PROCEDURE sp1(IN p1 INT, IN p2 INT) +BEGIN +END; +connect con2, localhost, root,,; +CALL sp1(10, 20); +connection default; +CREATE OR REPLACE PROCEDURE sp1(p1 INT) +BEGIN +END; +connection con2; +SELECT COUNT(*) FROM information_schema.parameters WHERE SPECIFIC_NAME = 'sp1'; +COUNT(*) +1 +disconnect con2; +connection default; +DROP PROCEDURE sp1; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/information_schema.test b/mysql-test/main/information_schema.test index b9ed6326350..7b5884ef6b5 100644 --- a/mysql-test/main/information_schema.test +++ b/mysql-test/main/information_schema.test @@ -2114,3 +2114,25 @@ select progress from information_schema.processlist limit 1; --echo # --echo # End of 10.3 tests --echo # + +--echo # +--echo # MDEV-MDEV-31064 Changes of the procedure are not immediatly seen in queries to I_S.parameter from other connections +--echo # +CREATE PROCEDURE sp1(IN p1 INT, IN p2 INT) +BEGIN +END; +--connect(con2, localhost, root,,) +CALL sp1(10, 20); +--connection default +CREATE OR REPLACE PROCEDURE sp1(p1 INT) +BEGIN +END; +--connection con2 +SELECT COUNT(*) FROM information_schema.parameters WHERE SPECIFIC_NAME = 'sp1'; +--disconnect con2 +--connection default +DROP PROCEDURE sp1; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/sql/sp.cc b/sql/sp.cc index af9c7901c5a..87af91187e7 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -3018,7 +3018,9 @@ Sp_handler::sp_load_for_information_schema(THD *thd, TABLE *proc_table, sp_cache **spc= get_cache(thd); sp_name sp_name_obj(&db, &name, true); // This can change "name" *free_sp_head= 0; - if ((sp= sp_cache_lookup(spc, &sp_name_obj))) + sp= sp_cache_lookup(spc, &sp_name_obj); + + if (sp && !(sp->sp_cache_version() < sp_cache_version())) { return sp; } From 12a5fb4b36b573764564eab05cb2575c5a59b471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 10 Jul 2023 13:46:34 +0300 Subject: [PATCH 087/171] MDEV-31641 innochecksum dies with Floating point exception print_summary(): Skip index_ids for which index.pages is 0. Tablespaces may contain some freed pages that used to refer to indexes or tables that were dropped. --- extra/innochecksum.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index 67528827dc0..8adc9ddf05c 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -1192,11 +1192,15 @@ print_summary( fprintf(fil_out, "index_id\t#pages\t\t#leaf_pages\t#recs_per_page" "\t#bytes_per_page\n"); - for (std::map::const_iterator it = index_ids.begin(); - it != index_ids.end(); it++) { - const per_index_stats& index = it->second; + for (const auto &ids : index_ids) { + const per_index_stats& index = ids.second; + if (!index.pages) { + DBUG_ASSERT(index.free_pages); + continue; + } + fprintf(fil_out, "%lld\t\t%lld\t\t%lld\t\t%lld\t\t%lld\n", - it->first, index.pages, index.leaf_pages, + ids.first, index.pages, index.leaf_pages, index.total_n_recs / index.pages, index.total_data_bytes / index.pages); } From 7a5c984fa35fff3f86b553b9dd5171cfb511dae8 Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 10 Jul 2023 18:43:56 +0300 Subject: [PATCH 088/171] MDEV-20010 Equal on two RANK window functions create wrong result The problematic query outlined a bug in window functions sorting optimization. When multiple window functions are present in a query, we sort the sorting key (as defined by PARTITION BY and ORDER BY) from generic to specific. SELECT RANK() OVER (ORDER BY const_col) as r1, RANK() OVER (ORDER BY const_col, a) as r2, RANK() OVER (PARTITION BY c) as r3, RANK() OVER (PARTITION BY c ORDER BY b) as r4 FROM table; For these functions, the sorting we need to do for window function computations are: [(const_col), (const_col, a)] and [(c), (c, b)]. Instead of doing 4 different sort order, the sorts grouped within [] are compatible and we can use the most *specific* sort to cover both window functions. The bug was caused by an incorrect flagging of which sort is most specific for a compatible group of functions. In our specific test case, instead of picking (const_col, a) as the most specific sort, it would only sort by (const_col), which lead to wrong results for rank function. By ensuring that we pick the last sort key before an "incompatible sort" flag is met in our "ordered array of sorting specifications", we guarantee correct results. --- mysql-test/main/cte_recursive.result | 48 ++++++++++++++++++++++++++++ mysql-test/main/cte_recursive.test | 34 ++++++++++++++++++++ sql/sql_window.cc | 2 +- 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/cte_recursive.result b/mysql-test/main/cte_recursive.result index 0b7b216f1fe..63fcb63c7ee 100644 --- a/mysql-test/main/cte_recursive.result +++ b/mysql-test/main/cte_recursive.result @@ -5800,4 +5800,52 @@ a a 9 9 10 10 drop table t1; +# +# MDEV-20010 Equal on two RANK window functions create wrong result +# +create table t1 (a int, b int) engine= innodb; +insert into t1 values (4, -2), (3, -1); +SELECT RANK() OVER (ORDER BY D.C) = RANK() OVER (ORDER BY B.a) FROM +(SELECT 5 AS C FROM t1) as D, (SELECT t1.b AS A FROM t1) AS B; +RANK() OVER (ORDER BY D.C) = RANK() OVER (ORDER BY B.a) +1 +1 +0 +0 +select b, rank() over (order by c) , rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; +b rank() over (order by c) rank() over (order by dt1.b) +-2 1 1 +-2 1 1 +-1 1 3 +-1 1 3 +select b, rank() over (order by c) , rank() over (order by dt1.b), +rank() over (order by c) = rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; +b rank() over (order by c) rank() over (order by dt1.b) rank() over (order by c) = rank() over (order by dt1.b) +-2 1 1 1 +-2 1 1 1 +-1 1 3 0 +-1 1 3 0 +alter table t1 engine=myisam; +select b, rank() over (order by c) , rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; +b rank() over (order by c) rank() over (order by dt1.b) +-2 1 1 +-2 1 1 +-1 1 3 +-1 1 3 +create view v1 as select b,5 as c from t1; +select b, rank() over (order by c) from v1 order by b; +b rank() over (order by c) +-2 1 +-1 1 +drop view v1; +drop table t1; # End of 10.4 tests diff --git a/mysql-test/main/cte_recursive.test b/mysql-test/main/cte_recursive.test index 4d21a494bdc..6053025499a 100644 --- a/mysql-test/main/cte_recursive.test +++ b/mysql-test/main/cte_recursive.test @@ -1,4 +1,5 @@ --source include/default_optimizer_switch.inc +--source include/have_innodb.inc create table t1 (a int, b varchar(32)); insert into t1 values @@ -4013,4 +4014,37 @@ with cte_e as ( drop table t1; +--echo # +--echo # MDEV-20010 Equal on two RANK window functions create wrong result +--echo # + +create table t1 (a int, b int) engine= innodb; +insert into t1 values (4, -2), (3, -1); + +SELECT RANK() OVER (ORDER BY D.C) = RANK() OVER (ORDER BY B.a) FROM +(SELECT 5 AS C FROM t1) as D, (SELECT t1.b AS A FROM t1) AS B; + +select b, rank() over (order by c) , rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; + +select b, rank() over (order by c) , rank() over (order by dt1.b), +rank() over (order by c) = rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; + +alter table t1 engine=myisam; +select b, rank() over (order by c) , rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; + +create view v1 as select b,5 as c from t1; +select b, rank() over (order by c) from v1 order by b; + +drop view v1; +drop table t1; + --echo # End of 10.4 tests diff --git a/sql/sql_window.cc b/sql/sql_window.cc index ff7554b0cd7..df43efe18a4 100644 --- a/sql/sql_window.cc +++ b/sql/sql_window.cc @@ -3076,7 +3076,7 @@ bool Window_funcs_sort::setup(THD *thd, SQL_SELECT *sel, spec= win_func->window_spec; int win_func_order_elements= spec->partition_list->elements + spec->order_list->elements; - if (win_func_order_elements > longest_order_elements) + if (win_func_order_elements >= longest_order_elements) { win_func_with_longest_order= win_func; longest_order_elements= win_func_order_elements; From 23d53913fb61fc4f19ff800577e11e199d546347 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Thu, 15 Jun 2023 15:18:40 +1000 Subject: [PATCH 089/171] MDEV-27038 Custom configuration file procedure does not work with Docker Desktop for Windows 10+ Docker when mounting a configuration file into a Windows exposes the file with permission 0777. These world writable files are ignored by by MariaDB. Add the access check such that filesystem RO or immutable file is counted as sufficient protection on the file. Test: $ mkdir /tmp/src $ vi /tmp/src/my.cnf $ chmod 666 /tmp/src/my.cnf $ mkdir /tmp/dst $ sudo mount --bind /tmp/src /tmp/dst -o ro $ ls -la /tmp/dst total 4 drwxr-xr-x. 2 dan dan 60 Jun 15 15:12 . drwxrwxrwt. 25 root root 660 Jun 15 15:13 .. -rw-rw-rw-. 1 dan dan 10 Jun 15 15:12 my.cnf $ mount | grep dst tmpfs on /tmp/dst type tmpfs (ro,seclabel,nr_inodes=1048576,inode64) strace client/mariadb --defaults-file=/tmp/dst/my.cnf newfstatat(AT_FDCWD, "/tmp/dst/my.cnf", {st_mode=S_IFREG|0666, st_size=10, ...}, 0) = 0 access("/tmp/dst/my.cnf", W_OK) = -1 EROFS (Read-only file system) openat(AT_FDCWD, "/tmp/dst/my.cnf", O_RDONLY|O_CLOEXEC) = 3 The one failing test, but this isn't a regression, just not a total fix: $ chmod u-w /tmp/src/my.cnf $ ls -la /tmp/src/my.cnf -r--rw-rw-. 1 dan dan 18 Jun 16 10:22 /tmp/src/my.cnf $ strace -fe trace=access client/mariadb --defaults-file=/tmp/dst/my.cnf access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) access("/etc/system-fips", F_OK) = -1 ENOENT (No such file or directory) access("/tmp/dst/my.cnf", W_OK) = -1 EACCES (Permission denied) Warning: World-writable config file '/tmp/dst/my.cnf' is ignored Windows test (Docker Desktop ~4.21) which was the important one to fix: dan@LAPTOP-5B5P7RCK:~$ docker run --rm -v /mnt/c/Users/danie/Desktop/conf:/etc/mysql/conf.d/:ro -e MARIADB_ROOT_PASSWORD=bob quay.io/m ariadb-foundation/mariadb-devel:10.4-MDEV-27038-ro-mounts-pkgtest ls -la /etc/mysql/conf.d total 4 drwxrwxrwx 1 root root 512 Jun 15 13:57 . drwxr-xr-x 4 root root 4096 Jun 15 07:32 .. -rwxrwxrwx 1 root root 43 Jun 15 13:56 myapp.cnf root@a59b38b45af1:/# strace -fe trace=access mariadb access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) access("/etc/mysql/conf.d/myapp.cnf", W_OK) = -1 EROFS (Read-only file system) --- mysys/my_default.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/mysys/my_default.c b/mysys/my_default.c index 7c6ef8fffa0..1aaf75b88b1 100644 --- a/mysys/my_default.c +++ b/mysys/my_default.c @@ -786,12 +786,27 @@ static int search_default_file_with_ext(Process_option_func opt_handler, if (!my_stat(name,&stat_info,MYF(0))) return 1; /* - Ignore world-writable regular files. - This is mainly done to protect us to not read a file created by - the mysqld server, but the check is still valid in most context. + Ignore world-writable regular files (exceptions apply). + This is mainly done to protect us to not read a file that may be + modified by anyone. + + Also check access so that read only mounted (EROFS) + or immutable files (EPERM) that are suitable protections. + + The main case we are allowing is a container readonly volume mount + from a filesystem that doesn't have unix permissions. This will + have a 0777 permission and access will set errno = EROFS. + + Note if a ROFS has a file with permissions 04n6, access sets errno + EACCESS, rather the ROFS, so in this case we'll error, even though + the ROFS is protecting the file. + + An ideal, race free, implementation would do fstat / fstatvfs / ioctl + for permission, read only filesystem, and immutability resprectively. */ if ((stat_info.st_mode & S_IWOTH) && - (stat_info.st_mode & S_IFMT) == S_IFREG) + (stat_info.st_mode & S_IFMT) == S_IFREG && + (access(name, W_OK) == 0 || (errno != EROFS && errno != EPERM))) { fprintf(stderr, "Warning: World-writable config file '%s' is ignored\n", name); From 9808ebe19539074f2b89779d40e60c7542f4973b Mon Sep 17 00:00:00 2001 From: Brandon Nesterenko Date: Fri, 23 Jun 2023 15:06:53 -0600 Subject: [PATCH 090/171] MDEV-30978: On slave XA COMMIT/XA ROLLBACK fail to return an error in read-only mode Where a read-only server permits writes through replication, it should not permit user connections to commit/rollback XA transactions prepared via replication. The bug reported in MDEV-30978 shows that this can happen. This is because there is no read only check in the XA transaction logic, the most relevant one occurs in ha_commit_trans() for normal statements/transactions. This patch extends the XA transaction logic to check the read only status of the server before performing an XA COMMIT or ROLLBACK. Reviewed By: Andrei Elkin --- mysql-test/main/xa.result | 48 +++++++++++++++++++ mysql-test/main/xa.test | 52 +++++++++++++++++++++ mysql-test/suite/rpl/r/rpl_read_only.result | 20 ++++++++ mysql-test/suite/rpl/t/rpl_read_only.test | 27 +++++++++++ sql/handler.cc | 5 +- sql/sql_class.h | 10 ++++ sql/xa.cc | 32 +++++++++++-- 7 files changed, 187 insertions(+), 7 deletions(-) diff --git a/mysql-test/main/xa.result b/mysql-test/main/xa.result index 75f32a1a0aa..faabf1cf695 100644 --- a/mysql-test/main/xa.result +++ b/mysql-test/main/xa.result @@ -544,6 +544,54 @@ formatID gtrid_length bqual_length data drop table asd; disconnect con_tmp; connection default; +# MDEV-30978: a read-only server should still allow the commit of +# read-only XA transactions +set @sav_read_only=@@global.read_only; +set global read_only=1; +xa start '1'; +select 0; +0 +0 +xa end '1'; +xa prepare '1'; +xa commit '1'; +xa start '2'; +select 0; +0 +0 +xa end '2'; +xa prepare '2'; +xa rollback '2'; +# Read-only disconnect case +connect con1_ro,localhost,root,,; +xa start '3'; +select 0; +0 +0 +xa end '3'; +xa prepare '3'; +disconnect con1_ro; +connection default; +xa recover; +formatID gtrid_length bqual_length data +1 1 0 3 +xa commit '3'; +ERROR XA100: XA_RBROLLBACK: Transaction branch was rolled back +connect con2_ro,localhost,root,,; +xa start '4'; +select 0; +0 +0 +xa end '4'; +xa prepare '4'; +disconnect con2_ro; +connection default; +xa recover; +formatID gtrid_length bqual_length data +1 1 0 4 +xa rollback '4'; +ERROR XA100: XA_RBROLLBACK: Transaction branch was rolled back +set @@global.read_only=@sav_read_only; # # End of 10.5 tests # diff --git a/mysql-test/main/xa.test b/mysql-test/main/xa.test index 408c7e01c9d..e1ca39be9ab 100644 --- a/mysql-test/main/xa.test +++ b/mysql-test/main/xa.test @@ -695,6 +695,58 @@ disconnect con_tmp; --source include/wait_until_disconnected.inc connection default; +--echo # MDEV-30978: a read-only server should still allow the commit of +--echo # read-only XA transactions +set @sav_read_only=@@global.read_only; +set global read_only=1; + +# Commit case +xa start '1'; +select 0; +xa end '1'; +xa prepare '1'; +xa commit '1'; + +# Rollback case +xa start '2'; +select 0; +xa end '2'; +xa prepare '2'; +xa rollback '2'; + +--echo # Read-only disconnect case + +--source include/count_sessions.inc +connect (con1_ro,localhost,root,,); +xa start '3'; +select 0; +xa end '3'; +xa prepare '3'; +disconnect con1_ro; + +connection default; +--source include/wait_until_count_sessions.inc +xa recover; +--error ER_XA_RBROLLBACK +xa commit '3'; + +--source include/count_sessions.inc +connect (con2_ro,localhost,root,,); +xa start '4'; +select 0; +xa end '4'; +xa prepare '4'; +disconnect con2_ro; + +connection default; +--source include/wait_until_count_sessions.inc +xa recover; +--error ER_XA_RBROLLBACK +xa rollback '4'; + +set @@global.read_only=@sav_read_only; + + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/suite/rpl/r/rpl_read_only.result b/mysql-test/suite/rpl/r/rpl_read_only.result index dbcd58a224f..a68b6f6d53e 100644 --- a/mysql-test/suite/rpl/r/rpl_read_only.result +++ b/mysql-test/suite/rpl/r/rpl_read_only.result @@ -139,6 +139,26 @@ insert into t1 values(1006); ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement insert into t2 values(2006); ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement +# +# MDEV-30978: On slave XA COMMIT/XA ROLLBACK fail to return an error in read-only mode +# +# Where a read-only server permits writes through replication, it +# should not permit user connections to commit/rollback XA transactions +# prepared via replication. This test ensure this behavior is prohibited +# +connection master; +xa start '1'; +insert into t1 values (1007); +xa end '1'; +xa prepare '1'; +connection slave; +connection slave2; +xa commit '1'; +ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement +xa rollback '1'; +ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement +connection master; +xa rollback '1'; connection master; drop user test; drop table t1; diff --git a/mysql-test/suite/rpl/t/rpl_read_only.test b/mysql-test/suite/rpl/t/rpl_read_only.test index c4781bbbb3b..6f53221bfa2 100644 --- a/mysql-test/suite/rpl/t/rpl_read_only.test +++ b/mysql-test/suite/rpl/t/rpl_read_only.test @@ -117,6 +117,33 @@ insert into t1 values(1006); --error ER_OPTION_PREVENTS_STATEMENT insert into t2 values(2006); + +--echo # +--echo # MDEV-30978: On slave XA COMMIT/XA ROLLBACK fail to return an error in read-only mode +--echo # +--echo # Where a read-only server permits writes through replication, it +--echo # should not permit user connections to commit/rollback XA transactions +--echo # prepared via replication. This test ensure this behavior is prohibited +--echo # + +# Note: slave's read_only=1 is set prior to this test case + +connection master; +xa start '1'; +insert into t1 values (1007); +xa end '1'; +xa prepare '1'; +sync_slave_with_master; + +connection slave2; +--error ER_OPTION_PREVENTS_STATEMENT +xa commit '1'; +--error ER_OPTION_PREVENTS_STATEMENT +xa rollback '1'; + +connection master; +xa rollback '1'; + ## Cleanup connection master; drop user test; diff --git a/sql/handler.cc b/sql/handler.cc index 7f591b8456c..49e9b0bcbea 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1668,10 +1668,7 @@ int ha_commit_trans(THD *thd, bool all) DEBUG_SYNC(thd, "ha_commit_trans_after_acquire_commit_lock"); } - if (rw_trans && - opt_readonly && - !(thd->security_ctx->master_access & PRIV_IGNORE_READ_ONLY) && - !thd->slave_thread) + if (rw_trans && thd->is_read_only_ctx()) { my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); goto err; diff --git a/sql/sql_class.h b/sql/sql_class.h index c373c0f6a43..f0f5ac47179 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2787,6 +2787,16 @@ public: return m_binlog_filter_state; } + /** + Checks if a user connection is read-only + */ + inline bool is_read_only_ctx() + { + return opt_readonly && + !(security_ctx->master_access & PRIV_IGNORE_READ_ONLY) && + !slave_thread; + } + private: /** Indicate if the current statement should be discarded diff --git a/sql/xa.cc b/sql/xa.cc index b83dcbf2085..35834165b5b 100644 --- a/sql/xa.cc +++ b/sql/xa.cc @@ -601,6 +601,16 @@ bool trans_xa_commit(THD *thd) if (auto xs= xid_cache_search(thd, thd->lex->xid)) { bool xid_deleted= false; + MDL_request mdl_request; + bool rw_trans= (xs->rm_error != ER_XA_RBROLLBACK); + + if (rw_trans && thd->is_read_only_ctx()) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + res= 1; + goto _end_external_xid; + } + res= xa_trans_rolled_back(xs); /* Acquire metadata lock which will ensure that COMMIT is blocked @@ -609,7 +619,6 @@ bool trans_xa_commit(THD *thd) We allow FLUSHer to COMMIT; we assume FLUSHer knows what it does. */ - MDL_request mdl_request; MDL_REQUEST_INIT(&mdl_request, MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT); if (thd->mdl_context.acquire_lock(&mdl_request, @@ -659,7 +668,11 @@ bool trans_xa_commit(THD *thd) DBUG_RETURN(res); } - if (xa_trans_rolled_back(xid_state.xid_cache_element)) + if (thd->transaction->all.is_trx_read_write() && thd->is_read_only_ctx()) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + DBUG_RETURN(TRUE); + } else if (xa_trans_rolled_back(xid_state.xid_cache_element)) { xa_trans_force_rollback(thd); DBUG_RETURN(thd->is_error()); @@ -777,6 +790,15 @@ bool trans_xa_rollback(THD *thd) bool res; bool xid_deleted= false; MDL_request mdl_request; + bool rw_trans= (xs->rm_error != ER_XA_RBROLLBACK); + + if (rw_trans && thd->is_read_only_ctx()) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + res= 1; + goto _end_external_xid; + } + MDL_REQUEST_INIT(&mdl_request, MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT); if (thd->mdl_context.acquire_lock(&mdl_request, @@ -822,7 +844,11 @@ bool trans_xa_rollback(THD *thd) DBUG_RETURN(thd->get_stmt_da()->is_error()); } - if (xid_state.xid_cache_element->xa_state == XA_ACTIVE) + if (thd->transaction->all.is_trx_read_write() && thd->is_read_only_ctx()) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + DBUG_RETURN(TRUE); + } else if (xid_state.xid_cache_element->xa_state == XA_ACTIVE) { xid_state.er_xaer_rmfail(); DBUG_RETURN(TRUE); From b4646c675c09b9152db32bef6b88c27121e40d2e Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Fri, 16 Jun 2023 15:33:51 +0200 Subject: [PATCH 091/171] Misc. small cleanups unrelated to any particular MDEV Signed-off-by: Kristian Nielsen --- sql/log.cc | 4 ++-- sql/sql_class.cc | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sql/log.cc b/sql/log.cc index 67e2d2f5b2a..06ba27c4b79 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -7587,7 +7587,7 @@ MYSQL_BIN_LOG::queue_for_group_commit(group_commit_entry *orig_entry) Setting this flag may or may not be seen by the other thread, but we are safe in any case: The other thread will set queued_by_other under - its LOCK_wait_commit, and we will not check queued_by_other only after + its LOCK_wait_commit, and we will not check queued_by_other until after we have been woken up. */ wfc->opaque_pointer= orig_entry; @@ -7684,7 +7684,7 @@ MYSQL_BIN_LOG::queue_for_group_commit(group_commit_entry *orig_entry) is pointed to by `last` (we do not use NULL to terminate the list). As we process an entry, any waiters for that entry are added at the end of - the list, to be processed in subsequent iterations. The the entry is added + the list, to be processed in subsequent iterations. Then the entry is added to the group_commit_queue. This continues until the list is exhausted, with all entries ever added eventually processed. diff --git a/sql/sql_class.cc b/sql/sql_class.cc index dc58d2a250a..a0d05846ca8 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -7643,7 +7643,7 @@ wait_for_commit::wait_for_prior_commit2(THD *thd) { PSI_stage_info old_stage; wait_for_commit *loc_waitee; - bool backup_lock_released= 0; + bool backup_lock_released= false; /* Release MDL_BACKUP_COMMIT LOCK while waiting for other threads to commit @@ -7653,7 +7653,7 @@ wait_for_commit::wait_for_prior_commit2(THD *thd) */ if (thd->backup_commit_lock && thd->backup_commit_lock->ticket) { - backup_lock_released= 1; + backup_lock_released= true; thd->mdl_context.release_lock(thd->backup_commit_lock->ticket); thd->backup_commit_lock->ticket= 0; } @@ -7706,14 +7706,14 @@ wait_for_commit::wait_for_prior_commit2(THD *thd) use within enter_cond/exit_cond. */ DEBUG_SYNC(thd, "wait_for_prior_commit_killed"); - if (backup_lock_released) + if (unlikely(backup_lock_released)) thd->mdl_context.acquire_lock(thd->backup_commit_lock, thd->variables.lock_wait_timeout); return wakeup_error; end: thd->EXIT_COND(&old_stage); - if (backup_lock_released) + if (unlikely(backup_lock_released)) thd->mdl_context.acquire_lock(thd->backup_commit_lock, thd->variables.lock_wait_timeout); return wakeup_error; From 60bec1d54d320e86f2c09407e1981c901a675c1c Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Sat, 10 Jun 2023 22:36:16 +0200 Subject: [PATCH 092/171] MDEV-13915: STOP SLAVE takes very long time on a busy system At STOP SLAVE, worker threads will continue applying event groups until the end of the current GCO before stopping. This is a left-over from when only conservative mode was available. In optimistic and aggressive mode, often _all_ queued event will be in the same GCO, and slave stop will be needlessly delayed. This patch instead records at STOP SLAVE time the latest (highest sub_id) event group that has started. Then worker threads will continue to apply event groups up to that event group, but skip any following. The result is that each worker thread will complete its currently running event group, and then the slave will stop. If the slave is caught up, and STOP SLAVE is run in the middle of an event group that is already executing in a worker thread, then that event group will be rolled back and the slave stop immediately, as normal. Reviewed-by: Andrei Elkin Signed-off-by: Kristian Nielsen --- sql/rpl_parallel.cc | 27 +++++++++++++-------------- sql/rpl_parallel.h | 10 +++++----- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 6ca582e4f21..98256118909 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -395,12 +395,13 @@ do_gco_wait(rpl_group_info *rgi, group_commit_orderer *gco, } while (wait_count > entry->count_committing_event_groups); } - if (entry->force_abort && wait_count > entry->stop_count) + if (entry->force_abort && rgi->gtid_sub_id > entry->stop_sub_id) { /* - We are stopping (STOP SLAVE), and this event group is beyond the point - where we can safely stop. So return a flag that will cause us to skip, - rather than execute, the following events. + We are stopping (STOP SLAVE), and this event group need not be applied + before we can safely stop. So return a flag that will cause us to skip, + rather than execute, the following events. Once all queued events have + been skipped, the STOP SLAVE is complete (for this thread). */ return true; } @@ -2357,20 +2358,18 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli) are also executed, so that we stop at a consistent point in the binlog stream (per replication domain). - All event groups wait for e->count_committing_event_groups to reach - the value of group_commit_orderer::wait_count before starting to - execute. Thus, at this point we know that any event group with a - strictly larger wait_count are safe to skip, none of them can have - started executing yet. So we set e->stop_count here and use it to - decide in the worker threads whether to continue executing an event - group or whether to skip it, when force_abort is set. + At this point, we are holding LOCK_parallel_entry, and we know that no + event group after e->largest_started_sub_id has started running yet. We + record this value in e->stop_sub_id, and then each event group can check + their own sub_id against it. If their sub_id is strictly larger, then + that event group will be skipped. If we stop due to reaching the START SLAVE UNTIL condition, then we need to continue executing any queued events up to that point. */ e->force_abort= true; - e->stop_count= rli->stop_for_until ? - e->count_queued_event_groups : e->count_committing_event_groups; + e->stop_sub_id= rli->stop_for_until ? + e->current_sub_id : e->largest_started_sub_id; mysql_mutex_unlock(&e->LOCK_parallel_entry); for (j= 0; j < e->rpl_thread_max; ++j) { @@ -2426,7 +2425,7 @@ rpl_parallel::stop_during_until() e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i); mysql_mutex_lock(&e->LOCK_parallel_entry); if (e->force_abort) - e->stop_count= e->count_committing_event_groups; + e->stop_sub_id= e->largest_started_sub_id; mysql_mutex_unlock(&e->LOCK_parallel_entry); } } diff --git a/sql/rpl_parallel.h b/sql/rpl_parallel.h index 650aa06e504..b7304d204ee 100644 --- a/sql/rpl_parallel.h +++ b/sql/rpl_parallel.h @@ -276,13 +276,13 @@ struct rpl_parallel_entry { /* At STOP SLAVE (force_abort=true), we do not want to process all events in the queue (which could unnecessarily delay stop, if a lot of events happen - to be queued). The stop_count provides a safe point at which to stop, so + to be queued). The stop_sub_id provides a safe point at which to stop, so that everything before becomes committed and nothing after does. The value - corresponds to group_commit_orderer::wait_count; if wait_count is less than - or equal to stop_count, we execute the associated event group, else we - skip it (and all following) and stop. + corresponds to rpl_group_info::gtid_sub_id; if that is less than or equal + to stop_sub_id, we execute the associated event group, else we skip it (and + all following) and stop. */ - uint64 stop_count; + uint64 stop_sub_id; /* Cyclic array recording the last rpl_thread_max worker threads that we From a8ea6627a4d3a099e69a88962b71649da8dadfa4 Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Sun, 11 Jun 2023 17:44:58 +0200 Subject: [PATCH 093/171] MDEV-31448: Killing a replica thread awaiting its GCO can hang/crash a parallel replica The problem was an incorrect unmark_start_commit() in signal_error_to_sql_driver_thread(). If an event group gets an error, this unmark could run after the following GCO started, and the subsequent re-marking could access de-allocated GCO. The offending unmark_start_commit() looks obviously incorrect, and the fix is to just remove it. It was introduced in the MDEV-8302 patch, the commit message of which suggests it was added there solely to satisfy an assertion in ha_rollback_trans(). So update this assertion instead to not trigger for event groups that experienced an error (rgi->worker_error). When an error occurs in an event group, all following event groups are skipped anyway, so the unmark should never be needed in this case. Reviewed-by: Andrei Elkin Signed-off-by: Kristian Nielsen --- sql/handler.cc | 13 +++++++++++-- sql/rpl_parallel.cc | 5 ----- sql/rpl_parallel.h | 4 ++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index f7d781eb82f..48ce7b3f1f8 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1898,13 +1898,22 @@ int ha_rollback_trans(THD *thd, bool all) attempt. Otherwise those following transactions can run too early, and possibly cause replication to fail. See comments in retry_event_group(). + (This concerns rollbacks due to temporary errors where the transaction + will be retried afterwards. For non-recoverable errors, following + transactions will not start but just be skipped as the worker threads + perform the error stop). + There were several bugs with this in the past that were very hard to track down (MDEV-7458, MDEV-8302). So we add here an assertion for rollback without signalling following transactions. And in release builds, we explicitly do the signalling before rolling back. */ - DBUG_ASSERT(!(thd->rgi_slave && thd->rgi_slave->did_mark_start_commit)); - if (thd->rgi_slave && thd->rgi_slave->did_mark_start_commit) + DBUG_ASSERT( !(thd->rgi_slave && + !thd->rgi_slave->worker_error && + thd->rgi_slave->did_mark_start_commit)); + if (thd->rgi_slave && + !thd->rgi_slave->worker_error && + thd->rgi_slave->did_mark_start_commit) thd->rgi_slave->unmark_start_commit(); } #endif diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 98256118909..1dab1224286 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -286,16 +286,11 @@ static void signal_error_to_sql_driver_thread(THD *thd, rpl_group_info *rgi, int err) { rgi->worker_error= err; - /* - In case we get an error during commit, inform following transactions that - we aborted our commit. - */ DBUG_EXECUTE_IF("hold_worker2_favor_worker3", { if (rgi->current_gtid.seq_no == 2002) { debug_sync_set_action(thd, STRING_WITH_LEN("now WAIT_FOR cont_worker2")); }}); - rgi->unmark_start_commit(); rgi->cleanup_context(thd, true); rgi->rli->abort_slave= true; rgi->rli->stop_for_until= false; diff --git a/sql/rpl_parallel.h b/sql/rpl_parallel.h index b7304d204ee..6b03306692b 100644 --- a/sql/rpl_parallel.h +++ b/sql/rpl_parallel.h @@ -91,6 +91,10 @@ struct group_commit_orderer { }; uint8 flags; #ifndef DBUG_OFF + /* + Flag set when the GCO has been freed and entered the free list, to catch + (in debug) errors in the complex lifetime of this object. + */ bool gc_done; #endif }; From 5d61442c85b35ce382ac2afeaad5c19e630b41dd Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Thu, 15 Jun 2023 21:35:53 +0200 Subject: [PATCH 094/171] MDEV-31448: Killing a replica thread awaiting its GCO can hang/crash a parallel replica The problem is that when a worker thread is (user) killed in wait_for_prior_commit, the event group may complete out-of-order since the wait for prior commit was aborted by the kill. This fix ensures that event groups will always complete in-order, even in the error case. This is done in finish_event_group() by doing an extra wait_for_prior_commit(), if necessary, that ignores kills. This fix supersedes the fix for MDEV-30780, so the earlier fix for that is reverted in this patch. Also fix that an error from wait_for_prior_commit() inside finish_event_group() would not signal the error to wakeup_subsequent_commits(). Based on earlier work by Brandon Nesterenko and Andrei Elkin, with some changes to simplify the semantics of wait_for_prior_commit() and make the code more robust to future changes. Reviewed-by: Andrei Elkin Signed-off-by: Kristian Nielsen --- sql/rpl_parallel.cc | 59 ++++++++++++++++++++++++++++++++++++--------- sql/sql_class.cc | 11 +++++++-- sql/sql_class.h | 10 ++++---- 3 files changed, 61 insertions(+), 19 deletions(-) diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 1dab1224286..ed8858d67ba 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -27,6 +27,9 @@ struct rpl_parallel_thread_pool global_rpl_thread_pool; static void signal_error_to_sql_driver_thread(THD *thd, rpl_group_info *rgi, int err); +static void +register_wait_for_prior_event_group_commit(rpl_group_info *rgi, + rpl_parallel_entry *entry); static int rpt_handle_event(rpl_parallel_thread::queued_event *qev, @@ -151,15 +154,35 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, int err; thd->get_stmt_da()->set_overwrite_status(true); + + if (unlikely(rgi->worker_error)) + { + /* + In case a previous wait was killed, we need to re-register to be able to + repeat the wait. + + And before doing that, we un-register any previous registration (in case + we got an error earlier and skipped waiting). + */ + thd->wait_for_commit_ptr->unregister_wait_for_prior_commit(); + mysql_mutex_lock(&entry->LOCK_parallel_entry); + register_wait_for_prior_event_group_commit(rgi, entry); + mysql_mutex_unlock(&entry->LOCK_parallel_entry); + } + /* Remove any left-over registration to wait for a prior commit to complete. Normally, such wait would already have been removed at this point by wait_for_prior_commit() called from within COMMIT - processing. However, in case of MyISAM and no binlog, we might not - have any commit processing, and so we need to do the wait here, - before waking up any subsequent commits, to preserve correct - order of event execution. Also, in the error case we might have - skipped waiting and thus need to remove it explicitly. + processing. + + However, in case of MyISAM and no binlog, we might not have any commit + processing, and so we need to do the wait here, before waking up any + subsequent commits, to preserve correct order of event execution. + + Also, in the error case we might have skipped waiting and thus need to + remove it explicitly. Or the wait might have been killed and we need to + repeat the registration and the wait. It is important in the non-error case to do a wait, not just an unregister. Because we might be last in a group-commit that is @@ -172,8 +195,18 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, all earlier event groups have also committed; this way no more mark_start_commit() calls can be made and it is safe to de-allocate the GCO. + + Thus this final wait is done with kill ignored during the wait. This is + fine, at this point there is no active query or transaction to abort, and + the thread will continue as soon as earlier event groups complete. + + Note though, that in the non-error case there is no guarantee that + finish_event_group() will be run in-order. For example, a successful + binlog group commit will wakeup all participating event groups + simultaneously so only thread scheduling will decide the order in which + finish_event_group() calls acquire LOCK_parallel_entry. */ - err= wfc->wait_for_prior_commit(thd); + err= wfc->wait_for_prior_commit(thd, false); if (unlikely(err) && !rgi->worker_error) signal_error_to_sql_driver_thread(thd, rgi, err); thd->wait_for_commit_ptr= NULL; @@ -242,8 +275,7 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, not yet started should just skip their group, preparing for stop of the SQL driver thread. */ - if (unlikely(rgi->worker_error) && - entry->stop_on_error_sub_id == (uint64)ULONGLONG_MAX) + if (unlikely(rgi->worker_error) && entry->stop_on_error_sub_id > sub_id) entry->stop_on_error_sub_id= sub_id; mysql_mutex_unlock(&entry->LOCK_parallel_entry); #ifdef ENABLED_DEBUG_SYNC @@ -820,12 +852,15 @@ do_retry: for (;;) { mysql_mutex_lock(&entry->LOCK_parallel_entry); - register_wait_for_prior_event_group_commit(rgi, entry); - if (!(entry->stop_on_error_sub_id == (uint64) ULONGLONG_MAX || + if (rgi->gtid_sub_id < entry->stop_on_error_sub_id #ifndef DBUG_OFF - (DBUG_EVALUATE_IF("simulate_mdev_12746", 1, 0)) || + || DBUG_EVALUATE_IF("simulate_mdev_12746", 1, 0) #endif - rgi->gtid_sub_id < entry->stop_on_error_sub_id)) + ) + { + register_wait_for_prior_event_group_commit(rgi, entry); + } + else { /* A failure of a preceeding "parent" transaction may not be diff --git a/sql/sql_class.cc b/sql/sql_class.cc index a0d05846ca8..d2a3cbcf613 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -7635,11 +7635,18 @@ wait_for_commit::register_wait_for_prior_commit(wait_for_commit *waitee) with register_wait_for_prior_commit(). If the commit already completed, returns immediately. + If ALLOW_KILL is set to true (the default), the wait can be aborted by a + kill. In case of kill, the wait registration is still removed, so another + call of unregister_wait_for_prior_commit() is needed to later retry the + wait. If ALLOW_KILL is set to false, then kill will be ignored and this + function will not return until the prior commit (if any) has called + wakeup_subsequent_commits(). + If thd->backup_commit_lock is set, release it while waiting for other threads */ int -wait_for_commit::wait_for_prior_commit2(THD *thd) +wait_for_commit::wait_for_prior_commit2(THD *thd, bool allow_kill) { PSI_stage_info old_stage; wait_for_commit *loc_waitee; @@ -7664,7 +7671,7 @@ wait_for_commit::wait_for_prior_commit2(THD *thd) &stage_waiting_for_prior_transaction_to_commit, &old_stage); while ((loc_waitee= this->waitee.load(std::memory_order_relaxed)) && - likely(!thd->check_killed(1))) + (!allow_kill || likely(!thd->check_killed(1)))) mysql_cond_wait(&COND_wait_commit, &LOCK_wait_commit); if (!loc_waitee) { diff --git a/sql/sql_class.h b/sql/sql_class.h index 4e5aba33443..4487a67c76d 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2144,14 +2144,14 @@ struct wait_for_commit bool commit_started; void register_wait_for_prior_commit(wait_for_commit *waitee); - int wait_for_prior_commit(THD *thd) + int wait_for_prior_commit(THD *thd, bool allow_kill=true) { /* Quick inline check, to avoid function call and locking in the common case where no wakeup is registered, or a registered wait was already signalled. */ if (waitee.load(std::memory_order_acquire)) - return wait_for_prior_commit2(thd); + return wait_for_prior_commit2(thd, allow_kill); else { if (wakeup_error) @@ -2205,7 +2205,7 @@ struct wait_for_commit void wakeup(int wakeup_error); - int wait_for_prior_commit2(THD *thd); + int wait_for_prior_commit2(THD *thd, bool allow_kill); void wakeup_subsequent_commits2(int wakeup_error); void unregister_wait_for_prior_commit2(); @@ -4726,10 +4726,10 @@ public: } wait_for_commit *wait_for_commit_ptr; - int wait_for_prior_commit() + int wait_for_prior_commit(bool allow_kill=true) { if (wait_for_commit_ptr) - return wait_for_commit_ptr->wait_for_prior_commit(this); + return wait_for_commit_ptr->wait_for_prior_commit(this, allow_kill); return 0; } void wakeup_subsequent_commits(int wakeup_error) From d4309d4830c8889286ab586c04dc5545ba9bf0a4 Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Thu, 15 Jun 2023 21:46:01 +0200 Subject: [PATCH 095/171] MDEV-31448: Killing a replica thread awaiting its GCO can hang/crash a parallel replica Various test cases for the bugs around MDEV-31448. Test cases due to Brandon Nesterenko, thanks! Reviewed-by: Andrei Elkin Signed-off-by: Kristian Nielsen --- .../rpl/include/mdev-31448_conservative.inc | 68 +++++++++ .../rpl/include/mdev-31448_optimistic.inc | 94 ++++++++++++ ...ev-31448_kill_ooo_finish_optimistic.result | 52 +++++++ .../suite/rpl/r/rpl_parallel_kill.result | 142 ++++++++++++++++++ ...mdev-31448_kill_ooo_finish_optimistic.test | 93 ++++++++++++ mysql-test/suite/rpl/t/rpl_parallel_kill.test | 15 ++ 6 files changed, 464 insertions(+) create mode 100644 mysql-test/suite/rpl/include/mdev-31448_conservative.inc create mode 100644 mysql-test/suite/rpl/include/mdev-31448_optimistic.inc create mode 100644 mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result create mode 100644 mysql-test/suite/rpl/r/rpl_parallel_kill.result create mode 100644 mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test create mode 100644 mysql-test/suite/rpl/t/rpl_parallel_kill.test diff --git a/mysql-test/suite/rpl/include/mdev-31448_conservative.inc b/mysql-test/suite/rpl/include/mdev-31448_conservative.inc new file mode 100644 index 00000000000..9a2884439f6 --- /dev/null +++ b/mysql-test/suite/rpl/include/mdev-31448_conservative.inc @@ -0,0 +1,68 @@ +--connection master +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +call mtr.add_suppression("Slave: Commit failed due to failure of an earlier commit on which this one depends"); + +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= CONSERVATIVE; +--connection slave1 +BEGIN; +update t1 set a=2 where a=1; + +--connection master +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; + +# GCO 1 +SET @commit_id= 10000; +# T1 +update t1 set a=2 where a=1; +# T2 +insert into t2 values (1); + +# GCO 2 +SET @commit_id= 10001; +# T3 +insert into t1 values (3); + +--connection slave +--source include/start_slave.inc + +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--let $t3_tid= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for prior transaction to start commit%'` +--evalp kill $t3_tid + +--connection slave1 +commit; + +--connection slave +--let $slave_timeout=1032 +--source include/wait_for_slave_sql_to_stop.inc + +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +--source include/start_slave.inc + +--echo # +--echo # Cleanup +--connection master +DROP TABLE t1, t2; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc diff --git a/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc b/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc new file mode 100644 index 00000000000..9b72181d249 --- /dev/null +++ b/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc @@ -0,0 +1,94 @@ +--echo # MDEV-31448 OOO finish event group by killed worker +# The test demonstrates how a killed worker access gco lists +# in finish_event_group() out-of-order to fire +# DBUG_ASSERT(!tmp_gco->next_gco || tmp_gco->last_sub_id > sub_id); +# in the buggy version. + +--echo # Initialize test data +--connection master +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; + +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +call mtr.add_suppression("Connection was killed"); +call mtr.add_suppression("Can.t find record"); + +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= OPTIMISTIC; + +--connection slave1 +begin; +update t1 set a=2 where a=1; + +--connection master +set @old_dbug= @@session.debug_dbug; +set @@session.debug_dbug="+d,binlog_force_commit_id"; + +# GCO 1 +set @commit_id= 10000; +# T1 +update t1 set a=2 where a=1; + +if (!$killed_trx_commits) +{ +set @commit_id= 10001; +# T2 +set statement skip_parallel_replication=1 for insert into t2 values (1); +} + +if ($killed_trx_commits) +{ +insert into t2 values (1); +} +# GCO 2 +# T3 +drop table t2; + +--connection slave +--source include/start_slave.inc + +--echo # wait for T1 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # wait for T2 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc +--let $t2_tid= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'` +--echo # wait for T3 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--evalp kill $t2_tid +# give some little time for T2 to re-sink into the same state +--let $slave_param=Last_Errno +--let $slave_param_value=1927 +--source include/wait_for_slave_param.inc +--connection slave1 +commit; + +--connection slave +--let $slave_timeout=1032 +--source include/wait_for_slave_sql_to_stop.inc + +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +--source include/start_slave.inc + +--echo # +--echo # Cleanup +--connection master +drop table t1; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc + diff --git a/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result b/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result new file mode 100644 index 00000000000..2753e66fe48 --- /dev/null +++ b/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result @@ -0,0 +1,52 @@ +include/master-slave.inc +[connection master] +# MDEV-31448 OOO finish event group by killed worker +# Initialize test data +connection master; +call mtr.add_suppression("Slave: Connection was killed"); +call mtr.add_suppression("Slave: Commit failed due to failure of an earlier commit on which this one depends"); +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@global.slave_parallel_threads= 4; +set @@global.slave_parallel_mode= OPTIMISTIC; +set @@global.innodb_lock_wait_timeout= 30; +set @@global.slave_transaction_retries= 0; +connection slave1; +BEGIN; +SELECT * FROM t1 WHERE a=1 FOR UPDATE; +a +1 +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10000; +update t1 set a=2 where a=1; +set statement skip_parallel_replication=1 for insert into t2 values (1); +drop table t2; +connection slave; +include/start_slave.inc +# wait for T1 +# wait for T2 +# wait for T3 +kill T2_TID; +connection slave1; +ROLLBACK; +connection master; +DROP TABLE t1; +include/save_master_gtid.inc +connection slave; +# +# Cleanup +include/stop_slave.inc +set @@global.slave_parallel_threads= 0; +set @@global.slave_parallel_mode= conservative; +set @@global.innodb_lock_wait_timeout= 50; +set @@global.slave_transaction_retries= 10; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_parallel_kill.result b/mysql-test/suite/rpl/r/rpl_parallel_kill.result new file mode 100644 index 00000000000..7e6b065725b --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_parallel_kill.result @@ -0,0 +1,142 @@ +include/master-slave.inc +[connection master] +connection master; +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +call mtr.add_suppression("Slave: Commit failed due to failure of an earlier commit on which this one depends"); +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= CONSERVATIVE; +connection slave1; +BEGIN; +update t1 set a=2 where a=1; +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10000; +update t1 set a=2 where a=1; +insert into t2 values (1); +SET @commit_id= 10001; +insert into t1 values (3); +connection slave; +include/start_slave.inc +kill $t3_tid; +connection slave1; +commit; +connection slave; +include/wait_for_slave_sql_to_stop.inc +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +include/start_slave.inc +# +# Cleanup +connection master; +DROP TABLE t1, t2; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +# MDEV-31448 OOO finish event group by killed worker +# Initialize test data +connection master; +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +call mtr.add_suppression("Connection was killed"); +call mtr.add_suppression("Can.t find record"); +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= OPTIMISTIC; +connection slave1; +begin; +update t1 set a=2 where a=1; +connection master; +set @old_dbug= @@session.debug_dbug; +set @@session.debug_dbug="+d,binlog_force_commit_id"; +set @commit_id= 10000; +update t1 set a=2 where a=1; +insert into t2 values (1); +drop table t2; +connection slave; +include/start_slave.inc +# wait for T1 +# wait for T2 +# wait for T3 +kill $t2_tid; +include/wait_for_slave_param.inc [Last_Errno] +connection slave1; +commit; +connection slave; +include/wait_for_slave_sql_to_stop.inc +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +include/start_slave.inc +# +# Cleanup +connection master; +drop table t1; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +# MDEV-31448 OOO finish event group by killed worker +# Initialize test data +connection master; +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +call mtr.add_suppression("Connection was killed"); +call mtr.add_suppression("Can.t find record"); +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= OPTIMISTIC; +connection slave1; +begin; +update t1 set a=2 where a=1; +connection master; +set @old_dbug= @@session.debug_dbug; +set @@session.debug_dbug="+d,binlog_force_commit_id"; +set @commit_id= 10000; +update t1 set a=2 where a=1; +set @commit_id= 10001; +set statement skip_parallel_replication=1 for insert into t2 values (1); +drop table t2; +connection slave; +include/start_slave.inc +# wait for T1 +# wait for T2 +# wait for T3 +kill $t2_tid; +include/wait_for_slave_param.inc [Last_Errno] +connection slave1; +commit; +connection slave; +include/wait_for_slave_sql_to_stop.inc +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +include/start_slave.inc +# +# Cleanup +connection master; +drop table t1; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test b/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test new file mode 100644 index 00000000000..ae15ed64a65 --- /dev/null +++ b/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test @@ -0,0 +1,93 @@ +--source include/master-slave.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_binlog_format_row.inc + +--echo # MDEV-31448 OOO finish event group by killed worker +# The test demonstrates how a killed worker access gco lists +# in finish_event_group() out-of-order to fire +# DBUG_ASSERT(!tmp_gco->next_gco || tmp_gco->last_sub_id > sub_id); +# in the buggy version. + +--echo # Initialize test data +--connection master +call mtr.add_suppression("Slave: Connection was killed"); +call mtr.add_suppression("Slave: Commit failed due to failure of an earlier commit on which this one depends"); +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; + +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--let $save_slave_parallel_threads= `SELECT @@global.slave_parallel_threads` +--let $save_slave_parallel_mode= `SELECT @@global.slave_parallel_mode` +--let $save_innodb_lock_wait_timeout= `SELECT @@global.innodb_lock_wait_timeout` +--let $save_transaction_retries= `SELECT @@global.slave_transaction_retries` +set @@global.slave_parallel_threads= 4; +set @@global.slave_parallel_mode= OPTIMISTIC; +set @@global.innodb_lock_wait_timeout= 30; +set @@global.slave_transaction_retries= 0; + +--connection slave1 +BEGIN; +SELECT * FROM t1 WHERE a=1 FOR UPDATE; + +--connection master +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; + +# GCO 1 +SET @commit_id= 10000; +# T1 +update t1 set a=2 where a=1; +# T2 +set statement skip_parallel_replication=1 for insert into t2 values (1); + +# GCO 2 +# T3 +drop table t2; + +--connection slave +--source include/start_slave.inc + +--echo # wait for T1 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # wait for T2 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc +--let $t2_tid= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'` +--echo # wait for T3 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--replace_result $t2_tid T2_TID +--eval kill $t2_tid + +--sleep 1 + +--connection slave1 +# Release the blocked T1 +ROLLBACK; + +--connection master +DROP TABLE t1; +--source include/save_master_gtid.inc + +--connection slave +--echo # +--echo # Cleanup +--source include/stop_slave.inc +eval set @@global.slave_parallel_threads= $save_slave_parallel_threads; +eval set @@global.slave_parallel_mode= $save_slave_parallel_mode; +eval set @@global.innodb_lock_wait_timeout= $save_innodb_lock_wait_timeout; +eval set @@global.slave_transaction_retries= $save_transaction_retries; +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + +--source include/rpl_end.inc + diff --git a/mysql-test/suite/rpl/t/rpl_parallel_kill.test b/mysql-test/suite/rpl/t/rpl_parallel_kill.test new file mode 100644 index 00000000000..563b0aa61e9 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_parallel_kill.test @@ -0,0 +1,15 @@ +--source include/master-slave.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_binlog_format_row.inc + +--source include/mdev-31448_conservative.inc + +--let $killed_trx_commits=1 +--source include/mdev-31448_optimistic.inc +--let $killed_trx_commits=0 +--source include/mdev-31448_optimistic.inc + + + +--source include/rpl_end.inc From 08585b0949c96935b5a7c2651d6d70ec5314af28 Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Tue, 20 Jun 2023 23:23:26 +0200 Subject: [PATCH 096/171] MDEV-31509: Lost data with FTWRL and STOP SLAVE The largest_started_sub_id needs to be set under LOCK_parallel_entry together with testing stop_sub_id. However, in-between was the logic for do_ftwrl_wait(), which temporarily releases the mutex. This could lead to inconsistent stopping amongst worker threads and lost data. Fix by moving all the stop-related logic out from unrelated do_gco_wait() and do_ftwrl_wait() and into its own function do_stop_handling(). Reviewed-by: Andrei Elkin Signed-off-by: Kristian Nielsen --- .../suite/rpl/r/rpl_parallel_ftwrl.result | 105 +++++++++++++ .../suite/rpl/t/rpl_parallel_ftwrl.test | 143 ++++++++++++++++++ sql/rpl_parallel.cc | 77 ++++++++-- 3 files changed, 310 insertions(+), 15 deletions(-) create mode 100644 mysql-test/suite/rpl/r/rpl_parallel_ftwrl.result create mode 100644 mysql-test/suite/rpl/t/rpl_parallel_ftwrl.test diff --git a/mysql-test/suite/rpl/r/rpl_parallel_ftwrl.result b/mysql-test/suite/rpl/r/rpl_parallel_ftwrl.result new file mode 100644 index 00000000000..b6c71055fe7 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_parallel_ftwrl.result @@ -0,0 +1,105 @@ +include/master-slave.inc +[connection master] +connection slave; +include/stop_slave.inc +SET @old_parallel_threads= @@GLOBAL.slave_parallel_threads; +SET GLOBAL slave_parallel_threads=3; +SET @old_parallel_mode= @@GLOBAL.slave_parallel_mode; +SET GLOBAL slave_parallel_mode=aggressive; +SET @old_dbug= @@GLOBAL.debug_dbug; +CHANGE MASTER TO master_use_gtid=slave_pos; +include/start_slave.inc +*** MDEV-31509: Lost data with FTWRL and STOP SLAVE +connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (0,0); +INSERT INTO t2 VALUES (0,0); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +connection slave; +*** Arrange for T1 to delay before entering GCO wait. +SET GLOBAL debug_dbug="+d,gco_wait_delay_gtid_0_x_99"; +*** Arrange for T2 to wait for FTWRL to start. +SET GLOBAL debug_dbug="+d,hold_worker_on_schedule"; +*** Arrange for T2 to delay wakeup from FTWRL pause. +SET GLOBAL debug_dbug="+d,delay_ftwrl_wait_gtid_0_x_100"; +connection master; +*** Event group T1 +SET SESSION gtid_seq_no=99; +INSERT INTO t1 VALUES (1,1); +connection slave; +*** 1a. Wait for T1 to be queued. +SET debug_sync="now WAIT_FOR gco_wait_paused"; +connection master; +*** Event group T2 +SET SESSION gtid_seq_no=100; +INSERT INTO t2 VALUES (2,2); +connection slave; +*** 1b. Wait for T2 to be queued. +SET debug_sync= "now WAIT_FOR reached_pause"; +connection slave1; +*** 2. Run FTWRL +SET GLOBAL debug_dbug= "+d,pause_for_ftwrl_wait"; +FLUSH TABLES WITH READ LOCK; +connection slave; +SET debug_sync= "now WAIT_FOR pause_ftwrl_waiting"; +*** 3. Wait for T2 to be waiting for FTWRL pause +SET debug_sync= "now SIGNAL continue_worker"; +*** 4. FTWRL completes, UNLOCK TABLES. +SET debug_sync="now SIGNAL pause_ftwrl_cont"; +connection slave1; +UNLOCK TABLES; +connection slave; +*** T2 is now ready to proceed after FTWRL pause, but did not wake up yet. +SET debug_sync="now WAIT_FOR pause_wait_started"; +*** 5. STOP SLAVE is run. +connection slave1; +SET GLOBAL debug_dbug="+d,rpl_parallel_wait_for_done_trigger"; +STOP SLAVE; +connection slave; +SET debug_sync="now WAIT_FOR wait_for_done_waiting"; +*** 5. T2 wakes up after FTWRL pause, reaches wait_for_prior_commit(). +SET debug_sync="now SIGNAL pause_wait_continue"; +*** 6. T1 starts. +SET debug_sync="now SIGNAL gco_wait_cont"; +connection slave1; +connection slave; +include/wait_for_slave_to_stop.inc +connection master; +SELECT * FROM t1 ORDER BY a; +a b +0 0 +1 1 +SELECT * FROM t2 ORDER BY a; +a b +0 0 +2 2 +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +SELECT @@GLOBAL.gtid_slave_pos; +@@GLOBAL.gtid_slave_pos +0-1-100 +SELECT * FROM t1 ORDER BY a; +a b +0 0 +1 1 +SELECT * FROM t2 ORDER BY a; +a b +0 0 +2 2 +*** Clean up. +connection slave; +include/stop_slave.inc +SET DEBUG_SYNC= "RESET"; +SET GLOBAL slave_parallel_threads= @old_parallel_threads; +SET GLOBAL slave_parallel_mode= @old_parallel_mode; +SET GLOBAL debug_dbug=@old_dbug; +include/start_slave.inc +connection master; +DROP TABLE t1, t2; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_parallel_ftwrl.test b/mysql-test/suite/rpl/t/rpl_parallel_ftwrl.test new file mode 100644 index 00000000000..308fcd0bd1f --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_parallel_ftwrl.test @@ -0,0 +1,143 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/have_binlog_format_mixed.inc +--source include/master-slave.inc + +--connection slave +--source include/stop_slave.inc +SET @old_parallel_threads= @@GLOBAL.slave_parallel_threads; +SET GLOBAL slave_parallel_threads=3; +SET @old_parallel_mode= @@GLOBAL.slave_parallel_mode; +SET GLOBAL slave_parallel_mode=aggressive; +SET @old_dbug= @@GLOBAL.debug_dbug; +CHANGE MASTER TO master_use_gtid=slave_pos; +--source include/start_slave.inc + +--echo *** MDEV-31509: Lost data with FTWRL and STOP SLAVE +# The bug was as follows: +# 1. Event groups T1 and T2 are queued but not started yet. +# 2. FLUSH TABLE WITH READ LOCKS starts, sets rpl_parallel_entry::pause_sub_id +# 3. T2 Sees pause_sub_id, goes to wait for the pause to complete. +# 4. FTWRL completes, UNLOCK TABLES is run. +# 5. STOP SLAVE is run, sets rpl_parallel_entry::stop_sub_id. +# 6. T2 wakes up after FTWRL pause, only now sets +# rpl_parallel_entry::largest_started_sub_id. This is the bug, +# largest_started_sub_id is set too late here. +# 7. T1 starts, it sees stop_sub_idLOCK_parallel_entry); } while (wait_count > entry->count_committing_event_groups); } +} - if (entry->force_abort && rgi->gtid_sub_id > entry->stop_sub_id) + +static bool +do_stop_handling(rpl_group_info *rgi) +{ + bool should_stop= false; + rpl_parallel_entry *entry= rgi->parallel_entry; + + mysql_mutex_assert_owner(&entry->LOCK_parallel_entry); + + if (unlikely(entry->force_abort) && rgi->gtid_sub_id > entry->stop_sub_id) { /* We are stopping (STOP SLAVE), and this event group need not be applied @@ -430,10 +440,26 @@ do_gco_wait(rpl_group_info *rgi, group_commit_orderer *gco, rather than execute, the following events. Once all queued events have been skipped, the STOP SLAVE is complete (for this thread). */ - return true; + should_stop= true; } - else - return false; + + if (unlikely(entry->stop_on_error_sub_id <= rgi->wait_commit_sub_id)) + { + rgi->worker_error= 1; + should_stop= true; + } + + if (likely(!should_stop)) + { + /* + Since we did not decide to stop, bump the largest_started_sub_id while + still holding LOCK_parallel_entry. + */ + if (rgi->gtid_sub_id > entry->largest_started_sub_id) + entry->largest_started_sub_id= rgi->gtid_sub_id; + } + + return should_stop; } @@ -480,15 +506,25 @@ do_ftwrl_wait(rpl_group_info *rgi, mysql_cond_wait(&entry->COND_parallel_entry, &entry->LOCK_parallel_entry); } while (sub_id > entry->pause_sub_id); + DBUG_EXECUTE_IF("delay_ftwrl_wait_gtid_0_x_100", { + if (rgi->current_gtid.domain_id == 0 && + rgi->current_gtid.seq_no == 100) { + /* + Simulate delayed wakeup from the mysql_cond_wait(). To do this, we + need to have the LOCK_parallel_entry mutex released during the wait. + */ + mysql_mutex_unlock(&entry->LOCK_parallel_entry); + debug_sync_set_action(thd, + STRING_WITH_LEN("now SIGNAL pause_wait_started WAIT_FOR pause_wait_continue")); + mysql_mutex_lock(&entry->LOCK_parallel_entry); + } + }); /* We do not call EXIT_COND() here, as this will be done later by our caller (since we set *did_enter_cond to true). */ } - if (sub_id > entry->largest_started_sub_id) - entry->largest_started_sub_id= sub_id; - DBUG_RETURN(aborted); } @@ -646,7 +682,17 @@ rpl_pause_for_ftwrl(THD *thd) mysql_mutex_unlock(&rpt->LOCK_rpl_thread); ++e->need_sub_id_signal; if (e->pause_sub_id == (uint64)ULONGLONG_MAX) + { e->pause_sub_id= e->largest_started_sub_id; + DBUG_EXECUTE_IF("pause_for_ftwrl_wait", { + mysql_mutex_unlock(&e->LOCK_parallel_entry); + debug_sync_set_action(thd, + STRING_WITH_LEN("now " + "SIGNAL pause_ftwrl_waiting " + "WAIT_FOR pause_ftwrl_cont")); + mysql_mutex_lock(&e->LOCK_parallel_entry); + }); + } thd->ENTER_COND(&e->COND_parallel_entry, &e->LOCK_parallel_entry, &stage_waiting_for_ftwrl_threads_to_pause, &old_stage); thd->set_time_for_next_stage(); @@ -1284,14 +1330,15 @@ handle_rpl_parallel_thread(void *arg) event_gtid_sub_id= rgi->gtid_sub_id; rgi->thd= thd; - mysql_mutex_lock(&entry->LOCK_parallel_entry); - skip_event_group= do_gco_wait(rgi, gco, &did_enter_cond, &old_stage); + DBUG_EXECUTE_IF("gco_wait_delay_gtid_0_x_99", { + if (rgi->current_gtid.domain_id == 0 && rgi->current_gtid.seq_no == 99) { + debug_sync_set_action(thd, + STRING_WITH_LEN("now SIGNAL gco_wait_paused WAIT_FOR gco_wait_cont")); + } }); - if (unlikely(entry->stop_on_error_sub_id <= rgi->wait_commit_sub_id)) - { - skip_event_group= true; - rgi->worker_error= 1; - } + mysql_mutex_lock(&entry->LOCK_parallel_entry); + do_gco_wait(rgi, gco, &did_enter_cond, &old_stage); + skip_event_group= do_stop_handling(rgi); if (likely(!skip_event_group)) skip_event_group= do_ftwrl_wait(rgi, &did_enter_cond, &old_stage); From 3f5cee8f541c3f9119bf37a3f4d7e58a46dd7e7c Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Wed, 21 Jun 2023 21:45:29 +0200 Subject: [PATCH 097/171] Fix one case that should not be marked transactional in the GTID event The case is statement format and mixed InnoDB/MyISAM without binlog_direct_non_trans_update. Fix due to Brandon Nesterenko. Reviewed-by: Andrei Elkin Signed-off-by: Kristian Nielsen --- sql/log_event.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sql/log_event.cc b/sql/log_event.cc index bafcf34cc2e..181a26ccdb5 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -8013,7 +8013,10 @@ Gtid_log_event::Gtid_log_event(THD *thd_arg, uint64 seq_no_arg, thd_arg->transaction.all.has_created_dropped_temp_table() || thd_arg->transaction.all.trans_executed_admin_cmd()) flags2|= FL_DDL; - else if (is_transactional && !is_tmp_table) + else if (is_transactional && !is_tmp_table && + !(thd_arg->transaction.all.modified_non_trans_table && + thd->variables.binlog_direct_non_trans_update == 0 && + !thd->is_current_stmt_binlog_format_row())) flags2|= FL_TRANSACTIONAL; if (!(thd_arg->variables.option_bits & OPTION_RPL_SKIP_PARALLEL)) flags2|= FL_ALLOW_PARALLEL; From 7dde504aef06fee8aa335045cdb478062cd2c2a0 Mon Sep 17 00:00:00 2001 From: Andrei Date: Wed, 5 Jul 2023 19:01:13 +0300 Subject: [PATCH 098/171] q# This is a combination of 2 commits. MDEV-31503 ALTER SEQUENCE ends up in optimistic parallel slave binlog out-of-order The OOO error still was possible even after MDEV-31077. This time it occured through open_table() when the sequence table was not in the table cache *and* the table was created before the last server restart. In such context a internal (read-only) transaction is committed and it was not blocked from doing a wakeup() call to subsequent transactions. Fixed with extending suspend_subsequent_commits() effect for the entirety of Sql_cmd_alter_sequence::execute(). An elaborated MDEV-31077 test proves the fixes of both failure scenarios. Also the bug condition suggests a workaround to pre-SELECT sequence tables before START SLAVE. Reviewed-by: Brandon Nesterenko --- .../suite/rpl/r/rpl_parallel_seq.result | 13 +++++- mysql-test/suite/rpl/t/rpl_parallel_seq.test | 21 +++++++++- sql/sql_sequence.cc | 41 ++++++++++++------- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/mysql-test/suite/rpl/r/rpl_parallel_seq.result b/mysql-test/suite/rpl/r/rpl_parallel_seq.result index 60061049ed4..f5b062236db 100644 --- a/mysql-test/suite/rpl/r/rpl_parallel_seq.result +++ b/mysql-test/suite/rpl/r/rpl_parallel_seq.result @@ -47,11 +47,21 @@ Warnings: Note 1255 Slave already has been stopped RESET MASTER; SET @@global.gtid_slave_pos=""; -SET @@global.gtid_strict_mode=1; connection master; RESET MASTER; CREATE TABLE ti (a INT) ENGINE=innodb; CREATE SEQUENCE s2 ENGINE=innodb; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +include/rpl_restart_server.inc [server_number=2] +SET @@global.slave_parallel_threads=2; +SET @@global.slave_parallel_mode=optimistic; +SET @@global.debug_dbug="+d,hold_worker_on_schedule"; +SET @@global.gtid_strict_mode=1; +connection master; SET @@gtid_seq_no=100; ALTER SEQUENCE s2 restart with 1; INSERT INTO ti SET a=1; @@ -60,6 +70,7 @@ SELECT @@global.gtid_binlog_state "Master gtid state"; Master gtid state 0-1-101 connection slave; +SET STATEMENT sql_log_bin=0 FOR FLUSH TABLES; include/start_slave.inc SELECT @@global.gtid_binlog_state, @@global.gtid_slave_pos as "no 100,101 yet in both"; @@global.gtid_binlog_state no 100,101 yet in both diff --git a/mysql-test/suite/rpl/t/rpl_parallel_seq.test b/mysql-test/suite/rpl/t/rpl_parallel_seq.test index 741859bc588..e975d079e52 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel_seq.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_seq.test @@ -77,15 +77,28 @@ SET DEBUG_SYNC = 'now SIGNAL continue_worker'; --source include/stop_slave.inc RESET MASTER; SET @@global.gtid_slave_pos=""; ---let $slave_gtid_strict_mode=`select @@global.gtid_strict_mode` -SET @@global.gtid_strict_mode=1; --connection master RESET MASTER; # Load from master CREATE TABLE ti (a INT) ENGINE=innodb; CREATE SEQUENCE s2 ENGINE=innodb; +--source include/save_master_gtid.inc +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--let $rpl_server_number= 2 +--source include/rpl_restart_server.inc +# upon restart +SET @@global.slave_parallel_threads=2; +SET @@global.slave_parallel_mode=optimistic; +SET @@global.debug_dbug="+d,hold_worker_on_schedule"; +--let $slave_gtid_strict_mode=`select @@global.gtid_strict_mode` +SET @@global.gtid_strict_mode=1; + +--connection master SET @@gtid_seq_no=100; ALTER SEQUENCE s2 restart with 1; INSERT INTO ti SET a=1; @@ -93,6 +106,10 @@ INSERT INTO ti SET a=1; SELECT @@global.gtid_binlog_state "Master gtid state"; --connection slave +# The following FT complicates the opening table time with committing +# an internal transaction. The rest of the test also proves +# MDEV-31503 "branch" of the OOO error is fixed. +SET STATEMENT sql_log_bin=0 FOR FLUSH TABLES; --source include/start_slave.inc --let $wait_condition= SELECT count(*) = 1 FROM information_schema.processlist WHERE state LIKE "Waiting for prior transaction to commit" diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index 2904749d1e6..4ba1e6092bd 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -900,6 +900,20 @@ end: DBUG_RETURN(error); } +#if defined(HAVE_REPLICATION) +class wait_for_commit_raii +{ +private: + THD *m_thd; + wait_for_commit *m_wfc; + +public: + wait_for_commit_raii(THD* thd) : + m_thd(thd), m_wfc(thd->suspend_subsequent_commits()) + {} + ~wait_for_commit_raii() { m_thd->resume_subsequent_commits(m_wfc); } +}; +#endif bool Sql_cmd_alter_sequence::execute(THD *thd) { @@ -912,7 +926,10 @@ bool Sql_cmd_alter_sequence::execute(THD *thd) SEQUENCE *seq; No_such_table_error_handler no_such_table_handler; DBUG_ENTER("Sql_cmd_alter_sequence::execute"); - +#if defined(HAVE_REPLICATION) + /* No wakeup():s of subsequent commits is allowed in this function. */ + wait_for_commit_raii suspend_wfc(thd); +#endif if (check_access(thd, ALTER_ACL, first_table->db.str, &first_table->grant.privilege, @@ -1010,19 +1027,15 @@ bool Sql_cmd_alter_sequence::execute(THD *thd) else table->file->print_error(error, MYF(0)); table->s->sequence->write_unlock(table); - { - wait_for_commit* suspended_wfc= thd->suspend_subsequent_commits(); - if (trans_commit_stmt(thd)) - error= 1; - if (trans_commit_implicit(thd)) - error= 1; - thd->resume_subsequent_commits(suspended_wfc); - DBUG_EXECUTE_IF("hold_worker_on_schedule", - { - /* delay binlogging of a parent trx in rpl_parallel_seq */ - my_sleep(100000); - }); - } + if (trans_commit_stmt(thd)) + error= 1; + if (trans_commit_implicit(thd)) + error= 1; + DBUG_EXECUTE_IF("hold_worker_on_schedule", + { + /* delay binlogging of a parent trx in rpl_parallel_seq */ + my_sleep(100000); + }); if (likely(!error)) error= write_bin_log(thd, 1, thd->query(), thd->query_length()); if (likely(!error)) From e1d31a10afcca0d8e16f35c8bb4c25c23f94f136 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Thu, 13 Jul 2023 13:22:24 +1000 Subject: [PATCH 099/171] MDEV-31524 Fixing spider table param / variable overriding The existing (incorrect) overriding mechanism is: Non-minus-one var value overrides table param overrides default value. Before MDEV-27169, unspecified var value is -1. So if the user sets both the var to be a value other than -1 and the table param, the var value will prevail, which is incorrect. After MDEV-27169, unspecified var value is default value. So if the user does not set the var but sets the table param, the default value will prevail, which is even more incorrect. This patch fixes it so that table param, if specified, always overrides var value, and the latter if not specified or set to -1, falls back to the default value We achieve this by replacing all such overriding in spd_param.cc with macros that override in the correct way, and removing all the "overriding -1" lines involving table params in spider_set_connect_info_default() except for those table params not defined as sysvar/thdvar in spd_params.cc We also introduced macros for non-overriding sysvar and thdvar, so that the code is cleaner and less error-prone In server versions where MDEV-27169 has not been applied, we also backport the patch, that is, replacing -1 default values with real default values In server versions where MDEV-28006 has not been applied, we do the same for udf params --- .../spider/bugfix/r/mdev_31524.result | 46 + .../spider/bugfix/t/mdev_31524.test | 73 + storage/spider/spd_copy_tables.cc | 6 - storage/spider/spd_db_conn.cc | 4 +- storage/spider/spd_direct_sql.cc | 15 - storage/spider/spd_param.cc | 1266 +++++------------ storage/spider/spd_table.cc | 146 -- 7 files changed, 449 insertions(+), 1107 deletions(-) create mode 100644 storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result create mode 100644 storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result new file mode 100644 index 00000000000..645fc62862d --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result @@ -0,0 +1,46 @@ + +MDEV-31524 Spider variables that double as table params overriding mechanism is buggy + +for master_1 +for child2 +for child3 +SET @old_spider_read_only_mode = @@session.spider_read_only_mode; +CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +set session spider_read_only_mode = default; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 1 */ insert into t1 values (42); +drop table t1, t2; +set session spider_read_only_mode = 1; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 2 */ insert into t1 values (42); +ERROR HY000: Table 'test.t1' is read only +drop table t1, t2; +set session spider_read_only_mode = -1; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 3 */ insert into t1 values (42); +drop table t1, t2; +SET session spider_read_only_mode = default; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "1", WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 4 */ insert into t1 values (42); +ERROR HY000: Table 'test.t1' is read only +drop table t1, t2; +set session spider_read_only_mode = 1; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "0", WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 5 */ insert into t1 values (42); +drop table t1, t2; +SET session spider_read_only_mode = -1; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "1", WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 6 */ insert into t1 values (42); +ERROR HY000: Table 'test.t1' is read only +drop table t1, t2; +drop server srv_mdev_31524; +SET session spider_read_only_mode = @old_spider_read_only_mode; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test new file mode 100644 index 00000000000..64cbf4154aa --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test @@ -0,0 +1,73 @@ +--echo +--echo MDEV-31524 Spider variables that double as table params overriding mechanism is buggy +--echo + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--let $srv=srv_mdev_31524 +SET @old_spider_read_only_mode = @@session.spider_read_only_mode; +evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +# when the user does not set var nor the table option, the default +# value (0 in this case) takes effect. +set session spider_read_only_mode = default; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv",TABLE "t2"'; +/* 1 */ insert into t1 values (42); +drop table t1, t2; + +# when the user sets var but not the table option, the var should be +# take effect. +set session spider_read_only_mode = 1; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv",TABLE "t2"'; +--error 12518 +/* 2 */ insert into t1 values (42); +drop table t1, t2; + +# when the user sets var to -1 and does not set the table option, the +# default value takes effect. +set session spider_read_only_mode = -1; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv",TABLE "t2"'; +/* 3 */ insert into t1 values (42); +drop table t1, t2; + +# when the user does not set the var, but sets the table option, the +# table option should take effect +SET session spider_read_only_mode = default; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "1", WRAPPER "mysql", srv "$srv",TABLE "t2"'; +--error 12518 +/* 4 */ insert into t1 values (42); +drop table t1, t2; + +# when the user sets both var and table option, the table option +# should take precedence +set session spider_read_only_mode = 1; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "0", WRAPPER "mysql", srv "$srv",TABLE "t2"'; +/* 5 */ insert into t1 values (42); +drop table t1, t2; + +# when the user sets the var to -1 and sets the table option, the +# table option should take effect +SET session spider_read_only_mode = -1; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "1", WRAPPER "mysql", srv "$srv",TABLE "t2"'; +--error 12518 +/* 6 */ insert into t1 values (42); +drop table t1, t2; + +eval drop server $srv; + +SET session spider_read_only_mode = @old_spider_read_only_mode; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc index 319b02462b1..e00e0608776 100644 --- a/storage/spider/spd_copy_tables.cc +++ b/storage/spider/spd_copy_tables.cc @@ -64,12 +64,6 @@ int spider_udf_set_copy_tables_param_default( } } - if (copy_tables->bulk_insert_interval == -1) - copy_tables->bulk_insert_interval = 10; - if (copy_tables->bulk_insert_rows == -1) - copy_tables->bulk_insert_rows = 100; - if (copy_tables->use_table_charset == -1) - copy_tables->use_table_charset = 1; if (copy_tables->use_transaction == -1) copy_tables->use_transaction = 1; #ifndef WITHOUT_SPIDER_BG_SEARCH diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index 8712dc91a65..de85e0b99b2 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -11559,7 +11559,7 @@ int spider_db_udf_copy_tables( error_num = result->get_errno(); if (error_num == HA_ERR_END_OF_FILE) { - if (roop_count < copy_tables->bulk_insert_rows) + if (roop_count < bulk_insert_rows) { end_of_file = TRUE; if (roop_count) @@ -11583,8 +11583,6 @@ int spider_db_udf_copy_tables( pthread_mutex_unlock(&tmp_conn->mta_conn_mutex); goto error_db_query; } - bulk_insert_rows = spider_param_udf_ct_bulk_insert_rows( - copy_tables->bulk_insert_rows); if ( select_ct->append_key_order_str(key_info, 0, FALSE) || select_ct->append_limit(0, bulk_insert_rows) || diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc index 0574c18b078..6a04488c50f 100644 --- a/storage/spider/spd_direct_sql.cc +++ b/storage/spider/spd_direct_sql.cc @@ -1451,25 +1451,10 @@ int spider_udf_set_direct_sql_param_default( } } - if (direct_sql->table_loop_mode == -1) - direct_sql->table_loop_mode = 0; if (direct_sql->priority == -1) direct_sql->priority = 1000000; - if (direct_sql->connect_timeout == -1) - direct_sql->connect_timeout = 6; - if (direct_sql->net_read_timeout == -1) - direct_sql->net_read_timeout = 600; - if (direct_sql->net_write_timeout == -1) - direct_sql->net_write_timeout = 600; - if (direct_sql->bulk_insert_rows == -1) - direct_sql->bulk_insert_rows = 3000; if (direct_sql->connection_channel == -1) direct_sql->connection_channel = 0; -#if MYSQL_VERSION_ID < 50500 -#else - if (direct_sql->use_real_table == -1) - direct_sql->use_real_table = 0; -#endif if (direct_sql->error_rw_mode == -1) direct_sql->error_rw_mode = 0; for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++) diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc index 81540a1ef91..b77acef57fe 100644 --- a/storage/spider/spd_param.cc +++ b/storage/spider/spd_param.cc @@ -1,4 +1,5 @@ /* Copyright (C) 2008-2018 Kentoku Shiba + Copyright (C) 2023 MariaDB plc This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,6 +14,26 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +/** + @file + + There are several kinds of spider parameters. + + - sysvar/thdvar that are not table parameters. These variables do + not appear in a `SPIDER_SHARE`. Examples include `support_xa` and + `conn_recycle_mode`. Their values are commonly retrieved by + `SPIDER_SYSVAR_VALUE_FUNC()` and `SPIDER_THDVAR_VALUE_FUNC()` + - sysvar/thdvar that are also table parameters. These variables + commonly appear in a `SPIDER_SHARE`. Examples include + `read_only_mode` and `use_table_charset`. Table parameter values + override variable values, and their values are commonly retrieved + by `SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC()` and + `SPIDER_THDVAR_OVERRIDE_VALUE_FUNC()`. + - table parameters that are not sysvar/thdvar. Examples include + host and username. They are not handled in this file which is only + concerned with global/session variables +*/ + #define MYSQL_SERVER 1 #include #include "mysql_version.h" @@ -42,6 +63,57 @@ extern struct st_maria_plugin spider_i_s_alloc_mem_maria; extern volatile ulonglong spider_mon_table_cache_version; extern volatile ulonglong spider_mon_table_cache_version_req; +/* + Define a function returning the value of a global variable. +*/ +#define SPIDER_SYSVAR_VALUE_FUNC(param_type, param_name) \ + param_type spider_param_ ## param_name() \ + { \ + return SYSVAR(param_name); \ + } + +/* + Define a function returning the value of a session variable. +*/ +#define SPIDER_THDVAR_VALUE_FUNC(param_type, param_name) \ + param_type spider_param_ ## param_name(THD *thd) \ + { \ + return THDVAR(thd, param_name); \ + } + +/* + Define a function returning the value of a table param that is also a + global variable. + + If the table param value is not -1, use the table param value. + Otherwise if the variable value is not -1, use the variable value. + Otherwise use the default variable value. +*/ +#define SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(param_type, param_name) \ + param_type spider_param_ ## param_name(param_type param_name) \ + { \ + return param_name != -1 ? param_name : \ + SYSVAR(param_name) != -1 ? SYSVAR(param_name) : \ + MYSQL_SYSVAR_NAME(param_name).def_val; \ + } + +/* + Define a function returning the value of a table param that is also a + session variable. + + If the table param value is not -1, use the table param value. + Otherwise if the variable value is not -1, use the variable value. + Otherwise use the default variable value. +*/ +#define SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(param_type, param_name) \ + param_type spider_param_ ## param_name(THD* thd, \ + param_type param_name) \ + { \ + return param_name != -1 ? param_name : \ + THDVAR(thd, param_name) != -1 ? THDVAR(thd, param_name) : \ + MYSQL_SYSVAR_NAME(param_name).def_val; \ + } + #ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS static int spider_direct_update(THD *thd, SHOW_VAR *var, char *buff) { @@ -172,11 +244,7 @@ static MYSQL_SYSVAR_BOOL( TRUE ); -my_bool spider_param_support_xa() -{ - DBUG_ENTER("spider_param_support_xa"); - DBUG_RETURN(spider_support_xa); -} +SPIDER_SYSVAR_VALUE_FUNC(my_bool, support_xa) static my_bool spider_connect_mutex; static MYSQL_SYSVAR_BOOL( @@ -189,11 +257,7 @@ static MYSQL_SYSVAR_BOOL( FALSE ); -my_bool spider_param_connect_mutex() -{ - DBUG_ENTER("spider_param_connect_mutex"); - DBUG_RETURN(spider_connect_mutex); -} +SPIDER_SYSVAR_VALUE_FUNC(my_bool, connect_mutex) static uint spider_connect_error_interval; /* @@ -212,11 +276,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_connect_error_interval() -{ - DBUG_ENTER("spider_param_connect_error_interval"); - DBUG_RETURN(spider_connect_error_interval); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, connect_error_interval) static uint spider_table_init_error_interval; /* @@ -235,15 +295,11 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_table_init_error_interval() -{ - DBUG_ENTER("spider_param_table_init_error_interval"); - DBUG_RETURN(spider_table_init_error_interval); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, table_init_error_interval) static int spider_use_table_charset; /* - -1 :use table parameter + -1 :fallback to default 0 :use utf8 1 :use table charset */ @@ -254,19 +310,13 @@ static MYSQL_SYSVAR_INT( "Use table charset for remote access", NULL, NULL, - -1, + 1, -1, 1, 0 ); -int spider_param_use_table_charset( - int use_table_charset -) { - DBUG_ENTER("spider_param_use_table_charset"); - DBUG_RETURN(spider_use_table_charset == -1 ? - use_table_charset : spider_use_table_charset); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, use_table_charset) /* 0: no recycle @@ -285,12 +335,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_conn_recycle_mode( - THD *thd -) { - DBUG_ENTER("spider_param_conn_recycle_mode"); - DBUG_RETURN(THDVAR(thd, conn_recycle_mode)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, conn_recycle_mode) /* 0: weak @@ -308,12 +353,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_conn_recycle_strict( - THD *thd -) { - DBUG_ENTER("spider_param_conn_recycle_strict"); - DBUG_RETURN(THDVAR(thd, conn_recycle_strict)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, conn_recycle_strict) /* FALSE: no sync @@ -328,12 +368,7 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_sync_trx_isolation( - THD *thd -) { - DBUG_ENTER("spider_param_sync_trx_isolation"); - DBUG_RETURN(THDVAR(thd, sync_trx_isolation)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, sync_trx_isolation) /* FALSE: no use @@ -348,12 +383,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_use_consistent_snapshot( - THD *thd -) { - DBUG_ENTER("spider_param_use_consistent_snapshot"); - DBUG_RETURN(THDVAR(thd, use_consistent_snapshot)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, use_consistent_snapshot) /* FALSE: off @@ -368,12 +398,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_internal_xa( - THD *thd -) { - DBUG_ENTER("spider_param_internal_xa"); - DBUG_RETURN(THDVAR(thd, internal_xa)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, internal_xa) /* 0 :err when use a spider table @@ -393,12 +418,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_internal_xa_snapshot( - THD *thd -) { - DBUG_ENTER("spider_param_internal_xa_snapshot"); - DBUG_RETURN(THDVAR(thd, internal_xa_snapshot)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, internal_xa_snapshot) /* 0 :off @@ -417,12 +437,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_force_commit( - THD *thd -) { - DBUG_ENTER("spider_param_force_commit"); - DBUG_RETURN(THDVAR(thd, force_commit)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, force_commit) /* 0: register all XA transaction @@ -440,15 +455,10 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_xa_register_mode( - THD *thd -) { - DBUG_ENTER("spider_param_xa_register_mode"); - DBUG_RETURN(THDVAR(thd, xa_register_mode)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, xa_register_mode) /* - -1 :use table parameter + -1 :fallback to default 0-:offset */ static MYSQL_THDVAR_LONGLONG( @@ -457,23 +467,16 @@ static MYSQL_THDVAR_LONGLONG( "Internal offset", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_internal_offset( - THD *thd, - longlong internal_offset -) { - DBUG_ENTER("spider_param_internal_offset"); - DBUG_RETURN(THDVAR(thd, internal_offset) < 0 ? - internal_offset : THDVAR(thd, internal_offset)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, internal_offset) /* - -1 :use table parameter + -1 :fallback to default 0-:limit */ static MYSQL_THDVAR_LONGLONG( @@ -482,23 +485,16 @@ static MYSQL_THDVAR_LONGLONG( "Internal limit", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 9223372036854775807LL, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_internal_limit( - THD *thd, - longlong internal_limit -) { - DBUG_ENTER("spider_param_internal_limit"); - DBUG_RETURN(THDVAR(thd, internal_limit) < 0 ? - internal_limit : THDVAR(thd, internal_limit)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, internal_limit) /* - -1 :use table parameter + -1 :fallback to default 0-:number of rows at a select */ static MYSQL_THDVAR_LONGLONG( @@ -507,23 +503,16 @@ static MYSQL_THDVAR_LONGLONG( "Number of rows at a select", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 9223372036854775807LL, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_split_read( - THD *thd, - longlong split_read -) { - DBUG_ENTER("spider_param_split_read"); - DBUG_RETURN(THDVAR(thd, split_read) < 0 ? - split_read : THDVAR(thd, split_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, split_read) /* - -1 :use table parameter + -1 :fallback to default 0 :doesn't use "offset" and "limit" for "split_read" 1-:magnification */ @@ -533,23 +522,16 @@ static MYSQL_THDVAR_INT( "Use offset and limit parameter in SQL for split_read parameter.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 2, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -double spider_param_semi_split_read( - THD *thd, - double semi_split_read -) { - DBUG_ENTER("spider_param_semi_split_read"); - DBUG_RETURN(THDVAR(thd, semi_split_read) < 0 ? - semi_split_read : THDVAR(thd, semi_split_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(double, semi_split_read) /* - -1 :use table parameter + -1 :fallback to default 0-:the limit value */ static MYSQL_THDVAR_LONGLONG( @@ -558,23 +540,16 @@ static MYSQL_THDVAR_LONGLONG( "The limit value for semi_split_read", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 9223372036854775807LL, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_semi_split_read_limit( - THD *thd, - longlong semi_split_read_limit -) { - DBUG_ENTER("spider_param_semi_split_read_limit"); - DBUG_RETURN(THDVAR(thd, semi_split_read_limit) < 0 ? - semi_split_read_limit : THDVAR(thd, semi_split_read_limit)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, semi_split_read_limit) /* - -1 :use table parameter + -1 :fallback to default 0 :no alloc 1-:alloc size */ @@ -584,23 +559,16 @@ static MYSQL_THDVAR_INT( "Initial sql string alloc size", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1024, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -int spider_param_init_sql_alloc_size( - THD *thd, - int init_sql_alloc_size -) { - DBUG_ENTER("spider_param_init_sql_alloc_size"); - DBUG_RETURN(THDVAR(thd, init_sql_alloc_size) < 0 ? - init_sql_alloc_size : THDVAR(thd, init_sql_alloc_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, init_sql_alloc_size) /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :on */ @@ -610,24 +578,17 @@ static MYSQL_THDVAR_INT( "Reset sql string alloc after execute", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_reset_sql_alloc( - THD *thd, - int reset_sql_alloc -) { - DBUG_ENTER("spider_param_reset_sql_alloc"); - DBUG_RETURN(THDVAR(thd, reset_sql_alloc) < 0 ? - reset_sql_alloc : THDVAR(thd, reset_sql_alloc)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, reset_sql_alloc) #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) /* - -1 :use table parameter + -1 :fallback to default 0-:result free size for handlersocket */ static MYSQL_THDVAR_LONGLONG( @@ -636,24 +597,17 @@ static MYSQL_THDVAR_LONGLONG( "Result free size for handlersocket", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1048576, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_hs_result_free_size( - THD *thd, - longlong hs_result_free_size -) { - DBUG_ENTER("spider_param_hs_result_free_size"); - DBUG_RETURN(THDVAR(thd, hs_result_free_size) < 0 ? - hs_result_free_size : THDVAR(thd, hs_result_free_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUN(longlong, hs_result_free_size) #endif /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :on */ @@ -663,23 +617,16 @@ static MYSQL_THDVAR_INT( "Sprit read mode for multi range", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 100, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -int spider_param_multi_split_read( - THD *thd, - int multi_split_read -) { - DBUG_ENTER("spider_param_multi_split_read"); - DBUG_RETURN(THDVAR(thd, multi_split_read) < 0 ? - multi_split_read : THDVAR(thd, multi_split_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, multi_split_read) /* - -1 :use table parameter + -1 :fallback to default 0-:max order columns */ static MYSQL_THDVAR_INT( @@ -688,20 +635,13 @@ static MYSQL_THDVAR_INT( "Max columns for order by", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 32767, /* def */ -1, /* min */ 32767, /* max */ 0 /* blk */ ); -int spider_param_max_order( - THD *thd, - int max_order -) { - DBUG_ENTER("spider_param_max_order"); - DBUG_RETURN(THDVAR(thd, max_order) < 0 ? - max_order : THDVAR(thd, max_order)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, max_order) /* -1 :off @@ -722,12 +662,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_semi_trx_isolation( - THD *thd -) { - DBUG_ENTER("spider_param_semi_trx_isolation"); - DBUG_RETURN(THDVAR(thd, semi_trx_isolation)); -} +SPIDER_THDVAR_VALUE_FUNC(int, semi_trx_isolation) static int spider_param_semi_table_lock_check( MYSQL_THD thd, @@ -779,19 +714,13 @@ static MYSQL_THDVAR_INT( "Table lock during execute a sql", /* comment */ &spider_param_semi_table_lock_check, /* check */ NULL, /* update */ - 1, /* def */ + 0, /* def */ 0, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_semi_table_lock( - THD *thd, - int semi_table_lock -) { - DBUG_ENTER("spider_param_semi_table_lock"); - DBUG_RETURN((semi_table_lock & THDVAR(thd, semi_table_lock))); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, semi_table_lock) static int spider_param_semi_table_lock_connection_check( MYSQL_THD thd, @@ -844,20 +773,13 @@ static MYSQL_THDVAR_INT( "Use different connection if semi_table_lock is enabled", /* comment */ &spider_param_semi_table_lock_connection_check, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_semi_table_lock_connection( - THD *thd, - int semi_table_lock_connection -) { - DBUG_ENTER("spider_param_semi_table_lock_connection"); - DBUG_RETURN(THDVAR(thd, semi_table_lock_connection) == -1 ? - semi_table_lock_connection : THDVAR(thd, semi_table_lock_connection)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, semi_table_lock_connection) /* 0-:block_size @@ -874,15 +796,10 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_block_size( - THD *thd -) { - DBUG_ENTER("spider_param_block_size"); - DBUG_RETURN(THDVAR(thd, block_size)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, block_size) /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :lock in share mode 2 :for update @@ -893,20 +810,13 @@ static MYSQL_THDVAR_INT( "Lock for select with update", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_selupd_lock_mode( - THD *thd, - int selupd_lock_mode -) { - DBUG_ENTER("spider_param_selupd_lock_mode"); - DBUG_RETURN(THDVAR(thd, selupd_lock_mode) == -1 ? - selupd_lock_mode : THDVAR(thd, selupd_lock_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, selupd_lock_mode) /* FALSE: no sync @@ -921,12 +831,7 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_sync_autocommit( - THD *thd -) { - DBUG_ENTER("spider_param_sync_autocommit"); - DBUG_RETURN(THDVAR(thd, sync_autocommit)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, sync_autocommit) /* FALSE: not use @@ -941,12 +846,7 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_use_default_database( - THD *thd -) { - DBUG_ENTER("spider_param_use_default_database"); - DBUG_RETURN(THDVAR(thd, use_default_database)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, use_default_database) /* -1 :don't know or does not matter; don't send 'SET SQL_LOG_OFF' statement @@ -965,15 +865,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_internal_sql_log_off( - THD *thd -) { - DBUG_ENTER("spider_param_internal_sql_log_off"); - DBUG_RETURN(THDVAR(thd, internal_sql_log_off)); -} +SPIDER_THDVAR_VALUE_FUNC(int, internal_sql_log_off) /* - -1 :use table parameter + -1 :fallback to default 0-:bulk insert size */ static MYSQL_THDVAR_INT( @@ -982,23 +877,16 @@ static MYSQL_THDVAR_INT( "Bulk insert size", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 16000, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -int spider_param_bulk_size( - THD *thd, - int bulk_size -) { - DBUG_ENTER("spider_param_bulk_size"); - DBUG_RETURN(THDVAR(thd, bulk_size) < 0 ? - bulk_size : THDVAR(thd, bulk_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bulk_size) /* - -1 :use table parameter + -1 :fallback to default 0 : Send "update" and "delete" statements one by one. 1 : Send collected multiple "update" and "delete" statements. (Collected statements are sent one by one) @@ -1011,23 +899,16 @@ static MYSQL_THDVAR_INT( "The mode of bulk updating and deleting", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_bulk_update_mode( - THD *thd, - int bulk_update_mode -) { - DBUG_ENTER("spider_param_bulk_update_mode"); - DBUG_RETURN(THDVAR(thd, bulk_update_mode) == -1 ? - bulk_update_mode : THDVAR(thd, bulk_update_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bulk_update_mode) /* - -1 :use table parameter + -1 :fallback to default 0-:bulk update size */ static MYSQL_THDVAR_INT( @@ -1036,23 +917,24 @@ static MYSQL_THDVAR_INT( "Bulk update size", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 16000, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -int spider_param_bulk_update_size( - THD *thd, - int bulk_update_size -) { - DBUG_ENTER("spider_param_bulk_update_size"); - DBUG_RETURN(THDVAR(thd, bulk_update_size) == -1 ? - bulk_update_size : THDVAR(thd, bulk_update_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bulk_update_size) /* - -1 :use table parameter + Notes on merge conflicts (remove after merging): + 10.5: 48faa20db848012e2187a09e05aba832078cb82e + 10.6: 51ff9eddf7c0aaf1e022fcb3b48ec36835df7785 + 10.9: 06a61b8e453126c2de1649073f247d34e85f9702 + 10.10: 90cd0c156f5bb53fd058d2bbfb83f850ffae6722 + 10.11+: 124eb662700708f3c4b0fb77968f8b854d6bb4aa +*/ +/* + -1 :fallback to default 0 :off 1 :on */ @@ -1062,23 +944,16 @@ static MYSQL_THDVAR_INT( "Execute optimize to remote server", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_internal_optimize( - THD *thd, - int internal_optimize -) { - DBUG_ENTER("spider_param_internal_optimize"); - DBUG_RETURN(THDVAR(thd, internal_optimize) == -1 ? - internal_optimize : THDVAR(thd, internal_optimize)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, internal_optimize) /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :on */ @@ -1088,20 +963,13 @@ static MYSQL_THDVAR_INT( "Execute optimize to remote server with local", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_internal_optimize_local( - THD *thd, - int internal_optimize_local -) { - DBUG_ENTER("spider_param_internal_optimize_local"); - DBUG_RETURN(THDVAR(thd, internal_optimize_local) == -1 ? - internal_optimize_local : THDVAR(thd, internal_optimize_local)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, internal_optimize_local) /* FALSE: off @@ -1116,12 +984,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_use_flash_logs( - THD *thd -) { - DBUG_ENTER("spider_param_use_flash_logs"); - DBUG_RETURN(THDVAR(thd, use_flash_logs)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, use_flash_logs) /* 0 :off @@ -1140,12 +1003,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_use_snapshot_with_flush_tables( - THD *thd -) { - DBUG_ENTER("spider_param_use_snapshot_with_flush_tables"); - DBUG_RETURN(THDVAR(thd, use_snapshot_with_flush_tables)); -} +SPIDER_THDVAR_VALUE_FUNC(int, use_snapshot_with_flush_tables) /* FALSE: off @@ -1160,12 +1018,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_use_all_conns_snapshot( - THD *thd -) { - DBUG_ENTER("spider_param_use_all_conns_snapshot"); - DBUG_RETURN(THDVAR(thd, use_all_conns_snapshot)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, use_all_conns_snapshot) /* FALSE: off @@ -1180,12 +1033,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_lock_exchange( - THD *thd -) { - DBUG_ENTER("spider_param_lock_exchange"); - DBUG_RETURN(THDVAR(thd, lock_exchange)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, lock_exchange) /* FALSE: off @@ -1200,12 +1048,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_internal_unlock( - THD *thd -) { - DBUG_ENTER("spider_param_internal_unlock"); - DBUG_RETURN(THDVAR(thd, internal_unlock)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, internal_unlock) /* FALSE: off @@ -1220,15 +1063,10 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_semi_trx( - THD *thd -) { - DBUG_ENTER("spider_param_semi_trx"); - DBUG_RETURN(THDVAR(thd, semi_trx)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, semi_trx) /* - -1 :use table parameter + -1 :fallback to default 0-:seconds of timeout */ static MYSQL_THDVAR_INT( @@ -1237,25 +1075,16 @@ static MYSQL_THDVAR_INT( "Wait timeout of connecting to remote server", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 6, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -int spider_param_connect_timeout( - THD *thd, - int connect_timeout -) { - DBUG_ENTER("spider_param_connect_timeout"); - if (thd) - DBUG_RETURN(THDVAR(thd, connect_timeout) == -1 ? - connect_timeout : THDVAR(thd, connect_timeout)); - DBUG_RETURN(connect_timeout); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, connect_timeout) /* - -1 :use table parameter + -1 :fallback to default 0-:seconds of timeout */ static MYSQL_THDVAR_INT( @@ -1264,25 +1093,16 @@ static MYSQL_THDVAR_INT( "Wait timeout of receiving data from remote server", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 600, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -int spider_param_net_read_timeout( - THD *thd, - int net_read_timeout -) { - DBUG_ENTER("spider_param_net_read_timeout"); - if (thd) - DBUG_RETURN(THDVAR(thd, net_read_timeout) == -1 ? - net_read_timeout : THDVAR(thd, net_read_timeout)); - DBUG_RETURN(net_read_timeout); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, net_read_timeout) /* - -1 :use table parameter + -1 :fallback to default 0-:seconds of timeout */ static MYSQL_THDVAR_INT( @@ -1291,25 +1111,16 @@ static MYSQL_THDVAR_INT( "Wait timeout of sending data to remote server", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 600, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -int spider_param_net_write_timeout( - THD *thd, - int net_write_timeout -) { - DBUG_ENTER("spider_param_net_write_timeout"); - if (thd) - DBUG_RETURN(THDVAR(thd, net_write_timeout) == -1 ? - net_write_timeout : THDVAR(thd, net_write_timeout)); - DBUG_RETURN(net_write_timeout); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, net_write_timeout) /* - -1 :use table parameter + -1 :fallback to default 0 :It acquires it collectively. 1 :Acquisition one by one.If it discontinues once, and it will need it later, it retrieves it again when there is interrupt on the way. @@ -1322,23 +1133,16 @@ static MYSQL_THDVAR_INT( "The retrieval result from a remote server is acquired by acquisition one by one", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 3, /* def */ -1, /* min */ 3, /* max */ 0 /* blk */ ); -int spider_param_quick_mode( - THD *thd, - int quick_mode -) { - DBUG_ENTER("spider_param_quick_mode"); - DBUG_RETURN(THDVAR(thd, quick_mode) < 0 ? - quick_mode : THDVAR(thd, quick_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, quick_mode) /* - -1 :use table parameter + -1 :fallback to default 0-:number of records */ static MYSQL_THDVAR_LONGLONG( @@ -1347,23 +1151,16 @@ static MYSQL_THDVAR_LONGLONG( "Number of records in a page when acquisition one by one", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1024, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_quick_page_size( - THD *thd, - longlong quick_page_size -) { - DBUG_ENTER("spider_param_quick_page_size"); - DBUG_RETURN(THDVAR(thd, quick_page_size) < 0 ? - quick_page_size : THDVAR(thd, quick_page_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, quick_page_size) /* - -1 :use table parameter + -1 :fallback to default 0-:the limitation of memory size */ static MYSQL_THDVAR_LONGLONG( @@ -1372,23 +1169,16 @@ static MYSQL_THDVAR_LONGLONG( "The limitation of memory size in a page when acquisition one by one", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 10485760, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_quick_page_byte( - THD *thd, - longlong quick_page_byte -) { - DBUG_ENTER("spider_param_quick_page_byte"); - DBUG_RETURN(THDVAR(thd, quick_page_byte) < 0 ? - quick_page_byte : THDVAR(thd, quick_page_byte)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, quick_page_byte) /* - -1 :use table parameter + -1 :fallback to default 0 :It doesn't use low memory mode. 1 :It uses low memory mode. */ @@ -1398,23 +1188,16 @@ static MYSQL_THDVAR_INT( "Use low memory mode when SQL(SELECT) internally issued to a remote server is executed and get a result list", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_low_mem_read( - THD *thd, - int low_mem_read -) { - DBUG_ENTER("spider_param_low_mem_read"); - DBUG_RETURN(THDVAR(thd, low_mem_read) < 0 ? - low_mem_read : THDVAR(thd, low_mem_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, low_mem_read) /* - -1 :use table parameter + -1 :fallback to default 0 :Use index columns if select statement can solve by using index, otherwise use all columns. 1 :Use columns that are judged necessary. @@ -1425,24 +1208,17 @@ static MYSQL_THDVAR_INT( "The mode of using columns at select clause", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_select_column_mode( - THD *thd, - int select_column_mode -) { - DBUG_ENTER("spider_param_select_column_mode"); - DBUG_RETURN(THDVAR(thd, select_column_mode) == -1 ? - select_column_mode : THDVAR(thd, select_column_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, select_column_mode) #ifndef WITHOUT_SPIDER_BG_SEARCH /* - -1 :use table parameter + -1 :fallback to default 0 :background search is disabled 1 :background search is used if search with no lock 2 :background search is used if search with no lock or shared lock @@ -1454,23 +1230,16 @@ static MYSQL_THDVAR_INT( "Mode of background search", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 3, /* max */ 0 /* blk */ ); -int spider_param_bgs_mode( - THD *thd, - int bgs_mode -) { - DBUG_ENTER("spider_param_bgs_mode"); - DBUG_RETURN(THDVAR(thd, bgs_mode) < 0 ? - bgs_mode : THDVAR(thd, bgs_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bgs_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :records is gotten usually 1-:number of records */ @@ -1480,23 +1249,16 @@ static MYSQL_THDVAR_LONGLONG( "Number of first read records when background search is used", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 2, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_bgs_first_read( - THD *thd, - longlong bgs_first_read -) { - DBUG_ENTER("spider_param_bgs_first_read"); - DBUG_RETURN(THDVAR(thd, bgs_first_read) < 0 ? - bgs_first_read : THDVAR(thd, bgs_first_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, bgs_first_read) /* - -1 :use table parameter + -1 :fallback to default 0 :records is gotten usually 1-:number of records */ @@ -1506,24 +1268,17 @@ static MYSQL_THDVAR_LONGLONG( "Number of second read records when background search is used", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 100, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_bgs_second_read( - THD *thd, - longlong bgs_second_read -) { - DBUG_ENTER("spider_param_bgs_second_read"); - DBUG_RETURN(THDVAR(thd, bgs_second_read) < 0 ? - bgs_second_read : THDVAR(thd, bgs_second_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, bgs_second_read) #endif /* - -1 :use table parameter + -1 :fallback to default 0 :records is gotten usually 1-:number of records */ @@ -1533,23 +1288,16 @@ static MYSQL_THDVAR_LONGLONG( "Number of first read records", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_first_read( - THD *thd, - longlong first_read -) { - DBUG_ENTER("spider_param_first_read"); - DBUG_RETURN(THDVAR(thd, first_read) < 0 ? - first_read : THDVAR(thd, first_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, first_read) /* - -1 :use table parameter + -1 :fallback to default 0 :records is gotten usually 1-:number of records */ @@ -1559,23 +1307,16 @@ static MYSQL_THDVAR_LONGLONG( "Number of second read records", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_second_read( - THD *thd, - longlong second_read -) { - DBUG_ENTER("spider_param_second_read"); - DBUG_RETURN(THDVAR(thd, second_read) < 0 ? - second_read : THDVAR(thd, second_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, second_read) /* - -1 :use table parameter + -1 :fallback to default 0 :always get the newest information 1-:interval */ @@ -1585,23 +1326,16 @@ static MYSQL_THDVAR_INT( "Interval of cardinality confirmation.(second)", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 51, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -double spider_param_crd_interval( - THD *thd, - double crd_interval -) { - DBUG_ENTER("spider_param_crd_interval"); - DBUG_RETURN(THDVAR(thd, crd_interval) == -1 ? - crd_interval : THDVAR(thd, crd_interval)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(double, crd_interval) /* - -1 :use table parameter + -1 :fallback to default 0 :use table parameter 1 :use show command 2 :use information schema @@ -1613,24 +1347,17 @@ static MYSQL_THDVAR_INT( "Mode of cardinality confirmation.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 3, /* max */ 0 /* blk */ ); -int spider_param_crd_mode( - THD *thd, - int crd_mode -) { - DBUG_ENTER("spider_param_crd_mode"); - DBUG_RETURN(THDVAR(thd, crd_mode) <= 0 ? - crd_mode : THDVAR(thd, crd_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, crd_mode) #ifdef WITH_PARTITION_STORAGE_ENGINE /* - -1 :use table parameter + -1 :fallback to default 0 :No synchronization. 1 :Cardinality is synchronized when opening a table. Then no synchronization. @@ -1642,24 +1369,17 @@ static MYSQL_THDVAR_INT( "Cardinality synchronization in partitioned table.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_crd_sync( - THD *thd, - int crd_sync -) { - DBUG_ENTER("spider_param_crd_sync"); - DBUG_RETURN(THDVAR(thd, crd_sync) == -1 ? - crd_sync : THDVAR(thd, crd_sync)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, crd_sync) #endif /* - -1 :use table parameter + -1 :fallback to default 0 :The crd_weight is used as a fixed value. 1 :The crd_weight is used as an addition value. 2 :The crd_weight is used as a multiplication value. @@ -1670,23 +1390,16 @@ static MYSQL_THDVAR_INT( "Type of cardinality calculation.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 2, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_crd_type( - THD *thd, - int crd_type -) { - DBUG_ENTER("spider_param_crd_type"); - DBUG_RETURN(THDVAR(thd, crd_type) == -1 ? - crd_type : THDVAR(thd, crd_type)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, crd_type) /* - -1 :use table parameter + -1 :fallback to default 0-:weight */ static MYSQL_THDVAR_INT( @@ -1695,24 +1408,17 @@ static MYSQL_THDVAR_INT( "Weight coefficient to calculate effectiveness of index from cardinality of column.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 2, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -double spider_param_crd_weight( - THD *thd, - double crd_weight -) { - DBUG_ENTER("spider_param_crd_weight"); - DBUG_RETURN(THDVAR(thd, crd_weight) == -1 ? - crd_weight : THDVAR(thd, crd_weight)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(double, crd_weight) #ifndef WITHOUT_SPIDER_BG_SEARCH /* - -1 :use table parameter + -1 :fallback to default 0 :Background confirmation is disabled 1 :Background confirmation is enabled (create thread per table/partition) 2 :Background confirmation is enabled (use static threads) @@ -1723,24 +1429,17 @@ static MYSQL_THDVAR_INT( "Mode of cardinality confirmation at background.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 2, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_crd_bg_mode( - THD *thd, - int crd_bg_mode -) { - DBUG_ENTER("spider_param_crd_bg_mode"); - DBUG_RETURN(THDVAR(thd, crd_bg_mode) == -1 ? - crd_bg_mode : THDVAR(thd, crd_bg_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, crd_bg_mode) #endif /* - -1 :use table parameter + -1 :fallback to default 0 :always get the newest information 1-:interval */ @@ -1750,23 +1449,16 @@ static MYSQL_THDVAR_INT( "Interval of table state confirmation.(second)", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 10, /* def */ -1, /* min */ 2147483647, /* max */ 0 /* blk */ ); -double spider_param_sts_interval( - THD *thd, - double sts_interval -) { - DBUG_ENTER("spider_param_sts_interval"); - DBUG_RETURN(THDVAR(thd, sts_interval) == -1 ? - sts_interval : THDVAR(thd, sts_interval)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(double, sts_interval) /* - -1 :use table parameter + -1 :fallback to default 0 :use table parameter 1 :use show command 2 :use information schema @@ -1777,24 +1469,17 @@ static MYSQL_THDVAR_INT( "Mode of table state confirmation.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_sts_mode( - THD *thd, - int sts_mode -) { - DBUG_ENTER("spider_param_sts_mode"); - DBUG_RETURN(THDVAR(thd, sts_mode) <= 0 ? - sts_mode : THDVAR(thd, sts_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, sts_mode) #ifdef WITH_PARTITION_STORAGE_ENGINE /* - -1 :use table parameter + -1 :fallback to default 0 :No synchronization. 1 :Table state is synchronized when opening a table. Then no synchronization. @@ -1806,25 +1491,18 @@ static MYSQL_THDVAR_INT( "Table state synchronization in partitioned table.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_sts_sync( - THD *thd, - int sts_sync -) { - DBUG_ENTER("spider_param_sts_sync"); - DBUG_RETURN(THDVAR(thd, sts_sync) == -1 ? - sts_sync : THDVAR(thd, sts_sync)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, sts_sync) #endif #ifndef WITHOUT_SPIDER_BG_SEARCH /* - -1 :use table parameter + -1 :fallback to default 0 :Background confirmation is disabled 1 :Background confirmation is enabled (create thread per table/partition) 2 :Background confirmation is enabled (use static threads) @@ -1835,20 +1513,13 @@ static MYSQL_THDVAR_INT( "Mode of table state confirmation at background.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 2, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_sts_bg_mode( - THD *thd, - int sts_bg_mode -) { - DBUG_ENTER("spider_param_sts_bg_mode"); - DBUG_RETURN(THDVAR(thd, sts_bg_mode) == -1 ? - sts_bg_mode : THDVAR(thd, sts_bg_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, sts_bg_mode) #endif /* @@ -1867,12 +1538,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -double spider_param_ping_interval_at_trx_start( - THD *thd -) { - DBUG_ENTER("spider_param_ping_interval_at_trx_start"); - DBUG_RETURN(THDVAR(thd, ping_interval_at_trx_start)); -} +SPIDER_THDVAR_VALUE_FUNC(double, ping_interval_at_trx_start) #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) /* @@ -1900,7 +1566,7 @@ double spider_param_hs_ping_interval( #endif /* - -1 :use table parameter + -1 :fallback to default 0 :normal mode 1 :quick mode 2 :set 0 value @@ -1911,20 +1577,13 @@ static MYSQL_THDVAR_INT( "Mode of auto increment.", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 3, /* max */ 0 /* blk */ ); -int spider_param_auto_increment_mode( - THD *thd, - int auto_increment_mode -) { - DBUG_ENTER("spider_param_auto_increment_mode"); - DBUG_RETURN(THDVAR(thd, auto_increment_mode) == -1 ? - auto_increment_mode : THDVAR(thd, auto_increment_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, auto_increment_mode) /* FALSE: off @@ -1939,12 +1598,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_same_server_link( - THD *thd -) { - DBUG_ENTER("spider_param_same_server_link"); - DBUG_RETURN(THDVAR(thd, same_server_link)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, same_server_link) /* FALSE: transmits @@ -1960,15 +1614,10 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_local_lock_table( - THD *thd -) { - DBUG_ENTER("spider_param_local_lock_table"); - DBUG_RETURN(THDVAR(thd, local_lock_table)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, local_lock_table) /* - -1 :use table parameter + -1 :fallback to default 0 :don't transmit 1 :transmits */ @@ -1984,17 +1633,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_use_pushdown_udf( - THD *thd, - int use_pushdown_udf -) { - DBUG_ENTER("spider_param_use_pushdown_udf"); - DBUG_RETURN(THDVAR(thd, use_pushdown_udf) == -1 ? - use_pushdown_udf : THDVAR(thd, use_pushdown_udf)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, use_pushdown_udf) /* - -1 :use table parameter + -1 :fallback to default 0 :duplicate check on local server 1 :avoid duplicate check on local server */ @@ -2004,20 +1646,13 @@ static MYSQL_THDVAR_INT( "Execute \"REPLACE\" and \"INSERT IGNORE\" on remote server and avoid duplicate check on local server", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_direct_dup_insert( - THD *thd, - int direct_dup_insert -) { - DBUG_ENTER("spider_param_direct_dup_insert"); - DBUG_RETURN(THDVAR(thd, direct_dup_insert) < 0 ? - direct_dup_insert : THDVAR(thd, direct_dup_insert)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, direct_dup_insert) static uint spider_udf_table_lock_mutex_count; /* @@ -2036,11 +1671,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_udf_table_lock_mutex_count() -{ - DBUG_ENTER("spider_param_udf_table_lock_mutex_count"); - DBUG_RETURN(spider_udf_table_lock_mutex_count); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, udf_table_lock_mutex_count) static uint spider_udf_table_mon_mutex_count; /* @@ -2059,11 +1690,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_udf_table_mon_mutex_count() -{ - DBUG_ENTER("spider_param_udf_table_mon_mutex_count"); - DBUG_RETURN(spider_udf_table_mon_mutex_count); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, udf_table_mon_mutex_count) /* 1-:number of rows @@ -2074,23 +1701,16 @@ static MYSQL_THDVAR_LONGLONG( "Number of rows for bulk inserting", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 3000, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_udf_ds_bulk_insert_rows( - THD *thd, - longlong udf_ds_bulk_insert_rows -) { - DBUG_ENTER("spider_param_udf_ds_bulk_insert_rows"); - DBUG_RETURN(THDVAR(thd, udf_ds_bulk_insert_rows) <= 0 ? - udf_ds_bulk_insert_rows : THDVAR(thd, udf_ds_bulk_insert_rows)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, udf_ds_bulk_insert_rows) /* - -1 :use table parameter + -1 :fallback to default 0 :drop records 1 :insert last table 2 :insert first table and loop again @@ -2101,20 +1721,13 @@ static MYSQL_THDVAR_INT( "Table loop mode if the number of tables in table list are less than the number of result sets", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_udf_ds_table_loop_mode( - THD *thd, - int udf_ds_table_loop_mode -) { - DBUG_ENTER("spider_param_udf_ds_table_loop_mode"); - DBUG_RETURN(THDVAR(thd, udf_ds_table_loop_mode) == -1 ? - udf_ds_table_loop_mode : THDVAR(thd, udf_ds_table_loop_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, udf_ds_table_loop_mode) static char *spider_remote_access_charset; /* @@ -2155,11 +1768,7 @@ static MYSQL_SYSVAR_STR( #endif #endif -char *spider_param_remote_access_charset() -{ - DBUG_ENTER("spider_param_remote_access_charset"); - DBUG_RETURN(spider_remote_access_charset); -} +SPIDER_SYSVAR_VALUE_FUNC(char*, remote_access_charset) static int spider_remote_autocommit; /* @@ -2180,11 +1789,7 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_remote_autocommit() -{ - DBUG_ENTER("spider_param_remote_autocommit"); - DBUG_RETURN(spider_remote_autocommit); -} +SPIDER_SYSVAR_VALUE_FUNC(int, remote_autocommit) static char *spider_remote_time_zone; /* @@ -2225,11 +1830,7 @@ static MYSQL_SYSVAR_STR( #endif #endif -char *spider_param_remote_time_zone() -{ - DBUG_ENTER("spider_param_remote_time_zone"); - DBUG_RETURN(spider_remote_time_zone); -} +SPIDER_SYSVAR_VALUE_FUNC(char *, remote_time_zone) static int spider_remote_sql_log_off; /* @@ -2250,11 +1851,7 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_remote_sql_log_off() -{ - DBUG_ENTER("spider_param_remote_sql_log_off"); - DBUG_RETURN(spider_remote_sql_log_off); -} +SPIDER_SYSVAR_VALUE_FUNC(int, remote_sql_log_off) static int spider_remote_trx_isolation; /* @@ -2277,11 +1874,7 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_remote_trx_isolation() -{ - DBUG_ENTER("spider_param_remote_trx_isolation"); - DBUG_RETURN(spider_remote_trx_isolation); -} +SPIDER_SYSVAR_VALUE_FUNC(int, remote_trx_isolation) static char *spider_remote_default_database; /* @@ -2322,11 +1915,7 @@ static MYSQL_SYSVAR_STR( #endif #endif -char *spider_param_remote_default_database() -{ - DBUG_ENTER("spider_param_remote_default_database"); - DBUG_RETURN(spider_remote_default_database); -} +SPIDER_SYSVAR_VALUE_FUNC(char *, remote_default_database) /* 0-:connect retry interval (micro second) @@ -2416,12 +2005,11 @@ char *spider_param_bka_engine( char *bka_engine ) { DBUG_ENTER("spider_param_bka_engine"); - DBUG_RETURN(THDVAR(thd, bka_engine) ? - THDVAR(thd, bka_engine) : bka_engine); + DBUG_RETURN(bka_engine ? bka_engine : THDVAR(thd, bka_engine)); } /* - -1 :use table parameter + -1 :fallback to default 0 :use union all 1 :use temporary table */ @@ -2431,24 +2019,17 @@ static MYSQL_THDVAR_INT( "Mode of BKA for Spider", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_bka_mode( - THD *thd, - int bka_mode -) { - DBUG_ENTER("spider_param_bka_mode"); - DBUG_RETURN(THDVAR(thd, bka_mode) == -1 ? - bka_mode : THDVAR(thd, bka_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bka_mode) static int spider_udf_ct_bulk_insert_interval; /* - -1 : The UDF parameter is adopted. + -1 : Fallback to default. 0 or more : Milliseconds. */ static MYSQL_SYSVAR_INT( @@ -2458,23 +2039,17 @@ static MYSQL_SYSVAR_INT( "The interval time between bulk insert and next bulk insert at coping", NULL, NULL, - -1, + 10, -1, 2147483647, 0 ); -int spider_param_udf_ct_bulk_insert_interval( - int udf_ct_bulk_insert_interval -) { - DBUG_ENTER("spider_param_udf_ct_bulk_insert_interval"); - DBUG_RETURN(spider_udf_ct_bulk_insert_interval < 0 ? - udf_ct_bulk_insert_interval : spider_udf_ct_bulk_insert_interval); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, udf_ct_bulk_insert_interval) static longlong spider_udf_ct_bulk_insert_rows; /* - -1,0 : The UDF parameter is adopted. + -1,0 : Fallback to default. 1 or more : Number of rows. */ static MYSQL_SYSVAR_LONGLONG( @@ -2484,19 +2059,13 @@ static MYSQL_SYSVAR_LONGLONG( "The number of rows inserted with bulk insert of one time at coping", NULL, NULL, - -1, + 100, -1, 9223372036854775807LL, 0 ); -longlong spider_param_udf_ct_bulk_insert_rows( - longlong udf_ct_bulk_insert_rows -) { - DBUG_ENTER("spider_param_udf_ct_bulk_insert_rows"); - DBUG_RETURN(spider_udf_ct_bulk_insert_rows <= 0 ? - udf_ct_bulk_insert_rows : spider_udf_ct_bulk_insert_rows); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(longlong, udf_ct_bulk_insert_rows) #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) /* @@ -2594,7 +2163,7 @@ uint spider_param_hs_w_conn_recycle_strict( } /* - -1 :use table parameter + -1 :fallback to default 0 :not use 1 :use handlersocket */ @@ -2604,23 +2173,16 @@ static MYSQL_THDVAR_INT( "Use handlersocket for reading", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_use_hs_read( - THD *thd, - int use_hs_read -) { - DBUG_ENTER("spider_param_use_hs_read"); - DBUG_RETURN(THDVAR(thd, use_hs_read) == -1 ? - use_hs_read : THDVAR(thd, use_hs_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUN(int, use_hs_read) /* - -1 :use table parameter + -1 :fallback to default 0 :not use 1 :use handlersocket */ @@ -2630,24 +2192,17 @@ static MYSQL_THDVAR_INT( "Use handlersocket for writing", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_use_hs_write( - THD *thd, - int use_hs_write -) { - DBUG_ENTER("spider_param_use_hs_write"); - DBUG_RETURN(THDVAR(thd, use_hs_write) == -1 ? - use_hs_write : THDVAR(thd, use_hs_write)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUN(int, use_hs_write) #endif /* - -1 :use table parameter + -1 :fallback to default 0 :not use 1 :use handler */ @@ -2657,23 +2212,16 @@ static MYSQL_THDVAR_INT( "Use handler for reading", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 3, /* max */ 0 /* blk */ ); -int spider_param_use_handler( - THD *thd, - int use_handler -) { - DBUG_ENTER("spider_param_use_handler"); - DBUG_RETURN(THDVAR(thd, use_handler) == -1 ? - use_handler : THDVAR(thd, use_handler)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, use_handler) /* - -1 :use table parameter + -1 :fallback to default 0 :return error if error 1 :return 0 record if error */ @@ -2683,23 +2231,16 @@ static MYSQL_THDVAR_INT( "Read error mode if error", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_error_read_mode( - THD *thd, - int error_read_mode -) { - DBUG_ENTER("spider_param_error_read_mode"); - DBUG_RETURN(THDVAR(thd, error_read_mode) == -1 ? - error_read_mode : THDVAR(thd, error_read_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, error_read_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :return error if error 1 :return 0 record if error */ @@ -2709,23 +2250,16 @@ static MYSQL_THDVAR_INT( "Write error mode if error", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_error_write_mode( - THD *thd, - int error_write_mode -) { - DBUG_ENTER("spider_param_error_write_mode"); - DBUG_RETURN(THDVAR(thd, error_write_mode) == -1 ? - error_write_mode : THDVAR(thd, error_write_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, error_write_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :not skip 1 :skip */ @@ -2735,23 +2269,16 @@ static MYSQL_THDVAR_INT( "Skip generating internal default condition", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_skip_default_condition( - THD *thd, - int skip_default_condition -) { - DBUG_ENTER("spider_param_skip_default_condition"); - DBUG_RETURN(THDVAR(thd, skip_default_condition) == -1 ? - skip_default_condition : THDVAR(thd, skip_default_condition)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, skip_default_condition) /* - -1 :use table parameter + -1 :fallback to default 0 :not skip 1 :skip parallel search if query is not SELECT statement 2 :skip parallel search if query has SQL_NO_CACHE @@ -2763,23 +2290,16 @@ static MYSQL_THDVAR_INT( "Skip parallel search by specific conditions", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 3, /* max */ 0 /* blk */ ); -int spider_param_skip_parallel_search( - THD *thd, - int skip_parallel_search -) { - DBUG_ENTER("spider_param_skip_parallel_search"); - DBUG_RETURN(THDVAR(thd, skip_parallel_search) == -1 ? - skip_parallel_search : THDVAR(thd, skip_parallel_search)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, skip_parallel_search) /* - -1 :use table parameter + -1 :fallback to default 0 :not send directly 1-:send directly */ @@ -2789,23 +2309,16 @@ static MYSQL_THDVAR_LONGLONG( "Send 'ORDER BY' and 'LIMIT' to remote server directly", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 9223372036854775807LL, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_direct_order_limit( - THD *thd, - longlong direct_order_limit -) { - DBUG_ENTER("spider_param_direct_order_limit"); - DBUG_RETURN(THDVAR(thd, direct_order_limit) == -1 ? - direct_order_limit : THDVAR(thd, direct_order_limit)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, direct_order_limit) /* - -1 :use table parameter + -1 :fallback to default 0 :writable 1 :read only */ @@ -2815,25 +2328,18 @@ static MYSQL_THDVAR_INT( "Read only", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_read_only_mode( - THD *thd, - int read_only_mode -) { - DBUG_ENTER("spider_param_read_only_mode"); - DBUG_RETURN(THDVAR(thd, read_only_mode) == -1 ? - read_only_mode : THDVAR(thd, read_only_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, read_only_mode) #ifdef HA_CAN_BULK_ACCESS static int spider_bulk_access_free; /* - -1 :use table parameter + -1 :fallback to default 0 :in reset 1 :in close */ @@ -2844,25 +2350,19 @@ static MYSQL_SYSVAR_INT( "Free mode of bulk access resources", NULL, NULL, - -1, + 0, -1, 1, 0 ); -int spider_param_bulk_access_free( - int bulk_access_free -) { - DBUG_ENTER("spider_param_bulk_access_free"); - DBUG_RETURN(spider_bulk_access_free == -1 ? - bulk_access_free : spider_bulk_access_free); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUN(int, bulk_access_free) #endif #if MYSQL_VERSION_ID < 50500 #else /* - -1 :use UDF parameter + -1 :fallback to default 0 :can not use 1 :can use */ @@ -2872,20 +2372,13 @@ static MYSQL_THDVAR_INT( "Use real table for temporary table list", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_udf_ds_use_real_table( - THD *thd, - int udf_ds_use_real_table -) { - DBUG_ENTER("spider_param_udf_ds_use_real_table"); - DBUG_RETURN(THDVAR(thd, udf_ds_use_real_table) == -1 ? - udf_ds_use_real_table : THDVAR(thd, udf_ds_use_real_table)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, udf_ds_use_real_table) #endif static my_bool spider_general_log; @@ -2899,11 +2392,7 @@ static MYSQL_SYSVAR_BOOL( FALSE ); -my_bool spider_param_general_log() -{ - DBUG_ENTER("spider_param_general_log"); - DBUG_RETURN(spider_general_log); -} +SPIDER_SYSVAR_VALUE_FUNC(my_bool, general_log) /* FALSE: no pushdown hints @@ -2918,12 +2407,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -my_bool spider_param_index_hint_pushdown( - THD *thd -) { - DBUG_ENTER("spider_param_index_hint_pushdown"); - DBUG_RETURN(THDVAR(thd, index_hint_pushdown)); -} +SPIDER_THDVAR_VALUE_FUNC(my_bool, index_hint_pushdown) static uint spider_max_connections; static MYSQL_SYSVAR_UINT( @@ -2939,11 +2423,7 @@ static MYSQL_SYSVAR_UINT( 0 /* blk */ ); -uint spider_param_max_connections() -{ - DBUG_ENTER("spider_param_max_connections"); - DBUG_RETURN(spider_max_connections); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, max_connections) static uint spider_conn_wait_timeout; static MYSQL_SYSVAR_UINT( @@ -2959,11 +2439,7 @@ static MYSQL_SYSVAR_UINT( 0 /* blk */ ); -uint spider_param_conn_wait_timeout() -{ - DBUG_ENTER("spider_param_conn_wait_timeout"); - DBUG_RETURN(spider_conn_wait_timeout); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, conn_wait_timeout) static uint spider_log_result_errors; /* @@ -2986,11 +2462,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_log_result_errors() -{ - DBUG_ENTER("spider_param_log_result_errors"); - DBUG_RETURN(spider_log_result_errors); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, log_result_errors) static uint spider_log_result_error_with_sql; /* @@ -3012,11 +2484,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_log_result_error_with_sql() -{ - DBUG_ENTER("spider_param_log_result_error_with_sql"); - DBUG_RETURN(spider_log_result_error_with_sql); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, log_result_error_with_sql) static char *spider_version = (char *) SPIDER_DETAIL_VERSION; static MYSQL_SYSVAR_STR( @@ -3045,15 +2513,10 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_internal_xa_id_type( - THD *thd -) { - DBUG_ENTER("spider_param_internal_xa_id_type"); - DBUG_RETURN(THDVAR(thd, internal_xa_id_type)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, internal_xa_id_type) /* - -1 :use table parameter + -1 :fallback to default 0 :OFF 1 :automatic channel 2-63 :use custom channel @@ -3064,20 +2527,13 @@ static MYSQL_THDVAR_INT( "Read casually if it is possible", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 63, /* max */ 0 /* blk */ ); -int spider_param_casual_read( - THD *thd, - int casual_read -) { - DBUG_ENTER("spider_param_casual_read"); - DBUG_RETURN(THDVAR(thd, casual_read) == -1 ? - casual_read : THDVAR(thd, casual_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, casual_read) static my_bool spider_dry_access; static MYSQL_SYSVAR_BOOL( @@ -3090,14 +2546,10 @@ static MYSQL_SYSVAR_BOOL( FALSE ); -my_bool spider_param_dry_access() -{ - DBUG_ENTER("spider_param_dry_access"); - DBUG_RETURN(spider_dry_access); -} +SPIDER_SYSVAR_VALUE_FUNC(my_bool, dry_access) /* - -1 :use table parameter + -1 :fallback to default 0 :fast 1 :correct delete row number */ @@ -3107,23 +2559,16 @@ static MYSQL_THDVAR_INT( "The type of delete_all_rows", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_delete_all_rows_type( - THD *thd, - int delete_all_rows_type -) { - DBUG_ENTER("spider_param_delete_all_rows_type"); - DBUG_RETURN(THDVAR(thd, delete_all_rows_type) == -1 ? - delete_all_rows_type : THDVAR(thd, delete_all_rows_type)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, delete_all_rows_type) /* - -1 :use table parameter + -1 :fallback to default 0 :compact 1 :add original table name */ @@ -3133,23 +2578,16 @@ static MYSQL_THDVAR_INT( "The type of temporary table name for bka", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_bka_table_name_type( - THD *thd, - int bka_table_name_type -) { - DBUG_ENTER("spider_param_bka_table_name_type"); - DBUG_RETURN(THDVAR(thd, bka_table_name_type) == -1 ? - bka_table_name_type : THDVAR(thd, bka_table_name_type)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bka_table_name_type) /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :on */ @@ -3165,16 +2603,11 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_use_cond_other_than_pk_for_update( - THD *thd -) { - DBUG_ENTER("spider_param_reset_sql_alloc"); - DBUG_RETURN(THDVAR(thd, use_cond_other_than_pk_for_update)); -} +SPIDER_THDVAR_VALUE_FUNC(int, use_cond_other_than_pk_for_update) static int spider_store_last_sts; /* - -1 : use table parameter + -1 : fallback to default 0 : do not store 1 : do store */ @@ -3185,23 +2618,17 @@ static MYSQL_SYSVAR_INT( "Store last sts result into system table", NULL, NULL, - -1, + 1, -1, 1, 0 ); -int spider_param_store_last_sts( - int store_last_sts -) { - DBUG_ENTER("spider_param_store_last_sts"); - DBUG_RETURN(spider_store_last_sts == -1 ? - store_last_sts : spider_store_last_sts); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, store_last_sts) static int spider_store_last_crd; /* - -1 : use table parameter + -1 : fallback to default 0 : do not store 1 : do store */ @@ -3212,23 +2639,17 @@ static MYSQL_SYSVAR_INT( "Store last crd result into system table", NULL, NULL, - -1, + 1, -1, 1, 0 ); -int spider_param_store_last_crd( - int store_last_crd -) { - DBUG_ENTER("spider_param_store_last_crd"); - DBUG_RETURN(spider_store_last_crd == -1 ? - store_last_crd : spider_store_last_crd); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, store_last_crd) static int spider_load_sts_at_startup; /* - -1 : use table parameter + -1 : fallback to default 0 : do not load 1 : do load */ @@ -3239,23 +2660,17 @@ static MYSQL_SYSVAR_INT( "Load sts from system table at startup", NULL, NULL, - -1, + 1, -1, 1, 0 ); -int spider_param_load_sts_at_startup( - int load_sts_at_startup -) { - DBUG_ENTER("spider_param_load_sts_at_startup"); - DBUG_RETURN(spider_load_sts_at_startup == -1 ? - load_sts_at_startup : spider_load_sts_at_startup); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, load_sts_at_startup) static int spider_load_crd_at_startup; /* - -1 : use table parameter + -1 : fallback to default 0 : do not load 1 : do load */ @@ -3266,19 +2681,13 @@ static MYSQL_SYSVAR_INT( "Load crd from system table at startup", NULL, NULL, - -1, + 1, -1, 1, 0 ); -int spider_param_load_crd_at_startup( - int load_crd_at_startup -) { - DBUG_ENTER("spider_param_load_crd_at_startup"); - DBUG_RETURN(spider_load_crd_at_startup == -1 ? - load_crd_at_startup : spider_load_crd_at_startup); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, load_crd_at_startup) #ifndef WITHOUT_SPIDER_BG_SEARCH static uint spider_table_sts_thread_count; @@ -3298,11 +2707,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_table_sts_thread_count() -{ - DBUG_ENTER("spider_param_table_sts_thread_count"); - DBUG_RETURN(spider_table_sts_thread_count); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, table_sts_thread_count) static uint spider_table_crd_thread_count; /* @@ -3321,11 +2726,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_table_crd_thread_count() -{ - DBUG_ENTER("spider_param_table_crd_thread_count"); - DBUG_RETURN(spider_table_crd_thread_count); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, table_crd_thread_count) #endif static int spider_slave_trx_isolation; @@ -3349,11 +2750,7 @@ static MYSQL_SYSVAR_INT( 0 /* blk */ ); -int spider_param_slave_trx_isolation() -{ - DBUG_ENTER("spider_param_slave_trx_isolation"); - DBUG_RETURN(spider_slave_trx_isolation); -} +SPIDER_SYSVAR_VALUE_FUNC(int, slave_trx_isolation) /* -1 :not set @@ -3418,12 +2815,7 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_sync_sql_mode( - THD *thd -) { - DBUG_ENTER("spider_param_sync_sql_mode"); - DBUG_RETURN(THDVAR(thd, sync_sql_mode)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, sync_sql_mode) static struct st_mysql_storage_engine spider_storage_engine = { MYSQL_HANDLERTON_INTERFACE_VERSION }; diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 2ff97ce3577..a07df994e46 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -3700,10 +3700,6 @@ int spider_set_connect_info_default( #endif #if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) - if (share->use_hs_reads[roop_count] == -1) - share->use_hs_reads[roop_count] = 0; - if (share->use_hs_writes[roop_count] == -1) - share->use_hs_writes[roop_count] = 0; if (share->hs_read_ports[roop_count] == -1) { share->hs_read_ports[roop_count] = 9998; @@ -3735,154 +3731,24 @@ int spider_set_connect_info_default( share->hs_write_to_reads[roop_count] = 1; } #endif - if (share->use_handlers[roop_count] == -1) - share->use_handlers[roop_count] = 0; - if (share->connect_timeouts[roop_count] == -1) - share->connect_timeouts[roop_count] = 6; - if (share->net_read_timeouts[roop_count] == -1) - share->net_read_timeouts[roop_count] = 600; - if (share->net_write_timeouts[roop_count] == -1) - share->net_write_timeouts[roop_count] = 600; if (share->access_balances[roop_count] == -1) share->access_balances[roop_count] = 100; - if (share->bka_table_name_types[roop_count] == -1) - share->bka_table_name_types[roop_count] = 0; } -#ifndef WITHOUT_SPIDER_BG_SEARCH - if (share->sts_bg_mode == -1) - share->sts_bg_mode = 2; -#endif - if (share->sts_interval == -1) - share->sts_interval = 10; - if (share->sts_mode == -1) - share->sts_mode = 1; -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (share->sts_sync == -1) - share->sts_sync = 0; -#endif - if (share->store_last_sts == -1) - share->store_last_sts = 1; - if (share->load_sts_at_startup == -1) - share->load_sts_at_startup = 1; -#ifndef WITHOUT_SPIDER_BG_SEARCH - if (share->crd_bg_mode == -1) - share->crd_bg_mode = 2; -#endif - if (share->crd_interval == -1) - share->crd_interval = 51; - if (share->crd_mode == -1) - share->crd_mode = 1; -#ifdef WITH_PARTITION_STORAGE_ENGINE - if (share->crd_sync == -1) - share->crd_sync = 0; -#endif - if (share->store_last_crd == -1) - share->store_last_crd = 1; - if (share->load_crd_at_startup == -1) - share->load_crd_at_startup = 1; - if (share->crd_type == -1) - share->crd_type = 2; - if (share->crd_weight == -1) - share->crd_weight = 2; - if (share->internal_offset == -1) - share->internal_offset = 0; - if (share->internal_limit == -1) - share->internal_limit = 9223372036854775807LL; - if (share->split_read == -1) - share->split_read = 9223372036854775807LL; - if (share->semi_split_read == -1) - share->semi_split_read = 2; - if (share->semi_split_read_limit == -1) - share->semi_split_read_limit = 9223372036854775807LL; - if (share->init_sql_alloc_size == -1) - share->init_sql_alloc_size = 1024; - if (share->reset_sql_alloc == -1) - share->reset_sql_alloc = 1; - if (share->multi_split_read == -1) - share->multi_split_read = 100; - if (share->max_order == -1) - share->max_order = 32767; - if (share->semi_table_lock == -1) - share->semi_table_lock = 0; - if (share->semi_table_lock_conn == -1) - share->semi_table_lock_conn = 1; - if (share->selupd_lock_mode == -1) - share->selupd_lock_mode = 1; if (share->query_cache == -1) share->query_cache = 0; if (share->query_cache_sync == -1) share->query_cache_sync = 0; - if (share->bulk_size == -1) - share->bulk_size = 16000; - if (share->bulk_update_mode == -1) - share->bulk_update_mode = 0; - if (share->bulk_update_size == -1) - share->bulk_update_size = 16000; - if (share->internal_optimize == -1) - share->internal_optimize = 0; - if (share->internal_optimize_local == -1) - share->internal_optimize_local = 0; if (share->scan_rate == -1) share->scan_rate = 1; if (share->read_rate == -1) share->read_rate = 0.0002; if (share->priority == -1) share->priority = 1000000; - if (share->quick_mode == -1) - share->quick_mode = 3; - if (share->quick_page_size == -1) - share->quick_page_size = 1024; - if (share->quick_page_byte == -1) - share->quick_page_byte = 10485760; - if (share->low_mem_read == -1) - share->low_mem_read = 1; if (share->table_count_mode == -1) share->table_count_mode = 0; - if (share->select_column_mode == -1) - share->select_column_mode = 1; -#ifndef WITHOUT_SPIDER_BG_SEARCH - if (share->bgs_mode == -1) - share->bgs_mode = 0; - if (share->bgs_first_read == -1) - share->bgs_first_read = 2; - if (share->bgs_second_read == -1) - share->bgs_second_read = 100; -#endif - if (share->first_read == -1) - share->first_read = 0; - if (share->second_read == -1) - share->second_read = 0; - if (share->auto_increment_mode == -1) - share->auto_increment_mode = 0; - if (share->use_table_charset == -1) - share->use_table_charset = 1; - if (share->use_pushdown_udf == -1) - share->use_pushdown_udf = 1; - if (share->skip_default_condition == -1) - share->skip_default_condition = 0; - if (share->skip_parallel_search == -1) - share->skip_parallel_search = 0; - if (share->direct_dup_insert == -1) - share->direct_dup_insert = 0; - if (share->direct_order_limit == -1) - share->direct_order_limit = 9223372036854775807LL; - if (share->read_only_mode == -1) - share->read_only_mode = 0; - if (share->error_read_mode == -1) - share->error_read_mode = 0; - if (share->error_write_mode == -1) - share->error_write_mode = 0; if (share->active_link_count == -1) share->active_link_count = share->all_link_count; -#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) - if (share->hs_result_free_size == -1) - share->hs_result_free_size = 1048576; -#endif -#ifdef HA_CAN_BULK_ACCESS - if (share->bulk_access_free == -1) - share->bulk_access_free = 0; -#endif #ifdef HA_CAN_FORCE_BULK_UPDATE if (share->force_bulk_update == -1) share->force_bulk_update = 0; @@ -3891,18 +3757,6 @@ int spider_set_connect_info_default( if (share->force_bulk_delete == -1) share->force_bulk_delete = 0; #endif - if (share->casual_read == -1) - share->casual_read = 0; - if (share->delete_all_rows_type == -1) - { -#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS - share->delete_all_rows_type = 1; -#else - share->delete_all_rows_type = 0; -#endif - } - if (share->bka_mode == -1) - share->bka_mode = 1; if (!share->bka_engine) { DBUG_PRINT("info",("spider create default bka_engine")); From b884216be74bad8c79417633fa40d63fce7931cf Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Fri, 14 Jul 2023 10:13:17 +0200 Subject: [PATCH 100/171] MDEV-28017 Illegal mix of collations (cp1251_general_ci,IMPLICIT), (latin1_swedish_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE) for operation 'between' Correct test fix is to disable service connection to create views in connection with correct charset settings. --- mysql-test/main/ctype_recoding.test | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mysql-test/main/ctype_recoding.test b/mysql-test/main/ctype_recoding.test index cc58d4aeff9..9b5f74d0b93 100644 --- a/mysql-test/main/ctype_recoding.test +++ b/mysql-test/main/ctype_recoding.test @@ -178,8 +178,7 @@ drop table t1; # # Check more automatic conversion # -# Enable view protocol after fix MDEV-28017 ---disable_view_protocol +--disable_service_connection set names koi8r; create table t1 (c1 char(10) character set cp1251); insert into t1 values ('ß'); @@ -204,7 +203,7 @@ select rpad(c1,3,' #select case c1 when 'ß' then 'ß' when 'ö' then 'ö' else 'c' end from t1; #select export_set(5,c1,'ö'), export_set(5,'ö',c1) from t1; drop table t1; ---enable_view_protocol +--enable_service_connection # # Bug 20695: problem with field default value's character set From 400c101332962ffae18bc9d9be80248a79557f04 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 14 Jul 2023 12:14:56 +0400 Subject: [PATCH 101/171] MDEV-30662 SQL/PL package body does not appear in I_S.ROUTINES.ROUTINE_DEFINITION - Moving the code from a public function trim_whitespaces() to the class Lex_cstring as methods. This code may be useful in other contexts, and also this code becomes visible inside sql_class.h - Adding a helper method THD::strmake_lex_cstring_trim_whitespaces() - Unifying the way how CREATE PROCEDURE/CREATE FUNCTION and CREATE PACKAGE/CREATE PACKAGE BODY work: a) Now CREATE PACKAGE/CREATE PACKAGE BODY also calls Lex->sphead->set_body_start() to remember the cpp body start inside an sp_head member. b) adding a "const char *cpp_body_end" parameter to sp_head::set_stmt_end(). These changes made it possible to reuse sp_head::set_stmt_end() inside LEX::create_package_finalize() and remove the duplucate code. - Renaming sp_head::m_body_begin to m_cpp_body_begin and adding a comment to make it clear that this member is used only during parsing, and points to a fragment inside the cpp buffer. - Changed sp_head::set_body_start() and sp_head::set_stmt_end() to skip the calls related to "body_utf8" in cases when m_parent is not NULL. A non-NULL m_parent means that we're inside a package routine. "body_utf8" in such case belongs not to the current sphead itself, but to parent (the package) sphead. So an sphead instance of a package routine should neither initialize, nor finalize, nor change in any other ways the "body_utf8" related members of Lex_input_stream, and should not take over or copy "body_utf8" data from Lex_input_stream to "this". --- .../compat/oracle/r/rpl_sp_package.result | 16 +++- .../compat/oracle/r/sp-package-i_s.result | 75 +++++++++++++++++++ .../suite/compat/oracle/r/sp-package.result | 38 +++++++++- .../suite/compat/oracle/t/sp-package-i_s.test | 69 +++++++++++++++++ sql/lex_string.h | 54 +++++++++++++ sql/sp_head.cc | 31 ++++---- sql/sp_head.h | 13 +++- sql/sql_class.h | 4 + sql/sql_lex.cc | 45 +---------- sql/sql_lex.h | 20 +++-- sql/sql_yacc.yy | 16 ++-- 11 files changed, 293 insertions(+), 88 deletions(-) create mode 100644 mysql-test/suite/compat/oracle/r/sp-package-i_s.result create mode 100644 mysql-test/suite/compat/oracle/t/sp-package-i_s.test diff --git a/mysql-test/suite/compat/oracle/r/rpl_sp_package.result b/mysql-test/suite/compat/oracle/r/rpl_sp_package.result index 2f10ec8ccd9..4c4995269fc 100644 --- a/mysql-test/suite/compat/oracle/r/rpl_sp_package.result +++ b/mysql-test/suite/compat/oracle/r/rpl_sp_package.result @@ -43,7 +43,10 @@ comment character_set_client latin1 collation_connection latin1_swedish_ci db_collation latin1_swedish_ci -body_utf8 +body_utf8 AS +FUNCTION f1 RETURN INT; +PROCEDURE p1; +END aggregate NONE db test name pack @@ -73,7 +76,16 @@ comment character_set_client latin1 collation_connection latin1_swedish_ci db_collation latin1_swedish_ci -body_utf8 +body_utf8 AS +FUNCTION f1 RETURN INT AS +BEGIN +RETURN 10; +END; +PROCEDURE p1 AS +BEGIN +SELECT f1(); +END; +END aggregate NONE SELECT * FROM mysql.proc WHERE db='test' AND name LIKE 'pack.%'; SET @@sql_mode=ORACLE; diff --git a/mysql-test/suite/compat/oracle/r/sp-package-i_s.result b/mysql-test/suite/compat/oracle/r/sp-package-i_s.result new file mode 100644 index 00000000000..2f4201f7d60 --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/sp-package-i_s.result @@ -0,0 +1,75 @@ +# +# Start of 10.5 tests +# +# +# MDEV-30662 SQL/PL package body does not appear in I_S.ROUTINES.ROUTINE_DEFINITION +# +SET sql_mode=ORACLE; +CREATE OR REPLACE PACKAGE pkg1 AS +FUNCTION f1() RETURN INT; +END; +$$ +CREATE PACKAGE BODY pkg1 AS +FUNCTION f1() RETURN INT AS +BEGIN +RETURN 1; +END; +END; +$$ +SELECT routine_name, routine_type, routine_definition +FROM information_schema.routines +WHERE routine_type LIKE 'PACKAGE%' +ORDER BY routine_type; +routine_name pkg1 +routine_type PACKAGE +routine_definition AS +FUNCTION f1() RETURN INT; +END +routine_name pkg1 +routine_type PACKAGE BODY +routine_definition AS +FUNCTION f1() RETURN INT AS +BEGIN +RETURN 1; +END; +END +DROP PACKAGE pkg1; +SET sql_mode=ORACLE; +CREATE OR REPLACE PACKAGE pkg1 AS +FUNCTION f1() RETURN INT; +END; +$$ +CREATE PACKAGE BODY pkg1 AS +FUNCTION f1() RETURN INT AS +BEGIN +RETURN 1; +END; +BEGIN +SET @a=10; +SET @a=f1(); +END; +$$ +SELECT routine_name, routine_type, routine_definition +FROM information_schema.routines +WHERE routine_type LIKE 'PACKAGE%' +ORDER BY routine_type; +routine_name pkg1 +routine_type PACKAGE +routine_definition AS +FUNCTION f1() RETURN INT; +END +routine_name pkg1 +routine_type PACKAGE BODY +routine_definition AS +FUNCTION f1() RETURN INT AS +BEGIN +RETURN 1; +END; +BEGIN +SET @a=10; +SET @a=f1(); +END +DROP PACKAGE pkg1; +# +# End of 10.5 tests +# diff --git a/mysql-test/suite/compat/oracle/r/sp-package.result b/mysql-test/suite/compat/oracle/r/sp-package.result index 096527342d0..c14f6accb87 100644 --- a/mysql-test/suite/compat/oracle/r/sp-package.result +++ b/mysql-test/suite/compat/oracle/r/sp-package.result @@ -537,7 +537,13 @@ comment package-test2-comment character_set_client latin1 collation_connection latin1_swedish_ci db_collation latin1_swedish_ci -body_utf8 +body_utf8 AS +FUNCTION f1 RETURN INT DETERMINISTIC; +FUNCTION f2(a INT) RETURN INT; +FUNCTION concat RETURN INT; +PROCEDURE p1; +PROCEDURE p2(a INT); +END aggregate NONE SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='test' AND ROUTINE_NAME='test2'; SPECIFIC_NAME test2 @@ -555,7 +561,13 @@ CHARACTER_SET_NAME NULL COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL -ROUTINE_DEFINITION +ROUTINE_DEFINITION AS +FUNCTION f1 RETURN INT DETERMINISTIC; +FUNCTION f2(a INT) RETURN INT; +FUNCTION concat RETURN INT; +PROCEDURE p1; +PROCEDURE p2(a INT); +END EXTERNAL_NAME NULL EXTERNAL_LANGUAGE NULL PARAMETER_STYLE SQL @@ -641,7 +653,13 @@ CHARACTER_SET_NAME NULL COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL -ROUTINE_DEFINITION +ROUTINE_DEFINITION AS +FUNCTION f1 RETURN INT DETERMINISTIC; +FUNCTION f2(a INT) RETURN INT; +FUNCTION concat RETURN INT; +PROCEDURE p1; +PROCEDURE p2(a INT); +END EXTERNAL_NAME NULL EXTERNAL_LANGUAGE NULL PARAMETER_STYLE SQL @@ -672,7 +690,19 @@ CHARACTER_SET_NAME NULL COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL -ROUTINE_DEFINITION +ROUTINE_DEFINITION AS +FUNCTION f1 RETURN INT AS BEGIN RETURN 10; END; +FUNCTION f2(a INT) RETURN INT AS BEGIN RETURN f1()+a; END; +FUNCTION concat RETURN INT AS BEGIN RETURN 1; END; +PROCEDURE p1 AS +BEGIN +SELECT f2(0); +END; +PROCEDURE p2(a INT) AS +BEGIN +SELECT f2(a); +END; +END EXTERNAL_NAME NULL EXTERNAL_LANGUAGE NULL PARAMETER_STYLE SQL diff --git a/mysql-test/suite/compat/oracle/t/sp-package-i_s.test b/mysql-test/suite/compat/oracle/t/sp-package-i_s.test new file mode 100644 index 00000000000..a355e4841f8 --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/sp-package-i_s.test @@ -0,0 +1,69 @@ +--source include/default_charset.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + + +--echo # +--echo # MDEV-30662 SQL/PL package body does not appear in I_S.ROUTINES.ROUTINE_DEFINITION +--echo # + +# Testing a package without the executable section + +SET sql_mode=ORACLE; +DELIMITER $$; +CREATE OR REPLACE PACKAGE pkg1 AS + FUNCTION f1() RETURN INT; +END; +$$ +CREATE PACKAGE BODY pkg1 AS + FUNCTION f1() RETURN INT AS + BEGIN + RETURN 1; + END; +END; +$$ +DELIMITER ;$$ + +--vertical_results +SELECT routine_name, routine_type, routine_definition +FROM information_schema.routines +WHERE routine_type LIKE 'PACKAGE%' +ORDER BY routine_type; +--horizontal_results + +DROP PACKAGE pkg1; + +# Testing a package with the executable section + +SET sql_mode=ORACLE; +DELIMITER $$; +CREATE OR REPLACE PACKAGE pkg1 AS + FUNCTION f1() RETURN INT; +END; +$$ +CREATE PACKAGE BODY pkg1 AS + FUNCTION f1() RETURN INT AS + BEGIN + RETURN 1; + END; +BEGIN + SET @a=10; + SET @a=f1(); +END; +$$ +DELIMITER ;$$ + +--vertical_results +SELECT routine_name, routine_type, routine_definition +FROM information_schema.routines +WHERE routine_type LIKE 'PACKAGE%' +ORDER BY routine_type; +--horizontal_results + +DROP PACKAGE pkg1; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/sql/lex_string.h b/sql/lex_string.h index e7a732346c4..56f37706aa8 100644 --- a/sql/lex_string.h +++ b/sql/lex_string.h @@ -50,6 +50,60 @@ class Lex_cstring : public LEX_CSTRING str= _str; length= _len; } + + /* + Trim left white spaces. + Assumes that there are no multi-bytes characters + that can be considered white-space. + */ + Lex_cstring ltrim_whitespace(CHARSET_INFO *cs) const + { + DBUG_ASSERT(cs->mbminlen == 1); + Lex_cstring str= *this; + while (str.length > 0 && my_isspace(cs, str.str[0])) + { + str.length--; + str.str++; + } + return str; + } + + /* + Trim right white spaces. + Assumes that there are no multi-bytes characters + that can be considered white-space. + Also, assumes that the character set supports backward space parsing. + */ + Lex_cstring rtrim_whitespace(CHARSET_INFO *cs) const + { + DBUG_ASSERT(cs->mbminlen == 1); + Lex_cstring str= *this; + while (str.length > 0 && my_isspace(cs, str.str[str.length - 1])) + { + str.length --; + } + return str; + } + + /* + Trim all spaces. + */ + Lex_cstring trim_whitespace(CHARSET_INFO *cs) const + { + return ltrim_whitespace(cs).rtrim_whitespace(cs); + } + + /* + Trim all spaces and return the length of the leading space sequence. + */ + Lex_cstring trim_whitespace(CHARSET_INFO *cs, size_t *prefix_length) const + { + Lex_cstring tmp= Lex_cstring(*this).ltrim_whitespace(cs); + if (prefix_length) + *prefix_length= tmp.str - str; + return tmp.rtrim_whitespace(cs); + } + }; diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 2121d68c282..182e50fa7c6 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -558,7 +558,7 @@ sp_head::sp_head(MEM_ROOT *mem_root_arg, sp_package *parent, m_next_cached_sp(0), m_param_begin(NULL), m_param_end(NULL), - m_body_begin(NULL), + m_cpp_body_begin(NULL), m_thd_root(NULL), m_thd(NULL), m_pcont(new (&main_mem_root) sp_pcontext()), @@ -819,18 +819,18 @@ sp_head::init_psi_share() void -sp_head::set_body_start(THD *thd, const char *begin_ptr) +sp_head::set_body_start(THD *thd, const char *cpp_body_start) { - m_body_begin= begin_ptr; - thd->m_parser_state->m_lip.body_utf8_start(thd, begin_ptr); + m_cpp_body_begin= cpp_body_start; + if (!m_parent) + thd->m_parser_state->m_lip.body_utf8_start(thd, cpp_body_start); } void -sp_head::set_stmt_end(THD *thd) +sp_head::set_stmt_end(THD *thd, const char *cpp_body_end) { Lex_input_stream *lip= & thd->m_parser_state->m_lip; /* shortcut */ - const char *end_ptr= lip->get_cpp_tok_start(); /* shortcut */ /* Make the string of parameters. */ @@ -842,30 +842,27 @@ sp_head::set_stmt_end(THD *thd) /* Remember end pointer for further dumping of whole statement. */ - thd->lex->stmt_definition_end= end_ptr; + thd->lex->stmt_definition_end= cpp_body_end; /* Make the string of body (in the original character set). */ - m_body.length= end_ptr - m_body_begin; - m_body.str= thd->strmake(m_body_begin, m_body.length); - trim_whitespace(thd->charset(), &m_body); + m_body= thd->strmake_lex_cstring_trim_whitespace( + Lex_cstring(m_cpp_body_begin, cpp_body_end)); /* Make the string of UTF-body. */ - lip->body_utf8_append(end_ptr); + lip->body_utf8_append(cpp_body_end); - m_body_utf8.length= lip->get_body_utf8_length(); - m_body_utf8.str= thd->strmake(lip->get_body_utf8_str(), m_body_utf8.length); - trim_whitespace(thd->charset(), &m_body_utf8); + if (!m_parent) + m_body_utf8= thd->strmake_lex_cstring_trim_whitespace(lip->body_utf8()); /* Make the string of whole stored-program-definition query (in the original character set). */ - m_defstr.length= end_ptr - lip->get_cpp_buf(); - m_defstr.str= thd->strmake(lip->get_cpp_buf(), m_defstr.length); - trim_whitespace(thd->charset(), &m_defstr); + m_defstr= thd->strmake_lex_cstring_trim_whitespace( + Lex_cstring(lip->get_cpp_buf(), cpp_body_end)); } diff --git a/sql/sp_head.h b/sql/sp_head.h index 700485ffd21..98ef8d2be41 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -314,7 +314,13 @@ public: const char *m_param_end; private: - const char *m_body_begin; + /* + A pointer to the body start inside the cpp buffer. + Used only during parsing. Should be removed eventually. + The affected functions/methods should be fixed to get the cpp body start + as a parameter, rather than through this member. + */ + const char *m_cpp_body_begin; public: /* @@ -351,12 +357,11 @@ public: /** Set the body-definition start position. */ void - set_body_start(THD *thd, const char *begin_ptr); + set_body_start(THD *thd, const char *cpp_body_start); /** Set the statement-definition (body-definition) end position. */ void - set_stmt_end(THD *thd); - + set_stmt_end(THD *thd, const char *cpp_body_end); bool execute_trigger(THD *thd, diff --git a/sql/sql_class.h b/sql/sql_class.h index f0f5ac47179..24c967d95a2 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3913,6 +3913,10 @@ public: { return strmake_lex_cstring(from.str, from.length); } + LEX_CSTRING strmake_lex_cstring_trim_whitespace(const LEX_CSTRING &from) + { + return strmake_lex_cstring(Lex_cstring(from).trim_whitespace(charset())); + } LEX_STRING *make_lex_string(LEX_STRING *lex_str, const char* str, size_t length) { diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 7e0ca6d868d..ad2d064b035 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -2860,34 +2860,6 @@ int Lex_input_stream::scan_ident_delimited(THD *thd, } -void trim_whitespace(CHARSET_INFO *cs, LEX_CSTRING *str, size_t * prefix_length) -{ - /* - TODO: - This code assumes that there are no multi-bytes characters - that can be considered white-space. - */ - - size_t plen= 0; - while ((str->length > 0) && (my_isspace(cs, str->str[0]))) - { - plen++; - str->length --; - str->str ++; - } - if (prefix_length) - *prefix_length= plen; - /* - FIXME: - Also, parsing backward is not safe with multi bytes characters - */ - while ((str->length > 0) && (my_isspace(cs, str->str[str->length-1]))) - { - str->length --; - } -} - - /* st_select_lex structures initialisations */ @@ -7336,7 +7308,7 @@ bool LEX::sp_body_finalize_routine(THD *thd) { if (sphead->check_unresolved_goto()) return true; - sphead->set_stmt_end(thd); + sphead->set_stmt_end(thd, thd->m_parser_state->m_lip.get_cpp_tok_start()); sphead->restore_thd_mem_root(thd); return false; } @@ -9268,8 +9240,7 @@ sp_package *LEX::create_package_start(THD *thd, bool LEX::create_package_finalize(THD *thd, const sp_name *name, const sp_name *name2, - const char *body_start, - const char *body_end) + const char *cpp_body_end) { if (name2 && (name2->m_explicit_name != name->m_explicit_name || @@ -9282,18 +9253,8 @@ bool LEX::create_package_finalize(THD *thd, exp ? ErrConvDQName(name).ptr() : name->m_name.str); return true; } - // TODO: reuse code in LEX::create_package_finalize and sp_head::set_stmt_end - sphead->m_body.length= body_end - body_start; - if (unlikely(!(sphead->m_body.str= thd->strmake(body_start, - sphead->m_body.length)))) - return true; - - size_t not_used; - Lex_input_stream *lip= & thd->m_parser_state->m_lip; - sphead->m_defstr.length= lip->get_cpp_ptr() - lip->get_cpp_buf(); - sphead->m_defstr.str= thd->strmake(lip->get_cpp_buf(), sphead->m_defstr.length); - trim_whitespace(thd->charset(), &sphead->m_defstr, ¬_used); + sphead->set_stmt_end(thd, cpp_body_end); sphead->restore_thd_mem_root(thd); sp_package *pkg= sphead->get_package(); DBUG_ASSERT(pkg); diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 2e3ce7d7503..381fc281df0 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -2716,15 +2716,9 @@ public: return p; } /** Get the utf8-body string. */ - const char *get_body_utf8_str() const + LEX_CSTRING body_utf8() const { - return m_body_utf8; - } - - /** Get the utf8-body length. */ - size_t get_body_utf8_length() const - { - return (size_t) (m_body_utf8_ptr - m_body_utf8); + return LEX_CSTRING({m_body_utf8, (size_t) (m_body_utf8_ptr - m_body_utf8)}); } void body_utf8_start(THD *thd, const char *begin_ptr); @@ -3855,8 +3849,7 @@ public: bool create_package_finalize(THD *thd, const sp_name *name, const sp_name *name2, - const char *body_start, - const char *body_end); + const char *cpp_body_end); bool call_statement_start(THD *thd, sp_name *name); bool call_statement_start(THD *thd, const Lex_ident_sys_st *name); bool call_statement_start(THD *thd, const Lex_ident_sys_st *name1, @@ -5096,7 +5089,12 @@ int init_lex_with_single_table(THD *thd, TABLE *table, LEX *lex); extern int MYSQLlex(union YYSTYPE *yylval, THD *thd); extern int ORAlex(union YYSTYPE *yylval, THD *thd); -extern void trim_whitespace(CHARSET_INFO *cs, LEX_CSTRING *str, size_t * prefix_length = 0); +inline void trim_whitespace(CHARSET_INFO *cs, LEX_CSTRING *str, + size_t * prefix_length = 0) +{ + *str= Lex_cstring(*str).trim_whitespace(cs, prefix_length); +} + extern bool is_lex_native_function(const LEX_CSTRING *name); extern bool is_native_function(THD *thd, const LEX_CSTRING *name); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 524da7be4c3..ff768257aa2 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -19118,8 +19118,6 @@ create_routine: } | create_or_replace definer_opt PACKAGE_ORACLE_SYM opt_if_not_exists sp_name opt_create_package_chistics_init - sp_tail_is - remember_name { sp_package *pkg; if (unlikely(!(pkg= Lex-> @@ -19129,17 +19127,17 @@ create_routine: $5, $1 | $4)))) MYSQL_YYABORT; pkg->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); } + sp_tail_is opt_package_specification_element_list END remember_end_opt opt_sp_name { - if (unlikely(Lex->create_package_finalize(thd, $5, $13, $8, $12))) + if (unlikely(Lex->create_package_finalize(thd, $5, $12, $11))) MYSQL_YYABORT; } | create_or_replace definer_opt PACKAGE_ORACLE_SYM BODY_ORACLE_SYM opt_if_not_exists sp_name opt_create_package_chistics_init - sp_tail_is - remember_name { sp_package *pkg; if (unlikely(!(pkg= Lex-> @@ -19149,8 +19147,10 @@ create_routine: $6, $1 | $5)))) MYSQL_YYABORT; pkg->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); Lex->sp_block_init(thd); } + sp_tail_is package_implementation_declare_section { if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) @@ -19158,13 +19158,13 @@ create_routine: } package_implementation_executable_section { - $11.hndlrs+= $13.hndlrs; - if (unlikely(Lex->sp_block_finalize(thd, $11))) + $10.hndlrs+= $12.hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, $10))) MYSQL_YYABORT; } remember_end_opt opt_sp_name { - if (unlikely(Lex->create_package_finalize(thd, $6, $16, $9, $15))) + if (unlikely(Lex->create_package_finalize(thd, $6, $15, $14))) MYSQL_YYABORT; } ; From 4b3f93063958834e3d55089d23d16ad242430bf8 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Mon, 10 Jul 2023 11:40:00 +1000 Subject: [PATCH 102/171] MDEV-31336: pam_user_map : not supporting username or groupname containing @ character Add @ to the allowed characters in a username. --- plugin/auth_pam/mapper/pam_user_map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/auth_pam/mapper/pam_user_map.c b/plugin/auth_pam/mapper/pam_user_map.c index fa8d9ae08c1..5dda97a20cd 100644 --- a/plugin/auth_pam/mapper/pam_user_map.c +++ b/plugin/auth_pam/mapper/pam_user_map.c @@ -216,7 +216,7 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags, } from= s; skip(isalnum(*s) || (*s == '_') || (*s == '.') || (*s == '-') || - (*s == '$') || (*s == '\\') || (*s == '/')); + (*s == '$') || (*s == '\\') || (*s == '/') || (*s == '@')); end_from= s; skip(isspace(*s)); if (end_from == from || *s++ != ':') goto syntax_error; From 68403eeda320ad0831563ce09a9c4af1549fe65e Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 17 Jul 2023 13:33:19 +0400 Subject: [PATCH 103/171] MDEV-27207 Assertion `!m_null_value' failed in int FixedBinTypeBundle::cmp_item_fbt::compare or in cmp_item_inet6::compare Also fixing: MDEV-31719 Wrong result of: WHERE inet6_column IN ('','::1') Problem: When converting an Item value from string to INET6 it's possible that the Item value itself is a not-NULL string value, while the following result of the string-to-INET6 conversion returns NULL. Methods cmp_item_xxx::set(), cmp_item_xxx::store_value_by_template(), in_inet6::set() did not take this scenario into account and tested source_item->null_value, which does not indicate if the conversion failed. Changing the return data type of the mentioned methods from "void" to "bool". "true" means that: - either the source Item was NULL - or the source Item was not NULL, but the data type coversion to the destination data type (INET6 in this issue) returned NULL. "false" means that the Item was not NULL and the data type conversion to the destination data type worked without error. This patches fixes the INET6 data type. After merging to 10.9, this patch should also fix same problems in UUID. --- .../mysql-test/type_inet/type_inet6.result | 26 +++++++++ .../mysql-test/type_inet/type_inet6.test | 19 +++++++ plugin/type_inet/sql_type_inet.cc | 14 +++-- sql/item_cmpfunc.cc | 47 +++++++++------- sql/item_cmpfunc.h | 54 ++++++++++++------- 5 files changed, 119 insertions(+), 41 deletions(-) diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.result b/plugin/type_inet/mysql-test/type_inet/type_inet6.result index dd21c6abaf2..9c43725c733 100644 --- a/plugin/type_inet/mysql-test/type_inet/type_inet6.result +++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.result @@ -2229,3 +2229,29 @@ SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1); d 12:: DROP TABLE t1; +# +# MDEV-27207 Assertion `!m_null_value' failed in int FixedBinTypeBundle::cmp_item_fbt::compare or in cmp_item_inet6::compare +# +CREATE TABLE t1 (a CHAR,b INET6); +SELECT * FROM t1 WHERE (a,b) IN (('',''),('','')); +a b +Warnings: +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +INSERT INTO t1 VALUES ('','::'),('','::'); +SELECT * FROM t1 WHERE (a,b) IN (('',''),('','')); +a b +Warnings: +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +DROP TABLE t1; +# +# MDEV-31719 Wrong result of: WHERE inet6_column IN ('','::1') +# +CREATE OR REPLACE TABLE t1 (a INET6); +INSERT INTO t1 VALUES ('::'); +SELECT * FROM t1 WHERE a IN ('','::1'); +a +Warnings: +Warning 1292 Incorrect inet6 value: '' +DROP TABLE t1; diff --git a/plugin/type_inet/mysql-test/type_inet/type_inet6.test b/plugin/type_inet/mysql-test/type_inet/type_inet6.test index becc063ddc9..b0dffb098f2 100644 --- a/plugin/type_inet/mysql-test/type_inet/type_inet6.test +++ b/plugin/type_inet/mysql-test/type_inet/type_inet6.test @@ -1641,3 +1641,22 @@ SELECT * FROM t1 ORDER BY d; SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1); SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1); DROP TABLE t1; + +--echo # +--echo # MDEV-27207 Assertion `!m_null_value' failed in int FixedBinTypeBundle::cmp_item_fbt::compare or in cmp_item_inet6::compare +--echo # + +CREATE TABLE t1 (a CHAR,b INET6); +SELECT * FROM t1 WHERE (a,b) IN (('',''),('','')); +INSERT INTO t1 VALUES ('','::'),('','::'); +SELECT * FROM t1 WHERE (a,b) IN (('',''),('','')); +DROP TABLE t1; + +--echo # +--echo # MDEV-31719 Wrong result of: WHERE inet6_column IN ('','::1') +--echo # + +CREATE OR REPLACE TABLE t1 (a INET6); +INSERT INTO t1 VALUES ('::'); +SELECT * FROM t1 WHERE a IN ('','::1'); +DROP TABLE t1; diff --git a/plugin/type_inet/sql_type_inet.cc b/plugin/type_inet/sql_type_inet.cc index 789ae078fd5..5817bdecc4b 100644 --- a/plugin/type_inet/sql_type_inet.cc +++ b/plugin/type_inet/sql_type_inet.cc @@ -1303,14 +1303,22 @@ public: { return &type_handler_inet6; } - void set(uint pos, Item *item) override + bool set(uint pos, Item *item) override { + /* + A 10.5->10.6 merge hint: + This method migrated to sql/sql_type_fixedbin.h, + to the class in_fbt. + */ Inet6 *buff= &((Inet6 *) base)[pos]; Inet6_null value(item); if (value.is_null()) + { *buff= Inet6_zero(); - else - *buff= value; + return true; + } + *buff= value; + return false; } uchar *get_value(Item *item) override { diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 9912646cbb4..f61ed7dfe15 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -3702,7 +3702,7 @@ in_string::~in_string() } } -void in_string::set(uint pos,Item *item) +bool in_string::set(uint pos, Item *item) { String *str=((String*) base)+pos; String *res=item->val_str(str); @@ -3722,6 +3722,7 @@ void in_string::set(uint pos,Item *item) cs= &my_charset_bin; // Should never happen for STR items str->set_charset(cs); } + return res == NULL; } @@ -3763,12 +3764,12 @@ uchar *in_row::get_value(Item *item) return (uchar *)&tmp; } -void in_row::set(uint pos, Item *item) +bool in_row::set(uint pos, Item *item) { DBUG_ENTER("in_row::set"); DBUG_PRINT("enter", ("pos: %u item: %p", pos,item)); - ((cmp_item_row*) base)[pos].store_value_by_template(current_thd, &tmp, item); - DBUG_VOID_RETURN; + DBUG_RETURN(((cmp_item_row*) base)[pos].store_value_by_template(current_thd, + &tmp, item)); } in_longlong::in_longlong(THD *thd, uint elements) @@ -3776,12 +3777,13 @@ in_longlong::in_longlong(THD *thd, uint elements) (qsort2_cmp) cmp_longlong, 0) {} -void in_longlong::set(uint pos,Item *item) +bool in_longlong::set(uint pos, Item *item) { struct packed_longlong *buff= &((packed_longlong*) base)[pos]; buff->val= item->val_int(); buff->unsigned_flag= item->unsigned_flag; + return item->null_value; } uchar *in_longlong::get_value(Item *item) @@ -3816,14 +3818,17 @@ in_timestamp::in_timestamp(THD *thd, uint elements) {} -void in_timestamp::set(uint pos, Item *item) +bool in_timestamp::set(uint pos, Item *item) { Timestamp_or_zero_datetime *buff= &((Timestamp_or_zero_datetime *) base)[pos]; Timestamp_or_zero_datetime_native_null native(current_thd, item, true); if (native.is_null()) + { *buff= Timestamp_or_zero_datetime(); - else - *buff= Timestamp_or_zero_datetime(native); + return true; + } + *buff= Timestamp_or_zero_datetime(native); + return false; } @@ -3850,20 +3855,22 @@ void in_timestamp::value_to_item(uint pos, Item *item) } -void in_datetime::set(uint pos,Item *item) +bool in_datetime::set(uint pos, Item *item) { struct packed_longlong *buff= &((packed_longlong*) base)[pos]; buff->val= item->val_datetime_packed(current_thd); buff->unsigned_flag= 1L; + return item->null_value; } -void in_time::set(uint pos,Item *item) +bool in_time::set(uint pos, Item *item) { struct packed_longlong *buff= &((packed_longlong*) base)[pos]; buff->val= item->val_time_packed(current_thd); buff->unsigned_flag= 1L; + return item->null_value; } uchar *in_datetime::get_value(Item *item) @@ -3894,9 +3901,10 @@ in_double::in_double(THD *thd, uint elements) :in_vector(thd, elements, sizeof(double), (qsort2_cmp) cmp_double, 0) {} -void in_double::set(uint pos,Item *item) +bool in_double::set(uint pos, Item *item) { ((double*) base)[pos]= item->val_real(); + return item->null_value; } uchar *in_double::get_value(Item *item) @@ -3918,7 +3926,7 @@ in_decimal::in_decimal(THD *thd, uint elements) {} -void in_decimal::set(uint pos, Item *item) +bool in_decimal::set(uint pos, Item *item) { /* as far as 'item' is constant, we can store reference on my_decimal */ my_decimal *dec= ((my_decimal *)base) + pos; @@ -3928,6 +3936,7 @@ void in_decimal::set(uint pos, Item *item) /* if item->val_decimal() is evaluated to NULL then res == 0 */ if (!item->null_value && res != dec) my_decimal2decimal(res, dec); + return item->null_value; } @@ -4103,15 +4112,16 @@ void cmp_item_row::store_value(Item *item) } -void cmp_item_row::store_value_by_template(THD *thd, cmp_item *t, Item *item) +bool cmp_item_row::store_value_by_template(THD *thd, cmp_item *t, Item *item) { cmp_item_row *tmpl= (cmp_item_row*) t; if (tmpl->n != item->cols()) { my_error(ER_OPERAND_COLUMNS, MYF(0), tmpl->n); - return; + return 1; } n= tmpl->n; + bool rc= false; if ((comparators= (cmp_item **) thd->alloc(sizeof(cmp_item *)*n))) { item->bring_value(); @@ -4120,11 +4130,11 @@ void cmp_item_row::store_value_by_template(THD *thd, cmp_item *t, Item *item) { if (!(comparators[i]= tmpl->comparators[i]->make_same())) break; // new failed - comparators[i]->store_value_by_template(thd, tmpl->comparators[i], - item->element_index(i)); - item->null_value|= item->element_index(i)->null_value; + rc|= comparators[i]->store_value_by_template(thd, tmpl->comparators[i], + item->element_index(i)); } } + return rc; } @@ -4468,8 +4478,7 @@ void Item_func_in::fix_in_vector() uint j=0; for (uint i=1 ; i < arg_count ; i++) { - array->set(j,args[i]); - if (!args[i]->null_value) + if (!array->set(j,args[i])) j++; // include this cell in the array. else { diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index a64a69eb6c8..7cbc1236a03 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -1349,7 +1349,14 @@ public: size(element_length), compare(cmp_func), collation(cmp_coll), count(elements), used_count(elements) {} virtual ~in_vector() = default; - virtual void set(uint pos,Item *item)=0; + /* + Store an Item value at the given position. + @returns false - the Item was not NULL, and the conversion from the + Item data type to the cmp_item data type went without + errors + @returns true - the Item was NULL, or data type conversion returned NULL + */ + virtual bool set(uint pos, Item *item)=0; virtual uchar *get_value(Item *item)=0; void sort() { @@ -1404,7 +1411,7 @@ class in_string :public in_vector public: in_string(THD *thd, uint elements, qsort2_cmp cmp_func, CHARSET_INFO *cs); ~in_string(); - void set(uint pos,Item *item); + bool set(uint pos, Item *item); uchar *get_value(Item *item); Item* create_item(THD *thd); void value_to_item(uint pos, Item *item) @@ -1431,7 +1438,7 @@ protected: } tmp; public: in_longlong(THD *thd, uint elements); - void set(uint pos,Item *item); + bool set(uint pos, Item *item); uchar *get_value(Item *item); Item* create_item(THD *thd); void value_to_item(uint pos, Item *item) @@ -1451,7 +1458,7 @@ class in_timestamp :public in_vector Timestamp_or_zero_datetime tmp; public: in_timestamp(THD *thd, uint elements); - void set(uint pos,Item *item); + bool set(uint pos, Item *item); uchar *get_value(Item *item); Item* create_item(THD *thd); void value_to_item(uint pos, Item *item); @@ -1486,7 +1493,7 @@ public: in_datetime(THD *thd, uint elements) :in_temporal(thd, elements) {} - void set(uint pos,Item *item); + bool set(uint pos, Item *item); uchar *get_value(Item *item); const Type_handler *type_handler() const { return &type_handler_datetime2; } }; @@ -1498,7 +1505,7 @@ public: in_time(THD *thd, uint elements) :in_temporal(thd, elements) {} - void set(uint pos,Item *item); + bool set(uint pos, Item *item); uchar *get_value(Item *item); const Type_handler *type_handler() const { return &type_handler_time2; } }; @@ -1509,7 +1516,7 @@ class in_double :public in_vector double tmp; public: in_double(THD *thd, uint elements); - void set(uint pos,Item *item); + bool set(uint pos, Item *item); uchar *get_value(Item *item); Item *create_item(THD *thd); void value_to_item(uint pos, Item *item) @@ -1525,7 +1532,7 @@ class in_decimal :public in_vector my_decimal val; public: in_decimal(THD *thd, uint elements); - void set(uint pos, Item *item); + bool set(uint pos, Item *item); uchar *get_value(Item *item); Item *create_item(THD *thd); void value_to_item(uint pos, Item *item) @@ -1558,10 +1565,14 @@ public: // for optimized IN with row virtual int compare(cmp_item *item)= 0; virtual cmp_item *make_same()= 0; - virtual void store_value_by_template(THD *thd, cmp_item *tmpl, Item *item) - { - store_value(item); - } + /* + Store a scalar or a ROW value into "this". + @returns false - the value (or every component in case of ROW) was + not NULL and the data type conversion went without errors. + @returns true - the value (or some of its components) was NULL, or the + data type conversion of a not-NULL value returned NULL. + */ + virtual bool store_value_by_template(THD *thd, cmp_item *tmpl, Item *item)=0; }; /// cmp_item which stores a scalar (i.e. non-ROW). @@ -1569,6 +1580,11 @@ class cmp_item_scalar : public cmp_item { protected: bool m_null_value; ///< If stored value is NULL + bool store_value_by_template(THD *thd, cmp_item *tmpl, Item *item) override + { + store_value(item); + return m_null_value; + } }; class cmp_item_string : public cmp_item_scalar @@ -2504,18 +2520,18 @@ class cmp_item_row :public cmp_item public: cmp_item_row(): comparators(0), n(0) {} ~cmp_item_row(); - void store_value(Item *item); + void store_value(Item *item) override; bool prepare_comparators(THD *, const char *funcname, const Item_args *args, uint level); - int cmp(Item *arg); - int cmp_not_null(const Value *val) + int cmp(Item *arg) override; + int cmp_not_null(const Value *val) override { DBUG_ASSERT(false); return TRUE; } - int compare(cmp_item *arg); - cmp_item *make_same(); - void store_value_by_template(THD *thd, cmp_item *tmpl, Item *); + int compare(cmp_item *arg) override; + cmp_item *make_same() override; + bool store_value_by_template(THD *thd, cmp_item *tmpl, Item *) override; friend class Item_func_in; cmp_item *get_comparator(uint i) { return comparators[i]; } }; @@ -2527,7 +2543,7 @@ class in_row :public in_vector public: in_row(THD *thd, uint elements, Item *); ~in_row(); - void set(uint pos,Item *item); + bool set(uint pos, Item *item); uchar *get_value(Item *item); friend class Item_func_in; const Type_handler *type_handler() const { return &type_handler_row; } From 1a5c4c2d9bd72ac4533d2264103f359d410682c3 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 18 Jul 2023 11:02:18 +0400 Subject: [PATCH 104/171] MDEV-26186 280 Bytes lost in mysys/array.c, mysys/hash.c, sql/sp.cc, sql/sp.cc, sql/item_create.cc, sql/item_create.cc, sql/sql_yacc.yy:10748 when using oracle sql_mode There was a memory leak under these conditions: - YYABORT was called in the end-of-rule action of a rule containing expr_lex - This expr_lex was not bound to any sp_lex_keeper Bison did not call %destructor in this case, because its stack already contained a reduced upper-level rule. Fixing rules starting with RETURN, CONTINUE, EXIT keywords: Turning end-of-rule actions with YYABORT into mid-rule actions by adding an empty trailing { } block. This prevents the upper level rule from being reduced without calling %destructor . In other rules expr_lex is used not immediately before the last end-of-rule { } block, so they don't need changes. --- .../compat/oracle/r/sp-memory-leak.result | 27 ++++++++++++ .../suite/compat/oracle/t/sp-memory-leak.test | 35 ++++++++++++++++ sql/sql_yacc.yy | 42 +++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 mysql-test/suite/compat/oracle/r/sp-memory-leak.result create mode 100644 mysql-test/suite/compat/oracle/t/sp-memory-leak.test diff --git a/mysql-test/suite/compat/oracle/r/sp-memory-leak.result b/mysql-test/suite/compat/oracle/r/sp-memory-leak.result new file mode 100644 index 00000000000..109a9f84b52 --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/sp-memory-leak.result @@ -0,0 +1,27 @@ +# +# Start of 10.5 tests +# +# +# MDEV-26186 280 Bytes lost in mysys/array.c, mysys/hash.c, sql/sp.cc, sql/sp.cc, sql/item_create.cc, sql/item_create.cc, sql/sql_yacc.yy:10748 when using oracle sql_mode +# +SET sql_mode= 'oracle'; +BEGIN CONTINUE WHEN f0(); +ERROR 42000: CONTINUE with no matching label: +SET sql_mode= 'oracle'; +BEGIN CONTINUE label WHEN f0(); +ERROR 42000: CONTINUE with no matching label: label +SET sql_mode= 'oracle'; +BEGIN EXIT WHEN f0(); +ERROR 42000: EXIT with no matching label: +SET sql_mode= 'oracle'; +BEGIN EXIT label WHEN f0(); +ERROR 42000: EXIT with no matching label: label +SET sql_mode= 'oracle'; +WHILE f(8)<1 DO SELECT 1;; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DO SELECT 1' at line 1 +SET sql_mode= 'oracle'; +BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION RETURN f0(); +ERROR 42000: RETURN is only allowed in a FUNCTION +# +# End of 10.5 tests +# diff --git a/mysql-test/suite/compat/oracle/t/sp-memory-leak.test b/mysql-test/suite/compat/oracle/t/sp-memory-leak.test new file mode 100644 index 00000000000..015169c2100 --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/sp-memory-leak.test @@ -0,0 +1,35 @@ +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-26186 280 Bytes lost in mysys/array.c, mysys/hash.c, sql/sp.cc, sql/sp.cc, sql/item_create.cc, sql/item_create.cc, sql/sql_yacc.yy:10748 when using oracle sql_mode +--echo # + +SET sql_mode= 'oracle'; +--error ER_SP_LILABEL_MISMATCH +BEGIN CONTINUE WHEN f0(); + +SET sql_mode= 'oracle'; +--error ER_SP_LILABEL_MISMATCH +BEGIN CONTINUE label WHEN f0(); + +SET sql_mode= 'oracle'; +--error ER_SP_LILABEL_MISMATCH +BEGIN EXIT WHEN f0(); + +SET sql_mode= 'oracle'; +--error ER_SP_LILABEL_MISMATCH +BEGIN EXIT label WHEN f0(); + +SET sql_mode= 'oracle'; +--error ER_PARSE_ERROR +--query WHILE f(8)<1 DO SELECT 1; + +SET sql_mode= 'oracle'; +--error ER_SP_BADRETURN +BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION RETURN f0(); + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ff768257aa2..3dc9ff8dc6e 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1526,6 +1526,43 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); delete $$; } + +/* + +// COMMENT_FOR_DESCTRUCTOR: +// +// %destructor is only invoked if the rule parsing fails in the middle. +// If we call YYABORT from the last code block %destructor is not called, +// because Bison's stack already contains the reduced upper level rule. +// If we need to invoke the %destructor after the YYABORT in the last code +// block, we have to add another dummy empty end-of-rule action {} at the end. + +// So to have a %destructor work properly with YYABORT, +// make sure to turn a grammar like this: + +rule: + KEYWORD expr_lex + { + if (condition) // End-of-rule action + YYABORT; + } + ; + +// into: + +rule: + KEYWORD expr_lex + { + if (condition) // This is now a mid-rule action + YYABORT; + } + { + // A dummy empty end-of-rule action. + } + ; +*/ + + %type assignment_source_lex assignment_source_expr @@ -3731,6 +3768,7 @@ sp_proc_stmt_return: $2->get_item(), $2))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } | RETURN_ORACLE_SYM { LEX *lex= Lex; @@ -3757,11 +3795,13 @@ sp_proc_stmt_exit_oracle: if (unlikely($3->sp_exit_statement(thd, $3->get_item()))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } | EXIT_ORACLE_SYM label_ident WHEN_SYM expr_lex { if (unlikely($4->sp_exit_statement(thd, &$2, $4->get_item()))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } ; sp_proc_stmt_continue_oracle: @@ -3780,11 +3820,13 @@ sp_proc_stmt_continue_oracle: if (unlikely($3->sp_continue_when_statement(thd))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } | CONTINUE_ORACLE_SYM label_ident WHEN_SYM expr_lex { if (unlikely($4->sp_continue_when_statement(thd, &$2))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } ; From fbc157ab33bb2b7a239f13f8b64ce5935f0bdee9 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 18 Jul 2023 11:59:42 +1000 Subject: [PATCH 105/171] MDEV-31545 GCC 13 -Wdangling-pointer in execute_show_status() The pointer was used deep in the call path. Resolve this by setting the pointer to NULL at the end of the function. Tested with gcc-13.3.1 (fc38) The warning disable 38fe266ea953 can be reverted in 10.6+ on merge. --- sql/sql_parse.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 473b23fd20c..f8039b7df09 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -6522,9 +6522,11 @@ static bool execute_show_status(THD *thd, TABLE_LIST *all_tables) memcpy(&thd->status_var, &old_status_var, offsetof(STATUS_VAR, last_cleared_system_status_var)); mysql_mutex_unlock(&LOCK_status); + thd->initial_status_var= NULL; return res; #ifdef WITH_WSREP wsrep_error_label: /* see WSREP_SYNC_WAIT() macro above */ + thd->initial_status_var= NULL; return true; #endif /* WITH_WSREP */ } From f17a865c395a5c81401d0cd39c4c81a2de93b7bb Mon Sep 17 00:00:00 2001 From: Rex Date: Wed, 19 Jul 2023 15:59:33 +1100 Subject: [PATCH 106/171] MDEV-30710 Incorrect operator when comparing large unsigned integers. When constructing a SEL_TREE, an unsigned integer greater than its signed equivalent caused an incorrect comparison operator to be chosen. --- mysql-test/main/type_int.result | 11 +++++++++++ mysql-test/main/type_int.test | 9 +++++++++ sql/opt_range.cc | 3 ++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/type_int.result b/mysql-test/main/type_int.result index 1d38181c71d..c25b213c7c4 100644 --- a/mysql-test/main/type_int.result +++ b/mysql-test/main/type_int.result @@ -1675,5 +1675,16 @@ SELECT DISTINCT 1 FROM t1 GROUP BY 0 >> NULL WITH ROLLUP; 1 DROP TABLE t1; # +# MDEV-30710 Incorrect operator when comparing large unsigned integers. +# +create table t1(c0 tinyint unique); +insert into t1 values (127); +insert into t1 values (-128); +select * from t1 where 18446744073700599371 > c0; +c0 +-128 +127 +drop table t1; +# # End of 10.5 tests # diff --git a/mysql-test/main/type_int.test b/mysql-test/main/type_int.test index 7ffbe94cc0d..c339bfa1834 100644 --- a/mysql-test/main/type_int.test +++ b/mysql-test/main/type_int.test @@ -554,6 +554,15 @@ INSERT INTO t1 VALUES (1),(2); SELECT DISTINCT 1 FROM t1 GROUP BY 0 >> NULL WITH ROLLUP; DROP TABLE t1; +--echo # +--echo # MDEV-30710 Incorrect operator when comparing large unsigned integers. +--echo # + +create table t1(c0 tinyint unique); +insert into t1 values (127); +insert into t1 values (-128); +select * from t1 where 18446744073700599371 > c0; +drop table t1; --echo # --echo # End of 10.5 tests diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 905d5aa5ef9..64c9954d19d 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -8995,7 +8995,8 @@ SEL_ARG *Field::stored_field_make_mm_leaf_bounded_int(RANGE_OPT_PARAM *param, DBUG_RETURN(new (param->mem_root) SEL_ARG_IMPOSSIBLE(this)); longlong item_val= value->val_int(); - if (op == SCALAR_CMP_LT && item_val > 0) + if (op == SCALAR_CMP_LT && ((item_val > 0) + || (value->unsigned_flag && (ulonglong)item_val > 0 ))) op= SCALAR_CMP_LE; // e.g. rewrite (tinyint < 200) to (tinyint <= 127) else if (op == SCALAR_CMP_GT && !unsigned_field && !value->unsigned_flag && item_val < 0) From 9e5c1fb5d30f76586f52aa799d4af3b76e1438b9 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 19 Jul 2023 06:13:44 +0400 Subject: [PATCH 107/171] MDEV-23838 Possibly wrong result or Assertion `0' failed in Item_func_round::native_op Change history in the affected code: - Since 10.4.8 (MDEV-20397 and MDEV-23311), functions ROUND(), CEILING(), FLOOR() return a TIME value for a TIME input. - Since 10.4.14 (MDEV-23525), MIN() and MAX() calculate a result for a TIME input using val_native() rather than val_str(). Problem: The patch for MDEV-23525 did not take into account combinations like MIN(ROUND(time)), MAX(FLOOR(time)), etc. MIN() and MAX() with ROUND(time), CEILING(time), FLOOR(time) as an argument call the method val_native() of the undelying classes Item_func_round and Item_func_int_val. However these classes implemented the method val_native() as DBUG_ASSERT(0). Fix: This patch adds a TIME-specific code inside: - Item_func_round::val_native() - Item_func_int_val::val_native() still with DBUG_ASSERT(0) for all other data types, as other data types do not call val_native() of these classes. We'll need a more generic solition eventualy, e.g. turn Item_func_round and Item_func_int_val into Item_handled_func. However, this change would be too risky for 10.4 at this point. --- mysql-test/main/type_time.result | 44 ++++++++++++++++++++++++++++++++ mysql-test/main/type_time.test | 35 +++++++++++++++++++++++++ sql/item_func.cc | 20 +++++++++++++++ sql/item_func.h | 12 ++------- 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/mysql-test/main/type_time.result b/mysql-test/main/type_time.result index 7b40328892d..f23849eb0c2 100644 --- a/mysql-test/main/type_time.result +++ b/mysql-test/main/type_time.result @@ -2446,5 +2446,49 @@ DROP TABLE t1; SET @@time_zone=DEFAULT; SET TIMESTAMP=DEFAULT; # +# MDEV-23838 Possibly wrong result or Assertion `0' failed in Item_func_round::native_op +# +CREATE TABLE t1 (a TIME, b INT); +INSERT INTO t1 VALUES ('07:26:24',NULL),('23:55:04',NULL); +SELECT MAX(ROUND(a, 0)) FROM t1 GROUP BY 1 << b; +MAX(ROUND(a, 0)) +23:55:04 +DROP TABLE t1; +CREATE TABLE t1 (a TIME(6), b INT); +INSERT INTO t1 VALUES ('07:26:24.12',NULL),('23:55:04.34',NULL); +SELECT MAX(ROUND(a, 2)) FROM t1 GROUP BY 1 << b; +MAX(ROUND(a, 2)) +23:55:04.34 +DROP TABLE t1; +SET sql_mode=''; +CREATE TABLE t1 (a TIME); +INSERT INTO t1 VALUES (0),(0); +SELECT MAX(ROUND (a,a)) FROM t1 GROUP BY a; +MAX(ROUND (a,a)) +00:00:00 +DROP TABLE t1; +SET sql_mode=DEFAULT; +CREATE TABLE t1 (a TIME, b INT); +INSERT INTO t1 VALUES ('07:26:24',1),('23:55:04',1); +SELECT MIN(CEILING(a)), MAX(CEILING(a)) FROM t1 GROUP BY b; +MIN(CEILING(a)) MAX(CEILING(a)) +07:26:24 23:55:04 +SELECT MIN(FLOOR(a)), MAX(FLOOR(a)) FROM t1 GROUP BY b; +MIN(FLOOR(a)) MAX(FLOOR(a)) +07:26:24 23:55:04 +DROP TABLE t1; +CREATE TABLE t1 (a TIME(6), b INT); +INSERT INTO t1 VALUES ('00:00:00.5',1),('00:01:00.5',1); +INSERT INTO t1 VALUES ('-00:00:00.5',2),('-00:01:00.5',2); +SELECT MIN(CEILING(a)), MAX(CEILING(a)) FROM t1 GROUP BY b; +MIN(CEILING(a)) MAX(CEILING(a)) +00:00:01 00:01:01 +-00:01:00 00:00:00 +SELECT MIN(FLOOR(a)), MAX(FLOOR(a)) FROM t1 GROUP BY b; +MIN(FLOOR(a)) MAX(FLOOR(a)) +00:00:00 00:01:00 +-00:01:01 -00:00:01 +DROP TABLE t1; +# # End of 10.4 tests # diff --git a/mysql-test/main/type_time.test b/mysql-test/main/type_time.test index 9ed5c3a73dc..a75b278b1de 100644 --- a/mysql-test/main/type_time.test +++ b/mysql-test/main/type_time.test @@ -1585,6 +1585,41 @@ SET @@time_zone=DEFAULT; SET TIMESTAMP=DEFAULT; +--echo # +--echo # MDEV-23838 Possibly wrong result or Assertion `0' failed in Item_func_round::native_op +--echo # + +CREATE TABLE t1 (a TIME, b INT); +INSERT INTO t1 VALUES ('07:26:24',NULL),('23:55:04',NULL); +SELECT MAX(ROUND(a, 0)) FROM t1 GROUP BY 1 << b; +DROP TABLE t1; + +CREATE TABLE t1 (a TIME(6), b INT); +INSERT INTO t1 VALUES ('07:26:24.12',NULL),('23:55:04.34',NULL); +SELECT MAX(ROUND(a, 2)) FROM t1 GROUP BY 1 << b; +DROP TABLE t1; + +SET sql_mode=''; +CREATE TABLE t1 (a TIME); +INSERT INTO t1 VALUES (0),(0); +SELECT MAX(ROUND (a,a)) FROM t1 GROUP BY a; +DROP TABLE t1; +SET sql_mode=DEFAULT; + +CREATE TABLE t1 (a TIME, b INT); +INSERT INTO t1 VALUES ('07:26:24',1),('23:55:04',1); +SELECT MIN(CEILING(a)), MAX(CEILING(a)) FROM t1 GROUP BY b; +SELECT MIN(FLOOR(a)), MAX(FLOOR(a)) FROM t1 GROUP BY b; +DROP TABLE t1; + +CREATE TABLE t1 (a TIME(6), b INT); +INSERT INTO t1 VALUES ('00:00:00.5',1),('00:01:00.5',1); +INSERT INTO t1 VALUES ('-00:00:00.5',2),('-00:01:00.5',2); +SELECT MIN(CEILING(a)), MAX(CEILING(a)) FROM t1 GROUP BY b; +SELECT MIN(FLOOR(a)), MAX(FLOOR(a)) FROM t1 GROUP BY b; +DROP TABLE t1; + + --echo # --echo # End of 10.4 tests --echo # diff --git a/sql/item_func.cc b/sql/item_func.cc index 4575990a7a2..fd393f8de3f 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2233,6 +2233,16 @@ bool Item_func_int_val::fix_length_and_dec() } +bool Item_func_int_val::native_op(THD *thd, Native *to) +{ + // TODO: turn Item_func_int_val into Item_handled_func eventually. + if (type_handler()->mysql_timestamp_type() == MYSQL_TIMESTAMP_TIME) + return Time(thd, this).to_native(to, decimals); + DBUG_ASSERT(0); + return true; +} + + longlong Item_func_ceiling::int_op() { switch (args[0]->result_type()) { @@ -2661,6 +2671,16 @@ bool Item_func_round::date_op(THD *thd, MYSQL_TIME *to, date_mode_t fuzzydate) } +bool Item_func_round::native_op(THD *thd, Native *to) +{ + // TODO: turn Item_func_round into Item_handled_func eventually. + if (type_handler()->mysql_timestamp_type() == MYSQL_TIMESTAMP_TIME) + return Time(thd, this).to_native(to, decimals); + DBUG_ASSERT(0); + return true; +} + + void Item_func_rand::seed_random(Item *arg) { /* diff --git a/sql/item_func.h b/sql/item_func.h index 7828078ac7b..76a997c33fb 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1748,11 +1748,7 @@ public: } bool fix_length_and_dec(); String *str_op(String *str) { DBUG_ASSERT(0); return 0; } - bool native_op(THD *thd, Native *to) - { - DBUG_ASSERT(0); - return true; - } + bool native_op(THD *thd, Native *to); }; @@ -1804,11 +1800,7 @@ public: my_decimal *decimal_op(my_decimal *); bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate); bool time_op(THD *thd, MYSQL_TIME *ltime); - bool native_op(THD *thd, Native *to) - { - DBUG_ASSERT(0); - return true; - } + bool native_op(THD *thd, Native *to); String *str_op(String *str) { DBUG_ASSERT(0); From 30f3db3cf12d05c5da2c5cd279b6a2b122363277 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 19 Jul 2023 10:33:20 +0400 Subject: [PATCH 108/171] MDEV-29019 Assertion `(length % 4) == 0' failed in my_lengthsp_utf32 on SELECT Problem: Item_func_conv::val_str() copied the ASCII string with the numeric base conversion result directly to the function result string. In case of a tricky character set (e.g. utf32) it produced an illformed string. Fix: Copy the base conversion result to the function result as is only if the function character set is ASCII compatible, go through a character set conversion otherwise. --- mysql-test/main/ctype_utf32.result | 20 ++++++++++++++++++++ mysql-test/main/ctype_utf32.test | 25 ++++++++++++++++++++++++- sql/item_strfunc.cc | 6 +++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/mysql-test/main/ctype_utf32.result b/mysql-test/main/ctype_utf32.result index a0f760cbdc0..4ed5ae32a76 100644 --- a/mysql-test/main/ctype_utf32.result +++ b/mysql-test/main/ctype_utf32.result @@ -2940,3 +2940,23 @@ DROP TABLE t1; # # End of 10.2 tests # +# +# Start of 10.4 tests +# +# +# MDEV-29019 Assertion `(length % 4) == 0' failed in my_lengthsp_utf32 on SELECT +# +CREATE TABLE t (a INT); +SET collation_connection=utf32_unicode_ci; +INSERT INTO t VALUES (0); +SELECT * FROM t ORDER BY (OCT(a)); +a +0 +SELECT HEX(OCT(a)) FROM t; +HEX(OCT(a)) +00000030 +DROP TABLE t; +SET NAMES utf8; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/ctype_utf32.test b/mysql-test/main/ctype_utf32.test index a62416621b8..63b6bdd65ae 100644 --- a/mysql-test/main/ctype_utf32.test +++ b/mysql-test/main/ctype_utf32.test @@ -1099,7 +1099,30 @@ CREATE TABLE t1 ( SHOW CREATE TABLE t1; DROP TABLE t1; ---enable_service_connection --echo # --echo # End of 10.2 tests --echo # + + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-29019 Assertion `(length % 4) == 0' failed in my_lengthsp_utf32 on SELECT +--echo # + +CREATE TABLE t (a INT); +SET collation_connection=utf32_unicode_ci; +INSERT INTO t VALUES (0); +SELECT * FROM t ORDER BY (OCT(a)); +SELECT HEX(OCT(a)) FROM t; +DROP TABLE t; +SET NAMES utf8; + + +--echo # +--echo # End of 10.4 tests +--echo # + +--enable_service_connection diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index f95f4795820..ae078dbb22f 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -3533,8 +3533,12 @@ String *Item_func_conv::val_str(String *str) from_base, &endptr, &err); } + uint dummy_errors; if (!(ptr= longlong2str(dec, ans, to_base)) || - str->copy(ans, (uint32) (ptr - ans), default_charset())) + (collation.collation->state & MY_CS_NONASCII) ? + str->copy(ans, (uint32) (ptr - ans), &my_charset_latin1, + collation.collation, &dummy_errors) : + str->copy(ans, (uint32) (ptr - ans), collation.collation)) { null_value= 1; return NULL; From d067de20d6ffce121bcffeefcac19a41b10d1750 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Thu, 20 Jul 2023 13:33:14 +1000 Subject: [PATCH 109/171] MDEV-23133 session tracker - warning message typo Concatenation error leads to typo in the warning message --- sql/session_tracker.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/session_tracker.cc b/sql/session_tracker.cc index 2f6c5e29bf2..0544827534d 100644 --- a/sql/session_tracker.cc +++ b/sql/session_tracker.cc @@ -167,7 +167,7 @@ bool Session_sysvars_tracker::vars_list::parse_var_list(THD *thd, { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_WRONG_VALUE_FOR_VAR, - "%.*s is not a valid system variable and will" + "%.*s is not a valid system variable and will " "be ignored.", (int)var.length, token); } else From a79f4f6ec9dcd213a84eb7f39c8f144153d2725f Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 20 Jul 2023 11:06:30 +0400 Subject: [PATCH 110/171] MDEV-22856 Assertion `!str || str != Ptr' and Assertion `!str || str != Ptr || !is_alloced()' failed in String::copy The problem was earlier fixed by MDEV-26953. Adding MTR tests only. --- mysql-test/main/ctype_utf16.result | 56 ++++++++++++++++++++++++++++++ mysql-test/main/ctype_utf16.test | 50 ++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/mysql-test/main/ctype_utf16.result b/mysql-test/main/ctype_utf16.result index 9ec67a67c08..118368da452 100644 --- a/mysql-test/main/ctype_utf16.result +++ b/mysql-test/main/ctype_utf16.result @@ -2841,3 +2841,59 @@ VALUES ('') UNION VALUES ( _utf16 0x0020 COLLATE utf16_bin); # # End of 10.3 tests # +# +# Start of 10.4 tests +# +# +# MDEV-22856 Assertion `!str || str != Ptr' and Assertion `!str || str != Ptr || !is_alloced()' failed in String::copy +# +SET NAMES utf8mb3, collation_connection='utf16_general_ci'; +SET sql_buffer_result=1; +CREATE TABLE t(c INT); +INSERT INTO t VALUES(NULL); +SELECT PASSWORD(c) FROM t; +PASSWORD(c) + +DROP TABLE t; +SET sql_buffer_result=DEFAULT; +SET NAMES utf8mb3, collation_connection='utf16_general_ci'; +CREATE TABLE t1(c INT); +INSERT INTO t1 VALUES(NULL); +CREATE TABLE t2 AS SELECT PASSWORD(c) FROM t1; +DROP TABLE t2, t1; +SET NAMES utf8mb3, collation_connection='utf16_general_ci'; +CREATE TABLE t1 AS SELECT PASSWORD(CAST(NULL AS SIGNED)); +DROP TABLE t1; +SET NAMES utf8mb3, collation_connection='utf16_bin'; +SET @@sql_buffer_result=ON; +CREATE TABLE t (c CHAR(1)); +INSERT INTO t VALUES (1),(1),(1),(NULL); +INSERT INTO t SELECT * FROM t; +SELECT PASSWORD(c) FROM t; +PASSWORD(c) +*E6CC90B878B948C35E92B003C792C46C58C4AF40 +*E6CC90B878B948C35E92B003C792C46C58C4AF40 +*E6CC90B878B948C35E92B003C792C46C58C4AF40 + +*E6CC90B878B948C35E92B003C792C46C58C4AF40 +*E6CC90B878B948C35E92B003C792C46C58C4AF40 +*E6CC90B878B948C35E92B003C792C46C58C4AF40 + +DROP TABLE t; +SET @@sql_buffer_result=DEFAULT; +SET sql_mode=''; +SET SESSION sql_buffer_result=1; +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (); +INSERT IGNORE INTO t1 VALUES (NULL); +SET NAMES utf8mb3, collation_connection='utf16_bin'; +SELECT PASSWORD(c1) FROM t1; +PASSWORD(c1) + + +DROP TABLE t1; +SET SESSION sql_buffer_result=DEFAULT; +SET sql_mode=DEFAULT; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/ctype_utf16.test b/mysql-test/main/ctype_utf16.test index cf32fc3094a..a5741d429b3 100644 --- a/mysql-test/main/ctype_utf16.test +++ b/mysql-test/main/ctype_utf16.test @@ -960,3 +960,53 @@ VALUES ('') UNION VALUES ( _utf16 0x0020 COLLATE utf16_bin); --echo # --echo # End of 10.3 tests --echo # + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-22856 Assertion `!str || str != Ptr' and Assertion `!str || str != Ptr || !is_alloced()' failed in String::copy +--echo # + +SET NAMES utf8mb3, collation_connection='utf16_general_ci'; +SET sql_buffer_result=1; +CREATE TABLE t(c INT); +INSERT INTO t VALUES(NULL); +SELECT PASSWORD(c) FROM t; +DROP TABLE t; +SET sql_buffer_result=DEFAULT; + +SET NAMES utf8mb3, collation_connection='utf16_general_ci'; +CREATE TABLE t1(c INT); +INSERT INTO t1 VALUES(NULL); +CREATE TABLE t2 AS SELECT PASSWORD(c) FROM t1; +DROP TABLE t2, t1; + +SET NAMES utf8mb3, collation_connection='utf16_general_ci'; +CREATE TABLE t1 AS SELECT PASSWORD(CAST(NULL AS SIGNED)); +DROP TABLE t1; + +SET NAMES utf8mb3, collation_connection='utf16_bin'; +SET @@sql_buffer_result=ON; +CREATE TABLE t (c CHAR(1)); +INSERT INTO t VALUES (1),(1),(1),(NULL); +INSERT INTO t SELECT * FROM t; +SELECT PASSWORD(c) FROM t; +DROP TABLE t; +SET @@sql_buffer_result=DEFAULT; + +SET sql_mode=''; +SET SESSION sql_buffer_result=1; +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (); +INSERT IGNORE INTO t1 VALUES (NULL); +SET NAMES utf8mb3, collation_connection='utf16_bin'; +SELECT PASSWORD(c1) FROM t1; +DROP TABLE t1; +SET SESSION sql_buffer_result=DEFAULT; +SET sql_mode=DEFAULT; + +--echo # +--echo # End of 10.4 tests +--echo # From 03c2157dd6ad308a825424f61f3829a26873979f Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 20 Jul 2023 11:56:19 +0400 Subject: [PATCH 111/171] MDEV-28384 UBSAN: null pointer passed as argument 1, which is declared to never be null in my_strnncoll_binary on SELECT ... COUNT or GROUP_CONCAT Also fixes: MDEV-30982 UBSAN: runtime error: null pointer passed as argument 2, which is declared to never be null in my_strnncoll_binary on DELETE Calling memcmp() with a NULL pointer is undefined behaviour according to the C standard, even if the length argument is 0. Adding tests for length==0 before calling memcmp() into: - my_strnncoll_binary() - my_strnncoll_8bit_bin --- mysql-test/main/ctype_binary.result | 34 +++++++++++++++++++++++++++++ mysql-test/main/ctype_binary.test | 33 ++++++++++++++++++++++++++++ mysql-test/main/ctype_latin1.result | 27 +++++++++++++++++++++++ mysql-test/main/ctype_latin1.test | 24 ++++++++++++++++++++ strings/ctype-bin.c | 4 ++-- 5 files changed, 120 insertions(+), 2 deletions(-) diff --git a/mysql-test/main/ctype_binary.result b/mysql-test/main/ctype_binary.result index 02aa08272c1..b43f2136e30 100644 --- a/mysql-test/main/ctype_binary.result +++ b/mysql-test/main/ctype_binary.result @@ -3362,3 +3362,37 @@ DROP FUNCTION f1; # # End of 10.3 tests # +# +# Start of 10.4 tests +# +# +# MDEV-28384 UBSAN: null pointer passed as argument 1, which is declared to never be null in my_strnncoll_binary on SELECT ... COUNT or GROUP_CONCAT +# +CREATE TABLE t (c BLOB NOT NULL); +INSERT IGNORE INTO t VALUES (0); +SELECT COUNT(*) FROM t WHERE EXTRACTVALUE(c,'a')='a'; +COUNT(*) +0 +DROP TABLE t; +SET sql_mode=''; +CREATE TABLE t (c TEXT NOT NULL); +INSERT INTO t VALUES(); +Warnings: +Warning 1364 Field 'c' doesn't have a default value +INSERT IGNORE INTO t VALUES (NULL); +Warnings: +Warning 1048 Column 'c' cannot be null +SELECT GROUP_CONCAT(c ORDER BY BINARY c) FROM t GROUP BY c; +GROUP_CONCAT(c ORDER BY BINARY c) +, +DROP TABLE t; +# +# MDEV-30982 UBSAN: runtime error: null pointer passed as argument 2, which is declared to never be null in my_strnncoll_binary on DELETE +# +CREATE TABLE t (c1 SET('1','2','3'),c2 BINARY); +INSERT INTO t VALUES (0,0); +DELETE FROM t WHERE c2 Date: Tue, 27 Jun 2023 12:10:48 +0200 Subject: [PATCH 112/171] MDEV-25237 crash after setting global session_track_system_variables to an invalid value Fix of typo in checking variable list corectness. Fix of error handling in case of variable list parse error --- .../main/mysqltest_tracking_info.result | 30 +++++++++++++++++ mysql-test/main/mysqltest_tracking_info.test | 32 +++++++++++++++++++ .../main/mysqltest_tracking_info_debug.result | 21 ++++++++++++ .../main/mysqltest_tracking_info_debug.test | 30 +++++++++++++++++ sql/session_tracker.cc | 11 +++++-- sql/sys_vars.inl | 4 +++ 6 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 mysql-test/main/mysqltest_tracking_info_debug.result create mode 100644 mysql-test/main/mysqltest_tracking_info_debug.test diff --git a/mysql-test/main/mysqltest_tracking_info.result b/mysql-test/main/mysqltest_tracking_info.result index 3c474cee10f..47e22449912 100644 --- a/mysql-test/main/mysqltest_tracking_info.result +++ b/mysql-test/main/mysqltest_tracking_info.result @@ -57,3 +57,33 @@ ERROR 42000: Variable 'session_track_system_variables' can't be set to the value SET SESSION session_track_system_variables=NULL; ERROR 42000: Variable 'session_track_system_variables' can't be set to the value of 'NULL' # End of 10.3 tests +# +# MDEV-25237: crash after setting global session_track_system_variables +# to an invalid value +# +SET GLOBAL session_track_system_variables='a'; +ERROR HY000: Unknown system variable 'a' +SET GLOBAL event_scheduler=1; +# check that value really returns as it was +set GLOBAL session_track_system_variables='character_set_connection'; +SET GLOBAL session_track_system_variables='a'; +ERROR HY000: Unknown system variable 'a' +connect con,localhost,root,,test; +SET NAMES 'utf8'; +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- character_set_connection +-- utf8 + +SET NAMES 'big5'; +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- character_set_connection +-- big5 + +select @@session_track_system_variables; +@@session_track_system_variables +character_set_connection +connection default; +disconnect con; +SET GLOBAL session_track_system_variables=default; +SET GLOBAL event_scheduler=default; +# End of 10.4 test diff --git a/mysql-test/main/mysqltest_tracking_info.test b/mysql-test/main/mysqltest_tracking_info.test index ae52571b2b9..e73117a8c16 100644 --- a/mysql-test/main/mysqltest_tracking_info.test +++ b/mysql-test/main/mysqltest_tracking_info.test @@ -60,3 +60,35 @@ SET @@GLOBAL.session_track_system_variables=NULL; SET SESSION session_track_system_variables=NULL; --echo # End of 10.3 tests + +--echo # +--echo # MDEV-25237: crash after setting global session_track_system_variables +--echo # to an invalid value +--echo # + +--error ER_UNKNOWN_SYSTEM_VARIABLE +SET GLOBAL session_track_system_variables='a'; +SET GLOBAL event_scheduler=1; + + +--echo # check that value really returns as it was + +set GLOBAL session_track_system_variables='character_set_connection'; +--error ER_UNKNOWN_SYSTEM_VARIABLE +SET GLOBAL session_track_system_variables='a'; + +connect (con,localhost,root,,test); +--enable_session_track_info +SET NAMES 'utf8'; +SET NAMES 'big5'; +--disable_session_track_info + +select @@session_track_system_variables; + +connection default; +disconnect con; + +SET GLOBAL session_track_system_variables=default; +SET GLOBAL event_scheduler=default; + +--echo # End of 10.4 test diff --git a/mysql-test/main/mysqltest_tracking_info_debug.result b/mysql-test/main/mysqltest_tracking_info_debug.result new file mode 100644 index 00000000000..39d17c7ca34 --- /dev/null +++ b/mysql-test/main/mysqltest_tracking_info_debug.result @@ -0,0 +1,21 @@ +set @save_session_track_system_variables=@@session_track_system_variables; +# +# MDEV-25237: Assertion `global_system_variables. +# session_track_system_variables' failed in +# Session_sysvars_tracker::init | SIGSEGV's in __strlen_avx2 | +# UBSAN: runtime error: null pointer passed as argument 1, which +# is declared to never be null in my_strdup +# +# check that that parser problems do not lead to crash +SET @old_debug= @@session.debug; +set debug_dbug="+d,dbug_session_tracker_parse_error"; +SET GLOBAL session_track_system_variables='query_cache_size'; +ERROR HY001: Out of memory; restart server and try again (needed 1 bytes) +set debug_dbug=@old_debug; +SELECT @@global.session_track_system_variables; +@@global.session_track_system_variables +NULL +SET GLOBAL event_scheduler=1; +SET GLOBAL session_track_system_variables=default; +SET GLOBAL event_scheduler=default; +# End of 10.4 test diff --git a/mysql-test/main/mysqltest_tracking_info_debug.test b/mysql-test/main/mysqltest_tracking_info_debug.test new file mode 100644 index 00000000000..1699801f318 --- /dev/null +++ b/mysql-test/main/mysqltest_tracking_info_debug.test @@ -0,0 +1,30 @@ + +--source include/have_debug.inc +--source include/no_protocol.inc +--source include/not_embedded.inc + + +set @save_session_track_system_variables=@@session_track_system_variables; + +--echo # +--echo # MDEV-25237: Assertion `global_system_variables. +--echo # session_track_system_variables' failed in +--echo # Session_sysvars_tracker::init | SIGSEGV's in __strlen_avx2 | +--echo # UBSAN: runtime error: null pointer passed as argument 1, which +--echo # is declared to never be null in my_strdup +--echo # + +--echo # check that that parser problems do not lead to crash +SET @old_debug= @@session.debug; +set debug_dbug="+d,dbug_session_tracker_parse_error"; +--error ER_OUTOFMEMORY +SET GLOBAL session_track_system_variables='query_cache_size'; +set debug_dbug=@old_debug; +SELECT @@global.session_track_system_variables; + +SET GLOBAL event_scheduler=1; + +SET GLOBAL session_track_system_variables=default; +SET GLOBAL event_scheduler=default; + +--echo # End of 10.4 test diff --git a/sql/session_tracker.cc b/sql/session_tracker.cc index 0544827534d..cfc83b8cb74 100644 --- a/sql/session_tracker.cc +++ b/sql/session_tracker.cc @@ -221,7 +221,7 @@ bool sysvartrack_validate_value(THD *thd, const char *str, size_t len) /* Remove leading/trailing whitespace. */ trim_whitespace(system_charset_info, &var); - if (!strcmp(var.str, "*") && !find_sys_var(thd, var.str, var.length)) + if (strcmp(var.str, "*") && !find_sys_var(thd, var.str, var.length)) return true; if (lasts) @@ -331,9 +331,8 @@ void Session_sysvars_tracker::init(THD *thd) mysql_mutex_assert_owner(&LOCK_global_system_variables); DBUG_ASSERT(thd->variables.session_track_system_variables == global_system_variables.session_track_system_variables); - DBUG_ASSERT(global_system_variables.session_track_system_variables); thd->variables.session_track_system_variables= - my_strdup(global_system_variables.session_track_system_variables, + my_strdup(safe_str(global_system_variables.session_track_system_variables), MYF(MY_WME | MY_THREAD_SPECIFIC)); } @@ -572,6 +571,12 @@ bool sysvartrack_global_update(THD *thd, char *str, size_t len) { LEX_STRING tmp= { str, len }; Session_sysvars_tracker::vars_list dummy; + DBUG_EXECUTE_IF("dbug_session_tracker_parse_error", + { + my_error(ER_OUTOFMEMORY, MYF(0), 1); + return true; + }); + if (!dummy.parse_var_list(thd, tmp, false, system_charset_info)) { dummy.construct_var_list(str, len + 1); diff --git a/sql/sys_vars.inl b/sql/sys_vars.inl index 84d1cd6b331..3e282de439a 100644 --- a/sql/sys_vars.inl +++ b/sql/sys_vars.inl @@ -620,7 +620,11 @@ public: { if (sysvartrack_global_update(thd, new_val, var->save_result.string_value.length)) + { + if (new_val) + my_free(new_val); new_val= 0; + } } global_update_finish(new_val); return (new_val == 0 && var->save_result.string_value.str != 0); From 5a44700aaa1d2fd8867670d9e6a10c085d9856b6 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 5 Jul 2023 13:01:43 +1000 Subject: [PATCH 113/171] MDEV-31625 connect engine file_type=DBF insert fails Add the end of file marker x1A to the DBF file and handle it correctly to preserve interoperability with Libreoffice, and others that have followed the DBF spec. The file open mode of "a+" was problematic because Linux and the OSX, the previous main development mode are inconsistent (see man fopen). The main problem per the bug report was the inability to fseek back to the beginning to update the records in the header. As such the "a+" mode is remove and "w+b" is used inserting to a new file and "r+b" is used for appending to the file. In DBFFAM::CloseTableFile move PlugCloseFile down to close the file in all modes. The year unlike the comments is always since 1900. Use the YYYY-MM-DD as an unabigious form during tracing. Thanks for Mr. Zoltan Duna for the descriptive bug report. --- storage/connect/filamdbf.cpp | 53 ++++++++-------- .../connect/mysql-test/connect/r/dbf.result | 60 +++++++++++++++---- storage/connect/mysql-test/connect/t/dbf.test | 10 ++++ 3 files changed, 83 insertions(+), 40 deletions(-) diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 406974a6924..79eff8b4f68 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -335,9 +335,9 @@ PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, PTOS topt, bool info) hp->Headlen(), hp->Reclen(), fields); htrc("flags(iem)=%d,%d,%d cp=%d\n", hp->Incompleteflag, hp->Encryptflag, hp->Mdxflag, hp->Language); - htrc("%hd records, last changed %02d/%02d/%d\n", - hp->Records(), hp->Filedate[1], hp->Filedate[2], - hp->Filedate[0] + (hp->Filedate[0] <= 30) ? 2000 : 1900); + htrc("%hd records, last changed %04d-%02d-%02d\n", + hp->Records(), + hp->Filedate[0] + 1900, hp->Filedate[1], hp->Filedate[2]); htrc("Field Type Offset Len Dec Set Mdx\n"); } // endif trace @@ -605,8 +605,7 @@ bool DBFFAM::OpenTableFile(PGLOBAL g) strcpy(opmode, (UseTemp) ? "rb" : "r+b"); break; case MODE_INSERT: - // Must be in text mode to remove an eventual EOF character - strcpy(opmode, "a+"); + strcpy(opmode, Records ? "r+b" : "w+b"); break; default: snprintf(g->Message, sizeof(g->Message), MSG(BAD_OPEN_MODE), mode); @@ -619,7 +618,7 @@ bool DBFFAM::OpenTableFile(PGLOBAL g) if (!(Stream = PlugOpenFile(g, filename, opmode))) { if (trace(1)) htrc("%s\n", g->Message); - + return (mode == MODE_READ && errno == ENOENT) ? PushWarning(g, Tdbp) : true; } // endif Stream @@ -643,6 +642,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) { char c; int rc; + int len; MODE mode = Tdbp->GetMode(); Buflen = Blksize; @@ -664,7 +664,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) /************************************************************************/ /* If this is a new file, the header must be generated. */ /************************************************************************/ - int len = GetFileLength(g); + len = GetFileLength(g); if (!len) { // Make the header for this DBF table file @@ -702,7 +702,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) header->Version = DBFTYPE; t = time(NULL) - (time_t)DTVAL::GetShift(); datm = gmtime(&t); - header->Filedate[0] = datm->tm_year - 100; + header->Filedate[0] = datm->tm_year; header->Filedate[1] = datm->tm_mon + 1; header->Filedate[2] = datm->tm_mday; header->SetHeadlen((ushort)hlen); @@ -793,8 +793,12 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) /**************************************************************************/ /* Position the file at the begining of the data. */ /**************************************************************************/ - if (Tdbp->GetMode() == MODE_INSERT) - rc = fseek(Stream, 0, SEEK_END); + if (Tdbp->GetMode() == MODE_INSERT) { + if (len) + rc = fseek(Stream, -1, SEEK_END); + else + rc = fseek(Stream, 0, SEEK_END); + } else rc = fseek(Stream, Headlen, SEEK_SET); @@ -979,6 +983,7 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) Rbuf = CurNum--; // Closing = true; wrc = WriteBuffer(g); + fputc(0x1a, Stream); } else if (mode == MODE_UPDATE || mode == MODE_DELETE) { if (Modif && !Closing) { // Last updated block remains to be written @@ -1003,35 +1008,27 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) } // endif's mode if (Tdbp->GetMode() == MODE_INSERT) { - int n = ftell(Stream) - Headlen; - - rc = PlugCloseFile(g, To_Fb); + int n = ftell(Stream) - Headlen - 1; if (n >= 0 && !(n % Lrecl)) { n /= Lrecl; // New number of lines if (n > Records) { // Update the number of rows in the file header - char filename[_MAX_PATH]; + char nRecords[4]; + int4store(nRecords, n); - PlugSetPath(filename, To_File, Tdbp->GetPath()); - if ((Stream= global_fopen(g, MSGID_OPEN_MODE_STRERROR, filename, "r+b"))) - { - char nRecords[4]; - int4store(nRecords, n); - - fseek(Stream, 4, SEEK_SET); // Get header.Records position - fwrite(nRecords, sizeof(nRecords), 1, Stream); - fclose(Stream); - Stream= NULL; - Records= n; // Update Records value - } + fseek(Stream, 4, SEEK_SET); // Get header.Records position + fwrite(nRecords, sizeof(nRecords), 1, Stream); + Stream= NULL; + Records= n; // Update Records value } // endif n } // endif n - } else // Finally close the file - rc = PlugCloseFile(g, To_Fb); + } + // Finally close the file + rc = PlugCloseFile(g, To_Fb); fin: if (trace(1)) diff --git a/storage/connect/mysql-test/connect/r/dbf.result b/storage/connect/mysql-test/connect/r/dbf.result index d8744ef3b70..52ec29bc350 100644 --- a/storage/connect/mysql-test/connect/r/dbf.result +++ b/storage/connect/mysql-test/connect/r/dbf.result @@ -64,6 +64,24 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `TABLE_TYPE`=DBF `FILE_NAME`='t1.dbf' INSERT INTO t1 VALUES (10),(20); +CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); +-------- -------- +FileSize 91 +DBF_Version 03 +NRecords 2 +FirstRecPos 66 +RecLength 12 +TableFlags 0000 +CodePageMark 00 +--- --- +FieldN 0 +Name a +Type N +Offset 0 +Length 11 +Dec 0 +Flags 00 +-------- -------- SELECT * FROM t1; a 10 @@ -89,6 +107,24 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `TABLE_TYPE`=DBF `FILE_NAME`='t1.dbf' `READONLY`=NO INSERT INTO t1 VALUES (30); +CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); +-------- -------- +FileSize 103 +DBF_Version 03 +NRecords 3 +FirstRecPos 66 +RecLength 12 +TableFlags 0000 +CodePageMark 00 +--- --- +FieldN 0 +Name a +Type N +Offset 0 +Length 11 +Dec 0 +Flags 00 +-------- -------- SELECT * FROM t1; a 10 @@ -137,7 +173,7 @@ a test CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 77 +FileSize 78 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -171,7 +207,7 @@ a b c 2 2 2 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 194 +FileSize 195 DBF_Version 03 NRecords 2 FirstRecPos 130 @@ -264,7 +300,7 @@ a -9223372036854775808 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 108 +FileSize 109 DBF_Version 03 NRecords 2 FirstRecPos 66 @@ -308,7 +344,7 @@ a -32768 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 80 +FileSize 81 DBF_Version 03 NRecords 2 FirstRecPos 66 @@ -338,7 +374,7 @@ LENGTH(a) 255 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 322 +FileSize 323 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -419,7 +455,7 @@ a 2001-01-01 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 75 +FileSize 76 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -449,7 +485,7 @@ a 123.0000 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 79 +FileSize 80 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -481,7 +517,7 @@ a 123456789.12345 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 108 +FileSize 109 DBF_Version 03 NRecords 2 FirstRecPos 66 @@ -511,7 +547,7 @@ a 10 CALL dbf_header('MYSQLD_DATADIR/test/t1c.dbf'); -------- -------- -FileSize 77 +FileSize 78 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -538,7 +574,7 @@ a 10 CALL dbf_header('MYSQLD_DATADIR/test/t1c.dbf'); -------- -------- -FileSize 77 +FileSize 78 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -567,7 +603,7 @@ a 10 CALL dbf_header('MYSQLD_DATADIR/test/t1c.dbf'); -------- -------- -FileSize 77 +FileSize 78 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -604,7 +640,7 @@ c1 c2 i1 i2 30 def 30 123 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 291 +FileSize 292 DBF_Version 03 NRecords 3 FirstRecPos 162 diff --git a/storage/connect/mysql-test/connect/t/dbf.test b/storage/connect/mysql-test/connect/t/dbf.test index b798b1a2bc5..50e682c7eb1 100644 --- a/storage/connect/mysql-test/connect/t/dbf.test +++ b/storage/connect/mysql-test/connect/t/dbf.test @@ -63,6 +63,11 @@ DELIMITER ;// CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf'; SHOW CREATE TABLE t1; INSERT INTO t1 VALUES (10),(20); +--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf +--vertical_results +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf'); +--horizontal_results SELECT * FROM t1; ALTER TABLE t1 READONLY=Yes; SHOW CREATE TABLE t1; @@ -77,6 +82,11 @@ TRUNCATE TABLE t1; ALTER TABLE t1 READONLY=NO; SHOW CREATE TABLE t1; INSERT INTO t1 VALUES (30); +--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf +--vertical_results +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf'); +--horizontal_results SELECT * FROM t1; DROP TABLE t1; --remove_file $MYSQLD_DATADIR/test/t1.dbf From 620aeb44db8a2f442a662a54a7ea85b363d68dd5 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Fri, 14 Jul 2023 14:51:09 +0200 Subject: [PATCH 114/171] MDEV-30159: Client can crash the server with a mysql_list_fields("view") call Do not get value of expensive constants. --- sql/item_cmpfunc.cc | 4 +++- tests/mysql_client_test.c | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index fa96d95adb1..8e6ca318d11 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -6047,7 +6047,9 @@ void Regexp_processor_pcre::fix_owner(Item_func *owner, Item *subject_arg, Item *pattern_arg) { - if (!is_compiled() && pattern_arg->const_item()) + if (!is_compiled() && + pattern_arg->const_item() && + !pattern_arg->is_expensive()) { if (compile(pattern_arg, true)) { diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 21f5c2ecbcb..05190b20624 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -21392,6 +21392,48 @@ static void test_mdev20261() myquery(rc); } +static void test_mdev_30159() +{ + MYSQL_RES *result; + int rc; + + myheader("test_mdev_30159"); + + rc= mysql_query(mysql, "create table t1 (" + " name varchar(100)," + " typ varchar(100)" + ")"); + myquery(rc); + rc= mysql_query(mysql, "insert into t1 values (1,1),(2,2),(3,3),(4,4),(5,5)," + "(6,6),(7,7),(8,8),(9,9),(10,10)"); + myquery(rc); + rc= mysql_query(mysql, "insert into t1 values ('', 'value'),('', 'value')"); + myquery(rc); + rc= mysql_query(mysql, "create table t2 (" + " servername varchar(100)" + ")"); + myquery(rc); + rc= mysql_query(mysql, "insert into t2 values (1),(2),(3),(4),(5)," + "(6),(7),(8),(9),(10)"); + myquery(rc); + rc= mysql_query(mysql, "create view v1 as" + " select * from t2" + " where" + " `t2`.`servername` regexp ( select" + " group_concat(`t1`.`name` separator '|')" + " from `t1`" + " where `t1`.`typ`" + " like 'value')"); + myquery(rc); + + result= mysql_list_fields(mysql, "v1", NULL); + mytest(result); + + rc= mysql_query(mysql, "drop view v1"); + myquery(rc); + rc= mysql_query(mysql, "drop table t1, t2"); + myquery(rc); +} static struct my_tests_st my_tests[]= { { "test_mdev_20516", test_mdev_20516 }, @@ -21695,6 +21737,7 @@ static struct my_tests_st my_tests[]= { { "test_mdev_16128", test_mdev_16128 }, { "test_mdev18408", test_mdev18408 }, { "test_mdev20261", test_mdev20261 }, + { "test_mdev_30159", test_mdev_30159 }, { 0, 0 } }; From daeccfcf2b501f2736f3da6421ffa7e053a218e9 Mon Sep 17 00:00:00 2001 From: Monty Date: Tue, 23 May 2023 10:02:33 +0300 Subject: [PATCH 115/171] Optimized version of safe_strcpy() Note: We should replace most case of safe_strcpy() with strmake() to avoid the not needed zerofill. --- include/m_string.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/include/m_string.h b/include/m_string.h index 0133d81f6df..7d8ba69c4d1 100644 --- a/include/m_string.h +++ b/include/m_string.h @@ -248,14 +248,15 @@ static inline void lex_string_set3(LEX_CSTRING *lex_str, const char *c_str, */ static inline int safe_strcpy(char *dst, size_t dst_size, const char *src) { - memset(dst, '\0', dst_size); - strncpy(dst, src, dst_size - 1); - /* - If the first condition is true, we are guaranteed to have src length - >= (dst_size - 1), hence safe to access src[dst_size - 1]. - */ - if (dst[dst_size - 2] != '\0' && src[dst_size - 1] != '\0') - return 1; /* Truncation of src. */ + DBUG_ASSERT(dst_size > 0); + /* Note, strncpy will zerofill end of dst if src shorter than dst_size */ + strncpy(dst, src, dst_size); + if (dst[dst_size-1]) + { + /* Ensure string is zero terminated */ + dst[dst_size-1]= 0; + return 1; + } return 0; } From 2ba5c387c1cc0c09e6058adec7f9ef4fd13fe6a0 Mon Sep 17 00:00:00 2001 From: Daniel Lenski Date: Mon, 10 Jul 2023 13:57:07 -0700 Subject: [PATCH 116/171] Avoid triggering stringop-truncation warning in safe_strcpy The `safe_strcpy()` function was added in https://github.com/mariadb/server/commit/567b68129943#diff-23f88d0b52735bf79b7eb76e2ddbbebc96f3b1ca16e784a347525a9c43134d77 Unfortunately, its current implementation triggers many GCC 8+ string truncation and array bounds warnings, particularly due to the potential for a false positive `-Warray-bounds`. For example, the line `safe_strcpy(delimiter, sizeof(delimiter), ";")` in `client/mysqldump.c` causes the following warning: [1669/1914] Building C object client/CMakeFiles/mariadb-dump.dir/mysqldump.c.o In file included from /PATH/include/my_sys.h:20, from /PATH/mysqldump.c:51: In function ?safe_strcpy?, inlined from ?dump_events_for_db.isra? at /PATH/client/mysqldump.c:2595:3: /PATH/include/m_string.h:258:39: warning: array subscript 1535 is outside array bounds of ?const char[2]? [-Warray-bounds=] 258 | if (dst[dst_size - 2] != '\0' && src[dst_size - 1] != '\0') | ~~~^~~~~~~~~~~~~~ GCC is reporting that the `safe_strcpy` function *could* cause an out-of-bounds read from the constant *source* string `";"`, however this warning is unhelpful and confusing because it can only happen if the size of the *destination* buffer is incorrectly specified, which is not the case here. In https://github.com/MariaDB/server/pull/2640, Andrew Hutchings proposed fixing this by disabling the `-Warray-bounds` check in this function (specifically in https://github.com/MariaDB/server/pull/2640/commits/be382d01d08739d081f6cf40f350f7414f29b49d#diff-23f88d0b52735bf79b7eb76e2ddbbebc96f3b1ca16e784a347525a9c43134d77R255-R262). However, this was rejected because it also disables the *helpful* `-Warray-bounds` check on the destination buffer. Cherry-picking the commit https://github.com/MariaDB/server/commit/a7adfd4c52307876d68ad3386cefd3757ee66e92 from 11.2 by Monty Widenius solves the first two problems: 1. It reimplements `safe_strcpy` a bit more efficiently, skipping the `memset(dst, 0, dst_size)`. This is unnecessary since `strncpy` already pads `dst` with 0 bytes. 2. It will not trigger the `-Warray-bounds` warning, because `src` is not read based on an offset determined from `dst_size`. There is a third problem, however. Using `strncpy` triggers the `-Wstringop-truncation` warning (https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wstringop-truncation), so we need to disable that. However, that is a much less broadly and generally-useful warning so there is no loss of static analysis value caused by disabling it. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc. --- include/m_string.h | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/include/m_string.h b/include/m_string.h index 7d8ba69c4d1..4c8f0074cb9 100644 --- a/include/m_string.h +++ b/include/m_string.h @@ -249,11 +249,30 @@ static inline void lex_string_set3(LEX_CSTRING *lex_str, const char *c_str, static inline int safe_strcpy(char *dst, size_t dst_size, const char *src) { DBUG_ASSERT(dst_size > 0); - /* Note, strncpy will zerofill end of dst if src shorter than dst_size */ + + /* 1) IF there is a 0 byte in the first dst_size bytes of src, strncpy will + * 0-terminate dst, and pad dst with additional 0 bytes out to dst_size. + * + * 2) IF there is no 0 byte in the first dst_size bytes of src, strncpy will + * copy dst_size bytes, and the final byte won't be 0. + * + * In GCC 8+, the `-Wstringop-truncation` warning will object to strncpy() + * being used in this way, so we need to disable this warning for this + * single statement. + */ + +#if defined(__GNUC__) && __GNUC__ >= 8 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" +#endif strncpy(dst, src, dst_size); +#if defined(__GNUC__) && __GNUC__ >= 8 +#pragma GCC diagnostic pop +#endif + if (dst[dst_size-1]) { - /* Ensure string is zero terminated */ + /* Only possible in case (2), meaning src was truncated. */ dst[dst_size-1]= 0; return 1; } From add0c01bae4cd2ed435755feb1240a5dbc1c85c1 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 20 Jul 2023 14:13:59 +0300 Subject: [PATCH 117/171] MDEV-30528 Assertion in dtype_get_at_most_n_mbchars 1. Exclude merging history rows into fts index. The check !history_fts && (index->type & DICT_FTS) was just incorrect attempt to avoid history in fts index. 2. Don't check for duplicates for history rows. --- .../suite/innodb_fts/r/innodb_fts_misc.result | 23 +++++++++++++++++++ .../suite/innodb_fts/t/innodb_fts_misc.test | 18 +++++++++++++++ storage/innobase/row/row0merge.cc | 12 ++++++---- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result b/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result index 2cc992be73a..d86d44f38de 100644 --- a/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result +++ b/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result @@ -1393,3 +1393,26 @@ INSERT INTO t1 VALUES(repeat("this is the test case", 500)); ALTER TABLE t1 KEY_BLOCK_SIZE=4; ALTER TABLE t1 KEY_BLOCK_SIZE=0; DROP TABLE t1; +# +# MDEV-30528 Assertion in dtype_get_at_most_n_mbchars +# +create table t (f text) with system versioning character set utf8 engine=innodb; +insert into t (f) values +('mysql from tutorial dbms stands for database ...') , +('when to use mysql well after that you went through a ...'), +('where will optimizing mysql in what tutorial we will show ...'), +('1001 mysql tricks 1. never run mysqld as root. 2. ...'), +('mysql vs. yoursql in the following database comparison ...'), +('mysql security when configured properly, mysql ...'); +delete from t where f like 'mysql%'; +alter table t add fulltext (f); +select * from t where match(f) against ("use"); +f +when to use mysql well after that you went through a ... +select * from t where match(f) against ("run"); +f +1001 mysql tricks 1. never run mysqld as root. 2. ... +select * from t where match(f) against ("tutorial"); +f +where will optimizing mysql in what tutorial we will show ... +drop table t; diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test b/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test index 8f4902fd2de..bbc4f089001 100644 --- a/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test +++ b/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test @@ -1341,3 +1341,21 @@ ALTER TABLE t1 KEY_BLOCK_SIZE=4; ALTER TABLE t1 KEY_BLOCK_SIZE=0; DROP TABLE t1; +--echo # +--echo # MDEV-30528 Assertion in dtype_get_at_most_n_mbchars +--echo # +create table t (f text) with system versioning character set utf8 engine=innodb; +insert into t (f) values + ('mysql from tutorial dbms stands for database ...') , + ('when to use mysql well after that you went through a ...'), + ('where will optimizing mysql in what tutorial we will show ...'), + ('1001 mysql tricks 1. never run mysqld as root. 2. ...'), + ('mysql vs. yoursql in the following database comparison ...'), + ('mysql security when configured properly, mysql ...'); +delete from t where f like 'mysql%'; +alter table t add fulltext (f); +select * from t where match(f) against ("use"); +select * from t where match(f) against ("run"); +select * from t where match(f) against ("tutorial"); +# cleanup +drop table t; diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index f0aed489f22..aa431886efe 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -502,7 +502,8 @@ row_merge_buf_add( VCOL_STORAGE vcol_storage; DBUG_ENTER("row_merge_buf_add"); - if (buf->n_tuples >= buf->max_tuples) { + if (buf->n_tuples >= buf->max_tuples + || (history_fts && (buf->index->type & DICT_FTS))) { error: n_row_added = 0; goto end; @@ -595,7 +596,8 @@ error: /* Tokenize and process data for FTS */ - if (!history_fts && (index->type & DICT_FTS)) { + if (index->type & DICT_FTS) { + ut_ad(!history_fts); fts_doc_item_t* doc_item; byte* value; void* ptr; @@ -1876,6 +1878,7 @@ row_merge_read_clustered_index( mach_write_to_8(new_sys_trx_start, trx->id); mach_write_to_8(new_sys_trx_end, TRX_ID_MAX); uint64_t n_rows = 0; + bool history_row = false; /* Scan the clustered index. */ for (;;) { @@ -1892,7 +1895,7 @@ row_merge_read_clustered_index( dtuple_t* row; row_ext_t* ext; page_cur_t* cur = btr_pcur_get_page_cur(&pcur); - bool history_row, history_fts = false; + bool history_fts = false; page_cur_move_to_next(cur); @@ -2527,7 +2530,8 @@ write_buffers: ut_ad(i == 0); break; } - } else if (dict_index_is_unique(buf->index)) { + } else if (!history_row + && dict_index_is_unique(buf->index)) { row_merge_dup_t dup = { buf->index, table, col_map, 0}; From fe618de6919e37fc49c8317b85a1a0b5a42af58b Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 20 Jul 2023 14:13:59 +0300 Subject: [PATCH 118/171] MDEV-31313 SYSTEM VERSIONING and FOREIGN KEY CASCADE create orphan rows on replica Constraints processing row_ins_check_foreign_constraint() was not called because row_upd_check_references_constraints() didn't see update as delete: node->is_delete was false. Since MDEV-30378 we check for TRG_EVENT_DELETE to detect versioned delete in ha_innobase::update_row(). Now we can use TRG_EVENT_DELETE to set upd_node->is_delete, so constraints processing is triggered correctly. --- mysql-test/suite/versioning/common.inc | 12 +++++ mysql-test/suite/versioning/common_finish.inc | 1 + mysql-test/suite/versioning/r/rpl.result | 49 +++++++++++++++++ mysql-test/suite/versioning/t/rpl.test | 53 +++++++++++++++++++ sql/log_event.cc | 17 +++++- 5 files changed, 130 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/versioning/common.inc b/mysql-test/suite/versioning/common.inc index 25adf15dd50..990fe713d4f 100644 --- a/mysql-test/suite/versioning/common.inc +++ b/mysql-test/suite/versioning/common.inc @@ -91,6 +91,18 @@ begin end~~ delimiter ;~~ +delimiter ~~; +eval create or replace function check_row_slave(row_start $sys_datatype_expl, row_end $sys_datatype_expl) +returns varchar(255) +deterministic +begin + if current_row(row_end) then + return "CURRENT ROW"; + end if; + return "HISTORICAL ROW"; +end~~ +delimiter ;~~ + delimiter ~~; eval create or replace function check_row_ts(row_start timestamp(6), row_end timestamp(6)) returns varchar(255) diff --git a/mysql-test/suite/versioning/common_finish.inc b/mysql-test/suite/versioning/common_finish.inc index 3c4e7b66ff3..f4aa2310a73 100644 --- a/mysql-test/suite/versioning/common_finish.inc +++ b/mysql-test/suite/versioning/common_finish.inc @@ -4,6 +4,7 @@ drop procedure if exists verify_trt; drop procedure if exists verify_trt_dummy; drop function if exists current_row; drop function if exists check_row; +drop function if exists check_row_slave; drop function if exists current_row_ts; drop function if exists check_row_ts; --enable_warnings diff --git a/mysql-test/suite/versioning/r/rpl.result b/mysql-test/suite/versioning/r/rpl.result index 17372c63e99..d4187cd0f3e 100644 --- a/mysql-test/suite/versioning/r/rpl.result +++ b/mysql-test/suite/versioning/r/rpl.result @@ -188,4 +188,53 @@ connection slave; include/diff_tables.inc [master:test.t1,slave:test.t1] connection master; drop table t1; +# +# MDEV-31313 SYSTEM VERSIONING and FOREIGN KEY CASCADE create orphan rows on replica +# +create table parent ( +id int(11) not null auto_increment, +processdate datetime default null, +primary key (id) +) engine=innodb with system versioning; +set timestamp= unix_timestamp('2000-01-01 00:00:00'); +insert into parent values (1, now()); +create table child ( +id int(11) not null auto_increment, +ch_name varchar(30), +andreid int(11) default null, +primary key (id), +key andreid (andreid), +constraint fk_andreid foreign key (andreid) references parent (id) on delete cascade +) engine=innodb with system versioning; +set timestamp= unix_timestamp('2000-01-01 00:00:01'); +insert into child values (null, 'vimtomar', 1); +set timestamp= unix_timestamp('2000-01-01 00:00:02'); +delete from parent where id = 1; +select check_row(row_start, row_end) from parent for system_time all; +check_row(row_start, row_end) +HISTORICAL ROW +select check_row(row_start, row_end) from child for system_time all; +check_row(row_start, row_end) +HISTORICAL ROW +select * from child; +id ch_name andreid +select * from parent; +id processdate +connection slave; +select check_row_slave(row_start, row_end) from parent for system_time all; +check_row_slave(row_start, row_end) +HISTORICAL ROW +select check_row_slave(row_start, row_end) from child for system_time all; +check_row_slave(row_start, row_end) +HISTORICAL ROW +select * from child; +id ch_name andreid +select * from parent; +id processdate +connection master; +set timestamp= default; +drop table child; +drop table parent; +connection slave; +connection master; include/rpl_end.inc diff --git a/mysql-test/suite/versioning/t/rpl.test b/mysql-test/suite/versioning/t/rpl.test index 7d78b60e6fa..2da0931bef0 100644 --- a/mysql-test/suite/versioning/t/rpl.test +++ b/mysql-test/suite/versioning/t/rpl.test @@ -1,4 +1,5 @@ --source suite/versioning/engines.inc +--source suite/versioning/common.inc --source include/have_partition.inc --source include/master-slave.inc @@ -6,6 +7,7 @@ #Testing command counters -BEFORE. #Storing the before counts of Slave connection slave; +--source suite/versioning/common.inc let $slave_com_commit_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_commit', Value, 1); let $slave_com_insert_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_insert', Value, 1); let $slave_com_delete_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_delete', Value, 1); @@ -167,4 +169,55 @@ sync_slave_with_master; connection master; drop table t1; +--echo # +--echo # MDEV-31313 SYSTEM VERSIONING and FOREIGN KEY CASCADE create orphan rows on replica +--echo # +create table parent ( + id int(11) not null auto_increment, + processdate datetime default null, + primary key (id) +) engine=innodb with system versioning; + +set timestamp= unix_timestamp('2000-01-01 00:00:00'); +insert into parent values (1, now()); + +create table child ( + id int(11) not null auto_increment, + ch_name varchar(30), + andreid int(11) default null, + primary key (id), + key andreid (andreid), + constraint fk_andreid foreign key (andreid) references parent (id) on delete cascade +) engine=innodb with system versioning; + +set timestamp= unix_timestamp('2000-01-01 00:00:01'); +insert into child values (null, 'vimtomar', 1); + +set timestamp= unix_timestamp('2000-01-01 00:00:02'); +delete from parent where id = 1; + +select check_row(row_start, row_end) from parent for system_time all; +select check_row(row_start, row_end) from child for system_time all; +select * from child; +select * from parent; + +sync_slave_with_master; + +# Annoying tweaking of microseconds in slave row_end, so row_end can be <= row_start +select check_row_slave(row_start, row_end) from parent for system_time all; +select check_row_slave(row_start, row_end) from child for system_time all; +select * from child; +select * from parent; + +# Cleanup +--source suite/versioning/common_finish.inc +--connection master +set timestamp= default; +drop table child; +drop table parent; + +sync_slave_with_master; +connection master; + +--source suite/versioning/common_finish.inc --source include/rpl_end.inc diff --git a/sql/log_event.cc b/sql/log_event.cc index 181a26ccdb5..23ccaef2a56 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -14759,6 +14759,11 @@ Update_rows_log_event::do_exec_row(rpl_group_info *rgi) return error; } + const bool history_change= m_table->versioned() ? + !m_table->vers_end_field()->is_max() : false; + TABLE_LIST *tl= m_table->pos_in_table_list; + uint8 trg_event_map_save= tl->trg_event_map; + /* This is the situation after locating BI: @@ -14816,9 +14821,17 @@ Update_rows_log_event::do_exec_row(rpl_group_info *rgi) goto err; } - if (m_vers_from_plain && m_table->versioned(VERS_TIMESTAMP)) - m_table->vers_update_fields(); + if (m_table->versioned()) + { + if (m_vers_from_plain && m_table->versioned(VERS_TIMESTAMP)) + m_table->vers_update_fields(); + if (!history_change && !m_table->vers_end_field()->is_max()) + { + tl->trg_event_map|= trg2bit(TRG_EVENT_DELETE); + } + } error= m_table->file->ha_update_row(m_table->record[1], m_table->record[0]); + tl->trg_event_map= trg_event_map_save; if (unlikely(error == HA_ERR_RECORD_IS_THE_SAME)) error= 0; if (m_vers_from_plain && m_table->versioned(VERS_TIMESTAMP)) From c5a83411157e764a599ec69544bf085d435dd84f Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 20 Jul 2023 14:13:59 +0300 Subject: [PATCH 119/171] MDEV-23100 ODKU of non-versioning column inserts history row Use vers_check_update() to avoid inserting history row for ODKU if now versioned fields specified in update_fields. --- mysql-test/suite/versioning/r/update.result | 14 ++++++++++++++ mysql-test/suite/versioning/t/update.test | 16 ++++++++++++++++ sql/sql_insert.cc | 3 ++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/versioning/r/update.result b/mysql-test/suite/versioning/r/update.result index cbb75a10cf5..f0a5052acf9 100644 --- a/mysql-test/suite/versioning/r/update.result +++ b/mysql-test/suite/versioning/r/update.result @@ -437,4 +437,18 @@ update t1 set a = 3 where b <= 9; update t2 set a = 3 where b <= 9; update t1, t2 set t1.a = 3, t2.a = 3 where t1.b <= 10 and t2.b <= 10 and t1.b = t2.b; drop tables t1, t2; +# +# MDEV-23100 ODKU of non-versioning column inserts history row +# +create table t1 ( +x int unique, +y int without system versioning +) with system versioning; +insert into t1 (x, y) values ('1', '1'); +insert into t1 (x, y) values ('1', '2') +on duplicate key update y = 3; +select x, y, check_row_ts(row_start, row_end) from t1 for system_time all order by row_end; +x y check_row_ts(row_start, row_end) +1 3 CURRENT ROW +drop table t1; # End of 10.4 tests diff --git a/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test index 56bbd909256..b86296616fd 100644 --- a/mysql-test/suite/versioning/t/update.test +++ b/mysql-test/suite/versioning/t/update.test @@ -373,6 +373,22 @@ update t1, t2 set t1.a = 3, t2.a = 3 where t1.b <= 10 and t2.b <= 10 and t1.b = # cleanup drop tables t1, t2; +--echo # +--echo # MDEV-23100 ODKU of non-versioning column inserts history row +--echo # +create table t1 ( + x int unique, + y int without system versioning +) with system versioning; + +insert into t1 (x, y) values ('1', '1'); +insert into t1 (x, y) values ('1', '2') + on duplicate key update y = 3; + +select x, y, check_row_ts(row_start, row_end) from t1 for system_time all order by row_end; + +drop table t1; + --echo # End of 10.4 tests source suite/versioning/common_finish.inc; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 0f1b66f7610..a2c571373cb 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1916,7 +1916,8 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info) if (error != HA_ERR_RECORD_IS_THE_SAME) { info->updated++; - if (table->versioned()) + if (table->versioned() && + table->vers_check_update(*info->update_fields)) { if (table->versioned(VERS_TIMESTAMP)) { From 21a8d2c3131379be36b81e1b574ee1c7eaa29599 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 20 Jul 2023 14:13:59 +0300 Subject: [PATCH 120/171] MDEV-31319 Assertion const_item_cache == true failed in Item_func::fix_fields On create table tmp as select ... we exited Item_func::fix_fields() with error. fix_fields_if_needed('foo' or 'bar') failed and we returned true, but already changed const_item_cache. So the item is in inconsistent state: fixed == false and const_item_cache == false. Now we cleanup the item before the return if Item_func::fix_fields() fails to process. --- mysql-test/suite/vcol/r/vcol_syntax.result | 19 +++++++++++++++++++ mysql-test/suite/vcol/t/vcol_syntax.test | 11 +++++++++++ sql/item_func.cc | 9 +++++++++ 3 files changed, 39 insertions(+) diff --git a/mysql-test/suite/vcol/r/vcol_syntax.result b/mysql-test/suite/vcol/r/vcol_syntax.result index b5f20b19fa4..dd38a1992e5 100644 --- a/mysql-test/suite/vcol/r/vcol_syntax.result +++ b/mysql-test/suite/vcol/r/vcol_syntax.result @@ -197,3 +197,22 @@ Warnings: Warning 1292 Truncated incorrect DECIMAL value: 'x' Warning 1292 Truncated incorrect DECIMAL value: 'test' drop table t1; +# +# MDEV-31319 Assertion const_item_cache == true failed in Item_func::fix_fields +# +create table t (f1 int, f2 int, fv int generated always as (case user() when 'foo' or 'bar' then f1 else f2 end) virtual); +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'foo' +Warning 1292 Truncated incorrect DOUBLE value: 'bar' +select * from t; +f1 f2 fv +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'foo' +Warning 1292 Truncated incorrect DOUBLE value: 'bar' +create table tmp as select * from information_schema.tables where table_name = 't'; +select * from t; +f1 f2 fv +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'foo' +Warning 1292 Truncated incorrect DOUBLE value: 'bar' +drop table t, tmp; diff --git a/mysql-test/suite/vcol/t/vcol_syntax.test b/mysql-test/suite/vcol/t/vcol_syntax.test index 198d61a13aa..3a0ed0270e2 100644 --- a/mysql-test/suite/vcol/t/vcol_syntax.test +++ b/mysql-test/suite/vcol/t/vcol_syntax.test @@ -162,3 +162,14 @@ create table t1 (a int , b date as (1 in ('x' ,(database ()) ))) ; select b from t1; select a from t1 order by 'x' = b; drop table t1; + +--echo # +--echo # MDEV-31319 Assertion const_item_cache == true failed in Item_func::fix_fields +--echo # +create table t (f1 int, f2 int, fv int generated always as (case user() when 'foo' or 'bar' then f1 else f2 end) virtual); +select * from t; +create table tmp as select * from information_schema.tables where table_name = 't'; +select * from t; + +# cleanup +drop table t, tmp; diff --git a/sql/item_func.cc b/sql/item_func.cc index fd393f8de3f..a632ab825e0 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -353,7 +353,10 @@ Item_func::fix_fields(THD *thd, Item **ref) We shouldn't call fix_fields() twice, so check 'fixed' field first */ if ((*arg)->fix_fields_if_needed(thd, arg)) + { + cleanup(); return TRUE; /* purecov: inspected */ + } item= *arg; if (item->maybe_null) @@ -369,9 +372,15 @@ Item_func::fix_fields(THD *thd, Item **ref) } } if (check_arguments()) + { + cleanup(); return true; + } if (fix_length_and_dec()) + { + cleanup(); return TRUE; + } fixed= 1; return FALSE; } From 14cc7e7d6eed0cb3552f8bb28dc8a7a3edf2d89e Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 20 Jul 2023 14:14:00 +0300 Subject: [PATCH 121/171] MDEV-25644 UPDATE not working properly on transaction precise system versioned table First UPDATE under START TRANSACTION does nothing (nstate= nstate), but anyway generates history. Since update vector is empty we get into (!uvect->n_fields) branch which only adds history row, but does not do update. After that we get current row with wrong (old) row_start value and because of that second UPDATE tries to insert history row again because it sees trx->id != row_start which is the guard to avoid inserting multiple trx_id-based history rows under same transaction (because we have same trx_id and we get duplicate error and this bug demostrates that). But this try anyway fails because PK is based on row_end which is constant under same transaction, so PK didn't change. The fix moves vers_make_update() to an earlier stage of calc_row_difference(). Therefore it prepares update vector before (!uvect->n_fields) check and never gets into that branch, hence no need to handle versioning inside that condition anymore. Now trx->id and row_start are equal after first UPDATE and we don't try to insert second history row. == Cleanups and improvements == ha_innobase::update_row(): vers_set_fields and vers_ins_row are cleaned up into direct condition check. SQLCOM_ALTER_TABLE check now is not used as this is dead code, assertion is done instead. upd_node->is_delete is set in calc_row_difference() just to keep versioning code as much in one place as possible. vers_make_delete() is still located in row_update_for_mysql() as this is required for ha_innodbase::delete_row() as well. row_ins_duplicate_error_in_clust(): Restrict DB_FOREIGN_DUPLICATE_KEY to the better conditions. VERSIONED_DELETE is used specifically to help lower stack to understand what caused current insert. Related to MDEV-29813. --- mysql-test/suite/versioning/r/delete.result | 34 +++++++--- .../suite/versioning/r/update,trx_id.rdiff | 14 ++++- mysql-test/suite/versioning/r/update.result | 33 +++++++++- mysql-test/suite/versioning/t/delete.test | 26 +++++--- mysql-test/suite/versioning/t/update.test | 27 +++++++- sql/sql_update.cc | 5 ++ storage/innobase/handler/ha_innodb.cc | 63 ++++++++++--------- storage/innobase/row/row0ins.cc | 5 +- storage/innobase/row/row0mysql.cc | 8 +-- storage/innobase/row/row0upd.cc | 5 +- 10 files changed, 160 insertions(+), 60 deletions(-) diff --git a/mysql-test/suite/versioning/r/delete.result b/mysql-test/suite/versioning/r/delete.result index 6f8c8921790..89c1ef516eb 100644 --- a/mysql-test/suite/versioning/r/delete.result +++ b/mysql-test/suite/versioning/r/delete.result @@ -133,18 +133,38 @@ drop table t1; # # MDEV-21138 Assertion `col->ord_part' or `f.col->ord_part' failed in row_build_index_entry_low # +# Check DELETE and multi-DELETE with foreign key create table t1 ( f1 int, f2 text, f3 int, fulltext (f2), key(f1), key(f3), -foreign key r (f3) references t1 (f1) on delete set null) +foreign key r (f3) references t1 (f1) on delete set null, +row_start SYS_TYPE as row start invisible, +row_end SYS_TYPE as row end invisible, +period for system_time (row_start, row_end)) with system versioning engine innodb; insert into t1 values (1, repeat('a', 8193), 1), (1, repeat('b', 8193), 1); -select f1, f3, check_row_ts(row_start, row_end) from t1; -f1 f3 check_row_ts(row_start, row_end) +insert into t1 select 2, f2, 2 from t1; +select f1, f3, check_row(row_start, row_end) from t1; +f1 f3 check_row(row_start, row_end) 1 1 CURRENT ROW 1 1 CURRENT ROW -delete from t1; -select f1, f3, check_row_ts(row_start, row_end) from t1 for system_time all; -f1 f3 check_row_ts(row_start, row_end) +2 2 CURRENT ROW +2 2 CURRENT ROW +delete from t1 where f1 = 1; +select f1, f3, check_row(row_start, row_end) from t1 for system_time all order by f1, row_end; +f1 f3 check_row(row_start, row_end) 1 1 HISTORICAL ROW 1 1 HISTORICAL ROW -drop table t1; +2 2 CURRENT ROW +2 2 CURRENT ROW +create table t2 (f1 int); +insert into t2 values (2); +# Multi-delelte +delete t1, t2 from t1 join t2 where t1.f1 = t2.f1; +select f1, f3, check_row(row_start, row_end) from t1 for system_time all order by f1, row_end; +f1 f3 check_row(row_start, row_end) +1 1 HISTORICAL ROW +1 1 HISTORICAL ROW +2 2 HISTORICAL ROW +2 2 HISTORICAL ROW +# Cleanup +drop tables t1, t2; diff --git a/mysql-test/suite/versioning/r/update,trx_id.rdiff b/mysql-test/suite/versioning/r/update,trx_id.rdiff index 7ce75714235..18395507b71 100644 --- a/mysql-test/suite/versioning/r/update,trx_id.rdiff +++ b/mysql-test/suite/versioning/r/update,trx_id.rdiff @@ -1,6 +1,6 @@ ---- update.result 2018-12-19 13:55:35.873917389 +0300 -+++ update,trx_id.reject 2018-12-19 13:55:35.533917399 +0300 -@@ -81,12 +81,10 @@ +--- update.result ++++ update.reject +@@ -84,12 +84,10 @@ commit; select x, y, sys_trx_end = MAXVAL as current from t1 for system_time all order by sys_trx_end, x, y; x y current @@ -14,3 +14,11 @@ 1 1 1 2 2 1 3 3 1 +@@ -464,7 +462,6 @@ + select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; + nid nstate check_row(row_start, row_end) + 1 1 HISTORICAL ROW +-1 1 HISTORICAL ROW + 1 3 CURRENT ROW + commit; + drop tables t1; diff --git a/mysql-test/suite/versioning/r/update.result b/mysql-test/suite/versioning/r/update.result index f0a5052acf9..df463de0f91 100644 --- a/mysql-test/suite/versioning/r/update.result +++ b/mysql-test/suite/versioning/r/update.result @@ -51,19 +51,22 @@ sys_trx_start SYS_DATATYPE as row start invisible, sys_trx_end SYS_DATATYPE as row end invisible, period for system_time (sys_trx_start, sys_trx_end)) with system versioning; +set timestamp= unix_timestamp('2000-01-01 00:00:00'); insert into t1 values(1, 1, 1); -set @ins_t= now(6); select sys_trx_start into @tmp1 from t1; +set timestamp= unix_timestamp('2000-01-01 01:00:00'); update t1 set x= 11, y= 11 where id = 1; select @tmp1 < sys_trx_start as A1, x, y from t1; A1 x y 1 11 11 select sys_trx_start into @tmp1 from t1; +set timestamp= unix_timestamp('2000-01-01 02:00:00'); update t1 set y= 1 where id = 1; select @tmp1 = sys_trx_start as A2, x from t1; A2 x 1 11 drop table t1; +set timestamp= default; create table t1 ( x int, y int, @@ -451,4 +454,32 @@ select x, y, check_row_ts(row_start, row_end) from t1 for system_time all order x y check_row_ts(row_start, row_end) 1 3 CURRENT ROW drop table t1; +# +# MDEV-25644 UPDATE not working properly on transaction precise system versioned table +# +create or replace table t1 (nid int primary key, nstate int, ntype int) engine innodb; +alter table t1 add +row_start SYS_DATATYPE generated always as row start invisible, +add row_end SYS_DATATYPE generated always as row end invisible, +add period for system_time(row_start, row_end), +add system versioning; +insert into t1 values (1, 1, 1); +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +nid nstate check_row(row_start, row_end) +1 1 CURRENT ROW +start transaction; +update t1 set nstate= nstate where nid = 1; +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +nid nstate check_row(row_start, row_end) +1 1 HISTORICAL ROW +1 1 CURRENT ROW +# Bug: ERROR 1761 (23000): Foreign key constraint for table 'xxx', record '1-18446744073709551615' would lead to a duplicate entry in table 'xxx', key 'PRIMARY' +update t1 set nstate= 3 where nid= 1; +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +nid nstate check_row(row_start, row_end) +1 1 HISTORICAL ROW +1 1 HISTORICAL ROW +1 3 CURRENT ROW +commit; +drop tables t1; # End of 10.4 tests diff --git a/mysql-test/suite/versioning/t/delete.test b/mysql-test/suite/versioning/t/delete.test index a5a0497fef2..9debdcfec8c 100644 --- a/mysql-test/suite/versioning/t/delete.test +++ b/mysql-test/suite/versioning/t/delete.test @@ -97,16 +97,26 @@ drop table t1; --echo # --echo # MDEV-21138 Assertion `col->ord_part' or `f.col->ord_part' failed in row_build_index_entry_low --echo # -create table t1 ( +--echo # Check DELETE and multi-DELETE with foreign key +replace_result $sys_datatype_expl SYS_TYPE; +eval create table t1 ( f1 int, f2 text, f3 int, fulltext (f2), key(f1), key(f3), - foreign key r (f3) references t1 (f1) on delete set null) + foreign key r (f3) references t1 (f1) on delete set null, + row_start $sys_datatype_expl as row start invisible, + row_end $sys_datatype_expl as row end invisible, + period for system_time (row_start, row_end)) with system versioning engine innodb; insert into t1 values (1, repeat('a', 8193), 1), (1, repeat('b', 8193), 1); -select f1, f3, check_row_ts(row_start, row_end) from t1; -delete from t1; -select f1, f3, check_row_ts(row_start, row_end) from t1 for system_time all; - -# cleanup -drop table t1; +insert into t1 select 2, f2, 2 from t1; +select f1, f3, check_row(row_start, row_end) from t1; +delete from t1 where f1 = 1; +select f1, f3, check_row(row_start, row_end) from t1 for system_time all order by f1, row_end; +create table t2 (f1 int); +insert into t2 values (2); +--echo # Multi-delelte +delete t1, t2 from t1 join t2 where t1.f1 = t2.f1; +select f1, f3, check_row(row_start, row_end) from t1 for system_time all order by f1, row_end; +--echo # Cleanup +drop tables t1, t2; --source suite/versioning/common_finish.inc diff --git a/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test index b86296616fd..046a4ac149d 100644 --- a/mysql-test/suite/versioning/t/update.test +++ b/mysql-test/suite/versioning/t/update.test @@ -26,15 +26,18 @@ eval create table t1 ( sys_trx_end $sys_datatype_expl as row end invisible, period for system_time (sys_trx_start, sys_trx_end)) with system versioning; +set timestamp= unix_timestamp('2000-01-01 00:00:00'); insert into t1 values(1, 1, 1); -set @ins_t= now(6); select sys_trx_start into @tmp1 from t1; +set timestamp= unix_timestamp('2000-01-01 01:00:00'); update t1 set x= 11, y= 11 where id = 1; select @tmp1 < sys_trx_start as A1, x, y from t1; select sys_trx_start into @tmp1 from t1; +set timestamp= unix_timestamp('2000-01-01 02:00:00'); update t1 set y= 1 where id = 1; select @tmp1 = sys_trx_start as A2, x from t1; drop table t1; +set timestamp= default; replace_result $sys_datatype_expl SYS_DATATYPE; eval create table t1 ( @@ -389,6 +392,28 @@ select x, y, check_row_ts(row_start, row_end) from t1 for system_time all order drop table t1; +--echo # +--echo # MDEV-25644 UPDATE not working properly on transaction precise system versioned table +--echo # +create or replace table t1 (nid int primary key, nstate int, ntype int) engine innodb; +--replace_result $sys_datatype_expl SYS_DATATYPE +eval alter table t1 add + row_start $sys_datatype_expl generated always as row start invisible, + add row_end $sys_datatype_expl generated always as row end invisible, + add period for system_time(row_start, row_end), + add system versioning; +insert into t1 values (1, 1, 1); +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +start transaction; +update t1 set nstate= nstate where nid = 1; +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +--echo # Bug: ERROR 1761 (23000): Foreign key constraint for table 'xxx', record '1-18446744073709551615' would lead to a duplicate entry in table 'xxx', key 'PRIMARY' +update t1 set nstate= 3 where nid= 1; +# Under one transaction trx_id generates only one history row, that differs from timestamp +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +commit; +drop tables t1; + --echo # End of 10.4 tests source suite/versioning/common_finish.inc; diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 834fa6111e5..233ad49576e 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -232,6 +232,11 @@ bool TABLE::vers_check_update(List &items) } } } + /* + Tell TRX_ID-versioning that it does not insert history row + (see calc_row_difference()). + */ + vers_write= false; return false; } diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 3a787da3fa8..3a8d562f705 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -8410,6 +8410,10 @@ calc_row_difference( trx_t* const trx = prebuilt->trx; doc_id_t doc_id = FTS_NULL_DOC_ID; ulint num_v = 0; +#ifndef DBUG_OFF + uint vers_fields = 0; +#endif + prebuilt->versioned_write = table->versioned_write(VERS_TRX_ID); const bool skip_virtual = ha_innobase::omits_virtual_cols(*table->s); ut_ad(!srv_read_only_mode); @@ -8422,6 +8426,14 @@ calc_row_difference( for (uint i = 0; i < table->s->fields; i++) { field = table->field[i]; + +#ifndef DBUG_OFF + if (!field->vers_sys_field() + && !field->vers_update_unversioned()) { + ++vers_fields; + } +#endif + const bool is_virtual = !field->stored_in_db(); if (is_virtual && skip_virtual) { num_v++; @@ -8759,6 +8771,21 @@ calc_row_difference( ut_a(buf <= (byte*) original_upd_buff + buff_len); + const TABLE_LIST *tl= table->pos_in_table_list; + const uint8 op_map= tl->trg_event_map | tl->slave_fk_event_map; + /* Used to avoid reading history in FK check on DELETE (see MDEV-16210). */ + prebuilt->upd_node->is_delete = + (op_map & trg2bit(TRG_EVENT_DELETE) + && table->versioned(VERS_TIMESTAMP)) + ? VERSIONED_DELETE : NO_DELETE; + + if (prebuilt->versioned_write) { + /* Guaranteed by CREATE TABLE, but anyway we make sure we + generate history only when there are versioned fields. */ + DBUG_ASSERT(vers_fields); + prebuilt->upd_node->vers_make_update(trx); + } + ut_ad(uvect->validate()); return(DB_SUCCESS); } @@ -8913,48 +8940,24 @@ ha_innobase::update_row( MySQL that the row is not really updated and it should not increase the count of updated rows. This is fix for http://bugs.mysql.com/29157 */ - if (m_prebuilt->versioned_write - && thd_sql_command(m_user_thd) != SQLCOM_ALTER_TABLE - /* Multiple UPDATE of same rows in single transaction create - historical rows only once. */ - && trx->id != table->vers_start_id()) { - error = row_insert_for_mysql((byte*) old_row, - m_prebuilt, - ROW_INS_HISTORICAL); - if (error != DB_SUCCESS) { - goto func_exit; - } - innobase_srv_conc_exit_innodb(m_prebuilt); - innobase_active_small(); - } DBUG_RETURN(HA_ERR_RECORD_IS_THE_SAME); } else { - const bool vers_set_fields = m_prebuilt->versioned_write - && m_prebuilt->upd_node->update->affects_versioned(); - const bool vers_ins_row = vers_set_fields - && thd_sql_command(m_user_thd) != SQLCOM_ALTER_TABLE; - - TABLE_LIST *tl= table->pos_in_table_list; - uint8 op_map= tl->trg_event_map | tl->slave_fk_event_map; - /* This is not a delete */ - m_prebuilt->upd_node->is_delete = - (vers_set_fields && !vers_ins_row) || - (op_map & trg2bit(TRG_EVENT_DELETE) && - table->versioned(VERS_TIMESTAMP)) - ? VERSIONED_DELETE - : NO_DELETE; - innobase_srv_conc_enter_innodb(m_prebuilt); if (m_prebuilt->upd_node->is_delete) { trx->fts_next_doc_id = 0; } + /* row_start was updated by vers_make_update() + in calc_row_difference() */ error = row_update_for_mysql(m_prebuilt); - if (error == DB_SUCCESS && vers_ins_row + if (error == DB_SUCCESS && m_prebuilt->versioned_write /* Multiple UPDATE of same rows in single transaction create historical rows only once. */ && trx->id != table->vers_start_id()) { + /* UPDATE is not used by ALTER TABLE. Just precaution + as we don't need history generation for ALTER TABLE. */ + ut_ad(thd_sql_command(m_user_thd) != SQLCOM_ALTER_TABLE); error = row_insert_for_mysql((byte*) old_row, m_prebuilt, ROW_INS_HISTORICAL); diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 81f662e7a15..6765ba546d5 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -2439,7 +2439,10 @@ row_ins_duplicate_error_in_clust( duplicate: trx->error_info = cursor->index; err = DB_DUPLICATE_KEY; - if (cursor->index->table->versioned() + if (thr->prebuilt + && thr->prebuilt->upd_node + && thr->prebuilt->upd_node->is_delete + == VERSIONED_DELETE && entry->vers_history_row()) { ulint trx_id_len; diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index bb994a926eb..dc3d0ca2ade 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1790,12 +1790,8 @@ row_update_for_mysql(row_prebuilt_t* prebuilt) ut_ad(!prebuilt->versioned_write || node->table->versioned()); - if (prebuilt->versioned_write) { - if (node->is_delete == VERSIONED_DELETE) { - node->vers_make_delete(trx); - } else if (node->update->affects_versioned()) { - node->vers_make_update(trx); - } + if (prebuilt->versioned_write && node->is_delete == VERSIONED_DELETE) { + node->vers_make_delete(trx); } for (;;) { diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 0ea7aea7fb1..0700792e441 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -3505,9 +3505,8 @@ error_handling: void thd_get_query_start_data(THD *thd, char *buf); /** Appends row_start or row_end field to update vector and sets a -CURRENT_TIMESTAMP/trx->id value to it. -Supposed to be called only by make_versioned_update() and -make_versioned_delete(). +CURRENT_TIMESTAMP/trx->id value to it. Called by vers_make_update() and +vers_make_delete(). @param[in] trx transaction @param[in] vers_sys_idx table->row_start or table->row_end */ void upd_node_t::vers_update_fields(const trx_t *trx, ulint idx) From 3e7561cf35a1241083e88ed530a22aab6712335e Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 20 Jul 2023 14:14:00 +0300 Subject: [PATCH 122/171] MDEV-29357 Assertion (fixed) in Item_func_dayname on INSERT Restrict vcol_cleanup_expr() in close_thread_tables() to only simple locked tables mode. Prelocked is cleaned up like normal statement: in close_thread_table(). --- mysql-test/suite/vcol/r/vcol_syntax.result | 18 ++++++++++++++++++ mysql-test/suite/vcol/t/vcol_syntax.test | 12 ++++++++++++ sql/sql_base.cc | 7 ++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/vcol/r/vcol_syntax.result b/mysql-test/suite/vcol/r/vcol_syntax.result index dd38a1992e5..f1a850e8f7c 100644 --- a/mysql-test/suite/vcol/r/vcol_syntax.result +++ b/mysql-test/suite/vcol/r/vcol_syntax.result @@ -216,3 +216,21 @@ Warnings: Warning 1292 Truncated incorrect DOUBLE value: 'foo' Warning 1292 Truncated incorrect DOUBLE value: 'bar' drop table t, tmp; +# +# MDEV-29357 Assertion (fixed) in Item_func_dayname on INSERT +# +set sql_mode=''; +create table t (c1 blob ,c2 int,c3 char(10) as (dayname (c2))); +create trigger tr before insert on t for each row set new.c2=0; +insert into t values (0, 0, 0); +Warnings: +Warning 1906 The value specified for generated column 'c3' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '0' for column `test`.`t`.`c2` at row 1 +Warning 1292 Incorrect datetime value: '0' for column `test`.`t`.`c2` at row 1 +insert into t values (1, 1, 1); +Warnings: +Warning 1906 The value specified for generated column 'c3' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '1' for column `test`.`t`.`c2` at row 1 +Warning 1292 Incorrect datetime value: '0' for column `test`.`t`.`c2` at row 1 +drop trigger tr; +drop table t; diff --git a/mysql-test/suite/vcol/t/vcol_syntax.test b/mysql-test/suite/vcol/t/vcol_syntax.test index 3a0ed0270e2..cb741bc6def 100644 --- a/mysql-test/suite/vcol/t/vcol_syntax.test +++ b/mysql-test/suite/vcol/t/vcol_syntax.test @@ -173,3 +173,15 @@ select * from t; # cleanup drop table t, tmp; + +--echo # +--echo # MDEV-29357 Assertion (fixed) in Item_func_dayname on INSERT +--echo # +set sql_mode=''; +create table t (c1 blob ,c2 int,c3 char(10) as (dayname (c2))); +create trigger tr before insert on t for each row set new.c2=0; +insert into t values (0, 0, 0); +insert into t values (1, 1, 1); + +drop trigger tr; +drop table t; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 37336a83bfb..47b9c4c6db9 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -913,7 +913,12 @@ void close_thread_tables(THD *thd) !thd->stmt_arena->is_stmt_prepare()) table->part_info->vers_check_limit(thd); #endif - table->vcol_cleanup_expr(thd); + /* + For simple locking we cleanup it here because we don't close thread + tables. For prelocking we close it when we do close thread tables. + */ + if (thd->locked_tables_mode != LTM_PRELOCKED) + table->vcol_cleanup_expr(thd); } /* Detach MERGE children after every statement. Even under LOCK TABLES. */ From 5da492c3546edbb538b7eee740262eedfff4cbbf Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Fri, 21 Jul 2023 12:09:15 +0200 Subject: [PATCH 123/171] switch off it for masan also --- mysql-test/main/join_cache_notasan.test | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/main/join_cache_notasan.test b/mysql-test/main/join_cache_notasan.test index cfdfe4eff18..b5eddb84c13 100644 --- a/mysql-test/main/join_cache_notasan.test +++ b/mysql-test/main/join_cache_notasan.test @@ -3,6 +3,7 @@ --source include/have_64bit.inc --source include/not_asan.inc +--source include/not_msan.inc --source include/have_innodb.inc --echo # From 73c9415e6a53d717a5f83ca99f624e0bf1aadb9b Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 18 Jul 2023 12:58:58 +1000 Subject: [PATCH 124/171] MDEV-31727: pcre stack size not functioning on clang-16 noinline attribute was being ignored by clang-16 and reporting 32 stack size on Gentoo, 16 locally on Fedora 38. Based on https://stackoverflow.com/questions/54481855/clang-ignoring-attribute-noinline appended noopt in addition to the gcc recognised attributes. After that the -pcre_exec(NULL, NULL, NULL, -999, -999, 0, NULL, 0) returned 1056, simlar to gcc. From https://bugs.gentoo.org/910188. Thanks Zhixu Liu for the great bug report. --- pcre/pcre_exec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcre/pcre_exec.c b/pcre/pcre_exec.c index c30d90acfc7..6df88071c66 100644 --- a/pcre/pcre_exec.c +++ b/pcre/pcre_exec.c @@ -513,7 +513,7 @@ Returns: MATCH_MATCH if matched ) these values are >= 0 static int match(REGISTER PCRE_PUCHAR eptr, REGISTER const pcre_uchar *ecode, PCRE_PUCHAR mstart, int offset_top, match_data *md, eptrblock *eptrb, - unsigned int rdepth) __attribute__((noinline,noclone)); + unsigned int rdepth) __attribute__((optnone,noinline,noclone)); #endif static int match(REGISTER PCRE_PUCHAR eptr, REGISTER const pcre_uchar *ecode, From 8b01c2962b773630b63011f225c253cfe9fcab01 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Sun, 23 Jul 2023 18:58:26 +0200 Subject: [PATCH 125/171] Remove CLIENT_SSL_VERIFY_SERVER_CERT Since TLS server certificate verification is a client only option, this flag is removed in both client (C/C) and MariaDB server capability flags. This patch reverts commit 89d759b93e3975e5d5e1c5cf9b901c01b9e80ff7 (MySQL Bug #21543) and stores the server certificate validation option in mysql->options.extensions. --- include/mysql_com.h | 8 +++----- include/sql_common.h | 1 + sql-common/client.c | 14 ++++++++------ sql/sql_acl.cc | 1 - 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/mysql_com.h b/include/mysql_com.h index f63cf0ac5c2..2e51f67b662 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -275,7 +275,7 @@ enum enum_indicator_type #define CLIENT_DEPRECATE_EOF (1ULL << 24) #define CLIENT_PROGRESS_OBSOLETE (1ULL << 29) -#define CLIENT_SSL_VERIFY_SERVER_CERT (1ULL << 30) +#define CLIENT_SSL_VERIFY_SERVER_CERT_OBSOLETE (1ULL << 30) /* It used to be that if mysql_real_connect() failed, it would delete any options set by the client, unless the CLIENT_REMEMBER_OPTIONS flag was @@ -326,7 +326,6 @@ enum enum_indicator_type CLIENT_MULTI_STATEMENTS | \ CLIENT_MULTI_RESULTS | \ CLIENT_PS_MULTI_RESULTS | \ - CLIENT_SSL_VERIFY_SERVER_CERT | \ CLIENT_REMEMBER_OPTIONS | \ MARIADB_CLIENT_PROGRESS | \ CLIENT_PLUGIN_AUTH | \ @@ -343,9 +342,8 @@ enum enum_indicator_type If any of the optional flags is supported by the build it will be switched on before sending to the client during the connection handshake. */ -#define CLIENT_BASIC_FLAGS (((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ - & ~CLIENT_COMPRESS) \ - & ~CLIENT_SSL_VERIFY_SERVER_CERT) +#define CLIENT_BASIC_FLAGS ((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ + & ~CLIENT_COMPRESS) /** Is raised when a multi-statement transaction diff --git a/include/sql_common.h b/include/sql_common.h index 9836d0c1cdc..a61572e380c 100644 --- a/include/sql_common.h +++ b/include/sql_common.h @@ -44,6 +44,7 @@ struct st_mysql_options_extention { struct mysql_async_context *async_context; HASH connection_attributes; size_t connection_attributes_length; + my_bool tls_verify_server_cert; }; typedef struct st_mysql_methods diff --git a/sql-common/client.c b/sql-common/client.c index a1bdbebf639..6f4ea70a733 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -2093,7 +2093,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, If the server does not support ssl, we abort the connection. */ if (mysql->options.use_ssl && - (mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) && + (mysql->options.extension && mysql->options.extension->tls_verify_server_cert) && !(mysql->server_capabilities & CLIENT_SSL)) { set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, @@ -2163,7 +2163,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, DBUG_PRINT("info", ("IO layer change done!")); /* Verify server cert */ - if ((mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) && + if ((mysql->options.extension && mysql->options.extension->tls_verify_server_cert) && ssl_verify_server_cert(net->vio, mysql->host, &cert_error)) { set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, @@ -3847,10 +3847,12 @@ mysql_options(MYSQL *mysql,enum mysql_option option, const void *arg) mysql->options.use_thread_specific_memory= *(my_bool *) arg; break; case MYSQL_OPT_SSL_VERIFY_SERVER_CERT: - if (*(my_bool*) arg) - mysql->options.client_flag|= CLIENT_SSL_VERIFY_SERVER_CERT; - else - mysql->options.client_flag&= ~CLIENT_SSL_VERIFY_SERVER_CERT; + if (!mysql->options.extension) + mysql->options.extension= (struct st_mysql_options_extention *) + my_malloc(sizeof(struct st_mysql_options_extention), + MYF(MY_WME | MY_ZEROFILL)); + if (mysql->options.extension) + mysql->options.extension->tls_verify_server_cert= *(my_bool*) arg; break; case MYSQL_PLUGIN_DIR: EXTENSION_SET_STRING(&mysql->options, plugin_dir, arg); diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index c764d2fe2f7..4c2d063b771 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -12759,7 +12759,6 @@ static bool send_server_handshake_packet(MPVIO_EXT *mpvio, if (ssl_acceptor_fd) { thd->client_capabilities |= CLIENT_SSL; - thd->client_capabilities |= CLIENT_SSL_VERIFY_SERVER_CERT; } if (data_len) From 1c9002cfc85aa175065e3089af771136847335b5 Mon Sep 17 00:00:00 2001 From: Georg Richter Date: Sun, 23 Jul 2023 18:58:26 +0200 Subject: [PATCH 126/171] Remove CLIENT_SSL_VERIFY_SERVER_CERT Since TLS server certificate verification is a client only option, this flag is removed in both client (C/C) and MariaDB server capability flags. This patch reverts commit 89d759b93e3975e5d5e1c5cf9b901c01b9e80ff7 (MySQL Bug #21543) and stores the server certificate validation option in mysql->options.extensions. --- include/mysql_com.h | 8 +++----- include/sql_common.h | 1 + sql-common/client.c | 14 ++++++++------ sql/sql_acl.cc | 1 - 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/mysql_com.h b/include/mysql_com.h index f63cf0ac5c2..2e51f67b662 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -275,7 +275,7 @@ enum enum_indicator_type #define CLIENT_DEPRECATE_EOF (1ULL << 24) #define CLIENT_PROGRESS_OBSOLETE (1ULL << 29) -#define CLIENT_SSL_VERIFY_SERVER_CERT (1ULL << 30) +#define CLIENT_SSL_VERIFY_SERVER_CERT_OBSOLETE (1ULL << 30) /* It used to be that if mysql_real_connect() failed, it would delete any options set by the client, unless the CLIENT_REMEMBER_OPTIONS flag was @@ -326,7 +326,6 @@ enum enum_indicator_type CLIENT_MULTI_STATEMENTS | \ CLIENT_MULTI_RESULTS | \ CLIENT_PS_MULTI_RESULTS | \ - CLIENT_SSL_VERIFY_SERVER_CERT | \ CLIENT_REMEMBER_OPTIONS | \ MARIADB_CLIENT_PROGRESS | \ CLIENT_PLUGIN_AUTH | \ @@ -343,9 +342,8 @@ enum enum_indicator_type If any of the optional flags is supported by the build it will be switched on before sending to the client during the connection handshake. */ -#define CLIENT_BASIC_FLAGS (((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ - & ~CLIENT_COMPRESS) \ - & ~CLIENT_SSL_VERIFY_SERVER_CERT) +#define CLIENT_BASIC_FLAGS ((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ + & ~CLIENT_COMPRESS) /** Is raised when a multi-statement transaction diff --git a/include/sql_common.h b/include/sql_common.h index 9836d0c1cdc..a61572e380c 100644 --- a/include/sql_common.h +++ b/include/sql_common.h @@ -44,6 +44,7 @@ struct st_mysql_options_extention { struct mysql_async_context *async_context; HASH connection_attributes; size_t connection_attributes_length; + my_bool tls_verify_server_cert; }; typedef struct st_mysql_methods diff --git a/sql-common/client.c b/sql-common/client.c index a1bdbebf639..6f4ea70a733 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -2093,7 +2093,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, If the server does not support ssl, we abort the connection. */ if (mysql->options.use_ssl && - (mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) && + (mysql->options.extension && mysql->options.extension->tls_verify_server_cert) && !(mysql->server_capabilities & CLIENT_SSL)) { set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, @@ -2163,7 +2163,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, DBUG_PRINT("info", ("IO layer change done!")); /* Verify server cert */ - if ((mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) && + if ((mysql->options.extension && mysql->options.extension->tls_verify_server_cert) && ssl_verify_server_cert(net->vio, mysql->host, &cert_error)) { set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, @@ -3847,10 +3847,12 @@ mysql_options(MYSQL *mysql,enum mysql_option option, const void *arg) mysql->options.use_thread_specific_memory= *(my_bool *) arg; break; case MYSQL_OPT_SSL_VERIFY_SERVER_CERT: - if (*(my_bool*) arg) - mysql->options.client_flag|= CLIENT_SSL_VERIFY_SERVER_CERT; - else - mysql->options.client_flag&= ~CLIENT_SSL_VERIFY_SERVER_CERT; + if (!mysql->options.extension) + mysql->options.extension= (struct st_mysql_options_extention *) + my_malloc(sizeof(struct st_mysql_options_extention), + MYF(MY_WME | MY_ZEROFILL)); + if (mysql->options.extension) + mysql->options.extension->tls_verify_server_cert= *(my_bool*) arg; break; case MYSQL_PLUGIN_DIR: EXTENSION_SET_STRING(&mysql->options, plugin_dir, arg); diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index c764d2fe2f7..4c2d063b771 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -12759,7 +12759,6 @@ static bool send_server_handshake_packet(MPVIO_EXT *mpvio, if (ssl_acceptor_fd) { thd->client_capabilities |= CLIENT_SSL; - thd->client_capabilities |= CLIENT_SSL_VERIFY_SERVER_CERT; } if (data_len) From 668eb2ce45c5e9ab062daefcc2119839e197ef72 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Mon, 24 Jul 2023 10:38:41 +0200 Subject: [PATCH 127/171] New CC 3.1 --- libmariadb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmariadb b/libmariadb index d543bed61ba..3393fe35d37 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit d543bed61ba9a117e95764dd1429b21c3e0579d1 +Subproject commit 3393fe35d378744e12636766931cf5109cc6c2e5 From 734583b0d7266f373813e8fcbfc909abf7a84bbd Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Tue, 25 Jul 2023 13:10:52 +1000 Subject: [PATCH 128/171] MDEV-31400 Simple plugin dependency resolution We introduce simple plugin dependency. A plugin init function may return HA_ERR_RETRY_INIT. If this happens during server startup when the server is trying to initialise all plugins, the failed plugins will be retried, until no more plugins succeed in initialisation or want to be retried. This will fix spider init bugs which is caused in part by its dependency on Aria for initialisation. The reason we need a new return code, instead of treating every failure as a request for retry, is that it may be impossible to clean up after a failed plugin initialisation. Take InnoDB for example, it has a global variable `buf_page_cleaner_is_active`, which may not satisfy an assertion during a second initialisation try, probably because InnoDB does not expect the initialisation to be called twice. --- include/my_base.h | 1 + sql/handler.cc | 22 +++++--- sql/sql_plugin.cc | 140 ++++++++++++++++++++++++++++++---------------- 3 files changed, 108 insertions(+), 55 deletions(-) diff --git a/include/my_base.h b/include/my_base.h index cc3d57cb0b1..32e3aa06d27 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -442,6 +442,7 @@ enum ha_base_keytype { #define HA_ERR_CRASHED 126 /* Indexfile is crashed */ #define HA_ERR_WRONG_IN_RECORD 127 /* Record-file is crashed */ #define HA_ERR_OUT_OF_MEM 128 /* Out of memory */ +#define HA_ERR_RETRY_INIT 129 /* Initialization failed and should be retried */ #define HA_ERR_NOT_A_TABLE 130 /* not a MYI file - no signature */ #define HA_ERR_WRONG_COMMAND 131 /* Command not supported */ #define HA_ERR_OLD_FILE 132 /* old databasfile */ diff --git a/sql/handler.cc b/sql/handler.cc index 48ce7b3f1f8..2b081df8326 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -550,6 +550,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) { handlerton *hton; static const char *no_exts[]= { 0 }; + int ret= 0; DBUG_ENTER("ha_initialize_handlerton"); DBUG_PRINT("plugin", ("initialize plugin: '%s'", plugin->name.str)); @@ -559,6 +560,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) { sql_print_error("Unable to allocate memory for plugin '%s' handlerton.", plugin->name.str); + ret= 1; goto err_no_hton_memory; } @@ -568,12 +570,16 @@ int ha_initialize_handlerton(st_plugin_int *plugin) hton->slot= HA_SLOT_UNDEF; /* Historical Requirement */ plugin->data= hton; // shortcut for the future - if (plugin->plugin->init && plugin->plugin->init(hton)) - { - sql_print_error("Plugin '%s' init function returned error.", - plugin->name.str); + /* [remove after merge] notes on merge conflict (MDEV-31400): + 10.5: 81cd93bbb81d75e7cf14dedede0c9ec0712ace68 + 10.6-10.11: 13ba00ff4933cfc1712676f323587504e453d1b5 + 11.0-11.2: 42f8be10f18163c4025710cf6a212e82bddb2f62 + The 10.11->11.0 conflict is trivial, but the reference commit also + contains different non-conflict changes needs to be applied to 11.0 + (and beyond). + */ + if (plugin->plugin->init && (ret= plugin->plugin->init(hton))) goto err; - } // hton_ext_based_table_discovery() works only when discovery // is supported and the engine if file-based. @@ -616,6 +622,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) if (idx == (int) DB_TYPE_DEFAULT) { sql_print_warning("Too many storage engines!"); + ret= 1; goto err_deinit; } if (hton->db_type != DB_TYPE_UNKNOWN) @@ -643,6 +650,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) { sql_print_error("Too many plugins loaded. Limit is %lu. " "Failed on '%s'", (ulong) MAX_HA, plugin->name.str); + ret= 1; goto err_deinit; } hton->slot= total_ha++; @@ -699,7 +707,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) resolve_sysvar_table_options(hton); update_discovery_counters(hton, 1); - DBUG_RETURN(0); + DBUG_RETURN(ret); err_deinit: /* @@ -717,7 +725,7 @@ err: my_free(hton); err_no_hton_memory: plugin->data= NULL; - DBUG_RETURN(1); + DBUG_RETURN(ret); } int ha_init() diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 1a4d6cba7d3..25ce43fd315 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -1411,6 +1411,50 @@ void plugin_unlock_list(THD *thd, plugin_ref *list, uint count) DBUG_VOID_RETURN; } +static void print_init_failed_error(st_plugin_int *p) +{ + sql_print_error("Plugin '%s' registration as a %s failed.", + p->name.str, + plugin_type_names[p->plugin->type].str); +} + +static int plugin_do_initialize(struct st_plugin_int *plugin, uint &state) +{ + DBUG_ENTER("plugin_do_initialize"); + mysql_mutex_assert_not_owner(&LOCK_plugin); + plugin_type_init init= plugin_type_initialize[plugin->plugin->type]; + if (!init) + init= (plugin_type_init) plugin->plugin->init; + if (init) + if (int ret= init(plugin)) + { + /* Plugin init failed and did not requested a retry */ + if (ret != HA_ERR_RETRY_INIT) + print_init_failed_error(plugin); + DBUG_RETURN(ret); + } + state= PLUGIN_IS_READY; // plugin->init() succeeded + + if (plugin->plugin->status_vars) + { + /* + historical ndb behavior caused MySQL plugins to specify + status var names in full, with the plugin name prefix. + this was never fixed in MySQL. + MariaDB fixes that but supports MySQL style too. + */ + SHOW_VAR *show_vars= plugin->plugin->status_vars; + SHOW_VAR tmp_array[2]= {{plugin->plugin->name, + (char *) plugin->plugin->status_vars, SHOW_ARRAY}, + {0, 0, SHOW_UNDEF}}; + if (strncasecmp(show_vars->name, plugin->name.str, plugin->name.length)) + show_vars= tmp_array; + + if (add_status_vars(show_vars)) + DBUG_RETURN(1); + } + DBUG_RETURN(0); +} static int plugin_initialize(MEM_ROOT *tmp_root, struct st_plugin_int *plugin, int *argc, char **argv, bool options_only) @@ -1433,52 +1477,10 @@ static int plugin_initialize(MEM_ROOT *tmp_root, struct st_plugin_int *plugin, { ret= !options_only && plugin_is_forced(plugin); state= PLUGIN_IS_DISABLED; - goto err; } + else + ret= plugin_do_initialize(plugin, state); - if (plugin_type_initialize[plugin->plugin->type]) - { - if ((*plugin_type_initialize[plugin->plugin->type])(plugin)) - { - sql_print_error("Plugin '%s' registration as a %s failed.", - plugin->name.str, plugin_type_names[plugin->plugin->type].str); - goto err; - } - } - else if (plugin->plugin->init) - { - if (plugin->plugin->init(plugin)) - { - sql_print_error("Plugin '%s' init function returned error.", - plugin->name.str); - goto err; - } - } - state= PLUGIN_IS_READY; // plugin->init() succeeded - - if (plugin->plugin->status_vars) - { - /* - historical ndb behavior caused MySQL plugins to specify - status var names in full, with the plugin name prefix. - this was never fixed in MySQL. - MariaDB fixes that but supports MySQL style too. - */ - SHOW_VAR *show_vars= plugin->plugin->status_vars; - SHOW_VAR tmp_array[2]= { - {plugin->plugin->name, (char*)plugin->plugin->status_vars, SHOW_ARRAY}, - {0, 0, SHOW_UNDEF} - }; - if (strncasecmp(show_vars->name, plugin->name.str, plugin->name.length)) - show_vars= tmp_array; - - if (add_status_vars(show_vars)) - goto err; - } - - ret= 0; - -err: if (ret) plugin_variables_deinit(plugin); @@ -1557,7 +1559,7 @@ int plugin_init(int *argc, char **argv, int flags) uint i; struct st_maria_plugin **builtins; struct st_maria_plugin *plugin; - struct st_plugin_int tmp, *plugin_ptr, **reap; + struct st_plugin_int tmp, *plugin_ptr, **reap, **retry_end, **retry_start; MEM_ROOT tmp_root; bool reaped_mandatory_plugin= false; bool mandatory= true; @@ -1707,11 +1709,16 @@ int plugin_init(int *argc, char **argv, int flags) */ mysql_mutex_lock(&LOCK_plugin); + /* List of plugins to reap */ reap= (st_plugin_int **) my_alloca((plugin_array.elements+1) * sizeof(void*)); *(reap++)= NULL; + /* List of plugins to retry */ + retry_start= retry_end= + (st_plugin_int **) my_alloca((plugin_array.elements+1) * sizeof(void*)); for(;;) { + int error; for (i=0; i < MYSQL_MAX_PLUGIN_TYPE_NUM; i++) { HASH *hash= plugin_hash + plugin_type_initialization_order[i]; @@ -1720,15 +1727,51 @@ int plugin_init(int *argc, char **argv, int flags) plugin_ptr= (struct st_plugin_int *) my_hash_element(hash, idx); if (plugin_ptr->state == PLUGIN_IS_UNINITIALIZED) { - if (plugin_initialize(&tmp_root, plugin_ptr, argc, argv, - (flags & PLUGIN_INIT_SKIP_INITIALIZATION))) + error= plugin_initialize(&tmp_root, plugin_ptr, argc, argv, + (flags & PLUGIN_INIT_SKIP_INITIALIZATION)); + if (error) { plugin_ptr->state= PLUGIN_IS_DYING; - *(reap++)= plugin_ptr; + /* The plugin wants a retry of the initialisation, + possibly due to dependency on other plugins */ + if (unlikely(error == HA_ERR_RETRY_INIT)) + *(retry_end++)= plugin_ptr; + else + *(reap++)= plugin_ptr; } } } } + /* Retry plugins that asked for it */ + while (retry_start < retry_end) + { + st_plugin_int **to_re_retry, **retrying; + for (to_re_retry= retrying= retry_start; retrying < retry_end; retrying++) + { + plugin_ptr= *retrying; + uint state= plugin_ptr->state; + mysql_mutex_unlock(&LOCK_plugin); + error= plugin_do_initialize(plugin_ptr, state); + mysql_mutex_lock(&LOCK_plugin); + plugin_ptr->state= state; + if (error == HA_ERR_RETRY_INIT) + *(to_re_retry++)= plugin_ptr; + else if (error) + *(reap++)= plugin_ptr; + } + /* If the retry list has not changed, i.e. if all retry attempts + result in another retry request, empty the retry list */ + if (to_re_retry == retry_end) + while (to_re_retry > retry_start) + { + plugin_ptr= *(--to_re_retry); + *(reap++)= plugin_ptr; + /** `plugin_do_initialize()' did not print any error in this + case, so we do it here. */ + print_init_failed_error(plugin_ptr); + } + retry_end= to_re_retry; + } /* load and init plugins from the plugin table (unless done already) */ if (flags & PLUGIN_INIT_SKIP_PLUGIN_TABLE) @@ -1754,6 +1797,7 @@ int plugin_init(int *argc, char **argv, int flags) } mysql_mutex_unlock(&LOCK_plugin); + my_afree(retry_start); my_afree(reap); if (reaped_mandatory_plugin) goto err; From 063f4ac25e7d1d689b2d6447fbaab2aaf3ba0750 Mon Sep 17 00:00:00 2001 From: Brandon Nesterenko Date: Wed, 28 Jun 2023 10:28:31 -0600 Subject: [PATCH 129/171] MDEV-30619: Parallel Slave SQL Thread Can Update Seconds_Behind_Master with Active Workers MDEV-31749 sporadic assert in MDEV-30619 new test If the workers of a parallel replica are busy (potentially with long queues), but the SQL thread has no events left to distribute (so it goes idle), then the next event that comes from the primary will update mi->last_master_timestamp with its timestamp, even if the workers have not yet finished. This patch changes the parallel replica logic which updates last_master_timestamp after idling from using solely sql_thread_caught_up (added in MDEV-29639) to using the latter with rli queued/dequeued event counters. That is, if the queued count is equal to the dequeued count, it means all events have been processed and the replica is considered idle when the driver thread has also distributed all events. Low level details of the commit include - to make a more generalized test for Seconds_Behind_Master on the parallel replica, rpl_delayed_parallel_slave_sbm.test is renamed to rpl_parallel_sbm.test for this purpose. - pause_sql_thread_on_next_event usage was removed with the MDEV-30619 fixes. Rather than remove it, we adapt it to the needs of this test case - added test case to cover SBM spike of relay log read and LMT update that was fixed by MDEV-29639 - rpl_seconds_behind_master_spike.test is made to use the negate_clock_diff_with_master debug eval. Reviewed By: ============ Andrei Elkin --- ...ave_sbm.result => rpl_parallel_sbm.result} | 63 +++++--- .../r/rpl_seconds_behind_master_spike.result | 29 +++- .../rpl_delayed_parallel_slave_sbm-slave.opt | 1 - .../suite/rpl/t/rpl_parallel_sbm-slave.opt | 1 + ...l_slave_sbm.test => rpl_parallel_sbm.test} | 135 ++++++++++++------ .../t/rpl_seconds_behind_master_spike.test | 90 +++++++++++- sql/slave.cc | 37 ++++- 7 files changed, 275 insertions(+), 81 deletions(-) rename mysql-test/suite/rpl/r/{rpl_delayed_parallel_slave_sbm.result => rpl_parallel_sbm.result} (54%) delete mode 100644 mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm-slave.opt create mode 100644 mysql-test/suite/rpl/t/rpl_parallel_sbm-slave.opt rename mysql-test/suite/rpl/t/{rpl_delayed_parallel_slave_sbm.test => rpl_parallel_sbm.test} (56%) diff --git a/mysql-test/suite/rpl/r/rpl_delayed_parallel_slave_sbm.result b/mysql-test/suite/rpl/r/rpl_parallel_sbm.result similarity index 54% rename from mysql-test/suite/rpl/r/rpl_delayed_parallel_slave_sbm.result rename to mysql-test/suite/rpl/r/rpl_parallel_sbm.result index b00a8a5e1d7..f3cc8454510 100644 --- a/mysql-test/suite/rpl/r/rpl_delayed_parallel_slave_sbm.result +++ b/mysql-test/suite/rpl/r/rpl_parallel_sbm.result @@ -1,12 +1,17 @@ include/master-slave.inc [connection master] +# +# MDEV-29639: Seconds_Behind_Master is incorrect for Delayed, Parallel Replicas +# connection slave; include/stop_slave.inc +set @@GLOBAL.debug_dbug= "d,negate_clock_diff_with_master"; +set @@GLOBAL.slave_parallel_mode= CONSERVATIVE; change master to master_delay=3, master_use_gtid=Slave_Pos; -set @@GLOBAL.slave_parallel_threads=2; include/start_slave.inc connection master; create table t1 (a int); +create table t2 (a int); include/sync_slave_sql_with_master.inc # # Pt 1) Ensure SBM is updated immediately upon arrival of the next event @@ -25,11 +30,10 @@ connection slave; UNLOCK TABLES; include/sync_with_master_gtid.inc # -# Pt 2) If the SQL thread has not entered an idle state, ensure +# Pt 2) If the worker threads have not entered an idle state, ensure # following events do not update SBM -# Stop slave IO thread so it receives both events together on restart connection slave; -include/stop_slave_io.inc +LOCK TABLES t1 WRITE; connection master; # Sleep 2 to allow a buffer between events for SBM check insert into t1 values (1); @@ -37,36 +41,49 @@ insert into t1 values (1); insert into t1 values (2); include/save_master_pos.inc connection slave; -LOCK TABLES t1 WRITE; -SET @@global.debug_dbug="+d,pause_sql_thread_on_next_event"; -START SLAVE IO_THREAD; -# Before we start processing the events, we ensure both transactions -# were written into the relay log. Otherwise, if the IO thread takes too -# long to queue the events, the sql thread can think it has caught up -# too quickly. -SET DEBUG_SYNC='now WAIT_FOR paused_on_event'; -include/sync_io_with_master.inc -SET @@global.debug_dbug="-d,pause_sql_thread_on_next_event"; -SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; # Wait for first transaction to complete SQL delay and begin execution.. -# Validate SBM calculation doesn't use the second transaction because SQL thread shouldn't have gone idle.. +# Validate SBM calculation doesn't use the second transaction because worker threads shouldn't have gone idle.. # ..and that SBM wasn't calculated using prior committed transactions # ..done connection slave; UNLOCK TABLES; -# +include/wait_for_slave_param.inc [Relay_Master_Log_File] +include/wait_for_slave_param.inc [Exec_Master_Log_Pos] # Cleanup -# Reset master_delay include/stop_slave.inc CHANGE MASTER TO master_delay=0; -set @@GLOBAL.slave_parallel_threads=4; -SET @@global.debug_dbug=""; -SET DEBUG_SYNC='RESET'; include/start_slave.inc +# +# MDEV-30619: Parallel Slave SQL Thread Can Update Seconds_Behind_Master with Active Workers +# +connection slave; +# Ensure the replica is fully idle before starting transactions +# Lock t1 on slave so the first received transaction does not complete/commit +LOCK TABLES t1 WRITE; connection master; -DROP TABLE t1; +insert into t1 values (3); +include/save_master_gtid.inc +connection slave; +# Waiting for first transaction to begin.. +connection master; +# Sleep 2 sec to create a gap between events +INSERT INTO t2 VALUES (1); +include/save_master_gtid.inc +connection slave; +# Waiting for second transaction to begin.. +connection slave; +UNLOCK TABLES; +include/sync_with_master_gtid.inc +# +# Cleanup +connection master; +DROP TABLE t1, t2; include/save_master_gtid.inc connection slave; include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@GLOBAL.debug_dbug= ""; +set @@GLOBAL.slave_parallel_mode= "$save_parallel_mode"; +include/start_slave.inc include/rpl_end.inc -# End of rpl_delayed_parallel_slave_sbm.test +# End of rpl_parallel_sbm.test diff --git a/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result b/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result index 4eeb863bb40..bb71f6c92b0 100644 --- a/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result +++ b/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result @@ -3,7 +3,7 @@ include/master-slave.inc connection slave; include/stop_slave.inc SET @save_dbug= @@GLOBAL.debug_dbug; -SET @@global.debug_dbug="+d,pause_sql_thread_on_fde"; +SET @@global.debug_dbug="+d,pause_sql_thread_on_fde,negate_clock_diff_with_master"; include/start_slave.inc # Future events must be logged at least 2 seconds after # the slave starts @@ -34,8 +34,31 @@ SET @@global.debug_dbug="-d,pause_sql_thread_on_fde"; SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; # Wait for SQL thread to continue into normal execution SET DEBUG_SYNC='RESET'; +# +# MDEV-29639 +# When receiving an event after the SQL Thread idles, +# Seconds_Behind_Master should not update before it updates +# last_master_timestamp +connection slave; +include/stop_slave.inc +set @@global.debug_dbug="+d,pause_sql_thread_on_next_event"; +include/start_slave.inc +connection master; +insert into t1 values(2); +include/save_master_gtid.inc +connection slave; +set debug_sync='now wait_for paused_on_event'; +connection master; +# Sleeping 1s to create a visible SBM gap between events +insert into t1 values(3); +include/save_master_gtid.inc +connection slave; +set debug_sync='now wait_for paused_on_event'; +include/stop_slave.inc +set debug_sync='RESET'; +SET @@global.debug_dbug=$save_dbug; +include/start_slave.inc +include/sync_with_master_gtid.inc connection master; DROP TABLE t1; -connection slave; -SET @@global.debug_dbug=$save_dbug; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm-slave.opt b/mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm-slave.opt deleted file mode 100644 index 9eea6a54b68..00000000000 --- a/mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm-slave.opt +++ /dev/null @@ -1 +0,0 @@ ---slave-parallel-threads=4 diff --git a/mysql-test/suite/rpl/t/rpl_parallel_sbm-slave.opt b/mysql-test/suite/rpl/t/rpl_parallel_sbm-slave.opt new file mode 100644 index 00000000000..c3407cde66b --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_parallel_sbm-slave.opt @@ -0,0 +1 @@ +--slave-parallel-threads=2 diff --git a/mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm.test b/mysql-test/suite/rpl/t/rpl_parallel_sbm.test similarity index 56% rename from mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm.test rename to mysql-test/suite/rpl/t/rpl_parallel_sbm.test index 1ac1bc14468..e738f55e7ec 100644 --- a/mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_sbm.test @@ -1,4 +1,14 @@ # +# Ensure that Seconds_Behind_Master works correctly on the parallel replica. +# +--source include/master-slave.inc +--source include/have_log_bin.inc +--source include/have_debug.inc + +--echo # +--echo # MDEV-29639: Seconds_Behind_Master is incorrect for Delayed, Parallel Replicas +--echo # + # This test ensures that after a delayed parallel slave has idled, i.e. # executed everything in its relay log, the next event group that the SQL # thread reads from the relay log will immediately be used in the @@ -6,26 +16,21 @@ # Seconds_Behind_Master is based on the timestamp of the new transaction, # rather than the last committed transaction. # -# References: -# MDEV-29639: Seconds_Behind_Master is incorrect for Delayed, Parallel -# Replicas -# - ---source include/master-slave.inc ---source include/have_debug.inc ---source include/have_debug_sync.inc --connection slave --source include/stop_slave.inc ---let $old_debug_dbug= `SELECT @@global.debug_dbug` +--let $save_dbug= `SELECT @@GLOBAL.debug_dbug` +--let $save_parallel_mode= `SELECT @@GLOBAL.slave_parallel_mode` +set @@GLOBAL.debug_dbug= "d,negate_clock_diff_with_master"; +set @@GLOBAL.slave_parallel_mode= CONSERVATIVE; --let $master_delay= 3 --eval change master to master_delay=$master_delay, master_use_gtid=Slave_Pos ---let $old_slave_threads= `SELECT @@GLOBAL.slave_parallel_threads` -set @@GLOBAL.slave_parallel_threads=2; --source include/start_slave.inc --connection master +--let insert_ctr= 0 create table t1 (a int); +create table t2 (a int); --source include/sync_slave_sql_with_master.inc --echo # @@ -40,7 +45,6 @@ LOCK TABLES t1 WRITE; sleep 2; --let $ts_trx_before_ins= `SELECT UNIX_TIMESTAMP()` ---let insert_ctr= 0 --eval insert into t1 values ($insert_ctr) --inc $insert_ctr --source include/save_master_gtid.inc @@ -66,15 +70,13 @@ UNLOCK TABLES; --source include/sync_with_master_gtid.inc --echo # ---echo # Pt 2) If the SQL thread has not entered an idle state, ensure +--echo # Pt 2) If the worker threads have not entered an idle state, ensure --echo # following events do not update SBM ---echo # Stop slave IO thread so it receives both events together on restart --connection slave ---source include/stop_slave_io.inc +LOCK TABLES t1 WRITE; --connection master - --echo # Sleep 2 to allow a buffer between events for SBM check sleep 2; --let $ts_trxpt2_before_ins= `SELECT UNIX_TIMESTAMP()` @@ -88,29 +90,14 @@ sleep 3; --source include/save_master_pos.inc --connection slave -LOCK TABLES t1 WRITE; - -SET @@global.debug_dbug="+d,pause_sql_thread_on_next_event"; - -START SLAVE IO_THREAD; - ---echo # Before we start processing the events, we ensure both transactions ---echo # were written into the relay log. Otherwise, if the IO thread takes too ---echo # long to queue the events, the sql thread can think it has caught up ---echo # too quickly. -SET DEBUG_SYNC='now WAIT_FOR paused_on_event'; ---source include/sync_io_with_master.inc -SET @@global.debug_dbug="-d,pause_sql_thread_on_next_event"; -SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; - --echo # Wait for first transaction to complete SQL delay and begin execution.. --let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock%' AND command LIKE 'Slave_Worker'; --source include/wait_condition.inc ---echo # Validate SBM calculation doesn't use the second transaction because SQL thread shouldn't have gone idle.. +--echo # Validate SBM calculation doesn't use the second transaction because worker threads shouldn't have gone idle.. --let $sbm_after_trx_no_idle= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) --let $timestamp_trxpt2_arrive= `SELECT UNIX_TIMESTAMP()` -if (`SELECT $sbm_after_trx_no_idle < $timestamp_trxpt2_arrive - $ts_trx_after_ins`) +if (`SELECT $sbm_after_trx_no_idle < $timestamp_trxpt2_arrive - $ts_trx_after_ins - 1`) { --let $cmpv= `SELECT $timestamp_trxpt2_arrive - $ts_trx_after_ins` --echo # SBM $sbm_after_trx_no_idle was more recent than time since last transaction ($cmpv seconds) @@ -127,24 +114,86 @@ if (`SELECT $sbm_after_trx_no_idle > ($seconds_since_idling + 1)`) --connection slave UNLOCK TABLES; +--source include/sync_with_master.inc + +--echo # Cleanup +--source include/stop_slave.inc +--eval CHANGE MASTER TO master_delay=0 +--source include/start_slave.inc + + +--echo # +--echo # MDEV-30619: Parallel Slave SQL Thread Can Update Seconds_Behind_Master with Active Workers +--echo # + +# This test ensures that a parallel slave will not update +# Seconds_Behind_Master after the SQL Thread has idled if the worker threads +# are still executing events. To test this, two events are executed on the +# primary with $sleep seconds in-between them. Once the second event begins +# execution on the replica, Seconds_Behind_Master is queried to ensure it +# reflects the value of the first transaction, rather than the second. + +--connection slave +--echo # Ensure the replica is fully idle before starting transactions +--let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Slave has read all relay log%'; +--source include/wait_condition.inc +--let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for work from SQL thread'; +--source include/wait_condition.inc + +--echo # Lock t1 on slave so the first received transaction does not complete/commit +LOCK TABLES t1 WRITE; + +--connection master +--let $ts_t1_before_master_ins= `SELECT UNIX_TIMESTAMP()` +--eval insert into t1 values ($insert_ctr) +--inc $insert_ctr +--source include/save_master_gtid.inc + +--connection slave +--echo # Waiting for first transaction to begin.. +--let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock'; +--source include/wait_condition.inc + +--let $sbm_1= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) + +--connection master +--let $sleep = 2 +--echo # Sleep $sleep sec to create a gap between events +sleep $sleep; +INSERT INTO t2 VALUES (1); +--source include/save_master_gtid.inc + +--connection slave +--echo # Waiting for second transaction to begin.. +--let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%'; +--source include/wait_condition.inc + +--let $sbm_2= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) + +if (`SELECT $sbm_1 + $sleep > $sbm_2`) +{ + --echo # Seconds_Behind_Masters: $sbm_1 $sbm_2_0 + --die Two successive Seconds_Behind_Master timestamps must be separated by the sleep parameter value or greater +} + +--connection slave +UNLOCK TABLES; +--source include/sync_with_master_gtid.inc + --echo # --echo # Cleanup ---echo # Reset master_delay ---source include/stop_slave.inc ---eval CHANGE MASTER TO master_delay=0 ---eval set @@GLOBAL.slave_parallel_threads=$old_slave_threads ---eval SET @@global.debug_dbug="$old_debug_dbug" -SET DEBUG_SYNC='RESET'; ---source include/start_slave.inc - --connection master -DROP TABLE t1; +DROP TABLE t1, t2; --source include/save_master_gtid.inc --connection slave --source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--eval set @@GLOBAL.debug_dbug= "$save_dbug" +--evalp set @@GLOBAL.slave_parallel_mode= "$save_parallel_mode" +--source include/start_slave.inc --source include/rpl_end.inc ---echo # End of rpl_delayed_parallel_slave_sbm.test +--echo # End of rpl_parallel_sbm.test diff --git a/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test b/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test index d1bfbf25bae..d96863a14c2 100644 --- a/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test +++ b/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test @@ -27,7 +27,7 @@ --connection slave --source include/stop_slave.inc SET @save_dbug= @@GLOBAL.debug_dbug; -SET @@global.debug_dbug="+d,pause_sql_thread_on_fde"; +SET @@global.debug_dbug="+d,pause_sql_thread_on_fde,negate_clock_diff_with_master"; --source include/start_slave.inc --let $sleep_time=2 @@ -93,11 +93,93 @@ SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; # Reset last sql_thread_continue signal SET DEBUG_SYNC='RESET'; + +--echo # +--echo # MDEV-29639 +--echo # When receiving an event after the SQL Thread idles, +--echo # Seconds_Behind_Master should not update before it updates +--echo # last_master_timestamp + +--connection slave +--source include/stop_slave.inc +set @@global.debug_dbug="+d,pause_sql_thread_on_next_event"; +--source include/start_slave.inc + +--connection master +insert into t1 values(2); +--source include/save_master_gtid.inc + +# Each event after starting will trigger a pause, so continually send signal +# sql_thread_continue until caught up +--connection slave +--let $caught_up=0 +--let $tries= 0 +set debug_sync='now wait_for paused_on_event'; +--disable_query_log +while (!$caught_up) +{ + set debug_sync='now signal sql_thread_continue'; + --let $slave_gtid= `SELECT @@global.gtid_slave_pos` + if (`SELECT strcmp("$master_pos","$slave_gtid") = 0`) + { + --inc $caught_up + } + --inc $tries + # Wait 30s + if (`SELECT $tries > 300`) + { + --die Replica failed to sync with primary + } + sleep 0.1; +} +--enable_query_log + +--connection master +--echo # Sleeping 1s to create a visible SBM gap between events +sleep 1; +insert into t1 values(3); +--source include/save_master_gtid.inc + +--connection slave +set debug_sync='now wait_for paused_on_event'; +--let $sbm= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) + +if ($sbm) +{ + --echo # Expected Seconds_Behind_Master to be 0 but was $sbm + --die Seconds_Behind_Master should not show updates before last_master_timestamp is updated +} + +# Continually send signal sql_thread_continue until caught up +--let $caught_up=0 +--let $tries= 0 +--disable_query_log +while (!$caught_up) +{ + set debug_sync='now signal sql_thread_continue'; + --let $slave_gtid= `SELECT @@global.gtid_slave_pos` + if (`SELECT strcmp("$master_pos","$slave_gtid") = 0`) + { + --inc $caught_up + } + --inc $tries + # Wait 30s + if (`SELECT $tries > 300`) + { + --die Replica failed to sync with primary + } + sleep 0.1; +} +--enable_query_log + # Cleanup +--source include/stop_slave.inc +set debug_sync='RESET'; +SET @@global.debug_dbug=$save_dbug; +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + --connection master DROP TABLE t1; ---connection slave -SET @@global.debug_dbug=$save_dbug; - --source include/rpl_end.inc diff --git a/sql/slave.cc b/sql/slave.cc index f43240a8866..0b575b5f714 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1857,8 +1857,10 @@ static int get_master_version_and_clock(MYSQL* mysql, Master_info* mi) (master_row= mysql_fetch_row(master_res))) { mysql_mutex_lock(&mi->data_lock); - mi->clock_diff_with_master= - (long) (time((time_t*) 0) - strtoul(master_row[0], 0, 10)); + mi->clock_diff_with_master= DBUG_EVALUATE_IF( + "negate_clock_diff_with_master", 0, + (long) (time((time_t *) 0) - strtoul(master_row[0], 0, 10))); + mysql_mutex_unlock(&mi->data_lock); } else if (check_io_slave_killed(mi, NULL)) @@ -3187,6 +3189,14 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full, else { idle= mi->rli.sql_thread_caught_up; + + /* + The idleness of the SQL thread is needed for the parallel slave + because events can be ignored before distribution to a worker thread. + That is, Seconds_Behind_Master should still be calculated and visible + while the slave is processing ignored events, such as those skipped + due to slave_skip_counter. + */ if (mi->using_parallel() && idle && !mi->rli.parallel.workers_idle()) idle= false; } @@ -4146,7 +4156,6 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, thd, STRING_WITH_LEN( "now SIGNAL paused_on_event WAIT_FOR sql_thread_continue"))); - DBUG_SET("-d,pause_sql_thread_on_next_event"); mysql_mutex_lock(&rli->data_lock); }); @@ -4163,7 +4172,8 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, the user might be surprised to see a claim that the slave is up to date long before those queued events are actually executed. */ - if ((!rli->mi->using_parallel()) && event_can_update_last_master_timestamp(ev)) + if ((!rli->mi->using_parallel()) && + event_can_update_last_master_timestamp(ev)) { rli->last_master_timestamp= ev->when + (time_t) ev->exec_time; rli->sql_thread_caught_up= false; @@ -4218,9 +4228,22 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, if (rli->mi->using_parallel()) { - if (unlikely((rli->last_master_timestamp == 0 || - rli->sql_thread_caught_up) && - event_can_update_last_master_timestamp(ev))) + /* + rli->sql_thread_caught_up is checked and negated here to ensure that + the value of Seconds_Behind_Master in SHOW SLAVE STATUS is consistent + with the update of last_master_timestamp. It was previously unset + immediately after reading an event from the relay log; however, for the + duration between that unset and the time that LMT would be updated + could lead to spikes in SBM. + + The check for queued_count == dequeued_count ensures the worker threads + are all idle (i.e. all events have been executed). + */ + if ((unlikely(rli->last_master_timestamp == 0) || + (rli->sql_thread_caught_up && + (rli->last_inuse_relaylog->queued_count == + rli->last_inuse_relaylog->dequeued_count))) && + event_can_update_last_master_timestamp(ev)) { if (rli->last_master_timestamp < ev->when) { From 2a46b358a768f3af837386585d2f3d6720644ed8 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Tue, 25 Jul 2023 13:23:18 +0200 Subject: [PATCH 130/171] new WolfSSL v5.6.3-stable --- extra/wolfssl/CMakeLists.txt | 4 +++- extra/wolfssl/wolfssl | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/extra/wolfssl/CMakeLists.txt b/extra/wolfssl/CMakeLists.txt index 0aee5865867..826587df242 100644 --- a/extra/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/CMakeLists.txt @@ -147,7 +147,9 @@ IF(WOLFSSL_X86_64_BUILD) LIST(APPEND WOLFCRYPT_SOURCES ${WOLFCRYPT_SRCDIR}/cpuid.c) IF(MSVC) SET(WOLFSSL_AESNI 1) - LIST(APPEND WOLFCRYPT_SOURCES ${WOLFCRYPT_SRCDIR}/aes_asm.asm) + LIST(APPEND WOLFCRYPT_SOURCES + ${WOLFCRYPT_SRCDIR}/aes_asm.asm + ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.asm) IF(CMAKE_C_COMPILER_ID MATCHES Clang) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -msse4.2 -mpclmul -mrdrnd -mrdseed") ENDIF() diff --git a/extra/wolfssl/wolfssl b/extra/wolfssl/wolfssl index 4fbd4fd36a2..3b3c175af0e 160000 --- a/extra/wolfssl/wolfssl +++ b/extra/wolfssl/wolfssl @@ -1 +1 @@ -Subproject commit 4fbd4fd36a21efd9d1a7e17aba390e91c78693b1 +Subproject commit 3b3c175af0e993ffaae251871421e206cc41963f From 515ba857ba7f28fac64f57585b09cfcd3b4b22fa Mon Sep 17 00:00:00 2001 From: Lena Startseva Date: Tue, 6 Jun 2023 11:53:14 +0700 Subject: [PATCH 131/171] MDEV-31407: Add aliases in opt_trace.test for long column name for removing "--disable-view-protocol" Change tests: opt_trace.test opt_trace_index_merge.test opt_trace_ucs2.test --- mysql-test/main/opt_trace.result | 88 ++++++++++---------- mysql-test/main/opt_trace.test | 72 +++++++--------- mysql-test/main/opt_trace_index_merge.result | 16 ++-- mysql-test/main/opt_trace_index_merge.test | 10 +-- mysql-test/main/opt_trace_ucs2.result | 4 +- mysql-test/main/opt_trace_ucs2.test | 5 +- 6 files changed, 89 insertions(+), 106 deletions(-) diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result index fc29d128bd4..62643c60bc7 100644 --- a/mysql-test/main/opt_trace.result +++ b/mysql-test/main/opt_trace.result @@ -7452,8 +7452,8 @@ set optimizer_trace='enabled=on'; explain select * from t1 force index (a_b) where a=2 and b=4; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref a_b a_b 10 const,const 1 Using index -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7481,8 +7481,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) explain select * from t1 where a >= 900 and b between 10 and 20; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range a_b a_b 10 NULL 107 Using where; Using index -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7513,8 +7513,8 @@ insert into t1 select date_add(now(), interval a day), date_add(now(), interval explain select * from t1 force index(start_date) where start_date >= '2019-02-10' and end_date <'2019-04-01'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range start_date start_date 8 NULL 1000 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7553,8 +7553,8 @@ insert into t1 select a,a, a,a from ten; explain select * from t1 force index(a_b_c) where a between 1 and 4 and b < 50; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range a_b_c a_b_c 8 NULL 4 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7587,8 +7587,8 @@ INSERT INTO t1 VALUES (2, NULL); EXPLAIN SELECT * FROM t1 WHERE b IN (0xD95B94336A9946A39CF5B58CFE772D8C); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 17 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7616,8 +7616,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) EXPLAIN SELECT * FROM t1 WHERE b IS NULL; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 17 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7653,8 +7653,8 @@ set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 13 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7683,8 +7683,8 @@ ALTER TABLE t1 modify column b BINARY(10) AFTER i; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 11 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7713,8 +7713,8 @@ ALTER TABLE t1 modify column b VARBINARY(10) AFTER i; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 13 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7746,8 +7746,8 @@ INSERT INTO t1 VALUES (2, NULL); EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 11 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7782,8 +7782,8 @@ set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b= 'ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 1003 const 1 Using where -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7816,8 +7816,8 @@ set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 13 const 2 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7867,8 +7867,8 @@ EXPLAIN } } } -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7926,8 +7926,8 @@ explain select * from t0 A, one_k B where A.a<5 and B.a<800; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A ALL NULL NULL NULL NULL 10 Using where 1 SIMPLE B ALL NULL NULL NULL NULL 1000 Using where -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8021,8 +8021,8 @@ explain select * from t0 A, one_k B where A.a=B.b and B.a<800; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A ALL NULL NULL NULL NULL 10 Using where 1 SIMPLE B ref b b 5 test.A.a 1 Using where -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8131,8 +8131,8 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref a a 258 const 1 Using where SELECT * FROM t1 WHERE a= REPEAT('a', 0); a -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -8193,8 +8193,8 @@ insert into t1 values (1,1),(1,5),(5,1),(5,5); set optimizer_trace=1; select * from t1 force index(kp1) where (kp1=2 and kp2 >=4); kp1 kp2 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8224,8 +8224,8 @@ EXPLAIN SELECT * FROM t1, t2 WHERE t1.a=t2.a ORDER BY t2.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where; Using temporary; Using filesort 1 SIMPLE t2 ref a a 5 test.t1.a 1 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8379,8 +8379,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 100 0.22 Using where Warnings: Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` between 1 and 5 and `test`.`t1`.`b` <= 5 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8402,8 +8402,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 Using where Warnings: Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` <> 5 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8422,8 +8422,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 100 15.62 Using where Warnings: Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`b` >= 10 and `test`.`t1`.`b` < 25 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8444,8 +8444,8 @@ SELECT sum(b), row_number() OVER (order by b) FROM t1 WHERE a = 101; sum(b) row_number() OVER (order by b) NULL 1 UPDATE t1 SET b=10 WHERE a=1; -SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { diff --git a/mysql-test/main/opt_trace.test b/mysql-test/main/opt_trace.test index 52b3bee0fe4..45db19ccf7b 100644 --- a/mysql-test/main/opt_trace.test +++ b/mysql-test/main/opt_trace.test @@ -403,13 +403,11 @@ create table t1 ( a int, b int, key a_b(a,b)); insert into t1 select a,a from one_k; set optimizer_trace='enabled=on'; -#enable after fix MDEV-27871 ---disable_view_protocol explain select * from t1 force index (a_b) where a=2 and b=4; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; explain select * from t1 where a >= 900 and b between 10 and 20; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t0,t1; @@ -418,7 +416,7 @@ create table t1 (start_date date, end_date date, filler char(100), key(start_dat insert into t1 select date_add(now(), interval a day), date_add(now(), interval (a+7) day), 'data' from one_k; --enable_warnings explain select * from t1 force index(start_date) where start_date >= '2019-02-10' and end_date <'2019-04-01'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1,one_k; create table ten(a int); @@ -433,7 +431,7 @@ create table t1 ( insert into t1 select a,a, a,a from ten; explain select * from t1 force index(a_b_c) where a between 1 and 4 and b < 50; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table ten,t1; --echo # Ported test from MYSQL for ranges involving Binary column @@ -443,10 +441,10 @@ INSERT INTO t1 VALUES (1, x'D95B94336A9946A39CF5B58CFE772D8C'); INSERT INTO t1 VALUES (2, NULL); EXPLAIN SELECT * FROM t1 WHERE b IN (0xD95B94336A9946A39CF5B58CFE772D8C); -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN SELECT * FROM t1 WHERE b IS NULL; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; @@ -459,22 +457,22 @@ INSERT INTO t1 VALUES (1, 'ab\n'); INSERT INTO t1 VALUES (2, NULL); set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ALTER TABLE t1 modify column b BINARY(10) AFTER i; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ALTER TABLE t1 modify column b VARBINARY(10) AFTER i; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; CREATE TABLE t1(i INT PRIMARY KEY, b CHAR(10), INDEX i_b(b)); INSERT INTO t1 VALUES (1, 'ab\n'); INSERT INTO t1 VALUES (2, NULL); EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; CREATE TABLE t1(i INT PRIMARY KEY, b blob , INDEX i_b(b)); @@ -482,7 +480,7 @@ INSERT INTO t1 VALUES (1, 'ab\n'); INSERT INTO t1 VALUES (2, NULL); set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b= 'ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; CREATE TABLE t1(i INT PRIMARY KEY, b VARCHAR(10), INDEX i_b(b)); @@ -490,7 +488,7 @@ INSERT INTO t1 VALUES (1, 'ab\n'); INSERT INTO t1 VALUES (2, 'ab\n'); set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; create table t0(a int); insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); @@ -501,9 +499,8 @@ create table t1 (start_date date, end_date date, filler char(100), key(start_dat insert into t1 select date_add(now(), interval a day), date_add(now(), interval (a+7) day), 'data' from one_k; --enable_warnings explain format=json select * from t1 force index(start_date) where start_date >= '2019-02-10' and end_date <'2019-04-01'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1, t0, one_k; ---enable_view_protocol --echo # --echo # MDEV-19776: Assertion `to_len >= 8' failed in convert_to_printable with optimizer trace enabled @@ -533,18 +530,15 @@ set optimizer_trace=1; --echo # (cost_for_plan is the same as best_access_path.cost for single-table SELECTs --echo # but for joins using condition selectivity it is not as trivial. So, --echo # now we are printing it) -#enable after fix MDEV-27871 ---disable_view_protocol explain select * from t0 A, one_k B where A.a<5 and B.a<800; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; set join_cache_level=@tmp_jcl; --echo # This shows post-join selectivity explain select * from t0 A, one_k B where A.a=B.b and B.a<800; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t0, one_k; ---enable_view_protocol --echo # --echo # Assertion `to_len >= 8' failed in convert_to_printable @@ -556,9 +550,7 @@ insert into t1 values ('foo'), ('bar'); EXPLAIN SELECT * FROM t1 WHERE a= REPEAT('a', 0); SELECT * FROM t1 WHERE a= REPEAT('a', 0); #enable after fix MDEV-27871 ---disable_view_protocol -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; DROP TABLE t1; --echo # @@ -589,9 +581,7 @@ insert into t1 values (1,1),(1,5),(5,1),(5,5); set optimizer_trace=1; select * from t1 force index(kp1) where (kp1=2 and kp2 >=4); #enable after fix MDEV-27871 ---disable_view_protocol -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; --echo # @@ -604,12 +594,10 @@ CREATE TABLE t2(a INT, b INT, key(a)); INSERT INTO t2 SELECT seq, seq from seq_1_to_100; #enable after fix MDEV-27871 ---disable_view_protocol SET OPTIMIZER_TRACE=1; EXPLAIN SELECT * FROM t1, t2 WHERE t1.a=t2.a ORDER BY t2.b; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; DROP TABLE t1,t2; ---enable_view_protocol --echo # --echo # MDEV-22665: Print ranges in the optimizer trace created for non-indexed columns when @@ -620,15 +608,12 @@ CREATE TABLE t1(a INT, b INT); INSERT INTO t1 SELECT seq, seq from seq_1_to_100; SET optimizer_trace=1; ANALYZE TABLE t1 PERSISTENT FOR ALL; -#enable after fix MDEV-27871 ---disable_view_protocol EXPLAIN EXTENDED SELECT * from t1 WHERE a between 1 and 5 and b <= 5; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN EXTENDED SELECT * from t1 WHERE a != 5; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN EXTENDED SELECT * from t1 WHERE b >= 10 and b < 25; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; --echo # @@ -639,10 +624,7 @@ drop table t1; CREATE TABLE t1( a INT, b INT, PRIMARY KEY( a ) ); SELECT sum(b), row_number() OVER (order by b) FROM t1 WHERE a = 101; UPDATE t1 SET b=10 WHERE a=1; -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; DROP TABLE t1; set optimizer_trace='enabled=off'; @@ -784,9 +766,13 @@ select * from from t10 left join t11 on t11.col1=t10.col1 group by grp_id) T on T.grp_id=t1.b; -# Not sure how MDEV-27871 is related but this test uses this reason -# all over the place: -#enable after fix MDEV-27871 +# Enable after fix MDEV-31408 +# On the first creation of the view from information_schema.optimizer_trace +# everything is fine, but on the second creation of the view is +# from information_schema.optimizer_trace the result of select +# from this view is already returned NULL. +# That's why view-protocol is disabled here + --disable_view_protocol select json_detailed(json_extract(trace, '$**.check_split_materialized')) as JS diff --git a/mysql-test/main/opt_trace_index_merge.result b/mysql-test/main/opt_trace_index_merge.result index 554ddde66a9..fe4aa27f0f6 100644 --- a/mysql-test/main/opt_trace_index_merge.result +++ b/mysql-test/main/opt_trace_index_merge.result @@ -304,8 +304,8 @@ set optimizer_trace='enabled=on'; explain select key1,key2,key3 from t1 where key1=100 and key2=100 and key3=100; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index_merge key1,key2,key3 key1,key2,key3 5,5,5 NULL 2 Using intersect(key1,key2,key3); Using where; Using index -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -398,8 +398,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) [] } ] -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_access_plan": @@ -443,8 +443,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) explain select key1,key2,key3,key4 from t1 where key1=100 and key2=100 or key3=100 and key4=100; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index_merge key1,key2,key3,key4 key1,key2,key3,key4 5,5,5,5 NULL 154 Using union(intersect(key1,key2),intersect(key3,key4)); Using where -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -620,8 +620,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) ] } ] -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_access_plan": diff --git a/mysql-test/main/opt_trace_index_merge.test b/mysql-test/main/opt_trace_index_merge.test index 85918211184..1181aaa3db1 100644 --- a/mysql-test/main/opt_trace_index_merge.test +++ b/mysql-test/main/opt_trace_index_merge.test @@ -119,17 +119,17 @@ insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, -1, -1, 'key1 insert into t1 (key1, key2, key3, key4, filler1) values (-1, -1, 100, 100, 'key4-key3'); set optimizer_trace='enabled=on'; -#check after fix MDEV-27871 +# Enable after fix MDEV-31408 --disable_view_protocol --echo # 3-way ROR-intersection explain select key1,key2,key3 from t1 where key1=100 and key2=100 and key3=100; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; --echo # ROR-union(ROR-intersection, ROR-range) explain select key1,key2,key3,key4 from t1 where key1=100 and key2=100 or key3=100 and key4=100; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; --enable_view_protocol drop table t0,t1; diff --git a/mysql-test/main/opt_trace_ucs2.result b/mysql-test/main/opt_trace_ucs2.result index 945392d0ac1..e4d97c560d7 100644 --- a/mysql-test/main/opt_trace_ucs2.result +++ b/mysql-test/main/opt_trace_ucs2.result @@ -20,8 +20,8 @@ EXPLAIN } } } -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": diff --git a/mysql-test/main/opt_trace_ucs2.test b/mysql-test/main/opt_trace_ucs2.test index 1a79ea9780e..eff7d960c17 100644 --- a/mysql-test/main/opt_trace_ucs2.test +++ b/mysql-test/main/opt_trace_ucs2.test @@ -6,8 +6,5 @@ insert into t1 values ('a', 'a'); insert into t1 values ('a', 'a'); set optimizer_trace=1; explain format=json select * from t1 force index(col1) where col1 >='a'; -#enable after fix MDEV-27871 ---disable_view_protocol -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; From 23dae6173c929e0068dcb56634b0d3e1f193317a Mon Sep 17 00:00:00 2001 From: Geoff Montee Date: Thu, 24 Jan 2019 23:30:11 -0500 Subject: [PATCH 132/171] MDEV-18374: Add SELinux policy to cracklib_password_check packages --- cmake/cpack_rpm.cmake | 2 ++ plugin/cracklib_password_check/CMakeLists.txt | 25 +++++++++++++++++++ .../mariadb-plugin-cracklib-password-check.te | 13 ++++++++++ ...b-plugin-cracklib-password-check-postin.sh | 8 ++++++ 4 files changed, 48 insertions(+) create mode 100644 plugin/cracklib_password_check/policy/selinux/mariadb-plugin-cracklib-password-check.te create mode 100644 plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh diff --git a/cmake/cpack_rpm.cmake b/cmake/cpack_rpm.cmake index 87a84a1361b..2cddd9ecea8 100644 --- a/cmake/cpack_rpm.cmake +++ b/cmake/cpack_rpm.cmake @@ -229,6 +229,8 @@ SET(CPACK_RPM_shared_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/ SET(CPACK_RPM_shared_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/shared-post.sh) SET(CPACK_RPM_compat_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/shared-post.sh) SET(CPACK_RPM_compat_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/shared-post.sh) +SET(CPACK_RPM_cracklib-password-check_POST_INSTALL_SCRIPT_FILE + ${CMAKE_SOURCE_DIR}/plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh) MACRO(ALTERNATIVE_NAME real alt) IF(${ARGC} GREATER 2) diff --git a/plugin/cracklib_password_check/CMakeLists.txt b/plugin/cracklib_password_check/CMakeLists.txt index 5d5466fb84e..4a6337310f9 100644 --- a/plugin/cracklib_password_check/CMakeLists.txt +++ b/plugin/cracklib_password_check/CMakeLists.txt @@ -14,4 +14,29 @@ IF (HAVE_ALLOCA_H AND HAVE_CRACK_H AND HAVE_LIBCRACK AND HAVE_MEMCPY) MYSQL_ADD_PLUGIN(cracklib_password_check cracklib_password_check.c LINK_LIBRARIES crack MODULE_ONLY COMPONENT cracklib-password-check) + + IF (RPM) + SET(inst_location ${INSTALL_SUPPORTFILESDIR}) + INSTALL(DIRECTORY policy DESTINATION ${inst_location} COMPONENT cracklib-password-check) + FIND_PROGRAM(CHECKMODULE checkmodule) + FIND_PROGRAM(SEMODULE_PACKAGE semodule_package) + MARK_AS_ADVANCED(CHECKMODULE SEMODULE_PACKAGE) + + # Build pp files in policy/selinux + IF(CHECKMODULE AND SEMODULE_PACKAGE) + FOREACH(pol mariadb-plugin-cracklib-password-check) + SET(src ${CMAKE_CURRENT_SOURCE_DIR}/policy/selinux/${pol}.te) + SET(tmp ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${pol}-pp.dir/${pol}.mod) + SET(out ${CMAKE_CURRENT_BINARY_DIR}/${pol}.pp) + ADD_CUSTOM_COMMAND(OUTPUT ${out} + COMMAND ${CHECKMODULE} -M -m ${src} -o ${tmp} + COMMAND ${SEMODULE_PACKAGE} -m ${tmp} -o ${out} + DEPENDS ${src}) + ADD_CUSTOM_TARGET(${pol}-pp ALL DEPENDS ${out}) + INSTALL(FILES ${out} DESTINATION ${inst_location}/policy/selinux COMPONENT cracklib-password-check) + ENDFOREACH() + ENDIF() + + ENDIF() + ENDIF() diff --git a/plugin/cracklib_password_check/policy/selinux/mariadb-plugin-cracklib-password-check.te b/plugin/cracklib_password_check/policy/selinux/mariadb-plugin-cracklib-password-check.te new file mode 100644 index 00000000000..a352f206c97 --- /dev/null +++ b/plugin/cracklib_password_check/policy/selinux/mariadb-plugin-cracklib-password-check.te @@ -0,0 +1,13 @@ + +module mariadb-plugin-cracklib-password-check 1.0; + +require { + type mysqld_t; + type crack_db_t; + class file { execute setattr read create getattr execute_no_trans write ioctl open append unlink }; + class dir { write search getattr add_name read remove_name open }; +} + +allow mysqld_t crack_db_t:dir { search read open }; +allow mysqld_t crack_db_t:file { getattr read open }; + diff --git a/plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh b/plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh new file mode 100644 index 00000000000..43315503315 --- /dev/null +++ b/plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh @@ -0,0 +1,8 @@ +SETARGETDIR=/etc/selinux/targeted/src/policy +SEDOMPROG=$SETARGETDIR/domains/program +SECONPROG=$SETARGETDIR/file_contexts/program + +if [ -x /usr/sbin/semodule ] ; then + /usr/sbin/semodule -i /usr/share/mysql/policy/selinux/mariadb-plugin-cracklib-password-check.pp +fi + From 9854fb6fa7ceabdf9968a1d1b9dd77ee80c8ea5f Mon Sep 17 00:00:00 2001 From: Lena Startseva Date: Wed, 31 May 2023 11:57:45 +0700 Subject: [PATCH 133/171] MDEV-31003: Second execution for ps-protocol This patch adds for "--ps-protocol" second execution of queries "SELECT". Also in this patch it is added ability to disable/enable (--disable_ps2_protocol/--enable_ps2_protocol) second execution for "--ps-prototocol" in testcases. --- client/mysqltest.cc | 39 ++++++++++++++++++- mysql-test/include/column_compression_rpl.inc | 4 +- mysql-test/include/commit.inc | 2 + mysql-test/include/ctype_numconv.inc | 2 + mysql-test/include/diff_tables.inc | 2 + mysql-test/include/explain_utils.inc | 2 + mysql-test/include/function_defaults.inc | 4 ++ mysql-test/include/grant_cache.inc | 4 ++ mysql-test/include/icp_tests.inc | 2 + mysql-test/include/query_cache.inc | 2 + mysql-test/include/query_cache_partitions.inc | 7 +++- .../include/query_cache_sql_prepare.inc | 3 ++ mysql-test/include/test_outfile.inc | 2 + .../include/type_temporal_zero_default.inc | 2 + mysql-test/include/write_var_to_file.inc | 2 + .../main/analyze_stmt_slow_query_log.test | 2 + .../main/auto_increment_ranges_innodb.test | 2 + mysql-test/main/bootstrap.test | 2 + mysql-test/main/bug39022.test | 2 + mysql-test/main/cast.test | 2 + mysql-test/main/check_constraint.test | 3 ++ mysql-test/main/column_compression.inc | 4 ++ mysql-test/main/count_distinct2.test | 2 + mysql-test/main/ctype_big5.test | 2 + mysql-test/main/ctype_ucs.test | 5 ++- .../main/custom_aggregate_functions.test | 5 +++ mysql-test/main/custom_aggregates_i_s.test | 4 ++ mysql-test/main/debug_sync.test | 2 + mysql-test/main/delete.test | 2 + mysql-test/main/derived.test | 3 ++ mysql-test/main/derived_cond_pushdown.test | 4 +- mysql-test/main/derived_view.test | 8 ++++ mysql-test/main/distinct.test | 4 ++ mysql-test/main/empty_table.test | 4 ++ mysql-test/main/error_simulation.test | 2 + mysql-test/main/errors.test | 2 + .../main/fast_prefix_index_fetch_innodb.test | 3 ++ mysql-test/main/features.test | 4 +- mysql-test/main/func_gconcat.test | 16 +++++++- mysql-test/main/func_like.test | 3 ++ mysql-test/main/func_math.test | 2 + mysql-test/main/func_misc.test | 10 +++++ mysql-test/main/func_rollback.test | 8 ++++ mysql-test/main/func_str.test | 2 + mysql-test/main/func_time.test | 8 ++++ mysql-test/main/func_weight_string.test | 2 + mysql-test/main/grant2.test | 2 + mysql-test/main/group_by.test | 10 +++++ mysql-test/main/group_min_max.test | 3 +- mysql-test/main/handler_read_last.test | 2 + mysql-test/main/having.test | 2 + mysql-test/main/information_schema.test | 3 +- mysql-test/main/information_schema_stats.test | 2 + mysql-test/main/innodb_ext_key.test | 4 ++ mysql-test/main/insert.test | 6 +++ mysql-test/main/invisible_field.test | 4 ++ mysql-test/main/join.test | 4 ++ mysql-test/main/join_cache.test | 7 ++++ mysql-test/main/join_outer.test | 27 +++++++++++-- mysql-test/main/key_cache.test | 2 + mysql-test/main/limit_rows_examined.test | 4 ++ mysql-test/main/loaddata.test | 36 +++++++++++++++++ mysql-test/main/lock_multi.test | 2 + mysql-test/main/log_slow.test | 2 + mysql-test/main/log_tables-big.test | 2 + mysql-test/main/log_tables.test | 2 + mysql-test/main/long_unique_bugs.test | 6 +++ mysql-test/main/merge.test | 2 + mysql-test/main/myisam_mrr.test | 2 + mysql-test/main/mysqldump.test | 2 + mysql-test/main/nested_profiling.test | 2 + mysql-test/main/null.test | 2 + mysql-test/main/null_key.test | 2 + mysql-test/main/odbc.test | 6 +++ mysql-test/main/olap.test | 2 + mysql-test/main/opt_trace.test | 2 + mysql-test/main/opt_trace_security.test | 2 + mysql-test/main/opt_tvc.test | 3 ++ mysql-test/main/order_by.test | 6 +++ mysql-test/main/order_by_sortkey.test | 2 + mysql-test/main/outfile.test | 2 + mysql-test/main/outfile_loaddata.test | 3 +- mysql-test/main/partition.test | 4 ++ mysql-test/main/partition_explicit_prune.test | 4 +- mysql-test/main/partition_range.test | 2 + mysql-test/main/precedence.test | 3 ++ mysql-test/main/preload.test | 2 + mysql-test/main/profiling.test | 3 +- mysql-test/main/ps.test | 9 ++++- mysql-test/main/ps_11bugs.test | 2 + mysql-test/main/query_cache.test | 2 + mysql-test/main/query_cache_merge.test | 2 + mysql-test/main/query_cache_notembedded.test | 2 + mysql-test/main/query_cache_with_views.test | 7 ++++ mysql-test/main/range_debug.test | 2 + mysql-test/main/range_vs_index_merge.test | 2 + mysql-test/main/reset_connection.test | 2 + mysql-test/main/select.test | 9 ++++- mysql-test/main/select_found.test | 2 + mysql-test/main/selectivity.test | 4 ++ mysql-test/main/set_statement.test | 2 + .../set_statement_notembedded_binlog.test | 4 ++ mysql-test/main/show_check.test | 4 ++ mysql-test/main/show_profile.test | 3 +- mysql-test/main/single_delete_update.test | 3 +- mysql-test/main/sp-error.test | 10 ++++- mysql-test/main/sp-prelocking.test | 2 + mysql-test/main/sp-vars.test | 4 ++ mysql-test/main/sp.test | 19 ++++++++- mysql-test/main/sp_trans.test | 6 +++ mysql-test/main/statistics.test | 2 + mysql-test/main/status2.test | 2 + mysql-test/main/subselect.test | 7 +++- mysql-test/main/subselect3.inc | 10 +++++ mysql-test/main/subselect4.test | 4 +- mysql-test/main/subselect_cache.test | 11 +++++- mysql-test/main/subselect_sj_mat.test | 9 +++++ mysql-test/main/tc_heuristic_recover.test | 4 ++ mysql-test/main/trigger-compat.test | 2 + mysql-test/main/trigger-trans.test | 3 ++ mysql-test/main/trigger_notembedded.test | 2 + mysql-test/main/type_date.test | 2 + mysql-test/main/type_datetime.test | 2 + mysql-test/main/type_newdecimal.test | 2 + mysql-test/main/type_timestamp.test | 4 ++ mysql-test/main/type_year.test | 3 ++ mysql-test/main/union.test | 20 +++++++++- mysql-test/main/update.test | 4 ++ mysql-test/main/user_var.test | 7 +++- mysql-test/main/userstat-badlogin-4824.test | 2 + mysql-test/main/userstat.test | 2 + mysql-test/main/variables.test | 2 + mysql-test/main/view.test | 15 +++++++ mysql-test/main/win.test | 6 ++- mysql-test/main/win_i_s.test | 2 + mysql-test/suite/archive/rnd_pos.test | 4 ++ mysql-test/suite/binlog/include/database.test | 2 + mysql-test/suite/binlog/t/binlog_stm_row.test | 2 + mysql-test/suite/binlog/t/binlog_unsafe.test | 2 + .../suite/compat/oracle/t/sequence.test | 7 +++- .../suite/compat/oracle/t/sp-package.test | 2 + .../federated/federatedx_create_handlers.test | 5 +++ .../funcs_1/storedproc/storedproc_10.inc | 3 +- .../suite/funcs_1/t/is_basics_mixed.test | 2 + .../suite/funcs_1/t/row_count_func.test | 14 +++++++ .../suite/funcs_1/views/views_master.inc | 5 ++- mysql-test/suite/gcol/inc/gcol_ins_upd.inc | 2 + mysql-test/suite/gcol/inc/gcol_keys.inc | 2 + mysql-test/suite/gcol/t/gcol_bugfixes.test | 6 +++ .../gcol/t/innodb_virtual_debug_purge.test | 4 ++ mysql-test/suite/handler/handler.inc | 2 + mysql-test/suite/innodb/t/alter_kill.test | 4 ++ mysql-test/suite/innodb/t/foreign_key.test | 2 + .../suite/innodb/t/innodb-autoinc-56228.test | 2 + .../suite/innodb/t/innodb_bug14007649.test | 4 ++ .../suite/innodb/t/innodb_bug59641.test | 4 ++ .../suite/innodb/t/innodb_force_recovery.test | 2 + .../suite/innodb/t/instant_alter_bugs.test | 2 + mysql-test/suite/innodb/t/monitor.test | 2 + .../innodb/t/read_only_recover_committed.test | 2 + .../suite/innodb/t/table_index_statistics.inc | 2 + .../suite/innodb/t/temp_table_savepoint.test | 3 ++ mysql-test/suite/innodb/t/xa_recovery.test | 2 + mysql-test/suite/innodb_gis/t/0.test | 2 + .../mariabackup/apply-log-only-incr.test | 2 + mysql-test/suite/parts/t/optimizer.test | 2 + .../perfschema/include/table_io_basic_dml.inc | 3 +- .../suite/perfschema/t/indexed_table_io.test | 2 + .../suite/perfschema/t/multi_table_io.test | 2 + .../suite/perfschema/t/query_cache.test | 2 + .../suite/perfschema/t/trigger_table_io.test | 2 + mysql-test/suite/plugins/t/qc_info.test | 2 + mysql-test/suite/plugins/t/qc_info_init.inc | 4 ++ mysql-test/suite/plugins/t/server_audit.test | 2 + .../suite/plugins/t/show_all_plugins.test | 2 + .../plugins/t/thread_pool_server_audit.test | 2 + .../suite/rpl/include/rpl_insert_id.test | 8 ++++ .../suite/rpl/include/rpl_mixing_engines.inc | 2 + .../suite/rpl/include/rpl_row_UUID.test | 2 + .../rpl/include/rpl_row_img_sequence.inc | 2 + .../suite/rpl/include/rpl_row_sp003.test | 2 + .../rpl/t/rpl_auto_increment_bug45679.test | 2 + mysql-test/suite/rpl/t/rpl_binlog_errors.test | 4 ++ mysql-test/suite/rpl/t/rpl_drop_db.test | 2 + mysql-test/suite/rpl/t/rpl_gtid_basic.test | 3 +- .../suite/rpl/t/rpl_loaddata_local.test | 12 ++++++ mysql-test/suite/rpl/t/rpl_loaddata_map.test | 2 + mysql-test/suite/rpl/t/rpl_loadfile.test | 2 + .../suite/rpl/t/rpl_misc_functions.test | 4 ++ .../suite/rpl/t/rpl_mix_found_rows.test | 2 + mysql-test/suite/rpl/t/rpl_parallel_seq.test | 2 + mysql-test/suite/rpl/t/rpl_row_func001.test | 2 + .../suite/rpl/t/rpl_slow_query_log.test | 2 + mysql-test/suite/rpl/t/rpl_sp.test | 2 + mysql-test/suite/rpl/t/rpl_sp_effects.test | 8 ++++ .../suite/rpl/t/rpl_stm_found_rows.test | 8 ++++ .../suite/rpl/t/rpl_switch_stm_row_mixed.test | 18 +++++++++ mysql-test/suite/rpl/t/rpl_variables.test | 3 +- mysql-test/suite/rpl/t/rpl_variables_stm.test | 2 + mysql-test/suite/rpl/t/rpl_view_multi.test | 2 + mysql-test/suite/rpl/t/sequence.test | 2 + mysql-test/suite/sql_sequence/alter.test | 2 + .../suite/sql_sequence/alter_notembedded.test | 2 + mysql-test/suite/sql_sequence/aria.test | 2 + .../suite/sql_sequence/auto_increment.test | 2 + mysql-test/suite/sql_sequence/binlog.test | 2 + .../suite/sql_sequence/concurrent_create.test | 2 + mysql-test/suite/sql_sequence/create.test | 2 + mysql-test/suite/sql_sequence/default.test | 4 ++ mysql-test/suite/sql_sequence/grant.test | 2 + mysql-test/suite/sql_sequence/gtid.test | 2 + mysql-test/suite/sql_sequence/next.test | 2 + mysql-test/suite/sql_sequence/other.test | 8 ++++ mysql-test/suite/sql_sequence/read_only.test | 2 + .../suite/sql_sequence/replication.test | 2 + .../suite/sql_sequence/replication_mixed.test | 2 + mysql-test/suite/sql_sequence/setval.test | 3 +- .../suite/sql_sequence/slave_nextval.test | 2 + mysql-test/suite/sql_sequence/temporary.test | 4 ++ mysql-test/suite/sql_sequence/view.test | 2 + .../sys_vars/t/group_concat_max_len_func.test | 8 +++- .../t/log_disabled_statements_func.test | 6 +++ .../t/log_slow_admin_statements_func.test | 2 + .../t/log_slow_disabled_statements_func.test | 2 + .../sys_vars/t/query_cache_limit_func.test | 2 + .../suite/sys_vars/t/secure_file_priv.test | 2 + .../sys_vars/t/sql_buffer_result_func.test | 4 ++ .../sys_vars/t/tmp_disk_table_size_func.test | 2 + mysql-test/suite/vcol/inc/vcol_trigger_sp.inc | 2 + mysql-test/suite/vcol/t/load_data.test | 2 + mysql-test/suite/vcol/t/vcol_keys_myisam.test | 2 + mysql-test/suite/vcol/t/wrong_arena.test | 3 ++ mysql-test/suite/versioning/t/foreign.test | 8 ++++ mysql-test/suite/versioning/t/load_data.test | 2 + mysql-test/suite/versioning/t/partition.test | 4 ++ .../mysql-test/connect/t/infoschema-9739.test | 2 + .../connect/t/infoschema2-9739.test | 2 + .../mysql-test/connect/t/json_udf.test | 2 + .../mysql-test/connect/t/json_udf_bin.test | 18 +++++++++ .../mysql-test/connect/t/mysql_exec.test | 2 + .../storage/t/fulltext_found_rows.test | 2 + ...n_count_skip_after_insert_multithread.test | 2 + ...count_skip_after_insert_single_thread.test | 2 + .../t/optimization_count_skip_disabled.test | 2 + .../t/optimization_count_skip_index_and.test | 2 + ...optimization_count_skip_index_between.test | 2 + .../optimization_count_skip_index_equal.test | 2 + ...ndex_full_text_search_in_boolean_mode.test | 2 + ..._text_search_in_natural_language_mode.test | 2 + ...optimization_count_skip_index_greater.test | 2 + ...zation_count_skip_index_greater_equal.test | 2 + .../t/optimization_count_skip_index_less.test | 2 + ...imization_count_skip_index_less_equal.test | 2 + ...timization_count_skip_index_not_equal.test | 2 + ...zation_count_skip_multiple_conditions.test | 2 + ...zation_count_skip_primary_key_between.test | 2 + ...mization_count_skip_primary_key_equal.test | 2 + ...zation_count_skip_primary_key_greater.test | 3 ++ ..._count_skip_primary_key_greater_equal.test | 2 + ...imization_count_skip_primary_key_less.test | 2 + ...ion_count_skip_primary_key_less_equal.test | 2 + ...tion_count_skip_primary_key_not_equal.test | 2 + ...on_order_limit_not_optimized_disabled.test | 2 + ...not_optimized_multiple_match_againsts.test | 2 + ...on_order_limit_not_optimized_no_limit.test | 2 + ...imization_order_limit_optimized_cp932.test | 2 + ...rder_limit_optimized_datetime_between.test | 2 + ...limit_optimized_datetime_between_over.test | 2 + ..._order_limit_optimized_datetime_equal.test | 2 + ...limit_optimized_datetime_greater_than.test | 2 + ...imized_datetime_greater_than_or_equal.test | 2 + ...er_limit_optimized_datetime_less_than.test | 2 + ...optimized_datetime_less_than_or_equal.test | 2 + ...optimized_duplicated_order_by_columns.test | 2 + ...ation_order_limit_optimized_enum_name.test | 2 + ...tion_order_limit_optimized_enum_value.test | 2 + ...rder_limit_optimized_have_primary_key.test | 2 + ...ion_order_limit_optimized_int_between.test | 2 + ...rder_limit_optimized_int_between_over.test | 2 + ...ation_order_limit_optimized_int_equal.test | 2 + ...rder_limit_optimized_int_greater_than.test | 2 + ...t_optimized_int_greater_than_or_equal.test | 2 + ...n_order_limit_optimized_int_less_than.test | 2 + ...imit_optimized_int_less_than_or_equal.test | 2 + ..._order_limit_optimized_no_primary_key.test | 2 + ...order_limit_optimized_no_where_clause.test | 2 + ...on_order_limit_optimized_order_by_asc.test | 2 + ...n_order_limit_optimized_order_by_desc.test | 2 + ...ion_order_limit_optimized_order_by_id.test | 2 + ...imit_optimized_order_by_match_against.test | 2 + ..._limit_optimized_select_match_against.test | 2 + ...on_order_limit_optimized_time_between.test | 2 + ...der_limit_optimized_time_between_over.test | 2 + ...tion_order_limit_optimized_time_equal.test | 2 + ...der_limit_optimized_time_greater_than.test | 2 + ..._optimized_time_greater_than_or_equal.test | 2 + ..._order_limit_optimized_time_less_than.test | 2 + ...mit_optimized_time_less_than_or_equal.test | 2 + ...it_optimized_varchar_equal_with_index.test | 2 + ...optimized_varchar_equal_without_index.test | 2 + ...on_order_limit_optimized_year_between.test | 2 + ...der_limit_optimized_year_between_over.test | 2 + ...tion_order_limit_optimized_year_equal.test | 2 + ...der_limit_optimized_year_greater_than.test | 2 + ..._optimized_year_greater_than_or_equal.test | 2 + ..._order_limit_optimized_year_less_than.test | 2 + ...mit_optimized_year_less_than_or_equal.test | 2 + ...le_enable_operations_recording_insert.test | 4 ++ ...ptimization_order_limit_TODO_SPLIT_ME.test | 2 + ...optimization_order_limit_no_direction.test | 2 + ...imization_order_limit_no_where_clause.test | 2 + ...tion_order_limit_order_by_primary_key.test | 2 + .../mysql-test/spider/bg/t/basic_sql.test | 2 + .../spider/bg/t/direct_aggregate.test | 2 + .../spider/bg/t/direct_aggregate_part.test | 2 + storage/spider/mysql-test/spider/bg/t/ha.test | 4 ++ .../mysql-test/spider/bg/t/spider_fixes.test | 6 +++ .../t/checksum_table_with_quick_mode_3.test | 2 + .../spider/bugfix/t/cp932_column.test | 2 + .../bugfix/t/delete_with_float_column.inc | 2 + .../bugfix/t/direct_sql_with_comma_pwd.test | 2 + .../bugfix/t/direct_sql_with_tmp_table.test | 2 + .../bugfix/t/group_by_order_by_limit.test | 2 + .../spider/bugfix/t/mdev_19866.test | 2 + .../spider/bugfix/t/mdev_20100.test | 4 ++ .../spider/bugfix/t/mdev_20502.test | 2 + .../spider/bugfix/t/mdev_21884.test | 4 ++ .../spider/bugfix/t/mdev_27172.test | 2 + .../spider/bugfix/t/quick_mode_0.test | 2 + .../spider/bugfix/t/quick_mode_1.test | 2 + .../spider/bugfix/t/quick_mode_2.test | 2 + .../spider/bugfix/t/quick_mode_3.test | 2 + .../bugfix/t/return_found_rows_insert.test | 6 +++ .../bugfix/t/return_found_rows_update.test | 2 + .../spider/bugfix/t/select_by_null.test | 2 + .../bugfix/t/select_with_backquote.test | 2 + .../spider/bugfix/t/slave_trx_isolation.test | 3 ++ .../mysql-test/spider/bugfix/t/sql_mode.inc | 2 + .../spider/bugfix/t/wrapper_mariadb.test | 2 + .../mysql-test/spider/bugfix/t/xa_cmd.test | 2 + .../feature/t/checksum_table_parallel.inc | 2 + .../spider/handler/t/basic_sql.test | 2 + .../spider/handler/t/direct_aggregate.test | 2 + .../handler/t/direct_aggregate_part.test | 2 + .../mysql-test/spider/handler/t/ha.test | 4 ++ .../spider/handler/t/spider_fixes.test | 7 +++- .../mysql-test/spider/oracle/t/basic_sql.test | 2 + .../spider/oracle/t/direct_aggregate.test | 2 + .../oracle/t/direct_aggregate_part.test | 2 + .../spider/mysql-test/spider/oracle/t/ha.test | 4 ++ .../spider/oracle/t/spider_fixes.test | 6 +++ .../spider/oracle2/t/basic_sql.test | 2 + .../spider/oracle2/t/direct_aggregate.test | 2 + .../oracle2/t/direct_aggregate_part.test | 2 + .../mysql-test/spider/oracle2/t/ha.test | 4 ++ .../spider/oracle2/t/spider_fixes.test | 6 +++ .../e1121/t/direct_join_by_pkey_key.test | 2 + .../e1121/t/direct_join_by_pkey_pkey.test | 2 + .../spider/regression/e1121/t/load_data.inc | 6 +++ .../e112122/t/group_by_order_by_limit_ok.test | 2 + .../regression/e112122/t/load_data_part.inc | 6 +++ .../mysql-test/spider/t/auto_increment.test | 2 + .../spider/mysql-test/spider/t/basic_sql.test | 2 + .../t/checksum_table_with_quick_mode_3.test | 2 + .../mysql-test/spider/t/direct_aggregate.test | 2 + .../spider/t/direct_aggregate_part.test | 2 + .../mysql-test/spider/t/direct_join.test | 4 ++ .../spider/t/direct_join_using.test | 2 + .../mysql-test/spider/t/direct_left_join.test | 2 + .../spider/t/direct_left_join_nullable.test | 2 + .../t/direct_left_right_join_nullable.test | 2 + .../direct_left_right_left_join_nullable.test | 2 + .../spider/t/direct_right_join.test | 2 + .../spider/t/direct_right_join_nullable.test | 2 + .../t/direct_right_left_join_nullable.test | 2 + ...direct_right_left_right_join_nullable.test | 2 + storage/spider/mysql-test/spider/t/ha.test | 4 ++ .../spider/t/partition_cond_push.test | 2 + .../spider/t/partition_fulltext.test | 2 + ...on_join_pushdown_for_single_partition.test | 2 + .../mysql-test/spider/t/partition_mrr.test | 2 + .../spider/t/pushdown_not_like.test | 3 +- .../mysql-test/spider/t/quick_mode_0.test | 6 +++ .../mysql-test/spider/t/quick_mode_1.test | 6 +++ .../mysql-test/spider/t/quick_mode_2.test | 6 +++ .../mysql-test/spider/t/quick_mode_3.test | 6 +++ .../spider/t/slave_trx_isolation.test | 2 + .../mysql-test/spider/t/spider_fixes.test | 6 +++ .../spider/mysql-test/spider/t/timestamp.test | 14 +++++++ .../mysql-test/spider/t/udf_pushdown.inc | 2 + .../rpl_tests/rpl_parallel_load_tokudb.test | 5 ++- .../mysql-test/tokudb/t/ext_key_1_innodb.test | 2 + .../mysql-test/tokudb/t/ext_key_1_tokudb.test | 2 + .../mysql-test/tokudb/t/ext_key_2_innodb.test | 2 + .../mysql-test/tokudb/t/ext_key_2_tokudb.test | 2 + .../mysql-test/tokudb/t/savepoint-3.test | 4 ++ .../mysql-test/tokudb/t/type_datetime.test | 2 + .../mysql-test/tokudb/t/type_newdecimal.test | 2 + .../mysql-test/tokudb_bugs/t/PS-3773.test | 2 + .../mysql-test/tokudb_bugs/t/simple_icp.test | 2 + 400 files changed, 1339 insertions(+), 42 deletions(-) diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 6558436bbca..3dcbd3c69e5 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -116,7 +116,7 @@ static my_bool opt_compress= 0, silent= 0, verbose= 0; static my_bool debug_info_flag= 0, debug_check_flag= 0; static my_bool tty_password= 0; static my_bool opt_mark_progress= 0; -static my_bool ps_protocol= 0, ps_protocol_enabled= 0; +static my_bool ps_protocol= 0, ps_protocol_enabled= 0, ps2_protocol_enabled= 0; static my_bool sp_protocol= 0, sp_protocol_enabled= 0; static my_bool view_protocol= 0, view_protocol_enabled= 0; static my_bool service_connection_enabled= 1; @@ -157,6 +157,7 @@ static struct property prop_list[] = { { &display_session_track_info, 0, 1, 1, "$ENABLED_STATE_CHANGE_INFO" }, { &display_metadata, 0, 0, 0, "$ENABLED_METADATA" }, { &ps_protocol_enabled, 0, 0, 0, "$ENABLED_PS_PROTOCOL" }, + { &ps2_protocol_enabled, 0, 0, 0, "$ENABLED_PS2_PROTOCOL" }, { &view_protocol_enabled, 0, 0, 0, "$ENABLED_VIEW_PROTOCOL"}, { &service_connection_enabled, 0, 1, 0, "$ENABLED_SERVICE_CONNECTION"}, { &disable_query_log, 0, 0, 1, "$ENABLED_QUERY_LOG" }, @@ -173,6 +174,7 @@ enum enum_prop { P_SESSION_TRACK, P_META, P_PS, + P_PS2, P_VIEW, P_CONN, P_QUERY, @@ -263,6 +265,7 @@ static size_t suite_dir_len, overlay_dir_len; /* Precompiled re's */ static regex_t ps_re; /* the query can be run using PS protocol */ +static regex_t ps2_re; /* the query can be run using PS protocol with second execution*/ static regex_t sp_re; /* the query can be run as a SP */ static regex_t view_re; /* the query can be run as a view*/ @@ -381,6 +384,7 @@ enum enum_commands { Q_LOWERCASE, Q_START_TIMER, Q_END_TIMER, Q_CHARACTER_SET, Q_DISABLE_PS_PROTOCOL, Q_ENABLE_PS_PROTOCOL, + Q_DISABLE_PS2_PROTOCOL, Q_ENABLE_PS2_PROTOCOL, Q_DISABLE_VIEW_PROTOCOL, Q_ENABLE_VIEW_PROTOCOL, Q_DISABLE_SERVICE_CONNECTION, Q_ENABLE_SERVICE_CONNECTION, Q_ENABLE_NON_BLOCKING_API, Q_DISABLE_NON_BLOCKING_API, @@ -474,6 +478,8 @@ const char *command_names[]= "character_set", "disable_ps_protocol", "enable_ps_protocol", + "disable_ps2_protocol", + "enable_ps2_protocol", "disable_view_protocol", "enable_view_protocol", "disable_service_connection", @@ -8347,6 +8353,19 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, } #endif + /* + Execute the query first time if second execution enable + */ + if(ps2_protocol_enabled && match_re(&ps2_re, query)) + { + if (do_stmt_execute(cn)) + { + handle_error(command, mysql_stmt_errno(stmt), + mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds); + goto end; + } + } + /* Execute the query */ @@ -9298,6 +9317,13 @@ void init_re(void) "[[:space:]]*UNINSTALL[[:space:]]+|" "[[:space:]]*UPDATE[[:space:]]" ")"; + /* + Filter for queries that can be run for second + execution of prepare statement + */ + const char *ps2_re_str = + "^(" + "[[:space:]]*SELECT[[:space:]])"; /* Filter for queries that can be run using the @@ -9313,6 +9339,7 @@ void init_re(void) "[[:space:]]*SELECT[[:space:]])"; init_re_comp(&ps_re, ps_re_str); + init_re_comp(&ps2_re, ps2_re_str); init_re_comp(&sp_re, sp_re_str); init_re_comp(&view_re, view_re_str); } @@ -9349,6 +9376,7 @@ int match_re(regex_t *re, char *str) void free_re(void) { regfree(&ps_re); + regfree(&ps2_re); regfree(&sp_re); regfree(&view_re); } @@ -9700,6 +9728,9 @@ int main(int argc, char **argv) if (cursor_protocol) ps_protocol= 1; + /* Enable second execution of SELECT for ps-protocol + if ps-protocol is used */ + ps2_protocol_enabled= ps_protocol; ps_protocol_enabled= ps_protocol; sp_protocol_enabled= sp_protocol; view_protocol_enabled= view_protocol; @@ -10127,6 +10158,12 @@ int main(int argc, char **argv) case Q_ENABLE_PS_PROTOCOL: set_property(command, P_PS, ps_protocol); break; + case Q_DISABLE_PS2_PROTOCOL: + set_property(command, P_PS2, 0); + break; + case Q_ENABLE_PS2_PROTOCOL: + set_property(command, P_PS2, ps_protocol); + break; case Q_DISABLE_VIEW_PROTOCOL: set_property(command, P_VIEW, 0); /* Close only util connections */ diff --git a/mysql-test/include/column_compression_rpl.inc b/mysql-test/include/column_compression_rpl.inc index 7c8931a491f..e2bb5bbbf42 100644 --- a/mysql-test/include/column_compression_rpl.inc +++ b/mysql-test/include/column_compression_rpl.inc @@ -1,4 +1,6 @@ +--disable_ps2_protocol + --connection slave SET @saved_slave_type_conversions = @@slave_type_conversions; @@ -257,4 +259,4 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS = @saved_slave_type_conversions; DROP TABLE t1,t2; --sync_slave_with_master - +--enable_ps2_protocol diff --git a/mysql-test/include/commit.inc b/mysql-test/include/commit.inc index 1844a5320f7..e08942d05fe 100644 --- a/mysql-test/include/commit.inc +++ b/mysql-test/include/commit.inc @@ -6,6 +6,7 @@ ## - $engine_type should be set ## +--disable_ps2_protocol set sql_mode=no_engine_substitution; eval set default_storage_engine = $engine_type; set autocommit=1; @@ -782,3 +783,4 @@ call p_verify_status_increment(0, 0, 0, 0); drop table t1, t2, t3; drop procedure p_verify_status_increment; drop function f1; +--enable_ps2_protocol diff --git a/mysql-test/include/ctype_numconv.inc b/mysql-test/include/ctype_numconv.inc index da87d946d9c..065aca0873a 100644 --- a/mysql-test/include/ctype_numconv.inc +++ b/mysql-test/include/ctype_numconv.inc @@ -463,6 +463,7 @@ select * from t1; show create table t1; drop table t1; +--disable_ps2_protocol # Ensure that row_count() value is reset after drop table. select 1; select hex(concat(row_count())); @@ -474,6 +475,7 @@ select hex(concat(found_rows())); create table t1 as select concat(found_rows()) as c1; show create table t1; drop table t1; +--enable_ps2_protocol create table t1 as select concat(uuid_short()) as c1; show create table t1; diff --git a/mysql-test/include/diff_tables.inc b/mysql-test/include/diff_tables.inc index a29156cfce9..a566a4d79c2 100644 --- a/mysql-test/include/diff_tables.inc +++ b/mysql-test/include/diff_tables.inc @@ -165,9 +165,11 @@ while ($_dt_tables) # Now that we have the comma-separated list of columns, we can write # the table to a file. + --disable_ps2_protocol --let $_dt_outfile= `SELECT @@datadir` --let $_dt_outfile= $_dt_outfile/diff_table-$_dt_connection-$_dt_database-$_dt_table eval SELECT * INTO OUTFILE '$_dt_outfile' FROM $_dt_database.$_dt_table ORDER BY `$_dt_column_list`; + --enable_ps2_protocol # Compare files. if ($_dt_prev_outfile) diff --git a/mysql-test/include/explain_utils.inc b/mysql-test/include/explain_utils.inc index 4333319c364..d729be94f49 100644 --- a/mysql-test/include/explain_utils.inc +++ b/mysql-test/include/explain_utils.inc @@ -26,6 +26,7 @@ --echo # query: $query --echo # select: $select --echo # +--disable_ps2_protocol --disable_view_protocol if ($select) { --disable_query_log @@ -160,3 +161,4 @@ SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR --echo --enable_view_protocol +--enable_ps2_protocol diff --git a/mysql-test/include/function_defaults.inc b/mysql-test/include/function_defaults.inc index 23822aa24dc..4ecc16bc36d 100644 --- a/mysql-test/include/function_defaults.inc +++ b/mysql-test/include/function_defaults.inc @@ -824,6 +824,7 @@ eval CREATE TABLE t2 ( i $datetime DEFAULT $current_timestamp ON UPDATE $current_timestamp NOT NULL ); +--disable_ps2_protocol SELECT 1 INTO OUTFILE 't3.dat' FROM dual; SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL @@ -831,6 +832,7 @@ INTO OUTFILE 't4.dat' FROM dual; SELECT 1, 2 INTO OUTFILE 't5.dat' FROM dual; +--enable_ps2_protocol --echo # Mon Aug 1 15:11:19 2011 UTC SET TIMESTAMP = 1312211479.918273; @@ -929,9 +931,11 @@ remove_file $MYSQLD_DATADIR/test/t5.dat; --echo # Mon Aug 1 15:11:19 2011 UTC SET TIMESTAMP = 1312211479.089786; +--disable_ps2_protocol SELECT 1 INTO OUTFILE "file1.dat" FROM dual; SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL INTO OUTFILE "file2.dat" FROM dual; +--enable_ps2_protocol --echo # Too short row diff --git a/mysql-test/include/grant_cache.inc b/mysql-test/include/grant_cache.inc index 467c1170563..69c520c3e61 100644 --- a/mysql-test/include/grant_cache.inc +++ b/mysql-test/include/grant_cache.inc @@ -54,6 +54,8 @@ set GLOBAL query_cache_type=ON; set LOCAL query_cache_type=ON; set GLOBAL query_cache_size=1355776; +--disable_ps2_protocol + reset query cache; flush status; connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK); @@ -171,6 +173,8 @@ show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; show status like "Qcache_not_cached"; +--enable_ps2_protocol + # Cleanup connection root; diff --git a/mysql-test/include/icp_tests.inc b/mysql-test/include/icp_tests.inc index 66fdc3e754c..965a4a5f5d2 100644 --- a/mysql-test/include/icp_tests.inc +++ b/mysql-test/include/icp_tests.inc @@ -869,6 +869,7 @@ SET optimizer_switch=@save_optimizer_switch; DROP TABLE t1,t2; +--disable_ps2_protocol --echo # check "Handler_pushed" status varuiables CREATE TABLE t1 ( c1 CHAR(1), @@ -890,6 +891,7 @@ SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ; show status like "Handler_icp%"; DROP TABLE t1; +--enable_ps2_protocol # # MDEV-308 lp:1008516 - Failing assertion: templ->mysql_col_len == len diff --git a/mysql-test/include/query_cache.inc b/mysql-test/include/query_cache.inc index cd99cac799c..a75e5a9c5a7 100644 --- a/mysql-test/include/query_cache.inc +++ b/mysql-test/include/query_cache.inc @@ -14,6 +14,7 @@ # old name was innodb_cache.test # main code went into include/query_cache.inc # +--disable_ps2_protocol --disable_view_protocol SET global query_cache_type=ON; SET local query_cache_type=ON; @@ -192,3 +193,4 @@ drop table t2; SET global query_cache_type=default; --enable_view_protocol +--enable_ps2_protocol diff --git a/mysql-test/include/query_cache_partitions.inc b/mysql-test/include/query_cache_partitions.inc index d97d9db27b0..c6d97a508f0 100644 --- a/mysql-test/include/query_cache_partitions.inc +++ b/mysql-test/include/query_cache_partitions.inc @@ -44,13 +44,14 @@ flush status; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; - +--disable_ps2_protocol SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--enable_ps2_protocol drop table t1; @@ -79,12 +80,14 @@ flush status; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--disable_ps2_protocol SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--enable_ps2_protocol drop table t1; @@ -114,6 +117,7 @@ INSERT INTO t1 VALUES (1, now(), 0); show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--disable_ps2_protocol BEGIN; UPDATE `t1` SET `cool` = 1 WHERE `id` = 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; @@ -126,6 +130,7 @@ SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--enable_ps2_protocol drop table t1; diff --git a/mysql-test/include/query_cache_sql_prepare.inc b/mysql-test/include/query_cache_sql_prepare.inc index 1bc7c94a172..978213777a4 100644 --- a/mysql-test/include/query_cache_sql_prepare.inc +++ b/mysql-test/include/query_cache_sql_prepare.inc @@ -23,6 +23,8 @@ set GLOBAL query_cache_type=ON; set LOCAL query_cache_type=ON; +--disable_ps2_protocol + connect (con1,localhost,root,,test,$MASTER_MYPORT,); connection default; @@ -252,6 +254,7 @@ set @a=10; execute stmt1 using @a; show status like 'Qcache_hits'; +--enable_ps2_protocol drop table t1; disconnect con1; diff --git a/mysql-test/include/test_outfile.inc b/mysql-test/include/test_outfile.inc index b67e67a4dd4..e50847b67a3 100644 --- a/mysql-test/include/test_outfile.inc +++ b/mysql-test/include/test_outfile.inc @@ -1 +1,3 @@ +--disable_ps2_protocol eval select "Outfile OK" into outfile "$MYSQLTEST_VARDIR/tmp/outfile.test"; +--enable_ps2_protocol diff --git a/mysql-test/include/type_temporal_zero_default.inc b/mysql-test/include/type_temporal_zero_default.inc index 500d25ea18f..6553bfb6d86 100644 --- a/mysql-test/include/type_temporal_zero_default.inc +++ b/mysql-test/include/type_temporal_zero_default.inc @@ -34,8 +34,10 @@ SET sql_mode=DEFAULT; --eval CREATE TABLE t1 (a $type DEFAULT $defval, b $type DEFAULT $defval) --eval INSERT INTO t1 VALUES (DEFAULT,DEFAULT); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT a INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/mdev-7824.txt' FROM t1 DELETE FROM t1; +--enable_ps2_protocol SET sql_mode=TRADITIONAL; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --error ER_INVALID_DEFAULT_VALUE_FOR_FIELD diff --git a/mysql-test/include/write_var_to_file.inc b/mysql-test/include/write_var_to_file.inc index 7982c6fab31..58bdac6f09e 100644 --- a/mysql-test/include/write_var_to_file.inc +++ b/mysql-test/include/write_var_to_file.inc @@ -46,7 +46,9 @@ if (`SELECT LENGTH(@@secure_file_priv) > 0`) --let $_wvtf_suffix= `SELECT UUID()` --let $_wvtf_tmp_file= $MYSQLTEST_VARDIR/_wvtf_$_wvtf_suffix + --disable_ps2_protocol --eval SELECT '$write_var' INTO DUMPFILE '$_wvtf_tmp_file' + --enable_ps2_protocol --copy_file $_wvtf_tmp_file $write_to_file --remove_file $_wvtf_tmp_file } diff --git a/mysql-test/main/analyze_stmt_slow_query_log.test b/mysql-test/main/analyze_stmt_slow_query_log.test index 44865b652cb..268203078f8 100644 --- a/mysql-test/main/analyze_stmt_slow_query_log.test +++ b/mysql-test/main/analyze_stmt_slow_query_log.test @@ -19,7 +19,9 @@ SET @@global.slow_query_log = ON; create table t1 (a int); INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +--disable_ps2_protocol select * from t1 where a<3; +--enable_ps2_protocol drop table t1; let SLOW_LOG_FILE= `select @@slow_query_log_file`; diff --git a/mysql-test/main/auto_increment_ranges_innodb.test b/mysql-test/main/auto_increment_ranges_innodb.test index aaa64e2d6f9..3abd8d4d482 100644 --- a/mysql-test/main/auto_increment_ranges_innodb.test +++ b/mysql-test/main/auto_increment_ranges_innodb.test @@ -11,7 +11,9 @@ set default_storage_engine=innodb; # create table t1 (pk int auto_increment primary key, f varchar(20)); insert t1 (f) values ('a'), ('b'), ('c'), ('d'); +--disable_ps2_protocol select null, f into outfile 'load.data' from t1 limit 1; +--enable_ps2_protocol load data infile 'load.data' into table t1; insert t1 (f) values ('<==='); select * from t1; diff --git a/mysql-test/main/bootstrap.test b/mysql-test/main/bootstrap.test index 8eee907e166..b334db504f9 100644 --- a/mysql-test/main/bootstrap.test +++ b/mysql-test/main/bootstrap.test @@ -45,7 +45,9 @@ remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_error.sql; --echo # --disable_query_log create table t1 select 2 as a, concat(repeat('MySQL', @@max_allowed_packet/10), ';') as b; +--disable_ps2_protocol eval select * into outfile '$MYSQLTEST_VARDIR/tmp/long_query.sql' from t1; +--enable_ps2_protocol --enable_query_log --source include/kill_mysqld.inc --error 1 diff --git a/mysql-test/main/bug39022.test b/mysql-test/main/bug39022.test index d293788e58e..2431a76ec25 100644 --- a/mysql-test/main/bug39022.test +++ b/mysql-test/main/bug39022.test @@ -6,6 +6,7 @@ --echo # Bug #39022: Mysql randomly crashing in lock_sec_rec_cons_read_sees --echo # +--disable_ps2_protocol call mtr.add_suppression("Deadlock found when trying to get lock; try restarting transaction"); CREATE TABLE t1(a TINYINT NOT NULL,b TINYINT,PRIMARY KEY(b)) ENGINE=innodb; @@ -56,3 +57,4 @@ disconnect thread1; connection default; DROP TABLE t1,t2; +--enable_ps2_protocol diff --git a/mysql-test/main/cast.test b/mysql-test/main/cast.test index 025b5fa717d..073b5fe0be5 100644 --- a/mysql-test/main/cast.test +++ b/mysql-test/main/cast.test @@ -402,9 +402,11 @@ SET @@GLOBAL.max_allowed_packet=2048; # reconnect to make the new max packet size take effect --connect (newconn, localhost, root,,) +--disable_ps2_protocol SELECT CONVERT('a', BINARY(2049)); SELECT CONVERT('a', CHAR(2049)); SELECT length(CONVERT(repeat('a',2048), CHAR(2049))); +--enable_ps2_protocol connection default; disconnect newconn; diff --git a/mysql-test/main/check_constraint.test b/mysql-test/main/check_constraint.test index 194fdc04399..cfdddcab3a1 100644 --- a/mysql-test/main/check_constraint.test +++ b/mysql-test/main/check_constraint.test @@ -172,7 +172,10 @@ insert t1 (b) values (1); insert t1 (b) values (10); select * from t1 where a is null; set sql_auto_is_null=1; +#Enable after fix MDEV-31307 +--disable_ps2_protocol select * from t1 where a is null; +--enable_ps2_protocol --error ER_CONSTRAINT_FAILED insert t1 (b) values (1); drop table t1; diff --git a/mysql-test/main/column_compression.inc b/mysql-test/main/column_compression.inc index 89a96ef67ad..13952b739ae 100644 --- a/mysql-test/main/column_compression.inc +++ b/mysql-test/main/column_compression.inc @@ -8,6 +8,8 @@ eval CREATE TABLE t1(a $typec); ALTER TABLE t1 ADD KEY(a(10)); SHOW CREATE TABLE t1; +--disable_ps2_protocol + --echo # Make sure column was actually compressed INSERT INTO t1 VALUES(REPEAT('a', 1000)); SELECT LEFT(a, 10), LENGTH(a) FROM t1; @@ -94,6 +96,8 @@ SELECT * FROM t1 ORDER BY a; SELECT a+1 FROM t1 ORDER BY 1; SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME IN('Column_compressions', 'Column_decompressions'); +--enable_ps2_protocol + DROP TABLE t1; --echo # diff --git a/mysql-test/main/count_distinct2.test b/mysql-test/main/count_distinct2.test index 95086ad04aa..f5d16527af3 100644 --- a/mysql-test/main/count_distinct2.test +++ b/mysql-test/main/count_distinct2.test @@ -48,6 +48,7 @@ select count(distinct n1), count(distinct n2) from t1; select count(distinct n2), n1 from t1 group by n1; drop table t1; +--disable_ps2_protocol # test the conversion from tree to MyISAM create table t1 (n int default NULL); let $1=5000; @@ -82,5 +83,6 @@ flush status; select count(distinct s) from t1; show status like 'Created_tmp_disk_tables'; drop table t1; +--enable_ps2_protocol # End of 4.1 tests diff --git a/mysql-test/main/ctype_big5.test b/mysql-test/main/ctype_big5.test index c859670169c..96559db20f9 100644 --- a/mysql-test/main/ctype_big5.test +++ b/mysql-test/main/ctype_big5.test @@ -77,7 +77,9 @@ select hex(convert(_big5 0xC84041 using ucs2)); set names big5; create table t1 (a blob); insert into t1 values (0xEE00); +--disable_ps2_protocol select * into outfile 'test/t1.txt' from t1; +--enable_ps2_protocol delete from t1; let $MYSQLD_DATADIR= `select @@datadir`; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR diff --git a/mysql-test/main/ctype_ucs.test b/mysql-test/main/ctype_ucs.test index 9bff79abe22..62653e3902f 100644 --- a/mysql-test/main/ctype_ucs.test +++ b/mysql-test/main/ctype_ucs.test @@ -75,7 +75,9 @@ DROP TABLE t1; --echo # Problem # 1 (original report): wrong parsing of ucs2 data SET character_set_connection=ucs2; +--disable_ps2_protocol SELECT '00' UNION SELECT '10' INTO OUTFILE 'tmpp.txt'; +--enable_ps2_protocol CREATE TABLE t1(a INT); LOAD DATA INFILE 'tmpp.txt' INTO TABLE t1 CHARACTER SET ucs2 (@b) SET a=REVERSE(@b); @@ -86,9 +88,10 @@ DROP TABLE t1; let $MYSQLD_DATADIR= `select @@datadir`; remove_file $MYSQLD_DATADIR/test/tmpp.txt; - +--disable_ps2_protocol --echo # Problem # 2 : if you write and read ucs2 data to a file they're lost SELECT '00' UNION SELECT '10' INTO OUTFILE 'tmpp2.txt' CHARACTER SET ucs2; +--enable_ps2_protocol CREATE TABLE t1(a INT); LOAD DATA INFILE 'tmpp2.txt' INTO TABLE t1 CHARACTER SET ucs2 (@b) SET a=REVERSE(@b); diff --git a/mysql-test/main/custom_aggregate_functions.test b/mysql-test/main/custom_aggregate_functions.test index 78374684290..a6097b37847 100644 --- a/mysql-test/main/custom_aggregate_functions.test +++ b/mysql-test/main/custom_aggregate_functions.test @@ -19,7 +19,9 @@ create table t1 (sal int(10),id int(10)); INSERT INTO t1 (sal,id) VALUES (5000,1); INSERT INTO t1 (sal,id) VALUES (2000,1); INSERT INTO t1 (sal,id) VALUES (1000,1); +--disable_ps2_protocol select f1(sal) from t1 where id>= 1; +--enable_ps2_protocol select * from t2; drop table t2; drop function f1; @@ -96,9 +98,12 @@ end| delimiter ;| +#Check after fix MDEV-31281 +--disable_ps2_protocol select f1(10); select f1(sal) from t1; select f1(sal) from t1 where 1=0; +--enable_ps2_protocol drop function f1; delimiter |; diff --git a/mysql-test/main/custom_aggregates_i_s.test b/mysql-test/main/custom_aggregates_i_s.test index c6b195f7974..adcaedc3a68 100644 --- a/mysql-test/main/custom_aggregates_i_s.test +++ b/mysql-test/main/custom_aggregates_i_s.test @@ -3,6 +3,8 @@ --source include/default_optimizer_switch.inc +--disable_ps2_protocol + flush status; show status like "%custom_aggregate%"; create table t2 (sal int(10)); @@ -73,6 +75,8 @@ with agg_sum as ( select * from agg_sum; show status like "%custom_aggregate%"; +--enable_ps2_protocol + drop table t2,t1,t3; drop function f1; drop function f2; diff --git a/mysql-test/main/debug_sync.test b/mysql-test/main/debug_sync.test index 89414939f59..8ac4e1054dd 100644 --- a/mysql-test/main/debug_sync.test +++ b/mysql-test/main/debug_sync.test @@ -381,6 +381,7 @@ DROP TABLE IF EXISTS t1; --enable_warnings # # Test. +--disable_ps2_protocol CREATE TABLE t1 (c1 INT) ENGINE=MyISAM; INSERT INTO t1 VALUES (1); SELECT GET_LOCK('mysqltest_lock', 100); @@ -417,6 +418,7 @@ disconnect con1; disconnect con2; connection default; DROP TABLE t1; +--enable_ps2_protocol # # Cleanup after test case. diff --git a/mysql-test/main/delete.test b/mysql-test/main/delete.test index 6d898ec769d..0b0e7ce4019 100644 --- a/mysql-test/main/delete.test +++ b/mysql-test/main/delete.test @@ -451,6 +451,7 @@ DELETE t1 FROM db1.t1, db2.t1; # Test multiple-table cross database deletes +--disable_ps2_protocol DELETE t1 FROM db1.t2 AS t1, db2.t2 AS t2 WHERE t2.a = 1 AND t1.a = t2.a; SELECT ROW_COUNT(); CALL count_rows(); @@ -462,6 +463,7 @@ DROP DATABASE db1; DROP DATABASE db2; DROP PROCEDURE count_rows; DROP TABLE t1, t2; +--enable_ps2_protocol --echo # --echo # Bug#46958: Assertion in Diagnostics_area::set_ok_status, trigger, diff --git a/mysql-test/main/derived.test b/mysql-test/main/derived.test index dca7243febb..374dc9b052f 100644 --- a/mysql-test/main/derived.test +++ b/mysql-test/main/derived.test @@ -896,11 +896,14 @@ select distinct t1.id, tt.id, tt.data (select t1.id, 'yes' as data from t1) as tt on t1.id = tt.id; +#Check after fix MDEV-31277 +--disable_ps2_protocol select distinct t1.id, tt.id, tt.data from t1 left join (select t1.id, 'yes' as data from t1 where id > 1) as tt on t1.id = tt.id; +--enable_ps2_protocol drop table t1; diff --git a/mysql-test/main/derived_cond_pushdown.test b/mysql-test/main/derived_cond_pushdown.test index fa22ba9513b..05032fb94a4 100644 --- a/mysql-test/main/derived_cond_pushdown.test +++ b/mysql-test/main/derived_cond_pushdown.test @@ -1895,9 +1895,9 @@ DELIMITER ;$$ CALL p1('a'); DROP PROCEDURE p1; - +--disable_ps2_protocol SELECT a FROM (SELECT "aa" a) t WHERE REGEXP_INSTR(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1)); - +--enable_ps2_protocol DELIMITER $$; CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT diff --git a/mysql-test/main/derived_view.test b/mysql-test/main/derived_view.test index 5422fbcfd1d..1ff06e89aa6 100644 --- a/mysql-test/main/derived_view.test +++ b/mysql-test/main/derived_view.test @@ -42,6 +42,7 @@ explain extended select * from (select * from t1 where f1 in (2,3)) tt join (select * from t1 where f1 in (1,2)) aa on tt.f1=aa.f1; +--disable_ps2_protocol flush status; explain extended select * from (select * from t1 where f1 in (2,3)) tt where f11=2; @@ -49,6 +50,7 @@ show status like 'Handler_read%'; flush status; select * from (select * from t1 where f1 in (2,3)) tt where f11=2; show status like 'Handler_read%'; +--enable_ps2_protocol --echo for merged views create view v1 as select * from t1; @@ -69,6 +71,7 @@ explain extended select * from v3 join v4 on f1=f2; select * from v3 join v4 on f1=f2; +--disable_ps2_protocol flush status; explain extended select * from v4 where f2 in (1,3); show status like 'Handler_read%'; @@ -91,6 +94,7 @@ show status like 'Handler_read%'; flush status; select * from t1 join (select * from t2 group by f2) tt on f1=f2; show status like 'Handler_read%'; +--enable_ps2_protocol --echo for materialized views drop view v1,v2,v3; @@ -106,6 +110,7 @@ explain extended select * from t1 join v2 on f1=f2; select * from t1 join v2 on f1=f2; explain extended select * from t1,v3 as v31,v3 where t1.f1=v31.f1 and t1.f1=v3.f1; +--disable_ps2_protocol flush status; select * from t1,v3 as v31,v3 where t1.f1=v31.f1 and t1.f1=v3.f1; show status like 'Handler_read%'; @@ -116,6 +121,7 @@ show status like 'Handler_read%'; flush status; select * from t1 join v2 on f1=f2; show status like 'Handler_read%'; +--enable_ps2_protocol explain extended select * from v1 join v4 on f1=f2; explain format=json select * from v1 join v4 on f1=f2; @@ -159,6 +165,7 @@ join (select * from (select * from t1 where f1 < 7 group by f1) tt where f1 > 2) z on x.f1 = z.f1; +--disable_ps2_protocol flush status; select * from (select * from (select * from t1 where f1 < 7 group by f1) tt where f1 > 2) x @@ -167,6 +174,7 @@ join on x.f1 = z.f1; show status like 'Handler_read%'; flush status; +--enable_ps2_protocol --echo merged in merged derived join merged in merged derived explain extended select * from diff --git a/mysql-test/main/distinct.test b/mysql-test/main/distinct.test index 122034885bd..cd0092f864e 100644 --- a/mysql-test/main/distinct.test +++ b/mysql-test/main/distinct.test @@ -494,14 +494,18 @@ DROP TABLE IF EXISTS t2; CREATE TABLE t2 (fruit_id INT NOT NULL, fruit_name varchar(20) default NULL); +--disable_ps2_protocol SELECT DISTINCT fruit_id, fruit_name INTO OUTFILE '../../tmp/data1.tmp' FROM t1 WHERE fruit_name = 'APPLE'; +--enable_ps2_protocol LOAD DATA INFILE '../../tmp/data1.tmp' INTO TABLE t2; --error 0,1 --remove_file $MYSQLTEST_VARDIR/tmp/data1.tmp +--disable_ps2_protocol SELECT DISTINCT @v19:= fruit_id, @v20:= fruit_name INTO OUTFILE '../../tmp/data2.tmp' FROM t1 WHERE fruit_name = 'APPLE'; +--enable_ps2_protocol LOAD DATA INFILE '../../tmp/data2.tmp' INTO TABLE t2; --remove_file $MYSQLTEST_VARDIR/tmp/data2.tmp diff --git a/mysql-test/main/empty_table.test b/mysql-test/main/empty_table.test index 754671868ba..ad529483113 100644 --- a/mysql-test/main/empty_table.test +++ b/mysql-test/main/empty_table.test @@ -7,9 +7,11 @@ drop table if exists t1; --enable_warnings create table t1 (nr int(5) not null auto_increment,b blob,str char(10), primary key (nr)); +--disable_ps2_protocol select count(*) from t1; select * from t1; select * from t1 limit 0; +--enable_ps2_protocol show status like "Empty_queries"; drop table t1; @@ -17,8 +19,10 @@ drop table t1; # Accessing a non existing table should not increase Empty_queries # +--disable_ps2_protocol --error 1146 select * from t2; +--enable_ps2_protocol show status like "Empty_queries"; # End of 4.1 tests diff --git a/mysql-test/main/error_simulation.test b/mysql-test/main/error_simulation.test index 2c155bc9a22..c4e2d442727 100644 --- a/mysql-test/main/error_simulation.test +++ b/mysql-test/main/error_simulation.test @@ -80,10 +80,12 @@ SET optimizer_switch='outer_join_with_cache=off'; SET SESSION debug_dbug= '+d,only_one_Unique_may_be_created'; +--disable_ps2_protocol --replace_column 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON ( t2.a < 10 OR t2.b < 10 ); SELECT * FROM t1 LEFT JOIN t2 ON ( t2.a < 10 OR t2.b < 10 ); +--enable_ps2_protocol SET debug_dbug= @saved_dbug; diff --git a/mysql-test/main/errors.test b/mysql-test/main/errors.test index 1948eebfcb3..cc5cad2a68e 100644 --- a/mysql-test/main/errors.test +++ b/mysql-test/main/errors.test @@ -94,8 +94,10 @@ end| delimiter ;| flush status; +--disable_ps2_protocol --error 1062 select f1(), f2(); +--enable_ps2_protocol show status like 'Com_insert'; select * from t1; select * from t2; diff --git a/mysql-test/main/fast_prefix_index_fetch_innodb.test b/mysql-test/main/fast_prefix_index_fetch_innodb.test index 68d3dc0648d..03b7275a1e3 100644 --- a/mysql-test/main/fast_prefix_index_fetch_innodb.test +++ b/mysql-test/main/fast_prefix_index_fetch_innodb.test @@ -38,6 +38,7 @@ select "no-op query"; let $count = query_get_value($show_count_statement, Value, 1); let $opt = query_get_value($show_opt_statement, Value, 1); +--disable_ps2_protocol --disable_query_log eval select $count - $base_count into @cluster_lookups; eval select $opt - $base_opt into @cluster_lookups_avoided; @@ -662,6 +663,8 @@ eval set @cluster_lookups_avoided = $opt - $base_opt; select @cluster_lookups; select @cluster_lookups_avoided; +--enable_ps2_protocol + DROP TABLE t1; --echo # diff --git a/mysql-test/main/features.test b/mysql-test/main/features.test index 1241bd50bdd..5dbc96165dd 100644 --- a/mysql-test/main/features.test +++ b/mysql-test/main/features.test @@ -8,6 +8,8 @@ drop table if exists t1; set sql_mode=""; +--disable_ps2_protocol + flush status; show status like "feature%"; @@ -114,7 +116,7 @@ select updatexml('
12
', '/','12') as upd1; --replace_result 4 2 show status like "feature_xml"; - +--enable_ps2_protocol --echo # --echo # Feature delayed_keys diff --git a/mysql-test/main/func_gconcat.test b/mysql-test/main/func_gconcat.test index e24dba5d04f..cc5236a18be 100644 --- a/mysql-test/main/func_gconcat.test +++ b/mysql-test/main/func_gconcat.test @@ -61,6 +61,7 @@ select grp,group_concat(c order by c) from t1 group by grp; # Test warnings +--disable_ps2_protocol set group_concat_max_len = 4; select grp,group_concat(c) from t1 group by grp; show warnings; @@ -72,6 +73,7 @@ set group_concat_max_len = 1024; select group_concat(sum(c)) from t1 group by grp; --error 1054 select grp,group_concat(c order by 2) from t1 group by grp; +--enable_ps2_protocol drop table t1; @@ -237,10 +239,12 @@ select group_concat(distinct b) from t1 group by a; select group_concat(b order by b) from t1 group by a; select group_concat(distinct b order by b) from t1 group by a; set local group_concat_max_len=4; +--disable_ps2_protocol select group_concat(b) from t1 group by a; select group_concat(distinct b) from t1 group by a; select group_concat(b order by b) from t1 group by a; select group_concat(distinct b order by b) from t1 group by a; +--enable_ps2_protocol # # long blobs @@ -256,10 +260,12 @@ select group_concat(distinct b) from t1 group by a; select group_concat(b order by b) from t1 group by a; select group_concat(distinct b order by b) from t1 group by a; set local group_concat_max_len=400; +--disable_ps2_protocol select group_concat(b) from t1 group by a; select group_concat(distinct b) from t1 group by a; select group_concat(b order by b) from t1 group by a; select group_concat(distinct b order by b) from t1 group by a; +--enable_ps2_protocol drop table t1; @@ -517,10 +523,12 @@ CREATE TABLE t1( a VARCHAR( 10 ), b INT ); INSERT INTO t1 VALUES ( repeat( 'a', 10 ), 1), ( repeat( 'b', 10 ), 2); SET group_concat_max_len = 20; +--disable_ps2_protocol SELECT GROUP_CONCAT( a ) FROM t1; SELECT GROUP_CONCAT( DISTINCT a ) FROM t1; SELECT GROUP_CONCAT( a ORDER BY b ) FROM t1; -SELECT GROUP_CONCAT( DISTINCT a ORDER BY b ) FROM t1; +SELECT GROUP_CONCAT( DISTINCT a ORDER BY b ) FROM t1; +--enable_ps2_protocol SET group_concat_max_len = DEFAULT; DROP TABLE t1; # Bug #23856:GROUP_CONCAT and ORDER BY: junk from previous rows for query on I_S @@ -787,7 +795,9 @@ INSERT INTO t1 VALUES ('555555', 5); SET group_concat_max_len = 5; SET @old_sql_mode = @@sql_mode, @@sql_mode = 'traditional'; +--disable_ps2_protocol SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b LIMIT 3; +--enable_ps2_protocol --error ER_CUT_VALUE_GROUP_CONCAT INSERT INTO t2 SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b; UPDATE t1 SET a = '11111' WHERE b = 1; @@ -864,6 +874,7 @@ CREATE TABLE t2 SELECT GROUP_CONCAT(UPPER(f1) ORDER BY f2) FROM t1; SHOW CREATE TABLE t2; DROP TABLE t2; +--disable_ps2_protocol SET group_concat_max_len= 1024; SELECT LENGTH(GROUP_CONCAT(f1 ORDER BY f2)) FROM t1; @@ -873,6 +884,7 @@ SELECT LENGTH(GROUP_CONCAT(f1 ORDER BY f2)) FROM t1 GROUP BY f2; INSERT INTO t1 VALUES (REPEAT('a', 499999), 3), (REPEAT('b', 500000), 4); SELECT LENGTH(GROUP_CONCAT(f1 ORDER BY f2)) FROM t1 GROUP BY f2; +--enable_ps2_protocol DROP TABLE t1; SET group_concat_max_len= DEFAULT; @@ -882,8 +894,10 @@ SET group_concat_max_len= DEFAULT; # set session group_concat_max_len=1024; set max_session_mem_used=16*1024*1024; # 8M..32M +--disable_ps2_protocol SELECT GROUP_CONCAT(concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1) ORDER BY 2,1,3,4,6,5,8,7) AS c FROM seq_1_to_200000; +--enable_ps2_protocol set max_session_mem_used=default; set session group_concat_max_len=default; diff --git a/mysql-test/main/func_like.test b/mysql-test/main/func_like.test index 7339743afe4..751e9c19e40 100644 --- a/mysql-test/main/func_like.test +++ b/mysql-test/main/func_like.test @@ -223,12 +223,15 @@ drop table t1; # # Item_func_like::fix_fields, ESCAPE, const_item() # +#Enable after fix MDEV-31282 +--disable_ps2_protocol create table t1(f1 int); insert into t1 values(1); --error ER_WRONG_ARGUMENTS update (select 1 like 2 escape (1 in (select 1 from t1))) x, t1 as d set d.f1 = 1; select * from (select 1 like 2 escape (1 in (select 1 from t1))) x; drop table t1; +--enable_ps2_protocol # # Item_func_like::walk diff --git a/mysql-test/main/func_math.test b/mysql-test/main/func_math.test index 9db00a54b80..96867b530d0 100644 --- a/mysql-test/main/func_math.test +++ b/mysql-test/main/func_math.test @@ -31,7 +31,9 @@ explain extended select log10(100),log10(18),log10(-4),log10(0),log10(NULL); select pow(10,log10(10)),power(2,4); explain extended select pow(10,log10(10)),power(2,4); set @@rand_seed1=10000000,@@rand_seed2=1000000; +--disable_ps2_protocol select rand(999999),rand(); +--enable_ps2_protocol explain extended select rand(999999),rand(); select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6); explain extended select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6); diff --git a/mysql-test/main/func_misc.test b/mysql-test/main/func_misc.test index a8a9bb9afe0..935f33350d9 100644 --- a/mysql-test/main/func_misc.test +++ b/mysql-test/main/func_misc.test @@ -54,6 +54,7 @@ drop table t1; # Bug#16501: IS_USED_LOCK does not appear to work # +--disable_ps2_protocol CREATE TABLE t1 (conn CHAR(7), connection_id INT); INSERT INTO t1 VALUES ('default', CONNECTION_ID()); @@ -85,6 +86,7 @@ disconnect con1; connection default; DROP TABLE t1; +--enable_ps2_protocol # # Bug #21531: EXPORT_SET() doesn't accept args with coercible character sets @@ -148,15 +150,19 @@ select avg(a) from table_26093; select benchmark(100, (select avg(a) from table_26093)); set @invoked := 0; +--disable_ps2_protocol select benchmark(100, (select avg(func_26093_a(a)) from table_26093)); +--enable_ps2_protocol # Returns only 10, since intermediate results are cached. select @invoked; set @invoked := 0; +--disable_ps2_protocol #enable after fix MDEV-27871 --disable_view_protocol select benchmark(100, (select avg(func_26093_b(a, rand())) from table_26093)); --enable_view_protocol +--enable_ps2_protocol # Returns 1000, due to rand() preventing caching. select @invoked; @@ -631,6 +637,7 @@ DROP TABLE t1; --echo # GET_LOCK, RELEASE_LOCK, IS_USED_LOCK functions test --echo # +--disable_ps2_protocol --disable_service_connection --echo # IS_USED_LOCK, IS_FREE_LOCK: the lock is not acquired @@ -794,6 +801,7 @@ select is_free_lock(repeat('a', 193)); select release_lock(repeat('a', 193)); --enable_service_connection +--enable_ps2_protocol --echo --echo # -- @@ -1224,8 +1232,10 @@ DROP TABLE t1; --echo # MDEV-20517 Assertion `!is_expensive()' failed in Item::value_depends_on_sql_mode_const_item --echo # +--disable_ps2_protocol SELECT ( 1 LIKE GET_LOCK( 'foo', 0 ) ) - 2; SELECT RELEASE_LOCK('foo'); +--enable_ps2_protocol --echo # --echo # End of 10.2 tests diff --git a/mysql-test/main/func_rollback.test b/mysql-test/main/func_rollback.test index e8af4ef2eff..0650ae09292 100644 --- a/mysql-test/main/func_rollback.test +++ b/mysql-test/main/func_rollback.test @@ -90,12 +90,16 @@ delimiter ;// --echo --echo # One f1_simple_insert execution per row, no NOT NULL violation +--disable_ps2_protocol SELECT f1_simple_insert(1); +--enable_ps2_protocol SELECT * FROM t1_not_null ORDER BY f1,f2; ROLLBACK; SELECT * FROM t1_not_null; # +--disable_ps2_protocol SELECT f1_simple_insert(1) FROM t1_select; +--enable_ps2_protocol SELECT * FROM t1_not_null ORDER BY f1,f2; ROLLBACK; SELECT * FROM t1_not_null; @@ -219,7 +223,9 @@ eval $f1_insert_select; --echo # - t1_not_null gets a row inserted --echo # is covered by the manual. # Non strict sqlmode + INSERT SELECT --> NULL adjusted to default +--disable_ps2_protocol SELECT f1_insert_select(2); +--enable_ps2_protocol SELECT * FROM t1_not_null ORDER BY f1,f2; ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; @@ -295,7 +301,9 @@ eval $f1_insert_with_two_rows; --echo # - t1_not_null gets a row inserted --echo # is covered by the manual. # Non strict sqlmode + multiple-row INSERT --> NULL adjusted to default +--disable_ps2_protocol SELECT f1_insert_with_two_rows(); +--enable_ps2_protocol SELECT * FROM t1_not_null ORDER BY f1,f2; ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; diff --git a/mysql-test/main/func_str.test b/mysql-test/main/func_str.test index da3483dd08a..f99a1d912e8 100644 --- a/mysql-test/main/func_str.test +++ b/mysql-test/main/func_str.test @@ -1518,7 +1518,9 @@ SELECT CONVERT(('' IN (REVERSE(CAST(('') AS DECIMAL)), '')), CHAR(3)); --echo # CREATE TABLE t1 ( a TEXT ); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT 'aaaaaaaaaaaaaa' INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/bug58165.txt'; +--enable_ps2_protocol SELECT insert( substring_index( 'a', 'a', 'b' ), 1, 0, 'x' ); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/bug58165.txt' INTO TABLE t1; diff --git a/mysql-test/main/func_time.test b/mysql-test/main/func_time.test index ed9ae20e9bd..b12136b0243 100644 --- a/mysql-test/main/func_time.test +++ b/mysql-test/main/func_time.test @@ -2282,9 +2282,11 @@ delimiter ;// SET @sav_slow_query_log= @@session.slow_query_log; +--disable_ps2_protocol # @@slow_query_log ON check SET @@session.slow_query_log= ON; SELECT current_timestamp(6),fn_sleep_before_now() INTO @ts_cur, @ts_func; +--enable_ps2_protocol SELECT a FROM t_ts LIMIT 1 into @ts_func; SELECT a FROM t_trig LIMIT 1 into @ts_trig; @@ -2296,9 +2298,11 @@ if (!`SELECT @ts_cur = @ts_func and @ts_func = @ts_trig`) DELETE FROM t_ts; DELETE FROM t_trig; +--disable_ps2_protocol # @@slow_query_log OFF check SET @@session.slow_query_log= OFF; SELECT current_timestamp(6),fn_sleep_before_now() INTO @ts_cur, @func_ts; +--enable_ps2_protocol SELECT a FROM t_ts LIMIT 1 into @ts_func; SELECT a FROM t_trig LIMIT 1 into @ts_trig; if (!`SELECT @ts_cur = @ts_func and @ts_func = @ts_trig`) @@ -2350,9 +2354,11 @@ SELECT --echo # MDEV-14032 SEC_TO_TIME executes side effect two times --echo # +--disable_ps2_protocol SET @a=10000000; SELECT SEC_TO_TIME(@a:=@a+1); SELECT @a; +--enable_ps2_protocol CREATE TABLE t1 (a TEXT); DELIMITER $$; @@ -2363,7 +2369,9 @@ BEGIN END; $$ DELIMITER ;$$ +--disable_ps2_protocol SELECT SEC_TO_TIME(f1()); +--enable_ps2_protocol SELECT * FROM t1; DROP TABLE t1; DROP FUNCTION f1; diff --git a/mysql-test/main/func_weight_string.test b/mysql-test/main/func_weight_string.test index 528aa5d4f0f..0209be51236 100644 --- a/mysql-test/main/func_weight_string.test +++ b/mysql-test/main/func_weight_string.test @@ -114,7 +114,9 @@ drop table t1; --echo # BUG#11898467 - SERVER CRASHES ON SELECT HEX(WEIGHT_STRING(STR AS [CHAR|BINARY](N))) IF N IS BIG --echo # SELECT HEX(WEIGHT_STRING('ab' AS CHAR(1000000000000000000))); +--disable_ps2_protocol SELECT HEX(WEIGHT_STRING('ab' AS BINARY(1000000000000000000))); +--enable_ps2_protocol disconnect conn1; connection default; diff --git a/mysql-test/main/grant2.test b/mysql-test/main/grant2.test index f98af8d8630..7efd9bdde78 100644 --- a/mysql-test/main/grant2.test +++ b/mysql-test/main/grant2.test @@ -838,7 +838,9 @@ SHOW CREATE TABLE t1; --echo # INSERT INTO t1 VALUES (1), (2), (3); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT a INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/bug27480.txt' FROM t1 +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/bug27480.txt' INTO TABLE t1 --remove_file $MYSQLTEST_VARDIR/tmp/bug27480.txt diff --git a/mysql-test/main/group_by.test b/mysql-test/main/group_by.test index 9bbe1e0bf2b..c22fba552c0 100644 --- a/mysql-test/main/group_by.test +++ b/mysql-test/main/group_by.test @@ -1032,9 +1032,11 @@ EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR JOIN (PRIMARY,i2); EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR GROUP BY (PRIMARY,i2) GROUP BY a; --echo # Here's a proof it is really doing sorting: flush status; +--disable_ps2_protocol --disable_result_log SELECT a FROM t1 IGNORE INDEX FOR GROUP BY (PRIMARY,i2) GROUP BY a; --enable_result_log +--enable_ps2_protocol show status like 'Sort_%'; --echo # Proof ends. --echo # @@ -1045,9 +1047,11 @@ show status like 'Sort_%'; EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR ORDER BY (PRIMARY,i2) ORDER BY a; --echo # Here's a proof it is really doing sorting: flush status; +--disable_ps2_protocol --disable_result_log SELECT a FROM t1 IGNORE INDEX FOR ORDER BY (PRIMARY,i2) ORDER BY a; --enable_result_log +--enable_ps2_protocol show status like 'Sort_%'; --echo # Proof ends. --echo # @@ -1400,7 +1404,9 @@ let $query0=SELECT col1 AS field1, col1 AS field2 # Needs to be range to exercise bug --eval EXPLAIN $query0; FLUSH STATUS; +--disable_ps2_protocol --eval $query0; +--enable_ps2_protocol SHOW SESSION STATUS LIKE 'Sort_scan%'; let $query=SELECT SQL_BIG_RESULT col1 AS field1, col1 AS field2 @@ -1409,7 +1415,9 @@ let $query=SELECT SQL_BIG_RESULT col1 AS field1, col1 AS field2 # Needs to be range to exercise bug --eval EXPLAIN $query FLUSH STATUS; +--disable_ps2_protocol --eval $query +--enable_ps2_protocol SHOW SESSION STATUS LIKE 'Sort_scan%'; CREATE VIEW v1 AS SELECT * FROM t1; @@ -1643,6 +1651,7 @@ DROP TABLE t1, t2; #the view protocol creates # an additional util connection and other statistics data +--disable_ps2_protocol --disable_view_protocol FLUSH STATUS; # this test case *must* use Aria temp tables @@ -1655,6 +1664,7 @@ DROP TABLE t1; --echo the value below *must* be 1 show status like 'Created_tmp_disk_tables'; --enable_view_protocol +--enable_ps2_protocol --echo # --echo # Bug #1002146: Unneeded filesort if usage of join buffer is not allowed diff --git a/mysql-test/main/group_min_max.test b/mysql-test/main/group_min_max.test index 3c5c1b5bb9b..49ce729c6b8 100644 --- a/mysql-test/main/group_min_max.test +++ b/mysql-test/main/group_min_max.test @@ -919,7 +919,7 @@ DROP TABLE t1,t2; # # Bug#24156: Loose index scan not used with CREATE TABLE ...SELECT and similar statements # - +--disable_ps2_protocol CREATE TABLE t1 (a INT, b INT, INDEX (a,b)); INSERT INTO t1 (a, b) VALUES (1,1), (1,2), (1,3), (1,4), (1,5), (2,2), (2,3), (2,1), (3,1), (4,1), (4,2), (4,3), (4,4), (4,5), (4,6); @@ -977,6 +977,7 @@ DELETE FROM t3 WHERE (SELECT (SELECT MAX(b) FROM t1 GROUP BY a HAVING a < 2) x SHOW STATUS LIKE 'handler_read__e%'; DROP TABLE t1,t2,t3; +--enable_ps2_protocol # # Bug#25602: queries with DISTINCT and SQL_BIG_RESULT hint diff --git a/mysql-test/main/handler_read_last.test b/mysql-test/main/handler_read_last.test index 2f18e302fa0..390d5f092fc 100644 --- a/mysql-test/main/handler_read_last.test +++ b/mysql-test/main/handler_read_last.test @@ -9,6 +9,7 @@ DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a INT, INDEX (a)); INSERT INTO t1 VALUES (),(),(),(),(),(),(),(),(),(); +--disable_ps2_protocol FLUSH STATUS; SELECT a FROM t1 ORDER BY a LIMIT 1; SHOW STATUS LIKE 'HANDLER_READ%'; @@ -24,6 +25,7 @@ SHOW STATUS LIKE 'HANDLER_READ%'; FLUSH STATUS; SELECT a FROM t1 ORDER BY a DESC LIMIT 3; SHOW STATUS LIKE 'HANDLER_READ%'; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/main/having.test b/mysql-test/main/having.test index e39d824d3a2..618fcb57250 100644 --- a/mysql-test/main/having.test +++ b/mysql-test/main/having.test @@ -892,8 +892,10 @@ CREATE TABLE t1 (t INT, u INT, KEY(t)); INSERT INTO t1 VALUES(10, 10), (11, 11), (12, 12), (12, 13),(14, 15), (15, 16), (16, 17), (17, 17); ANALYZE TABLE t1; +--disable_ps2_protocol SELECT t, next_seq_value() r FROM t1 FORCE INDEX(t) GROUP BY t HAVING r = 1 ORDER BY t1.u; +--enable_ps2_protocol DROP TABLE t1; DROP FUNCTION next_seq_value; diff --git a/mysql-test/main/information_schema.test b/mysql-test/main/information_schema.test index 7b5884ef6b5..600c25256cf 100644 --- a/mysql-test/main/information_schema.test +++ b/mysql-test/main/information_schema.test @@ -1409,12 +1409,13 @@ set global init_connect=""; # # Bug#34517 SHOW GLOBAL STATUS does not work properly in embedded server. # - +--disable_ps2_protocol create table t0 select * from information_schema.global_status where VARIABLE_NAME='COM_SELECT'; SELECT 1; select a.VARIABLE_VALUE - b.VARIABLE_VALUE from t0 b, information_schema.global_status a where a.VARIABLE_NAME = b.VARIABLE_NAME; drop table t0; +--enable_ps2_protocol # # Bug#35275 INFORMATION_SCHEMA.TABLES.CREATE_OPTIONS omits KEY_BLOCK_SIZE diff --git a/mysql-test/main/information_schema_stats.test b/mysql-test/main/information_schema_stats.test index 49d46ee437d..fd5171c3fb4 100644 --- a/mysql-test/main/information_schema_stats.test +++ b/mysql-test/main/information_schema_stats.test @@ -1,3 +1,4 @@ +--disable_ps2_protocol # # MDEV-8633: information_schema.index_statistics doesn't delete item when drop table indexes or drop table; # @@ -45,3 +46,4 @@ drop table just_a_test; select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test'; select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test'; set global userstat=@save_userstat; +--enable_ps2_protocol diff --git a/mysql-test/main/innodb_ext_key.test b/mysql-test/main/innodb_ext_key.test index ddd51879a7a..c73d4815442 100644 --- a/mysql-test/main/innodb_ext_key.test +++ b/mysql-test/main/innodb_ext_key.test @@ -27,6 +27,7 @@ ANALYZE TABLE lineitem PERSISTENT FOR COLUMNS() INDEXES(); --enable_result_log --enable_query_log +--disable_ps2_protocol explain select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01'; flush status; @@ -149,6 +150,7 @@ select o_orderkey, p_partkey where p_retailprice > 1100 and o_orderdate='1997-01-01' and o_orderkey=l_orderkey and p_partkey=l_partkey; show status like 'handler_read%'; +--enable_ps2_protocol --echo # --echo # Bug mdev-3851: ref access used instead of expected eq_ref access @@ -317,12 +319,14 @@ select A.a + 10 * B.a, A.a + 10 * B.a, A.a + 10 * B.a from t1 A, t1 B; +--disable_ps2_protocol --replace_column 9 # explain select * from t1, t2 where t2.a=t1.a and t2.b < 2; flush status; select * from t1, t2 where t2.a=t1.a and t2.b < 2; show status like 'handler_read%'; +--enable_ps2_protocol drop table t1,t2; diff --git a/mysql-test/main/insert.test b/mysql-test/main/insert.test index b27290bc91c..fce0d3c04d2 100644 --- a/mysql-test/main/insert.test +++ b/mysql-test/main/insert.test @@ -210,6 +210,7 @@ drop table t1; # (and thus for values returned by mysql_affected_rows()) # for various forms of INSERT # +--disable_ps2_protocol create table t1 (id int primary key, data int); insert into t1 values (1, 1), (2, 2), (3, 3); select row_count(); @@ -227,6 +228,7 @@ select row_count(); insert into t1 values (5, 5) on duplicate key update data= data + 10; select row_count(); drop table t1; +--enable_ps2_protocol # # Bug#25123: ON DUPLICATE KEY clause allows fields not from the insert table @@ -284,8 +286,10 @@ BEGIN END | delimiter ;| +--disable_ps2_protocol SELECT f1(); SELECT f2(); +--enable_ps2_protocol INSERT INTO t1 VALUES (3); INSERT DELAYED INTO t1 VALUES (4); @@ -592,7 +596,9 @@ CREATE ALGORITHM = MERGE VIEW v1 AS SELECT f1, f2 FROM t1 WHERE f1 = cast('' as REPLACE INTO v1 SET f2 = 1; SELECT * from t1; drop view v1; +--disable_ps2_protocol SELECT 0,0 INTO OUTFILE 't1.txt'; +--enable_ps2_protocol CREATE ALGORITHM = MERGE VIEW v1 AS SELECT f1, f2 FROM t1 WHERE f1 = 'x' WITH CHECK OPTION; --error ER_TRUNCATED_WRONG_VALUE LOAD DATA INFILE 't1.txt' INTO TABLE v1; diff --git a/mysql-test/main/invisible_field.test b/mysql-test/main/invisible_field.test index 558ca7aa3a2..0731c393399 100644 --- a/mysql-test/main/invisible_field.test +++ b/mysql-test/main/invisible_field.test @@ -251,7 +251,9 @@ DROP TABLE t1; create or replace table t1 (a int, b int invisible); insert into t1 values (1),(2); +--disable_ps2_protocol select * from t1 into outfile 'f'; +--enable_ps2_protocol load data infile 'f' into table t1; select a,b from t1; load data infile 'f' into table t1 (a,@v) SET b=@v; @@ -261,7 +263,9 @@ select a,b from t1; truncate table t1; insert into t1(a,b) values (1,1),(2,2); +--disable_ps2_protocol select a,b from t1 into outfile 'a'; +--enable_ps2_protocol load data infile 'a' into table t1(a,b); select a,b from t1; load data infile 'a' into table t1 (a,@v) SET b=@v; diff --git a/mysql-test/main/join.test b/mysql-test/main/join.test index b99f05f7c88..d968231ea5a 100644 --- a/mysql-test/main/join.test +++ b/mysql-test/main/join.test @@ -659,7 +659,9 @@ create table t3 (a int not null, primary key(a)); insert into t3 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); flush status; +--disable_ps2_protocol select * from t1, t2, t3 where t3.a=t1.a and t2.a=t1.b; +--enable_ps2_protocol explain select * from t1, t2, t3 where t3.a=t1.a and t2.a=t1.b; --echo We expect rnd_next=5, and read_key must be 0 because of short-cutting: show status like 'Handler_read%'; @@ -958,7 +960,9 @@ INSERT INTO t1 VALUES (3,'b'),(4,NULL),(5,'c'),(6,'cc'),(7,'d'), INSERT INTO t2 VALUES (2,NULL); ANALYZE TABLE t1,t2; FLUSH STATUS; +--disable_ps2_protocol SELECT * FROM t1 JOIN t2 ON t1.v = t2.v WHERE t2.v IS NULL ORDER BY 1; +--enable_ps2_protocol SHOW STATUS LIKE 'Handler_read_%'; DROP TABLE t1, t2; diff --git a/mysql-test/main/join_cache.test b/mysql-test/main/join_cache.test index 6a5ee8cb533..43ce3b97ad1 100644 --- a/mysql-test/main/join_cache.test +++ b/mysql-test/main/join_cache.test @@ -1645,6 +1645,7 @@ insert into t2 values (3,1, 'qwerty'),(3,4, 'qwerty'); insert into t2 values (4,1, 'qwerty'),(4,2, 'qwerty'),(4,3, 'qwerty'), (4,4, 'qwerty'); +--disable_ps2_protocol flush status; set join_cache_level=5; select t2.f1, t2.f2, t2.f3 from t1,t2 @@ -1678,6 +1679,8 @@ explain select t2.f1, t2.f2, t2.f3 from t1,t2 where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2; show status like "Handler_icp%"; +--enable_ps2_protocol + drop table t1,t2; set join_cache_level=@save_join_cache_level; @@ -4029,6 +4032,8 @@ insert into t1 values (1), (2); insert into t2 values (1), (2); insert into t3 values (2); +--disable_ps2_protocol + explain select count(*) from t1 straight_join t2 where c1 = c2-0 and c2 <= (select max(c3) from t3 where c3 = 2 and @counter:=@counter+1); @@ -4055,6 +4060,8 @@ where c1 = c2-0 and select @counter; +--enable_ps2_protocol + drop table t1,t2,t3; set expensive_subquery_limit=@save_expensive_subquery_limit; diff --git a/mysql-test/main/join_outer.test b/mysql-test/main/join_outer.test index 5e1e83e4049..857a9ced41b 100644 --- a/mysql-test/main/join_outer.test +++ b/mysql-test/main/join_outer.test @@ -685,9 +685,15 @@ create table t1 (a int, b varchar(20)); create table t2 (a int, c varchar(20)); insert into t1 values (1,"aaaaaaaaaa"),(2,"bbbbbbbbbb"); insert into t2 values (1,"cccccccccc"),(2,"dddddddddd"); +#Enable after fix MDEV-31276 +--disable_ps2_protocol select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by t1.a; +--enable_ps2_protocol select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by t1.a; +#Enable after fix MDEV-31276 +--disable_ps2_protocol select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by a; +--enable_ps2_protocol select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by a; drop table t1, t2; set group_concat_max_len=default; @@ -873,7 +879,8 @@ DROP TABLE t1,t2; # # Bug 28188: 'not exists' optimization for outer joins # - + +--disable_ps2_protocol CREATE TABLE t1 (id int PRIMARY KEY, a varchar(8)); CREATE TABLE t2 (id int NOT NULL, b int NOT NULL, INDEX idx(id)); INSERT INTO t1 VALUES @@ -889,7 +896,7 @@ SELECT t1.id, a FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.b IS NULL; show status like 'Handler_read%'; DROP TABLE t1,t2; - +--enable_ps2_protocol # # Bug 28571: outer join with false on condition over constant tables # @@ -1369,6 +1376,7 @@ drop table t1,t2,t3,t4; --echo # Bug#57024: Poor performance when conjunctive condition over the outer --echo # table is used in the on condition of an outer join --echo # +--disable_ps2_protocol --disable_view_protocol create table t1 (a int); insert into t1 values (NULL), (NULL), (NULL), (NULL); @@ -1411,6 +1419,7 @@ show status like "handler_read%"; drop table t1,t2,t3; --enable_view_protocol +--enable_ps2_protocol --echo # --echo # Bug#57688 Assertion `!table || (!table->write_set || bitmap_is_set(table->write_set, field @@ -2363,8 +2372,11 @@ create view v1 as select * from t1 left join ( select 'Y' AS Voted, ElectionID from t2 ) AS T on T.ElectionID = t1.Election limit 9; +#enable after fix MDEV-31277 +--disable_ps2_protocol # limit X causes merge algorithm select as opposed to temp table select * from v1; +--enable_ps2_protocol drop table t1, t2; drop view v1; @@ -2379,7 +2391,10 @@ create view v10 as select *, 'U' as u from t10 left join (select 'Y' as y, t20.b create table t30 (c int); insert into t30 values (1),(3); create view v20 as select * from t30 left join (select 'X' as x, v10.u, v10.y, v10.b from v10) dt2 on t30.c=dt2.b limit 6; +#check after fix MDEV-31277 +--disable_ps2_protocol select * from v20 limit 9; +--enable_ps2_protocol drop view v10, v20; drop table t10, t20, t30; @@ -2392,7 +2407,9 @@ create table t3 (c int); insert into t3 values (3),(1); create table t1 (a int); insert into t1 values (1),(2),(7),(1); - + +#check after fix MDEV-31277 +--disable_ps2_protocol select * from ( select * from @@ -2405,6 +2422,7 @@ select * from on dt1.a=dt2.b limit 9 ) dt; +--enable_ps2_protocol ## Same as dt3 above create view v3(x,c) as select * from (select 'X' as x, t3.c from t3) dt3; @@ -2418,7 +2436,10 @@ create view v0(y,b,x,c) as select * from v2 left join v3 on v2.b=v3.c; # Same as above select statement create view v1 as select 'Z' as z, t1.a, v0.* from t1 left join v0 on t1.a=v0.b limit 9; +#check after fix MDEV-31277 +--disable_ps2_protocol select * from v1; +--enable_ps2_protocol set statement join_cache_level=0 for select * from v1; diff --git a/mysql-test/main/key_cache.test b/mysql-test/main/key_cache.test index a99bb4ea04c..706c0a736dd 100644 --- a/mysql-test/main/key_cache.test +++ b/mysql-test/main/key_cache.test @@ -276,6 +276,7 @@ DROP TABLE t1; # Test usage of the KEY_CACHE table from information schema # for a simple key cache +--disable_ps2_protocol set global key_buffer_size=@save_key_buffer_size; set global key_cache_block_size=@save_key_cache_block_size; select @@key_buffer_size; @@ -536,6 +537,7 @@ set global keycache2.key_buffer_size=0; set global key_buffer_size=@save_key_buffer_size; set global key_cache_segments=@save_key_cache_segments; set global key_cache_file_hash_size=@save_key_cache_file_hash_size; +--enable_ps2_protocol # End of 5.2 tests diff --git a/mysql-test/main/limit_rows_examined.test b/mysql-test/main/limit_rows_examined.test index 2315580410f..16831a0cf5c 100644 --- a/mysql-test/main/limit_rows_examined.test +++ b/mysql-test/main/limit_rows_examined.test @@ -489,6 +489,7 @@ WHERE alias3.c IN ( SELECT 1 UNION SELECT 6 ) GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 120; +--disable_ps2_protocol FLUSH STATUS; SELECT a AS field1, alias2.d AS field2, alias2.f AS field3, alias2.e AS field4, b AS field5 FROM t1, t2 AS alias2, t2 AS alias3 @@ -506,6 +507,7 @@ GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 124; SHOW STATUS LIKE 'Handler_read%'; SHOW STATUS LIKE 'Handler_tmp%'; +--enable_ps2_protocol drop table t1, t2; @@ -550,10 +552,12 @@ INSERT INTO t2 VALUES (5, 0),(3, 4),(6, 1), (5, 8),(4, 9),(8, 1); +--disable_ps2_protocol SELECT (SELECT MAX(c) FROM t1, t2) FROM t2 WHERE c = (SELECT MAX(b) FROM t2) LIMIT ROWS EXAMINED 3; +--enable_ps2_protocol drop table t1, t2; diff --git a/mysql-test/main/loaddata.test b/mysql-test/main/loaddata.test index b1a7b323b8b..0a5e3c27007 100644 --- a/mysql-test/main/loaddata.test +++ b/mysql-test/main/loaddata.test @@ -36,6 +36,7 @@ drop table t1; # # Bug #12053 LOAD DATA INFILE ignores NO_AUTO_VALUE_ON_ZERO setting # +--disable_ps2_protocol SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE=NO_AUTO_VALUE_ON_ZERO; create table t1(id integer not null auto_increment primary key); insert into t1 values(0); @@ -59,6 +60,7 @@ select * from t1; remove_file $MYSQLTEST_VARDIR/tmp/t1; SET @@SQL_MODE=@OLD_SQL_MODE; drop table t1; +--enable_ps2_protocol # # Bug #11203: LOAD DATA does not accept same characters for ESCAPED and @@ -92,7 +94,9 @@ INSERT INTO t1 (c1) VALUES SELECT * FROM t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1' FIELDS ENCLOSED BY 'r' FROM t1; +--enable_ps2_protocol cat_file $MYSQLTEST_VARDIR/tmp/t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR @@ -183,7 +187,9 @@ create table t1(f1 int); insert into t1 values(1),(null); create table t2(f2 int auto_increment primary key); disable_query_log; +--disable_ps2_protocol eval select * into outfile '$MYSQLTEST_VARDIR/tmp/t1' from t1; +--enable_ps2_protocol SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE=NO_AUTO_VALUE_ON_ZERO; eval load data infile '$MYSQLTEST_VARDIR/tmp/t1' into table t2; enable_query_log; @@ -200,16 +206,20 @@ create table t1(f1 int, f2 timestamp not null default current_timestamp); create table t2(f1 int); insert into t2 values(1),(2); disable_query_log; +--disable_ps2_protocol eval select * into outfile '$MYSQLTEST_VARDIR/tmp/t2' from t2; +--enable_ps2_protocol eval load data infile '$MYSQLTEST_VARDIR/tmp/t2' ignore into table t1; enable_query_log; select f1 from t1 where f2 <> '0000-00-00 00:00:00' order by f1; remove_file $MYSQLTEST_VARDIR/tmp/t2; delete from t1; disable_query_log; +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t2' FIELDS TERMINATED BY '' OPTIONALLY ENCLOSED BY '' LINES TERMINATED BY '\r\n' FROM t2; +--enable_ps2_protocol eval load data infile '$MYSQLTEST_VARDIR/tmp/t2' ignore into table t1 FIELDS TERMINATED BY '' OPTIONALLY ENCLOSED BY '' LINES TERMINATED BY '\r\n'; enable_query_log; @@ -228,7 +238,9 @@ INSERT INTO t1 (c1, c2, c3, c4) VALUES (10, '1970-02-01 01:02:03', 1.1E-100, 1.1 SELECT * FROM t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1' FIELDS ENCLOSED BY '-' FROM t1; +--enable_ps2_protocol cat_file $MYSQLTEST_VARDIR/tmp/t1; echo EOF; @@ -365,8 +377,10 @@ SET @OLD_SQL_MODE=@@SESSION.SQL_MODE; SET sql_mode = ''; +--disable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval SELECT '1 \\\\aa\n' INTO DUMPFILE '$file' +--enable_ps2_protocol CREATE TABLE t1 (id INT, val1 CHAR(3)) ENGINE=MyISAM; @@ -378,13 +392,17 @@ SELECT * FROM t1; # show we can write this with OUTFILE, forcing the parameters for now --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file2' FIELDS ESCAPED BY '' TERMINATED BY ' ' FROM t1 +--enable_ps2_protocol --diff_files $file $file2 --remove_file $file2 # now show the OUTFILE defaults are correct with NO_BACKSLASH_ESCAPES --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file2' FIELDS TERMINATED BY ' ' FROM t1 +--enable_ps2_protocol --diff_files $file $file2 --remove_file $file2 @@ -417,7 +435,9 @@ INSERT INTO t1 (id, val1) VALUES (3, '\tx'); --echo 1.1 NO_BACKSLASH_ESCAPES, use defaults for ESCAPED BY --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file' FIELDS TERMINATED BY ' ' FROM t1 ORDER BY id +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$file' INTO TABLE t2 FIELDS TERMINATED BY ' ' @@ -439,7 +459,9 @@ eval SELECT LOAD_FILE("$file"); --echo 1.2 NO_BACKSLASH_ESCAPES, override defaults for ESCAPED BY --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file' FIELDS ESCAPED BY '\' TERMINATED BY ' ' FROM t1 ORDER BY id +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$file' INTO TABLE t2 FIELDS ESCAPED BY '\' TERMINATED BY ' ' @@ -465,7 +487,9 @@ SET sql_mode = ''; --echo 2.1 !NO_BACKSLASH_ESCAPES, use defaults for ESCAPED BY --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file' FIELDS TERMINATED BY ' ' FROM t1 ORDER BY id +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$file' INTO TABLE t2 FIELDS TERMINATED BY ' ' @@ -493,7 +517,9 @@ SET sql_mode = ''; --echo 2.2 !NO_BACKSLASH_ESCAPES, override defaults for ESCAPED BY --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file' FIELDS ESCAPED BY '' TERMINATED BY ' ' FROM t1 ORDER BY id +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$file' INTO TABLE t2 FIELDS ESCAPED BY '' TERMINATED BY ' ' @@ -544,7 +570,9 @@ INSERT INTO t1 VALUES (1); SET NAMES latin1; SET character_set_filesystem=filename; select @@character_set_filesystem; +--disable_ps2_protocol SELECT * INTO OUTFILE 't-1' FROM t1; +--enable_ps2_protocol DELETE FROM t1; LOAD DATA INFILE 't-1' INTO TABLE t1; SELECT * FROM t1; @@ -566,7 +594,9 @@ select @@character_set_filesystem; --echo # CREATE TABLE t1(col0 LONGBLOB); +--disable_ps2_protocol SELECT 'test' INTO OUTFILE 't1.txt'; +--enable_ps2_protocol LOAD DATA INFILE 't1.txt' IGNORE INTO TABLE t1 SET col0=col0; SELECT * FROM t1; @@ -635,7 +665,9 @@ disconnect con1; --echo # CREATE TABLE t1(f1 INT); +--disable_ps2_protocol EVAL SELECT 0xE1BB30 INTO OUTFILE 't1.dat'; +--enable_ps2_protocol --disable_warnings LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8; --enable_warnings @@ -649,9 +681,11 @@ remove_file $MYSQLD_DATADIR/test/t1.dat; --echo # WHEN ERROR OCCURS --echo # +--disable_ps2_protocol --let $file=$MYSQLTEST_VARDIR/tmp/bug11735141.txt --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval SELECT '1\n' INTO DUMPFILE '$file' +--enable_ps2_protocol create table t1(a point); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR @@ -737,7 +771,9 @@ CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a), UNIQUE(b)); INSERT INTO t1 VALUES (1,1); CREATE TABLE t2 (c INT); CREATE VIEW v AS SELECT t1.* FROM t1 JOIN t2; +--disable_ps2_protocol SELECT a, b INTO OUTFILE '15645.data' FROM t1; +--enable_ps2_protocol --error ER_WRONG_USAGE LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b); --error ER_WRONG_USAGE diff --git a/mysql-test/main/lock_multi.test b/mysql-test/main/lock_multi.test index 5cc7219b01d..a9a9341b82d 100644 --- a/mysql-test/main/lock_multi.test +++ b/mysql-test/main/lock_multi.test @@ -8,6 +8,7 @@ drop DATABASE if exists mysqltest_1; # Test to see if select will get the lock ahead of low priority update +--disable_ps2_protocol connect (locker,localhost,root,,); connect (locker2,localhost,root,,); connect (reader,localhost,root,,); @@ -87,6 +88,7 @@ select release_lock("mysqltest_lock"); connection writer; reap; drop table t1; +--enable_ps2_protocol # # Test problem when using locks with multi-updates diff --git a/mysql-test/main/log_slow.test b/mysql-test/main/log_slow.test index d2e314cf667..c92dc76a48a 100644 --- a/mysql-test/main/log_slow.test +++ b/mysql-test/main/log_slow.test @@ -44,6 +44,7 @@ show fields from mysql.slow_log; # # Check flush command # +--disable_ps2_protocol flush slow logs; @@ -115,6 +116,7 @@ select * from t; show session status like 'Slow_queries'; drop table t; +--enable_ps2_protocol --echo # --echo # End of 10.3 tests diff --git a/mysql-test/main/log_tables-big.test b/mysql-test/main/log_tables-big.test index fa8810ecd3b..0861c79126e 100644 --- a/mysql-test/main/log_tables-big.test +++ b/mysql-test/main/log_tables-big.test @@ -16,6 +16,7 @@ connect (con2,localhost,root,,); # # Bug #27638: slow logging to CSV table inserts bad query_time and lock_time values # +--disable_ps2_protocol connection con1; set session long_query_time=10; select get_lock('bug27638', 1); @@ -36,5 +37,6 @@ connection default; disconnect con1; disconnect con2; +--enable_ps2_protocol set @@global.log_output = @log_output.saved; diff --git a/mysql-test/main/log_tables.test b/mysql-test/main/log_tables.test index 97a143a8fa5..b63ad9f4a5c 100644 --- a/mysql-test/main/log_tables.test +++ b/mysql-test/main/log_tables.test @@ -1051,12 +1051,14 @@ INSERT INTO t1 VALUES (2,2,2); INSERT INTO t1 VALUES (3,3,3); INSERT INTO t1 VALUES (4,4,4); +--disable_ps2_protocol SELECT SQL_NO_CACHE 'Bug#31700 - SCAN',f1,f2,f3,SLEEP(1.1) FROM t1 WHERE f3=4; SELECT SQL_NO_CACHE 'Bug#31700 - KEY', f1,f2,f3,SLEEP(1.1) FROM t1 WHERE f2=3; SELECT SQL_NO_CACHE 'Bug#31700 - PK', f1,f2,f3,SLEEP(1.1) FROM t1 WHERE f1=2; --replace_column 1 TIMESTAMP SELECT start_time, rows_examined, rows_sent, sql_text FROM mysql.slow_log WHERE sql_text LIKE '%Bug#31700%' ORDER BY start_time; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/main/long_unique_bugs.test b/mysql-test/main/long_unique_bugs.test index c6cfd5f006a..0359ac7e7ed 100644 --- a/mysql-test/main/long_unique_bugs.test +++ b/mysql-test/main/long_unique_bugs.test @@ -12,7 +12,9 @@ insert into t1 () values (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(), (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(), (),(),(),(); +--disable_ps2_protocol select * into outfile 'load.data' from t1; +--enable_ps2_protocol create temporary table tmp (a varchar(1024), b int, c int, d int, e linestring, unique (e)); load data infile 'load.data' into table tmp; delete from tmp; @@ -223,7 +225,9 @@ drop table t1; --echo # CREATE TABLE t1 (data VARCHAR(4), unique(data) using hash) with system versioning; INSERT INTO t1 VALUES ('A'); +--disable_ps2_protocol SELECT * INTO OUTFILE 'load.data' from t1; +--enable_ps2_protocol --error ER_DUP_ENTRY LOAD DATA INFILE 'load.data' INTO TABLE t1; select * from t1; @@ -237,7 +241,9 @@ DROP TABLE t1; CREATE TABLE t1 (data VARCHAR(7961)) ENGINE=InnoDB; INSERT INTO t1 VALUES ('f'), ('o'), ('o'); +--disable_ps2_protocol SELECT * INTO OUTFILE 'load.data' from t1; +--enable_ps2_protocol ALTER IGNORE TABLE t1 ADD UNIQUE INDEX (data); SELECT * FROM t1; diff --git a/mysql-test/main/merge.test b/mysql-test/main/merge.test index c22cf3950c1..82d34f16493 100644 --- a/mysql-test/main/merge.test +++ b/mysql-test/main/merge.test @@ -2023,7 +2023,9 @@ BEGIN RETURN (SELECT MAX(c1) FROM tm1); END| DELIMITER ;| +--disable_ps2_protocol SELECT f1() FROM (SELECT 1 UNION SELECT 1) c1; +--enable_ps2_protocol DROP FUNCTION f1; DROP TABLE tm1, t1, t2; # diff --git a/mysql-test/main/myisam_mrr.test b/mysql-test/main/myisam_mrr.test index 11c9aa64ef1..66188622a82 100644 --- a/mysql-test/main/myisam_mrr.test +++ b/mysql-test/main/myisam_mrr.test @@ -273,6 +273,7 @@ drop table t1; --echo # --echo # Test of MRR handler counters --echo # +--disable_ps2_protocol flush status; show status like 'Handler_mrr%'; create table t0 (a int); @@ -321,6 +322,7 @@ show status like 'handler_mrr%'; set join_cache_level= @join_cache_level_save; set join_buffer_size= @join_buffer_size_save; +--enable_ps2_protocol drop table t0, t1; diff --git a/mysql-test/main/mysqldump.test b/mysql-test/main/mysqldump.test index 78f0976ce6a..2720b27a18c 100644 --- a/mysql-test/main/mysqldump.test +++ b/mysql-test/main/mysqldump.test @@ -2810,6 +2810,7 @@ drop database d; --echo # MDEV-21786: --echo # mysqldump will forget sequence definition details on --no-data dump --echo # +--disable_ps2_protocol create database d; CREATE SEQUENCE d.s1 START WITH 100 INCREMENT BY 10 MINVALUE=100 MAXVALUE=1100 CYCLE; @@ -2860,6 +2861,7 @@ show create sequence d2.s1; drop sequence d.s1, d.s2, d.s3, d.s4; drop database d; drop database d2; +--enable_ps2_protocol --echo # --echo # MDEV-20070 diff --git a/mysql-test/main/nested_profiling.test b/mysql-test/main/nested_profiling.test index ba89aefc647..eff348ea5dd 100644 --- a/mysql-test/main/nested_profiling.test +++ b/mysql-test/main/nested_profiling.test @@ -29,7 +29,9 @@ SET GLOBAL profiling=on; create user mysqltest1@localhost; connect (con1,localhost,mysqltest1,,); connection con1; +--disable_ps2_protocol SELECT @a, @b; +--enable_ps2_protocol --replace_column 2 # SHOW PROFILES; diff --git a/mysql-test/main/null.test b/mysql-test/main/null.test index bf1a9c3bd1f..7c5a32e4307 100644 --- a/mysql-test/main/null.test +++ b/mysql-test/main/null.test @@ -1084,6 +1084,7 @@ DROP TABLE t1; # Testing with side effects +--disable_ps2_protocol CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2),(3); SET @a=0; @@ -1092,6 +1093,7 @@ SELECT @a; SET @a=0; SELECT NULLIF(AVG(a),0), NULLIF(AVG(LAST_VALUE(@a:=@a+1,a)),0) FROM t1; SELECT @a; +--enable_ps2_protocol # There should not be cache in here: diff --git a/mysql-test/main/null_key.test b/mysql-test/main/null_key.test index 7eabd6d5dc3..0759e99b524 100644 --- a/mysql-test/main/null_key.test +++ b/mysql-test/main/null_key.test @@ -233,6 +233,7 @@ SELECT COUNT(*) FROM t3; EXPLAIN SELECT SQL_CALC_FOUND_ROWS * FROM t1 LEFT JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.b=t3.b; FLUSH STATUS ; +--disable_ps2_protocol SELECT SQL_CALC_FOUND_ROWS * FROM t1 LEFT JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.b=t3.b; @@ -240,6 +241,7 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 LEFT JOIN t2 ON t1.a=t2.a SELECT FOUND_ROWS(); SHOW STATUS LIKE "handler_read%"; --enable_view_protocol +--enable_ps2_protocol DROP TABLE t1,t2,t3,t4; # End of 4.1 tests diff --git a/mysql-test/main/odbc.test b/mysql-test/main/odbc.test index f1d60e15bc8..4a125bfc72e 100644 --- a/mysql-test/main/odbc.test +++ b/mysql-test/main/odbc.test @@ -18,8 +18,11 @@ select {fn length("hello")}, { date "1997-10-20" }; create table t1 (a int not null auto_increment,b int not null,primary key (a,b)); insert into t1 SET A=NULL,B=1; insert into t1 SET a=null,b=2; +#Enable after fix MDEV-31307 +--disable_ps2_protocol select * from t1 where a is null and b=2; select * from t1 where a is null; +--enable_ps2_protocol explain select * from t1 where b is null; drop table t1; @@ -28,8 +31,11 @@ drop table t1; # CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY); INSERT INTO t1 VALUES (NULL); +#Enable after fix MDEV-31307 +--disable_ps2_protocol SELECT sql_no_cache a, last_insert_id() FROM t1 WHERE a IS NULL; SELECT sql_no_cache a, last_insert_id() FROM t1 WHERE a IS NULL; +--enable_ps2_protocol SELECT sql_no_cache a, last_insert_id() FROM t1; DROP TABLE t1; diff --git a/mysql-test/main/olap.test b/mysql-test/main/olap.test index 6f4048bf120..0a3d8e55858 100644 --- a/mysql-test/main/olap.test +++ b/mysql-test/main/olap.test @@ -450,6 +450,7 @@ DROP TABLE t; --echo # MDEV-14041 Server crashes in String::length on queries with functions and ROLLUP --echo # +--disable_ps2_protocol #enable view protocol after fix MDEV-28538 --disable_view_protocol @@ -460,6 +461,7 @@ SELECT HEX( RELEASE_LOCK( 'foo' ) ) AS f FROM t1 GROUP BY f WITH ROLLUP; DROP TABLE t1; --enable_view_protocol +--enable_ps2_protocol CREATE TABLE t1 (i INT); INSERT INTO t1 VALUES (1),(2); diff --git a/mysql-test/main/opt_trace.test b/mysql-test/main/opt_trace.test index 45db19ccf7b..6e3ce243e9b 100644 --- a/mysql-test/main/opt_trace.test +++ b/mysql-test/main/opt_trace.test @@ -21,6 +21,7 @@ create view v2 as select * from t1 where t1.a=1 group by t1.b; set optimizer_trace="enabled=on"; --echo # Mergeable views/derived tables +--disable_ps2_protocol --disable_view_protocol select * from v1; select * from information_schema.OPTIMIZER_TRACE; @@ -31,6 +32,7 @@ select * from information_schema.OPTIMIZER_TRACE; select * from v2; select * from information_schema.OPTIMIZER_TRACE; --enable_view_protocol +--enable_ps2_protocol drop table t1,t2; drop view v1,v2; drop function f1; diff --git a/mysql-test/main/opt_trace_security.test b/mysql-test/main/opt_trace_security.test index cf45a64d30b..414cd8f437a 100644 --- a/mysql-test/main/opt_trace_security.test +++ b/mysql-test/main/opt_trace_security.test @@ -66,7 +66,9 @@ grant show view on db1.v1 to 'bar'@'%'; --change_user foo select current_user(); set optimizer_trace="enabled=on"; +--disable_ps2_protocol select * from db1.v1; +--enable_ps2_protocol select * from information_schema.OPTIMIZER_TRACE; set optimizer_trace="enabled=off"; diff --git a/mysql-test/main/opt_tvc.test b/mysql-test/main/opt_tvc.test index f8469f22aa1..e08f0a3f664 100644 --- a/mysql-test/main/opt_tvc.test +++ b/mysql-test/main/opt_tvc.test @@ -347,6 +347,8 @@ DROP TABLE t1; --echo # MDEV-14835: conversion to TVC with BIGINT or YEAR values --echo # +#Enable after fix MDEV-31178 +--disable_ps2_protocol SET @@in_predicate_conversion_threshold= 2; CREATE TABLE t1 (a BIGINT); @@ -362,6 +364,7 @@ SELECT * FROM t2 WHERE y IN ('2009','2011'); DROP TABLE t1,t2; SET @@in_predicate_conversion_threshold= default; +--enable_ps2_protocol --echo # --echo # MDEV-17222: conversion to TVC with no names for constants diff --git a/mysql-test/main/order_by.test b/mysql-test/main/order_by.test index 3a5004d0aae..8aebc509ca7 100644 --- a/mysql-test/main/order_by.test +++ b/mysql-test/main/order_by.test @@ -1463,6 +1463,7 @@ SELECT * FROM t1 WHERE f1>10 ORDER BY f2, f0 LIMIT 0; SELECT * FROM t1 WHERE f1>10 ORDER BY f2, f0 LIMIT 10 OFFSET 10; SELECT * FROM t1 WHERE f1>10 ORDER BY f2, f0 LIMIT 0 OFFSET 10; +--disable_ps2_protocol ################ ## Test with SQL_CALC_FOUND_ROWS set sort_buffer_size= 32768; @@ -1509,6 +1510,7 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 JOIN tmp on t1.f2=tmp.f2 WHERE t1.f2>20 ORDER BY tmp.f1, f0 LIMIT 30 OFFSET 30; SELECT FOUND_ROWS(); +--enable_ps2_protocol ################ ## Test views @@ -1533,6 +1535,7 @@ GROUP BY 1 ORDER BY 2,1 LIMIT 0; ################ ## Test SP +--disable_ps2_protocol delimiter |; CREATE PROCEDURE wl1393_sp_test() BEGIN @@ -1546,6 +1549,7 @@ END| CALL wl1393_sp_test()| DROP PROCEDURE wl1393_sp_test| delimiter ;| +--enable_ps2_protocol ################ ## Test with subqueries @@ -1880,6 +1884,7 @@ insert into t1 analyze table t1; --enable_result_log +--disable_ps2_protocol explain select b, count(*) num_cnt from t1 where a > 9750 group by b order by num_cnt; @@ -1899,6 +1904,7 @@ select b, count(*) num_cnt from t1 where a > 9750 group by b order by num_cnt limit 1; --enable_result_log show status like '%Handler_read%'; +--enable_ps2_protocol drop table t0, t1; diff --git a/mysql-test/main/order_by_sortkey.test b/mysql-test/main/order_by_sortkey.test index 43de028496e..4a875b60078 100644 --- a/mysql-test/main/order_by_sortkey.test +++ b/mysql-test/main/order_by_sortkey.test @@ -57,7 +57,9 @@ set sort_buffer_size= 32768; FLUSH STATUS; SHOW SESSION STATUS LIKE 'Sort%'; +--disable_ps2_protocol SELECT * FROM t1 ORDER BY f2 LIMIT 100; +--enable_ps2_protocol SHOW SESSION STATUS LIKE 'Sort%'; diff --git a/mysql-test/main/outfile.test b/mysql-test/main/outfile.test index 9f2fc22da99..7f8f31bc748 100644 --- a/mysql-test/main/outfile.test +++ b/mysql-test/main/outfile.test @@ -8,6 +8,7 @@ enable_query_log; # Save the initial number of concurrent sessions --source include/count_sessions.inc +--disable_ps2_protocol # # test of into outfile|dumpfile @@ -139,3 +140,4 @@ drop database mysqltest; # Wait till we reached the initial number of concurrent sessions --source include/wait_until_count_sessions.inc +--enable_ps2_protocol diff --git a/mysql-test/main/outfile_loaddata.test b/mysql-test/main/outfile_loaddata.test index f9e2a357ed3..fa2c5a47051 100644 --- a/mysql-test/main/outfile_loaddata.test +++ b/mysql-test/main/outfile_loaddata.test @@ -5,6 +5,7 @@ DROP TABLE IF EXISTS t1, t2; #enable view protocol after fix MDEV-27871 -- source include/no_view_protocol.inc +--disable_ps2_protocol --echo # --echo # Bug#31663 FIELDS TERMINATED BY special character --echo # @@ -291,7 +292,7 @@ let $length= 800; SELECT LENGTH(a) FROM t2; DROP TABLE t1, t2; - +--enable_ps2_protocol ########################################################################### --echo # End of 5.1 tests. diff --git a/mysql-test/main/partition.test b/mysql-test/main/partition.test index 40736d3a08f..9374ff78091 100644 --- a/mysql-test/main/partition.test +++ b/mysql-test/main/partition.test @@ -474,6 +474,7 @@ INSERT INTO `t2` VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13), EXPLAIN PARTITIONS SELECT c1 FROM t1 WHERE (c1 > 10 AND c1 < 13) OR (c1 > 17 AND c1 < 20); +--disable_ps2_protocol FLUSH STATUS; SELECT c1 FROM t1 WHERE (c1 > 10 AND c1 < 13) OR (c1 > 17 AND c1 < 20); SHOW STATUS LIKE 'Handler_read_%'; @@ -484,6 +485,7 @@ FLUSH STATUS; SELECT c1 FROM t2 WHERE (c1 > 10 AND c1 < 13) OR (c1 > 17 AND c1 < 20); SHOW STATUS LIKE 'Handler_read_%'; DROP TABLE t1,t2; +--enable_ps2_protocol # Bug#37329 Range scan on partitioned tables shows higher Handler_read_next # (marked as duplicate of Bug#35931) @@ -505,6 +507,7 @@ INSERT INTO `t2` VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13), EXPLAIN PARTITIONS SELECT c1 FROM t1 WHERE (c1 > 2 AND c1 < 5); +--disable_ps2_protocol FLUSH STATUS; SELECT c1 FROM t1 WHERE (c1 > 2 AND c1 < 5); SHOW STATUS LIKE 'Handler_read_%'; @@ -527,6 +530,7 @@ FLUSH STATUS; SELECT c1 FROM t2 WHERE (c1 > 12 AND c1 < 15); SHOW STATUS LIKE 'Handler_read_%'; DROP TABLE t1,t2; +--enable_ps2_protocol --error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED create table t1 (a int) partition by list ((a/3)*10 div 1) diff --git a/mysql-test/main/partition_explicit_prune.test b/mysql-test/main/partition_explicit_prune.test index 9d9b7e782ce..610bdf4435b 100644 --- a/mysql-test/main/partition_explicit_prune.test +++ b/mysql-test/main/partition_explicit_prune.test @@ -10,6 +10,7 @@ WHERE VARIABLE_NAME LIKE 'HANDLER_%' AND VARIABLE_VALUE > 0; --echo # Bug#13559657: PARTITION SELECTION DOES NOT WORK WITH VIEWS --echo # --disable_view_protocol +--disable_ps2_protocol CREATE TABLE t1 (a int) ENGINE = InnoDB PARTITION BY HASH (a) PARTITIONS 2; @@ -85,7 +86,6 @@ SELECT * FROM v1; SELECT * FROM t1; DROP VIEW v1; DROP TABLE t1; ---enable_service_connection --echo # Original tests for WL#5217 --echo # Must have InnoDB as engine to get the same statistics results. @@ -101,7 +101,6 @@ eval $get_handler_status_counts; eval $get_handler_status_counts; --echo # OK, seems to add number of variables processed before HANDLER_WRITE --echo # and number of variables + 1 evaluated in the previous call in RND_NEXT ---disable_service_connection CREATE TABLE t1 (a INT NOT NULL, b varchar (64), @@ -622,6 +621,7 @@ eval $get_handler_status_counts; SELECT * FROM t3 PARTITION (pNeg); DROP TABLE t1, t2, t3; +--enable_ps2_protocol --enable_view_protocol --echo # Test from superseeded WL# 2682 # Partition select tests. diff --git a/mysql-test/main/partition_range.test b/mysql-test/main/partition_range.test index 52497764241..d5ba34df376 100644 --- a/mysql-test/main/partition_range.test +++ b/mysql-test/main/partition_range.test @@ -963,6 +963,7 @@ ANALYZE TABLE t1,t2; EXPLAIN SELECT a, MAX(b) FROM t1 WHERE a IN (10,100) GROUP BY a; EXPLAIN SELECT a, MAX(b) FROM t2 WHERE a IN (10,100) GROUP BY a; +--disable_ps2_protocol FLUSH status; SELECT a, MAX(b) FROM t1 WHERE a IN (10, 100) GROUP BY a; --echo # Should be no more than 4 reads. @@ -972,6 +973,7 @@ FLUSH status; SELECT a, MAX(b) FROM t2 WHERE a IN (10, 100) GROUP BY a; --echo # Should be no more than 4 reads. SHOW status LIKE 'handler_read_key'; +--enable_ps2_protocol --echo # --echo # MDEV-18501 Partition pruning doesn't work for historical queries diff --git a/mysql-test/main/precedence.test b/mysql-test/main/precedence.test index b93aea72e65..7837b34afc2 100644 --- a/mysql-test/main/precedence.test +++ b/mysql-test/main/precedence.test @@ -4495,7 +4495,10 @@ select 2 BETWEEN 1 AND 3 IN (SELECT 0 UNION SELECT 1), 2 BETWEEN 1 AND (3 IN (SE create or replace view v1 as select 2 LIKE 1 ESCAPE 3 IN (SELECT 0 UNION SELECT 1), 2 LIKE 1 ESCAPE (3 IN (SELECT 0 UNION SELECT 1)), (2 LIKE 1 ESCAPE 3) IN (SELECT 0 UNION SELECT 1); Select view_definition from information_schema.views where table_schema='test' and table_name='v1'; +#Enable after fix MDEV-31282 +--disable_ps2_protocol select 2 LIKE 1 ESCAPE 3 IN (SELECT 0 UNION SELECT 1), 2 LIKE 1 ESCAPE (3 IN (SELECT 0 UNION SELECT 1)), (2 LIKE 1 ESCAPE 3) IN (SELECT 0 UNION SELECT 1) union select * from v1; +--enable_ps2_protocol create or replace view v1 as select 3 BETWEEN 1 AND 2 AND NULL, 3 BETWEEN (1 AND 2) AND NULL, 3 BETWEEN 1 AND (2 AND NULL), (3 BETWEEN 1 AND 2) AND NULL; Select view_definition from information_schema.views where table_schema='test' and table_name='v1'; diff --git a/mysql-test/main/preload.test b/mysql-test/main/preload.test index 69949fccedc..f03ec16bff6 100644 --- a/mysql-test/main/preload.test +++ b/mysql-test/main/preload.test @@ -56,6 +56,7 @@ insert into t1(b) select b from t2; select count(*) from t1; select count(*) from t2; +--disable_ps2_protocol flush tables; flush status; show status like "key_read%"; @@ -99,6 +100,7 @@ flush tables; flush status; show status like "key_read%"; load index into cache t3 key (b), t2 key (c) ; show status like "key_read%"; +--enable_ps2_protocol drop table t1, t2; diff --git a/mysql-test/main/profiling.test b/mysql-test/main/profiling.test index 714c68c00c7..8ba66e6617c 100644 --- a/mysql-test/main/profiling.test +++ b/mysql-test/main/profiling.test @@ -1,6 +1,7 @@ --source include/have_profiling.inc --source include/no_view_protocol.inc +--disable_ps2_protocol # Verify that the protocol isn't violated if we ask for profiling info # before profiling has recorded anything. show profiles; @@ -257,7 +258,7 @@ drop function if exists f1; #--eval select 1; select 2; select 3; ## two continuations, one starting #select state from information_schema.profiling where seq=1 order by query_id desc limit 3; - +--enable_ps2_protocol ## last thing in the file set session profiling = OFF; diff --git a/mysql-test/main/ps.test b/mysql-test/main/ps.test index e260803a8d3..a24d045d63b 100644 --- a/mysql-test/main/ps.test +++ b/mysql-test/main/ps.test @@ -466,6 +466,7 @@ deallocate prepare stmt; # Bug#6088 "FOUND_ROWS returns wrong values for prepared statements when # LIMIT is used" # +--disable_ps2_protocol create table t1 (a int); insert into t1 (a) values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); prepare stmt from "select sql_calc_found_rows * from t1 limit 2"; @@ -477,6 +478,7 @@ execute stmt; select found_rows(); deallocate prepare stmt; drop table t1; +--enable_ps2_protocol # # Bug#6047 "permission problem when executing mysql_stmt_execute with derived @@ -558,13 +560,14 @@ drop table t1; # # Bug #6089: FOUND_ROWS returns wrong values when no table/view is used # - +--disable_ps2_protocol prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0"; execute stmt; SELECT FOUND_ROWS(); execute stmt; SELECT FOUND_ROWS(); deallocate prepare stmt; +--enable_ps2_protocol # # Bug#9096 "select doesn't return all matched records if prepared statements @@ -1412,11 +1415,13 @@ DEALLOCATE PREPARE b12651; # Bug #14956: ROW_COUNT() returns incorrect result after EXECUTE of prepared # statement # +--disable_ps2_protocol create table t1 (id int); prepare ins_call from "insert into t1 (id) values (1)"; execute ins_call; select row_count(); drop table t1; +--enable_ps2_protocol # # BUG#16474: SP crashed MySQL @@ -3568,8 +3573,10 @@ flush status; execute st; show status like '%Handler_read%'; flush status; +--disable_ps2_protocol select * from t1 use index() where a=3; show status like '%Handler_read%'; +--enable_ps2_protocol flush status; execute st; show status like '%Handler_read%'; diff --git a/mysql-test/main/ps_11bugs.test b/mysql-test/main/ps_11bugs.test index ccab833e878..1888de060fc 100644 --- a/mysql-test/main/ps_11bugs.test +++ b/mysql-test/main/ps_11bugs.test @@ -203,7 +203,9 @@ END| DELIMITER ;| +--disable_ps2_protocol SELECT * FROM t2 WHERE a = @@sort_buffer_size AND p1(@@sort_buffer_size + 1) > a - 1; +--enable_ps2_protocol DROP TABLE t2; DROP FUNCTION p1; diff --git a/mysql-test/main/query_cache.test b/mysql-test/main/query_cache.test index 81d35824e6d..f4913c99d1c 100644 --- a/mysql-test/main/query_cache.test +++ b/mysql-test/main/query_cache.test @@ -3,6 +3,7 @@ -- source include/no_valgrind_without_big.inc -- source include/no_view_protocol.inc +--disable_ps2_protocol set @save_query_cache_size=@@query_cache_size; # # Tests with query cache @@ -1805,3 +1806,4 @@ drop table t1; --echo restore defaults SET GLOBAL query_cache_type= default; SET GLOBAL query_cache_size=@save_query_cache_size; +--enable_ps2_protocol diff --git a/mysql-test/main/query_cache_merge.test b/mysql-test/main/query_cache_merge.test index 9b342d57a8e..c3267d628b9 100644 --- a/mysql-test/main/query_cache_merge.test +++ b/mysql-test/main/query_cache_merge.test @@ -38,6 +38,7 @@ while ($1) # prepare and execute, and we will get a constant validation # error. See WL#4165 for details. # +--disable_ps2_protocol --disable_view_protocol set @save_table_definition_cache= @@global.table_definition_cache; set @@global.table_definition_cache=512; @@ -54,6 +55,7 @@ drop table t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t2 SET @@global.query_cache_size=0; set @@global.table_definition_cache=@save_table_definition_cache; --enable_view_protocol +--enable_ps2_protocol # End of 4.1 tests diff --git a/mysql-test/main/query_cache_notembedded.test b/mysql-test/main/query_cache_notembedded.test index 03c9d9e4cd4..f660ca9d13e 100644 --- a/mysql-test/main/query_cache_notembedded.test +++ b/mysql-test/main/query_cache_notembedded.test @@ -113,6 +113,7 @@ disconnect root2; # query in QC from normal execution and SP (Bug#6897) # improved to also test Bug#3583 and Bug#12990 # +--disable_ps2_protocol flush query cache; reset query cache; flush status; @@ -191,6 +192,7 @@ drop procedure f2; drop procedure f3; drop procedure f4; drop table t1; +--enable_ps2_protocol # # Bug#14767 INSERT in SF + concurrent SELECT with query cache diff --git a/mysql-test/main/query_cache_with_views.test b/mysql-test/main/query_cache_with_views.test index e472a7dd478..6740c70883e 100644 --- a/mysql-test/main/query_cache_with_views.test +++ b/mysql-test/main/query_cache_with_views.test @@ -13,6 +13,8 @@ set @save_query_cache_type=@@global.query_cache_type; set GLOBAL query_cache_type=ON; set LOCAL query_cache_type=ON; set GLOBAL query_cache_size=1355776; + +--disable_ps2_protocol flush status; create table t1 (a int, b int); @@ -32,11 +34,13 @@ select * from v2; show status like "Qcache_queries_in_cache"; show status like "Qcache_inserts"; show status like "Qcache_hits"; +--enable_ps2_protocol drop view v1,v2; # SQL_CACHE option set query_cache_type=demand; +--disable_ps2_protocol flush status; # query with view will be cached, but direct acess to table will not create view v1 (c,d) as select sql_cache a,b from t1; @@ -61,6 +65,7 @@ show status like "Qcache_inserts"; show status like "Qcache_hits"; drop view v1; set query_cache_type=default; +--enable_ps2_protocol drop table t1; @@ -105,6 +110,7 @@ drop table t1; # # BUG#15119: returning temptable view from the query cache. # +--disable_ps2_protocol flush status; create table t1 (a int, b int); create algorithm=temptable view v1 as select * from t1; @@ -130,6 +136,7 @@ show status like "Qcache_queries_in_cache"; show status like "Qcache_inserts"; show status like "Qcache_hits"; drop table t1; +--enable_ps2_protocol --echo # --echo # Bug46615 Assertion in Query_cache::invalidate in INSERT in a VIEW of a MERGE table diff --git a/mysql-test/main/range_debug.test b/mysql-test/main/range_debug.test index ef331cdc84f..25783dbe285 100644 --- a/mysql-test/main/range_debug.test +++ b/mysql-test/main/range_debug.test @@ -10,7 +10,9 @@ insert into t2 select 2*(A.a + 10*(B.a + 10*C.a)) from t1 A, t1 B, t1 C; set in_predicate_conversion_threshold= 2000; set @a="select * from t2 force index (a) where a NOT IN(0"; +--disable_ps2_protocol select count(*) from (select @a:=concat(@a, ',', a) from t2 ) Z; +--enable_ps2_protocol set @a=concat(@a, ')'); insert into t2 values (11),(13),(15); diff --git a/mysql-test/main/range_vs_index_merge.test b/mysql-test/main/range_vs_index_merge.test index 81bf9c10b3a..c71811fa74d 100644 --- a/mysql-test/main/range_vs_index_merge.test +++ b/mysql-test/main/range_vs_index_merge.test @@ -698,6 +698,7 @@ DROP INDEX CityName on City; CREATE INDEX Name ON City(Name); CREATE INDEX Population ON City(Population); +--disable_ps2_protocol --disable_view_protocol --replace_column 9 # EXPLAIN @@ -759,6 +760,7 @@ SELECT * FROM City ORDER BY Population LIMIT 5; SHOW STATUS LIKE 'Handler_read_%'; --enable_view_protocol +--enable_ps2_protocol set optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/main/reset_connection.test b/mysql-test/main/reset_connection.test index dd4edc7a959..ff9b1450111 100644 --- a/mysql-test/main/reset_connection.test +++ b/mysql-test/main/reset_connection.test @@ -6,6 +6,7 @@ FLUSH STATUS; --disable_query_log --disable_service_connection +--disable_ps2_protocol let $i = 10; begin; while ($i) @@ -14,6 +15,7 @@ while ($i) SELECT 1; } commit; +--enable_ps2_protocol --enable_query_log --enable_result_log diff --git a/mysql-test/main/select.test b/mysql-test/main/select.test index ed8783d40f4..cff0038ae4d 100644 --- a/mysql-test/main/select.test +++ b/mysql-test/main/select.test @@ -2184,6 +2184,7 @@ drop table t2; # # Bug #11745: SELECT ... FROM DUAL with WHERE condition # +--disable_ps2_protocol --disable_view_protocol CREATE TABLE t1 (a int, b int, c int); INSERT INTO t1 @@ -2203,8 +2204,9 @@ select count(*) from t1 limit 2,3; select found_rows(); select SQL_CALC_FOUND_ROWS count(*) from t1 limit 2,3; select found_rows(); ---enable_view_protocol DROP TABLE t1; +--enable_view_protocol +--enable_ps2_protocol # # Bug 7672 Unknown column error in order clause @@ -3731,6 +3733,7 @@ DROP TABLE t1; # # Bug #32942 now() - interval '7200' second is NOT pre-calculated, causing "full table scan" # +--disable_ps2_protocol --disable_view_protocol CREATE TABLE t1 (a INT, b INT); CREATE TABLE t2 (a INT, c INT, KEY(a)); @@ -3746,6 +3749,8 @@ SELECT DISTINCT b FROM t1 LEFT JOIN t2 USING(a) WHERE c <= 3; SHOW STATUS LIKE 'Handler_read%'; DROP TABLE t1, t2; --enable_view_protocol +--enable_ps2_protocol + # # Bug#40953 SELECT query throws "ERROR 1062 (23000): Duplicate entry..." error # @@ -4104,7 +4109,9 @@ END;| delimiter ;| SET @cnt := 0; +--disable_ps2_protocol SELECT * FROM t1 WHERE a = f1(); +--enable_ps2_protocol SELECT @cnt; EXPLAIN EXTENDED SELECT * FROM t1 WHERE a = f1(); DROP TABLE t1, t2; diff --git a/mysql-test/main/select_found.test b/mysql-test/main/select_found.test index 4b6bdbb15e1..dac16fdb727 100644 --- a/mysql-test/main/select_found.test +++ b/mysql-test/main/select_found.test @@ -10,6 +10,7 @@ drop table if exists t1,t2; --enable_warnings +--disable_ps2_protocol create table t1 (a int not null auto_increment, b int not null, primary key(a)); insert into t1 (b) values (2),(3),(5),(5),(5),(6),(7),(9); select SQL_CALC_FOUND_ROWS * from t1; @@ -292,3 +293,4 @@ select found_rows(); select sql_calc_found_rows * from t1 order by c1 limit 2,1; select found_rows(); drop table t1; +--enable_ps2_protocol diff --git a/mysql-test/main/selectivity.test b/mysql-test/main/selectivity.test index b0c440718d1..7ba7065ef1c 100644 --- a/mysql-test/main/selectivity.test +++ b/mysql-test/main/selectivity.test @@ -1093,14 +1093,18 @@ set @save_use_stat_tables= @@use_stat_tables; set @@use_stat_tables='complementary'; set @@optimizer_use_condition_selectivity=4; SET @cnt= 0; +--disable_ps2_protocol SELECT * FROM t1 WHERE a = f1(); +--enable_ps2_protocol SELECT @cnt; set @@use_stat_tables='preferably'; analyze table t1 persistent for all; SET @cnt := 0; set @@optimizer_use_condition_selectivity=4; +--disable_ps2_protocol SELECT * FROM t1 WHERE a = f1(); +--enable_ps2_protocol SELECT @cnt; alter table t1 force; drop table t1; diff --git a/mysql-test/main/set_statement.test b/mysql-test/main/set_statement.test index aae7cea40d1..f9d7c098327 100644 --- a/mysql-test/main/set_statement.test +++ b/mysql-test/main/set_statement.test @@ -976,6 +976,7 @@ SET STATEMENT keycache1.key_buffer_size=1024 FOR SELECT 1; # # MDEV-6940: SET STATEMENT executed after SET GLOBAL does not work # +--disable_ps2_protocol --disable_view_protocol set @save_general_log=@@global.general_log; --echo # SET STATEMENT works (OK) @@ -1038,6 +1039,7 @@ set statement long_query_time=0.01,min_examined_row_limit=50 for select sleep(0. select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%'; --echo #--- --enable_view_protocol +--enable_ps2_protocol # # log_slow_verbosity is impossible to check because results are not written # in TABLE mode diff --git a/mysql-test/main/set_statement_notembedded_binlog.test b/mysql-test/main/set_statement_notembedded_binlog.test index b0c00008d4f..22a0e5fc749 100644 --- a/mysql-test/main/set_statement_notembedded_binlog.test +++ b/mysql-test/main/set_statement_notembedded_binlog.test @@ -41,7 +41,9 @@ DELIMITER ;| call mtr.add_suppression("Unsafe statement written to the binary log using"); +--disable_ps2_protocol select f1() from t2; +--enable_ps2_protocol --replace_column 1 x 2 x 3 x 4 x 5 x show binlog events limit 16, 100; @@ -71,7 +73,9 @@ BEGIN end| DELIMITER ;| +--disable_ps2_protocol select f1() from t2; +--enable_ps2_protocol --replace_column 1 x 2 x 3 x 4 x 5 x show binlog events limit 13, 100; diff --git a/mysql-test/main/show_check.test b/mysql-test/main/show_check.test index 38bcb5f14e7..bc44a76322c 100644 --- a/mysql-test/main/show_check.test +++ b/mysql-test/main/show_check.test @@ -608,8 +608,10 @@ show tables; show status like 'slow_queries'; # Table scan query, to ensure that slow_queries does still get incremented # (mysqld is started with --log-queries-not-using-indexes) +--disable_ps2_protocol select 1 from information_schema.tables limit 1; show status like 'slow_queries'; +--enable_ps2_protocol create table t1 (a int); create trigger tr1 before insert on t1 for each row @@ -969,6 +971,7 @@ DROP FUNCTION f1; # # Bug#28808 log_queries_not_using_indexes variable dynamic change is ignored # +--disable_ps2_protocol flush status; show variables like "log_queries_not_using_indexes"; select 1 from information_schema.tables limit 1; @@ -981,6 +984,7 @@ set session log_queries_not_using_indexes=ON; show variables like "log_queries_not_using_indexes"; select 1 from information_schema.tables limit 1; show status like 'slow_queries'; +--enable_ps2_protocol # # Bug#30088 Can't disable myisam-recover by a value of "" diff --git a/mysql-test/main/show_profile.test b/mysql-test/main/show_profile.test index fe923d74a0e..969fb49a3eb 100644 --- a/mysql-test/main/show_profile.test +++ b/mysql-test/main/show_profile.test @@ -10,6 +10,7 @@ -- source include/no_view_protocol.inc --source include/have_profiling.inc +--disable_ps2_protocol SET profiling = 1; SELECT 1; --replace_column 2 # @@ -19,4 +20,4 @@ SHOW PROFILE FOR QUERY 1; SHOW PROFILE CPU FOR QUERY 1; --enable_result_log SET profiling = 0; - +--enable_ps2_protocol diff --git a/mysql-test/main/single_delete_update.test b/mysql-test/main/single_delete_update.test index 4a4ad5e5a8e..0f2dc189e94 100644 --- a/mysql-test/main/single_delete_update.test +++ b/mysql-test/main/single_delete_update.test @@ -6,6 +6,7 @@ # an additional util connection and other statistics data -- source include/no_view_protocol.inc +--disable_ps2_protocol --echo # --echo # Bug #30584: delete with order by and limit clauses does not use --echo # limit efficiently @@ -455,4 +456,4 @@ SHOW STATUS LIKE 'Handler_read_%'; SELECT * FROM t2 WHERE c = 10 ORDER BY a DESC, b DESC; DROP TABLE t1, t2; - +--enable_ps2_protocol diff --git a/mysql-test/main/sp-error.test b/mysql-test/main/sp-error.test index b3c999592df..07c82d4b616 100644 --- a/mysql-test/main/sp-error.test +++ b/mysql-test/main/sp-error.test @@ -8,9 +8,11 @@ drop table if exists t1, t2; --enable_warnings +--disable_ps2_protocol # Backup the mysql.proc table --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval SELECT * FROM mysql.proc INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/proc.txt'; +--enable_ps2_protocol # Make sure we don't have any procedures left. delete from mysql.proc; @@ -419,6 +421,7 @@ unlock tables| # Check that in functions we don't allow to update tables which # are used by statements which invoke these functions. # +--disable_ps2_protocol --disable_warnings drop function if exists f1| --enable_warnings @@ -442,7 +445,7 @@ select * from t1| # Cleanup delete from t1 where val= 17| drop function f1| - +--enable_ps2_protocol # # BUG#1965 @@ -2273,7 +2276,9 @@ begin return 1; end| delimiter ;| +--disable_ps2_protocol select f2(); +--enable_ps2_protocol drop function f2; --error ER_BAD_TABLE_ERROR @@ -3474,6 +3479,7 @@ DROP PROCEDURE p13; --echo # Bug#12731619: NESTED SP HANDLERS CAN TRIGGER ASSERTION --echo +--disable_ps2_protocol --disable_warnings DROP FUNCTION IF EXISTS f1; DROP TABLE IF EXISTS t1; @@ -3523,7 +3529,7 @@ SELECT * FROM t1; DROP FUNCTION f1; DROP TABLE t1; - +--enable_ps2_protocol --echo --echo # Check that handled SQL-conditions are properly cleared from DA. diff --git a/mysql-test/main/sp-prelocking.test b/mysql-test/main/sp-prelocking.test index fd754a9371c..94db36167fa 100644 --- a/mysql-test/main/sp-prelocking.test +++ b/mysql-test/main/sp-prelocking.test @@ -408,8 +408,10 @@ BEGIN END ! DELIMITER ;! +--disable_ps2_protocol --echo # Without the patch, an error was getting reported. SELECT f1(); +--enable_ps2_protocol DROP FUNCTION f1; DROP VIEW v1; diff --git a/mysql-test/main/sp-vars.test b/mysql-test/main/sp-vars.test index ba8cd4f5ca8..1d577814c1b 100644 --- a/mysql-test/main/sp-vars.test +++ b/mysql-test/main/sp-vars.test @@ -1015,7 +1015,9 @@ BEGIN END| delimiter ;| +--disable_ps2_protocol SELECT f1('_aBcDe_'); +--enable_ps2_protocol SELECT * FROM t1; @@ -1434,6 +1436,7 @@ end| create table t1 (a int)| insert into t1 (a) values (1), (2)| +--disable_ps2_protocol set @b=1| set @a=0| select f1(), @b from t1| @@ -1441,6 +1444,7 @@ select f1(), @b from t1| set @b:='test'| set @a=0| select f1(), @b from t1| +--enable_ps2_protocol delimiter ;| diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test index 39bab1c40fa..84ad4ea7453 100644 --- a/mysql-test/main/sp.test +++ b/mysql-test/main/sp.test @@ -722,6 +722,7 @@ begin insert into test.t1 values (concat(x, "2"), y+2); end| +--disable_ps2_protocol # Check that file does not exists --error 1 --file_exists $MYSQLTEST_VARDIR/tmp/spout @@ -729,6 +730,7 @@ call into_outfile("ofile", 1)| --remove_file $MYSQLTEST_VARDIR/tmp/spout delete from t1| drop procedure into_outfile| +--enable_ps2_protocol --disable_warnings drop procedure if exists into_dumpfile| @@ -1148,6 +1150,7 @@ begin insert into t1 values ("a", 1), ("b", 2), ("c", 3); end| +--disable_ps2_protocol call rc()| select row_count()| --disable_ps_protocol @@ -1161,7 +1164,7 @@ select row_count()| select * from t1| select row_count()| drop procedure rc| - +--enable_ps2_protocol # # Let us test how well new locking scheme works. @@ -1661,6 +1664,7 @@ begin end if; return x; end| +--disable_ps2_protocol select * from t1 where data = getcount("bar")| select * from t3| select getcount("zip")| @@ -1669,6 +1673,7 @@ select * from t3| select getcount(id) from t1 where data = 3| select getcount(id) from t1 where data = 5| select * from t3| +--enable_ps2_protocol drop table t3| drop function getcount| @@ -3161,6 +3166,7 @@ begin insert into t3 values (1); end| +--disable_ps2_protocol call bug4905()| select row_count()| call bug4905()| @@ -3168,6 +3174,7 @@ select row_count()| call bug4905()| select row_count()| select * from t3| +--enable_ps2_protocol drop procedure bug4905| drop table t3| @@ -3765,8 +3772,10 @@ if (`select @@have_query_cache='YES'`) { --enable_query_log set @x = 1| insert into t1 values ("qc", 42)| +--disable_ps2_protocol select bug9902() from t1| select bug9902() from t1| +--enable_ps2_protocol select @x| --echo # Restore the old query cache size @@ -6234,7 +6243,9 @@ CREATE FUNCTION bug19862(x INT) RETURNS INT RETURN x+1; END| INSERT INTO t12 VALUES (1), (2)| +--disable_ps2_protocol SELECT bug19862(a) FROM t12 ORDER BY 1| +--enable_ps2_protocol SELECT * FROM t11| DROP TABLE t11, t12| DROP FUNCTION bug19862| @@ -6799,7 +6810,9 @@ END| CREATE FUNCTION bug23760_rc_test(in_var INT) RETURNS INT RETURN in_var| INSERT INTO bug23760 (num) VALUES (0), (1), (1), (2), (3), (5), (8)| +--disable_ps2_protocol SELECT ROW_COUNT()| +--enable_ps2_protocol CALL bug23760_test_row_count()| SELECT * FROM bug23760_log ORDER BY id| @@ -6809,14 +6822,18 @@ SELECT @save_max_sp_recursion| SET max_sp_recursion_depth= 5| SELECT @@max_sp_recursion_depth| CALL bug23760_test_row_count2(2)| +--disable_ps2_protocol SELECT ROW_COUNT()| +--enable_ps2_protocol SELECT * FROM bug23760_log ORDER BY id| SELECT * FROM bug23760 ORDER by ID| SET max_sp_recursion_depth= @save_max_sp_recursion| SELECT bug23760_rc_test(123)| INSERT INTO bug23760 (num) VALUES (13), (21), (34), (55)| +--disable_ps2_protocol SELECT bug23760_rc_test(ROW_COUNT())| +--enable_ps2_protocol DROP TABLE bug23760, bug23760_log| DROP PROCEDURE bug23760_update_log| diff --git a/mysql-test/main/sp_trans.test b/mysql-test/main/sp_trans.test index 7d6faba9789..1ceb54007e5 100644 --- a/mysql-test/main/sp_trans.test +++ b/mysql-test/main/sp_trans.test @@ -83,7 +83,9 @@ create function bug10015_4(i int) returns int insert into t2 values (i, m); return m; end| +--disable_ps2_protocol select *, bug10015_4(id) from t1| +--enable_ps2_protocol select * from t2| drop function bug10015_4| # Now let us test how statement rollback works @@ -327,10 +329,14 @@ commit| set autocommit= 1| # Let us test that savepoints work inside of functions # even in auto-commit mode +--disable_ps2_protocol select bug13825_3(0)| +--enable_ps2_protocol select * from t1| delete from t1| +--disable_ps2_protocol select bug13825_3(1)| +--enable_ps2_protocol select * from t1| delete from t1| # Curious case: rolling back to savepoint which is set by first diff --git a/mysql-test/main/statistics.test b/mysql-test/main/statistics.test index 8d9ef79b69f..e6b300b5db2 100644 --- a/mysql-test/main/statistics.test +++ b/mysql-test/main/statistics.test @@ -319,6 +319,7 @@ SELECT * FROM mysql.column_stats; SELECT * FROM mysql.index_stats; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/save_column_stats' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' @@ -328,6 +329,7 @@ eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/save_index_stats' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM mysql.index_stats WHERE index_name IN ('idx1', 'idx4'); +--enable_ps2_protocol ALTER TABLE t1 CHANGE COLUMN b x varchar(30); SHOW CREATE TABLE t1; diff --git a/mysql-test/main/status2.test b/mysql-test/main/status2.test index ea674c2ed7c..339e853f2fc 100644 --- a/mysql-test/main/status2.test +++ b/mysql-test/main/status2.test @@ -3,6 +3,7 @@ --echo # --echo # Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines --echo # +--disable_ps2_protocol FLUSH STATUS; DELIMITER $$; CREATE FUNCTION testQuestion() RETURNS INTEGER @@ -64,6 +65,7 @@ DROP TRIGGER trigg1; DROP FUNCTION testQuestion; DROP EVENT ev1; DROP TABLE t1,t2; +--enable_ps2_protocol --echo # --echo # End of 5.5 tests diff --git a/mysql-test/main/subselect.test b/mysql-test/main/subselect.test index 77da710a535..a17fc408500 100644 --- a/mysql-test/main/subselect.test +++ b/mysql-test/main/subselect.test @@ -1166,6 +1166,7 @@ DROP TABLE t1; # Bug#2198 SELECT INTO OUTFILE (with Sub-Select) Problem # +--disable_ps2_protocol create table t1 (a int, b decimal(13, 3)); insert into t1 values (1, 0.123); let $outfile_abs= $MYSQLTEST_VARDIR/tmp/subselect.out.file.1; @@ -1178,7 +1179,7 @@ eval load data infile "$outfile_rel" into table t1; --remove_file $outfile_abs select * from t1; drop table t1; - +--enable_ps2_protocol # # Bug#2479 dependant subquery with limit crash @@ -5843,6 +5844,7 @@ SELECT WHERE b = a AND (b = alias1.b OR EXISTS (SELECT * FROM t3))) AS m FROM t2 alias1, t1 alias2, t1 alias3; +--disable_ps2_protocol flush status; SELECT @@ -5870,6 +5872,7 @@ FROM t2 alias1, t1 alias2, t1 alias3; show status like "subquery_cache%"; show status like '%Handler_read%'; +--enable_ps2_protocol drop table t1, t2, t3; @@ -5915,8 +5918,10 @@ set global userstat=on; flush table_statistics; flush index_statistics; +--disable_ps2_protocol SELECT MIN(b) FROM ( SELECT * FROM t1, t2, t3 WHERE d = b ) AS alias1 WHERE SLEEP(0.1) OR c < 'p' OR b = ( SELECT MIN(b) FROM t2 ); +--enable_ps2_protocol --echo # The following shows that t2 was indeed scanned with a full scan. show table_statistics; diff --git a/mysql-test/main/subselect3.inc b/mysql-test/main/subselect3.inc index af7b45542bd..881cda2e736 100644 --- a/mysql-test/main/subselect3.inc +++ b/mysql-test/main/subselect3.inc @@ -57,7 +57,9 @@ select a, oref, a in ( create table t3 (a int); insert into t3 values (NULL), (NULL); flush status; +--disable_ps2_protocol select a in (select max(ie) from t1 where oref=4 group by grp) from t3; +--enable_ps2_protocol show status like 'Handler_read_rnd_next'; select ' ^ This must show 11' Z; @@ -92,6 +94,7 @@ select oref, a, a in (select a from t1 where oref=t2.oref) Z from t2; explain extended select oref, a, a in (select a from t1 where oref=t2.oref) Z from t2; +--disable_ps2_protocol flush status; select oref, a from t2 where a in (select a from t1 where oref=t2.oref); # This will only show access to t2: @@ -107,6 +110,7 @@ select oref, a, a in (select a from t1 where oref=t2.oref) Z from t2; show status like '%Handler_read%'; select 'No key lookups, seq reads: 29= 5 reads from t2 + 4 * 6 reads from t1.' Z; set @@optimizer_switch=@save_optimizer_switch; +--enable_ps2_protocol drop table t1, t2; @@ -637,7 +641,9 @@ DROP TABLE t1, t2; create table t1 (a int, b decimal(13, 3)); insert into t1 values (1, 0.123); +--disable_ps2_protocol select a, (select max(b) from t1) into outfile "subselect.out.file.1" from t1; +--enable_ps2_protocol delete from t1; load data infile "subselect.out.file.1" into table t1; select * from t1; @@ -805,6 +811,7 @@ FLUSH STATUS; set @save_optimizer_switch2=@@optimizer_switch; set optimizer_switch='subquery_cache=off'; +--disable_ps2_protocol --echo SELECT i1, i2 FROM t1 @@ -831,6 +838,7 @@ WHERE (i1, i2) --echo # Handler_read_rnd_next should be one more than baseline --echo # (read record from t1, but do not read from t2) SHOW STATUS LIKE '%Handler_read_rnd_next'; +--enable_ps2_protocol set @@optimizer_switch=@save_optimizer_switch2; DROP TABLE t1,t2; @@ -969,7 +977,9 @@ set @@max_heap_table_size= 16384; explain select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E where a+1 < 10000 + A.a + B.a +C.a+D.a); flush status; +--disable_ps2_protocol select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E where a+1 < 10000 + A.a + B.a +C.a+D.a); +--enable_ps2_protocol show status like 'Created_tmp_disk_tables'; set @save_max_heap_table_size=@@max_heap_table_size; set @@optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/main/subselect4.test b/mysql-test/main/subselect4.test index 3283779ff4b..1db2a576612 100644 --- a/mysql-test/main/subselect4.test +++ b/mysql-test/main/subselect4.test @@ -1766,7 +1766,8 @@ EXPLAIN SELECT MAX(a), 1 >= ALL ( SELECT b FROM t2 ) AS bb FROM t1; SELECT MAX(a), 1 >= ALL ( SELECT b FROM t2 ) AS bb FROM t1; - +#enable after fix MDEV-31270 +--disable_ps2_protocol EXPLAIN SELECT MAX(a), ( SELECT 1 FROM t2 where b = a) AS bb FROM t1; SELECT MAX(a), ( SELECT 1 FROM t2 where b = a) AS bb FROM t1; @@ -1778,6 +1779,7 @@ SELECT MAX(a), a in ( SELECT b FROM t2 ) AS bb FROM t1; EXPLAIN SELECT MAX(a), a >= ALL ( SELECT b FROM t2 ) AS bb FROM t1; SELECT MAX(a), a >= ALL ( SELECT b FROM t2 ) AS bb FROM t1; +--enable_ps2_protocol drop table t1, t2; diff --git a/mysql-test/main/subselect_cache.test b/mysql-test/main/subselect_cache.test index 6b6fc4773f1..d5bad32aa64 100644 --- a/mysql-test/main/subselect_cache.test +++ b/mysql-test/main/subselect_cache.test @@ -22,6 +22,7 @@ insert into t2 values (2,3),(3,4),(5,6),(4,1); --echo * Test subquery as top item in different clauses --echo * --echo #single value subquery test (SELECT list) +--disable_ps2_protocol flush status; select a, (select d from t2 where b=c) from t1; @@ -341,7 +342,7 @@ flush status; select a, b, (select exists (select * from t2 where b=d) from t2 where b=c) as SUNS1 from t1; show status like "subquery_cache%"; show status like '%Handler_read%'; - +--enable_ps2_protocol --echo #clean up drop table t1,t2; @@ -421,6 +422,7 @@ DROP TABLE t1; --echo #uncacheable queries test (random and side effect) +--disable_ps2_protocol flush status; CREATE TABLE t1 (a int); INSERT INTO t1 VALUES (2), (4), (1), (3); @@ -431,6 +433,7 @@ show status like "subquery_cache%"; select a, a in (select a from t1 where -1 < benchmark(a,100)) from t1 as ext; show status like "subquery_cache%"; drop table t1; +--enable_ps2_protocol --echo #test of sql_big_tables switch and outer table reference in subquery with grouping set big_tables=1; @@ -456,6 +459,7 @@ insert into t1 values (2,1), (3,1), (2,4), (3,4), (10,2), (20,2), (2,5), (3,5), (100,3), (200,3), (10,6), (20,6), (20,7), (100,8), (200,8); insert into t2 values (1,1),(3,3),(20,20); +--disable_ps2_protocol --echo aggregate function as parameter of subquery set optimizer_switch='subquery_cache=off'; flush status; @@ -480,6 +484,7 @@ flush status; select max(a), (select a from t2 where a=c) from t1 group by b; show status like "subquery_cache%"; show status like '%Handler_read%'; +--enable_ps2_protocol drop table t1,t2; @@ -494,6 +499,7 @@ insert into t1 values create table t2 (pk int, a int, primary key(pk)); insert into t2 select a,a from t0; +--disable_ps2_protocol set optimizer_switch='default,semijoin=on,materialization=on,subquery_cache=on'; flush status; select * from t1 where a in (select pk from t2); @@ -525,6 +531,7 @@ flush status; select * from t1 where a in (select pk from t2); show status like "subquery_cache%"; show status like '%Handler_read%'; +--enable_ps2_protocol drop table t0,t1,t2; @@ -1308,6 +1315,7 @@ CREATE TABLE `t4` ( ) ENGINE=MyISAM AUTO_INCREMENT=101 DEFAULT CHARSET=latin1; INSERT INTO `t4` VALUES (100,2,5,'2001-07-26','2001-07-26','11:49:25','11:49:25','2007-04-25 05:08:49','2007-04-25 05:08:49','f','f'); +--disable_ps2_protocol SET @@optimizer_switch = 'subquery_cache=off'; /* cache is off */ SELECT COUNT( DISTINCT table2 .`col_int_key` ) , ( @@ -1325,6 +1333,7 @@ FROM t3 SUBQUERY2_t1 JOIN t2 ON SUBQUERY2_t1 .`col_int_key` WHERE table1 .`col_varchar_key` ) , table2 .`col_varchar_nokey` field10 FROM t4 table1 JOIN ( t1 table2 STRAIGHT_JOIN t1 table3 ON table2 .`pk` ) ON table3 .`col_varchar_key` = table2 .`col_varchar_key` GROUP BY field10 ; +--enable_ps2_protocol drop table t1,t2,t3,t4; set @@optimizer_switch= default; diff --git a/mysql-test/main/subselect_sj_mat.test b/mysql-test/main/subselect_sj_mat.test index 362d090c004..b5657199ebd 100644 --- a/mysql-test/main/subselect_sj_mat.test +++ b/mysql-test/main/subselect_sj_mat.test @@ -523,6 +523,8 @@ where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0'); # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB +#Check after fix MDEV-31276 +--disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_512 where a1 in (select group_concat(b1) from t2_512 group by b2); @@ -540,6 +542,7 @@ where a1 in (select group_concat(b1) from t2_512 group by b2); select left(a1,7), left(a2,7) from t1_512 where a1 in (select group_concat(b1) from t2_512 group by b2); +--enable_ps2_protocol drop table t1_512, t2_512, t3_512; @@ -605,6 +608,8 @@ where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0'); # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB +#Check after fix MDEV-31276 +--disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_1024 where a1 in (select group_concat(b1) from t2_1024 group by b2); @@ -622,6 +627,7 @@ where a1 in (select group_concat(b1) from t2_1024 group by b2); select left(a1,7), left(a2,7) from t1_1024 where a1 in (select group_concat(b1) from t2_1024 group by b2); +--enable_ps2_protocol drop table t1_1024, t2_1024, t3_1024; @@ -687,6 +693,8 @@ where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0'); # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB +#Check after fix MDEV-31276 +--disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_1025 where a1 in (select group_concat(b1) from t2_1025 group by b2); @@ -704,6 +712,7 @@ where a1 in (select group_concat(b1) from t2_1025 group by b2); select left(a1,7), left(a2,7) from t1_1025 where a1 in (select group_concat(b1) from t2_1025 group by b2); +--enable_ps2_protocol drop table t1_1025, t2_1025, t3_1025; diff --git a/mysql-test/main/tc_heuristic_recover.test b/mysql-test/main/tc_heuristic_recover.test index 8cbf7d61143..c240ff2df51 100644 --- a/mysql-test/main/tc_heuristic_recover.test +++ b/mysql-test/main/tc_heuristic_recover.test @@ -43,8 +43,10 @@ set debug_sync='ha_commit_trans_after_prepare WAIT_FOR go'; --echo # Prove that no COMMIT or ROLLBACK occurred yet. SELECT * FROM t1; +--disable_ps2_protocol SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM t1; +--enable_ps2_protocol # TODO: MDEV-12700 Allow innodb_read_only startup without prior slow shutdown. --source include/kill_mysqld.inc @@ -90,8 +92,10 @@ SELECT * FROM t1; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM t1; +--disable_ps2_protocol SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM t1; +--enable_ps2_protocol # # Cleanup # diff --git a/mysql-test/main/trigger-compat.test b/mysql-test/main/trigger-compat.test index 4d9160c7728..9c102993a6f 100644 --- a/mysql-test/main/trigger-compat.test +++ b/mysql-test/main/trigger-compat.test @@ -68,9 +68,11 @@ let $MYSQLD_DATADIR = `select @@datadir`; eval LOAD DATA LOCAL INFILE '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' INTO TABLE patch; # remove original t1.TRG file so SELECT INTO OUTFILE won't fail --remove_file $MYSQLD_DATADIR/mysqltest_db1/t1.TRG +--disable_ps2_protocol eval SELECT SUBSTRING_INDEX(a,'definers=',1) INTO OUTFILE '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' FROM patch; +--enable_ps2_protocol DROP TABLE patch; --connection wl2818_definer_con --enable_query_log diff --git a/mysql-test/main/trigger-trans.test b/mysql-test/main/trigger-trans.test index 17656c3516e..b79743d49f3 100644 --- a/mysql-test/main/trigger-trans.test +++ b/mysql-test/main/trigger-trans.test @@ -91,6 +91,7 @@ begin end| delimiter ;| +--disable_ps2_protocol # Establish an alternative connection. --connect (connection_aux,localhost,root,,test,,) --connect (connection_update,localhost,root,,test,,) @@ -122,6 +123,8 @@ connection connection_aux; select release_lock("lock_bug26141_wait"); connection default; reap; +--enable_ps2_protocol + select * from t1; select * from t2; select * from t3; diff --git a/mysql-test/main/trigger_notembedded.test b/mysql-test/main/trigger_notembedded.test index 9f89e66bbfe..82e97dd3988 100644 --- a/mysql-test/main/trigger_notembedded.test +++ b/mysql-test/main/trigger_notembedded.test @@ -820,6 +820,7 @@ USE test; # # Bug #26162: Trigger DML ignores low_priority_updates setting # +--disable_ps2_protocol CREATE TABLE t1 (id INTEGER); CREATE TABLE t2 (id INTEGER); @@ -889,6 +890,7 @@ DROP TRIGGER t1_test; DROP TABLE t1,t2; SET SESSION LOW_PRIORITY_UPDATES=DEFAULT; SET GLOBAL LOW_PRIORITY_UPDATES=DEFAULT; +--enable_ps2_protocol --echo End of 5.0 tests. diff --git a/mysql-test/main/type_date.test b/mysql-test/main/type_date.test index cbc3c67bf64..81cad6b5af5 100644 --- a/mysql-test/main/type_date.test +++ b/mysql-test/main/type_date.test @@ -787,6 +787,7 @@ DROP TABLE t1; --echo # --echo # MDEV-29890 Update with inner join false row count result --echo # +--disable_ps2_protocol set sql_mode='NO_ZERO_DATE'; create table t1 (a1 bigint primary key, a2 date not null, a3 bigint not null); create table t2 (b1 bigint primary key); @@ -800,6 +801,7 @@ set sql_mode='NO_ZERO_DATE'; update t1 inner join t2 on t1.a3 = t2.b1 set t1.a2 = t1.a2 + interval 1 day; drop table t1, t2; set sql_mode=default; +--enable_ps2_protocol --echo # --echo # End of 10.4 tests diff --git a/mysql-test/main/type_datetime.test b/mysql-test/main/type_datetime.test index 5816977029d..4a14bee4319 100644 --- a/mysql-test/main/type_datetime.test +++ b/mysql-test/main/type_datetime.test @@ -287,6 +287,7 @@ drop table t1; # Bug#28261: Wrong DATETIME comparison result when the GET_USER_VAR function # is involved. # +--disable_ps2_protocol create table t1(f1 date); insert into t1 values('01-01-01'),('02-02-02'),('01-01-01'),('02-02-02'); set @bug28261=''; @@ -294,6 +295,7 @@ select if(@bug28261 = f1, '', @bug28261:= f1) from t1; select if(@bug28261 = f1, '', @bug28261:= f1) from t1; select if(@bug28261 = f1, '', @bug28261:= f1) from t1; drop table t1; +--enable_ps2_protocol # # Bug#28778: Wrong result of BETWEEN when comparing a DATETIME field with an diff --git a/mysql-test/main/type_newdecimal.test b/mysql-test/main/type_newdecimal.test index 070b465b71a..366199e8aa8 100644 --- a/mysql-test/main/type_newdecimal.test +++ b/mysql-test/main/type_newdecimal.test @@ -1215,7 +1215,9 @@ CREATE TABLE t1 (a int DEFAULT NULL, b int DEFAULT NULL); INSERT INTO t1 VALUES (3,30), (1,10), (2,10); SET @a= CAST(1 AS decimal); +--disable_ps2_protocol SELECT 1 FROM t1 GROUP BY @b := @a, @b; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/main/type_timestamp.test b/mysql-test/main/type_timestamp.test index c8517656071..3df9aa4671b 100644 --- a/mysql-test/main/type_timestamp.test +++ b/mysql-test/main/type_timestamp.test @@ -403,12 +403,14 @@ INSERT INTO t2 VALUES( '2010-02-01 09:31:11' ); --echo # The bug would cause the range optimizer's comparison to use an open --echo # interval here. This reveals itself only in the number of reads --echo # performed. +--disable_ps2_protocol FLUSH STATUS; --replace_column 1 x 2 x 3 x 5 x 6 x 7 x 8 x 9 x 10 x EXPLAIN SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0'; SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0'; SHOW STATUS LIKE 'Handler_read_next'; +--enable_ps2_protocol DROP TABLE t1, t2; @@ -740,7 +742,9 @@ FLUSH TABLES; # 0xFF - record flags # 0x77777777 - TIMESTAMP integer part # 0xFFFFFF - TIMESTAMP bad fractional part +--disable_ps2_protocol --eval SELECT CONCAT(0xFF,0x77777777,0xFFFFFF) INTO OUTFILE '$MYSQLD_DATADIR/test/t1.MYD' FIELDS TERMINATED BY '' ESCAPED BY '' LINES TERMINATED BY '' +--enable_ps2_protocol --eval SELECT HEX(LOAD_FILE('$MYSQLD_DATADIR/test/t1.MYD')) AS MYD --enable_query_log SELECT a, CAST(a AS DATETIME) AS dt0, CAST(a AS DATETIME(6)) AS dt6 FROM t1; diff --git a/mysql-test/main/type_year.test b/mysql-test/main/type_year.test index c4fb45a60fc..c281bdb7d97 100644 --- a/mysql-test/main/type_year.test +++ b/mysql-test/main/type_year.test @@ -185,7 +185,10 @@ insert t1 values (0,2000); select a from t1 where a=2000; # constant. select a from t1 where a=1000+1000; # still a constant. # select a from t1 where a=(select 2000); # even this is a constant +#Check after fix MDEV-31277 +--disable_ps2_protocol select a from t1 where a=(select 2000 from dual where 1); # constant, but "expensive" +--enable_ps2_protocol select a from t1 where a=y2k(); # constant, but "expensive" select a from t1 where a=b; # not a constant drop table t1; diff --git a/mysql-test/main/union.test b/mysql-test/main/union.test index 31c02edb324..278958d800c 100644 --- a/mysql-test/main/union.test +++ b/mysql-test/main/union.test @@ -22,6 +22,7 @@ select 't1',b,count(*) from t1 group by b UNION select 't2',b,count(*) from t2 g --error ER_TABLENAME_NOT_ALLOWED_HERE (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by t1.b; explain extended (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; +--disable_ps2_protocol --disable_view_protocol select count(*) from ( (select a,b from t1 limit 2) union all (select a,b from t2 order by a)) q; @@ -32,6 +33,7 @@ select a,b from t1 union all select a,b from t2) q; select sql_calc_found_rows a,b from t1 union all select a,b from t2 limit 2; select found_rows(); --enable_view_protocol +--enable_ps2_protocol # # Test some error conditions with UNION # @@ -206,6 +208,7 @@ insert into t1 values (1),(2),(3); create table t2 (a int); insert into t2 values (3),(4),(5); +--disable_ps2_protocol --disable_view_protocol # Test global limits SELECT COUNT(*) FROM ( @@ -233,14 +236,17 @@ SELECT COUNT(*) FROM ( (SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION SELECT * FROM t2 LIMIT 1; select found_rows(); --enable_view_protocol +--enable_ps2_protocol # In these case found_rows() should work --error ER_PARSE_ERROR SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION all SELECT * FROM t2 LIMIT 2; +--disable_ps2_protocol --disable_view_protocol SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION all SELECT * FROM t2 LIMIT 2; select found_rows(); --enable_view_protocol +--enable_ps2_protocol # The following examples will not be exact SELECT COUNT(*) FROM ( @@ -248,16 +254,20 @@ SELECT * FROM t1 UNION SELECT * FROM t2) q; SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 2; SELECT COUNT(*) FROM ( (SELECT * FROM t1 LIMIT 1) UNION all SELECT * FROM t2) q; +--disable_ps2_protocol --disable_view_protocol (SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION all SELECT * FROM t2 LIMIT 2; select found_rows(); --enable_view_protocol +--enable_ps2_protocol SELECT COUNT(*) FROM ( SELECT * FROM t1 UNION all SELECT * FROM t2) q; +--disable_ps2_protocol --disable_view_protocol SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 100; select found_rows(); --enable_view_protocol +--enable_ps2_protocol --error ER_PARSE_ERROR SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 100 UNION SELECT * FROM t2; SELECT COUNT(*) FROM ( @@ -273,10 +283,12 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION SELECT * FROM t2 LIMIT 2; SELECT COUNT(*) FROM ( (SELECT * FROM t1 LIMIT 1) UNION SELECT * FROM t2) q; (SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION SELECT * FROM t2 LIMIT 2; +--disable_ps2_protocol --disable_view_protocol SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 2,2; select found_rows(); --enable_view_protocol +--enable_ps2_protocol SELECT COUNT(*) FROM ( SELECT * FROM t1 UNION SELECT * FROM t2) q; --error ER_PARSE_ERROR @@ -508,6 +520,7 @@ insert t1 select a+1, a+b from t1; insert t1 select a+1, a+b from t1; insert t1 select a+1, a+b from t1; FLUSH STATUS; +--disable_ps2_protocol --disable_view_protocol show status like 'Slow_queries'; select count(*) from t1 where a=7; @@ -523,6 +536,7 @@ flush status; select a from t1 where b not in (1,2,3) union select a from t1 where b not in (4,5,6); show status like 'Slow_queries'; --enable_view_protocol +--enable_ps2_protocol drop table t1; # @@ -1096,6 +1110,7 @@ DROP TABLE t1; -- echo # Bug#32858: Error: "Incorrect usage of UNION and INTO" does not take -- echo # subselects into account -- echo # +--disable_ps2_protocol CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1); @@ -1141,6 +1156,7 @@ SELECT ( SELECT a UNION SELECT a ) INTO DUMPFILE 'union.out.file4' FROM t1; DROP TABLE t1; remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.1/data/test union.out.fil*; +--enable_ps2_protocol --echo # --echo # Bug #49734: Crash on EXPLAIN EXTENDED UNION ... ORDER BY @@ -1367,11 +1383,13 @@ INSERT INTO t17059925 VALUES (1), (2), (3); INSERT INTO t2 VALUES (4), (5), (6); INSERT INTO t3 VALUES (7), (8), (9); TRUNCATE table mysql.slow_log; ---sorted_result +--disable_ps2_protocol --disable_view_protocol +--sorted_result SELECT * FROM t17059925 UNION SELECT * FROM t2 UNION SELECT * FROM t3; SELECT sql_text, rows_examined FROM mysql.slow_log WHERE sql_text LIKE '%SELECT%t17059925%'; --enable_view_protocol +--enable_ps_protocol DROP TABLE t17059925, t2, t3; ## Reset to initial values diff --git a/mysql-test/main/update.test b/mysql-test/main/update.test index 147d69d50c9..0dbc3c333ee 100644 --- a/mysql-test/main/update.test +++ b/mysql-test/main/update.test @@ -234,11 +234,13 @@ create table t1 ( a int, b int default 0, index (a) ); insert into t1 (a) values (0),(0),(0),(0),(0),(0),(0),(0); # the view protocol creates an additional statistics data +--disable_ps2_protocol --disable_view_protocol flush status; select a from t1 order by a limit 1; show status like 'handler_read%'; --enable_view_protocol +--enable_ps2_protocol flush status; update t1 set a=9999 order by a limit 1; @@ -344,6 +346,7 @@ INSERT INTO t1(user_id) SELECT user_id FROM t1; INSERT INTO t1(user_id) SELECT user_id FROM t1; INSERT INTO t1(user_id) SELECT user_id FROM t1; +--disable_ps2_protocol flush status; SELECT user_id FROM t1 WHERE request_id=9999999999999; show status like '%Handler_read%'; @@ -353,6 +356,7 @@ UPDATE t1 SET user_id=null WHERE request_id=9999999999999; show status like '%Handler_read%'; UPDATE t1 SET user_id=null WHERE request_id=999999999999999999999999999999; show status like '%Handler_read%'; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/main/user_var.test b/mysql-test/main/user_var.test index dad50c439b6..a6003d14554 100644 --- a/mysql-test/main/user_var.test +++ b/mysql-test/main/user_var.test @@ -25,6 +25,7 @@ explain select @vv1:=i from t1 where i=@vv1; explain select * from t1 where i=@vv1; drop table t1,t2; +--disable_ps2_protocol # Check types of variables set @a=0,@b=0; select @a:=10, @b:=1, @a > @b, @a < @b; @@ -74,6 +75,7 @@ set @a=0; select @a,@a:="hello",@a,@a:=3,@a,@a:="hello again" from t1 group by i; select @a,@a:="hello",@a,@a:=3,@a,@a:="hello again" from t1 group by i; drop table t1; +--enable_ps2_protocol # # Bug #2244: User variables didn't copy collation and derivation @@ -263,7 +265,7 @@ drop table t1; # # Bug#26020: User-Defined Variables are not consistent with columns data types # - +--disable_ps2_protocol create table t1(b bigint); insert into t1 (b) values (10), (30), (10); set @var := 0; @@ -281,6 +283,7 @@ insert into t1 values (2), (3), (3), (4); set @lastid=-1; select @lastid != id, @lastid, @lastid := id from t1; drop table t1; +--enable_ps2_protocol # # Bug#42009: SELECT into variable gives different results to direct SELECT @@ -333,8 +336,10 @@ DROP TABLE t1; CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (0),(0); +--disable_ps2_protocol --echo # BUG#55615 : should not crash SELECT (@a:=(SELECT @a:=1 FROM t1 LIMIT 1)) AND COUNT(1) FROM t1 GROUP BY @a; +--enable_ps2_protocol --echo # BUG#55564 : should not crash SELECT IF( @v:=LEAST((SELECT 1 FROM t1 t2 LEFT JOIN t1 ON (@v) GROUP BY t1.a), a), diff --git a/mysql-test/main/userstat-badlogin-4824.test b/mysql-test/main/userstat-badlogin-4824.test index 12cca9f12b3..0a7490bc29c 100644 --- a/mysql-test/main/userstat-badlogin-4824.test +++ b/mysql-test/main/userstat-badlogin-4824.test @@ -12,6 +12,7 @@ create user foo@localhost identified by 'foo'; flush user_statistics; set global userstat=1; +--disable_ps2_protocol connect(foo, localhost, foo, foo); select 1; disconnect foo; @@ -33,6 +34,7 @@ connection default; --replace_result 41 18 select user, bytes_received from information_schema.user_statistics where user = 'foo'; +--enable_ps2_protocol drop user foo@localhost; set global userstat=@save_userstat; diff --git a/mysql-test/main/userstat.test b/mysql-test/main/userstat.test index 6d486810db1..4aa10819d33 100644 --- a/mysql-test/main/userstat.test +++ b/mysql-test/main/userstat.test @@ -7,6 +7,7 @@ -- source include/have_log_bin.inc -- source include/have_perfschema.inc +--disable_ps2_protocol select variable_value from information_schema.global_status where variable_name="handler_read_key" into @global_read_key; show columns from information_schema.client_statistics; show columns from information_schema.user_statistics; @@ -125,6 +126,7 @@ select f() from information_schema.table_statistics; select f() from information_schema.index_statistics; set global userstat= 0; drop function f; +--enable_ps2_protocol --echo # --echo # End of 10.2 tests diff --git a/mysql-test/main/variables.test b/mysql-test/main/variables.test index 846d2665013..6030123bfb0 100644 --- a/mysql-test/main/variables.test +++ b/mysql-test/main/variables.test @@ -173,7 +173,9 @@ select * from information_schema.session_variables where variable_name like 'cha select @@timestamp>0; set @@rand_seed1=10000000,@@rand_seed2=1000000; +--disable_ps2_protocol select ROUND(RAND(),5); +--enable_ps2_protocol --echo diff --git a/mysql-test/main/view.test b/mysql-test/main/view.test index 385ca523436..d1981c7978c 100644 --- a/mysql-test/main/view.test +++ b/mysql-test/main/view.test @@ -2066,7 +2066,9 @@ set @tmp=@@optimizer_switch; set @@optimizer_switch='derived_merge=OFF'; create table t1(f1 char(1)); create view v1 as select * from t1; +--disable_ps2_protocol select * from (select f1 as f2, f1 as f3 from v1) v where v.f2='a'; +--enable_ps2_protocol --disable_ps_protocol show status like "Created_tmp%"; --enable_ps_protocol @@ -4148,6 +4150,7 @@ drop table t1,t2,t3,t4,t5,t6; --echo # Bug #59696 Optimizer does not use equalities for conditions over view --echo # +--disable_ps2_protocol CREATE TABLE t1 (a int NOT NULL); INSERT INTO t1 VALUES (9), (2), (8), (1), (3), (4), (2), (5), @@ -4173,6 +4176,7 @@ SHOW STATUS LIKE 'Handler_read_%'; DROP VIEW v; DROP TABLE t1, t2; +--enable_ps2_protocol --echo # --echo # Bug#702403: crash with multiple equalities and a view @@ -4595,10 +4599,14 @@ CREATE PROCEDURE p1() SELECT COUNT(*), GET_LOCK('blocker', 100) FROM v1; --disable_result_log CALL p1(); --enable_result_log +--disable_ps2_protocol SELECT RELEASE_LOCK('blocker'); +--enable_ps2_protocol connection con3; +--disable_ps2_protocol SELECT GET_LOCK('blocker', 100); +--enable_ps2_protocol connection default; --echo # Try to CALL p1() again, this time it should block on "blocker". @@ -4621,14 +4629,18 @@ let $wait_condition= WHERE state = "Waiting for table metadata lock" AND info = "DROP VIEW v1"; --source include/wait_condition.inc --echo # Now allow CALL p1() to complete +--disable_ps2_protocol SELECT RELEASE_LOCK('blocker'); +--enable_ps2_protocol connection default; --echo # Reaping: CALL p1() --disable_result_log --reap --enable_result_log +--disable_ps2_protocol SELECT RELEASE_LOCK('blocker'); +--enable_ps2_protocol connection con2; --echo # Reaping: DROP VIEW v1 @@ -6491,6 +6503,8 @@ DROP TABLE t1, t2; --echo # MDEV-23291: SUM column from a derived table returns invalid values --echo # +#Enable ps2 protocol after fix MDEV-31175 +--disable_ps2_protocol CREATE TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1,1), (2,2); @@ -6502,6 +6516,7 @@ SELECT sum(z) FROM v1; DROP TABLE t1; DROP VIEW v1; +--enable_ps2_protocol --echo # --echo # MDEV-26299: Some views force server (and mysqldump) to generate diff --git a/mysql-test/main/win.test b/mysql-test/main/win.test index 939c36e7c5e..9f6251a07cc 100644 --- a/mysql-test/main/win.test +++ b/mysql-test/main/win.test @@ -1016,6 +1016,7 @@ drop table t1; --echo # MDEV-9848: Window functions: reuse sorting and/or scanning --echo # +--disable_ps2_protocol create table t1 (a int, b int, c int); insert into t1 values (1,3,1), @@ -1065,6 +1066,7 @@ select from t1; drop table t1; +--enable_ps2_protocol --echo # @@ -2549,7 +2551,8 @@ drop table t1; --echo # --echo # MDEV-25630: Crash with window function in left expr of IN subquery --echo # - +#Enable after fix MDEV-31281 +--disable_ps2_protocol CREATE TABLE t1 (i int); INSERT INTO t1 VALUES (1),(2),(3); SELECT lag(i) over (ORDER BY i) IN ( SELECT 1 FROM t1 a) FROM t1; @@ -2559,6 +2562,7 @@ CREATE TABLE t1 (i int); INSERT INTO t1 VALUES (1),(2),(3); SELECT sum(i) over () IN ( SELECT 1 FROM t1 a) FROM t1; DROP TABLE t1; +--enable_ps2_protocol --echo # --echo # MDEV-25565: 2-nd call of SP with SELECT from view / derived table / CTE diff --git a/mysql-test/main/win_i_s.test b/mysql-test/main/win_i_s.test index d9b0f190285..89d28b7b5c4 100644 --- a/mysql-test/main/win_i_s.test +++ b/mysql-test/main/win_i_s.test @@ -1,3 +1,4 @@ +--disable_ps2_protocol show status like '%window%'; create table t1 (a int, b int); @@ -16,3 +17,4 @@ from (select a, b, rank() over (order by a) as r1 from t1) t_a, show status like '%window%'; drop table t1; +--enable_ps2_protocol diff --git a/mysql-test/suite/archive/rnd_pos.test b/mysql-test/suite/archive/rnd_pos.test index 8c7a0e16a79..f0a8c9ad2f3 100644 --- a/mysql-test/suite/archive/rnd_pos.test +++ b/mysql-test/suite/archive/rnd_pos.test @@ -11,7 +11,9 @@ explain partitions select c1,c3 from t1 order by c2; set max_length_for_sort_data = 4; explain partitions select c1,c3 from t1 order by c2; flush status; +--disable_ps2_protocol select c1,c3 from t1 order by c2; +--enable_ps2_protocol set max_length_for_sort_data = default; --disable_ps_protocol show status where variable_name like '%tmp%' and value != 0; @@ -22,7 +24,9 @@ explain partitions select c1,c3 from t1 order by c2; set max_length_for_sort_data = 4; explain partitions select c1,c3 from t1 order by c2; flush status; +--disable_ps2_protocol select c1,c3 from t1 order by c2; +--enable_ps2_protocol set max_length_for_sort_data = default; --disable_ps_protocol show status where variable_name like '%tmp%' and value != 0; diff --git a/mysql-test/suite/binlog/include/database.test b/mysql-test/suite/binlog/include/database.test index 097a501cc34..e61198b2da2 100644 --- a/mysql-test/suite/binlog/include/database.test +++ b/mysql-test/suite/binlog/include/database.test @@ -44,7 +44,9 @@ CREATE TABLE t2(c1 INT); let $prefix= `SELECT UUID()`; --echo # Create a file in the database directory --replace_result $prefix FAKE_FILE +--disable_ps2_protocol eval SELECT 'hello' INTO OUTFILE 'fake_file.$prefix'; +--enable_ps2_protocol --echo --echo # 'DROP DATABASE' will fail if there is any other file in the the diff --git a/mysql-test/suite/binlog/t/binlog_stm_row.test b/mysql-test/suite/binlog/t/binlog_stm_row.test index bade737c114..bef6b6e6a2c 100644 --- a/mysql-test/suite/binlog/t/binlog_stm_row.test +++ b/mysql-test/suite/binlog/t/binlog_stm_row.test @@ -41,6 +41,7 @@ INSERT INTO t2 VALUES(2); --echo # lock that will prevent the source table from being modified. --echo # +--disable_ps2_protocol --connection con1 SELECT GET_LOCK('Bug#34306', 120); --connection con2 @@ -87,6 +88,7 @@ INSERT INTO t2 VALUES (4); SELECT RELEASE_LOCK('Bug#34306'); --connection con2 --reap +--enable_ps2_protocol --disconnect con1 --disconnect con2 diff --git a/mysql-test/suite/binlog/t/binlog_unsafe.test b/mysql-test/suite/binlog/t/binlog_unsafe.test index 673712ff209..5e5d4c26954 100644 --- a/mysql-test/suite/binlog/t/binlog_unsafe.test +++ b/mysql-test/suite/binlog/t/binlog_unsafe.test @@ -573,7 +573,9 @@ END| RESET MASTER; CALL proc_insert_delayed(); +--disable_ps2_protocol SELECT func_limit(); +--enable_ps2_protocol source include/show_binlog_events.inc; SET @@session.binlog_format = @old_binlog_format; diff --git a/mysql-test/suite/compat/oracle/t/sequence.test b/mysql-test/suite/compat/oracle/t/sequence.test index 719c4bcd45b..9bd8cec5852 100644 --- a/mysql-test/suite/compat/oracle/t/sequence.test +++ b/mysql-test/suite/compat/oracle/t/sequence.test @@ -2,6 +2,7 @@ SET sql_mode=ORACLE; +--disable_ps2_protocol CREATE SEQUENCE s1; SHOW CREATE SEQUENCE s1; SELECT s1.currval; @@ -13,12 +14,14 @@ SELECT nextval(s1); EXPLAIN EXTENDED SELECT s1.currval; SELECT lastval(s1); DROP SEQUENCE s1; - +--enable_ps2_protocol CREATE SEQUENCE s1; CREATE VIEW v1 AS SELECT s1.nextval AS a; SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='v1'; +--disable_ps2_protocol SELECT * FROM v1; +--enable_ps2_protocol SHOW CREATE VIEW v1; DROP VIEW v1; DROP SEQUENCE s1; @@ -35,9 +38,11 @@ DROP SEQUENCE s1; --echo # --echo # MDEV-12533 sql_mode=ORACLE: Add support for database qualified sequence names in NEXTVAL and CURRVAL --echo # +--disable_ps2_protocol CREATE SEQUENCE s1; SELECT test.s1.nextval; SELECT test.s1.currval; SELECT .s1.nextval; SELECT .s1.currval; DROP SEQUENCE s1; +--enable_ps2_protocol diff --git a/mysql-test/suite/compat/oracle/t/sp-package.test b/mysql-test/suite/compat/oracle/t/sp-package.test index 401a46ad206..a48939f6e61 100644 --- a/mysql-test/suite/compat/oracle/t/sp-package.test +++ b/mysql-test/suite/compat/oracle/t/sp-package.test @@ -2,6 +2,7 @@ SET sql_mode=ORACLE; +--disable_ps2_protocol --echo # --echo # Creating a body of a non-existing package @@ -3013,6 +3014,7 @@ DELIMITER ;$$ SELECT db2.pkg1.var1(); CALL db2.pkg1.p2_db1_pkg1_p1; +--enable_ps2_protocol DROP DATABASE db1; DROP DATABASE db2; diff --git a/mysql-test/suite/federated/federatedx_create_handlers.test b/mysql-test/suite/federated/federatedx_create_handlers.test index f827c141f3d..19af71e02a9 100644 --- a/mysql-test/suite/federated/federatedx_create_handlers.test +++ b/mysql-test/suite/federated/federatedx_create_handlers.test @@ -94,9 +94,12 @@ DEFAULT CHARSET=latin1; INSERT INTO federated.t3 VALUES ('yyy'), ('www'), ('yyy'), ('xxx'), ('www'), ('yyy'), ('www'); +#Enable after fix MDEV-31361 +--disable_ps2_protocol SELECT * FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t WHERE federated.t3.name=t.name; +--enable_ps2_protocol EXPLAIN SELECT * @@ -164,7 +167,9 @@ select * from federated.t4; select name into @var from federated.t1 where id=3 limit 1 ; select @var; +--disable_ps2_protocol select name into outfile 'tmp.txt' from federated.t1; +--enable_ps2_protocol let $path=`select concat(@@datadir, 'test/tmp.txt')`; remove_file $path; diff --git a/mysql-test/suite/funcs_1/storedproc/storedproc_10.inc b/mysql-test/suite/funcs_1/storedproc/storedproc_10.inc index 930322e203a..db8f45d0be7 100644 --- a/mysql-test/suite/funcs_1/storedproc/storedproc_10.inc +++ b/mysql-test/suite/funcs_1/storedproc/storedproc_10.inc @@ -266,6 +266,7 @@ BEGIN END// delimiter ;// +--disable_ps2_protocol CALL sp_ins_1(); SELECT row_count(); --sorted_result @@ -296,7 +297,7 @@ CALL sp_with_rowcount(); SELECT row_count(); --sorted_result SELECT * FROM temp; - +--enable_ps2_protocol # cleanup DROP PROCEDURE sp_ins_1; diff --git a/mysql-test/suite/funcs_1/t/is_basics_mixed.test b/mysql-test/suite/funcs_1/t/is_basics_mixed.test index bed3f633212..591a5ca566b 100644 --- a/mysql-test/suite/funcs_1/t/is_basics_mixed.test +++ b/mysql-test/suite/funcs_1/t/is_basics_mixed.test @@ -185,12 +185,14 @@ let $OUTFILE = $MYSQLTEST_VARDIR/tmp/datadict.out; --error 0,1 remove_file $OUTFILE; --replace_result $OUTFILE +--disable_ps2_protocol eval SELECT table_name,table_schema INTO OUTFILE '$OUTFILE' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM information_schema.tables WHERE table_schema = 'db_datadict' ORDER BY table_name; +--enable_ps2_protocol cat_file $OUTFILE; remove_file $OUTFILE; # diff --git a/mysql-test/suite/funcs_1/t/row_count_func.test b/mysql-test/suite/funcs_1/t/row_count_func.test index 3a76a6cac7c..fb207681bc6 100644 --- a/mysql-test/suite/funcs_1/t/row_count_func.test +++ b/mysql-test/suite/funcs_1/t/row_count_func.test @@ -18,12 +18,16 @@ INSERT INTO t1 VALUES (1), (2), (3); --enable_info --echo SELECT * FROM t1 INTO OUTFILE "MYSQL_TMP_DIR/bug21818.txt"; --disable_query_log # to avoid $MYSQL_TMP_DIR in query log +--disable_ps2_protocol --eval SELECT * FROM t1 INTO OUTFILE "$MYSQL_TMP_DIR/bug21818.txt" +--enable_ps2_protocol --enable_query_log --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol --echo --echo # -- Check 2. @@ -33,7 +37,9 @@ SELECT a FROM t1 LIMIT 1 INTO @a; --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol --enable_warnings --echo @@ -48,7 +54,9 @@ CREATE DATABASE mysqltest1; --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol DROP DATABASE mysqltest1; @@ -65,7 +73,9 @@ DELETE FROM t1; --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol --remove_file $MYSQL_TMP_DIR/bug21818.txt @@ -77,7 +87,9 @@ ALTER TABLE t1 ADD COLUMN b VARCHAR(255); --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol --echo DROP TABLE t1; @@ -109,7 +121,9 @@ INSERT INTO t1 VALUES (1), (2), (3); --error ER_SP_DOES_NOT_EXIST SELECT f1(); +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/suite/funcs_1/views/views_master.inc b/mysql-test/suite/funcs_1/views/views_master.inc index 573d72022fb..526e9e3426e 100644 --- a/mysql-test/suite/funcs_1/views/views_master.inc +++ b/mysql-test/suite/funcs_1/views/views_master.inc @@ -2912,6 +2912,7 @@ while ($run) # be wrong, please edit the while loop above and set $debug to 1. #-------------------------------------------------------------------------- # 1.1 Check of top level VIEW +--disable_ps2_protocol let $toplevel= `SELECT @max_level`; eval SHOW CREATE VIEW test3.v$toplevel; eval SELECT * FROM test3.v$toplevel; @@ -2924,7 +2925,7 @@ eval SHOW CREATE VIEW test3.v$toplevel; eval SELECT * FROM test3.v$toplevel; --error ER_VIEW_INVALID eval EXPLAIN SELECT * FROM test3.v$toplevel; - +--enable_ps2_protocol # 2. Complicated nested VIEWs # parameter @max_level = nesting level @@ -3054,8 +3055,10 @@ let $toplevel= `SELECT @max_level`; # Show should be easy eval SHOW CREATE VIEW test1.v$toplevel; # SELECT is much more complicated +--disable_ps2_protocol eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel; +--enable_ps2_protocol let $message= The output of following EXPLAIN is deactivated, because the result differs on some platforms FIXME Is this a bug ? ; diff --git a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc index e745708c22a..95ed11a3dff 100644 --- a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc +++ b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc @@ -620,7 +620,9 @@ CREATE TABLE t1 ( ); INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101'); +--disable_ps2_protocol SELECT pk, b INTO OUTFILE 'load.data' FROM t1; +--enable_ps2_protocol --error ER_DATA_TOO_LONG LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); diff --git a/mysql-test/suite/gcol/inc/gcol_keys.inc b/mysql-test/suite/gcol/inc/gcol_keys.inc index cf0612b0d0c..473086f6e04 100644 --- a/mysql-test/suite/gcol/inc/gcol_keys.inc +++ b/mysql-test/suite/gcol/inc/gcol_keys.inc @@ -776,7 +776,9 @@ CREATE TABLE t1 ( ); INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101'); +--disable_ps2_protocol SELECT pk, b INTO OUTFILE 'load.data' FROM t1; +--enable_ps2_protocol --error ER_DATA_TOO_LONG LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); diff --git a/mysql-test/suite/gcol/t/gcol_bugfixes.test b/mysql-test/suite/gcol/t/gcol_bugfixes.test index a1f277199eb..4c1b00a878a 100644 --- a/mysql-test/suite/gcol/t/gcol_bugfixes.test +++ b/mysql-test/suite/gcol/t/gcol_bugfixes.test @@ -674,7 +674,9 @@ DROP TABLE t1; CREATE TABLE t1 (id INT PRIMARY KEY, a VARCHAR(2333), va VARCHAR(171) AS (a)) ENGINE=InnoDB; INSERT INTO t1 (id,a) VALUES (1,REPEAT('x',200)); +--disable_ps2_protocol SELECT id, va INTO OUTFILE 'load_t1' FROM t1; +--enable_ps2_protocol --error ER_DATA_TOO_LONG LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id,va); SELECT * FROM t1; @@ -687,7 +689,9 @@ DROP TABLE t1; CREATE TABLE t1 (id BIGINT PRIMARY KEY, a VARCHAR(2333), va VARCHAR(171) AS (a)) ENGINE=InnoDB; INSERT INTO t1 (id,a) VALUES (1,REPEAT('x',200)); +--disable_ps2_protocol SELECT id, va INTO OUTFILE 'load_t1' FROM t1; +--enable_ps2_protocol --error ER_DATA_TOO_LONG LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id,va); SELECT * FROM t1; @@ -707,7 +711,9 @@ CREATE TABLE t1 (id INT PRIMARY KEY, ts TIMESTAMP DEFAULT '1971-01-01 00:00:00', c VARBINARY(8) DEFAULT '', vc VARCHAR(3) AS (c) STORED); INSERT IGNORE INTO t1 (id,c) VALUES (1,'foobar'); +--disable_ps2_protocol SELECT id, ts, vc INTO OUTFILE 'load_t1' FROM t1; +--enable_ps2_protocol --error 0,ER_DATA_TOO_LONG LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id, ts, vc); INSERT IGNORE INTO t1 (id) VALUES (2); diff --git a/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test b/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test index 253ad4095f7..d0a0be76178 100644 --- a/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test +++ b/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test @@ -273,7 +273,9 @@ engine innodb; insert ignore into t1 (b) values ('foo'); +--disable_ps2_protocol select * into outfile 'load.data' from t1; +--enable_ps2_protocol load data infile 'load.data' replace into table t1; set debug_sync= "now WAIT_FOR latch_released"; @@ -290,7 +292,9 @@ engine innodb; insert ignore into t1 (b) values ('foo'); +--disable_ps2_protocol select * into outfile 'load.data' from t1; +--enable_ps2_protocol load data infile 'load.data' replace into table t1; set debug_sync= "now WAIT_FOR got_no_such_table"; diff --git a/mysql-test/suite/handler/handler.inc b/mysql-test/suite/handler/handler.inc index c29ee0c693d..c48cf451d0f 100644 --- a/mysql-test/suite/handler/handler.inc +++ b/mysql-test/suite/handler/handler.inc @@ -1055,6 +1055,7 @@ commit; --echo # If we have to wait on an exclusive locks while having --echo # an open HANDLER, ER_LOCK_DEADLOCK is reported. --echo # +--disable_ps2_protocol create table t1 (a int, key a(a)); handler t1 open; connection con1; @@ -1074,6 +1075,7 @@ select release_lock('lock1'); connection default; reap; select release_lock('lock1'); +--enable_ps2_protocol --echo # Demonstrate that there is no deadlock with FLUSH TABLE, --echo # even though it is waiting for the other table to go away diff --git a/mysql-test/suite/innodb/t/alter_kill.test b/mysql-test/suite/innodb/t/alter_kill.test index 2313d63db69..a8a151ab1e2 100644 --- a/mysql-test/suite/innodb/t/alter_kill.test +++ b/mysql-test/suite/innodb/t/alter_kill.test @@ -164,10 +164,14 @@ let SEARCH_PATTERN= \[ERROR\] InnoDB: Tablespace [0-9]+ was not found at .*test. -- source include/restart_mysqld.inc SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM bug16735660; +--enable_ps2_protocol XA RECOVER; XA ROLLBACK 'x'; +--disable_ps2_protocol SELECT * FROM bug16735660; +--enable_ps2_protocol DROP TABLE bug16735660; diff --git a/mysql-test/suite/innodb/t/foreign_key.test b/mysql-test/suite/innodb/t/foreign_key.test index 4caa4cc2431..c4b2b8331b0 100644 --- a/mysql-test/suite/innodb/t/foreign_key.test +++ b/mysql-test/suite/innodb/t/foreign_key.test @@ -439,7 +439,9 @@ end| delimiter ;| flush tables; flush status; +--disable_ps2_protocol select foo(); +--enable_ps2_protocol show status like '%opened_tab%'; drop function foo; drop table t2, t1; diff --git a/mysql-test/suite/innodb/t/innodb-autoinc-56228.test b/mysql-test/suite/innodb/t/innodb-autoinc-56228.test index 28141f812b2..a02f7b4383a 100644 --- a/mysql-test/suite/innodb/t/innodb-autoinc-56228.test +++ b/mysql-test/suite/innodb/t/innodb-autoinc-56228.test @@ -25,7 +25,9 @@ END // DELIMITER ;// +--disable_ps_protocol SELECT bug56228(); +--enable_ps2_protocol DROP FUNCTION bug56228; DROP TEMPORARY TABLE t2_56228; diff --git a/mysql-test/suite/innodb/t/innodb_bug14007649.test b/mysql-test/suite/innodb/t/innodb_bug14007649.test index 9326e1c53ef..9b332b9b08b 100644 --- a/mysql-test/suite/innodb/t/innodb_bug14007649.test +++ b/mysql-test/suite/innodb/t/innodb_bug14007649.test @@ -22,7 +22,9 @@ start transaction; update t1 set f2 = 4 where f1 = 1 and f2 is null; -- echo (b) Number of rows updated: +--disable_ps2_protocol select row_count(); +--enable_ps2_protocol insert into t1 values (3, 1, null); @@ -40,7 +42,9 @@ SET SESSION debug_dbug="+d,bug14007649"; update t1 set f2 = 6 where f1 = 1 and f2 is null; -- echo (a) Number of rows updated: +--disable_ps2_protocol select row_count(); +--enable_ps2_protocol -- echo (a) After the update statement is executed. select rowid, f1, f2 from t1; diff --git a/mysql-test/suite/innodb/t/innodb_bug59641.test b/mysql-test/suite/innodb/t/innodb_bug59641.test index e0d3431e45b..36001133a88 100644 --- a/mysql-test/suite/innodb/t/innodb_bug59641.test +++ b/mysql-test/suite/innodb/t/innodb_bug59641.test @@ -36,13 +36,17 @@ CONNECT (con3,localhost,root,,); --let $shutdown_timeout=0 --source include/restart_mysqld.inc SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM t; +--enable_ps2_protocol COMMIT; --source include/restart_mysqld.inc SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM t; +--enable_ps2_protocol COMMIT; --sorted_result XA RECOVER; diff --git a/mysql-test/suite/innodb/t/innodb_force_recovery.test b/mysql-test/suite/innodb/t/innodb_force_recovery.test index cfda405e216..356f9e8bc60 100644 --- a/mysql-test/suite/innodb/t/innodb_force_recovery.test +++ b/mysql-test/suite/innodb/t/innodb_force_recovery.test @@ -160,7 +160,9 @@ connection default; let $status=`SHOW ENGINE INNODB STATUS`; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol select * from t2; +--enable_ps2_protocol SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; select * from t2; SET SESSION innodb_lock_wait_timeout=1; diff --git a/mysql-test/suite/innodb/t/instant_alter_bugs.test b/mysql-test/suite/innodb/t/instant_alter_bugs.test index 7bb6f0fd89a..debd5d30562 100644 --- a/mysql-test/suite/innodb/t/instant_alter_bugs.test +++ b/mysql-test/suite/innodb/t/instant_alter_bugs.test @@ -128,7 +128,9 @@ INSERT INTO t1 (f1,f2,f3,f4,f5,f6,f7,f8) VALUES INSERT INTO t1 (f1,f2,f3,f4,f5,f6,f7,f8) VALUES ('impact', 'b', 'h', 185, 'fj', 7, 7, 3); ALTER TABLE t1 ADD COLUMN filler VARCHAR(255) DEFAULT ''; +--disable_ps2_protocol SELECT * INTO OUTFILE 'load.data' FROM t1; +--enable_ps2_protocol UPDATE IGNORE t1 SET pk = 0; LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1; HANDLER t1 OPEN AS h; diff --git a/mysql-test/suite/innodb/t/monitor.test b/mysql-test/suite/innodb/t/monitor.test index f1cf4b0c39e..8ea56fd53bc 100644 --- a/mysql-test/suite/innodb/t/monitor.test +++ b/mysql-test/suite/innodb/t/monitor.test @@ -356,6 +356,7 @@ primary key (a(1), c(1)), key(b)) engine = innodb; insert into monitor_test values("13", 2, "aa"); +--disable_ps2_protocol select a from monitor_test where b < 1 for update; # should have icp_attempts = 1 and icp_out_of_range = 1 @@ -367,6 +368,7 @@ select a from monitor_test where b < 3 for update; select name, count from information_schema.innodb_metrics where name like "icp%"; +--enable_ps2_protocol drop table monitor_test; set global innodb_monitor_disable = All; diff --git a/mysql-test/suite/innodb/t/read_only_recover_committed.test b/mysql-test/suite/innodb/t/read_only_recover_committed.test index 5c4eac86c26..0f6fb5ac29c 100644 --- a/mysql-test/suite/innodb/t/read_only_recover_committed.test +++ b/mysql-test/suite/innodb/t/read_only_recover_committed.test @@ -55,7 +55,9 @@ ROLLBACK; --disconnect con2 SELECT * FROM t; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM t; +--enable_ps2_protocol # refused on MySQL 5.6, MariaDB 10.0, 10.1, but not MariaDB 10.2+ UPDATE t SET a=3 WHERE a=1; --let $restart_parameters= --innodb-read-only diff --git a/mysql-test/suite/innodb/t/table_index_statistics.inc b/mysql-test/suite/innodb/t/table_index_statistics.inc index ba585320fc9..01f8af06c86 100644 --- a/mysql-test/suite/innodb/t/table_index_statistics.inc +++ b/mysql-test/suite/innodb/t/table_index_statistics.inc @@ -9,6 +9,7 @@ FLUSH TABLE_STATISTICS; SET @userstat_old= @@userstat; SET GLOBAL userstat=ON; +--disable_ps2_protocol CREATE TABLE t1 (id int(10), PRIMARY KEY (id)); INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); SELECT COUNT(*) FROM t1; @@ -33,6 +34,7 @@ SELECT ROWS_READ FROM INFORMATION_SCHEMA.INDEX_STATISTICS WHERE TABLE_NAME='t1'; SELECT COUNT(*) FROM t1; SELECT ROWS_READ FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_NAME='t1'; SELECT ROWS_READ FROM INFORMATION_SCHEMA.INDEX_STATISTICS WHERE TABLE_NAME='t1'; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/temp_table_savepoint.test b/mysql-test/suite/innodb/t/temp_table_savepoint.test index c8a4bc870a7..b935fff3cca 100644 --- a/mysql-test/suite/innodb/t/temp_table_savepoint.test +++ b/mysql-test/suite/innodb/t/temp_table_savepoint.test @@ -290,7 +290,10 @@ select count(*) from t4 where c1 = 140; select count(*) from t5 where c1 = 140; --replace_result $MYSQLTEST_VARDIR VARDIR +--disable_ps2_protocol eval select * into outfile "$MYSQLTEST_VARDIR/tmp/t1.outfile" from t1; +--enable_ps2_protocol + create temporary table temp_1 engine = innodb as select * from t1 where 1=2; select count(*) from temp_1; diff --git a/mysql-test/suite/innodb/t/xa_recovery.test b/mysql-test/suite/innodb/t/xa_recovery.test index f0fbb1a94c3..da9626ebd29 100644 --- a/mysql-test/suite/innodb/t/xa_recovery.test +++ b/mysql-test/suite/innodb/t/xa_recovery.test @@ -47,7 +47,9 @@ DROP TABLE t2; disconnect con1; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM t1; +--enable_ps2_protocol XA ROLLBACK 'x'; SELECT * FROM t1; diff --git a/mysql-test/suite/innodb_gis/t/0.test b/mysql-test/suite/innodb_gis/t/0.test index b5d82f2ae69..c482d881732 100644 --- a/mysql-test/suite/innodb_gis/t/0.test +++ b/mysql-test/suite/innodb_gis/t/0.test @@ -25,7 +25,9 @@ connect (con1,localhost,root,,); connection con1; set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))'); set transaction isolation level read uncommitted; +--disable_ps2_protocol select count(*) from t1 where ST_Within(t1.c2, @g1); +--enable_ps2_protocol disconnect con1; --source include/wait_until_disconnected.inc diff --git a/mysql-test/suite/mariabackup/apply-log-only-incr.test b/mysql-test/suite/mariabackup/apply-log-only-incr.test index c2d23c88a3e..a9e53548366 100644 --- a/mysql-test/suite/mariabackup/apply-log-only-incr.test +++ b/mysql-test/suite/mariabackup/apply-log-only-incr.test @@ -61,7 +61,9 @@ rmdir $incremental_dir; SELECT COUNT(*) FROM t; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT COUNT(*) FROM t; +--enable_ps2_protocol --let $restart_parameters= --source include/restart_mysqld.inc diff --git a/mysql-test/suite/parts/t/optimizer.test b/mysql-test/suite/parts/t/optimizer.test index f93c36823ca..0cc326da979 100644 --- a/mysql-test/suite/parts/t/optimizer.test +++ b/mysql-test/suite/parts/t/optimizer.test @@ -34,6 +34,7 @@ INSERT INTO t2 SELECT * FROM t1; EXPLAIN SELECT a, MAX(b) FROM t1 WHERE a IN (10,100) GROUP BY a; EXPLAIN SELECT a, MAX(b) FROM t2 WHERE a IN (10,100) GROUP BY a; +--disable_ps2_protocol FLUSH status; SELECT a, MAX(b) FROM t1 WHERE a IN (10, 100) GROUP BY a; --echo # Should be no more than 4 reads. @@ -43,5 +44,6 @@ FLUSH status; SELECT a, MAX(b) FROM t2 WHERE a IN (10, 100) GROUP BY a; --echo # Should be no more than 4 reads. SHOW status LIKE 'handler_read_key'; +--enable_ps2_protocol DROP TABLE t1, t2; diff --git a/mysql-test/suite/perfschema/include/table_io_basic_dml.inc b/mysql-test/suite/perfschema/include/table_io_basic_dml.inc index 4fe2fd9dfb3..5457566b296 100644 --- a/mysql-test/suite/perfschema/include/table_io_basic_dml.inc +++ b/mysql-test/suite/perfschema/include/table_io_basic_dml.inc @@ -5,6 +5,7 @@ # $table_item = . must be set before sourcing this script. # +--disable_ps2_protocol insert into marker set a = 1; eval insert into $table_item set a = 'foo', b = 1; insert into marker set a = 1; @@ -33,4 +34,4 @@ insert into marker set a = 1; eval truncate table $table_item; --enable_abort_on_error insert into marker set a = 1; - +--enable_ps2_protocol diff --git a/mysql-test/suite/perfschema/t/indexed_table_io.test b/mysql-test/suite/perfschema/t/indexed_table_io.test index 1a7597113d2..13edfbfb144 100644 --- a/mysql-test/suite/perfschema/t/indexed_table_io.test +++ b/mysql-test/suite/perfschema/t/indexed_table_io.test @@ -54,6 +54,7 @@ select count(*) from test.index_tab; # Testing Code +--disable_ps2_protocol # For getting avg(a) inspection of # - all rows (test.no_index_tab) # - all unique index values (test.index_tab, assuming the optimizer decides to @@ -102,6 +103,7 @@ update performance_schema.setup_consumers set enabled='YES'; delete from test.index_tab where a = 51; update performance_schema.setup_consumers set enabled='NO'; eval $table_io_select 'index_tab'; +--enable_ps2_protocol # In case of failures, this will tell if table io are lost. show status like 'performance_schema_%'; diff --git a/mysql-test/suite/perfschema/t/multi_table_io.test b/mysql-test/suite/perfschema/t/multi_table_io.test index d835f36be4b..50bc4f6b8b6 100644 --- a/mysql-test/suite/perfschema/t/multi_table_io.test +++ b/mysql-test/suite/perfschema/t/multi_table_io.test @@ -27,6 +27,7 @@ let $schema_to_dump= 'test','test1'; # Start event recording update performance_schema.setup_consumers set enabled = 'YES'; +--disable_ps2_protocol # INSERT ... SELECT ... insert into test1.t2 select * from test.t1; insert into marker set a = 1; @@ -42,6 +43,7 @@ insert into marker set a = 1; # DELETE delete from test.t1, test1.t2 using test.t1 inner join test1.t2 where test.t1.col1 = test1.t2.col1; +--enable_ps2_protocol # Stop event recording + pull results --source ../include/table_io_result_helper.inc diff --git a/mysql-test/suite/perfschema/t/query_cache.test b/mysql-test/suite/perfschema/t/query_cache.test index 4c130813611..9db60de1a90 100644 --- a/mysql-test/suite/perfschema/t/query_cache.test +++ b/mysql-test/suite/perfschema/t/query_cache.test @@ -22,6 +22,7 @@ flush query cache; reset query cache; flush status; +--disable_ps2_protocol select * from t1; show status like "Qcache_queries_in_cache"; @@ -47,6 +48,7 @@ select spins from performance_schema.events_waits_current order by event_name li --replace_result CYCLE {CYCLE_OR_NANOSECOND} NANOSECOND {CYCLE_OR_NANOSECOND} select * from performance_schema.setup_timers where name='wait'; +--enable_ps2_protocol show status like "Qcache_queries_in_cache"; show status like "Qcache_inserts"; diff --git a/mysql-test/suite/perfschema/t/trigger_table_io.test b/mysql-test/suite/perfschema/t/trigger_table_io.test index 090d64e330e..2b374c79d15 100644 --- a/mysql-test/suite/perfschema/t/trigger_table_io.test +++ b/mysql-test/suite/perfschema/t/trigger_table_io.test @@ -37,6 +37,7 @@ update performance_schema.setup_consumers set enabled = 'YES'; # Code to test +--disable_ps2_protocol insert into marker set a = 1; insert into t1 set a = 1, v = 10; insert into marker set a = 1; @@ -63,6 +64,7 @@ insert into marker set a = 1; select * from t1; insert into marker set a = 1; select * from t2; +--enable_ps2_protocol # Stop recording events + pull results --source ../include/table_io_result_helper.inc diff --git a/mysql-test/suite/plugins/t/qc_info.test b/mysql-test/suite/plugins/t/qc_info.test index 8803e907b89..de3e9d59b01 100644 --- a/mysql-test/suite/plugins/t/qc_info.test +++ b/mysql-test/suite/plugins/t/qc_info.test @@ -4,8 +4,10 @@ set @save_query_cache_size=@@global.query_cache_size; # test that hits are correctly incremented reset query cache; +--disable_ps2_protocol select * from t1; select * from t1; +--enable_ps2_protocol select hits, statement_text from information_schema.query_cache_info; drop table t1; diff --git a/mysql-test/suite/plugins/t/qc_info_init.inc b/mysql-test/suite/plugins/t/qc_info_init.inc index c3f700f08d0..add7aea8e95 100644 --- a/mysql-test/suite/plugins/t/qc_info_init.inc +++ b/mysql-test/suite/plugins/t/qc_info_init.inc @@ -9,7 +9,9 @@ set global query_cache_size=1355776; create table t1 (a int not null); insert into t1 values (1),(2),(3); +--disable_ps2_protocol select * from t1; +--enable_ps2_protocol select statement_schema, statement_text, result_blocks_count, result_blocks_size from information_schema.query_cache_info; select @@time_zone into @time_zone; @@ -25,7 +27,9 @@ select @@group_concat_max_len into @group_concat_max_len; select Name into @new_time_zone from mysql.time_zone_name limit 1; set time_zone=@new_time_zone,default_week_format=4,character_set_client='binary',character_set_results='utf32',collation_connection='utf32_bin',sql_mode='STRICT_ALL_TABLES',div_precision_increment=7,lc_time_names='ar_SD',autocommit=0, group_concat_max_len=513, max_sort_length=1011; --disable_result_log +--disable_ps2_protocol select * from t1; +--enable_ps2_protocol --enable_result_log set time_zone= @time_zone, default_week_format= @default_week_format, character_set_client= @character_set_client,character_set_results= @character_set_results, sql_mode= @sql_mode, div_precision_increment= @div_precision_increment, lc_time_names= @lc_time_names, autocommit= @autocommit, group_concat_max_len= @group_concat_max_len, max_sort_length= @max_sort_length; diff --git a/mysql-test/suite/plugins/t/server_audit.test b/mysql-test/suite/plugins/t/server_audit.test index 5048ccc2446..47d6fdacdcf 100644 --- a/mysql-test/suite/plugins/t/server_audit.test +++ b/mysql-test/suite/plugins/t/server_audit.test @@ -5,6 +5,7 @@ if (!$SERVER_AUDIT_SO) { skip No SERVER_AUDIT plugin; } +--disable_ps2_protocol # An unfortunate wait for check-testcase.test to complete disconnect. let count_sessions= 1; source include/wait_until_count_sessions.inc; @@ -234,6 +235,7 @@ uninstall plugin server_audit; --replace_regex /[0-9]* [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\,[^,]*\,/TIME,HOSTNAME,/ /\,[1-9][0-9]*\,/,1,/ /\,[1-9][0-9]*/,ID/ cat_file $MYSQLD_DATADIR/server_audit.log; remove_file $MYSQLD_DATADIR/server_audit.log; +--enable_ps2_protocol --echo # --echo # MDEV-27631 Assertion `global_status_var.global_memory_used == 0' failed in mysqld_exit diff --git a/mysql-test/suite/plugins/t/show_all_plugins.test b/mysql-test/suite/plugins/t/show_all_plugins.test index f8f375976fe..77723d32170 100644 --- a/mysql-test/suite/plugins/t/show_all_plugins.test +++ b/mysql-test/suite/plugins/t/show_all_plugins.test @@ -12,7 +12,9 @@ show status like '%libraries%'; #show status like '%libraries%'; --replace_result .dll .so --replace_column 5 MYSQL_VERSION_ID +--disable_ps2_protocol eval select * from information_schema.all_plugins where plugin_library='$HA_EXAMPLE_SO'; +--enable_ps2_protocol show status like '%libraries%'; --sorted_result --replace_result .dll .so diff --git a/mysql-test/suite/plugins/t/thread_pool_server_audit.test b/mysql-test/suite/plugins/t/thread_pool_server_audit.test index 7347d8f99ff..c12ef29ff20 100644 --- a/mysql-test/suite/plugins/t/thread_pool_server_audit.test +++ b/mysql-test/suite/plugins/t/thread_pool_server_audit.test @@ -7,6 +7,7 @@ if (!$SERVER_AUDIT_SO) { install plugin server_audit soname 'server_audit'; +--disable_ps2_protocol show variables like 'server_audit%'; set global server_audit_file_path=null; set global server_audit_incl_users=null; @@ -140,6 +141,7 @@ set global server_audit_file_path='nonexisting_dir/'; show status like 'server_audit_current_log'; show variables like 'server_audit%'; uninstall plugin server_audit; +--enable_ps2_protocol let $MYSQLD_DATADIR= `SELECT @@datadir`; # replace the timestamp and the hostname with constant values diff --git a/mysql-test/suite/rpl/include/rpl_insert_id.test b/mysql-test/suite/rpl/include/rpl_insert_id.test index 32d861bd45a..aca14078850 100644 --- a/mysql-test/suite/rpl/include/rpl_insert_id.test +++ b/mysql-test/suite/rpl/include/rpl_insert_id.test @@ -182,9 +182,11 @@ drop trigger t1_bi; # Check that nested call doesn't affect outer context. select last_insert_id(); +--disable_ps2_protocol --disable_warnings ONCE select bug15728_insert(); select last_insert_id(); +--enable_ps2_protocol insert into t1 (last_id) values (bug15728()); # This should be exactly one greater than in the previous call. select last_insert_id(); @@ -440,8 +442,10 @@ delimiter ;| INSERT INTO t1 VALUES (NULL, -1); CALL p1(); +--disable_ps2_protocol --disable_warnings ONCE SELECT f1(); +--enable_ps2_protocol INSERT INTO t1 VALUES (NULL, f2()), (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID()), (NULL, f2()), (NULL, f2()); INSERT INTO t1 VALUES (NULL, f2()); @@ -458,7 +462,9 @@ connection master1; INSERT INTO t1 (i) VALUES (NULL); connection master; +--disable_ps2_protocol SELECT f3(); +--enable_ps2_protocol SELECT * FROM t1 ORDER BY i; SELECT * FROM t2 ORDER BY i; @@ -510,8 +516,10 @@ insert into t2 (id) values(1),(2),(3); delete from t2; set sql_log_bin=1; #inside SELECT, then inside INSERT +--disable_ps2_protocol --disable_warnings ONCE select insid(); +--enable_ps2_protocol set sql_log_bin=0; insert into t2 (id) values(5),(6),(7); delete from t2 where id>=5; diff --git a/mysql-test/suite/rpl/include/rpl_mixing_engines.inc b/mysql-test/suite/rpl/include/rpl_mixing_engines.inc index c71c45a57c5..c78a6a0e5d8 100644 --- a/mysql-test/suite/rpl/include/rpl_mixing_engines.inc +++ b/mysql-test/suite/rpl/include/rpl_mixing_engines.inc @@ -213,6 +213,7 @@ if ($commands == 'clean') --let $commands= } +--disable_ps2_protocol while ($commands != '') { --disable_query_log @@ -633,5 +634,6 @@ while ($commands != '') inc $trans_id; } } +--enable_ps2_protocol --let $commands= $rme_initial_commands diff --git a/mysql-test/suite/rpl/include/rpl_row_UUID.test b/mysql-test/suite/rpl/include/rpl_row_UUID.test index 368596d4fbc..11eb3c6b748 100644 --- a/mysql-test/suite/rpl/include/rpl_row_UUID.test +++ b/mysql-test/suite/rpl/include/rpl_row_UUID.test @@ -40,7 +40,9 @@ end| delimiter ;| # test both in SELECT and in INSERT +--disable_ps2_protocol select fn1(0); +--enable_ps2_protocol eval create table t2 (a int) engine=$engine_type; insert into t2 values(fn1(2)); diff --git a/mysql-test/suite/rpl/include/rpl_row_img_sequence.inc b/mysql-test/suite/rpl/include/rpl_row_img_sequence.inc index be5b7600f0a..d9ed6f278b9 100644 --- a/mysql-test/suite/rpl/include/rpl_row_img_sequence.inc +++ b/mysql-test/suite/rpl/include/rpl_row_img_sequence.inc @@ -54,7 +54,9 @@ FLUSH LOGS; --echo # Pt.2 Ensure NEXTVAL replicates and binlogs correctly --connection server_1 +--disable_ps2_protocol SELECT NEXTVAL(s1); +--enable_ps2_protocol --source include/save_master_gtid.inc --echo # Validate NEXTVAL replicated correctly to other servers diff --git a/mysql-test/suite/rpl/include/rpl_row_sp003.test b/mysql-test/suite/rpl/include/rpl_row_sp003.test index a8f25485f26..829e42f23c2 100644 --- a/mysql-test/suite/rpl/include/rpl_row_sp003.test +++ b/mysql-test/suite/rpl/include/rpl_row_sp003.test @@ -14,6 +14,7 @@ DROP TABLE IF EXISTS test.t1; # Begin test section 1 +--disable_ps2_protocol eval CREATE TABLE test.t1(a INT,PRIMARY KEY(a))ENGINE=$engine_type; delimiter |; @@ -70,6 +71,7 @@ connection slave; SELECT * FROM test.t1; connection master; #show binlog events from 720; +--enable_ps2_protocol DROP PROCEDURE IF EXISTS test.p1; DROP PROCEDURE IF EXISTS test.p2; diff --git a/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test b/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test index 32f08be7c4d..25bfa134dbb 100644 --- a/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test +++ b/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test @@ -34,7 +34,9 @@ begin end// delimiter ;// +--disable_ps2_protocol select multi_part_pk_with_autoinc (3); +--enable_ps2_protocol --echo *** autoincrement field is not the first in PK warning must be there: *** show warnings; diff --git a/mysql-test/suite/rpl/t/rpl_binlog_errors.test b/mysql-test/suite/rpl/t/rpl_binlog_errors.test index bf92736a2af..a5988efcb21 100644 --- a/mysql-test/suite/rpl/t/rpl_binlog_errors.test +++ b/mysql-test/suite/rpl/t/rpl_binlog_errors.test @@ -58,7 +58,9 @@ SET @old_debug= @@global.debug_dbug; -- let $load_file= $MYSQLTEST_VARDIR/tmp/bug_46166.data -- let $MYSQLD_DATADIR= `select @@datadir` -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol -- eval SELECT repeat('x',8192) INTO OUTFILE '$load_file' +--enable_ps2_protocol ### ACTION: create a small file (< 4096 bytes) that will be later used ### in LOAD DATA INFILE to check for absence of binlog errors @@ -67,7 +69,9 @@ SET @old_debug= @@global.debug_dbug; -- let $load_file2= $MYSQLTEST_VARDIR/tmp/bug_46166-2.data -- let $MYSQLD_DATADIR= `select @@datadir` -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol -- eval SELECT repeat('x',10) INTO OUTFILE '$load_file2' +--enable_ps2_protocol RESET MASTER; diff --git a/mysql-test/suite/rpl/t/rpl_drop_db.test b/mysql-test/suite/rpl/t/rpl_drop_db.test index 372afaa63c6..68d2ec46e4e 100644 --- a/mysql-test/suite/rpl/t/rpl_drop_db.test +++ b/mysql-test/suite/rpl/t/rpl_drop_db.test @@ -10,7 +10,9 @@ drop database if exists mysqltest1; create database mysqltest1; create table mysqltest1.t1 (n int); insert into mysqltest1.t1 values (1); +--disable_ps2_protocol select * from mysqltest1.t1 into outfile 'mysqltest1/f1.txt'; +--enable_ps2_protocol create table mysqltest1.t2 (n int); create table mysqltest1.t3 (n int); --replace_result \\ / 66 39 93 39 17 39 247 39 41 39 "File exists" "Directory not empty" diff --git a/mysql-test/suite/rpl/t/rpl_gtid_basic.test b/mysql-test/suite/rpl/t/rpl_gtid_basic.test index 5975c6f03c3..9cedebcfd38 100644 --- a/mysql-test/suite/rpl/t/rpl_gtid_basic.test +++ b/mysql-test/suite/rpl/t/rpl_gtid_basic.test @@ -211,6 +211,7 @@ SELECT * FROM t1; --echo *** Test @@LAST_GTID and MASTER_GTID_WAIT() *** +--disable_ps2_protocol --connection server_1 DROP TABLE t1; CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; @@ -396,7 +397,7 @@ INSERT INTO t1 VALUES (7); reap; --connection s7 reap; - +--enable_ps2_protocol --echo *** Test gtid_slave_pos when used with GTID *** diff --git a/mysql-test/suite/rpl/t/rpl_loaddata_local.test b/mysql-test/suite/rpl/t/rpl_loaddata_local.test index 20962d74e98..01f5607ba0b 100644 --- a/mysql-test/suite/rpl/t/rpl_loaddata_local.test +++ b/mysql-test/suite/rpl/t/rpl_loaddata_local.test @@ -27,7 +27,9 @@ set SQL_LOG_BIN=1; enable_query_log; let $MYSQLD_DATADIR= `select @@datadir`; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval select * into outfile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' from t1; +--enable_ps2_protocol #This will generate a 20KB file, now test LOAD DATA LOCAL truncate table t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @@ -50,7 +52,9 @@ connection master; create table t1(a int); insert into t1 values (1), (2), (2), (3); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval select * into outfile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' from t1; +--enable_ps2_protocol drop table t1; create table t1(a int primary key); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @@ -79,7 +83,9 @@ SET sql_mode='ignore_space'; CREATE TABLE t1(a int); insert into t1 values (1), (2), (3), (4); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval select * into outfile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' from t1; +--enable_ps2_protocol truncate table t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR eval load data local infile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' into table t1; @@ -111,7 +117,9 @@ CREATE TABLE t1(a int); INSERT INTO t1 VALUES (1), (2), (3), (4); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLD_DATADIR/bug43746.sql' FROM t1; +--enable_ps2_protocol TRUNCATE TABLE t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @@ -159,7 +167,9 @@ sync_slave_with_master; connection master; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLD_DATADIR/bug59267.sql' FROM t1; +--enable_ps2_protocol TRUNCATE TABLE t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @@ -204,7 +214,9 @@ CREATE VIEW v1 AS SELECT * FROM t2 WHERE f1 IN (SELECT f1 FROM t3 WHERE (t3.f2 IS NULL)); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval SELECT 1 INTO OUTFILE '$MYSQLD_DATADIR/bug60580.csv' FROM DUAL; +--enable_ps2_protocol --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR eval LOAD DATA LOCAL INFILE '$MYSQLD_DATADIR/bug60580.csv' INTO TABLE t1 (@f1) SET f2 = (SELECT f1 FROM v1 WHERE f1=@f1); diff --git a/mysql-test/suite/rpl/t/rpl_loaddata_map.test b/mysql-test/suite/rpl/t/rpl_loaddata_map.test index 655bcc39cb9..0df424aa1ac 100644 --- a/mysql-test/suite/rpl/t/rpl_loaddata_map.test +++ b/mysql-test/suite/rpl/t/rpl_loaddata_map.test @@ -37,7 +37,9 @@ while($rows) eval insert into t1 values (null); dec $rows; } +--disable_ps2_protocol eval select * into outfile '$MYSQLTEST_VARDIR/tmp/bug30435_5k.txt' from t1; +--enable_ps2_protocol DROP TABLE t1; SET @@sql_log_bin= 1; diff --git a/mysql-test/suite/rpl/t/rpl_loadfile.test b/mysql-test/suite/rpl/t/rpl_loadfile.test index 9cd64530690..a49b3c30b87 100644 --- a/mysql-test/suite/rpl/t/rpl_loadfile.test +++ b/mysql-test/suite/rpl/t/rpl_loadfile.test @@ -69,7 +69,9 @@ connection master; let $file= $MYSQLTEST_VARDIR/tmp/bug_39701.data; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT repeat('x',20) INTO OUTFILE '$file' +--enable_ps2_protocol disable_warnings; DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/rpl/t/rpl_misc_functions.test b/mysql-test/suite/rpl/t/rpl_misc_functions.test index 7189e5c44ba..7211acd508c 100644 --- a/mysql-test/suite/rpl/t/rpl_misc_functions.test +++ b/mysql-test/suite/rpl/t/rpl_misc_functions.test @@ -26,7 +26,9 @@ insert into t1 values(3, 0, 0, 0, password('does_this_work?')); --disable_warnings insert into t1 values(4, connection_id(), rand()*1000, rand()*1000, password('does_this_still_work?')); --enable_warnings +--disable_ps2_protocol select * into outfile 'rpl_misc_functions.outfile' from t1; +--enable_ps2_protocol let $MYSQLD_DATADIR= `select @@datadir`; sync_slave_with_master; create temporary table t2 like t1; @@ -90,7 +92,9 @@ INSERT INTO t1 (col_a) VALUES (test_replication_sf()); --sync_slave_with_master # Dump table on slave +--disable_ps2_protocol select * from t1 into outfile "../../tmp/t1_slave.txt"; +--enable_ps2_protocol # Load data from slave into temp table on master connection master; diff --git a/mysql-test/suite/rpl/t/rpl_mix_found_rows.test b/mysql-test/suite/rpl/t/rpl_mix_found_rows.test index c8b2eaef53b..af206c55d49 100644 --- a/mysql-test/suite/rpl/t/rpl_mix_found_rows.test +++ b/mysql-test/suite/rpl/t/rpl_mix_found_rows.test @@ -75,7 +75,9 @@ END $$ --delimiter ; SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1; +--disable_ps2_protocol SELECT log_rows(2,1), log_rows(2,2); +--enable_ps2_protocol CREATE TABLE t2 (a INT, b INT); diff --git a/mysql-test/suite/rpl/t/rpl_parallel_seq.test b/mysql-test/suite/rpl/t/rpl_parallel_seq.test index e975d079e52..f0dc4fe4485 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel_seq.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_seq.test @@ -16,7 +16,9 @@ SET @@session.binlog_row_image=FULL; SET @@session.debug_dbug="+d,binlog_force_commit_id"; SET @commit_id=7; SET @@gtid_seq_no=100; +--disable_ps2_protocol SELECT NEXT VALUE FOR s1; +--enable_ps2_protocol INSERT INTO s1 VALUES(2, 1, 10, 1, 2, 1, 1, 0); SET @@session.debug_dbug=""; diff --git a/mysql-test/suite/rpl/t/rpl_row_func001.test b/mysql-test/suite/rpl/t/rpl_row_func001.test index 6ff97388b31..2327ba9a48c 100644 --- a/mysql-test/suite/rpl/t/rpl_row_func001.test +++ b/mysql-test/suite/rpl/t/rpl_row_func001.test @@ -33,8 +33,10 @@ return 0; end// delimiter ;// +--disable_ps2_protocol select test.f1(1); select test.f1(2); +--enable_ps2_protocol select * from test.t1; save_master_pos; diff --git a/mysql-test/suite/rpl/t/rpl_slow_query_log.test b/mysql-test/suite/rpl/t/rpl_slow_query_log.test index df88d42ed68..84ccdd7e9cb 100644 --- a/mysql-test/suite/rpl/t/rpl_slow_query_log.test +++ b/mysql-test/suite/rpl/t/rpl_slow_query_log.test @@ -49,6 +49,7 @@ TRUNCATE mysql.slow_log; source include/start_slave.inc; +--disable_ps2_protocol connection master; CREATE TABLE t1 (a int, b int); @@ -341,3 +342,4 @@ DROP TABLE t1; SET @@global.log_output= @old_log_output; SET @@global.long_query_time= @old_long_query_time; --source include/rpl_end.inc +--enable_ps2_protocol diff --git a/mysql-test/suite/rpl/t/rpl_sp.test b/mysql-test/suite/rpl/t/rpl_sp.test index 637dda47489..9c946a3fe8c 100644 --- a/mysql-test/suite/rpl/t/rpl_sp.test +++ b/mysql-test/suite/rpl/t/rpl_sp.test @@ -195,7 +195,9 @@ end| delimiter ;| delete t1,t2 from t1,t2; +--disable_ps2_protocol select fn1(20); +--enable_ps2_protocol insert into t2 values(fn1(21)); --sorted_result select * from t1; diff --git a/mysql-test/suite/rpl/t/rpl_sp_effects.test b/mysql-test/suite/rpl/t/rpl_sp_effects.test index 05bd49330ed..08d806b1b3c 100644 --- a/mysql-test/suite/rpl/t/rpl_sp_effects.test +++ b/mysql-test/suite/rpl/t/rpl_sp_effects.test @@ -91,7 +91,9 @@ SELECT * FROM t1 ORDER BY a; create table t2(a int); insert into t2 values (10),(11); +--disable_ps2_protocol SELECT a,f1(a) FROM t2 ORDER BY a; +--enable_ps2_protocol # This shouldn't put separate 'call f1(3)' into binlog: insert into t2 select f1(3); @@ -110,7 +112,9 @@ delete from t2; delete from t1; insert into t2 values(1),(2); create view v1 as select f1(a) as f from t2; +--disable_ps2_protocol select * from v1 order by f; +--enable_ps2_protocol SELECT 'master:',a FROM t1 ORDER BY a; sync_slave_with_master; @@ -192,7 +196,9 @@ delimiter ;// set @x=10; set @y=20; set @z=100; +--disable_ps2_protocol select f1(); +--enable_ps2_protocol set @x=30; call p1(); @@ -238,10 +244,12 @@ DELIMITER ;// call sp_bug26199(b'1110'); call sp_bug26199('\0'); +--disable_ps2_protocol select sf_bug26199(b'1111111'); SET STATEMENT sql_mode = '' FOR select sf_bug26199(b'101111111'); select sf_bug26199('\''); +--enable_ps2_protocol select hex(b) from t2; sync_slave_with_master; diff --git a/mysql-test/suite/rpl/t/rpl_stm_found_rows.test b/mysql-test/suite/rpl/t/rpl_stm_found_rows.test index 9d76879a4ac..c1b7e02319b 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_found_rows.test +++ b/mysql-test/suite/rpl/t/rpl_stm_found_rows.test @@ -35,14 +35,18 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; # Instead of # INSERT INTO logtbl VALUES(1, 1, FOUND_ROWS()); # we write +--disable_ps2_protocol SELECT FOUND_ROWS() INTO @a; +--enable_ps2_protocol INSERT INTO logtbl VALUES(1,1,@a); SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1; # Instead of # INSERT INTO logtbl VALUES(1, 2, FOUND_ROWS()); # we write +--disable_ps2_protocol SELECT FOUND_ROWS() INTO @a; +--enable_ps2_protocol INSERT INTO logtbl VALUES(1,2,@a); SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test; @@ -78,7 +82,9 @@ END $$ --delimiter ; SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; +--disable_ps2_protocol SELECT FOUND_ROWS() INTO @found_rows; +--enable_ps2_protocol CALL just_log(2,3,@found_rows); SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test; @@ -98,8 +104,10 @@ END $$ --delimiter ; SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; +--disable_ps2_protocol SELECT FOUND_ROWS() INTO @found_rows; SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows); +--enable_ps2_protocol SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test; sync_slave_with_master; diff --git a/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test b/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test index 31b80732c60..50277b1b799 100644 --- a/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test +++ b/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test @@ -238,7 +238,9 @@ begin return 100; end| delimiter ;| +--disable_ps2_protocol select foo4(); +--enable_ps2_protocol prepare stmt1 from 'select foo4()'; execute stmt1; @@ -253,7 +255,9 @@ begin return 100; end| delimiter ;| +--disable_ps2_protocol select foo5(); +--enable_ps2_protocol prepare stmt1 from 'select foo5()'; execute stmt1; @@ -268,8 +272,10 @@ begin return 100; end| delimiter ;| +--disable_ps2_protocol select foo6("foo6_1_"); select foo6(concat("foo6_2_",UUID())); +--enable_ps2_protocol prepare stmt1 from 'select foo6(concat("foo6_3_",UUID()))'; execute stmt1; @@ -376,7 +382,9 @@ begin return 1; end| delimiter ;| +--disable_ps2_protocol select f("try_41_"); +--enable_ps2_protocol # Two operations which compensate each other except that their net # effect is that they advance the auto_increment counter of t2 on slave: sync_slave_with_master; @@ -386,7 +394,9 @@ delete from t2 where a>=2; connection master; # this is the call which didn't replicate well +--disable_ps2_protocol select f("try_42_"); +--enable_ps2_protocol sync_slave_with_master; # now use prepared statement and test again, just to see that the RBB @@ -410,7 +420,9 @@ connection master; create table t12 select * from t1; # save for comparing later drop table t1; create table t1 (a int, b varchar(100), key(a)); +--disable_ps2_protocol select f("try_45_"); +--enable_ps2_protocol # restore table's key create table t13 select * from t1; @@ -435,7 +447,9 @@ begin return 1; end| delimiter ;| +--disable_ps2_protocol select f1("try_46_"),f2("try_47_"); +--enable_ps2_protocol sync_slave_with_master; insert into t2 values(2,null),(3,null),(4,null); @@ -443,7 +457,9 @@ delete from t2 where a>=2; connection master; # Test with SELECT and INSERT +--disable_ps2_protocol select f1("try_48_"),f2("try_49_"); +--enable_ps2_protocol insert into t3 values(concat("try_50_",f1("try_51_"),f2("try_52_"))); sync_slave_with_master; @@ -460,7 +476,9 @@ begin return y; end| delimiter ;| +--disable_ps2_protocol select f1("try_53_"),f2("try_54_"); +--enable_ps2_protocol sync_slave_with_master; # And now, a normal statement with a trigger (no stored functions) diff --git a/mysql-test/suite/rpl/t/rpl_variables.test b/mysql-test/suite/rpl/t/rpl_variables.test index 1b83d5d57d7..f6e88c5ae61 100644 --- a/mysql-test/suite/rpl/t/rpl_variables.test +++ b/mysql-test/suite/rpl/t/rpl_variables.test @@ -468,8 +468,9 @@ BEGIN END| DELIMITER ;| +--disable_ps2_protocol SELECT func(); - +--enable_ps2_protocol --echo ==== Insert variables from a trigger ==== diff --git a/mysql-test/suite/rpl/t/rpl_variables_stm.test b/mysql-test/suite/rpl/t/rpl_variables_stm.test index 1cc3cde3280..ffbb3e7749a 100644 --- a/mysql-test/suite/rpl/t/rpl_variables_stm.test +++ b/mysql-test/suite/rpl/t/rpl_variables_stm.test @@ -372,9 +372,11 @@ BEGIN END| DELIMITER ;| +--disable_ps2_protocol --disable_warnings SELECT func(); --enable_warnings +--enable_ps2_protocol --echo ==== Insert variables from a trigger ==== diff --git a/mysql-test/suite/rpl/t/rpl_view_multi.test b/mysql-test/suite/rpl/t/rpl_view_multi.test index c8af44bfc6e..50b9c184d91 100644 --- a/mysql-test/suite/rpl/t/rpl_view_multi.test +++ b/mysql-test/suite/rpl/t/rpl_view_multi.test @@ -27,6 +27,7 @@ drop view if exists v1; --echo # Syncing slave with master --sync_slave_with_master +--disable_ps2_protocol connect (master2,127.0.0.1,root,,test,$MASTER_MYPORT,); connection master; @@ -122,6 +123,7 @@ select * from t2; --echo # So we have same result on slave. select * from t1; select * from t2; +--enable_ps2_protocol connection master; drop table t1, t2; diff --git a/mysql-test/suite/rpl/t/sequence.test b/mysql-test/suite/rpl/t/sequence.test index 436a0b1cdab..5c6a8e1ea23 100644 --- a/mysql-test/suite/rpl/t/sequence.test +++ b/mysql-test/suite/rpl/t/sequence.test @@ -27,7 +27,9 @@ set @@default_storage_engine="aria"; CREATE SEQUENCE s1 cache=10; create table t1 select * from s1; +--disable_ps2_protocol select NEXT VALUE for s1,seq from seq_1_to_20; +--enable_ps2_protocol insert into t1 select * from s1; do setval(s1,5, 1, 0); insert into t1 select * from s1; diff --git a/mysql-test/suite/sql_sequence/alter.test b/mysql-test/suite/sql_sequence/alter.test index a5e6245d609..e6bbaba614a 100644 --- a/mysql-test/suite/sql_sequence/alter.test +++ b/mysql-test/suite/sql_sequence/alter.test @@ -7,6 +7,7 @@ drop table if exists t1; --echo # Test alter sequence --echo # +--disable_ps2_protocol CREATE SEQUENCE t1 nocache engine=myisam; select * from t1; select next value for t1; @@ -161,3 +162,4 @@ CREATE SEQUENCE s; ALTER TABLE s ORDER BY cache_size; SELECT NEXTVAL(s); DROP SEQUENCE s; +--enable_ps2_protocol diff --git a/mysql-test/suite/sql_sequence/alter_notembedded.test b/mysql-test/suite/sql_sequence/alter_notembedded.test index a7c37b53473..5bd54a7c721 100644 --- a/mysql-test/suite/sql_sequence/alter_notembedded.test +++ b/mysql-test/suite/sql_sequence/alter_notembedded.test @@ -10,6 +10,7 @@ create database s_db; create sequence s_db.s1; grant select on s_db.s1 to normal_1@'%' identified by 'pass'; +--disable_ps2_protocol connect(m_normal_1, localhost, normal_1, pass, s_db); select * from s1; --error ER_TABLEACCESS_DENIED_ERROR @@ -30,6 +31,7 @@ alter sequence s1 restart 50; select nextval(s1); --error ER_TABLEACCESS_DENIED_ERROR drop sequence s1; +--enable_ps2_protocol connection default; disconnect m_normal_1; diff --git a/mysql-test/suite/sql_sequence/aria.test b/mysql-test/suite/sql_sequence/aria.test index 8e8a50ef412..daca8aff71c 100644 --- a/mysql-test/suite/sql_sequence/aria.test +++ b/mysql-test/suite/sql_sequence/aria.test @@ -8,6 +8,7 @@ set @@default_storage_engine="aria"; +--disable_ps2_protocol CREATE SEQUENCE t1 cache=10; show create sequence t1; select NEXT VALUE for t1,seq from seq_1_to_20; @@ -41,3 +42,4 @@ select next value for t2; alter table t2 rename to t1; select next value for t1; drop table t1; +--enable_ps2_protocol diff --git a/mysql-test/suite/sql_sequence/auto_increment.test b/mysql-test/suite/sql_sequence/auto_increment.test index 335bef7ea37..11f772b67b9 100644 --- a/mysql-test/suite/sql_sequence/auto_increment.test +++ b/mysql-test/suite/sql_sequence/auto_increment.test @@ -4,6 +4,7 @@ # tests with auto_increment_increment and auto_increment_offset # +--disable_ps2_protocol set global auto_increment_increment= 2, auto_increment_offset= 2; create sequence s start with -3 minvalue= -1000 increment 0; @@ -24,6 +25,7 @@ select nextval(s); flush tables; select nextval(s); drop sequence s; +--enable_ps2_protocol # Clean up diff --git a/mysql-test/suite/sql_sequence/binlog.test b/mysql-test/suite/sql_sequence/binlog.test index 6a12e670a1e..70d28038a82 100644 --- a/mysql-test/suite/sql_sequence/binlog.test +++ b/mysql-test/suite/sql_sequence/binlog.test @@ -11,10 +11,12 @@ reset master; # get rid of previous tests binlog --enable_query_log create or replace sequence s1 cache 3; +--disable_ps2_protocol select next value for s1, minimum_value from s1 where maximum_value> 1; select next value for s1, minimum_value from s1 where maximum_value> 2; select next value for s1, minimum_value from s1 where maximum_value> 3; select next value for s1, minimum_value from s1 where maximum_value> 4; +--enable_ps2_protocol # # Alter sequence diff --git a/mysql-test/suite/sql_sequence/concurrent_create.test b/mysql-test/suite/sql_sequence/concurrent_create.test index b27a6d3bdb9..e9a61e63b78 100644 --- a/mysql-test/suite/sql_sequence/concurrent_create.test +++ b/mysql-test/suite/sql_sequence/concurrent_create.test @@ -69,7 +69,9 @@ FLUSH TABLES; --disconnect con1 --connection default +--disable_ps2_protocol SELECT NEXTVAL(s1); +--enable_ps2_protocol COMMIT; # Cleanup diff --git a/mysql-test/suite/sql_sequence/create.test b/mysql-test/suite/sql_sequence/create.test index aa58b0c5fec..fa85c0a8f0a 100644 --- a/mysql-test/suite/sql_sequence/create.test +++ b/mysql-test/suite/sql_sequence/create.test @@ -379,6 +379,7 @@ drop view v1; # CREATE TEMPORARY SEQUENCE # +--disable_ps2_protocol CREATE TEMPORARY SEQUENCE t1; select next value for t1; drop temporary table t1; @@ -411,6 +412,7 @@ select previous value for t1; drop temporary sequence t1; select previous value for t1; drop sequence t1; +--enable_ps2_protocol # # Check that we can't create anything with the sequence engine diff --git a/mysql-test/suite/sql_sequence/default.test b/mysql-test/suite/sql_sequence/default.test index 28eb71e39cc..f965089d992 100644 --- a/mysql-test/suite/sql_sequence/default.test +++ b/mysql-test/suite/sql_sequence/default.test @@ -29,10 +29,12 @@ INSERT into t1 values(default(a),10); INSERT into t1 values(default(a),default(a)); update t1 set a=default(a), b=12 where b=2; select * from t1; +--disable_ps2_protocol select default(a), a, b from t1; select * from s1; select * from t1 where default(a) > 0; select * from s1; +--enable_ps2_protocol --echo # --echo # View @@ -70,7 +72,9 @@ UNLOCK TABLES; LOCK TABLE t1 WRITE, s1 WRITE; insert into t1 (b) values (5),(6); +--disable_ps2_protocol select default(a) from t1; +--enable_ps2_protocol UNLOCK TABLES; LOCK TABLE t1 READ; diff --git a/mysql-test/suite/sql_sequence/grant.test b/mysql-test/suite/sql_sequence/grant.test index 3a911d79671..fb8a9f813a6 100644 --- a/mysql-test/suite/sql_sequence/grant.test +++ b/mysql-test/suite/sql_sequence/grant.test @@ -22,6 +22,7 @@ connect(read_write,localhost,read_write,,mysqltest_1); connect(alter,localhost,alter,,mysqltest_1); connect(only_alter, localhost, only_alter,,mysqltest_1); +--disable_ps2_protocol connection normal; create sequence s1; select next value for s1; @@ -52,6 +53,7 @@ select next value for s1; alter sequence s1 restart= 11; --error ER_TABLEACCESS_DENIED_ERROR select * from s1; +--enable_ps2_protocol # # Cleanup diff --git a/mysql-test/suite/sql_sequence/gtid.test b/mysql-test/suite/sql_sequence/gtid.test index 63ed7ec5264..230fbef8070 100644 --- a/mysql-test/suite/sql_sequence/gtid.test +++ b/mysql-test/suite/sql_sequence/gtid.test @@ -6,6 +6,7 @@ --source include/master-slave.inc --source include/have_innodb.inc +--disable_ps2_protocol connection master; create database s_db; grant all on s_db.* to normal_1@'%' identified by 'pass'; @@ -704,5 +705,6 @@ drop user normal_2@'%'; drop user normal_3@'%'; drop user normal_4@'%'; drop user normal_5@'%'; +--enable_ps2_protocol --source include/rpl_end.inc diff --git a/mysql-test/suite/sql_sequence/next.test b/mysql-test/suite/sql_sequence/next.test index a80f9fad561..18b52961a54 100644 --- a/mysql-test/suite/sql_sequence/next.test +++ b/mysql-test/suite/sql_sequence/next.test @@ -5,6 +5,7 @@ # Test sequence generation # +--disable_ps2_protocol CREATE SEQUENCE t1 start with 1 minvalue 1 maxvalue 10 increment by 1 cache 2 cycle; show create table t1; select next value for t1; @@ -297,3 +298,4 @@ SELECT SETVAL (v,0); UNLOCK TABLES; DROP VIEW v; +--disable_ps2_protocol diff --git a/mysql-test/suite/sql_sequence/other.test b/mysql-test/suite/sql_sequence/other.test index 0fbb2d0e2f9..a811853751a 100644 --- a/mysql-test/suite/sql_sequence/other.test +++ b/mysql-test/suite/sql_sequence/other.test @@ -9,6 +9,7 @@ --echo # Create and check --echo # +--disable_ps2_protocol create sequence s1 engine=innodb; check table s1; select next value for s1; @@ -27,6 +28,7 @@ check table s1; select next value for s1; select * from s1; drop sequence s1; +--enable_ps2_protocol --echo # --echo # INSERT @@ -45,7 +47,9 @@ insert into s1 values(0,9223372036854775806,1,1,1,1000,0,0); select * from s1; insert into s1 values(1000,1,9223372036854775806,1,1,1000,0,0); select * from s1; +--disable_ps2_protocol select next value for s1; +--enable_ps2_protocol select * from s1; --error ER_SEQUENCE_INVALID_DATA insert into s2 values(0, 1, 10, 1, 2, 1, 1, 0); @@ -98,6 +102,7 @@ drop table s1; --echo # Many sequence calls with innodb --echo # +--disable_ps2_protocol create sequence s1 cache=1000 engine=innodb; start transaction; select count(nextval(s1)) from seq_1_to_2000; @@ -120,11 +125,13 @@ connection default; select * from s1; commit; drop sequence s1; +--enable_ps2_protocol --echo # --echo # Flush tables with read lock --echo # +--disable_ps2_protocol create sequence s1; select next value for s1; flush tables with read lock; @@ -134,6 +141,7 @@ create sequence s2; select next value for s1; unlock tables; drop sequence s1; +--enable_ps2_protocol --echo # --echo # MDEV-14761 diff --git a/mysql-test/suite/sql_sequence/read_only.test b/mysql-test/suite/sql_sequence/read_only.test index 73103384882..141a310c040 100644 --- a/mysql-test/suite/sql_sequence/read_only.test +++ b/mysql-test/suite/sql_sequence/read_only.test @@ -39,6 +39,8 @@ select * from s1; --let $restart_parameters= --source include/restart_mysqld.inc select * from s1; +--disable_ps2_protocol select next value for s1; +--enable_ps2_protocol select * from s1; drop sequence s1; diff --git a/mysql-test/suite/sql_sequence/replication.test b/mysql-test/suite/sql_sequence/replication.test index e26fde8a329..35feb3d8fd8 100644 --- a/mysql-test/suite/sql_sequence/replication.test +++ b/mysql-test/suite/sql_sequence/replication.test @@ -9,6 +9,7 @@ --source include/master-slave.inc --source include/have_innodb.inc +--disable_ps2_protocol connection master; create database s_db; use s_db; @@ -868,6 +869,7 @@ select * from t1; select * from s1; connection master; drop table t1,s1; +--enable_ps2_protocol # # Cleanup diff --git a/mysql-test/suite/sql_sequence/replication_mixed.test b/mysql-test/suite/sql_sequence/replication_mixed.test index 0096ab5acd8..4796c84835f 100644 --- a/mysql-test/suite/sql_sequence/replication_mixed.test +++ b/mysql-test/suite/sql_sequence/replication_mixed.test @@ -9,7 +9,9 @@ --echo # CREATE SEQUENCE s1 ENGINE=InnoDB; +--disable_ps2_protocol SELECT NEXTVAL(s1); +--enable_ps2_protocol CREATE TABLE t1 ENGINE=InnoDB SELECT LASTVAL(s1) AS a; INSERT INTO t1 VALUES (NEXTVAL(s1)); INSERT INTO t1 VALUES (LASTVAL(s1)); diff --git a/mysql-test/suite/sql_sequence/setval.test b/mysql-test/suite/sql_sequence/setval.test index 1993bdbe077..712e7a77be7 100644 --- a/mysql-test/suite/sql_sequence/setval.test +++ b/mysql-test/suite/sql_sequence/setval.test @@ -7,6 +7,7 @@ drop table if exists t1; --echo # Test setval function --echo # +--disable_ps2_protocol CREATE SEQUENCE t1 cache 10 engine=myisam; select next_not_cached_value,cycle_count from t1; do setval(t1,10); @@ -151,6 +152,6 @@ SELECT SETVAL(s, 10); # Cleanup DROP SEQUENCE s; - +--enable_ps2_protocol --echo # End of 10.3 tests diff --git a/mysql-test/suite/sql_sequence/slave_nextval.test b/mysql-test/suite/sql_sequence/slave_nextval.test index 70da1044540..41aca150625 100644 --- a/mysql-test/suite/sql_sequence/slave_nextval.test +++ b/mysql-test/suite/sql_sequence/slave_nextval.test @@ -5,6 +5,7 @@ # MDEV-14092 NEXTVAL() fails on slave # +--disable_ps2_protocol CREATE SEQUENCE s; INSERT INTO s VALUES (1,1,4,1,1,1,0,0); show create sequence s; @@ -125,6 +126,7 @@ END $ --connection master DROP SEQUENCE s; DROP PROCEDURE pr; +--enable_ps2_protocol # # Cleanup diff --git a/mysql-test/suite/sql_sequence/temporary.test b/mysql-test/suite/sql_sequence/temporary.test index aeacf6e9497..e57dc693304 100644 --- a/mysql-test/suite/sql_sequence/temporary.test +++ b/mysql-test/suite/sql_sequence/temporary.test @@ -11,7 +11,9 @@ create temporary sequence s1 engine=innodb; alter table s1 engine myisam; +--disable_ps2_protocol select nextval(s1); +--enable_ps2_protocol select * from s1; drop temporary sequence s1; @@ -28,6 +30,7 @@ DROP TEMPORARY SEQUENCE s1; --echo # MDEV-13007 ALTER .. ENGINE on temporary sequence may go wrong --echo # +--disable_ps2_protocol create temporary sequence s1 engine=aria; alter table s1 engine myisam; select nextval(s1); @@ -41,3 +44,4 @@ alter table s1 engine innodb; select nextval(s1); select nextval(s1); drop temporary sequence s1; +--enable_ps2_protocol diff --git a/mysql-test/suite/sql_sequence/view.test b/mysql-test/suite/sql_sequence/view.test index 5b970432a34..affac002878 100644 --- a/mysql-test/suite/sql_sequence/view.test +++ b/mysql-test/suite/sql_sequence/view.test @@ -8,9 +8,11 @@ create sequence s1; create view v1 as select * from s1; create view v2 as select next value for s1; +--disable_ps2_protocol select * from v1; select * from v2; select * from v2; +--enable_ps2_protocol --error ER_NOT_SEQUENCE select next value for v1; drop sequence s1; diff --git a/mysql-test/suite/sys_vars/t/group_concat_max_len_func.test b/mysql-test/suite/sys_vars/t/group_concat_max_len_func.test index b053ee229d7..50ba211e3ca 100644 --- a/mysql-test/suite/sys_vars/t/group_concat_max_len_func.test +++ b/mysql-test/suite/sys_vars/t/group_concat_max_len_func.test @@ -78,14 +78,17 @@ connect (test_con2,localhost,root,,); connection test_con1; --echo ## Accessing data and using group_concat on column whose value is greater than 4 ## +--disable_ps2_protocol SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; +--enable_ps2_protocol --echo ## Changing session value of variable and verifying its behavior, ## --echo ## warning should come here ## SET @@session.group_concat_max_len = 10; +--disable_ps2_protocol SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; - +--enable_ps2_protocol --echo '#--------------------FN_DYNVARS_034_03-------------------------#' ############################################################################## @@ -103,8 +106,9 @@ SET @@session.group_concat_max_len = 20; --echo ## Verifying value of name column, it should not me more than 20 characters ## --echo ## Warning should come here ## +--disable_ps2_protocol SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; - +--enable_ps2_protocol --echo '#--------------------FN_DYNVARS_034_04-------------------------#' ############################################################################### diff --git a/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test b/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test index a7a088cdcd9..1e5602eabf1 100644 --- a/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test +++ b/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test @@ -22,7 +22,9 @@ select @@log_disabled_statements; TRUNCATE TABLE mysql.general_log; check table t1; CALL slow(); +--disable_ps2_protocol SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part2'; +--enable_ps2_protocol --echo --> SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; @@ -32,7 +34,9 @@ TRUNCATE TABLE mysql.general_log; SET SESSION log_disabled_statements=""; check table t1; CALL slow(); +--disable_ps2_protocol SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part3'; +--enable_ps2_protocol --echo --> SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; @@ -42,7 +46,9 @@ TRUNCATE TABLE mysql.general_log; SET SESSION log_disabled_statements="sp,slave"; check table t1; CALL slow(); +--disable_ps2_protocol SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part4'; +--enable_ps2_protocol --echo --> SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; diff --git a/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test b/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test index 97822a0f23a..b8a76a84bbd 100644 --- a/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test +++ b/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test @@ -50,7 +50,9 @@ CHECK TABLE log_slow_admin_statements EXTENDED; DROP TABLE log_slow_admin_statements; # ALTER, OPTIMIZE, CHECK and DROP operations should be logged in slow query log. +--disable_ps2_protocol SELECT sql_text FROM mysql.slow_log WHERE sql_text LIKE '%TABLE log_slow_admin_statements%'; +--enable_ps2_protocol SET @@global.log_output= @old_log_output; SET @@global.slow_query_log= @old_slow_query_log; diff --git a/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test b/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test index 483948c840e..db9bc8fb48f 100644 --- a/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test +++ b/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test @@ -38,6 +38,7 @@ DELIMITER ;$ SET SESSION long_query_time = 0; +--disable_ps2_protocol SELECT @@log_slow_disabled_statements; TRUNCATE TABLE mysql.slow_log; ALTER TABLE t1 add column extra int; @@ -77,6 +78,7 @@ SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part5'; --echo --> SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; --echo <-- +--enable_ps2_protocol DROP TABLE t1,t2; DROP PROCEDURE slow; diff --git a/mysql-test/suite/sys_vars/t/query_cache_limit_func.test b/mysql-test/suite/sys_vars/t/query_cache_limit_func.test index c115524d49d..e0105c89866 100644 --- a/mysql-test/suite/sys_vars/t/query_cache_limit_func.test +++ b/mysql-test/suite/sys_vars/t/query_cache_limit_func.test @@ -114,7 +114,9 @@ SET @@GLOBAL.query_cache_limit = 0; #fetching results# --echo ** fetching results ** +--disable_ps2_protocol SELECT * FROM t; +--enable_ps2_protocol # Check status after setting value# --echo ** Check status after setting value ** diff --git a/mysql-test/suite/sys_vars/t/secure_file_priv.test b/mysql-test/suite/sys_vars/t/secure_file_priv.test index a5a465d8c98..74c07d160f1 100644 --- a/mysql-test/suite/sys_vars/t/secure_file_priv.test +++ b/mysql-test/suite/sys_vars/t/secure_file_priv.test @@ -25,7 +25,9 @@ my $protected_file= dirname($ENV{MYSQLTEST_VARDIR}).'/bug50373.txt'; # test runs). unlink $protected_file; open(FILE, ">", "$ENV{MYSQL_TMP_DIR}/bug50373.inc") or die; +print FILE "--disable_ps2_protocol\n"; print FILE "SELECT * FROM t1 INTO OUTFILE '".$protected_file."';\n"; +print FILE "--enable_ps2_protocol\n"; print FILE "DELETE FROM t1;\n"; print FILE "LOAD DATA INFILE '".$protected_file."' INTO TABLE t1;\n"; print FILE "SELECT * FROM t1;\n"; diff --git a/mysql-test/suite/sys_vars/t/sql_buffer_result_func.test b/mysql-test/suite/sys_vars/t/sql_buffer_result_func.test index 380f2568b9c..77f947c9913 100644 --- a/mysql-test/suite/sys_vars/t/sql_buffer_result_func.test +++ b/mysql-test/suite/sys_vars/t/sql_buffer_result_func.test @@ -51,14 +51,18 @@ SHOW STATUS LIKE 'Created_tmp_tables'; --enable_ps_protocol --echo Expected value : 0. +--disable_ps2_protocol SELECT * FROM t1; +--enable_ps2_protocol --disable_ps_protocol SHOW STATUS LIKE 'Created_tmp_tables'; --enable_ps_protocol --echo Expected value : 1. +--disable_ps2_protocol SELECT * FROM t1; +--enable_ps2_protocol --disable_ps_protocol SHOW STATUS LIKE 'Created_tmp_tables'; diff --git a/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test b/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test index 6b3d2e1fa1b..c78eac199c3 100644 --- a/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test +++ b/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test @@ -15,6 +15,7 @@ SET @start_tmp_disk_table_size=@@session.tmp_disk_table_size; set @@session.tmp_memory_table_size=1000; set @@session.tmp_disk_table_size=3000000; +--disable_ps2_protocol create table t1 (a int primary key, b varchar(2000)); insert into t1 select seq,repeat(char(mod(seq,62)+64),seq) from seq_1_to_2000; insert into t1 values (20000,"A"); @@ -25,3 +26,4 @@ set @@session.tmp_disk_table_size=1000000; select count(*) as c from t1 group by b having c>1; show status like "created_tmp_disk%"; drop table t1; +--enable_ps2_protocol diff --git a/mysql-test/suite/vcol/inc/vcol_trigger_sp.inc b/mysql-test/suite/vcol/inc/vcol_trigger_sp.inc index 8be139471f1..c7dedcdd74c 100644 --- a/mysql-test/suite/vcol/inc/vcol_trigger_sp.inc +++ b/mysql-test/suite/vcol/inc/vcol_trigger_sp.inc @@ -197,6 +197,7 @@ DELIMITER ;| --echo # Inserts set @a=0,@b=0,@c=0; +--disable_ps2_protocol insert into t1 (a) values(1); insert into t1 (a,b) values(2, "*2*"); insert into t1 (a,b,c) values(3, "*3*", "**3**"); @@ -219,6 +220,7 @@ update t1 set a=a+100, b=NULL where a=3; update t1 set a=a+100, b="invisible", c=NULL where a=4; select @a,@b,@c; select * from t1; +--enable_ps2_protocol drop trigger t1_ins; drop trigger t1_update; diff --git a/mysql-test/suite/vcol/t/load_data.test b/mysql-test/suite/vcol/t/load_data.test index f4b3b60397e..1b662818cd2 100644 --- a/mysql-test/suite/vcol/t/load_data.test +++ b/mysql-test/suite/vcol/t/load_data.test @@ -5,7 +5,9 @@ create table t1 ( c1 varchar(10), c2 varchar(10), c3 int ); insert into t1 values ("a" , "b", 1), ("a" , "b", 2); create table t2 like t1 ; alter table t2 add column c4 bigint unsigned as (CONV(LEFT(MD5(concat(c1,c2,c3)), 16), 16, 10)) persistent unique key; +--disable_ps2_protocol select * into outfile 't1.csv' from t1; +--enable_ps2_protocol load data infile 't1.csv' ignore into table t2 ; select * from t2; insert into t2 (c1,c2,c3) values ("a" , "b", 4); diff --git a/mysql-test/suite/vcol/t/vcol_keys_myisam.test b/mysql-test/suite/vcol/t/vcol_keys_myisam.test index 6c3a94d2086..2a5aa3cd479 100644 --- a/mysql-test/suite/vcol/t/vcol_keys_myisam.test +++ b/mysql-test/suite/vcol/t/vcol_keys_myisam.test @@ -281,7 +281,9 @@ drop table t1; CREATE TABLE t1 (i INT, d1 DATE, d2 DATE NOT NULL, t TIMESTAMP, KEY(t)) ENGINE=MyISAM; INSERT INTO t1 VALUES (1,'2023-03-16','2023-03-15','2012-12-12 12:12:12'); ALTER TABLE t1 MODIFY t FLOAT AS (i) PERSISTENT; +--disable_ps2_protocol SELECT i, d1, d2 INTO OUTFILE 'load_t1' FROM t1; +--enable_ps2_protocol DELETE FROM t1; LOAD DATA INFILE 'load_t1' INTO TABLE t1 (i,d1,d2); SELECT * FROM t1 WHERE d2 < d1; diff --git a/mysql-test/suite/vcol/t/wrong_arena.test b/mysql-test/suite/vcol/t/wrong_arena.test index 296cb68f5c0..4b6f941563e 100644 --- a/mysql-test/suite/vcol/t/wrong_arena.test +++ b/mysql-test/suite/vcol/t/wrong_arena.test @@ -21,7 +21,10 @@ connect con1, localhost, root; disable_warnings; insert t1 (a) values ('2010-10-10 10:10:10'); enable_warnings; +#Enable after fix MDEV-31359 +--disable_ps2_protocol select * from t1; +--enable_ps2_protocol disconnect con1; connection default; disable_warnings; diff --git a/mysql-test/suite/versioning/t/foreign.test b/mysql-test/suite/versioning/t/foreign.test index 532086b791d..db3a98e03ec 100644 --- a/mysql-test/suite/versioning/t/foreign.test +++ b/mysql-test/suite/versioning/t/foreign.test @@ -396,15 +396,21 @@ INSERT INTO t2 VALUES (1,'against'),(2,'q'); SET SQL_MODE= ''; SET timestamp = 2; +--disable_ps2_protocol SELECT * INTO OUTFILE 't1.data' FROM t1; +--enable_ps2_protocol SET timestamp = 3; UPDATE t1 SET f13 = 'q'; SET timestamp = 4; LOAD DATA INFILE 't1.data' REPLACE INTO TABLE t1; +--disable_ps2_protocol SELECT * INTO OUTFILE 't1.data.2' FROM t1; +--enable_ps2_protocol SET timestamp = 5; LOAD DATA INFILE 't1.data.2' REPLACE INTO TABLE t1; +--disable_ps2_protocol SELECT * INTO OUTFILE 't2.data' FROM t2; +--enable_ps2_protocol SET timestamp = 6; LOAD DATA INFILE 't2.data' REPLACE INTO TABLE t2; SET FOREIGN_KEY_CHECKS = OFF; @@ -547,7 +553,9 @@ delete from t0; --error ER_ROW_IS_REFERENCED_2 replace t0 values (1); +--disable_ps2_protocol select * into outfile 'load_t0' from t0 ; +--enable_ps2_protocol --error ER_ROW_IS_REFERENCED_2 load data infile 'load_t0' replace into table t0; diff --git a/mysql-test/suite/versioning/t/load_data.test b/mysql-test/suite/versioning/t/load_data.test index 4db6eee6c4d..6668a4ff9f7 100644 --- a/mysql-test/suite/versioning/t/load_data.test +++ b/mysql-test/suite/versioning/t/load_data.test @@ -4,7 +4,9 @@ CREATE TABLE t1 (a INT, b INT, c INT, vc INT AS (c), UNIQUE(a), UNIQUE(b)) WITH SYSTEM VERSIONING; INSERT IGNORE INTO t1 (a,b,c) VALUES (1,2,3); +--disable_ps2_protocol SELECT a, b, c FROM t1 INTO OUTFILE '15330.data'; +--enable_ps2_protocol LOAD DATA INFILE '15330.data' IGNORE INTO TABLE t1 (a,b,c); LOAD DATA INFILE '15330.data' REPLACE INTO TABLE t1 (a,b,c); diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index f834984576e..0ccb64d332c 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -699,7 +699,9 @@ create or replace table t1 ( insert into t1 () values (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(); +--disable_ps2_protocol select * into outfile 'load.data' from t1; +--enable_ps2_protocol load data infile 'load.data' replace into table t1; --error ER_RECORD_FILE_FULL load data infile 'load.data' replace into table t1; @@ -1041,7 +1043,9 @@ partition by system_time limit 100 ( partition pn current); insert into t1 select seq from seq_0_to_49; +--disable_ps2_protocol select x into outfile 'MDEV-20077.data' from t1; +--enable_ps2_protocol load data infile 'MDEV-20077.data' replace into table t1 (x); load data infile 'MDEV-20077.data' replace into table t1 (x); diff --git a/storage/connect/mysql-test/connect/t/infoschema-9739.test b/storage/connect/mysql-test/connect/t/infoschema-9739.test index 16f837cafcc..02b264e6d0b 100644 --- a/storage/connect/mysql-test/connect/t/infoschema-9739.test +++ b/storage/connect/mysql-test/connect/t/infoschema-9739.test @@ -5,5 +5,7 @@ --source windows.inc create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=domdoc'; +--disable_ps2_protocol select * from information_schema.tables where table_schema='test' and create_options like '%table_type=XML%'; +--enable_ps2_protocol drop table t1; diff --git a/storage/connect/mysql-test/connect/t/infoschema2-9739.test b/storage/connect/mysql-test/connect/t/infoschema2-9739.test index 76681bc91ed..a4c149148db 100644 --- a/storage/connect/mysql-test/connect/t/infoschema2-9739.test +++ b/storage/connect/mysql-test/connect/t/infoschema2-9739.test @@ -5,5 +5,7 @@ --source have_libxml2.inc create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=libxml2'; +--disable_ps2_protocol select * from information_schema.tables where table_schema='test' and create_options like '%table_type=XML%'; +--enable_ps2_protocol drop table t1; diff --git a/storage/connect/mysql-test/connect/t/json_udf.test b/storage/connect/mysql-test/connect/t/json_udf.test index d45131f32ba..96fe836e60b 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.test +++ b/storage/connect/mysql-test/connect/t/json_udf.test @@ -33,7 +33,9 @@ SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Arra SELECT Json_Array_Add(JsonValue('one value'), 'One more'); #--error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add('one value', 'One more'); +--disable_ps2_protocol SELECT Json_Array_Add('one value' json_, 'One more'); +--enable_ps2_protocol #--error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add(5 json_, 'One more'); SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 0); diff --git a/storage/connect/mysql-test/connect/t/json_udf_bin.test b/storage/connect/mysql-test/connect/t/json_udf_bin.test index cbbfca9d2d2..d8c7c0fb398 100644 --- a/storage/connect/mysql-test/connect/t/json_udf_bin.test +++ b/storage/connect/mysql-test/connect/t/json_udf_bin.test @@ -112,7 +112,9 @@ SELECT Json_Serialize(Jbin_Array_Add(Jbin_File('not_exist.json'), 'd')); SELECT Json_Serialize(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')); SELECT Json_File('bt1.json', 2); --echo # This does modify the file +--disable_ps2_protocol SELECT Json_Array_Add(Jbin_File('bt1.json'), 'd'); +--enable_ps2_protocol SELECT Json_File('bt1.json', 2); --echo # Back to the original file SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); @@ -120,31 +122,45 @@ SELECT Json_Make_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result"; SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result"; --echo # This does modify the file +--disable_ps2_protocol SELECT Json_Make_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result"; +--enable_ps2_protocol SELECT Json_File('bt1.json'); SELECT Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2); SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1; +--disable_ps2_protocol SELECT Json_File(Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), 'e')) AS "Result"; +--enable_ps2_protocol SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); +--disable_ps2_protocol SELECT Json_File(Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), 'e')) AS "Result" from t1; +--enable_ps2_protocol SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); +--disable_ps2_protocol SELECT Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), n) AS "Result" from t1; +--enable_ps2_protocol --echo # Show modified file SELECT Json_File('bt1.json'); SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); +--disable_ps2_protocol SELECT Json_Array_Add(Jbin_File('bt1.json'), n) AS "Result" from t1; +--enable_ps2_protocol --echo # Show modified file SELECT Json_File('bt1.json'); SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); +--disable_ps2_protocol SELECT Json_File(Jbin_Item_Merge(Jbin_File('bt1.json'), Jbin_Array('d','e','f'))); SELECT Json_File(Json_Item_Merge(Jbin_File('bt1.json'), Jbin_Array('d','e','f'))); +--enable_ps2_protocol SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); --echo # Test DELETE from file +--disable_ps2_protocol SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result"; SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result"; SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1; SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; SELECT Json_Make_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; +--enable_ps2_protocol --echo # Show modified file SELECT Json_File('bt1.json'); --echo # Object file @@ -181,9 +197,11 @@ SELECT Json_Serialize(Jbin_Object_List(Jbin_File('bt2.json'))) "Key list"; # Test documentation examples # SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0); +--disable_ps2_protocol SELECT Json_Array_Add(Json_File('bt3.json', '$.b'), 66); SELECT Json_Array_Add(Json_File('bt3.json'), 66, '$.b'); SELECT Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66); +--enable_ps2_protocol SELECT Json_File('bt3.json', 3); SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0); # diff --git a/storage/connect/mysql-test/connect/t/mysql_exec.test b/storage/connect/mysql-test/connect/t/mysql_exec.test index 4aad23cd588..afa3613fbe7 100644 --- a/storage/connect/mysql-test/connect/t/mysql_exec.test +++ b/storage/connect/mysql-test/connect/t/mysql_exec.test @@ -13,6 +13,7 @@ eval CREATE TABLE t1 ( message VARCHAR(255) FLAG=2) ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test' OPTION_LIST='Execsrc=1,maxerr=2'; +--disable_ps2_protocol SELECT * FROM t1 WHERE command IN ('Warning','Note', 'drop table if exists t1', 'create table t1 (id int key auto_increment, msg varchar(32) not null)', @@ -22,6 +23,7 @@ SELECT * FROM t1 WHERE command IN ('Warning','Note', 'insert ignore into t1(id) values(NULL)', "update t1 set msg = 'Four' where id = 4", 'select * from t1'); +--enable_ps2_protocol --echo # --echo # Checking Using Procedure diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_found_rows.test b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_found_rows.test index 08acc357d3b..4d5bc7ea8e5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_found_rows.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_found_rows.test @@ -41,7 +41,9 @@ INSERT INTO diaries VALUES(6, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼") SELECT SQL_CALC_FOUND_ROWS * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE) ORDER BY day LIMIT 0,5; +--disable_ps2_protocol SELECT FOUND_ROWS(); +--enable_ps2_protocol DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_multithread.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_multithread.test index 4857286ac98..6078e908c7f 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_multithread.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_multithread.test @@ -43,7 +43,9 @@ CONNECTION default; enable_query_log; SHOW STATUS LIKE 'mroonga_count_skip'; +--disable_ps2_protocol SELECT COUNT(*) FROM diaries WHERE MATCH(title) AGAINST("mroonga" IN BOOLEAN MODE); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_single_thread.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_single_thread.test index d0116e7f1c5..c699c20e565 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_single_thread.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_single_thread.test @@ -32,7 +32,9 @@ INSERT INTO diaries VALUES("It's funny."); INSERT INTO diaries VALUES("Happy birthday!"); SHOW STATUS LIKE 'mroonga_count_skip'; +--disable_ps2_protocol SELECT COUNT(*) FROM diaries WHERE MATCH(title) AGAINST("mroonga" IN BOOLEAN MODE); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_disabled.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_disabled.test index d84112b4952..c911694c1ba 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_disabled.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_disabled.test @@ -38,8 +38,10 @@ INSERT INTO diaries VALUES(5, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Šæ—¥ã¾ã§ã¿ãŸ SET mroonga_enable_optimization=FALSE; +--disable_ps2_protocol SELECT COUNT(*) FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_and.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_and.test index 691497be13e..4881ae43f46 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_and.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_and.test @@ -35,7 +35,9 @@ INSERT INTO users (id, age) VALUES (2, 29); INSERT INTO users (id, age) VALUES (2, 29); INSERT INTO users (id, age) VALUES (3, 29); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id = 2 AND age = 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_between.test index 76675fdeb76..34c8bd0ae51 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_between.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (32),(33),(34),(35),(36),(37); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age BETWEEN 28 AND 30; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_equal.test index b422e06e5fd..dedf4543d76 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_equal.test @@ -33,7 +33,9 @@ INSERT INTO users (age) VALUES (29); INSERT INTO users (age) VALUES (29); INSERT INTO users (age) VALUES (29); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age = 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_boolean_mode.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_boolean_mode.test index b59ca7f552f..b99e9b7a3fb 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_boolean_mode.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_boolean_mode.test @@ -33,8 +33,10 @@ INSERT INTO memos (content) VALUES ('Mroonga is good.'); INSERT INTO memos (content) VALUES ('Mroonga is very good.'); INSERT INTO memos (content) VALUES ('Mroonga uses Groonga.'); +--disable_ps2_protocol SELECT COUNT(*) FROM memos WHERE MATCH(content) AGAINST('+Groonga' IN BOOLEAN MODE); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_natural_language_mode.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_natural_language_mode.test index c8de7b95cbc..e4cba0d2c43 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_natural_language_mode.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_natural_language_mode.test @@ -33,8 +33,10 @@ INSERT INTO memos (content) VALUES ('Mroonga is good.'); INSERT INTO memos (content) VALUES ('Mroonga is very good.'); INSERT INTO memos (content) VALUES ('Mroonga uses Groonga.'); +--disable_ps2_protocol SELECT COUNT(*) FROM memos WHERE MATCH(content) AGAINST('Groonga'); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater.test index fb5c336cd4c..904bf0c534d 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (1),(2),(3),(4),(5),(6); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age > 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater_equal.test index c897d8d88de..40571d7c234 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater_equal.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (1),(2),(3),(4),(5),(6); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age >= 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less.test index f03156d545b..ddfee173ccf 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (32),(33),(34),(35),(36),(37); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age < 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less_equal.test index 20863705bf4..0c5af3cdd52 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less_equal.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (32),(33),(34),(35),(36),(37); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age <= 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_not_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_not_equal.test index 3948d218a69..f75c8b4e4fd 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_not_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_not_equal.test @@ -33,7 +33,9 @@ INSERT INTO users (age) VALUES (29); INSERT INTO users (age) VALUES (29); INSERT INTO users (age) VALUES (29); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age <> 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_multiple_conditions.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_multiple_conditions.test index 917d6a1b4d6..07387cea956 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_multiple_conditions.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_multiple_conditions.test @@ -32,7 +32,9 @@ INSERT INTO users (id, age) VALUES (1, 29); INSERT INTO users (id, age) VALUES (2, 29); INSERT INTO users (id, age) VALUES (3, 29); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id = 3 AND age = 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_between.test index 25d6c734fe1..1aef072cb1b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_between.test @@ -33,7 +33,9 @@ INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); INSERT INTO users (id) VALUES (32),(33),(34),(35),(36),(37); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id BETWEEN 2 AND 4; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_equal.test index c0db5729425..24fe09a0402 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_equal.test @@ -32,7 +32,9 @@ INSERT INTO users (id) VALUES (3); INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id = 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater.test index f91cf19310f..be77d4c8bf6 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater.test @@ -33,7 +33,10 @@ INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); INSERT INTO users (id) VALUES (-1),(-2),(-3),(-4); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id > 3; +--enable_ps2_protocol + SHOW STATUS LIKE 'mroonga_count_skip'; DROP TABLE users; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater_equal.test index dd374012257..f82a322a623 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater_equal.test @@ -33,7 +33,9 @@ INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); INSERT INTO users (id) VALUES (-1),(-2),(-3),(-4); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id >= 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less.test index 529dfde678e..741d1bca68d 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less.test @@ -32,7 +32,9 @@ INSERT INTO users (id) VALUES (3); INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id < 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less_equal.test index d2a863ae43b..248ace5678e 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less_equal.test @@ -32,7 +32,9 @@ INSERT INTO users (id) VALUES (3); INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id <= 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_not_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_not_equal.test index 7e8c3180ccf..277c4afacc5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_not_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_not_equal.test @@ -32,7 +32,9 @@ INSERT INTO users (id) VALUES (3); INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id <> 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_disabled.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_disabled.test index c0dab28363b..79fb9ddf3f5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_disabled.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_disabled.test @@ -45,10 +45,12 @@ INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼") SET mroonga_enable_optimization=FALSE; +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND month = 11 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_multiple_match_againsts.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_multiple_match_againsts.test index ce1f63604e7..6de18c57547 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_multiple_match_againsts.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_multiple_match_againsts.test @@ -44,11 +44,13 @@ INSERT INTO memos VALUES(8, "title 1-a", "content b-1"); INSERT INTO memos VALUES(9, "title 2-b", "content b-2"); INSERT INTO memos VALUES(7, "title 2-c", "content b-3"); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(title) AGAINST("+1" IN BOOLEAN MODE) AND MATCH(content) AGAINST("+a" IN BOOLEAN MODE) ORDER BY id LIMIT 1,3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_no_limit.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_no_limit.test index 99abc0469fb..0e0fe6454ae 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_no_limit.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_no_limit.test @@ -43,9 +43,11 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY day; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_cp932.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_cp932.test index 19c2bc4009a..9da4c7e30d2 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_cp932.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_cp932.test @@ -34,10 +34,12 @@ INSERT INTO memos VALUES(2, " INSERT INTO memos VALUES(3, "¡“ú‚̓Tƒ{ƒeƒ“‚ð‚à‚ç‚Á‚½B"); INSERT INTO memos VALUES(1, "¡“ú‚Í“V‹C‚ª‚æ‚­‚Ă悩‚Á‚½B"); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(“à—e) AGAINST("¡“ú" IN BOOLEAN MODE) ORDER BY ޝ•ÊŽq LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between.test index 9ad4a6966b4..a6903197c52 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date BETWEEN "2011-11-11 12:23:31" AND "2011-11-11 12:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between_over.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between_over.test index 170e979613e..add0056dbee 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between_over.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between_over.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date BETWEEN "2011-11-11 12:23:31" AND "2011-11-11 12:23:43" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_equal.test index 32555b2a448..306a7bfb591 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_equal.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:34", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:34", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date = "2011-11-11 12:23:34" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than.test index 9c4c8754750..5a07338662e 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date > "2011-11-11 12:23:31" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than_or_equal.test index 375080ca70b..997035c419b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than_or_equal.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date >= "2011-11-11 12:23:31" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than.test index cdd4a2ba19d..d3395d3fe9a 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date < "2011-11-11 12:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than_or_equal.test index b0af56e0e19..37ec453d37d 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than_or_equal.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date <= "2011-11-11 12:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_duplicated_order_by_columns.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_duplicated_order_by_columns.test index e9d1ca2909e..7c8df7a9072 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_duplicated_order_by_columns.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_duplicated_order_by_columns.test @@ -33,10 +33,12 @@ CREATE TABLE ids ( INSERT INTO ids VALUES (1, 'first'); +--disable_ps2_protocol SELECT * FROM ids WHERE MATCH(text) AGAINST('+first' IN BOOLEAN MODE) ORDER BY id, id LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_name.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_name.test index 3a4f4faa2fb..36d2a40fb8b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_name.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_name.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(2, 'Mroonga', 'Mroonga is great!'); INSERT INTO memos VALUES(3, 'Mroonga', 'Mroonga is a MySQL storage engine.'); INSERT INTO memos VALUES(4, 'Mroonga', 'Mroonga is based on Groonga.'); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("+Groonga" IN BOOLEAN MODE) AND tag = 'Mroonga' ORDER BY id LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_value.test index b8126b3fc83..599d157d054 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_value.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_value.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(2, 'Mroonga', 'Mroonga is great!'); INSERT INTO memos VALUES(3, 'Mroonga', 'Mroonga is a MySQL storage engine.'); INSERT INTO memos VALUES(4, 'Mroonga', 'Mroonga is based on Groonga.'); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("+Groonga" IN BOOLEAN MODE) AND tag = 2 ORDER BY id LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_have_primary_key.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_have_primary_key.test index 64f5a605567..94097ec99a3 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_have_primary_key.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_have_primary_key.test @@ -41,7 +41,9 @@ INSERT INTO diaries VALUES(4, 2011, 11, 11, "帰りé“", "今日ã¯å¤©æ°—ãŒã‚ˆ INSERT INTO diaries VALUES(5, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(6, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE) ORDER BY day LIMIT 0,5; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between.test index 2fa838ea069..922d6edcfe0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between.test @@ -36,10 +36,12 @@ INSERT INTO memos VALUES(3, "I will do something today!"); INSERT INTO memos VALUES(4, "I don't want to anything today..."); INSERT INTO memos VALUES(5, "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND id BETWEEN 2 AND 4 ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between_over.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between_over.test index 5981c99f870..afd60af4b99 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between_over.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between_over.test @@ -36,10 +36,12 @@ INSERT INTO memos VALUES(3, "I will do something today!"); INSERT INTO memos VALUES(4, "I don't want to anything today..."); INSERT INTO memos VALUES(5, "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND id BETWEEN 2 AND 6 ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_equal.test index f2158a8224f..495dc1bb25c 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_equal.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND month = 11 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than.test index 856c9f71055..8c4167202b5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND day > 10 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than_or_equal.test index 6115bf68a79..04674ee8477 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than_or_equal.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND day >= 10 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than.test index f5001bdf980..7917405a04b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_Protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND day < 12 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than_or_equal.test index 790e8f14bd1..5da40dea8c4 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than_or_equal.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND day <= 12 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_primary_key.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_primary_key.test index 2aad7f0f7b5..69a13e226c9 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_primary_key.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_primary_key.test @@ -41,7 +41,9 @@ INSERT INTO diaries VALUES(4, 2011, 11, 11, "帰りé“", "今日ã¯å¤©æ°—ãŒã‚ˆ INSERT INTO diaries VALUES(5, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(6, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE) ORDER BY day LIMIT 0,5; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_where_clause.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_where_clause.test index 72889f96be5..2ccdc9db6e1 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_where_clause.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_where_clause.test @@ -30,7 +30,9 @@ insert into t1 values(5,50,"aa ii uu ii oo",null); show status like 'mroonga_fast_order_limit'; +--disable_ps2_protocol select *, match(c3) against("ii") from t1 order by c1 desc limit 2; +--enable_ps2_protocol show status like 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_asc.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_asc.test index c58d7353d0b..02037064163 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_asc.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_asc.test @@ -43,9 +43,11 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY day ASC LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_desc.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_desc.test index a979e88cb15..51dad46b05a 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_desc.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_desc.test @@ -43,9 +43,11 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY day DESC LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_id.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_id.test index 6bf3c6a8ceb..0bb6a7fc366 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_id.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_id.test @@ -44,10 +44,12 @@ INSERT INTO diaries VALUES(NULL, 5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã® INSERT INTO diaries VALUES(NULL, 6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(NULL, 7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY _id LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_match_against.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_match_against.test index bd86c6a2778..4f8d5cf6683 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_match_against.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_match_against.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY MATCH(content) AGAINST("今日" IN BOOLEAN MODE) LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_select_match_against.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_select_match_against.test index 5272037098c..0b0476d6882 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_select_match_against.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_select_match_against.test @@ -43,11 +43,13 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT *, MATCH(content) AGAINST("今日" IN BOOLEAN MODE) FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY MATCH(content) AGAINST("今日" IN BOOLEAN MODE) LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between.test index 23bb71032d3..56ba51a3f49 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time BETWEEN "1:23:31" AND "1:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between_over.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between_over.test index 2450f8a2d0c..dfb6d3161f9 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between_over.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between_over.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time BETWEEN "1:23:31" AND "1:23:43" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_equal.test index 46dc7cb5d48..e1c1111fb31 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_equal.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:34", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:34", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time = "1:23:34" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than.test index 62acda78dc5..fed76bc5486 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time > "1:23:31" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than_or_equal.test index ee706c5f3e0..32fadbeedc6 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than_or_equal.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time >= "1:23:31" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than.test index 01764064cc7..849726da6e6 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time < "1:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than_or_equal.test index 51423125bbf..ecfc743437d 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than_or_equal.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time <= "1:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_with_index.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_with_index.test index c3456c25827..5fc4342efe4 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_with_index.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_with_index.test @@ -44,10 +44,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND title = "hello" ORDER BY day LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_without_index.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_without_index.test index 2ce06201ee3..8536e559c29 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_without_index.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_without_index.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND title = "hello" ORDER BY day LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between.test index c07368fb4da..4d2b8a52cd9 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year BETWEEN "11" AND "2013" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between_over.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between_over.test index 599cc8fa097..5b253483fc0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between_over.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between_over.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year BETWEEN "11" AND "2015" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_equal.test index 35ce60663fb..bdb848dec06 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_equal.test @@ -43,10 +43,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year = "11" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than.test index 88bb6a27ffc..9bc429fe563 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year > "11" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id ASC LIMIT 2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than_or_equal.test index 64b9f831caf..76c01606949 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than_or_equal.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year >= "11" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id ASC LIMIT 2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than.test index 5f3f89fe77a..fb8130b5864 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year < "13" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than_or_equal.test index 5db8d96eadb..270dce85258 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than_or_equal.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year <= "13" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_enable_operations_recording_insert.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_enable_operations_recording_insert.test index 2a77a0133a5..970f04582f0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_enable_operations_recording_insert.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_enable_operations_recording_insert.test @@ -29,7 +29,9 @@ CREATE TABLE diaries ( SELECT mroonga_command('truncate mroonga_operations'); INSERT INTO diaries VALUES("Unlogged: Research for Mroonga"); +--disable_ps2_protocol SELECT mroonga_command('load --table mroonga_operations --values "[{}]"'); +--enable_ps2_protocol SELECT mroonga_command('select mroonga_operations --output_columns _id'); SET GLOBAL mroonga_enable_operations_recording = false; @@ -37,7 +39,9 @@ FLUSH TABLES; SELECT mroonga_command('truncate mroonga_operations'); INSERT INTO diaries VALUES("Logged: Research for Mroonga"); +--disable_ps2_protocol SELECT mroonga_command('load --table mroonga_operations --values "[{}]"'); +--enable_ps2_protocol SELECT mroonga_command('select mroonga_operations --output_columns _id'); DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_TODO_SPLIT_ME.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_TODO_SPLIT_ME.test index a47e73f5bfb..b00f1ea5169 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_TODO_SPLIT_ME.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_TODO_SPLIT_ME.test @@ -36,6 +36,7 @@ insert into t1 values(3,30,"ii si ii se ii"); insert into t1 values(4,40,"ta ti tu te to"); insert into t1 values(5,50,"aa ii uu ii oo"); +--disable_ps2_protocol select c3, match(c3) against("ii") from t1 where match(c3) against("ii") order by match(c3) against("ii") desc; show status like 'mroonga_fast_order_limit'; @@ -54,6 +55,7 @@ show status like 'mroonga_fast_order_limit'; select count(*) from t1 where match(c3) against("ii") limit 1; show status like 'mroonga_fast_order_limit'; +--enable_ps2_protocol drop table t1; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_direction.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_direction.test index 21180eb9593..8b579dc3ea0 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_direction.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_direction.test @@ -37,11 +37,13 @@ INSERT INTO memos VALUES(5, "Mroonga is great"); SHOW STATUS LIKE 'mroonga_fast_order_limit'; +--disable_ps2_protocol SELECT id, content FROM memos WHERE MATCH(content) AGAINST("+Mroonga" IN BOOLEAN MODE) ORDER BY id LIMIT 2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_where_clause.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_where_clause.test index d40328299b6..824c373bf95 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_where_clause.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_where_clause.test @@ -37,7 +37,9 @@ insert into t1 values(5,50,"aa ii uu ii oo"); show status like 'mroonga_fast_order_limit'; +--disable_ps2_protocol select *, match(c3) against("ii") from t1 order by c1 desc limit 1; +--enable_ps2_protocol show status like 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_order_by_primary_key.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_order_by_primary_key.test index 2513df8e734..4d2236b7c12 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_order_by_primary_key.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_order_by_primary_key.test @@ -37,11 +37,13 @@ INSERT INTO memos VALUES(5, "Groonga is fast"); SHOW STATUS LIKE 'mroonga_fast_order_limit'; +--disable_ps2_protocol SELECT id, content FROM memos WHERE MATCH(content) AGAINST("+Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/spider/mysql-test/spider/bg/t/basic_sql.test b/storage/spider/mysql-test/spider/bg/t/basic_sql.test index 5bb040047fc..6421198fa95 100644 --- a/storage/spider/mysql-test/spider/bg/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/bg/t/basic_sql.test @@ -889,7 +889,9 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT found_rows(); +--enable_ps2_protocol --echo --echo select high_priority diff --git a/storage/spider/mysql-test/spider/bg/t/direct_aggregate.test b/storage/spider/mysql-test/spider/bg/t/direct_aggregate.test index d65f4c5a624..ca96d4bd41f 100644 --- a/storage/spider/mysql-test/spider/bg/t/direct_aggregate.test +++ b/storage/spider/mysql-test/spider/bg/t/direct_aggregate.test @@ -126,6 +126,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -137,6 +138,7 @@ SELECT MAX(a) FROM ta_l WHERE a < 5; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/bg/t/direct_aggregate_part.test b/storage/spider/mysql-test/spider/bg/t/direct_aggregate_part.test index aebf210c745..d6d4623afc5 100644 --- a/storage/spider/mysql-test/spider/bg/t/direct_aggregate_part.test +++ b/storage/spider/mysql-test/spider/bg/t/direct_aggregate_part.test @@ -132,6 +132,7 @@ if ($HAVE_PARTITION) (4, 'd', '2003-11-30 05:01:03'), (5, 'c', '2001-12-31 23:59:59'); --enable_query_log + --disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l2; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -143,6 +144,7 @@ if ($HAVE_PARTITION) eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l2 WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; + --enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/bg/t/ha.test b/storage/spider/mysql-test/spider/bg/t/ha.test index c12930e4aed..00dcf776836 100644 --- a/storage/spider/mysql-test/spider/bg/t/ha.test +++ b/storage/spider/mysql-test/spider/bg/t/ha.test @@ -477,7 +477,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo active standby test @@ -841,7 +843,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bg/t/spider_fixes.test b/storage/spider/mysql-test/spider/bg/t/spider_fixes.test index 04e806fb612..cfca9a04e6b 100644 --- a/storage/spider/mysql-test/spider/bg/t/spider_fixes.test +++ b/storage/spider/mysql-test/spider/bg/t/spider_fixes.test @@ -152,8 +152,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -194,8 +196,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -917,7 +921,9 @@ SELECT a, b, c FROM ta_l_int ORDER BY a; --echo direct order limit --connection master_1 eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; +--disable_ps2_protocol SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; +--enable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; diff --git a/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test b/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test index 5dc4a88c842..de2dd90a500 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test +++ b/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test @@ -52,7 +52,9 @@ TRUNCATE TABLE mysql.general_log; CHECKSUM TABLE tbl_a EXTENDED; --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/cp932_column.test b/storage/spider/mysql-test/spider/bugfix/t/cp932_column.test index 8bd0d40cb60..119179702ec 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/cp932_column.test +++ b/storage/spider/mysql-test/spider/bugfix/t/cp932_column.test @@ -59,7 +59,9 @@ SET NAMES utf8; --connection child2_1 SET NAMES cp932; +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; SET NAMES utf8; diff --git a/storage/spider/mysql-test/spider/bugfix/t/delete_with_float_column.inc b/storage/spider/mysql-test/spider/bugfix/t/delete_with_float_column.inc index 349808824e7..a4def9b3dc8 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/delete_with_float_column.inc +++ b/storage/spider/mysql-test/spider/bugfix/t/delete_with_float_column.inc @@ -78,7 +78,9 @@ sync_with_master; SET SESSION sql_log_bin= 0; --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --connection slave1_1 diff --git a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_comma_pwd.test b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_comma_pwd.test index 0b7d51190a7..ede4144a524 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_comma_pwd.test +++ b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_comma_pwd.test @@ -19,7 +19,9 @@ eval CREATE TEMPORARY TABLE tmp_a ( ) $MASTER_1_ENGINE2; --enable_query_log +--disable_ps2_protocol eval $DIRECT_SQL_COMMAND; +--enable_ps2_protocol SELECT pkey FROM tmp_a; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test index 139af5c83c9..01fcc20bbe1 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test +++ b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test @@ -19,7 +19,9 @@ eval CREATE TEMPORARY TABLE tmp_a ( ) $MASTER_1_ENGINE2; --enable_query_log +--disable_ps2_protocol eval $DIRECT_SQL_COMMAND; +--enable_ps2_protocol SELECT pkey FROM tmp_a; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/group_by_order_by_limit.test b/storage/spider/mysql-test/spider/bugfix/t/group_by_order_by_limit.test index f1de6d5d25f..96c2ea6c849 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/group_by_order_by_limit.test +++ b/storage/spider/mysql-test/spider/bugfix/t/group_by_order_by_limit.test @@ -66,6 +66,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT skey, count(*) cnt FROM tbl_a GROUP BY skey ORDER BY cnt DESC, skey DESC LIMIT 5; @@ -76,6 +77,7 @@ eval $CHILD2_1_SELECT_TABLES; --connection child2_2 eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_19866.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_19866.test index 05b753ae8bb..0b8ce69cd73 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_19866.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_19866.test @@ -63,6 +63,7 @@ TRUNCATE TABLE mysql.general_log; TRUNCATE TABLE mysql.general_log; --connection master_1 +--disable_ps2_protocol SELECT * FROM tbl_a; SELECT * FROM tbl_a WHERE pkey = 1; SELECT * FROM tbl_a; @@ -76,6 +77,7 @@ eval $CHILD2_1_SELECT_TABLES; --connection child2_2 eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test index 3f522b4f6f5..3d1ccf3ce6a 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test @@ -57,6 +57,7 @@ INSERT INTO tbl_a (a, b, c) VALUES TRUNCATE TABLE mysql.general_log; --connection master_1 +--disable_ps2_protocol SELECT a, b, c FROM tbl_a PARTITION (pt2) WHERE b = 'c'; SELECT a, b, c FROM tbl_a PARTITION (pt1,pt2); SELECT a, b, c FROM tbl_a PARTITION (pt3) WHERE b = 'c'; @@ -65,9 +66,12 @@ SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c'; SELECT a, b, c FROM tbl_a PARTITION (pt1,pt3); SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c'; SELECT a, b, c FROM tbl_a PARTITION (pt2,pt3); +--enable_ps2_protocol --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol --disable_ps_protocol eval $CHILD2_1_SELECT_TABLES; --enable_ps_protocol diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test index 2d6ff5b4663..1cd1c689372 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test @@ -47,6 +47,7 @@ INSERT INTO tbl_a (val) VALUES (1); --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT id, 0 AS const, val FROM tbl_a; SELECT 1+2, id, 0 AS const, val, val+10, (SELECT tbl_a.val+1 FROM tbl_a) AS sq @@ -60,6 +61,7 @@ FROM tbl_a GROUP BY val; --connection child2_1 eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test index 16836cfce28..c1a9aaa4e9d 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test @@ -75,11 +75,15 @@ INSERT INTO tb_l (a, b, c) VALUES TRUNCATE TABLE mysql.general_log; --connection master_1 +--disable_ps2_protocol SELECT STRAIGHT_JOIN b.a, b.b FROM tb_l a, tbl_a b WHERE a.a = b.a; +--enable_ps2_protocol --connection child2_1 SET NAMES utf8; +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol --disable_ps_protocol eval $CHILD2_1_SELECT_TABLES; --enable_ps_protocol diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27172.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_27172.test index d544a0b400e..0b2e065702d 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_27172.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27172.test @@ -48,6 +48,7 @@ eval CREATE TABLE tbl_a ( KEY k (greeting) ) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"'; +--disable_ps2_protocol INSERT INTO tbl_a VALUES (1, "Hi!"),(2, "Aloha!"),(3, "Aloha!!!"); SELECT * FROM tbl_a WHERE greeting = "Aloha!" AND CASE greeting WHEN "Aloha!" THEN "one" ELSE 'more' END = "one"; # hack to disable GBH @@ -76,6 +77,7 @@ SELECT * FROM tbl_c WHERE greeting = "Aloha!" --connection child2_1 SELECT argument FROM mysql.general_log WHERE argument LIKE 'select %'; +--enable_ps2_protocol --connection child2_1 SET @@global.general_log = @general_log_backup; diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test index 235edc10d12..3fd9e623887 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test @@ -73,6 +73,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; @@ -135,6 +136,7 @@ eval $CHILD2_1_SELECT_TABLES; --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test index 01fa0cb5128..940fa61c598 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test @@ -73,6 +73,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; @@ -135,6 +136,7 @@ eval $CHILD2_1_SELECT_TABLES; --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test index 3ea8138e755..e9270a2ee93 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test @@ -73,6 +73,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; @@ -135,6 +136,7 @@ eval $CHILD2_1_SELECT_TABLES; --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test index bc926b0a296..ad042aadfed 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test @@ -74,6 +74,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; @@ -136,6 +137,7 @@ eval $CHILD2_1_SELECT_TABLES; --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_insert.test b/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_insert.test index 2beb9d9d7e4..d4c0db1e7cc 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_insert.test +++ b/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_insert.test @@ -56,7 +56,9 @@ exec $MYSQL -v -v -u root -h localhost -P $MASTER_1_MYPORT -S $MASTER_1_MYSOCK - --enable_query_log --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; TRUNCATE TABLE mysql.general_log; @@ -67,7 +69,9 @@ exec $MYSQL -v -v -u root -h localhost -P $MASTER_1_MYPORT -S $MASTER_1_MYSOCK - --enable_query_log --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; TRUNCATE TABLE mysql.general_log; @@ -78,7 +82,9 @@ exec $MYSQL -v -v -u root -h localhost -P $MASTER_1_MYPORT -S $MASTER_1_MYSOCK - --enable_query_log --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_update.test b/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_update.test index 50d9f345dfb..a5f63978a22 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_update.test +++ b/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_update.test @@ -58,7 +58,9 @@ exec $MYSQL -v -v -u root -h localhost --default-character-set=latin1 -P $MASTER --enable_query_log --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test b/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test index 1f540b2a15f..feb7df57f02 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test +++ b/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test @@ -52,7 +52,9 @@ TRUNCATE TABLE mysql.general_log; SELECT pkey FROM tbl_a WHERE NULL; --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/select_with_backquote.test b/storage/spider/mysql-test/spider/bugfix/t/select_with_backquote.test index 4c4d687cf89..b511b05bf01 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/select_with_backquote.test +++ b/storage/spider/mysql-test/spider/bugfix/t/select_with_backquote.test @@ -48,6 +48,7 @@ FLUSH TABLES; --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SET NAMES utf8; SELECT `pkey`, LEFT(`txt_utf8`, 4) FROM `auto_test_local`.`tbl_a` ORDER BY LEFT(`txt_utf8`, 4) LIMIT 3; @@ -56,6 +57,7 @@ SELECT `pkey`, LEFT(`txt_utf8`, 4) FROM `auto_test_local`.`tbl_a` ORDER BY LEFT( SET NAMES utf8; eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test b/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test index 652fbb1c11c..c586f670bd3 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test +++ b/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test @@ -70,7 +70,10 @@ sync_with_master; SET SESSION sql_log_bin= 0; --connection child2_1 + +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --connection slave1_1 diff --git a/storage/spider/mysql-test/spider/bugfix/t/sql_mode.inc b/storage/spider/mysql-test/spider/bugfix/t/sql_mode.inc index ae7c15c5081..90b8b749767 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/sql_mode.inc +++ b/storage/spider/mysql-test/spider/bugfix/t/sql_mode.inc @@ -44,12 +44,14 @@ INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT * FROM tbl_a ORDER BY pkey; --connection child2_1 eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test b/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test index 4f980140a31..d32af31674a 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test +++ b/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test @@ -45,6 +45,7 @@ INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT * FROM tbl_a ORDER BY pkey; @@ -53,6 +54,7 @@ SELECT * FROM tbl_a ORDER BY pkey; replace_regex /order by t0.`pkey`/order by `pkey`/; eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/xa_cmd.test b/storage/spider/mysql-test/spider/bugfix/t/xa_cmd.test index 9ae528071e3..1e831453e41 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/xa_cmd.test +++ b/storage/spider/mysql-test/spider/bugfix/t/xa_cmd.test @@ -49,7 +49,9 @@ XA PREPARE 'test'; XA COMMIT 'test'; --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/feature/t/checksum_table_parallel.inc b/storage/spider/mysql-test/spider/feature/t/checksum_table_parallel.inc index 13e5053d64c..83c3ffd6c54 100644 --- a/storage/spider/mysql-test/spider/feature/t/checksum_table_parallel.inc +++ b/storage/spider/mysql-test/spider/feature/t/checksum_table_parallel.inc @@ -60,6 +60,7 @@ INSERT INTO tbl_a (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29 --echo --echo select test 1 +--disable_ps2_protocol --connection child2_1 TRUNCATE TABLE mysql.general_log; LOCK TABLE tbl_a WRITE; @@ -88,6 +89,7 @@ eval $CHILD2_2_SELECT_TABLES; --connection master_1 reap; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/handler/t/basic_sql.test b/storage/spider/mysql-test/spider/handler/t/basic_sql.test index 5bb040047fc..6421198fa95 100644 --- a/storage/spider/mysql-test/spider/handler/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/handler/t/basic_sql.test @@ -889,7 +889,9 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT found_rows(); +--enable_ps2_protocol --echo --echo select high_priority diff --git a/storage/spider/mysql-test/spider/handler/t/direct_aggregate.test b/storage/spider/mysql-test/spider/handler/t/direct_aggregate.test index d65f4c5a624..ca96d4bd41f 100644 --- a/storage/spider/mysql-test/spider/handler/t/direct_aggregate.test +++ b/storage/spider/mysql-test/spider/handler/t/direct_aggregate.test @@ -126,6 +126,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -137,6 +138,7 @@ SELECT MAX(a) FROM ta_l WHERE a < 5; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/handler/t/direct_aggregate_part.test b/storage/spider/mysql-test/spider/handler/t/direct_aggregate_part.test index aebf210c745..d6d4623afc5 100644 --- a/storage/spider/mysql-test/spider/handler/t/direct_aggregate_part.test +++ b/storage/spider/mysql-test/spider/handler/t/direct_aggregate_part.test @@ -132,6 +132,7 @@ if ($HAVE_PARTITION) (4, 'd', '2003-11-30 05:01:03'), (5, 'c', '2001-12-31 23:59:59'); --enable_query_log + --disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l2; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -143,6 +144,7 @@ if ($HAVE_PARTITION) eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l2 WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; + --enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/handler/t/ha.test b/storage/spider/mysql-test/spider/handler/t/ha.test index c12930e4aed..00dcf776836 100644 --- a/storage/spider/mysql-test/spider/handler/t/ha.test +++ b/storage/spider/mysql-test/spider/handler/t/ha.test @@ -477,7 +477,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo active standby test @@ -841,7 +843,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/handler/t/spider_fixes.test b/storage/spider/mysql-test/spider/handler/t/spider_fixes.test index 04e806fb612..8c49c74f720 100644 --- a/storage/spider/mysql-test/spider/handler/t/spider_fixes.test +++ b/storage/spider/mysql-test/spider/handler/t/spider_fixes.test @@ -152,8 +152,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -194,8 +196,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -916,10 +920,11 @@ SELECT a, b, c FROM ta_l_int ORDER BY a; --echo 2.25 --echo direct order limit --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; - +--enable_ps2_protocol --echo --echo 2.26 diff --git a/storage/spider/mysql-test/spider/oracle/t/basic_sql.test b/storage/spider/mysql-test/spider/oracle/t/basic_sql.test index 5bb040047fc..6421198fa95 100644 --- a/storage/spider/mysql-test/spider/oracle/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/oracle/t/basic_sql.test @@ -889,7 +889,9 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT found_rows(); +--enable_ps2_protocol --echo --echo select high_priority diff --git a/storage/spider/mysql-test/spider/oracle/t/direct_aggregate.test b/storage/spider/mysql-test/spider/oracle/t/direct_aggregate.test index d65f4c5a624..ca96d4bd41f 100644 --- a/storage/spider/mysql-test/spider/oracle/t/direct_aggregate.test +++ b/storage/spider/mysql-test/spider/oracle/t/direct_aggregate.test @@ -126,6 +126,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -137,6 +138,7 @@ SELECT MAX(a) FROM ta_l WHERE a < 5; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/oracle/t/direct_aggregate_part.test b/storage/spider/mysql-test/spider/oracle/t/direct_aggregate_part.test index aebf210c745..d6d4623afc5 100644 --- a/storage/spider/mysql-test/spider/oracle/t/direct_aggregate_part.test +++ b/storage/spider/mysql-test/spider/oracle/t/direct_aggregate_part.test @@ -132,6 +132,7 @@ if ($HAVE_PARTITION) (4, 'd', '2003-11-30 05:01:03'), (5, 'c', '2001-12-31 23:59:59'); --enable_query_log + --disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l2; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -143,6 +144,7 @@ if ($HAVE_PARTITION) eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l2 WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; + --enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/oracle/t/ha.test b/storage/spider/mysql-test/spider/oracle/t/ha.test index c12930e4aed..00dcf776836 100644 --- a/storage/spider/mysql-test/spider/oracle/t/ha.test +++ b/storage/spider/mysql-test/spider/oracle/t/ha.test @@ -477,7 +477,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo active standby test @@ -841,7 +843,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/oracle/t/spider_fixes.test b/storage/spider/mysql-test/spider/oracle/t/spider_fixes.test index 04e806fb612..cfca9a04e6b 100644 --- a/storage/spider/mysql-test/spider/oracle/t/spider_fixes.test +++ b/storage/spider/mysql-test/spider/oracle/t/spider_fixes.test @@ -152,8 +152,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -194,8 +196,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -917,7 +921,9 @@ SELECT a, b, c FROM ta_l_int ORDER BY a; --echo direct order limit --connection master_1 eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; +--disable_ps2_protocol SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; +--enable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; diff --git a/storage/spider/mysql-test/spider/oracle2/t/basic_sql.test b/storage/spider/mysql-test/spider/oracle2/t/basic_sql.test index 5bb040047fc..6421198fa95 100644 --- a/storage/spider/mysql-test/spider/oracle2/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/oracle2/t/basic_sql.test @@ -889,7 +889,9 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT found_rows(); +--enable_ps2_protocol --echo --echo select high_priority diff --git a/storage/spider/mysql-test/spider/oracle2/t/direct_aggregate.test b/storage/spider/mysql-test/spider/oracle2/t/direct_aggregate.test index d65f4c5a624..ca96d4bd41f 100644 --- a/storage/spider/mysql-test/spider/oracle2/t/direct_aggregate.test +++ b/storage/spider/mysql-test/spider/oracle2/t/direct_aggregate.test @@ -126,6 +126,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -137,6 +138,7 @@ SELECT MAX(a) FROM ta_l WHERE a < 5; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/oracle2/t/direct_aggregate_part.test b/storage/spider/mysql-test/spider/oracle2/t/direct_aggregate_part.test index aebf210c745..d6d4623afc5 100644 --- a/storage/spider/mysql-test/spider/oracle2/t/direct_aggregate_part.test +++ b/storage/spider/mysql-test/spider/oracle2/t/direct_aggregate_part.test @@ -132,6 +132,7 @@ if ($HAVE_PARTITION) (4, 'd', '2003-11-30 05:01:03'), (5, 'c', '2001-12-31 23:59:59'); --enable_query_log + --disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l2; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -143,6 +144,7 @@ if ($HAVE_PARTITION) eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l2 WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; + --enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/oracle2/t/ha.test b/storage/spider/mysql-test/spider/oracle2/t/ha.test index c12930e4aed..00dcf776836 100644 --- a/storage/spider/mysql-test/spider/oracle2/t/ha.test +++ b/storage/spider/mysql-test/spider/oracle2/t/ha.test @@ -477,7 +477,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo active standby test @@ -841,7 +843,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/oracle2/t/spider_fixes.test b/storage/spider/mysql-test/spider/oracle2/t/spider_fixes.test index 04e806fb612..cfca9a04e6b 100644 --- a/storage/spider/mysql-test/spider/oracle2/t/spider_fixes.test +++ b/storage/spider/mysql-test/spider/oracle2/t/spider_fixes.test @@ -152,8 +152,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -194,8 +196,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -917,7 +921,9 @@ SELECT a, b, c FROM ta_l_int ORDER BY a; --echo direct order limit --connection master_1 eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; +--disable_ps2_protocol SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; +--enable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; diff --git a/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_key.test b/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_key.test index 39b5b5535bb..ec4639ed666 100644 --- a/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_key.test +++ b/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_key.test @@ -61,7 +61,9 @@ INSERT INTO tbl_b (bkey,akey) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,4),(6,3),( TRUNCATE TABLE mysql.general_log; --connection master_1 +--disable_ps2_protocol SELECT a.val, a.akey FROM tbl_a a, tbl_b b WHERE a.akey = b.akey AND b.bkey = 5; +--enable_ps2_protocol --connection child2_1 --disable_ps_protocol diff --git a/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_pkey.test b/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_pkey.test index 652f7d15177..52d9b52ddb5 100644 --- a/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_pkey.test +++ b/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_pkey.test @@ -61,7 +61,9 @@ INSERT INTO tbl_b (bkey,akey) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,4),(6,3),( TRUNCATE TABLE mysql.general_log; --connection master_1 +--disable_ps2_protocol SELECT a.val, a.akey FROM tbl_a a, tbl_b b WHERE a.akey = b.akey AND b.bkey = 5; +--enable_ps2_protocol --connection child2_1 --disable_ps_protocol diff --git a/storage/spider/mysql-test/spider/regression/e1121/t/load_data.inc b/storage/spider/mysql-test/spider/regression/e1121/t/load_data.inc index 8c1aa4e651f..080ba735a32 100644 --- a/storage/spider/mysql-test/spider/regression/e1121/t/load_data.inc +++ b/storage/spider/mysql-test/spider/regression/e1121/t/load_data.inc @@ -41,7 +41,9 @@ eval CREATE TABLE tbl_a ( INSERT INTO tbl_a (pkey,val) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9); --disable_query_log --echo SELECT pkey,val INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' FROM tbl_a ORDER BY pkey; +--disable_ps2_protocol eval SELECT pkey,val INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' FROM tbl_a ORDER BY pkey; +--enable_ps2_protocol --enable_query_log eval $COMMAND_BEFORE_LOAD_DATA; @@ -54,12 +56,16 @@ TRUNCATE TABLE mysql.general_log; --connection master_1 --disable_query_log --echo LOAD DATA $OPTION_LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' $OPTION_WORD INTO TABLE tbl_a; +--disable_ps2_protocol eval LOAD DATA $OPTION_LOCAL INFILE '$MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' $OPTION_WORD INTO TABLE tbl_a; +--enable_ps2_protocol --enable_query_log --remove_file $MYSQLTEST_VARDIR/tmp/spider_outfile.tsv --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/regression/e112122/t/group_by_order_by_limit_ok.test b/storage/spider/mysql-test/spider/regression/e112122/t/group_by_order_by_limit_ok.test index 2a70098ed1b..868886a284e 100644 --- a/storage/spider/mysql-test/spider/regression/e112122/t/group_by_order_by_limit_ok.test +++ b/storage/spider/mysql-test/spider/regression/e112122/t/group_by_order_by_limit_ok.test @@ -66,6 +66,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT skey, count(*) cnt FROM tbl_a GROUP BY skey ORDER BY cnt DESC, skey DESC LIMIT 5; @@ -76,6 +77,7 @@ eval $CHILD2_1_SELECT_TABLES; --connection child2_2 eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/regression/e112122/t/load_data_part.inc b/storage/spider/mysql-test/spider/regression/e112122/t/load_data_part.inc index e66550f9a90..fd31047ab58 100644 --- a/storage/spider/mysql-test/spider/regression/e112122/t/load_data_part.inc +++ b/storage/spider/mysql-test/spider/regression/e112122/t/load_data_part.inc @@ -54,7 +54,9 @@ eval CREATE TABLE tbl_a ( INSERT INTO tbl_a (pkey,val) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9); --disable_query_log --echo SELECT pkey,val INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' FROM tbl_a ORDER BY pkey; +--disable_ps_protocol eval SELECT pkey,val INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' FROM tbl_a ORDER BY pkey; +--enable_ps2_protocol --enable_query_log eval $COMMAND_BEFORE_LOAD_DATA; @@ -70,10 +72,13 @@ TRUNCATE TABLE mysql.general_log; --connection master_1 --disable_query_log --echo LOAD DATA $OPTION_LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' $OPTION_WORD INTO TABLE tbl_a; +--disable_ps2_protocol eval LOAD DATA $OPTION_LOCAL INFILE '$MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' $OPTION_WORD INTO TABLE tbl_a; +--enable_ps2_protocol --enable_query_log --remove_file $MYSQLTEST_VARDIR/tmp/spider_outfile.tsv +--disable_ps2_protocol --connection child2_1 eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; @@ -81,6 +86,7 @@ eval $CHILD2_1_SELECT_TABLES; --connection child2_2 eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/auto_increment.test b/storage/spider/mysql-test/spider/t/auto_increment.test index 12d93ca3e72..c5f272f5c44 100644 --- a/storage/spider/mysql-test/spider/t/auto_increment.test +++ b/storage/spider/mysql-test/spider/t/auto_increment.test @@ -144,6 +144,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT * FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -164,6 +165,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/basic_sql.test b/storage/spider/mysql-test/spider/t/basic_sql.test index 1298b10f19a..ee77eacd885 100644 --- a/storage/spider/mysql-test/spider/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/t/basic_sql.test @@ -889,7 +889,9 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT found_rows(); +--enable_ps2_protocol --echo --echo select high_priority diff --git a/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test b/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test index d108fda7e41..e0fa7a84674 100644 --- a/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test +++ b/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test @@ -96,7 +96,9 @@ if ($USE_CHILD_GROUP2) --connection child2_1 if ($USE_GENERAL_LOG) { + --disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; + --enable_ps2_protocol } eval $CHILD2_1_SELECT_TABLES; if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/t/direct_aggregate.test b/storage/spider/mysql-test/spider/t/direct_aggregate.test index d65f4c5a624..ca96d4bd41f 100644 --- a/storage/spider/mysql-test/spider/t/direct_aggregate.test +++ b/storage/spider/mysql-test/spider/t/direct_aggregate.test @@ -126,6 +126,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -137,6 +138,7 @@ SELECT MAX(a) FROM ta_l WHERE a < 5; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/t/direct_aggregate_part.test b/storage/spider/mysql-test/spider/t/direct_aggregate_part.test index aebf210c745..d6d4623afc5 100644 --- a/storage/spider/mysql-test/spider/t/direct_aggregate_part.test +++ b/storage/spider/mysql-test/spider/t/direct_aggregate_part.test @@ -132,6 +132,7 @@ if ($HAVE_PARTITION) (4, 'd', '2003-11-30 05:01:03'), (5, 'c', '2001-12-31 23:59:59'); --enable_query_log + --disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l2; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -143,6 +144,7 @@ if ($HAVE_PARTITION) eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l2 WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; + --enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/t/direct_join.test b/storage/spider/mysql-test/spider/t/direct_join.test index 3f7c692d2c2..634b958f9f9 100644 --- a/storage/spider/mysql-test/spider/t/direct_join.test +++ b/storage/spider/mysql-test/spider/t/direct_join.test @@ -155,6 +155,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c FROM tbl_a a, tbl_b b, tbl_c c WHERE a.a = b.a and a.a = c.a ORDER BY a.b DESC LIMIT 1,2; if ($USE_CHILD_GROUP2) @@ -176,6 +177,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Test JOIN on a constant table. @@ -301,6 +303,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT count(0) FROM tbl_person tp INNER JOIN tbl_ncd_cm_person tncp ON tp.id = tncp.person_id WHERE 1 = 1 AND tp.hr_status != "99" AND tp.hr_status != "2" AND tp.region_code LIKE CONCAT(CONCAT('%', '51041110620301', '%')) AND tp.id = '24FC3F0A5119432BAE13DD65AABAA39C' AND tncp.diseaseKind_id = '52A0328740914BCE86ED10A4D2521816' AND tp.region = 510411; if ($USE_CHILD_GROUP2) { @@ -322,6 +325,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_join_using.test b/storage/spider/mysql-test/spider/t/direct_join_using.test index 819e56ff21c..3ecfb292c89 100644 --- a/storage/spider/mysql-test/spider/t/direct_join_using.test +++ b/storage/spider/mysql-test/spider/t/direct_join_using.test @@ -155,6 +155,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c FROM tbl_a a join tbl_b b using(a) join tbl_c c using(a) ORDER BY a.b DESC; if ($USE_CHILD_GROUP2) @@ -176,6 +177,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_left_join.test b/storage/spider/mysql-test/spider/t/direct_left_join.test index e09b6a12488..c9784b047ed 100644 --- a/storage/spider/mysql-test/spider/t/direct_left_join.test +++ b/storage/spider/mysql-test/spider/t/direct_left_join.test @@ -155,6 +155,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c FROM tbl_a a left join tbl_b b on a.a = b.a left join tbl_c c on a.a = c.a ORDER BY a.b DESC; if ($USE_CHILD_GROUP2) @@ -176,6 +177,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test index dc67a01b4b2..7c69d73d335 100644 --- a/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_d a left join tbl_c b on a.a = b.a left join tbl_b c on b.c = c.c left join tbl_a d on c.b = d.b ORDER BY a.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test index 9d5a990e0ba..dd407482713 100644 --- a/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a left join tbl_b b on a.a = b.a left join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test index 90e3666957d..3de0c310464 100644 --- a/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a left join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c left join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_right_join.test b/storage/spider/mysql-test/spider/t/direct_right_join.test index 0c0496651d6..d124f75a230 100644 --- a/storage/spider/mysql-test/spider/t/direct_right_join.test +++ b/storage/spider/mysql-test/spider/t/direct_right_join.test @@ -155,6 +155,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on a.a = c.a ORDER BY a.b DESC; if ($USE_CHILD_GROUP2) @@ -176,6 +177,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test index 3ab4a30ea84..cdb2d4e6e58 100644 --- a/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test index fefe255890d..cff40bfdeef 100644 --- a/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c left join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test index 48882d27939..cd677a4bb8d 100644 --- a/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a left join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/ha.test b/storage/spider/mysql-test/spider/t/ha.test index c12930e4aed..00dcf776836 100644 --- a/storage/spider/mysql-test/spider/t/ha.test +++ b/storage/spider/mysql-test/spider/t/ha.test @@ -477,7 +477,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo active standby test @@ -841,7 +843,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/partition_cond_push.test b/storage/spider/mysql-test/spider/t/partition_cond_push.test index 4bcfc2aa386..e47209ef220 100644 --- a/storage/spider/mysql-test/spider/t/partition_cond_push.test +++ b/storage/spider/mysql-test/spider/t/partition_cond_push.test @@ -154,6 +154,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT value FROM tbl_a WHERE value < 100; if ($USE_CHILD_GROUP2) { @@ -186,6 +187,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/partition_fulltext.test b/storage/spider/mysql-test/spider/t/partition_fulltext.test index cd9f9b05e9d..1b31fa05534 100644 --- a/storage/spider/mysql-test/spider/t/partition_fulltext.test +++ b/storage/spider/mysql-test/spider/t/partition_fulltext.test @@ -158,6 +158,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT pkey, words FROM tbl_a WHERE match(words) against('+ghi' in boolean mode); if ($USE_CHILD_GROUP2) { @@ -190,6 +191,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test b/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test index f4e155be5e2..753014d5da7 100644 --- a/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test +++ b/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test @@ -156,6 +156,7 @@ insert into tbl_a values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into tbl_b values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); --connection master_1 +--disable_ps2_protocol SELECT sum(a.value), count(b.value2) FROM tbl_a a, tbl_b b WHERE a.value = b.value2 AND a.value = 5; SELECT sum(a.value), count(b.value2) FROM tbl_a a, tbl_b b WHERE a.value = 5 and b.value2 = 5; if ($USE_CHILD_GROUP2) @@ -189,6 +190,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/partition_mrr.test b/storage/spider/mysql-test/spider/t/partition_mrr.test index 2816d65cadb..e2278855393 100644 --- a/storage/spider/mysql-test/spider/t/partition_mrr.test +++ b/storage/spider/mysql-test/spider/t/partition_mrr.test @@ -168,6 +168,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -203,6 +204,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/pushdown_not_like.test b/storage/spider/mysql-test/spider/t/pushdown_not_like.test index 95e4fa6eea8..b39bb7785f6 100644 --- a/storage/spider/mysql-test/spider/t/pushdown_not_like.test +++ b/storage/spider/mysql-test/spider/t/pushdown_not_like.test @@ -104,6 +104,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol select * from ta_l where b not like 'a%'; if ($USE_CHILD_GROUP2) { @@ -113,7 +114,7 @@ if ($USE_CHILD_GROUP2) SELECT argument FROM mysql.general_log WHERE argument LIKE '%select%'; } } - +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/quick_mode_0.test b/storage/spider/mysql-test/spider/t/quick_mode_0.test index 6945d97a049..070d9e40548 100644 --- a/storage/spider/mysql-test/spider/t/quick_mode_0.test +++ b/storage/spider/mysql-test/spider/t/quick_mode_0.test @@ -123,6 +123,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -151,6 +152,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; @@ -181,6 +183,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -209,6 +212,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; @@ -239,6 +243,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -267,6 +272,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/quick_mode_1.test b/storage/spider/mysql-test/spider/t/quick_mode_1.test index d382d5dbe95..a2c2bf87844 100644 --- a/storage/spider/mysql-test/spider/t/quick_mode_1.test +++ b/storage/spider/mysql-test/spider/t/quick_mode_1.test @@ -123,6 +123,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -151,6 +152,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; @@ -181,6 +183,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -209,6 +212,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; @@ -239,6 +243,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -267,6 +272,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/quick_mode_2.test b/storage/spider/mysql-test/spider/t/quick_mode_2.test index ebb889868a6..12a48a904a2 100644 --- a/storage/spider/mysql-test/spider/t/quick_mode_2.test +++ b/storage/spider/mysql-test/spider/t/quick_mode_2.test @@ -123,6 +123,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -151,6 +152,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; @@ -181,6 +183,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -209,6 +212,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; @@ -239,6 +243,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -267,6 +272,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/quick_mode_3.test b/storage/spider/mysql-test/spider/t/quick_mode_3.test index 5992284f301..65851a5bf3e 100644 --- a/storage/spider/mysql-test/spider/t/quick_mode_3.test +++ b/storage/spider/mysql-test/spider/t/quick_mode_3.test @@ -123,6 +123,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -151,6 +152,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; @@ -181,6 +183,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -209,6 +212,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; @@ -239,6 +243,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -267,6 +272,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/slave_trx_isolation.test b/storage/spider/mysql-test/spider/t/slave_trx_isolation.test index 507e5340779..6fc02e7157a 100644 --- a/storage/spider/mysql-test/spider/t/slave_trx_isolation.test +++ b/storage/spider/mysql-test/spider/t/slave_trx_isolation.test @@ -106,10 +106,12 @@ if ($USE_CHILD_GROUP2) --disable_result_log } --connection child2_1 + --disable_ps2_protocol if ($USE_GENERAL_LOG) { eval $CHILD2_1_SELECT_ARGUMENT1; } + --enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; if (!$OUTPUT_CHILD_GROUP2) { diff --git a/storage/spider/mysql-test/spider/t/spider_fixes.test b/storage/spider/mysql-test/spider/t/spider_fixes.test index 04e806fb612..cfca9a04e6b 100644 --- a/storage/spider/mysql-test/spider/t/spider_fixes.test +++ b/storage/spider/mysql-test/spider/t/spider_fixes.test @@ -152,8 +152,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -194,8 +196,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -917,7 +921,9 @@ SELECT a, b, c FROM ta_l_int ORDER BY a; --echo direct order limit --connection master_1 eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; +--disable_ps2_protocol SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; +--enable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; diff --git a/storage/spider/mysql-test/spider/t/timestamp.test b/storage/spider/mysql-test/spider/t/timestamp.test index 225851a9d13..47d637bb0c5 100644 --- a/storage/spider/mysql-test/spider/t/timestamp.test +++ b/storage/spider/mysql-test/spider/t/timestamp.test @@ -171,6 +171,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo DELETEs @@ -214,6 +216,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 DELETE FROM tbl_a WHERE col_ts='1970-01-01 01:00:01'; +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -234,6 +237,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -256,6 +260,7 @@ if ($USE_CHILD_GROUP2) SET @@timestamp=1; INSERT INTO tbl_a VALUES (1, now(), now()); SET @@timestamp=0; +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -276,6 +281,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo UPDATEs @@ -299,6 +305,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 UPDATE tbl_a SET col_ts=col_dt; +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -319,6 +326,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Lookups @@ -341,6 +349,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > '2018-01-01'; SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts < '2018-10-28 02:30:00'; SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE '2018-10-28 02:30:00' > col_ts; @@ -367,6 +376,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Drop the index on the timestamp column @@ -419,6 +429,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > '2018-01-01'; SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts < '2018-10-28 02:30:00'; SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE '2018-10-28 02:30:00' > col_ts; @@ -445,6 +456,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Test the TIMESTAMP function @@ -471,6 +483,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT * FROM tbl_f; SELECT TIMESTAMP(col_d, col_t) FROM tbl_f; SELECT TIMESTAMP('2018-06-25', col_t) FROM tbl_f; @@ -495,6 +508,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Restore Time Zone settings diff --git a/storage/spider/mysql-test/spider/t/udf_pushdown.inc b/storage/spider/mysql-test/spider/t/udf_pushdown.inc index 160e8af21b2..df9742a35b8 100644 --- a/storage/spider/mysql-test/spider/t/udf_pushdown.inc +++ b/storage/spider/mysql-test/spider/t/udf_pushdown.inc @@ -1,8 +1,10 @@ --echo --echo ##### test SELECTs ##### --connection master_1 +--disable_ps2_protocol SELECT * FROM ta_l WHERE id = plusone(1); SELECT * FROM ta_l WHERE id IN (plusone(1), plusone(2)) AND a = plusone(32); +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { diff --git a/storage/tokudb/mysql-test/rpl/extra/rpl_tests/rpl_parallel_load_tokudb.test b/storage/tokudb/mysql-test/rpl/extra/rpl_tests/rpl_parallel_load_tokudb.test index 2f97bd39cfb..f354d49190a 100644 --- a/storage/tokudb/mysql-test/rpl/extra/rpl_tests/rpl_parallel_load_tokudb.test +++ b/storage/tokudb/mysql-test/rpl/extra/rpl_tests/rpl_parallel_load_tokudb.test @@ -272,7 +272,9 @@ let $MYSQLD_DATADIR= `select @@datadir`; use test; let $benchmark_file= `select replace(concat("benchmark_",uuid(),".out"),"-","_")`; --replace_regex /benchmark_.*.out/benchmark.out/ +--disable_ps2_protocol eval select * from test1.benchmark into outfile '$benchmark_file'; +--enable_ps2_protocol select ts from test0.benchmark where state like 'master started load' into @m_0; select ts from test0.benchmark where state like 'master ends load' into @m_1; select ts from test0.benchmark where state like 'slave takes on load' into @s_m0; @@ -282,10 +284,11 @@ select ts from test0.benchmark where state like 'slave ends load' into @s_1; select ts from test0.benchmark where state like 'slave is processing load' into @s_0; let $delta_file= `select replace(concat("delta_",uuid(),".out"),"-","_")`; --replace_regex /delta_.*.out/delta.out/ +--disable_ps2_protocol eval select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s', time_to_sec(@s_m1) - time_to_sec(@s_m0) as 'delta_sm' into outfile '$delta_file'; - +--enable_ps2_protocol # # Consistency verification diff --git a/storage/tokudb/mysql-test/tokudb/t/ext_key_1_innodb.test b/storage/tokudb/mysql-test/tokudb/t/ext_key_1_innodb.test index 766d0c107db..535f887c929 100644 --- a/storage/tokudb/mysql-test/tokudb/t/ext_key_1_innodb.test +++ b/storage/tokudb/mysql-test/tokudb/t/ext_key_1_innodb.test @@ -9,6 +9,7 @@ create table t (id int not null, x int not null, y int not null, primary key(id) insert into t values (0,0,0),(1,1,1),(2,2,2),(3,2,3),(4,2,4); +--disable_ps2_protocol explain select x,id from t force index (x) where x=0 and id=0; flush status; select x,id from t force index (x) where x=0 and id=0; @@ -38,5 +39,6 @@ explain select x,id from t force index (x) where x=2 and id=0; flush status; select x,id from t force index (x) where x=2 and id=0; show status like 'handler_read%'; +--enable_ps2_protocol drop table t; diff --git a/storage/tokudb/mysql-test/tokudb/t/ext_key_1_tokudb.test b/storage/tokudb/mysql-test/tokudb/t/ext_key_1_tokudb.test index 254207ec9a1..e9c82405262 100644 --- a/storage/tokudb/mysql-test/tokudb/t/ext_key_1_tokudb.test +++ b/storage/tokudb/mysql-test/tokudb/t/ext_key_1_tokudb.test @@ -8,6 +8,7 @@ create table t (id int not null, x int not null, y int not null, primary key(id) insert into t values (0,0,0),(1,1,1),(2,2,2),(3,2,3),(4,2,4); +--disable_ps2_protocol explain select x,id from t force index (x) where x=0 and id=0; flush status; select x,id from t force index (x) where x=0 and id=0; @@ -37,5 +38,6 @@ explain select x,id from t force index (x) where x=2 and id=0; flush status; select x,id from t force index (x) where x=2 and id=0; show status like 'handler_read%'; +--enable_ps2_protocol drop table t; diff --git a/storage/tokudb/mysql-test/tokudb/t/ext_key_2_innodb.test b/storage/tokudb/mysql-test/tokudb/t/ext_key_2_innodb.test index 92c1c90861e..e5722dce563 100644 --- a/storage/tokudb/mysql-test/tokudb/t/ext_key_2_innodb.test +++ b/storage/tokudb/mysql-test/tokudb/t/ext_key_2_innodb.test @@ -9,6 +9,7 @@ create table t (a int not null, b int not null, c int not null, d int not null, insert into t values (0,0,0,0),(0,1,0,1); +--disable_ps2_protocol explain select c,a,b from t where c=0 and a=0 and b=1; flush status; select c,a,b from t where c=0 and a=0 and b=1; @@ -18,5 +19,6 @@ explain select c,a,b from t force index (c) where c=0 and a=0 and b=1; flush status; select c,a,b from t force index (c) where c=0 and a=0 and b=1; show status like 'handler_read%'; +--enable_ps2_protocol drop table t; diff --git a/storage/tokudb/mysql-test/tokudb/t/ext_key_2_tokudb.test b/storage/tokudb/mysql-test/tokudb/t/ext_key_2_tokudb.test index bb4b97bf011..d68a1bcf7f7 100644 --- a/storage/tokudb/mysql-test/tokudb/t/ext_key_2_tokudb.test +++ b/storage/tokudb/mysql-test/tokudb/t/ext_key_2_tokudb.test @@ -8,6 +8,7 @@ create table t (a int not null, b int not null, c int not null, d int not null, insert into t values (0,0,0,0),(0,1,0,1); +--disable_ps2_protocol explain select c,a,b from t where c=0 and a=0 and b=1; flush status; select c,a,b from t where c=0 and a=0 and b=1; @@ -17,5 +18,6 @@ explain select c,a,b from t force index (c) where c=0 and a=0 and b=1; flush status; select c,a,b from t force index (c) where c=0 and a=0 and b=1; show status like 'handler_read%'; +--enable_ps2_protocol drop table t; diff --git a/storage/tokudb/mysql-test/tokudb/t/savepoint-3.test b/storage/tokudb/mysql-test/tokudb/t/savepoint-3.test index 8fff8ab498d..92f13af6be5 100644 --- a/storage/tokudb/mysql-test/tokudb/t/savepoint-3.test +++ b/storage/tokudb/mysql-test/tokudb/t/savepoint-3.test @@ -148,10 +148,14 @@ commit| set autocommit= 1| # Let us test that savepoints work inside of functions # even in auto-commit mode +--disable_ps2_protocol select bug13825_3(0)| +--enable_ps2_protocol select * from t1| delete from t1| +--disable_ps2_protocol select bug13825_3(1)| +--enable_ps2_protocol select * from t1| delete from t1| # Curious case: rolling back to savepoint which is set by first diff --git a/storage/tokudb/mysql-test/tokudb/t/type_datetime.test b/storage/tokudb/mysql-test/tokudb/t/type_datetime.test index 1a6b2ed7142..13fa596e6bd 100644 --- a/storage/tokudb/mysql-test/tokudb/t/type_datetime.test +++ b/storage/tokudb/mysql-test/tokudb/t/type_datetime.test @@ -278,6 +278,7 @@ drop table t1; # Bug#28261: Wrong DATETIME comparison result when the GET_USER_VAR function # is involved. # +--disable_ps2_protocol create table t1(f1 date); insert into t1 values('01-01-01'),('02-02-02'),('01-01-01'),('02-02-02'); set @bug28261=''; @@ -285,6 +286,7 @@ select if(@bug28261 = f1, '', @bug28261:= f1) from t1; select if(@bug28261 = f1, '', @bug28261:= f1) from t1; select if(@bug28261 = f1, '', @bug28261:= f1) from t1; drop table t1; +--enable_ps2_protocol # # Bug#28778: Wrong result of BETWEEN when comparing a DATETIME field with an diff --git a/storage/tokudb/mysql-test/tokudb/t/type_newdecimal.test b/storage/tokudb/mysql-test/tokudb/t/type_newdecimal.test index 17916288e85..3d44a5b78f4 100644 --- a/storage/tokudb/mysql-test/tokudb/t/type_newdecimal.test +++ b/storage/tokudb/mysql-test/tokudb/t/type_newdecimal.test @@ -1212,7 +1212,9 @@ CREATE TABLE t1 (a int DEFAULT NULL, b int DEFAULT NULL); INSERT INTO t1 VALUES (3,30), (1,10), (2,10); SET @a= CAST(1 AS decimal); +--disable_ps2_protocol SELECT 1 FROM t1 GROUP BY @b := @a, @b; +--enable_ps2_protocol DROP TABLE t1; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/PS-3773.test b/storage/tokudb/mysql-test/tokudb_bugs/t/PS-3773.test index e9490e91c33..cd765576e90 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/PS-3773.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/PS-3773.test @@ -10,8 +10,10 @@ SET tokudb_auto_analyze=0; INSERT INTO t1 VALUES(0,0,0), (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5); SET GLOBAL debug_dbug = "+d,tokudb_fake_db_notfound_error_in_read_full_row"; +--disable_ps2_protocol --error ER_NOT_KEYFILE SELECT * FROM t1 WHERE b = 2; +--enable_ps2_protocol DROP TABLE t1; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/t/simple_icp.test b/storage/tokudb/mysql-test/tokudb_bugs/t/simple_icp.test index de9dd5824da..36bf0e2f28a 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/t/simple_icp.test +++ b/storage/tokudb/mysql-test/tokudb_bugs/t/simple_icp.test @@ -16,6 +16,7 @@ create table foo (a int, b int, c int, d int, e int, key(a,b,c)) engine=TokuDB; insert into foo (a,b,c) select * from a,b,c; +--disable_ps2_protocol flush status; show status like '%Handler_read_next%'; replace_column 9 NA; @@ -43,5 +44,6 @@ replace_column 9 NA; explain select * from foo where a > 19 and c=10; select * from foo where a > 19 and c=10; show status like '%Handler_read_next%'; +--enable_ps2_protocol drop table foo,a,b,c; From 4700f2ac70f8c79f2ac1968b6b59d18716f492bf Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Wed, 26 Jul 2023 15:52:12 +0530 Subject: [PATCH 134/171] MDEV-30796 Auto_increment values not updated after bulk insert operation - InnoDB fails to update the autoinc persistently after bulk insert operation. row_merge_bulk_t::write_to_index(): Update the autoinc value persistently --- .../innodb/r/insert_into_empty_notembedded.result | 14 ++++++++++++++ .../innodb/t/insert_into_empty_notembedded.test | 14 ++++++++++++++ storage/innobase/row/row0merge.cc | 2 ++ 3 files changed, 30 insertions(+) diff --git a/mysql-test/suite/innodb/r/insert_into_empty_notembedded.result b/mysql-test/suite/innodb/r/insert_into_empty_notembedded.result index 5305b2e7a85..789c17dfb20 100644 --- a/mysql-test/suite/innodb/r/insert_into_empty_notembedded.result +++ b/mysql-test/suite/innodb/r/insert_into_empty_notembedded.result @@ -28,3 +28,17 @@ DROP DATABASE db1; # # End of 10.6 tests # +# +# MDEV-30796 Auto_increment values not updated after bulk +# insert operation +# +CREATE TABLE t1(f1 INT NOT NULL AUTO_INCREMENT, +f2 INT NOT NULL, PRIMARY KEY(f1))ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 2), (25, 3), (2, 4); +# restart +INSERT INTO t1(f2) VALUES(5); +SELECT max(f1) FROM t1; +max(f1) +26 +DROP TABLE t1; +# End of 10.9 tests diff --git a/mysql-test/suite/innodb/t/insert_into_empty_notembedded.test b/mysql-test/suite/innodb/t/insert_into_empty_notembedded.test index 267501133ea..0caeea59aae 100644 --- a/mysql-test/suite/innodb/t/insert_into_empty_notembedded.test +++ b/mysql-test/suite/innodb/t/insert_into_empty_notembedded.test @@ -41,3 +41,17 @@ DROP DATABASE db1; --echo # --echo # End of 10.6 tests --echo # + +--echo # +--echo # MDEV-30796 Auto_increment values not updated after bulk +--echo # insert operation +--echo # +CREATE TABLE t1(f1 INT NOT NULL AUTO_INCREMENT, + f2 INT NOT NULL, PRIMARY KEY(f1))ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 2), (25, 3), (2, 4); +--source include/restart_mysqld.inc +INSERT INTO t1(f2) VALUES(5); +SELECT max(f1) FROM t1; +DROP TABLE t1; + +--echo # End of 10.9 tests diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index 84befbaf311..32e61e65ba1 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -5336,6 +5336,8 @@ dberr_t row_merge_bulk_t::write_to_index(ulint index_no, trx_t *trx) func_exit: if (err != DB_SUCCESS) trx->error_info= index; + else if (index->is_primary() && table->persistent_autoinc) + btr_write_autoinc(index, table->autoinc); err= btr_bulk.finish(err); return err; } From 35533dc0b381ddbc665531d39ce3d3e9a8af2e88 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 27 Jul 2023 14:21:35 +0300 Subject: [PATCH 135/171] MDEV-29727 ALTER and CREATE with default partitioning differently react to SQL_MODE => unusable SHOW CREATE Use abort_on_warning dependent on strict mode over create new table like it is done for copy data and inplace alter. --- mysql-test/suite/plugins/r/audit_null_debug.result | 3 +++ mysql-test/suite/plugins/t/audit_null_debug.test | 3 +++ mysql-test/suite/versioning/r/partition.result | 10 ++++++++++ mysql-test/suite/versioning/t/partition.test | 11 +++++++++++ sql/sql_table.cc | 2 ++ 5 files changed, 29 insertions(+) diff --git a/mysql-test/suite/plugins/r/audit_null_debug.result b/mysql-test/suite/plugins/r/audit_null_debug.result index 727bd67aecf..69a1fa5a866 100644 --- a/mysql-test/suite/plugins/r/audit_null_debug.result +++ b/mysql-test/suite/plugins/r/audit_null_debug.result @@ -1,6 +1,9 @@ +set @old_sql_mode= @@sql_mode; +set @@sql_mode= ''; alter table mysql.plugin engine=myisam; Warnings: Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' +set @@sql_mode= @old_sql_mode; set @old_dbug=@@debug_dbug; call mtr.add_suppression("Index for table.*mysql.plugin.MYI"); call mtr.add_suppression("Index for table 'plugin' is corrupt; try to repair it"); diff --git a/mysql-test/suite/plugins/t/audit_null_debug.test b/mysql-test/suite/plugins/t/audit_null_debug.test index 52c50f13b74..ed1a59be033 100644 --- a/mysql-test/suite/plugins/t/audit_null_debug.test +++ b/mysql-test/suite/plugins/t/audit_null_debug.test @@ -5,7 +5,10 @@ if (!$ADT_NULL_SO) { skip No NULL_AUDIT plugin; } +set @old_sql_mode= @@sql_mode; +set @@sql_mode= ''; alter table mysql.plugin engine=myisam; +set @@sql_mode= @old_sql_mode; set @old_dbug=@@debug_dbug; call mtr.add_suppression("Index for table.*mysql.plugin.MYI"); diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index b8ad7693f51..1ceb9c443a2 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -1781,6 +1781,16 @@ t1 CREATE TABLE `t1` ( PARTITION `pn` CURRENT ENGINE = DEFAULT_ENGINE) drop tables t1; # +# MDEV-29727 ALTER and CREATE with default partitioning +# differently react to SQL_MODE => unusable SHOW CREATE +# +create table t (a int) with system versioning; +alter table t partition by system_time partitions 3; +ERROR HY000: Maybe missing parameters: no rotation condition for multiple HISTORY partitions. +drop table t; +create table t (a int) with system versioning partition by system_time partitions 3; +ERROR HY000: Maybe missing parameters: no rotation condition for multiple HISTORY partitions. +# # End of 10.5 tests # set global innodb_stats_persistent= @save_persistent; diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index 151dabdbdca..a4f487aae29 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -1548,6 +1548,17 @@ show create table t1; drop tables t1; +--echo # +--echo # MDEV-29727 ALTER and CREATE with default partitioning +--echo # differently react to SQL_MODE => unusable SHOW CREATE +--echo # +create table t (a int) with system versioning; +--error WARN_VERS_PARAMETERS +alter table t partition by system_time partitions 3; +drop table t; +--error WARN_VERS_PARAMETERS +create table t (a int) with system versioning partition by system_time partitions 3; + --echo # --echo # End of 10.5 tests --echo # diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 5adf4dfd4c1..387f086484b 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -10792,6 +10792,7 @@ do_continue:; else alter_info->flags|= ALTER_INDEX_ORDER; create_info->alias= alter_ctx.table_name; + thd->abort_on_warning= !ignore && thd->is_strict_mode(); /* Partitioning: part_info is passed via thd->work_part_info */ @@ -10801,6 +10802,7 @@ do_continue:; thd->lex->create_info, create_info, alter_info, C_ALTER_TABLE_FRM_ONLY, NULL, &key_info, &key_count, &frm); + thd->abort_on_warning= false; reenable_binlog(thd); if (unlikely(error)) { From b70d5476b6ae7172244f356997ef1e94c664132e Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 27 Jul 2023 19:43:45 +0300 Subject: [PATCH 136/171] MDEV-31244 Assertion "not SELECT" in vers_set_hist_part() The assertion was to make sure we don't do vers_set_hist_part() for SELECT (or any non-DML). But actually we must do it if SELECT calls some function that does DML. Patch moves the assertion to non-routines only. --- .../suite/versioning/r/partition.result | 19 +++++++++++++++++++ mysql-test/suite/versioning/t/partition.test | 19 +++++++++++++++++++ sql/partition_info.cc | 3 --- sql/sql_base.cc | 2 ++ 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index 0266464c5d6..58497db555b 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -3387,4 +3387,23 @@ insert into t () values (),(),(),(),(),(); update t set a = 1; update t set a = 2 limit 0; drop table t; +# +# MDEV-31244 Assertion "not SELECT" in vers_set_hist_part() +# +create table t (a int) with system versioning partition by system_time; +create function f() returns int +begin +update t set a = 1; +return 1; +end $ +create procedure p() select f(); +call p(); +f() +1 +call p(); +f() +1 +drop procedure p; +drop function f; +drop table t; set global innodb_stats_persistent= @save_persistent; diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index e865ec3b9f6..d15be0959ec 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -2605,6 +2605,25 @@ update t set a = 2 limit 0; # cleanup drop table t; +--echo # +--echo # MDEV-31244 Assertion "not SELECT" in vers_set_hist_part() +--echo # +create table t (a int) with system versioning partition by system_time; +--delimiter $ +create function f() returns int +begin + update t set a = 1; + return 1; +end $ +--delimiter ; +create procedure p() select f(); +call p(); +call p(); +# cleanup +drop procedure p; +drop function f; +drop table t; + --disable_prepare_warnings set global innodb_stats_persistent= @save_persistent; --source suite/versioning/common_finish.inc diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 79cf7c41bf4..0d082a2b4f6 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -799,9 +799,6 @@ bool partition_info::has_unique_name(partition_element *element) */ bool partition_info::vers_set_hist_part(THD *thd, uint *create_count) { - DBUG_ASSERT(!thd->lex->last_table() || - !thd->lex->last_table()->vers_conditions.delete_history); - const bool auto_hist= create_count && vers_info->auto_hist; if (vers_info->limit) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 869860ed67a..2dbbe719c92 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -1749,6 +1749,8 @@ bool TABLE::vers_switch_partition(THD *thd, TABLE_LIST *table_list, } break; } + DBUG_ASSERT(!thd->lex->last_table() || + !thd->lex->last_table()->vers_conditions.delete_history); } if (table_list->partition_names) From 732d1ec3aef8000885d7faa908a2c448e1b21d17 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Thu, 27 Jul 2023 19:43:45 +0300 Subject: [PATCH 137/171] MDEV-29873 MSAN uninitialized value errors in bcmp / prep_alter_part_table upon re-partitioning by system time memcmp() tries to compare beyond the last member of interval because sizeof(Vers_part_info::interval) is 80. It is sizeof of variable, sizeof of type is 76. Now we compare interval_t struct C++ way. --- mysql-test/suite/versioning/r/partition.result | 7 +++++++ mysql-test/suite/versioning/t/partition.test | 9 +++++++++ sql/partition_info.h | 7 ++++++- sql/sql_partition.cc | 5 +---- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index 58497db555b..fd2804cbf38 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -3406,4 +3406,11 @@ f() drop procedure p; drop function f; drop table t; +# +# MDEV-29873 MSAN uninitialized value errors in bcmp / +# prep_alter_part_table upon re-partitioning by system time +# +create table t (a int) with system versioning partition by system_time interval 5 week; +alter table t partition by system_time interval 10 week; +drop table t; set global innodb_stats_persistent= @save_persistent; diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index d15be0959ec..3013353d23f 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -2624,6 +2624,15 @@ drop procedure p; drop function f; drop table t; +--echo # +--echo # MDEV-29873 MSAN uninitialized value errors in bcmp / +--echo # prep_alter_part_table upon re-partitioning by system time +--echo # +create table t (a int) with system versioning partition by system_time interval 5 week; +alter table t partition by system_time interval 10 week; +# cleanup +drop table t; + --disable_prepare_warnings set global innodb_stats_persistent= @save_persistent; --source suite/versioning/common_finish.inc diff --git a/sql/partition_info.h b/sql/partition_info.h index 833a231e6ce..3a8c3a37524 100644 --- a/sql/partition_info.h +++ b/sql/partition_info.h @@ -78,11 +78,16 @@ struct Vers_part_info : public Sql_alloc } return false; } - struct { + struct interval_t { my_time_t start; INTERVAL step; enum interval_type type; bool is_set() const { return type < INTERVAL_LAST; } + bool operator==(const interval_t &rhs) const + { + /* TODO: equivalent intervals like 1 hour and 60 mins should be considered equal */ + return start == rhs.start && type == rhs.type && !memcmp(&step, &rhs.step, sizeof(INTERVAL)); + } } interval; ulonglong limit; bool auto_hist; diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index ba9a370a068..8c0efb7d3d0 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6035,10 +6035,7 @@ the generated partition syntax in a correct manner. { if (part_info->vers_info->interval.is_set() && ( !tab_part_info->vers_info->interval.is_set() || - /* TODO: equivalent intervals like 1 hour and 60 mins should be considered equal */ - memcmp(&part_info->vers_info->interval, - &tab_part_info->vers_info->interval, - sizeof(Vers_part_info::interval)))) + part_info->vers_info->interval == tab_part_info->vers_info->interval)) { /* If interval is changed we can not do fast alter */ tab_part_info= tab_part_info->get_clone(thd); From f3bbf8666e8f59415926086b905263bc86a0e459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 28 Jul 2023 11:27:16 +0300 Subject: [PATCH 138/171] MDEV-31790 work-around: Add not_msan.inc --- mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test | 2 ++ mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test | 2 ++ mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test | 2 ++ mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test | 2 ++ mysql-test/suite/rpl/t/rpl_row_mixing_engines.test | 2 ++ mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test | 2 ++ 6 files changed, 12 insertions(+) diff --git a/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test index 1df53270b74..ddc7757fa6c 100644 --- a/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_mixed.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc let $engine_type=Innodb; diff --git a/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test index 1f2f8749a0c..d6b278ca13d 100644 --- a/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_mixed.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc --disable_query_log diff --git a/mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test index b4552c79349..0161a609738 100644 --- a/mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_row.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc --disable_query_log diff --git a/mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test index 23552515df7..9944370727e 100644 --- a/mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_statement.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc --disable_query_log diff --git a/mysql-test/suite/rpl/t/rpl_row_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_row_mixing_engines.test index c1a13cd9e52..5aa4f2c9925 100644 --- a/mysql-test/suite/rpl/t/rpl_row_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_row_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_row.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc let $engine_type=Innodb; diff --git a/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test index 9cb440b6599..e8b52885624 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_statement.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc let $engine_type=Innodb; From 0d175968d1181a0308ce6caccc2e4fbc972ca6c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 28 Jul 2023 12:36:45 +0300 Subject: [PATCH 139/171] MDEV-31354 SIGSEGV in log_sort_flush_list() in InnoDB crash recovery log_sort_flush_list(): Wait for any pending page writes to cease before sorting the buf_pool.flush_list. Starting with commit 22b62edaedddb1cabd5b855cdd39a5e90a5695a2 (MDEV-25113), it is possible that some buf_page_t::oldest_modification_ that we will be comparing in std::sort() will be updated from some value >2 to 1 while we are holding buf_pool.flush_list_mutex. To catch this type of trouble better in the future, we will clean garbage (pages that have been written out) from buf_pool.flush_list while constructing the array for sorting, and check with debug assertions that all blocks that we are copying from the array to the list will be dirty (requiring a writeback) while we sort and copy the array back to buf_pool.flush_list. This failure was observed by chance exactly once when running the test innodb.recovery_memory. It was never reproduced in the same form afterwards. Unrelated to this change, the test does occasionally reproduce a failure to start up InnoDB due to a corrupted page being read in recovery. The ticket MDEV-31791 was filed for that. Tested by: Matthias Leich --- storage/innobase/log/log0recv.cc | 40 ++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 293383935d4..884c92fceaf 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -3580,25 +3580,51 @@ inline fil_space_t *fil_system_t::find(const char *path) const /** Thread-safe function which sorts flush_list by oldest_modification */ static void log_sort_flush_list() { - mysql_mutex_lock(&buf_pool.flush_list_mutex); + /* Ensure that oldest_modification() cannot change during std::sort() */ + for (;;) + { + os_aio_wait_until_no_pending_writes(false); + mysql_mutex_lock(&buf_pool.flush_list_mutex); + if (buf_pool.flush_list_active()) + my_cond_wait(&buf_pool.done_flush_list, + &buf_pool.flush_list_mutex.m_mutex); + else if (!os_aio_pending_writes()) + break; + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + } const size_t size= UT_LIST_GET_LEN(buf_pool.flush_list); std::unique_ptr list(new buf_page_t *[size]); + /* Copy the dirty blocks from buf_pool.flush_list to an array for sorting. */ size_t idx= 0; - for (buf_page_t *p= UT_LIST_GET_FIRST(buf_pool.flush_list); p; - p= UT_LIST_GET_NEXT(list, p)) - list.get()[idx++]= p; + for (buf_page_t *p= UT_LIST_GET_FIRST(buf_pool.flush_list); p; ) + { + const lsn_t lsn{p->oldest_modification()}; + ut_ad(lsn > 2 || lsn == 1); + buf_page_t *n= UT_LIST_GET_NEXT(list, p); + if (lsn > 1) + list.get()[idx++]= p; + else + buf_pool.delete_from_flush_list(p); + p= n; + } - std::sort(list.get(), list.get() + size, + std::sort(list.get(), list.get() + idx, [](const buf_page_t *lhs, const buf_page_t *rhs) { - return rhs->oldest_modification() < lhs->oldest_modification(); + const lsn_t l{lhs->oldest_modification()}; + const lsn_t r{rhs->oldest_modification()}; + DBUG_ASSERT(l > 2); DBUG_ASSERT(r > 2); + return r < l; }); UT_LIST_INIT(buf_pool.flush_list, &buf_page_t::list); - for (size_t i= 0; i < size; i++) + for (size_t i= 0; i < idx; i++) + { UT_LIST_ADD_LAST(buf_pool.flush_list, list[i]); + DBUG_ASSERT(list[i]->oldest_modification() > 2); + } mysql_mutex_unlock(&buf_pool.flush_list_mutex); } From 7f9468795d7b5c224191c9640668adaad10dbbd3 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Fri, 28 Jul 2023 15:35:06 +0200 Subject: [PATCH 140/171] galera: two tests are returned to the disabled list --- mysql-test/suite/galera/disabled.def | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index f56e5421fd2..179c9edccc8 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -14,6 +14,8 @@ galera_as_slave_ctas : MDEV-28378 timeout galera_pc_recovery : MDEV-25199 cluster fails to start up galera_sst_encrypted : MDEV-29876 Galera test failure on galera_sst_encrypted galera_binlog_checksum : MDEV-29861 Galera test case hangs +galera_var_notify_ssl_ipv6 : MDEV-29861 Galera test case hangs +galera_var_notify_cmd: MDEV-29861 Galera test case hangs galera_var_node_address : MDEV-20485 Galera test failure MDEV-26575 : MDEV-29878 Galera test failure on MDEV-26575 galera_bf_abort_shutdown : MDEV-29918 Assertion failure on galera_bf_abort_shutdown From 055f2e308bf1dd4026df65093a1166526ac35d9b Mon Sep 17 00:00:00 2001 From: Monty Date: Fri, 28 Jul 2023 23:06:58 +0200 Subject: [PATCH 141/171] Fix of4cb0d43ac63761174a39cea892c176b9cfa6edfc after merge in 10.5 --- mysql-test/main/myisam.result | 3 --- mysql-test/main/repair.result | 3 --- mysql-test/suite/maria/maria-64bit.result | 6 ------ storage/maria/ma_check.c | 25 ++-------------------- storage/maria/ma_sort.c | 26 +++++++++++++++++++++-- storage/myisam/mi_check.c | 2 ++ storage/myisam/sort.c | 26 +++++++++++++++++++++-- 7 files changed, 52 insertions(+), 39 deletions(-) diff --git a/mysql-test/main/myisam.result b/mysql-test/main/myisam.result index 6eff563f82f..e1e1a18dac2 100644 --- a/mysql-test/main/myisam.result +++ b/mysql-test/main/myisam.result @@ -2556,9 +2556,6 @@ INSERT INTO t1 VALUES ('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'), ('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'), ('0'),('0'),('0'),('0'),('0'),('0'),('0'); -Warnings: -Error 1034 myisam_sort_buffer_size is too small. X -Warning 1034 Number of rows changed from 0 to 157 SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size; INSERT INTO t1 VALUES('1'); SELECT * FROM t1, t1 AS a1 WHERE t1.a=1 AND a1.a=1; diff --git a/mysql-test/main/repair.result b/mysql-test/main/repair.result index 899ca1e1a32..d850afe34a0 100644 --- a/mysql-test/main/repair.result +++ b/mysql-test/main/repair.result @@ -77,9 +77,6 @@ INSERT INTO t1 VALUES ('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'), ('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'), ('0'),('0'),('0'),('0'),('0'),('0'),('0'); -Warnings: -Error 1034 myisam_sort_buffer_size is too small. X -Warning 1034 Number of rows changed from 0 to 157 SET myisam_repair_threads=2; REPAIR TABLE t1; Table Op Msg_type Msg_text diff --git a/mysql-test/suite/maria/maria-64bit.result b/mysql-test/suite/maria/maria-64bit.result index 77ba9727888..03c95ab296c 100644 --- a/mysql-test/suite/maria/maria-64bit.result +++ b/mysql-test/suite/maria/maria-64bit.result @@ -35,9 +35,6 @@ INSERT INTO t1 select seq,'0' from seq_1_to_65536; SET aria_sort_buffer_size=16384; REPAIR TABLE t1; Table Op Msg_type Msg_text -test.t1 repair error aria_sort_buffer_size is too small. X -test.t1 repair error Create index by sort failed -test.t1 repair info Retrying repair with keycache test.t1 repair status OK CHECK TABLE t1; Table Op Msg_type Msg_text @@ -45,9 +42,6 @@ test.t1 check status OK SET aria_repair_threads=2; REPAIR TABLE t1; Table Op Msg_type Msg_text -test.t1 repair error aria_sort_buffer_size is too small. X -test.t1 repair error Create index by sort failed -test.t1 repair info Retrying repair with keycache test.t1 repair status OK CHECK TABLE t1; Table Op Msg_type Msg_text diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c index 3c5ad75f070..ffa178b37fa 100644 --- a/storage/maria/ma_check.c +++ b/storage/maria/ma_check.c @@ -2483,9 +2483,8 @@ static int initialize_variables_for_repair(HA_CHECK *param, tmp= (size_t) MY_MIN(sort_info->filelength, (my_off_t) (SIZE_T_MAX/10/threads)); tmp= MY_MAX(tmp * 8 * threads, (size_t) 65536); /* Some margin */ - param->sort_buffer_length= MY_MIN(param->orig_sort_buffer_length, - tmp); - set_if_smaller(param->sort_buffer_length, tmp); + param->sort_buffer_length= MY_MIN(param->orig_sort_buffer_length, tmp); + set_if_bigger(param->sort_buffer_length, MARIA_MIN_SORT_MEMORY); /* Protect against too big sort buffer length */ #if SIZEOF_SIZE_T >= 8 set_if_smaller(param->sort_buffer_length, 16LL*1024LL*1024LL*1024LL); @@ -3985,16 +3984,6 @@ int maria_repair_by_sort(HA_CHECK *param, register MARIA_HA *info, { sort_param.key_read= sort_key_read; sort_param.key_write= sort_key_write; - - /* - Limit usage of sort memory - We assume we don't need more memory than data file length * 2 - (There is a pointer overhead for each key, but this is hard to - estimae as we cannot be sure how many records we have in file to - be repaired). - */ - set_if_smaller(param->sort_buffer_length, sort_info.filelength*2); - set_if_bigger(param->sort_buffer_length, MARIA_MIN_SORT_MEMORY); } if (sort_info.new_info->s->data_file_type == BLOCK_RECORD) @@ -4597,16 +4586,6 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, DBUG_PRINT("io_cache_share", ("thread: %u read_cache: %p", i, &sort_param[i].read_cache)); - /* - Limit usage of sort memory - We assume we don't need more memory than data file length * 2 - (There is a pointer overhead for each key, but this is hard to - estimae as we cannot be sure how many records we have in file to - be repaired). - */ - set_if_smaller(param->sort_buffer_length, sort_info.filelength*2); - set_if_bigger(param->sort_buffer_length, MARIA_MIN_SORT_MEMORY); - /* two approaches: the same amount of memory for each thread or the memory for the same number of keys for each thread... diff --git a/storage/maria/ma_sort.c b/storage/maria/ma_sort.c index 095fdc814bf..3e56fe51f41 100644 --- a/storage/maria/ma_sort.c +++ b/storage/maria/ma_sort.c @@ -177,8 +177,7 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, maxbuffer_org= maxbuffer; if (memavl < sizeof(BUFFPEK) * maxbuffer || (keys= (memavl-sizeof(BUFFPEK)*maxbuffer)/ - (sort_length+sizeof(char*))) <= 1 || - keys < maxbuffer) + (sort_length+sizeof(char*))) <= 1) { _ma_check_print_error(info->sort_info->param, "aria_sort_buffer_size is too small. Current aria_sort_buffer_size: %llu rows: %llu sort_length: %u", @@ -187,6 +186,15 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, my_errno= ENOMEM; goto err; } + if (keys < maxbuffer) + { + /* + There must be sufficient memory for at least one key per BUFFPEK, + otherwise repair by sort/parallel repair cannot operate. + */ + maxbuffer= (uint) keys; + break; + } } while ((maxbuffer= (uint) (records/(keys-1)+1)) != maxbuffer_org); } @@ -231,6 +239,20 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, == HA_POS_ERROR) goto err; /* purecov: tested */ + if (maxbuffer >= keys) + { + /* + merge_many_buff will crash if maxbuffer > keys as then we cannot store in memory + the keys for each buffer. + */ + keys= maxbuffer + 1; + if (!(sort_keys= ((uchar **) + my_realloc(PSI_INSTRUMENT_ME, sort_keys, + (size_t) (keys*(sort_length+sizeof(char*))+ + HA_FT_MAXBYTELEN), MYF(MY_FREE_ON_ERROR))))) + goto err; + } + info->sort_info->param->stage++; /* Merge stage */ if (maxbuffer == 0) diff --git a/storage/myisam/mi_check.c b/storage/myisam/mi_check.c index b4187ffc7dc..87e51816d81 100644 --- a/storage/myisam/mi_check.c +++ b/storage/myisam/mi_check.c @@ -2945,6 +2945,8 @@ int mi_repair_parallel(HA_CHECK *param, register MI_INFO *info, #else param->sort_buffer_length*sort_param[i].key_length/total_key_length; #endif + set_if_bigger(sort_param[i].sortbuff_size, MIN_SORT_BUFFER); + if ((error= mysql_thread_create(mi_key_thread_find_all_keys, &sort_param[i].thr, &thr_attr, thr_find_all_keys, diff --git a/storage/myisam/sort.c b/storage/myisam/sort.c index 6fe38a3fd04..f8bff2aad84 100644 --- a/storage/myisam/sort.c +++ b/storage/myisam/sort.c @@ -175,8 +175,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, maxbuffer_org= maxbuffer; if (memavl < sizeof(BUFFPEK) * maxbuffer || (keys= (memavl-sizeof(BUFFPEK)*maxbuffer)/ - (sort_length+sizeof(char*))) <= 1 || - keys < maxbuffer) + (sort_length+sizeof(char*))) <= 1) { mi_check_print_error(info->sort_info->param, "myisam_sort_buffer_size is too small. Current myisam_sort_buffer_size: %llu rows: %llu sort_length: %u", @@ -185,6 +184,15 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, my_errno= ENOMEM; goto err; } + if (keys < maxbuffer) + { + /* + There must be sufficient memory for at least one key per BUFFPEK, + otherwise repair by sort/parallel repair cannot operate. + */ + keys= maxbuffer; + break; + } } while ((maxbuffer= (uint) (records/(keys-1)+1)) != maxbuffer_org); } @@ -228,6 +236,20 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, &tempfile,&tempfile_for_exceptions)) == HA_POS_ERROR) goto err; /* purecov: tested */ + if (maxbuffer >= keys) + { + /* + merge_many_buff will crash if maxbuffer >= keys as then we cannot store in memory + the keys for each buffer. + */ + keys= maxbuffer + 1; + if (!(sort_keys= ((uchar **) + my_realloc(PSI_INSTRUMENT_ME, sort_keys, + (size_t) (keys*(sort_length+sizeof(char*))+ + HA_FT_MAXBYTELEN), MYF(MY_FREE_ON_ERROR))))) + goto err; + } + if (maxbuffer == 0) { if (!no_messages) From d632c85bb7246084804747a99017a67c6f995d91 Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Mon, 17 Jul 2023 15:06:50 +0200 Subject: [PATCH 142/171] MDEV-31723: Crash on SET SESSION gtid_seq_no= DEFAULT A simple "SET SESSION gtid_seq_no= DEFAULT" did not work, it would straight up crash the server! Also, explicitly setting gtid_seq_no to 0 gave an error in --gtid-strict-mode=1. Setting to DEFAULT or 0 should disable any prior setting of gtid_seq_no, so that the next transaction is allocated the next GTID in sequence, as normal. Reviewed-by: Monty Signed-off-by: Kristian Nielsen --- .../binlog_encryption/rpl_gtid_basic.result | 56 +++++++++++++++++++ mysql-test/suite/rpl/r/rpl_gtid_basic.result | 56 +++++++++++++++++++ mysql-test/suite/rpl/t/rpl_gtid_basic.test | 44 +++++++++++++++ .../suite/sys_vars/r/gtid_seq_no_basic.result | 1 + .../suite/sys_vars/t/gtid_seq_no_basic.test | 2 + sql/sys_vars.cc | 24 +++++--- 6 files changed, 176 insertions(+), 7 deletions(-) diff --git a/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result b/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result index 0e066fc0418..5771b0f405f 100644 --- a/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result +++ b/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result @@ -555,6 +555,62 @@ a 32 33 34 +*** MDEV-31723: Crash on SET SESSION gtid_seq_no= DEFAULT +connection server_1; +SET SESSION gtid_seq_no= 2000; +SELECT @@SESSION.gtid_seq_no; +@@SESSION.gtid_seq_no +2000 +INSERT INTO t1 VALUES (40); +SELECT @@SESSION.gtid_seq_no; +@@SESSION.gtid_seq_no +0 +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2000 +INSERT INTO t1 VALUES (41); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2001 +SET SESSION gtid_seq_no= 2010; +INSERT INTO t1 VALUES (42); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2010 +SET @old_strict= @@GLOBAL.gtid_strict_mode; +SET GLOBAL gtid_strict_mode= 1; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (43); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2011 +SET GLOBAL gtid_strict_mode= @old_strict; +INSERT INTO t1 VALUES (44); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2012 +SET SESSION gtid_seq_no= 2020; +SET SESSION gtid_seq_no= 2030; +INSERT INTO t1 VALUES (45); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2030 +SET SESSION gtid_seq_no= 2040; +SET SESSION gtid_seq_no= DEFAULT; +INSERT INTO t1 VALUES (46); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2031 +INSERT INTO t1 VALUES (47); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2032 +SET SESSION gtid_seq_no= 2050; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (48); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2033 connection server_1; DROP TABLE t1; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_gtid_basic.result b/mysql-test/suite/rpl/r/rpl_gtid_basic.result index 32df09789cc..aefb80a7c13 100644 --- a/mysql-test/suite/rpl/r/rpl_gtid_basic.result +++ b/mysql-test/suite/rpl/r/rpl_gtid_basic.result @@ -554,6 +554,62 @@ a 32 33 34 +*** MDEV-31723: Crash on SET SESSION gtid_seq_no= DEFAULT +connection server_1; +SET SESSION gtid_seq_no= 2000; +SELECT @@SESSION.gtid_seq_no; +@@SESSION.gtid_seq_no +2000 +INSERT INTO t1 VALUES (40); +SELECT @@SESSION.gtid_seq_no; +@@SESSION.gtid_seq_no +0 +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2000 +INSERT INTO t1 VALUES (41); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2001 +SET SESSION gtid_seq_no= 2010; +INSERT INTO t1 VALUES (42); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2010 +SET @old_strict= @@GLOBAL.gtid_strict_mode; +SET GLOBAL gtid_strict_mode= 1; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (43); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2011 +SET GLOBAL gtid_strict_mode= @old_strict; +INSERT INTO t1 VALUES (44); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2012 +SET SESSION gtid_seq_no= 2020; +SET SESSION gtid_seq_no= 2030; +INSERT INTO t1 VALUES (45); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2030 +SET SESSION gtid_seq_no= 2040; +SET SESSION gtid_seq_no= DEFAULT; +INSERT INTO t1 VALUES (46); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2031 +INSERT INTO t1 VALUES (47); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2032 +SET SESSION gtid_seq_no= 2050; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (48); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2033 connection server_1; DROP TABLE t1; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_gtid_basic.test b/mysql-test/suite/rpl/t/rpl_gtid_basic.test index 9cedebcfd38..70bd0087f7a 100644 --- a/mysql-test/suite/rpl/t/rpl_gtid_basic.test +++ b/mysql-test/suite/rpl/t/rpl_gtid_basic.test @@ -565,6 +565,50 @@ SELECT * FROM t1 WHERE a >= 30 ORDER BY a; SELECT * FROM t1 WHERE a >= 30 ORDER BY a; +--echo *** MDEV-31723: Crash on SET SESSION gtid_seq_no= DEFAULT +--connection server_1 + +# Setting gtid_seq_no forces the GTID logged, but only once. +SET SESSION gtid_seq_no= 2000; +SELECT @@SESSION.gtid_seq_no; +INSERT INTO t1 VALUES (40); +SELECT @@SESSION.gtid_seq_no; +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +INSERT INTO t1 VALUES (41); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; + +# Setting to 0 has no effect. +SET SESSION gtid_seq_no= 2010; +INSERT INTO t1 VALUES (42); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +SET @old_strict= @@GLOBAL.gtid_strict_mode; +SET GLOBAL gtid_strict_mode= 1; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (43); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +SET GLOBAL gtid_strict_mode= @old_strict; +INSERT INTO t1 VALUES (44); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; + +# Setting gtid_seq_no multiple times. +SET SESSION gtid_seq_no= 2020; +SET SESSION gtid_seq_no= 2030; +INSERT INTO t1 VALUES (45); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; + +# Setting to DEFAULT or 0 disables prior setting. +SET SESSION gtid_seq_no= 2040; +SET SESSION gtid_seq_no= DEFAULT; +INSERT INTO t1 VALUES (46); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +INSERT INTO t1 VALUES (47); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +SET SESSION gtid_seq_no= 2050; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (48); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; + + # Clean up. --connection server_1 DROP TABLE t1; diff --git a/mysql-test/suite/sys_vars/r/gtid_seq_no_basic.result b/mysql-test/suite/sys_vars/r/gtid_seq_no_basic.result index f0aa0d2ba97..855be9de503 100644 --- a/mysql-test/suite/sys_vars/r/gtid_seq_no_basic.result +++ b/mysql-test/suite/sys_vars/r/gtid_seq_no_basic.result @@ -8,6 +8,7 @@ SELECT @@session.gtid_seq_no; 20 SET GLOBAL gtid_seq_no= DEFAULT; ERROR HY000: Variable 'gtid_seq_no' is a SESSION variable and can't be used with SET GLOBAL +SET SESSION gtid_seq_no= DEFAULT; SET SESSION gtid_seq_no= -1; Warnings: Warning 1292 Truncated incorrect gtid_seq_no value: '-1' diff --git a/mysql-test/suite/sys_vars/t/gtid_seq_no_basic.test b/mysql-test/suite/sys_vars/t/gtid_seq_no_basic.test index db5768ac334..e93455337d6 100644 --- a/mysql-test/suite/sys_vars/t/gtid_seq_no_basic.test +++ b/mysql-test/suite/sys_vars/t/gtid_seq_no_basic.test @@ -9,5 +9,7 @@ SELECT @@session.gtid_seq_no; --error ER_LOCAL_VARIABLE SET GLOBAL gtid_seq_no= DEFAULT; +SET SESSION gtid_seq_no= DEFAULT; + SET SESSION gtid_seq_no= -1; SELECT @@session.gtid_seq_no; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 6cb2733feb0..47ffe467a8c 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -1698,6 +1698,13 @@ static Sys_var_uint Sys_gtid_domain_id( ON_CHECK(check_gtid_domain_id)); +/* + Check that setting gtid_seq_no isn't done inside a transaction, and (in + gtid_strict_mode) doesn't create an out-of-order GTID sequence. + + Setting gtid_seq_no to DEFAULT or 0 means we 'reset' it so that the value + doesn't affect the GTID of the next event group written to the binlog. +*/ static bool check_gtid_seq_no(sys_var *self, THD *thd, set_var *var) { uint32 domain_id, server_id; @@ -1710,13 +1717,16 @@ static bool check_gtid_seq_no(sys_var *self, THD *thd, set_var *var) ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_GTID_DOMAIN_ID_SEQ_NO))) return true; - domain_id= thd->variables.gtid_domain_id; - server_id= thd->variables.server_id; - seq_no= (uint64)var->value->val_uint(); - DBUG_EXECUTE_IF("ignore_set_gtid_seq_no_check", return 0;); - if (opt_gtid_strict_mode && opt_bin_log && - mysql_bin_log.check_strict_gtid_sequence(domain_id, server_id, seq_no)) - return true; + DBUG_EXECUTE_IF("ignore_set_gtid_seq_no_check", return false;); + if (var->value && opt_gtid_strict_mode && opt_bin_log) + { + domain_id= thd->variables.gtid_domain_id; + server_id= thd->variables.server_id; + seq_no= (uint64)var->value->val_uint(); + if (seq_no != 0 && + mysql_bin_log.check_strict_gtid_sequence(domain_id, server_id, seq_no)) + return true; + } return false; } From a4b9e9b95f4a6324f14e283c2422261d2f29d886 Mon Sep 17 00:00:00 2001 From: Kristian Nielsen Date: Mon, 24 Jul 2023 13:46:18 +0200 Subject: [PATCH 143/171] Fix rpl.rpl_rotate_logs to work with --repeat (It's not using include/rpl_init.inc, so it needs to reset the GTID position explicitly). Signed-off-by: Kristian Nielsen --- mysql-test/suite/rpl/r/rpl_rotate_logs.result | 1 + mysql-test/suite/rpl/t/rpl_rotate_logs.test | 3 +++ 2 files changed, 4 insertions(+) diff --git a/mysql-test/suite/rpl/r/rpl_rotate_logs.result b/mysql-test/suite/rpl/r/rpl_rotate_logs.result index 2518b207111..d720b0b865e 100644 --- a/mysql-test/suite/rpl/r/rpl_rotate_logs.result +++ b/mysql-test/suite/rpl/r/rpl_rotate_logs.result @@ -1,5 +1,6 @@ connect master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK; connect slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK; +SET GLOBAL gtid_slave_pos= ""; connection slave; CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT."); start slave; diff --git a/mysql-test/suite/rpl/t/rpl_rotate_logs.test b/mysql-test/suite/rpl/t/rpl_rotate_logs.test index 0d65a05bf50..4dd58931cd9 100644 --- a/mysql-test/suite/rpl/t/rpl_rotate_logs.test +++ b/mysql-test/suite/rpl/t/rpl_rotate_logs.test @@ -20,6 +20,9 @@ connect (master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK); connect (slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK); +# Reset the GTID position explicitly (since we're not using rpl_init.inc). +SET GLOBAL gtid_slave_pos= ""; + # Create empty file let $MYSQLD_SLAVE_DATADIR= `select @@datadir`; write_file $MYSQLD_SLAVE_DATADIR/master.info; From f182de2ec86a979ddd0fe15c92dbac02615095ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 31 Jul 2023 09:28:28 +0300 Subject: [PATCH 144/171] MDEV-30159 fixup: Plug a memory leak in the test --- tests/mysql_client_test.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 05190b20624..92f9ff87765 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -21428,6 +21428,7 @@ static void test_mdev_30159() result= mysql_list_fields(mysql, "v1", NULL); mytest(result); + mysql_free_result(result); rc= mysql_query(mysql, "drop view v1"); myquery(rc); From 941af1fa581a799e59ddc3afcae965852aeceb00 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Mon, 31 Jul 2023 16:42:23 +0530 Subject: [PATCH 145/171] MDEV-31803 InnoDB aborts during recovery when immediate_scrub_data_uncompressed is enabled Problem: ======== - InnoDB scans the complete redo log to ensure that there is no corruption and to find the end of the log. During this scan, InnoDB saves all the freed ranges, but it doesn't save recovered size. Later, InnoDB recovery applies partial redo logs and IO thread tries to flush the all freed ranges which was noted during previous complete scan of redo logs. Fix: ==== InnoDB should store the freed pages only when InnoDB stores the redo log records. --- storage/innobase/log/log0recv.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 8aba2981092..d19edcf15fd 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2747,7 +2747,8 @@ restart: case INIT_PAGE: last_offset= FIL_PAGE_TYPE; free_or_init_page: - store_freed_or_init_rec(id, (b & 0x70) == FREE_PAGE); + if (store) + store_freed_or_init_rec(id, (b & 0x70) == FREE_PAGE); if (UNIV_UNLIKELY(rlen != 0)) goto record_corrupted; break; From 69b118a346a0398b5ca095e49ac95e2447cc844b Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Mon, 31 Jul 2023 14:42:02 +0300 Subject: [PATCH 146/171] Revert "MDEV-30528 Assertion in dtype_get_at_most_n_mbchars" This reverts commit add0c01bae4cd2ed435755feb1240a5dbc1c85c1 Duplicates must be avoided in FTS_DOC_ID_INDEX --- .../suite/innodb_fts/r/innodb_fts_misc.result | 23 ------------------- .../suite/innodb_fts/t/innodb_fts_misc.test | 18 --------------- storage/innobase/row/row0merge.cc | 12 ++++------ 3 files changed, 4 insertions(+), 49 deletions(-) diff --git a/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result b/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result index d86d44f38de..2cc992be73a 100644 --- a/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result +++ b/mysql-test/suite/innodb_fts/r/innodb_fts_misc.result @@ -1393,26 +1393,3 @@ INSERT INTO t1 VALUES(repeat("this is the test case", 500)); ALTER TABLE t1 KEY_BLOCK_SIZE=4; ALTER TABLE t1 KEY_BLOCK_SIZE=0; DROP TABLE t1; -# -# MDEV-30528 Assertion in dtype_get_at_most_n_mbchars -# -create table t (f text) with system versioning character set utf8 engine=innodb; -insert into t (f) values -('mysql from tutorial dbms stands for database ...') , -('when to use mysql well after that you went through a ...'), -('where will optimizing mysql in what tutorial we will show ...'), -('1001 mysql tricks 1. never run mysqld as root. 2. ...'), -('mysql vs. yoursql in the following database comparison ...'), -('mysql security when configured properly, mysql ...'); -delete from t where f like 'mysql%'; -alter table t add fulltext (f); -select * from t where match(f) against ("use"); -f -when to use mysql well after that you went through a ... -select * from t where match(f) against ("run"); -f -1001 mysql tricks 1. never run mysqld as root. 2. ... -select * from t where match(f) against ("tutorial"); -f -where will optimizing mysql in what tutorial we will show ... -drop table t; diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test b/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test index bbc4f089001..8f4902fd2de 100644 --- a/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test +++ b/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test @@ -1341,21 +1341,3 @@ ALTER TABLE t1 KEY_BLOCK_SIZE=4; ALTER TABLE t1 KEY_BLOCK_SIZE=0; DROP TABLE t1; ---echo # ---echo # MDEV-30528 Assertion in dtype_get_at_most_n_mbchars ---echo # -create table t (f text) with system versioning character set utf8 engine=innodb; -insert into t (f) values - ('mysql from tutorial dbms stands for database ...') , - ('when to use mysql well after that you went through a ...'), - ('where will optimizing mysql in what tutorial we will show ...'), - ('1001 mysql tricks 1. never run mysqld as root. 2. ...'), - ('mysql vs. yoursql in the following database comparison ...'), - ('mysql security when configured properly, mysql ...'); -delete from t where f like 'mysql%'; -alter table t add fulltext (f); -select * from t where match(f) against ("use"); -select * from t where match(f) against ("run"); -select * from t where match(f) against ("tutorial"); -# cleanup -drop table t; diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index aa431886efe..f0aed489f22 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -502,8 +502,7 @@ row_merge_buf_add( VCOL_STORAGE vcol_storage; DBUG_ENTER("row_merge_buf_add"); - if (buf->n_tuples >= buf->max_tuples - || (history_fts && (buf->index->type & DICT_FTS))) { + if (buf->n_tuples >= buf->max_tuples) { error: n_row_added = 0; goto end; @@ -596,8 +595,7 @@ error: /* Tokenize and process data for FTS */ - if (index->type & DICT_FTS) { - ut_ad(!history_fts); + if (!history_fts && (index->type & DICT_FTS)) { fts_doc_item_t* doc_item; byte* value; void* ptr; @@ -1878,7 +1876,6 @@ row_merge_read_clustered_index( mach_write_to_8(new_sys_trx_start, trx->id); mach_write_to_8(new_sys_trx_end, TRX_ID_MAX); uint64_t n_rows = 0; - bool history_row = false; /* Scan the clustered index. */ for (;;) { @@ -1895,7 +1892,7 @@ row_merge_read_clustered_index( dtuple_t* row; row_ext_t* ext; page_cur_t* cur = btr_pcur_get_page_cur(&pcur); - bool history_fts = false; + bool history_row, history_fts = false; page_cur_move_to_next(cur); @@ -2530,8 +2527,7 @@ write_buffers: ut_ad(i == 0); break; } - } else if (!history_row - && dict_index_is_unique(buf->index)) { + } else if (dict_index_is_unique(buf->index)) { row_merge_dup_t dup = { buf->index, table, col_map, 0}; From 4da80a41f67839c68b72e5415e8f562ea42d1a01 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 31 Jul 2023 14:39:05 +0200 Subject: [PATCH 147/171] Fix double definition of CRYPTO_cleanup_all_ex_data --- mysys_ssl/openssl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/mysys_ssl/openssl.c b/mysys_ssl/openssl.c index 340ba34ba78..8adaeae4069 100644 --- a/mysys_ssl/openssl.c +++ b/mysys_ssl/openssl.c @@ -15,6 +15,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include +#include #include /* From 4dd38f9f39ca8ff7adfbdbfe8cd53d15244d2fc3 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 31 Jul 2023 20:36:19 +0200 Subject: [PATCH 148/171] MDEV-31800 Problem with open ranges on prefix blobs keys don't construct open ranges from prefix blob keys for < (less than) just as it's already done for > (greater than) because prefix KEY_PART doesn't create prefix Field for blobs (see open_table_from_share() near "Create a new field for the key part"), so stored_field_cmp_to_item() will compare the original field to the value not taking the prefix length into account. --- mysql-test/main/type_blob.result | 13 +++++++++++++ mysql-test/main/type_blob.test | 10 ++++++++++ sql/opt_range.cc | 19 +++++++++++++------ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/mysql-test/main/type_blob.result b/mysql-test/main/type_blob.result index 1318807542d..67186e10659 100644 --- a/mysql-test/main/type_blob.result +++ b/mysql-test/main/type_blob.result @@ -1140,5 +1140,18 @@ c d DROP TABLE t1, t2; SET @@sql_mode=@save_sql_mode; # +# MDEV-31800 Problem with open ranges on prefix blobs keys +# +create table t1 (d text not null, key a (d(6))) ; +insert into t1 values ('prefix 2' ), ('prefix 0' ); +select d from t1 where d >= 'prefix 1' and d < 'prefix 3'; +d +prefix 2 +alter table t1 drop index a; +select d from t1 where d >= 'prefix 1' and d < 'prefix 3'; +d +prefix 2 +drop table t1; +# # End of 10.4 test # diff --git a/mysql-test/main/type_blob.test b/mysql-test/main/type_blob.test index a9b044b5318..54102c7f004 100644 --- a/mysql-test/main/type_blob.test +++ b/mysql-test/main/type_blob.test @@ -756,6 +756,16 @@ select * from t2; DROP TABLE t1, t2; SET @@sql_mode=@save_sql_mode; +--echo # +--echo # MDEV-31800 Problem with open ranges on prefix blobs keys +--echo # +create table t1 (d text not null, key a (d(6))) ; +insert into t1 values ('prefix 2' ), ('prefix 0' ); +select d from t1 where d >= 'prefix 1' and d < 'prefix 3'; +alter table t1 drop index a; +select d from t1 where d >= 'prefix 1' and d < 'prefix 3'; +drop table t1; + --echo # --echo # End of 10.4 test --echo # diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 6ada4675ae6..0049be0daf4 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1947,18 +1947,25 @@ public: Use this constructor if value->save_in_field() went precisely, without any data rounding or truncation. */ - SEL_ARG_LT(const uchar *key, Field *field) + SEL_ARG_LT(const uchar *key, const KEY_PART *key_part, Field *field) :SEL_ARG_LE(key, field) - { max_flag= NEAR_MAX; } + { + // Don't use open ranges for partial key_segments + if (!(key_part->flag & HA_PART_KEY_SEG)) + max_flag= NEAR_MAX; + } /* Use this constructor if value->save_in_field() returned success, but we don't know if rounding or truncation happened (as some Field::store() do not report minor data changes). */ - SEL_ARG_LT(THD *thd, const uchar *key, Field *field, Item *value) + SEL_ARG_LT(THD *thd, const uchar *key, + const KEY_PART *key_part, Field *field, Item *value) :SEL_ARG_LE(key, field) { - if (stored_field_cmp_to_item(thd, field, value) == 0) + // Don't use open ranges for partial key_segments + if (!(key_part->flag & HA_PART_KEY_SEG) && + stored_field_cmp_to_item(thd, field, value) == 0) max_flag= NEAR_MAX; } }; @@ -9032,7 +9039,7 @@ SEL_ARG *Field::stored_field_make_mm_leaf(RANGE_OPT_PARAM *param, case SCALAR_CMP_LE: DBUG_RETURN(new (mem_root) SEL_ARG_LE(str, this)); case SCALAR_CMP_LT: - DBUG_RETURN(new (mem_root) SEL_ARG_LT(thd, str, this, value)); + DBUG_RETURN(new (mem_root) SEL_ARG_LT(thd, str, key_part, this, value)); case SCALAR_CMP_GT: DBUG_RETURN(new (mem_root) SEL_ARG_GT(thd, str, key_part, this, value)); case SCALAR_CMP_GE: @@ -9061,7 +9068,7 @@ SEL_ARG *Field::stored_field_make_mm_leaf_exact(RANGE_OPT_PARAM *param, case SCALAR_CMP_LE: DBUG_RETURN(new (param->mem_root) SEL_ARG_LE(str, this)); case SCALAR_CMP_LT: - DBUG_RETURN(new (param->mem_root) SEL_ARG_LT(str, this)); + DBUG_RETURN(new (param->mem_root) SEL_ARG_LT(str, key_part, this)); case SCALAR_CMP_GT: DBUG_RETURN(new (param->mem_root) SEL_ARG_GT(str, key_part, this)); case SCALAR_CMP_GE: From ab10a675acb8198d4c772b807b81b50f97480d28 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 31 Jul 2023 17:36:59 +0200 Subject: [PATCH 149/171] MDEV-31092 mysqldump --force doesn't ignore error as it should failed SHOW CREATE FUNCTION means we don't dump this function, but should still try to dump all other functions --- client/mysqldump.c | 6 +-- mysql-test/main/mysqldump.result | 64 ++++++++++++++++++++++++++++++++ mysql-test/main/mysqldump.test | 24 ++++++++++++ 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index a961071bf79..d0797c2721b 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -2723,11 +2723,7 @@ static uint dump_routines_for_db(char *db) routine_type[i], routine_name); if (mysql_query_with_error_report(mysql, &routine_res, query_buff)) - { - mysql_free_result(routine_list_res); - routine_list_res= 0; - DBUG_RETURN(1); - } + continue; while ((row= mysql_fetch_row(routine_res))) { diff --git a/mysql-test/main/mysqldump.result b/mysql-test/main/mysqldump.result index 25597d46b75..8334c50080a 100644 --- a/mysql-test/main/mysqldump.result +++ b/mysql-test/main/mysqldump.result @@ -6342,6 +6342,7 @@ END utf8 utf8_general_ci latin1_swedish_ci DROP DATABASE test1; DROP DATABASE test2; SET sql_mode=@save_sql_mode; +use test; # # MDEV-4875 Can't restore a mysqldump if --add-drop-database meets general_log # @@ -6435,4 +6436,67 @@ TABLE 1 SET GLOBAL LOG_OUTPUT=DEFAULT, GLOBAL GENERAL_LOG=@save_general_log; TRUNCATE TABLE mysql.general_log; DROP DATABASE test1; +# # End of 10.3 tests +# +# +# MDEV-31092 mysqldump --force doesn't ignore error as it should +# +create function f1() returns int return 1; +create function f2() returns int return 2; +update mysql.proc set body='return no_such_var' where db='test' and name='f1'; +create event e1 on schedule every 1 year starts '2030-01-01' do select 1; +Warnings: +Warning 1105 Event scheduler is switched off, use SET GLOBAL event_scheduler=ON to enable it. +update mysql.event set body ='select not_a_value' where db='test' and name='e1'; +create table t1 (i int); +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +mysqldump: Couldn't execute 'SHOW CREATE FUNCTION `f1`': Undeclared variable: no_such_var (1327) +/*!50106 SET @save_time_zone= @@TIME_ZONE */ ; +DELIMITER ;; +/*!50003 SET @saved_cs_client = @@character_set_client */ ;; +/*!50003 SET @saved_cs_results = @@character_set_results */ ;; +/*!50003 SET @saved_col_connection = @@collation_connection */ ;; +/*!50003 SET character_set_client = utf8 */ ;; +/*!50003 SET character_set_results = utf8 */ ;; +/*!50003 SET collation_connection = utf8_general_ci */ ;; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ;; +/*!50003 SET sql_mode = '' */ ;; +/*!50003 SET @saved_time_zone = @@time_zone */ ;; +/*!50003 SET time_zone = 'SYSTEM' */ ;; +/*!50106 CREATE*/ /*!50117 DEFINER=`root`@`localhost`*/ /*!50106 EVENT `e1` ON SCHEDULE EVERY 1 YEAR STARTS '2030-01-01 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO select not_a_value */ ;; +/*!50003 SET time_zone = @saved_time_zone */ ;; +/*!50003 SET sql_mode = @saved_sql_mode */ ;; +/*!50003 SET character_set_client = @saved_cs_client */ ;; +/*!50003 SET character_set_results = @saved_cs_results */ ;; +/*!50003 SET collation_connection = @saved_col_connection */ ;; +DELIMITER ; +/*!50106 SET TIME_ZONE= @save_time_zone */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = '' */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8 */ ; +/*!50003 SET character_set_results = utf8 */ ; +/*!50003 SET collation_connection = utf8_general_ci */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`localhost` FUNCTION `f2`() RETURNS int(11) +return 2 ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +drop function f1; +drop function f2; +drop event e1; +drop table t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/mysqldump.test b/mysql-test/main/mysqldump.test index 2720b27a18c..64a9a8e7c2e 100644 --- a/mysql-test/main/mysqldump.test +++ b/mysql-test/main/mysqldump.test @@ -2921,6 +2921,7 @@ DROP DATABASE test1; DROP DATABASE test2; SET sql_mode=@save_sql_mode; --remove_file $MYSQLTEST_VARDIR/tmp/dumptest1.sql +use test; --echo # --echo # MDEV-4875 Can't restore a mysqldump if --add-drop-database meets general_log @@ -2981,4 +2982,27 @@ TRUNCATE TABLE mysql.general_log; DROP DATABASE test1; --remove_file $MYSQLTEST_VARDIR/tmp/dumptest1.sql +--echo # --echo # End of 10.3 tests +--echo # + +--echo # +--echo # MDEV-31092 mysqldump --force doesn't ignore error as it should +--echo # +create function f1() returns int return 1; +create function f2() returns int return 2; +update mysql.proc set body='return no_such_var' where db='test' and name='f1'; +create event e1 on schedule every 1 year starts '2030-01-01' do select 1; +update mysql.event set body ='select not_a_value' where db='test' and name='e1'; +create table t1 (i int); +--replace_result mysqldump.exe mysqldump +--error 2 +--exec $MYSQL_DUMP --compact --events --routines --force test 2>&1 +drop function f1; +drop function f2; +drop event e1; +drop table t1; + +--echo # +--echo # End of 10.4 tests +--echo # From d794d3484b2cbd069d68dc8d017a6f18e9a3090e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 1 Aug 2023 09:58:15 +0300 Subject: [PATCH 150/171] MDEV-31816 buf_LRU_free_page() does not preserve ROW_FORMAT=COMPRESSED block state buf_LRU_free_page(): When we are discarding the uncompressed copy of a ROW_FORMAT=COMPRESSED page, buf_page_t::can_relocate() must have ensured that the block descriptor state is one of FREED, UNFIXED, REINIT. Do not overwrite the state with UNFIXED. We do not want to write back pages that were actually freed, and we want to avoid doublewrite for pages that were (re)initialized by log records written since the latest checkpoint. Last but not least, we do not want crashes like those that commit dc1bd1802a3175e2b890df368482cd39b5ed9444 (MDEV-31386) was supposed to fix. The test innodb_zip.wl5522_zip should typically cover all 3 states. This bug is a regression due to commit aaef2e1d8c843d1e40b1ce0c5199c3abb3c5da28 (MDEV-27058). --- storage/innobase/buf/buf0lru.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 6cc4f1c3987..3ba31da2ffc 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -851,7 +851,12 @@ relocate_compressed: mysql_mutex_lock(&buf_pool.flush_list_mutex); new (b) buf_page_t(*bpage); b->frame = nullptr; - b->set_state(buf_page_t::UNFIXED + 1); + { + ut_d(uint32_t s=) b->fix(); + ut_ad(s == buf_page_t::FREED + || s == buf_page_t::UNFIXED + || s == buf_page_t::REINIT); + } break; default: if (zip || !bpage->zip.data || !bpage->frame) { From 96cfdb8710eb454e80741a2e303af61cdfc594de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 1 Aug 2023 13:22:16 +0300 Subject: [PATCH 151/171] MDEV-31816 fixup: Relax a debug assertion buf_LRU_free_page(): The block may also be in the IBUF_EXIST state when executing the test innodb.innodb_bulk_create_index_debug. --- storage/innobase/buf/buf0lru.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 3ba31da2ffc..c25a6ad104d 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -855,6 +855,7 @@ relocate_compressed: ut_d(uint32_t s=) b->fix(); ut_ad(s == buf_page_t::FREED || s == buf_page_t::UNFIXED + || s == buf_page_t::IBUF_EXIST || s == buf_page_t::REINIT); } break; From 72928e640e62559f4d4b82e9ff1102bb72bd5828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 1 Aug 2023 14:39:29 +0300 Subject: [PATCH 152/171] MDEV-27593: Crashing on I/O error is unhelpful buf_page_t::write_complete(), buf_page_write_complete(), IORequest::write_complete(): Add a parameter for passing an error code. If an error occurred, we will release the io-fix, buffer-fix and page latch but not reset the oldest_modification field. The block would remain in buf_pool.LRU and possibly buf_pool.flush_list, to be written again later, by buf_flush_page_cleaner(). If all page writes start consistently failing, all write threads should eventually hang in log_free_check() because the log checkpoint cannot be advanced to make room in the circular write-ahead-log ib_logfile0. IORequest::read_complete(): Add a parameter for passing an error code. If a read operation fails, we report the error and discard the page, just like we would do if the page checksum was not validated or the page could not be decrypted. This only affects asynchronous reads, due to linear or random read-ahead or crash recovery. When buf_page_get_low() invokes buf_read_page(), that will be a synchronous read, not involving this code. This was tested by randomly injecting errors in write_io_callback() and read_io_callback(), like this: if (!ut_rnd_interval(100)) cb->m_err= 42; --- storage/innobase/buf/buf0flu.cc | 21 +++++++++++------- storage/innobase/fil/fil0fil.cc | 17 ++++++++++----- storage/innobase/include/buf0buf.h | 6 ++++-- storage/innobase/include/buf0flu.h | 5 +++-- storage/innobase/include/os0file.h | 4 ++-- storage/innobase/os/os0file.cc | 34 ++++++++++++------------------ 6 files changed, 48 insertions(+), 39 deletions(-) diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 9eeecbd1302..59be7349908 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -312,11 +312,14 @@ buf_flush_relocate_on_flush_list( } /** Note that a block is no longer dirty, while not removing -it from buf_pool.flush_list */ -inline void buf_page_t::write_complete(bool temporary) +it from buf_pool.flush_list +@param temporary whether the page belongs to the temporary tablespace +@param error whether an error may have occurred while writing */ +inline void buf_page_t::write_complete(bool temporary, bool error) { ut_ad(temporary == fsp_is_system_temporary(id().space())); - if (temporary) + if (UNIV_UNLIKELY(error)); + else if (temporary) { ut_ad(oldest_modification() == 2); oldest_modification_= 0; @@ -353,8 +356,9 @@ inline void buf_pool_t::n_flush_dec() } /** Complete write of a file page from buf_pool. -@param request write request */ -void buf_page_write_complete(const IORequest &request) +@param request write request +@param error whether the write may have failed */ +void buf_page_write_complete(const IORequest &request, bool error) { ut_ad(request.is_write()); ut_ad(!srv_read_only_mode); @@ -387,8 +391,9 @@ void buf_page_write_complete(const IORequest &request) /* We must hold buf_pool.mutex while releasing the block, so that no other thread can access it before we have freed it. */ mysql_mutex_lock(&buf_pool.mutex); - bpage->write_complete(temp); - buf_LRU_free_page(bpage, true); + bpage->write_complete(temp, error); + if (!error) + buf_LRU_free_page(bpage, true); mysql_mutex_unlock(&buf_pool.mutex); buf_pool.n_flush_dec(); @@ -398,7 +403,7 @@ void buf_page_write_complete(const IORequest &request) if (state < buf_page_t::WRITE_FIX_REINIT && request.node->space->use_doublewrite()) buf_dblwr.write_completed(); - bpage->write_complete(false); + bpage->write_complete(false, error); } } diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 272de85a775..8a0dc883eea 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -2836,7 +2836,7 @@ func_exit: #include -void IORequest::write_complete() const +void IORequest::write_complete(int io_error) const { ut_ad(fil_validate_skip()); ut_ad(node); @@ -2851,13 +2851,13 @@ void IORequest::write_complete() const ut_ad(type == IORequest::WRITE_ASYNC); } else - buf_page_write_complete(*this); + buf_page_write_complete(*this, io_error); node->complete_write(); node->space->release(); } -void IORequest::read_complete() const +void IORequest::read_complete(int io_error) const { ut_ad(fil_validate_skip()); ut_ad(node); @@ -2870,18 +2870,25 @@ void IORequest::read_complete() const and never issue asynchronous reads of change buffer pages. */ const page_id_t id(bpage->id()); - if (dberr_t err= bpage->read_complete(*node)) + if (UNIV_UNLIKELY(io_error != 0)) { + sql_print_error("InnoDB: Read error %d of page " UINT32PF " in file %s", + io_error, id.page_no(), node->name); + buf_pool.corrupted_evict(bpage, buf_page_t::READ_FIX); + corrupted: if (recv_recovery_is_on() && !srv_force_recovery) { mysql_mutex_lock(&recv_sys.mutex); recv_sys.set_corrupt_fs(); mysql_mutex_unlock(&recv_sys.mutex); } - + } + else if (dberr_t err= bpage->read_complete(*node)) + { if (err != DB_FAIL) ib::error() << "Failed to read page " << id.page_no() << " from file '" << node->name << "': " << err; + goto corrupted; } node->space->release(); diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index d2b0112da7c..4c2f621fb25 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -778,8 +778,10 @@ public: dberr_t read_complete(const fil_node_t &node); /** Note that a block is no longer dirty, while not removing - it from buf_pool.flush_list */ - inline void write_complete(bool temporary); + it from buf_pool.flush_list + @param temporary whether the page belongs to the temporary tablespace + @param error whether an error may have occurred while writing */ + inline void write_complete(bool temporary, bool error); /** Write a flushable page to a file or free a freeable block. @param evict whether to evict the page on write completion diff --git a/storage/innobase/include/buf0flu.h b/storage/innobase/include/buf0flu.h index 13a9363922b..74c79e4acc8 100644 --- a/storage/innobase/include/buf0flu.h +++ b/storage/innobase/include/buf0flu.h @@ -58,8 +58,9 @@ buf_flush_relocate_on_flush_list( buf_page_t* dpage); /*!< in/out: destination block */ /** Complete write of a file page from buf_pool. -@param request write request */ -void buf_page_write_complete(const IORequest &request); +@param request write request +@param error whether the write may have failed */ +void buf_page_write_complete(const IORequest &request, bool error); /** Assign the full crc32 checksum for non-compressed page. @param[in,out] page page to be updated */ diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index af3e7975e76..c0db3b0d752 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -221,8 +221,8 @@ public: bool is_LRU() const { return (type & (WRITE_LRU ^ WRITE_ASYNC)) != 0; } bool is_async() const { return (type & (READ_SYNC ^ READ_ASYNC)) != 0; } - void write_complete() const; - void read_complete() const; + void write_complete(int io_error) const; + void read_complete(int io_error) const; void fake_read_complete(os_offset_t offset) const; /** If requested, free storage space associated with a section of the file. diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index f8fb9270230..906ce79e8fd 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -3431,21 +3431,6 @@ os_file_get_status( return(ret); } -static void io_callback_errorcheck(const tpool::aiocb *cb) -{ - if (cb->m_err != DB_SUCCESS) - { - const IORequest &request= *static_cast - (static_cast(cb->m_userdata)); - ib::fatal() << "IO Error: " << cb->m_err << " during " << - (request.is_async() ? "async " : "sync ") << - (request.is_LRU() ? "lru " : "") << - (cb->m_opcode == tpool::aio_opcode::AIO_PREAD ? "read" : "write") << - " of " << cb->m_len << " bytes, for file " << cb->m_fh << ", returned " << - cb->m_ret_len; - } -} - static void fake_io_callback(void *c) { tpool::aiocb *cb= static_cast(c); @@ -3459,10 +3444,10 @@ static void read_io_callback(void *c) { tpool::aiocb *cb= static_cast(c); ut_ad(cb->m_opcode == tpool::aio_opcode::AIO_PREAD); - io_callback_errorcheck(cb); ut_ad(read_slots->contains(cb)); - static_cast - (static_cast(cb->m_userdata))->read_complete(); + const IORequest &request= *static_cast + (static_cast(cb->m_userdata)); + request.read_complete(cb->m_err); read_slots->release(cb); } @@ -3471,8 +3456,17 @@ static void write_io_callback(void *c) tpool::aiocb *cb= static_cast(c); ut_ad(cb->m_opcode == tpool::aio_opcode::AIO_PWRITE); ut_ad(write_slots->contains(cb)); - static_cast - (static_cast(cb->m_userdata))->write_complete(); + const IORequest &request= *static_cast + (static_cast(cb->m_userdata)); + + if (UNIV_UNLIKELY(cb->m_err != 0)) + ib::info () << "IO Error: " << cb->m_err + << "during write of " + << cb->m_len << " bytes, for file " + << request.node->name << "(" << cb->m_fh << "), returned " + << cb->m_ret_len; + + request.write_complete(cb->m_err); write_slots->release(cb); } From 138717b16f67cd8f39f7ce6c9ad4af3ad54548fa Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Tue, 1 Aug 2023 16:40:10 +0200 Subject: [PATCH 153/171] New CC 3.3 --- libmariadb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libmariadb b/libmariadb index 3a255ee3ea3..c0ddc2c8cff 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit 3a255ee3ea3b053ad1bdae04c0e23ce77f251acc +Subproject commit c0ddc2c8cff30aebbedc5ae175e435c2c6fec646 From 691e964d2357b579f64e08398f4b66f7d2c81566 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Tue, 1 Aug 2023 13:29:06 +0300 Subject: [PATCH 154/171] MDEV-31764: ASAN use-after-poison in trace_engine_stats in ANALYZE JSON Do not attempt to produce "r_engine_stats" on the temporary (=work) tables. These tables may be - re-created during the query execution - freed during the query execution (This is done e.g. in JOIN::cleanup(), before we produce ANALYZE FORMAT=JSON output). - (Also, make save_explain_data() functions not set handler_for_stats to point to handler objects that do not have handler->handler_stats set. If the storage engine is not collecting handler_stats, it will not have them when we're producing ANALYZE FORMAT=JSON output, either). --- mysql-test/main/analyze_engine_stats.result | 67 +++++++++++++++++++++ mysql-test/main/analyze_engine_stats.test | 20 ++++++ sql/sql_delete.cc | 5 +- sql/sql_explain.h | 12 +++- sql/sql_select.cc | 6 +- 5 files changed, 105 insertions(+), 5 deletions(-) diff --git a/mysql-test/main/analyze_engine_stats.result b/mysql-test/main/analyze_engine_stats.result index d21a55102da..8d44428c1d5 100644 --- a/mysql-test/main/analyze_engine_stats.result +++ b/mysql-test/main/analyze_engine_stats.result @@ -103,3 +103,70 @@ select cast(json_extract(@out,'$[0]') as DOUBLE) > 0 as PAGES_UPDATED_MORE_THAN_ PAGES_UPDATED_MORE_THAN_ZERO 1 drop table t1; +# +# MDEV-31764: ASAN use-after-poison in trace_engine_stats upon ANALYZE FORMAT=JSON +# +ANALYZE FORMAT=JSON SELECT count(*) FROM information_schema.GLOBAL_STATUS; +# Another testcase without I_S: +CREATE TABLE t1 (a INT); +INSERT INTO t1 SELECT seq FROM seq_1_to_100; +CREATE TABLE t2 (s INT); +INSERT INTO t2 SELECT seq FROM seq_1_to_10; +# Must use SJ-Materialization to hit the issue with temp.table: +ANALYZE FORMAT=JSON SELECT * FROM t1 WHERE a IN (SELECT s FROM t2); +ANALYZE +{ + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "const_condition": "1", + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 100, + "r_rows": 100, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + }, + "table": { + "table_name": "", + "access_type": "eq_ref", + "possible_keys": ["distinct_key"], + "key": "distinct_key", + "key_length": "4", + "used_key_parts": ["s"], + "ref": ["func"], + "r_loops": 100, + "rows": 1, + "r_rows": 0.1, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "filtered": 100, + "r_filtered": 100, + "materialized": { + "unique": 1, + "query_block": { + "select_id": 2, + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 10, + "r_rows": 10, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + } + } + } +} +DROP TABLE t1, t2; diff --git a/mysql-test/main/analyze_engine_stats.test b/mysql-test/main/analyze_engine_stats.test index a26c65a1aa4..019ec39064a 100644 --- a/mysql-test/main/analyze_engine_stats.test +++ b/mysql-test/main/analyze_engine_stats.test @@ -62,3 +62,23 @@ select cast(json_extract(@out,'$[0]') as DOUBLE) > 0 as PAGES_UPDATED_MORE_THAN_ drop table t1; +--echo # +--echo # MDEV-31764: ASAN use-after-poison in trace_engine_stats upon ANALYZE FORMAT=JSON +--echo # + +--disable_result_log +ANALYZE FORMAT=JSON SELECT count(*) FROM information_schema.GLOBAL_STATUS; +--enable_result_log + +--echo # Another testcase without I_S: + +CREATE TABLE t1 (a INT); +INSERT INTO t1 SELECT seq FROM seq_1_to_100; +CREATE TABLE t2 (s INT); +INSERT INTO t2 SELECT seq FROM seq_1_to_10; + +--echo # Must use SJ-Materialization to hit the issue with temp.table: +--source include/analyze-format.inc +ANALYZE FORMAT=JSON SELECT * FROM t1 WHERE a IN (SELECT s FROM t2); + +DROP TABLE t1, t2; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 7236d01e1b3..296d075d7f9 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -124,9 +124,12 @@ bool Update_plan::save_explain_data_intern(THD *thd, if (is_analyze || (thd->variables.log_slow_verbosity & LOG_SLOW_VERBOSITY_ENGINE)) + { table->file->set_time_tracker(&explain->table_tracker); - explain->handler_for_stats= table->file; + if (table->file->handler_stats && table->s->tmp_table != INTERNAL_TMP_TABLE) + explain->handler_for_stats= table->file; + } select_lex->set_explain_type(TRUE); explain->select_type= select_lex->type; diff --git a/sql/sql_explain.h b/sql/sql_explain.h index 7b93ba74a42..c0783d5fad1 100644 --- a/sql/sql_explain.h +++ b/sql/sql_explain.h @@ -845,12 +845,18 @@ public: Gap_time_tracker extra_time_tracker; /* - Note: This pointer is only valid until notify_tables_are_closed() is - called. After that, the tables may be freed or reused, together with their - handler_stats objects. + Handler object to get the handler_stats from. + Notes: + This pointer is only valid until notify_tables_are_closed() is called. + After that, the tables may be freed or reused, together with their + handler_stats objects. notify_tables_are_closed() disables printing of FORMAT=JSON output. r_engine_stats is only printed in FORMAT=JSON output, so we're fine. + + We do not store pointers to temporary (aka "work") tables here. + Temporary tables may be freed (e.g. by JOIN::cleanup()) or re-created + during query execution (when HEAP table is converted into Aria). */ handler *handler_for_stats; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 09ef2700bbd..44a2f1f62ea 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -27755,12 +27755,16 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta, LOG_SLOW_VERBOSITY_ENGINE)) { table->file->set_time_tracker(&eta->op_tracker); + /* Set handler_for_stats even if we are not running an ANALYZE command. There's no harm, and in case somebody runs a SHOW ANALYZE command we'll be able to print the engine statistics. */ - eta->handler_for_stats= table->file; + if (table->file->handler_stats && + table->s->tmp_table != INTERNAL_TMP_TABLE) + eta->handler_for_stats= table->file; + if (likely(thd->lex->analyze_stmt)) { eta->op_tracker.set_gap_tracker(&eta->extra_time_tracker); From bf5cc31d4cbf3c912b7409e479f82671a99617f6 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 29 Jun 2023 12:54:52 +0200 Subject: [PATCH 155/171] cleanup: cosmetic changes --- sql/item.cc | 6 +- sql/sql_table.cc | 146 ++++++++++++++++++----------------------------- 2 files changed, 58 insertions(+), 94 deletions(-) diff --git a/sql/item.cc b/sql/item.cc index f7a46744e9c..b82c4cda505 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1504,7 +1504,7 @@ int Item::save_in_field_no_warnings(Field *field, bool no_conversions) #ifndef DBUG_OFF static inline -void mark_unsupported_func(const char *where, const char *processor_name) +void dbug_mark_unsupported_func(const char *where, const char *processor_name) { char buff[64]; my_snprintf(buff, sizeof(buff), "%s::%s", where ? where: "", processor_name); @@ -1514,7 +1514,7 @@ void mark_unsupported_func(const char *where, const char *processor_name) DBUG_VOID_RETURN; } #else -#define mark_unsupported_func(X,Y) {} +#define dbug_mark_unsupported_func(X,Y) {} #endif bool mark_unsupported_function(const char *where, void *store, uint result) @@ -1522,7 +1522,7 @@ bool mark_unsupported_function(const char *where, void *store, uint result) Item::vcol_func_processor_result *res= (Item::vcol_func_processor_result*) store; uint old_errors= res->errors; - mark_unsupported_func(where, "check_vcol_func_processor"); + dbug_mark_unsupported_func(where, "check_vcol_func_processor"); res->errors|= result; /* Store type of expression */ /* Store the name to the highest violation (normally VCOL_IMPOSSIBLE) */ if (result > old_errors) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 387f086484b..135788fb9e4 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -77,8 +77,7 @@ static int copy_data_between_tables(THD *, TABLE *,TABLE *, ha_rows *, ha_rows *, Alter_info::enum_enable_or_disable, Alter_table_ctx *); -static int append_system_key_parts(THD *thd, HA_CREATE_INFO *create_info, - Key *key); +static int append_system_key_parts(THD *, HA_CREATE_INFO *, Key *); static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *, uint *, handler *, KEY **, uint *, int, const LEX_CSTRING db, @@ -396,8 +395,7 @@ uint filename_to_tablename(const char *from, char *to, size_t to_length, system_charset_info, to, to_length, &errors); if (unlikely(errors)) // Old 5.0 name { - res= (strxnmov(to, to_length, MYSQL50_TABLE_NAME_PREFIX, from, NullS) - - to); + res= strxnmov(to, to_length, MYSQL50_TABLE_NAME_PREFIX, from, NullS) - to; if (!stay_quiet) sql_print_error("Invalid (old?) table or database name '%s'", from); } @@ -3578,6 +3576,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, const Column_derived_attributes dattr(create_info->default_table_charset); const Column_bulk_alter_attributes battr(create_info->alter_table_convert_to_charset); + const CHARSET_INFO *scs= system_charset_info; DBUG_ENTER("mysql_prepare_create_table"); DBUG_EXECUTE_IF("test_pseudo_invisible",{ @@ -3591,23 +3590,17 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, new (thd->mem_root)Item_int(thd, 9)); }); DBUG_EXECUTE_IF("test_invisible_index",{ - LEX_CSTRING temp; - temp.str= "invisible"; - temp.length= strlen("invisible"); - mysql_add_invisible_index(thd, &alter_info->key_list - , &temp, Key::MULTIPLE); + LEX_CSTRING temp= { STRING_WITH_LEN("invisible") }; + mysql_add_invisible_index(thd, &alter_info->key_list, &temp, + Key::MULTIPLE); }); - LEX_CSTRING* connect_string = &create_info->connect_string; - if (connect_string->length != 0 && - connect_string->length > CONNECT_STRING_MAXLEN && - (system_charset_info->charpos(connect_string->str, - (connect_string->str + - connect_string->length), - CONNECT_STRING_MAXLEN) - < connect_string->length)) + LEX_CSTRING* connstr = &create_info->connect_string; + if (connstr->length > CONNECT_STRING_MAXLEN && + scs->charpos(connstr->str, connstr->str + connstr->length, + CONNECT_STRING_MAXLEN) < connstr->length) { - my_error(ER_WRONG_STRING_LENGTH, MYF(0), - connect_string->str, "CONNECTION", CONNECT_STRING_MAXLEN); + my_error(ER_WRONG_STRING_LENGTH, MYF(0), connstr->str, "CONNECTION", + CONNECT_STRING_MAXLEN); DBUG_RETURN(TRUE); } @@ -3670,9 +3663,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, /* Check if we have used the same field name before */ for (dup_no=0; (dup_field=it2++) != sql_field; dup_no++) { - if (lex_string_cmp(system_charset_info, - &sql_field->field_name, - &dup_field->field_name) == 0) + if (lex_string_cmp(scs, &sql_field->field_name, &dup_field->field_name) == 0) { /* If this was a CREATE ... SELECT statement, accept a field @@ -3852,7 +3843,6 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, key2->name.str != ignore_key && !foreign_key_prefix(key, key2))) { - /* TODO: issue warning message */ /* mark that the generated key should be ignored */ if (!key2->generated || (key->generated && key->columns.elements < @@ -3873,13 +3863,13 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, else (*key_count)--; if (key->name.str && !tmp_table && (key->type != Key::PRIMARY) && - !my_strcasecmp(system_charset_info, key->name.str, primary_key_name)) + !my_strcasecmp(scs, key->name.str, primary_key_name)) { my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key->name.str); DBUG_RETURN(TRUE); } if (key->type == Key::PRIMARY && key->name.str && - my_strcasecmp(system_charset_info, key->name.str, primary_key_name) != 0) + my_strcasecmp(scs, key->name.str, primary_key_name) != 0) { bool sav_abort_on_warning= thd->abort_on_warning; thd->abort_on_warning= FALSE; /* Don't make an error out of this. */ @@ -3917,9 +3907,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, auto field_name= key->columns.elem(0)->field_name; it.rewind(); while ((sql_field=it++) && - lex_string_cmp(system_charset_info, - &field_name, - &sql_field->field_name)); + lex_string_cmp(scs, &field_name, &sql_field->field_name)); if (sql_field) field_name= sql_field->field_name; key_name=make_unique_key_name(thd, field_name.str, @@ -4092,9 +4080,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, it.rewind(); field=0; while ((sql_field=it++) && - lex_string_cmp(system_charset_info, - &column->field_name, - &sql_field->field_name)) + lex_string_cmp(scs, &column->field_name, &sql_field->field_name)) field++; /* Either field is not present or field visibility is > INVISIBLE_USER @@ -4114,8 +4100,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, } while ((dup_column= cols2++) != column) { - if (!lex_string_cmp(system_charset_info, - &column->field_name, &dup_column->field_name)) + if (!lex_string_cmp(scs, &column->field_name, &dup_column->field_name)) { my_error(ER_DUP_FIELDNAME, MYF(0), column->field_name.str); DBUG_RETURN(TRUE); @@ -4418,8 +4403,7 @@ without_overlaps_err: { for (Key_part_spec& kp2: fk->columns) { - if (!lex_string_cmp(system_charset_info, &kp.field_name, - &kp2.field_name)) + if (!lex_string_cmp(scs, &kp.field_name, &kp2.field_name)) { goto without_overlaps_err; } @@ -4530,12 +4514,12 @@ without_overlaps_err: if (create_simple) { /* - NOTE: we cannot do this in check_vcol_func_processor() as there is already - no table name qualifier in expression. + NOTE: we cannot do this in check_vcol_func_processor() as there is + already no table name qualifier in expression. */ if (sql_field->vcol_info && sql_field->vcol_info->expr && sql_field->vcol_info->expr->walk(&Item::check_table_name_processor, - false, (void *) &walk_prm)) + false, &walk_prm)) { my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "GENERATED ALWAYS"); DBUG_RETURN(TRUE); @@ -4543,7 +4527,7 @@ without_overlaps_err: if (sql_field->default_value && sql_field->default_value->expr->walk(&Item::check_table_name_processor, - false, (void *) &walk_prm)) + false, &walk_prm)) { my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "DEFAULT"); DBUG_RETURN(TRUE); @@ -4551,7 +4535,7 @@ without_overlaps_err: if (sql_field->check_constraint && sql_field->check_constraint->expr->walk(&Item::check_table_name_processor, - false, (void *) &walk_prm)) + false, &walk_prm)) { my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "CHECK"); DBUG_RETURN(TRUE); @@ -4563,22 +4547,15 @@ without_overlaps_err: create_info->check_constraint_list= &alter_info->check_constraint_list; { List_iterator_fast c_it(alter_info->check_constraint_list); - Virtual_column_info *check; - while ((check= c_it++)) + while (Virtual_column_info *check= c_it++) { - if (create_simple && check->expr->walk(&Item::check_table_name_processor, false, - (void *) &walk_prm)) + if (create_simple && check->expr->walk(&Item::check_table_name_processor, + false, &walk_prm)) { my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "CHECK"); DBUG_RETURN(TRUE); } - if (!check->name.length || check->automatic_name) - { - if (check_expression(check, &check->name, VCOL_CHECK_TABLE, alter_info)) - DBUG_RETURN(TRUE); - continue; - } - + if (check->name.length && !check->automatic_name) { /* Check that there's no repeating table CHECK constraint names. */ List_iterator_fast @@ -4586,42 +4563,35 @@ without_overlaps_err: const Virtual_column_info *dup_check; while ((dup_check= dup_it++) && dup_check != check) { - if (!lex_string_cmp(system_charset_info, - &check->name, &dup_check->name)) + if (check->name.streq(dup_check->name)) { my_error(ER_DUP_CONSTRAINT_NAME, MYF(0), "CHECK", check->name.str); DBUG_RETURN(TRUE); } } - } - /* Check that there's no repeating key constraint names. */ - List_iterator_fast key_it(alter_info->key_list); - while (const Key *key= key_it++) - { - /* - Not all keys considered to be the CONSTRAINT - Noly Primary Key UNIQUE and Foreign keys. - */ - if (key->type != Key::PRIMARY && key->type != Key::UNIQUE && - key->type != Key::FOREIGN_KEY) - continue; - - if (check->name.length == key->name.length && - my_strcasecmp(system_charset_info, - check->name.str, key->name.str) == 0) + /* Check that there's no repeating key constraint names. */ + List_iterator_fast key_it(alter_info->key_list); + while (const Key *key= key_it++) { - my_error(ER_DUP_CONSTRAINT_NAME, MYF(0), "CHECK", check->name.str); + if (key->type != Key::PRIMARY && key->type != Key::UNIQUE && + key->type != Key::FOREIGN_KEY) + continue; + + if (check->name.length == key->name.length && + my_strcasecmp(scs, check->name.str, key->name.str) == 0) + { + my_error(ER_DUP_CONSTRAINT_NAME, MYF(0), "CHECK", check->name.str); + DBUG_RETURN(TRUE); + } + } + + if (check_string_char_length(&check->name, 0, NAME_CHAR_LEN, scs, 1)) + { + my_error(ER_TOO_LONG_IDENT, MYF(0), check->name.str); DBUG_RETURN(TRUE); } } - - if (check_string_char_length(&check->name, 0, NAME_CHAR_LEN, - system_charset_info, 1)) - { - my_error(ER_TOO_LONG_IDENT, MYF(0), check->name.str); - DBUG_RETURN(TRUE); - } if (check_expression(check, &check->name, VCOL_CHECK_TABLE, alter_info)) DBUG_RETURN(TRUE); } @@ -4644,12 +4614,10 @@ without_overlaps_err: thd->mem_root)) DBUG_RETURN(TRUE); -#ifndef DBUG_OFF DBUG_EXECUTE_IF("key", Debug_key::print_keys(thd, "prep_create_table: ", *key_info_buffer, *key_count); ); -#endif DBUG_RETURN(FALSE); } @@ -7736,10 +7704,8 @@ static void update_altered_table(const Alter_inplace_info &ha_alter_info, @retval false success */ -bool mysql_compare_tables(TABLE *table, - Alter_info *alter_info, - HA_CREATE_INFO *create_info, - bool *metadata_equal) +bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, + HA_CREATE_INFO *create_info, bool *metadata_equal) { DBUG_ENTER("mysql_compare_tables"); @@ -7764,15 +7730,14 @@ bool mysql_compare_tables(TABLE *table, Alter_info tmp_alter_info(*alter_info, thd->mem_root); uint db_options= 0; /* not used */ KEY *key_info_buffer= NULL; - LEX_CSTRING db= { table->s->db.str, table->s->db.length }; - LEX_CSTRING table_name= { table->s->db.str, table->s->table_name.length }; /* Create the prepared information. */ int create_table_mode= table->s->tmp_table == NO_TMP_TABLE ? C_ORDINARY_CREATE : C_ALTER_TABLE; if (mysql_prepare_create_table(thd, create_info, &tmp_alter_info, &db_options, table->file, &key_info_buffer, - &key_count, create_table_mode, db, table_name)) + &key_count, create_table_mode, + table->s->db, table->s->table_name)) DBUG_RETURN(1); /* Some very basic checks. */ @@ -9205,7 +9170,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, tmp_name.length= strlen(key_name); /* We dont need LONG_UNIQUE_HASH_FIELD flag because it will be autogenerated */ key= new (thd->mem_root) Key(key_type, &tmp_name, &key_create_info, - MY_TEST(key_info->flags & HA_GENERATED_KEY), + key_info->flags & HA_GENERATED_KEY, &key_parts, key_info->option_list, DDL_options()); key->without_overlaps= key_info->without_overlaps; key->period= table->s->period.name; @@ -10798,10 +10763,9 @@ do_continue:; */ error= create_table_impl(thd, alter_ctx.db, alter_ctx.table_name, alter_ctx.new_db, alter_ctx.tmp_name, - alter_ctx.get_tmp_path(), - thd->lex->create_info, create_info, alter_info, - C_ALTER_TABLE_FRM_ONLY, NULL, - &key_info, &key_count, &frm); + alter_ctx.get_tmp_path(), thd->lex->create_info, + create_info, alter_info, C_ALTER_TABLE_FRM_ONLY, + NULL, &key_info, &key_count, &frm); thd->abort_on_warning= false; reenable_binlog(thd); if (unlikely(error)) From 010f535b7fab476df41ff10288fedcf97404e563 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 13 Jul 2023 11:24:52 +0200 Subject: [PATCH 156/171] cleanup: remove redundant arguments --- sql/sql_insert.cc | 4 +--- sql/sql_table.cc | 19 +++++++------------ sql/sql_table.h | 4 +--- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index d1ef971898f..e4195b420e5 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -4523,9 +4523,7 @@ TABLE *select_create::create_table_from_items(THD *thd, List *items, open_table(). */ - if (!mysql_create_table_no_lock(thd, &create_table->db, - &create_table->table_name, - create_info, alter_info, NULL, + if (!mysql_create_table_no_lock(thd, create_info, alter_info, NULL, select_field_count, create_table)) { DEBUG_SYNC(thd,"create_table_select_before_open"); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 135788fb9e4..dce05d20dbb 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -5449,9 +5449,7 @@ warn: -1 Table was used with IF NOT EXISTS and table existed (warning, not error) */ -int mysql_create_table_no_lock(THD *thd, const LEX_CSTRING *db, - const LEX_CSTRING *table_name, - Table_specification_st *create_info, +int mysql_create_table_no_lock(THD *thd, Table_specification_st *create_info, Alter_info *alter_info, bool *is_trans, int create_table_mode, TABLE_LIST *table_list) { @@ -5459,6 +5457,8 @@ int mysql_create_table_no_lock(THD *thd, const LEX_CSTRING *db, uint not_used_2; int res; char path[FN_REFLEN + 1]; + const LEX_CSTRING *db= &table_list->db; + const LEX_CSTRING *table_name= &table_list->table_name; LEX_CUSTRING frm= {0,0}; if (create_info->tmp_table()) @@ -5635,11 +5635,8 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table, /* We can abort create table for any table type */ thd->abort_on_warning= thd->is_strict_mode(); - if (mysql_create_table_no_lock(thd, &create_table->db, - &create_table->table_name, create_info, - alter_info, - &is_trans, create_table_mode, - create_table) > 0) + if (mysql_create_table_no_lock(thd, create_info, alter_info, &is_trans, + create_table_mode, create_table) > 0) { result= 1; goto err; @@ -6116,10 +6113,8 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, pos_in_locked_tables= local_create_info.table->pos_in_locked_tables; res= ((create_res= - mysql_create_table_no_lock(thd, &table->db, &table->table_name, - &local_create_info, &local_alter_info, - &is_trans, C_ORDINARY_CREATE, - table)) > 0); + mysql_create_table_no_lock(thd, &local_create_info, &local_alter_info, + &is_trans, C_ORDINARY_CREATE, table)) > 0); /* Remember to log if we deleted something */ do_logging= thd->log_current_statement; if (res) diff --git a/sql/sql_table.h b/sql/sql_table.h index 9fecef51c17..7dafe86e897 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -194,9 +194,7 @@ bool add_keyword_to_query(THD *thd, String *result, const LEX_CSTRING *keyword, #define C_ALTER_TABLE_FRM_ONLY -2 #define C_ASSISTED_DISCOVERY -3 -int mysql_create_table_no_lock(THD *thd, const LEX_CSTRING *db, - const LEX_CSTRING *table_name, - Table_specification_st *create_info, +int mysql_create_table_no_lock(THD *thd, Table_specification_st *create_info, Alter_info *alter_info, bool *is_trans, int create_table_mode, TABLE_LIST *table); From 383baa812e5fccba22301dc8464ce8f04d3d5d12 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 13 Jul 2023 11:26:15 +0200 Subject: [PATCH 157/171] cleanup: invert return code --- sql/sql_class.cc | 18 +++++++++--------- sql/sql_class.h | 2 +- sql/sql_table.cc | 11 +++++------ 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 8b1bf2a866f..6fb034b00ce 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -213,11 +213,11 @@ Foreign_key::Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root) We only compare field names RETURN - 0 Generated key is a prefix of other key - 1 Not equal + true Generated key is a prefix of other key + false Not a prefix */ -bool foreign_key_prefix(Key *a, Key *b) +bool is_foreign_key_prefix(Key *a, Key *b) { /* Ensure that 'a' is the generated key */ if (a->generated) @@ -228,13 +228,13 @@ bool foreign_key_prefix(Key *a, Key *b) else { if (!b->generated) - return TRUE; // No foreign key + return false; // No foreign key swap_variables(Key*, a, b); // Put generated key in 'a' } /* Test if 'a' is a prefix of 'b' */ if (a->columns.elements > b->columns.elements) - return TRUE; // Can't be prefix + return false; // Can't be prefix List_iterator col_it1(a->columns); List_iterator col_it2(b->columns); @@ -254,17 +254,17 @@ bool foreign_key_prefix(Key *a, Key *b) } } if (!found) - return TRUE; // Error + return false; // Error } - return FALSE; // Is prefix + return true; // Is prefix #else while ((col1= col_it1++)) { col2= col_it2++; if (!(*col1 == *col2)) - return TRUE; + return false; } - return FALSE; // Is prefix + return true; // Is prefix #endif } diff --git a/sql/sql_class.h b/sql/sql_class.h index df904fb682f..b58a8f28ac0 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -446,7 +446,7 @@ public: Key(const Key &rhs, MEM_ROOT *mem_root); virtual ~Key() = default; /* Equality comparison of keys (ignoring name) */ - friend bool foreign_key_prefix(Key *a, Key *b); + friend bool is_foreign_key_prefix(Key *a, Key *b); /** Used to make a clone of this object for ALTER/CREATE TABLE @sa comment for Key_part_spec::clone diff --git a/sql/sql_table.cc b/sql/sql_table.cc index dce05d20dbb..401d8278fd4 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3835,13 +3835,12 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, while ((key2 = key_iterator2++) != key) { /* - foreign_key_prefix(key, key2) returns 0 if key or key2, or both, is - 'generated', and a generated key is a prefix of the other key. - Then we do not need the generated shorter key. + is_foreign_key_prefix(key, key2) returns true if key or key2, or + both, is 'generated', and a generated key is a prefix of the other + key. Then we do not need the generated shorter key. */ - if ((key2->type != Key::FOREIGN_KEY && - key2->name.str != ignore_key && - !foreign_key_prefix(key, key2))) + if (key2->type != Key::FOREIGN_KEY && key2->name.str != ignore_key && + is_foreign_key_prefix(key, key2)) { /* mark that the generated key should be ignored */ if (!key2->generated || From f7a9f446d7467b15b7b4e58cea5dd204cca9762d Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 10 Jul 2023 22:25:52 +0200 Subject: [PATCH 158/171] cleanup: remove unused keyinfo flag HA_UNIQUE_CHECK was * only used internally by MyISAM/Aria * only used for internal temporary tables (for DISTINCT) * never saved in frm * saved in MYI/MAD but only for temporary tables * only set, never checked it's safe to remove it and free the bit (there are only 16 of them) --- include/my_base.h | 6 ++---- storage/maria/ma_create.c | 1 - storage/myisam/mi_create.c | 1 - 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/include/my_base.h b/include/my_base.h index 10daf1c79d1..a9f176abaf2 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -268,17 +268,15 @@ enum ha_base_keytype { #define HA_NOSAME 1U /* Set if not dupplicated records */ #define HA_PACK_KEY 2U /* Pack string key to previous key */ -#define HA_AUTO_KEY 16U +#define HA_AUTO_KEY 16U /* MEMORY/MyISAM/Aria internal */ #define HA_BINARY_PACK_KEY 32U /* Packing of all keys to prev key */ #define HA_FULLTEXT 128U /* For full-text search */ -#define HA_UNIQUE_CHECK 256U /* Check the key for uniqueness */ #define HA_SPATIAL 1024U /* For spatial search */ #define HA_NULL_ARE_EQUAL 2048U /* NULL in key are cmp as equal */ #define HA_GENERATED_KEY 8192U /* Automatically generated key */ /* The combination of the above can be used for key type comparison. */ -#define HA_KEYFLAG_MASK (HA_NOSAME | HA_AUTO_KEY | \ - HA_FULLTEXT | HA_UNIQUE_CHECK | \ +#define HA_KEYFLAG_MASK (HA_NOSAME | HA_AUTO_KEY | HA_FULLTEXT | \ HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY) /* diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index bbbde63dcd0..abfdc986ce3 100644 --- a/storage/maria/ma_create.c +++ b/storage/maria/ma_create.c @@ -980,7 +980,6 @@ int maria_create(const char *name, enum data_file_type datafile_type, for (i=0; i < uniques ; i++) { tmp_keydef.keysegs=1; - tmp_keydef.flag= HA_UNIQUE_CHECK; tmp_keydef.block_length= (uint16) maria_block_size; tmp_keydef.keylength= MARIA_UNIQUE_HASH_LENGTH + pointer; tmp_keydef.minlength=tmp_keydef.maxlength=tmp_keydef.keylength; diff --git a/storage/myisam/mi_create.c b/storage/myisam/mi_create.c index 2837354f869..abbdf83bc22 100644 --- a/storage/myisam/mi_create.c +++ b/storage/myisam/mi_create.c @@ -754,7 +754,6 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, for (i=0; i < uniques ; i++) { tmp_keydef.keysegs=1; - tmp_keydef.flag= HA_UNIQUE_CHECK; tmp_keydef.block_length= (uint16)myisam_block_size; tmp_keydef.keylength= MI_UNIQUE_HASH_LENGTH + pointer; tmp_keydef.minlength=tmp_keydef.maxlength=tmp_keydef.keylength; From 2f6d464fec569a4d1939698e9851206ba9ccafbb Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 11 Jul 2023 14:25:12 +0200 Subject: [PATCH 159/171] cleanup: reorder enum_fk_option --- sql/table.cc | 8 +------- sql/table.h | 10 +++++++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/sql/table.cc b/sql/table.cc index 9dadd208244..7e5db62d4dd 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -9771,20 +9771,14 @@ LEX_CSTRING *fk_option_name(enum_fk_option opt) { { STRING_WITH_LEN("???") }, { STRING_WITH_LEN("RESTRICT") }, + { STRING_WITH_LEN("NO ACTION") }, { STRING_WITH_LEN("CASCADE") }, { STRING_WITH_LEN("SET NULL") }, - { STRING_WITH_LEN("NO ACTION") }, { STRING_WITH_LEN("SET DEFAULT") } }; return names + opt; } -bool fk_modifies_child(enum_fk_option opt) -{ - static bool can_write[]= { false, false, true, true, false, true }; - return can_write[opt]; -} - enum TR_table::enabled TR_table::use_transaction_registry= TR_table::MAYBE; TR_table::TR_table(THD* _thd, bool rw) : diff --git a/sql/table.h b/sql/table.h index f28e1268fad..dd34e9e9a79 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1860,8 +1860,8 @@ enum enum_schema_table_state PROCESSED_BY_JOIN_EXEC }; -enum enum_fk_option { FK_OPTION_UNDEF, FK_OPTION_RESTRICT, FK_OPTION_CASCADE, - FK_OPTION_SET_NULL, FK_OPTION_NO_ACTION, FK_OPTION_SET_DEFAULT}; +enum enum_fk_option { FK_OPTION_UNDEF, FK_OPTION_RESTRICT, FK_OPTION_NO_ACTION, + FK_OPTION_CASCADE, FK_OPTION_SET_NULL, FK_OPTION_SET_DEFAULT }; typedef struct st_foreign_key_info { @@ -1878,7 +1878,11 @@ typedef struct st_foreign_key_info } FOREIGN_KEY_INFO; LEX_CSTRING *fk_option_name(enum_fk_option opt); -bool fk_modifies_child(enum_fk_option opt); +static inline bool fk_modifies_child(enum_fk_option opt) +{ + return opt >= FK_OPTION_CASCADE; +} + class IS_table_read_plan; From b8233b38da3e7cbb7ae37f866ee8e6f96bad014e Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 29 Jun 2023 16:24:50 +0200 Subject: [PATCH 160/171] cleanup: put db/table_name into Alter_info also, prefer Lex_table_name and Lex_ident over LEX_CSTRING --- sql/field.h | 2 +- sql/item.h | 12 ++++----- sql/sql_alter.h | 1 + sql/sql_class.h | 2 +- sql/sql_partition.cc | 34 ++++++++++++------------ sql/sql_partition.h | 6 +---- sql/sql_table.cc | 61 +++++++++++++++++++++----------------------- sql/sql_table.h | 14 +++------- sql/table.cc | 13 +++++----- 9 files changed, 68 insertions(+), 77 deletions(-) diff --git a/sql/field.h b/sql/field.h index 99e73fcc282..804394c58a6 100644 --- a/sql/field.h +++ b/sql/field.h @@ -5234,7 +5234,7 @@ class Column_definition: public Sql_alloc, const Type_handler *field_type() const; // Prevent using this Compression_method *compression_method_ptr; public: - LEX_CSTRING field_name; + Lex_ident field_name; LEX_CSTRING comment; // Comment for field enum enum_column_versioning { diff --git a/sql/item.h b/sql/item.h index e73d4f61b89..d0f44f7218e 100644 --- a/sql/item.h +++ b/sql/item.h @@ -3332,17 +3332,17 @@ protected: updated during fix_fields() to values from Field object and life-time of those is shorter than life-time of Item_field. */ - LEX_CSTRING orig_db_name; - LEX_CSTRING orig_table_name; - LEX_CSTRING orig_field_name; + Lex_table_name orig_db_name; + Lex_table_name orig_table_name; + Lex_ident orig_field_name; void undeclared_spvar_error() const; public: Name_resolution_context *context; - LEX_CSTRING db_name; - LEX_CSTRING table_name; - LEX_CSTRING field_name; + Lex_table_name db_name; + Lex_table_name table_name; + Lex_ident field_name; /* NOTE: came from TABLE::alias_name_used and this is only a hint! See comment for TABLE::alias_name_used. diff --git a/sql/sql_alter.h b/sql/sql_alter.h index 99c6b83ba33..77c74d77f8f 100644 --- a/sql/sql_alter.h +++ b/sql/sql_alter.h @@ -84,6 +84,7 @@ public: ALTER_TABLE_LOCK_EXCLUSIVE }; + Lex_table_name db, table_name; // Columns and keys to be dropped. List drop_list; diff --git a/sql/sql_class.h b/sql/sql_class.h index b58a8f28ac0..65185b7f4b3 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -313,7 +313,7 @@ typedef struct st_copy_info { class Key_part_spec :public Sql_alloc { public: - LEX_CSTRING field_name; + Lex_ident field_name; uint length; bool generated; Key_part_spec(const LEX_CSTRING *name, uint len, bool gen= false) diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index f004981bd2a..30e54ba5f44 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6032,7 +6032,8 @@ static bool mysql_change_partitions(ALTER_PARTITION_PARAM_TYPE *lpt) THD *thd= lpt->thd; DBUG_ENTER("mysql_change_partitions"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if(mysql_trans_prepare_alter_copy_data(thd)) DBUG_RETURN(TRUE); @@ -6080,7 +6081,8 @@ static bool mysql_rename_partitions(ALTER_PARTITION_PARAM_TYPE *lpt) int error; DBUG_ENTER("mysql_rename_partitions"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if (unlikely((error= lpt->table->file->ha_rename_partitions(path)))) { if (error != 1) @@ -6124,7 +6126,8 @@ static bool mysql_drop_partitions(ALTER_PARTITION_PARAM_TYPE *lpt) lpt->table->s->table_name.str, MDL_EXCLUSIVE)); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if ((error= lpt->table->file->ha_drop_partitions(path))) { lpt->table->file->print_error(error, MYF(0)); @@ -6511,7 +6514,8 @@ static bool write_log_rename_frm(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ENTER("write_log_rename_frm"); part_info->first_log_entry= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_replace_delete_frm(lpt, 0UL, shadow_path, path, TRUE)) @@ -6562,7 +6566,8 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ENTER("write_log_drop_partition"); part_info->first_log_entry= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path, @@ -6620,7 +6625,8 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ASSERT(old_first_log_entry); DBUG_ENTER("write_log_add_change_partition"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); @@ -6688,7 +6694,8 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt) Replace the revert operations with forced retry operations. */ part_info->first_log_entry= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_changed_partitions(lpt, &next_entry, (const char*)path)) @@ -6874,8 +6881,8 @@ static void handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, Better to do that here, than leave the cleaning up to others. Acquire EXCLUSIVE mdl lock if not already acquired. */ - if (!thd->mdl_context.is_lock_owner(MDL_key::TABLE, lpt->db.str, - lpt->table_name.str, + if (!thd->mdl_context.is_lock_owner(MDL_key::TABLE, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, MDL_EXCLUSIVE) && wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN)) { @@ -7069,14 +7076,11 @@ static void downgrade_mdl_if_lock_tables_mode(THD *thd, MDL_ticket *ticket, uint fast_alter_partition_table(THD *thd, TABLE *table, Alter_info *alter_info, HA_CREATE_INFO *create_info, - TABLE_LIST *table_list, - const LEX_CSTRING *db, - const LEX_CSTRING *table_name) + TABLE_LIST *table_list) { /* Set-up struct used to write frm files */ partition_info *part_info; - ALTER_PARTITION_PARAM_TYPE lpt_obj; - ALTER_PARTITION_PARAM_TYPE *lpt= &lpt_obj; + ALTER_PARTITION_PARAM_TYPE lpt_obj, *lpt= &lpt_obj; bool action_completed= FALSE; bool frm_install= FALSE; MDL_ticket *mdl_ticket= table->mdl_ticket; @@ -7095,8 +7099,6 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, lpt->table= table; lpt->key_info_buffer= 0; lpt->key_count= 0; - lpt->db= *db; - lpt->table_name= *table_name; lpt->copied= 0; lpt->deleted= 0; lpt->pack_frm_data= NULL; diff --git a/sql/sql_partition.h b/sql/sql_partition.h index 58ba82dcd9f..3cdefa034c8 100644 --- a/sql/sql_partition.h +++ b/sql/sql_partition.h @@ -57,8 +57,6 @@ typedef struct st_lock_param_type Alter_info *alter_info; TABLE *table; KEY *key_info_buffer; - LEX_CSTRING db; - LEX_CSTRING table_name; uchar *pack_frm_data; uint key_count; uint db_options; @@ -255,9 +253,7 @@ typedef int (*get_partitions_in_range_iter)(partition_info *part_info, uint fast_alter_partition_table(THD *thd, TABLE *table, Alter_info *alter_info, HA_CREATE_INFO *create_info, - TABLE_LIST *table_list, - const LEX_CSTRING *db, - const LEX_CSTRING *table_name); + TABLE_LIST *table_list); bool set_part_state(Alter_info *alter_info, partition_info *tab_part_info, enum partition_state part_state); uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info, diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 401d8278fd4..144ea9fe8a8 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -79,9 +79,7 @@ static int copy_data_between_tables(THD *, TABLE *,TABLE *, Alter_table_ctx *); static int append_system_key_parts(THD *, HA_CREATE_INFO *, Key *); static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *, - uint *, handler *, KEY **, uint *, int, - const LEX_CSTRING db, - const LEX_CSTRING table_name); + uint *, handler *, KEY **, uint *, int); static uint blob_length_by_type(enum_field_types type); static bool fix_constraints_names(THD *, List *, const HA_CREATE_INFO *); @@ -1765,9 +1763,9 @@ uint build_table_shadow_filename(char *buff, size_t bufflen, { char tmp_name[FN_REFLEN]; my_snprintf(tmp_name, sizeof (tmp_name), "%s-shadow-%lx-%s", tmp_file_prefix, - (ulong) current_thd->thread_id, lpt->table_name.str); - return build_table_filename(buff, bufflen, lpt->db.str, tmp_name, "", - FN_IS_TMP); + (ulong) current_thd->thread_id, lpt->alter_info->table_name.str); + return build_table_filename(buff, bufflen, lpt->alter_info->db.str, tmp_name, + "", FN_IS_TMP); } @@ -1826,7 +1824,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) if (mysql_prepare_create_table(lpt->thd, lpt->create_info, lpt->alter_info, &lpt->db_options, lpt->table->file, &lpt->key_info_buffer, &lpt->key_count, - C_ALTER_TABLE, lpt->db, lpt->table_name)) + C_ALTER_TABLE)) { DBUG_RETURN(TRUE); } @@ -1846,7 +1844,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) #endif /* Write shadow frm file */ lpt->create_info->table_options= lpt->db_options; - LEX_CUSTRING frm= build_frm_image(lpt->thd, lpt->table_name, + LEX_CUSTRING frm= build_frm_image(lpt->thd, lpt->alter_info->table_name, lpt->create_info, lpt->alter_info->create_list, lpt->key_count, lpt->key_info_buffer, @@ -1857,7 +1855,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) goto end; } - int error= writefile(shadow_frm_name, lpt->db.str, lpt->table_name.str, + int error= writefile(shadow_frm_name, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, lpt->create_info->tmp_table(), frm.str, frm.length); my_free(const_cast(frm.str)); @@ -1879,8 +1878,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) /* Build frm file name */ - build_table_filename(path, sizeof(path) - 1, lpt->db.str, - lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); strxnmov(frm_name, sizeof(frm_name), path, reg_ext, NullS); /* When we are changing to use new frm file we need to ensure that we @@ -3556,8 +3555,7 @@ static int mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, Alter_info *alter_info, uint *db_options, handler *file, KEY **key_info_buffer, - uint *key_count, int create_table_mode, - const LEX_CSTRING db, const LEX_CSTRING table_name) + uint *key_count, int create_table_mode) { const char *key_name; Create_field *sql_field,*dup_field; @@ -4454,7 +4452,7 @@ without_overlaps_err: create_info->null_bits= null_fields; /* Check fields. */ - Item::Check_table_name_prm walk_prm(db, table_name); + Item::Check_table_name_prm walk_prm(alter_info->db, alter_info->table_name); it.rewind(); while ((sql_field=it++)) { @@ -4858,9 +4856,7 @@ static int append_system_key_parts(THD *thd, HA_CREATE_INFO *create_info, return result; } -handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, - const LEX_CSTRING &table_name, - HA_CREATE_INFO *create_info, +handler *mysql_create_frm_image(THD *thd, HA_CREATE_INFO *create_info, Alter_info *alter_info, int create_table_mode, KEY **key_info, uint *key_count, LEX_CUSTRING *frm) @@ -4875,7 +4871,7 @@ handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, DBUG_RETURN(NULL); } - set_table_default_charset(thd, create_info, db); + set_table_default_charset(thd, create_info, alter_info->db); db_options= create_info->table_options_with_row_type(); @@ -4996,7 +4992,7 @@ handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, if (part_info->vers_info && !create_info->versioned()) { - my_error(ER_VERS_NOT_VERSIONED, MYF(0), table_name.str); + my_error(ER_VERS_NOT_VERSIONED, MYF(0), alter_info->table_name.str); goto err; } @@ -5094,14 +5090,12 @@ handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, #endif if (mysql_prepare_create_table(thd, create_info, alter_info, &db_options, - file, key_info, key_count, - create_table_mode, db, table_name)) + file, key_info, key_count, create_table_mode)) goto err; create_info->table_options=db_options; - *frm= build_frm_image(thd, table_name, create_info, - alter_info->create_list, *key_count, - *key_info, file); + *frm= build_frm_image(thd, alter_info->table_name, create_info, + alter_info->create_list, *key_count, *key_info, file); if (frm->str) DBUG_RETURN(file); @@ -5373,9 +5367,10 @@ int create_table_impl(THD *thd, const LEX_CSTRING &orig_db, } else { - file= mysql_create_frm_image(thd, orig_db, orig_table_name, create_info, - alter_info, create_table_mode, key_info, - key_count, frm); + alter_info->db= orig_db; + alter_info->table_name= orig_table_name; + file= mysql_create_frm_image(thd, create_info, alter_info, + create_table_mode, key_info, key_count, frm); /* TODO: remove this check of thd->is_error() (now it intercept errors in some val_*() methoids and bring some single place to @@ -7725,13 +7720,15 @@ bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, uint db_options= 0; /* not used */ KEY *key_info_buffer= NULL; + tmp_alter_info.db= table->s->db; + tmp_alter_info.table_name= table->s->table_name; + /* Create the prepared information. */ int create_table_mode= table->s->tmp_table == NO_TMP_TABLE ? C_ORDINARY_CREATE : C_ALTER_TABLE; if (mysql_prepare_create_table(thd, create_info, &tmp_alter_info, &db_options, table->file, &key_info_buffer, - &key_count, create_table_mode, - table->s->db, table->s->table_name)) + &key_count, create_table_mode)) DBUG_RETURN(1); /* Some very basic checks. */ @@ -10640,10 +10637,10 @@ do_continue:; } // In-place execution of ALTER TABLE for partitioning. + alter_info->db= alter_ctx.db; + alter_info->table_name= alter_ctx.table_name; DBUG_RETURN(fast_alter_partition_table(thd, table, alter_info, - create_info, table_list, - &alter_ctx.db, - &alter_ctx.table_name)); + create_info, table_list)); } #endif diff --git a/sql/sql_table.h b/sql/sql_table.h index 7dafe86e897..137405f8079 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -198,18 +198,12 @@ int mysql_create_table_no_lock(THD *thd, Table_specification_st *create_info, Alter_info *alter_info, bool *is_trans, int create_table_mode, TABLE_LIST *table); -handler *mysql_create_frm_image(THD *thd, - const LEX_CSTRING &db, - const LEX_CSTRING &table_name, - HA_CREATE_INFO *create_info, - Alter_info *alter_info, - int create_table_mode, - KEY **key_info, - uint *key_count, +handler *mysql_create_frm_image(THD *thd, HA_CREATE_INFO *create_info, + Alter_info *alter_info, int create_table_mode, + KEY **key_info, uint *key_count, LEX_CUSTRING *frm); -int mysql_discard_or_import_tablespace(THD *thd, - TABLE_LIST *table_list, +int mysql_discard_or_import_tablespace(THD *thd, TABLE_LIST *table_list, bool discard); bool mysql_prepare_alter_table(THD *thd, TABLE *table, diff --git a/sql/table.cc b/sql/table.cc index 7e5db62d4dd..921cf41f514 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -3411,17 +3411,18 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, sql_unusable_for_discovery(thd, hton, sql_copy)))) goto ret; - thd->lex->create_info.db_type= hton; + tmp_lex.create_info.db_type= hton; #ifdef WITH_PARTITION_STORAGE_ENGINE thd->work_part_info= 0; // For partitioning #endif if (tabledef_version.str) - thd->lex->create_info.tabledef_version= tabledef_version; + tmp_lex.create_info.tabledef_version= tabledef_version; - promote_first_timestamp_column(&thd->lex->alter_info.create_list); - file= mysql_create_frm_image(thd, db, table_name, - &thd->lex->create_info, &thd->lex->alter_info, + tmp_lex.alter_info.db= db; + tmp_lex.alter_info.table_name= table_name; + promote_first_timestamp_column(&tmp_lex.alter_info.create_list); + file= mysql_create_frm_image(thd, &tmp_lex.create_info, &tmp_lex.alter_info, C_ORDINARY_CREATE, &unused1, &unused2, &frm); error|= file == 0; delete file; @@ -3435,7 +3436,7 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, ret: my_free(const_cast(frm.str)); - lex_end(thd->lex); + lex_end(&tmp_lex); thd->reset_db(&db_backup); thd->lex= old_lex; reenable_binlog(thd); From 0c9794d022189be0af63cc42d2b15cefaaa5b26b Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 29 Jun 2023 18:03:54 +0200 Subject: [PATCH 161/171] cleanup: Item_field::check_vcol_func_processor() to declutter Item_field::check_vcol_func_processor(), move alter_info specific part of it into Alter_info::check_vcol_field() --- sql/item.cc | 30 ++++++++---------------------- sql/sql_alter.cc | 19 +++++++++++++++++++ sql/sql_alter.h | 2 ++ 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/sql/item.cc b/sql/item.cc index b82c4cda505..ed44a0cccbd 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1543,33 +1543,19 @@ bool mark_unsupported_function(const char *w1, const char *w2, bool Item_field::check_vcol_func_processor(void *arg) { + uint r= VCOL_FIELD_REF; context= 0; vcol_func_processor_result *res= (vcol_func_processor_result *) arg; if (res && res->alter_info) + r|= res->alter_info->check_vcol_field(this); + else if (field) { - for (Key &k: res->alter_info->key_list) - { - if (k.type != Key::FOREIGN_KEY) - continue; - Foreign_key *fk= (Foreign_key*) &k; - if (fk->update_opt != FK_OPTION_CASCADE) - continue; - for (Key_part_spec& kp: fk->columns) - { - if (!lex_string_cmp(system_charset_info, &kp.field_name, &field_name)) - { - return mark_unsupported_function(field_name.str, arg, VCOL_IMPOSSIBLE); - } - } - } + if (field->unireg_check == Field::NEXT_NUMBER) + r|= VCOL_AUTO_INC; + if (field->vcol_info && + field->vcol_info->flags & (VCOL_NOT_STRICTLY_DETERMINISTIC | VCOL_AUTO_INC)) + r|= VCOL_NON_DETERMINISTIC; } - - uint r= VCOL_FIELD_REF; - if (field && field->unireg_check == Field::NEXT_NUMBER) - r|= VCOL_AUTO_INC; - if (field && field->vcol_info && - field->vcol_info->flags & (VCOL_NOT_STRICTLY_DETERMINISTIC | VCOL_AUTO_INC)) - r|= VCOL_NON_DETERMINISTIC; return mark_unsupported_function(field_name.str, arg, r); } diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index a4b0c24cc6b..8bfd591532f 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -252,6 +252,25 @@ Alter_info::algorithm(const THD *thd) const } +uint Alter_info::check_vcol_field(Item_field *item) const +{ + for (Key &k: key_list) + { + if (k.type != Key::FOREIGN_KEY) + continue; + Foreign_key *fk= (Foreign_key*) &k; + if (fk->update_opt != FK_OPTION_CASCADE) + continue; + for (Key_part_spec& kp: fk->columns) + { + if (item->field_name.streq(kp.field_name)) + return VCOL_NON_DETERMINISTIC; + } + } + return 0; +} + + Alter_table_ctx::Alter_table_ctx() : implicit_default_value_error_field(NULL), error_if_not_empty(false), diff --git a/sql/sql_alter.h b/sql/sql_alter.h index 77c74d77f8f..e0de81e2b40 100644 --- a/sql/sql_alter.h +++ b/sql/sql_alter.h @@ -231,6 +231,8 @@ public: */ enum_alter_table_algorithm algorithm(const THD *thd) const; + uint check_vcol_field(Item_field *f) const; + private: Alter_info &operator=(const Alter_info &rhs); // not implemented Alter_info(const Alter_info &rhs); // not implemented From ab1191c0394ae687cba5aeaf5348a8534d64f191 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 13 Jul 2023 10:23:11 +0200 Subject: [PATCH 162/171] cleanup: key->key_create_info.check_for_duplicate_indexes -> key->old mark old keys in the ALTER TABLE with the `old` flag, not with the `key_create_info.check_for_duplicate_indexes`. This allows to mark old foreign keys too. --- sql/handler.cc | 2 +- sql/handler.h | 6 ------ sql/sql_class.cc | 4 +++- sql/sql_class.h | 9 ++++----- sql/sql_table.cc | 11 +++-------- storage/innobase/handler/ha_innodb.cc | 2 +- storage/innobase/handler/handler0alter.cc | 2 +- 7 files changed, 13 insertions(+), 23 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 49bc20976a3..bc54b7e1a3e 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -110,7 +110,7 @@ static handlerton *installed_htons[128]; #define BITMAP_STACKBUF_SIZE (128/8) KEY_CREATE_INFO default_key_create_info= -{ HA_KEY_ALG_UNDEF, 0, 0, {NullS, 0}, {NullS, 0}, true }; +{ HA_KEY_ALG_UNDEF, 0, 0, {NullS, 0}, {NullS, 0} }; /* number of entries in handlertons[] */ ulong total_ha= 0; diff --git a/sql/handler.h b/sql/handler.h index 09b6cf08fab..e28cb871fbd 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -2550,12 +2550,6 @@ typedef struct st_key_create_information uint flags; /* HA_USE.. flags */ LEX_CSTRING parser_name; LEX_CSTRING comment; - /** - A flag to determine if we will check for duplicate indexes. - This typically means that the key information was specified - directly by the user (set by the parser). - */ - bool check_for_duplicate_indexes; } KEY_CREATE_INFO; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 6fb034b00ce..d53887bd8f8 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -177,7 +177,7 @@ Key::Key(const Key &rhs, MEM_ROOT *mem_root) name(rhs.name), option_list(rhs.option_list), generated(rhs.generated), invisible(false), - without_overlaps(rhs.without_overlaps), period(rhs.period) + without_overlaps(rhs.without_overlaps), old(rhs.old), period(rhs.period) { list_copy_and_replace_each_value(columns, mem_root); } @@ -285,6 +285,8 @@ bool Foreign_key::validate(List &table_fields) List_iterator cols(columns); List_iterator it(table_fields); DBUG_ENTER("Foreign_key::validate"); + if (old) + DBUG_RETURN(FALSE); // must be good while ((column= cols++)) { it.rewind(); diff --git a/sql/sql_class.h b/sql/sql_class.h index 65185b7f4b3..98c0f04a5c5 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -423,6 +423,7 @@ public: bool generated; bool invisible; bool without_overlaps; + bool old; Lex_ident period; Key(enum Keytype type_par, const LEX_CSTRING *name_arg, @@ -430,7 +431,7 @@ public: :DDL_options(ddl_options), type(type_par), key_create_info(default_key_create_info), name(*name_arg), option_list(NULL), generated(generated_arg), - invisible(false), without_overlaps(false) + invisible(false), without_overlaps(false), old(false) { key_create_info.algorithm= algorithm_arg; } @@ -441,7 +442,7 @@ public: :DDL_options(ddl_options), type(type_par), key_create_info(*key_info_arg), columns(*cols), name(*name_arg), option_list(create_opt), generated(generated_arg), - invisible(false), without_overlaps(false) + invisible(false), without_overlaps(false), old(false) {} Key(const Key &rhs, MEM_ROOT *mem_root); virtual ~Key() = default; @@ -479,9 +480,7 @@ public: ref_db(*ref_db_arg), ref_table(*ref_table_arg), ref_columns(*ref_cols), delete_opt(delete_opt_arg), update_opt(update_opt_arg), match_opt(match_opt_arg) - { - // We don't check for duplicate FKs. - key_create_info.check_for_duplicate_indexes= false; + { } Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root); /** diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 144ea9fe8a8..327d2bad3ac 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3187,7 +3187,7 @@ static void check_duplicate_key(THD *thd, const Key *key, const KEY *key_info, Check is requested if the key was explicitly created or altered by the user (unless it's a foreign key). */ - if (!key->key_create_info.check_for_duplicate_indexes || key->generated) + if (key->old || key->type == Key::FOREIGN_KEY || key->generated) return; for (const Key &k : *key_list) @@ -9127,12 +9127,6 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, if (key_info->flags & HA_USES_COMMENT) key_create_info.comment= key_info->comment; - /* - We're refreshing an already existing index. Since the index is not - modified, there is no need to check for duplicate indexes again. - */ - key_create_info.check_for_duplicate_indexes= false; - if (key_info->flags & HA_SPATIAL) key_type= Key::SPATIAL; else if (key_info->flags & HA_NOSAME) @@ -9165,6 +9159,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, &key_parts, key_info->option_list, DDL_options()); key->without_overlaps= key_info->without_overlaps; key->period= table->s->period.name; + key->old= true; new_key_list.push_back(key, thd->mem_root); } if (long_hash_key) @@ -9716,7 +9711,7 @@ static bool fk_prepare_copy_alter_table(THD *thd, TABLE *table, while (Key *key= fk_list_it++) { - if (key->type != Key::FOREIGN_KEY) + if (key->type != Key::FOREIGN_KEY || key->old) continue; Foreign_key *fk= static_cast(key); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 15f7f842a78..f783b875295 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -12196,7 +12196,7 @@ create_table_info_t::create_foreign_keys() } while (Key* key = key_it++) { - if (key->type != Key::FOREIGN_KEY) + if (key->type != Key::FOREIGN_KEY || key->old) continue; if (tmp_table) { diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 2389c056245..5c8629733d6 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -3020,7 +3020,7 @@ innobase_get_foreign_key_info( *n_add_fk = 0; for (Key& key : alter_info->key_list) { - if (key.type != Key::FOREIGN_KEY) { + if (key.type != Key::FOREIGN_KEY || key.old) { continue; } From 8760fe11b89450d56269ed062b36b4238d45707f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 2 Aug 2023 11:52:00 +0300 Subject: [PATCH 163/171] MDEV-31791: Recovery on memory-mapped log occasionally fails recv_ring::copy_if_needed(): If the record wraps around the memory-mapped ib_logfile0, do copy it also if len==0 (the record consists only of a header, like FREE_PAGE and INIT_PAGE records do). recv_sys_t::parse(): Invoke recv_ring::copy_if_needed() for INIT_PAGE and FREE_PAGE records, so that if these records wrap around the memory-mapped ib_logfile0, they will be correctly copied to recv_sys.pages. Together with commit 0d175968d1181a0308ce6caccc2e4fbc972ca6c6 (MDEV-31354) this fixes occasional failures of the test innodb.recovery_memory. --- storage/innobase/log/log0recv.cc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index d19edcf15fd..6f58be6ed35 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2395,8 +2395,6 @@ struct recv_ring : public recv_buf const byte *copy_if_needed(const byte *iv, byte *tmp, recv_ring start, size_t len) { - if (!len) - return ptr; const size_t s(*this - start); ut_ad(s + len <= srv_page_size); if (!log_sys.is_encrypted()) @@ -2751,6 +2749,8 @@ restart: store_freed_or_init_rec(id, (b & 0x70) == FREE_PAGE); if (UNIV_UNLIKELY(rlen != 0)) goto record_corrupted; + copy_if_needed: + cl= l.copy_if_needed(iv, decrypt_buf, recs, rlen); break; case EXTENDED: if (UNIV_UNLIKELY(!rlen)) @@ -2782,10 +2782,7 @@ restart: break; case OPTION: if (rlen == 5 && *l == OPT_PAGE_CHECKSUM) - { - cl= l.copy_if_needed(iv, decrypt_buf, recs, rlen); - break; - } + goto copy_if_needed; /* fall through */ case RESERVED: continue; From da09ae05a9a744f184715e1eb35f2755681bd6b5 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 13 Jul 2023 10:59:39 +0200 Subject: [PATCH 164/171] MDEV-18114 Foreign Key Constraint actions don't affect Virtual Column * invoke check_expression() for all vcol_info's in mysql_prepare_create_table() to check for FK CASCADE * also check for SET NULL and SET DEFAULT * to check against existing FKs when a vcol is added in ALTER TABLE, old FKs must be added to the new_key_list just like other indexes are * check columns recursively, if vcol1 references vcol2, flags of vcol2 must be taken into account * remove check_table_name_processor(), put that logic under check_vcol_func_processor() to avoid walking the tree twice --- mysql-test/main/query_cache_innodb.result | 2 +- .../suite/gcol/r/innodb_virtual_basic.result | 2 +- .../suite/gcol/t/innodb_virtual_basic.test | 3 +- mysql-test/suite/innodb/r/stored_fk.result | 25 +++--- mysql-test/suite/innodb/t/stored_fk.test | 22 +++-- .../suite/vcol/r/innodb_virtual_fk.result | 70 +++++++++++++++ mysql-test/suite/vcol/r/vcol_syntax.result | 24 ++--- .../suite/vcol/t/innodb_virtual_fk.test | 89 +++++++++++++++++++ mysql-test/suite/vcol/t/vcol_syntax.test | 24 ++--- sql/item.h | 36 -------- sql/sql_alter.cc | 20 ++++- sql/sql_table.cc | 68 +++++++------- 12 files changed, 269 insertions(+), 116 deletions(-) diff --git a/mysql-test/main/query_cache_innodb.result b/mysql-test/main/query_cache_innodb.result index 62424ac362b..e5569c53d5f 100644 --- a/mysql-test/main/query_cache_innodb.result +++ b/mysql-test/main/query_cache_innodb.result @@ -85,7 +85,7 @@ t2id id use test; drop database `#mysql50#-`; SET NAMES default; -FOUND 8 /\[ERROR\] Invalid \(old\?\) table or database name/ in mysqld.1.err +FOUND 10 /\[ERROR\] Invalid \(old\?\) table or database name/ in mysqld.1.err set global query_cache_type=DEFAULT; set global query_cache_size=@save_query_cache_size; End of 10.2 tests diff --git a/mysql-test/suite/gcol/r/innodb_virtual_basic.result b/mysql-test/suite/gcol/r/innodb_virtual_basic.result index 5b599dc3520..3823887186b 100644 --- a/mysql-test/suite/gcol/r/innodb_virtual_basic.result +++ b/mysql-test/suite/gcol/r/innodb_virtual_basic.result @@ -1077,7 +1077,7 @@ KEY `a_2` (`a`,`vbidxcol`), KEY `vbidxcol_2` (`vbidxcol`,`d`), CONSTRAINT `fk_16` FOREIGN KEY (`a`) REFERENCES `ibstd_16` (`a`) ON DELETE SET NULL ) ENGINE=InnoDB; -DROP TABLE ibstd_16_fk; +ERROR HY000: Function or expression 'a' cannot be used in the GENERATED ALWAYS AS clause of `vadcol` CREATE TABLE `ibstd_16_fk` ( `a` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, diff --git a/mysql-test/suite/gcol/t/innodb_virtual_basic.test b/mysql-test/suite/gcol/t/innodb_virtual_basic.test index 00b942739b0..b64daa2bcdb 100644 --- a/mysql-test/suite/gcol/t/innodb_virtual_basic.test +++ b/mysql-test/suite/gcol/t/innodb_virtual_basic.test @@ -1014,7 +1014,7 @@ CREATE TABLE `ibstd_16` ( ) ENGINE=INNODB; # Block when FK constraint on base column of stored column. -#--error ER_CANNOT_ADD_FOREIGN +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED CREATE TABLE `ibstd_16_fk` ( `a` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, @@ -1033,7 +1033,6 @@ CREATE TABLE `ibstd_16_fk` ( KEY `vbidxcol_2` (`vbidxcol`,`d`), CONSTRAINT `fk_16` FOREIGN KEY (`a`) REFERENCES `ibstd_16` (`a`) ON DELETE SET NULL ) ENGINE=InnoDB; -DROP TABLE ibstd_16_fk; # Take out "KEY `a_2` (`a`,`vbidxcol`)", this should then be successful CREATE TABLE `ibstd_16_fk` ( diff --git a/mysql-test/suite/innodb/r/stored_fk.result b/mysql-test/suite/innodb/r/stored_fk.result index fc48f346656..542d362f3cf 100644 --- a/mysql-test/suite/innodb/r/stored_fk.result +++ b/mysql-test/suite/innodb/r/stored_fk.result @@ -1,19 +1,21 @@ -# Create statement with FK on base column of stored column -create table t1(f1 int, f2 int as(f1) stored, -foreign key(f1) references t2(f1) on delete cascade)engine=innodb; -ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed") -# adding new stored column during alter table copy operation. create table t1(f1 int primary key) engine=innodb; +# Create statement with FK on base column of stored column +create table t2(f1 int not null, f2 int as (f1) stored, +foreign key(f1) references t1(f1) on update cascade)engine=innodb; +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f2` +create table t2(f1 int not null, f2 int as (f1) virtual, f3 int as (f2) stored, +foreign key(f1) references t1(f1) on update cascade)engine=innodb; +ERROR HY000: Function or expression 'f2' cannot be used in the GENERATED ALWAYS AS clause of `f3` +# adding new stored column during alter table copy operation. create table t2(f1 int not null, f2 int as (f1) virtual, foreign key(f1) references t1(f1) on update cascade)engine=innodb; alter table t2 add column f3 int as (f1) stored, add column f4 int as (f1) virtual; +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f3` show create table t2; Table Create Table t2 CREATE TABLE `t2` ( `f1` int(11) NOT NULL, `f2` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL, - `f3` int(11) GENERATED ALWAYS AS (`f1`) STORED, - `f4` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL, KEY `f1` (`f1`), CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci @@ -21,26 +23,25 @@ drop table t2; # adding foreign key constraint for base columns during alter copy. create table t2(f1 int not null, f2 int as (f1) stored) engine=innodb; alter table t2 add foreign key(f1) references t1(f1) on update cascade, algorithm=copy; +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f2` show create table t2; Table Create Table t2 CREATE TABLE `t2` ( `f1` int(11) NOT NULL, - `f2` int(11) GENERATED ALWAYS AS (`f1`) STORED, - KEY `f1` (`f1`), - CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) ON UPDATE CASCADE + `f2` int(11) GENERATED ALWAYS AS (`f1`) STORED ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t2; # adding foreign key constraint for base columns during online alter. create table t2(f1 int not null, f2 int as (f1) stored) engine=innodb; set foreign_key_checks = 0; alter table t2 add foreign key(f1) references t1(f1) on update cascade, algorithm=inplace; -ERROR 0A000: Cannot add foreign key on the base column of stored column +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f2` drop table t2; # adding stored column via online alter. create table t2(f1 int not null, foreign key(f1) references t1(f1) on update cascade)engine=innodb; alter table t2 add column f2 int as (f1) stored, algorithm=inplace; -ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f2` drop table t2, t1; # # BUG#26731689 FK ON TABLE WITH GENERATED COLS: ASSERTION POS < N_DEF diff --git a/mysql-test/suite/innodb/t/stored_fk.test b/mysql-test/suite/innodb/t/stored_fk.test index b9c7c934555..571ca030d65 100644 --- a/mysql-test/suite/innodb/t/stored_fk.test +++ b/mysql-test/suite/innodb/t/stored_fk.test @@ -1,24 +1,28 @@ --source include/have_innodb.inc +create table t1(f1 int primary key) engine=innodb; + --echo # Create statement with FK on base column of stored column ---error ER_CANT_CREATE_TABLE -create table t1(f1 int, f2 int as(f1) stored, - foreign key(f1) references t2(f1) on delete cascade)engine=innodb; +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create table t2(f1 int not null, f2 int as (f1) stored, + foreign key(f1) references t1(f1) on update cascade)engine=innodb; + +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create table t2(f1 int not null, f2 int as (f1) virtual, f3 int as (f2) stored, + foreign key(f1) references t1(f1) on update cascade)engine=innodb; --echo # adding new stored column during alter table copy operation. -create table t1(f1 int primary key) engine=innodb; create table t2(f1 int not null, f2 int as (f1) virtual, foreign key(f1) references t1(f1) on update cascade)engine=innodb; -# MySQL 5.7 would refuse this -#--error ER_ERROR_ON_RENAME +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t2 add column f3 int as (f1) stored, add column f4 int as (f1) virtual; show create table t2; drop table t2; --echo # adding foreign key constraint for base columns during alter copy. create table t2(f1 int not null, f2 int as (f1) stored) engine=innodb; -# MySQL 5.7 would refuse this +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t2 add foreign key(f1) references t1(f1) on update cascade, algorithm=copy; show create table t2; drop table t2; @@ -26,14 +30,14 @@ drop table t2; --echo # adding foreign key constraint for base columns during online alter. create table t2(f1 int not null, f2 int as (f1) stored) engine=innodb; set foreign_key_checks = 0; ---error 138 +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t2 add foreign key(f1) references t1(f1) on update cascade, algorithm=inplace; drop table t2; --echo # adding stored column via online alter. create table t2(f1 int not null, foreign key(f1) references t1(f1) on update cascade)engine=innodb; ---error ER_ALTER_OPERATION_NOT_SUPPORTED +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t2 add column f2 int as (f1) stored, algorithm=inplace; drop table t2, t1; diff --git a/mysql-test/suite/vcol/r/innodb_virtual_fk.result b/mysql-test/suite/vcol/r/innodb_virtual_fk.result index 58db12583e2..5c0f717642f 100644 --- a/mysql-test/suite/vcol/r/innodb_virtual_fk.result +++ b/mysql-test/suite/vcol/r/innodb_virtual_fk.result @@ -10,3 +10,73 @@ select * from t2; id drop table t2; drop table t1; +# +# End of 10.2 tests +# +# +# MDEV-18114 Foreign Key Constraint actions don't affect Virtual Column +# +create table t1 (id int primary key); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update cascade); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on delete set null); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update set null); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id' cannot be used in the GENERATED ALWAYS AS clause of `id2` +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id' cannot be used in the GENERATED ALWAYS AS clause of `id2` +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id' cannot be used in the GENERATED ALWAYS AS clause of `id2` +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id2' cannot be used in the GENERATED ALWAYS AS clause of `id3` +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id2' cannot be used in the GENERATED ALWAYS AS clause of `id3` +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id2' cannot be used in the GENERATED ALWAYS AS clause of `id3` +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update cascade); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on delete set null); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update set null); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `id2` +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `id2` +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `id2` +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id2' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id2' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id2' cannot be used in the CHECK clause of `CONSTRAINT_1` +drop table if exists t2, t1; +Warnings: +Note 1051 Unknown table 'test.t2' +# +# End of 10.5 tests +# diff --git a/mysql-test/suite/vcol/r/vcol_syntax.result b/mysql-test/suite/vcol/r/vcol_syntax.result index f1a850e8f7c..144d4ab335d 100644 --- a/mysql-test/suite/vcol/r/vcol_syntax.result +++ b/mysql-test/suite/vcol/r/vcol_syntax.result @@ -54,22 +54,22 @@ set session sql_mode=@OLD_SQL_MODE; # create table t2 (x int); create table t1 (x int, y int generated always as (t2.x)); -ERROR 42S22: Unknown column '`t2`.`x`' in 'GENERATED ALWAYS' +ERROR HY000: Function or expression 't2.x' cannot be used in the GENERATED ALWAYS AS clause of `y` create table t1 (x int, y int check (y > t2.x)); -ERROR 42S22: Unknown column '`t2`.`x`' in 'CHECK' +ERROR HY000: Function or expression 't2.x' cannot be used in the CHECK clause of `y` create table t1 (x int, y int default t2.x); -ERROR 42S22: Unknown column '`t2`.`x`' in 'DEFAULT' +ERROR HY000: Function or expression 't2.x' cannot be used in the DEFAULT clause of `y` create table t1 (x int, check (t2.x > 0)); -ERROR 42S22: Unknown column '`t2`.`x`' in 'CHECK' +ERROR HY000: Function or expression 't2.x' cannot be used in the CHECK clause of `CONSTRAINT_1` create table t1 (x int); alter table t1 add column y int generated always as (t2.x); -ERROR 42S22: Unknown column '`t2`.`x`' in 'GENERATED ALWAYS' +ERROR HY000: Function or expression 't2.x' cannot be used in the GENERATED ALWAYS AS clause of `y` alter table t1 add column y int check (z > t2.x); -ERROR 42S22: Unknown column '`t2`.`x`' in 'CHECK' +ERROR HY000: Function or expression 't2.x' cannot be used in the CHECK clause of `y` alter table t1 add column y int default t2.x; -ERROR 42S22: Unknown column '`t2`.`x`' in 'DEFAULT' +ERROR HY000: Function or expression 't2.x' cannot be used in the DEFAULT clause of `y` alter table t1 add constraint check (t2.x > 0); -ERROR 42S22: Unknown column '`t2`.`x`' in 'CHECK' +ERROR HY000: Function or expression 't2.x' cannot be used in the CHECK clause of `CONSTRAINT_1` create or replace table t1 (x int, y int generated always as (t1.x)); create or replace table t1 (x int, y int check (y > t1.x)); create or replace table t1 (x int, y int default t1.x); @@ -80,13 +80,13 @@ create or replace table t1 (x int, y int default test.t1.x); create or replace table t1 (x int, check (test.t1.x > 0)); drop tables t1, t2; create table t1 (x int, y int generated always as (test2.t1.x)); -ERROR 42S22: Unknown column '`test2`.`t1`.`x`' in 'GENERATED ALWAYS' +ERROR HY000: Function or expression 'test2.t1.x' cannot be used in the GENERATED ALWAYS AS clause of `y` create table t1 (x int, y int check (y > test2.t1.x)); -ERROR 42S22: Unknown column '`test2`.`t1`.`x`' in 'CHECK' +ERROR HY000: Function or expression 'test2.t1.x' cannot be used in the CHECK clause of `y` create table t1 (x int, y int default test2.t1.x); -ERROR 42S22: Unknown column '`test2`.`t1`.`x`' in 'DEFAULT' +ERROR HY000: Function or expression 'test2.t1.x' cannot be used in the DEFAULT clause of `y` create table t1 (x int, check (test2.t1.x > 0)); -ERROR 42S22: Unknown column '`test2`.`t1`.`x`' in 'CHECK' +ERROR HY000: Function or expression 'test2.t1.x' cannot be used in the CHECK clause of `CONSTRAINT_1` # # MDEV-25672 table alias from previous statement interferes later commands # diff --git a/mysql-test/suite/vcol/t/innodb_virtual_fk.test b/mysql-test/suite/vcol/t/innodb_virtual_fk.test index c364adaa613..ed1d9c6c0cf 100644 --- a/mysql-test/suite/vcol/t/innodb_virtual_fk.test +++ b/mysql-test/suite/vcol/t/innodb_virtual_fk.test @@ -14,3 +14,92 @@ select * from t1; select * from t2; drop table t2; drop table t1; + +--echo # +--echo # End of 10.2 tests +--echo # + +--echo # +--echo # MDEV-18114 Foreign Key Constraint actions don't affect Virtual Column +--echo # +create table t1 (id int primary key); + +# note that RESTRICT, NO ACTION, and DELETE CASCADE are fine +# because they don't change values of referenced columns + +# virtual indexed +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update cascade); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on delete set null); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update set null); + +# stored +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update set null); + +# stored indirect +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update set null); + +# default +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update cascade); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on delete set null); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update set null); + +# field check +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update set null); + +# table check +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update set null); + +# table check indirect +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update set null); + +drop table if exists t2, t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/suite/vcol/t/vcol_syntax.test b/mysql-test/suite/vcol/t/vcol_syntax.test index cb741bc6def..da2ad27d37d 100644 --- a/mysql-test/suite/vcol/t/vcol_syntax.test +++ b/mysql-test/suite/vcol/t/vcol_syntax.test @@ -29,23 +29,23 @@ set session sql_mode=@OLD_SQL_MODE; --echo # create table t2 (x int); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int generated always as (t2.x)); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int check (y > t2.x)); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int default t2.x); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, check (t2.x > 0)); create table t1 (x int); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t1 add column y int generated always as (t2.x); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t1 add column y int check (z > t2.x); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t1 add column y int default t2.x; ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t1 add constraint check (t2.x > 0); create or replace table t1 (x int, y int generated always as (t1.x)); @@ -60,13 +60,13 @@ create or replace table t1 (x int, check (test.t1.x > 0)); drop tables t1, t2; ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int generated always as (test2.t1.x)); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int check (y > test2.t1.x)); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int default test2.t1.x); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, check (test2.t1.x > 0)); --echo # diff --git a/sql/item.h b/sql/item.h index d0f44f7218e..0c9c317ebba 100644 --- a/sql/item.h +++ b/sql/item.h @@ -2005,15 +2005,6 @@ public: return 0; } - /** - Check db/table_name if they defined in item and match arg values - - @param arg Pointer to Check_table_name_prm structure - - @retval true Match failed - @retval false Match succeeded - */ - virtual bool check_table_name_processor(void *arg) { return false; } /* TRUE if the expression depends only on the table indicated by tab_map or can be converted to such an exression using equalities. @@ -2213,15 +2204,6 @@ public: bool collect; }; - struct Check_table_name_prm - { - LEX_CSTRING db; - LEX_CSTRING table_name; - String field; - Check_table_name_prm(LEX_CSTRING _db, LEX_CSTRING _table_name) : - db(_db), table_name(_table_name) {} - }; - /* For SP local variable returns pointer to Item representing its current value and pointer to current Item otherwise. @@ -3592,24 +3574,6 @@ public: } return 0; } - bool check_table_name_processor(void *arg) override - { - Check_table_name_prm &p= *static_cast(arg); - if (!field && p.table_name.length && table_name.length) - { - DBUG_ASSERT(p.db.length); - if ((db_name.length && - my_strcasecmp(table_alias_charset, p.db.str, db_name.str)) || - my_strcasecmp(table_alias_charset, p.table_name.str, table_name.str)) - { - print(&p.field, (enum_query_type) (QT_ITEM_ORIGINAL_FUNC_NULLIF | - QT_NO_DATA_EXPANSION | - QT_TO_SYSTEM_CHARSET)); - return true; - } - } - return false; - } void cleanup() override; Item_equal *get_item_equal() override { return item_equal; } void set_item_equal(Item_equal *item_eq) override { item_equal= item_eq; } diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index 8bfd591532f..1d2e0b779a7 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -254,12 +254,25 @@ Alter_info::algorithm(const THD *thd) const uint Alter_info::check_vcol_field(Item_field *item) const { + if (!item->field && + ((item->db_name.length && !db.streq(item->db_name)) || + (item->table_name.length && !table_name.streq(item->table_name)))) + { + char *ptr= (char*)current_thd->alloc(item->db_name.length + + item->table_name.length + + item->field_name.length + 3); + strxmov(ptr, safe_str(item->db_name.str), item->db_name.length ? "." : "", + item->table_name.str, ".", item->field_name.str, NullS); + item->field_name.str= ptr; + return VCOL_IMPOSSIBLE; + } for (Key &k: key_list) { if (k.type != Key::FOREIGN_KEY) continue; Foreign_key *fk= (Foreign_key*) &k; - if (fk->update_opt != FK_OPTION_CASCADE) + if (fk->update_opt < FK_OPTION_CASCADE && + fk->delete_opt < FK_OPTION_SET_NULL) continue; for (Key_part_spec& kp: fk->columns) { @@ -267,6 +280,11 @@ uint Alter_info::check_vcol_field(Item_field *item) const return VCOL_NON_DETERMINISTIC; } } + for (Create_field &cf: create_list) + { + if (item->field_name.streq(cf.field_name)) + return cf.vcol_info ? cf.vcol_info->flags : 0; + } return 0; } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 327d2bad3ac..f1eec6b22a6 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4452,7 +4452,6 @@ without_overlaps_err: create_info->null_bits= null_fields; /* Check fields. */ - Item::Check_table_name_prm walk_prm(alter_info->db, alter_info->table_name); it.rewind(); while ((sql_field=it++)) { @@ -4510,33 +4509,22 @@ without_overlaps_err: if (create_simple) { - /* - NOTE: we cannot do this in check_vcol_func_processor() as there is - already no table name qualifier in expression. - */ if (sql_field->vcol_info && sql_field->vcol_info->expr && - sql_field->vcol_info->expr->walk(&Item::check_table_name_processor, - false, &walk_prm)) - { - my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "GENERATED ALWAYS"); + check_expression(sql_field->vcol_info, &sql_field->field_name, + sql_field->vcol_info->stored_in_db + ? VCOL_GENERATED_STORED : VCOL_GENERATED_VIRTUAL, + alter_info)) DBUG_RETURN(TRUE); - } if (sql_field->default_value && - sql_field->default_value->expr->walk(&Item::check_table_name_processor, - false, &walk_prm)) - { - my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "DEFAULT"); + check_expression(sql_field->default_value, &sql_field->field_name, + VCOL_DEFAULT, alter_info)) DBUG_RETURN(TRUE); - } if (sql_field->check_constraint && - sql_field->check_constraint->expr->walk(&Item::check_table_name_processor, - false, &walk_prm)) - { - my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "CHECK"); + check_expression(sql_field->check_constraint, &sql_field->field_name, + VCOL_CHECK_FIELD, alter_info)) DBUG_RETURN(TRUE); - } } } @@ -4546,12 +4534,6 @@ without_overlaps_err: List_iterator_fast c_it(alter_info->check_constraint_list); while (Virtual_column_info *check= c_it++) { - if (create_simple && check->expr->walk(&Item::check_table_name_processor, - false, &walk_prm)) - { - my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "CHECK"); - DBUG_RETURN(TRUE); - } if (check->name.length && !check->automatic_name) { /* Check that there's no repeating table CHECK constraint names. */ @@ -8438,6 +8420,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, List new_create_tail; /* New key definitions are added here */ List new_key_list; + List fk_list; List rename_key_list(alter_info->alter_rename_key_list); List_iterator drop_it(alter_info->drop_list); List_iterator def_it(alter_info->create_list); @@ -8460,12 +8443,13 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, bool drop_period= false; LEX_CSTRING period_start_name= {nullptr, 0}; LEX_CSTRING period_end_name= {nullptr, 0}; + DBUG_ENTER("mysql_prepare_alter_table"); + if (table->s->period.name) { period_start_name= table->s->period_start_field()->field_name; period_end_name= table->s->period_end_field()->field_name; } - DBUG_ENTER("mysql_prepare_alter_table"); /* Merge incompatible changes flag in case of upgrade of a table from an @@ -8526,6 +8510,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, create_info->option_list= merge_engine_table_options(table->s->option_list, create_info->option_list, thd->mem_root); + table->file->get_foreign_key_list(thd, &fk_list); + /* First collect all fields from table which isn't in drop_list */ @@ -9168,6 +9154,30 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, re_setup_keyinfo_hash(key_info); } } + { + // add existing foreign keys + for (auto &fk : fk_list) + { + Alter_drop *drop; + for(drop_it.rewind(); (drop=drop_it++); ) + if (drop->type == Alter_drop::FOREIGN_KEY && + !my_strcasecmp(system_charset_info, fk.foreign_id->str, drop->name)) + break; + if (drop) + continue; + List cols, ref_cols; + for (LEX_CSTRING &c : fk.foreign_fields) + cols.push_back(new (thd->mem_root) Key_part_spec(&c, 0)); + for (LEX_CSTRING &c : fk.referenced_fields) + ref_cols.push_back(new (thd->mem_root) Key_part_spec(&c, 0)); + auto key= new (thd->mem_root) + Foreign_key(fk.foreign_id, &cols, fk.foreign_id, fk.referenced_db, + fk.referenced_table, &ref_cols, fk.delete_method, fk.update_method, + Foreign_key::FK_MATCH_UNDEF, DDL_options()); + key->old= true; + new_key_list.push_back(key, thd->mem_root); + } + } { Key *key; while ((key=key_it++)) // Add new keys @@ -9291,10 +9301,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, if (!alter_info->check_constraint_list.is_empty()) { /* Check the table FOREIGN KEYs for name duplications. */ - List fk_child_key_list; FOREIGN_KEY_INFO *f_key; - table->file->get_foreign_key_list(thd, &fk_child_key_list); - List_iterator fk_key_it(fk_child_key_list); + List_iterator fk_key_it(fk_list); while ((f_key= fk_key_it++)) { List_iterator_fast From 61acb43689dad0002ba2d279f08bcf21cb1e3b49 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 1 Aug 2023 21:40:18 +0200 Subject: [PATCH 165/171] MDEV-31822 ALTER TABLE ENGINE=x started failing instead of producing warning on unsupported TRANSACTIONAL=1 make TRANSACTIONAL table option behave similar to other engine-defined table options. If the engine doesn't suport it: * if specified expicitly in CREATE or ALTER - it's ER_UNKNOWN_OPTION * an error or a warning depending on sql_mode IGNORE_BAD_TABLE_OPTIONS * in ALTER TABLE from the engine that suppors it to the engine that doesn't - silently preserved (no warning) * it is commented out in SHOW CREATE unless IGNORE_BAD_TABLE_OPTIONS --- mysql-test/main/create.result | 4 +- mysql-test/main/create.test | 2 +- mysql-test/main/myisam.result | 4 +- mysql-test/main/table_options.result | 101 +++++++++++++++++- mysql-test/main/table_options.test | 53 ++++++++- mysql-test/suite/maria/maria3.result | 4 +- .../suite/plugins/r/audit_null_debug.result | 5 - .../suite/plugins/t/audit_null_debug.test | 3 - sql/handler.h | 17 ++- sql/sql_show.cc | 5 + sql/sql_table.cc | 13 +-- 11 files changed, 177 insertions(+), 34 deletions(-) diff --git a/mysql-test/main/create.result b/mysql-test/main/create.result index 49e60dd9bcc..cec7452affd 100644 --- a/mysql-test/main/create.result +++ b/mysql-test/main/create.result @@ -1221,7 +1221,7 @@ drop table if exists t1,t2,t3; # Fix modified for MariaDB: we support this syntax create table t1 (a int) transactional=0; Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=0' +Warning 1911 Unknown option 'transactional' create table t2 (a int) page_checksum=1; create table t3 (a int) row_format=page; drop table t1,t2,t3; @@ -2019,7 +2019,7 @@ drop table t1; # MDEV-18428 Memory: If transactional=0 is specified in CREATE TABLE, it is not possible to ALTER TABLE # create table t1 (c int(10) unsigned) engine=memory transactional=0; -ERROR HY000: Table storage engine 'MEMORY' does not support the create option 'TRANSACTIONAL=0' +ERROR HY000: Unknown option 'transactional' # # End of 10.2 tests # diff --git a/mysql-test/main/create.test b/mysql-test/main/create.test index db8638ebe54..e9470edefab 100644 --- a/mysql-test/main/create.test +++ b/mysql-test/main/create.test @@ -1879,7 +1879,7 @@ drop table t1; --echo # --echo # MDEV-18428 Memory: If transactional=0 is specified in CREATE TABLE, it is not possible to ALTER TABLE --echo # ---error ER_ILLEGAL_HA_CREATE_OPTION +--error ER_UNKNOWN_OPTION create table t1 (c int(10) unsigned) engine=memory transactional=0; --echo # diff --git a/mysql-test/main/myisam.result b/mysql-test/main/myisam.result index e1e1a18dac2..9f907e6df1e 100644 --- a/mysql-test/main/myisam.result +++ b/mysql-test/main/myisam.result @@ -2415,13 +2415,13 @@ DROP TABLE t1; set statement sql_mode='' for create table t1 (n int not null, c char(1)) transactional=1; Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' +Warning 1911 Unknown option 'transactional' show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `n` int(11) NOT NULL, `c` char(1) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci TRANSACTIONAL=1 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci /* TRANSACTIONAL=1 */ drop table t1; CREATE TABLE t1 (line LINESTRING NOT NULL) engine=myisam; INSERT INTO t1 VALUES (GeomFromText("LINESTRING(0 0)")); diff --git a/mysql-test/main/table_options.result b/mysql-test/main/table_options.result index 60f25c96a0d..917c4716610 100644 --- a/mysql-test/main/table_options.result +++ b/mysql-test/main/table_options.result @@ -1,4 +1,3 @@ -drop table if exists t1; SET @OLD_SQL_MODE=@@SQL_MODE; SET SQL_MODE='IGNORE_BAD_TABLE_OPTIONS'; create table t1 (a int fkey=vvv, key akey (a) dff=vvv) tkey1='1v1'; @@ -180,3 +179,103 @@ SET SQL_MODE=''; create table t1 (a int fkey=vvv, key akey (a) dff=vvv) tkey1=1v1; ERROR HY000: Unknown option 'fkey' SET @@SQL_MODE=@OLD_SQL_MODE; +# +# End of 5.5 tests +# +# +# MDEV-31822 ALTER TABLE ENGINE=x started failing instead of producing warning on unsupported TRANSACTIONAL=1 +# +create table t0 (a int) transactional=0 engine=aria; +create table t1 (a int) transactional=1 engine=aria; +create table t2 (a int) transactional=default engine=aria; +show create table t0; +Table Create Table +t0 CREATE TABLE `t0` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 TRANSACTIONAL=0 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +alter table t0 engine=myisam; +alter table t1 engine=myisam; +alter table t2 engine=myisam; +show create table t0; +Table Create Table +t0 CREATE TABLE `t0` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 /* TRANSACTIONAL=0 */ +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 /* TRANSACTIONAL=1 */ +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +alter table t0 engine=myisam transactional=0; +ERROR HY000: Unknown option 'transactional' +alter table t1 engine=myisam transactional=1; +ERROR HY000: Unknown option 'transactional' +alter table t2 engine=myisam transactional=default; +ERROR HY000: Unknown option 'transactional' +set sql_mode=IGNORE_BAD_TABLE_OPTIONS; +alter table t0 engine=myisam transactional=0; +Warnings: +Warning 1911 Unknown option 'transactional' +alter table t1 engine=myisam transactional=1; +Warnings: +Warning 1911 Unknown option 'transactional' +alter table t2 engine=myisam transactional=default; +Warnings: +Warning 1911 Unknown option 'transactional' +show create table t0; +Table Create Table +t0 CREATE TABLE `t0` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci TRANSACTIONAL=0 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci TRANSACTIONAL=1 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table t0,t1,t2; +create table t1 (a int) foo=bar; +Warnings: +Warning 1911 Unknown option 'foo' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `foo`=bar +set sql_mode=default; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci /* `foo`=bar */ +alter table t1 engine=aria bar=foo; +ERROR HY000: Unknown option 'bar' +alter table t1 engine=aria; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 /* `foo`=bar */ +drop table t1; +# +# End of 10.5 tests +# diff --git a/mysql-test/main/table_options.test b/mysql-test/main/table_options.test index 533e6829c00..0605ce9ee0d 100644 --- a/mysql-test/main/table_options.test +++ b/mysql-test/main/table_options.test @@ -1,7 +1,3 @@ ---disable_warnings -drop table if exists t1; ---enable_warnings - SET @OLD_SQL_MODE=@@SQL_MODE; SET SQL_MODE='IGNORE_BAD_TABLE_OPTIONS'; @@ -66,3 +62,52 @@ SET SQL_MODE=''; create table t1 (a int fkey=vvv, key akey (a) dff=vvv) tkey1=1v1; SET @@SQL_MODE=@OLD_SQL_MODE; + +--echo # +--echo # End of 5.5 tests +--echo # + +--echo # +--echo # MDEV-31822 ALTER TABLE ENGINE=x started failing instead of producing warning on unsupported TRANSACTIONAL=1 +--echo # +create table t0 (a int) transactional=0 engine=aria; +create table t1 (a int) transactional=1 engine=aria; +create table t2 (a int) transactional=default engine=aria; +show create table t0; +show create table t1; +show create table t2; +alter table t0 engine=myisam; +alter table t1 engine=myisam; +alter table t2 engine=myisam; +show create table t0; +show create table t1; +show create table t2; +--error ER_UNKNOWN_OPTION +alter table t0 engine=myisam transactional=0; +--error ER_UNKNOWN_OPTION +alter table t1 engine=myisam transactional=1; +--error ER_UNKNOWN_OPTION +alter table t2 engine=myisam transactional=default; +set sql_mode=IGNORE_BAD_TABLE_OPTIONS; +alter table t0 engine=myisam transactional=0; +alter table t1 engine=myisam transactional=1; +alter table t2 engine=myisam transactional=default; +show create table t0; +show create table t1; +show create table t2; +drop table t0,t1,t2; + +# same behavior for other unknown options: +create table t1 (a int) foo=bar; +show create table t1; +set sql_mode=default; +show create table t1; +--error ER_UNKNOWN_OPTION +alter table t1 engine=aria bar=foo; +alter table t1 engine=aria; +show create table t1; +drop table t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/suite/maria/maria3.result b/mysql-test/suite/maria/maria3.result index a2fb1c8cb1d..c5b49a9d259 100644 --- a/mysql-test/suite/maria/maria3.result +++ b/mysql-test/suite/maria/maria3.result @@ -521,8 +521,6 @@ t1 CREATE TABLE `t1` ( drop table t1; create table t1 (n int not null, c char(1)) engine=aria transactional=1; alter table t1 engine=myisam; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' alter table t1 engine=aria; show create table t1; Table Create Table @@ -533,7 +531,7 @@ t1 CREATE TABLE `t1` ( drop table t1; create table t1 (n int not null, c char(1)) engine=myisam transactional=1; Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' +Warning 1911 Unknown option 'transactional' alter table t1 engine=aria; show create table t1; Table Create Table diff --git a/mysql-test/suite/plugins/r/audit_null_debug.result b/mysql-test/suite/plugins/r/audit_null_debug.result index 69a1fa5a866..c916b27f95e 100644 --- a/mysql-test/suite/plugins/r/audit_null_debug.result +++ b/mysql-test/suite/plugins/r/audit_null_debug.result @@ -1,9 +1,4 @@ -set @old_sql_mode= @@sql_mode; -set @@sql_mode= ''; alter table mysql.plugin engine=myisam; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' -set @@sql_mode= @old_sql_mode; set @old_dbug=@@debug_dbug; call mtr.add_suppression("Index for table.*mysql.plugin.MYI"); call mtr.add_suppression("Index for table 'plugin' is corrupt; try to repair it"); diff --git a/mysql-test/suite/plugins/t/audit_null_debug.test b/mysql-test/suite/plugins/t/audit_null_debug.test index ed1a59be033..52c50f13b74 100644 --- a/mysql-test/suite/plugins/t/audit_null_debug.test +++ b/mysql-test/suite/plugins/t/audit_null_debug.test @@ -5,10 +5,7 @@ if (!$ADT_NULL_SO) { skip No NULL_AUDIT plugin; } -set @old_sql_mode= @@sql_mode; -set @@sql_mode= ''; alter table mysql.plugin engine=myisam; -set @@sql_mode= @old_sql_mode; set @old_dbug=@@debug_dbug; call mtr.add_suppression("Index for table.*mysql.plugin.MYI"); diff --git a/sql/handler.h b/sql/handler.h index e28cb871fbd..67245850d62 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -3548,7 +3548,7 @@ public: - How things are tracked in trx and in add_changed_table(). - If we can combine several statements under one commit in the binary log. */ - bool has_transactions() + bool has_transactions() const { return ((ha_table_flags() & (HA_NO_TRANSACTIONS | HA_PERSISTENT_TABLE)) == 0); @@ -3559,24 +3559,33 @@ public: we don't have to write failed statements to the log as they can be rolled back. */ - bool has_transactions_and_rollback() + bool has_transactions_and_rollback() const { return has_transactions() && has_rollback(); } /* True if the underlaying table support transactions and rollback */ - bool has_transaction_manager() + bool has_transaction_manager() const { return ((ha_table_flags() & HA_NO_TRANSACTIONS) == 0 && has_rollback()); } + /* + True if the underlaying table support TRANSACTIONAL table option + */ + bool has_transactional_option() const + { + extern handlerton *maria_hton; + return partition_ht() == maria_hton || has_transaction_manager(); + } + /* True if table has rollback. Used to check if an update on the table can be killed fast. */ - bool has_rollback() + bool has_rollback() const { return ((ht->flags & HTON_NO_ROLLBACK) == 0); } diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 1f1e7d67a2a..a194068d2b0 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1956,8 +1956,13 @@ static void add_table_options(THD *thd, TABLE *table, } if (share->transactional != HA_CHOICE_UNDEF) { + bool do_comment= !table->file->has_transactional_option() && check_options; + if (do_comment) + packet->append(STRING_WITH_LEN(" /*")); packet->append(STRING_WITH_LEN(" TRANSACTIONAL=")); packet->append(ha_choice_values[(uint) share->transactional], 1); + if (do_comment) + packet->append(STRING_WITH_LEN(" */")); } if (share->table_type == TABLE_TYPE_SEQUENCE) packet->append(STRING_WITH_LEN(" SEQUENCE=1")); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index f1eec6b22a6..8366e571f26 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4577,15 +4577,10 @@ without_overlaps_err: } /* Give warnings for not supported table options */ - extern handlerton *maria_hton; - if (file->partition_ht() != maria_hton && create_info->transactional && - !file->has_transaction_manager()) - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_ILLEGAL_HA_CREATE_OPTION, - ER_THD(thd, ER_ILLEGAL_HA_CREATE_OPTION), - file->engine_name()->str, - create_info->transactional == HA_CHOICE_YES - ? "TRANSACTIONAL=1" : "TRANSACTIONAL=0"); + if (create_info->used_fields & HA_CREATE_USED_TRANSACTIONAL && + !file->has_transactional_option()) + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_OPTION, + ER_THD(thd, ER_UNKNOWN_OPTION), "transactional"); if (parse_option_list(thd, file->partition_ht(), &create_info->option_struct, &create_info->option_list, From a89527e127bce21918b4d49f5d015a59cc5971ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 2 Aug 2023 19:28:12 +0300 Subject: [PATCH 166/171] MDEV-31827 InnoDB multi-batch recovery stops prematurely recv_scan_log(): On recv_sys_t::PREMATURE_EOF, keep reading more log if recv_sys.lsn < recv_sys.scanned_lsn. recv_recovery_from_checkpoint_start(): Add a safety check to abort crash recovery if recv_sys.lsn is not recv_sys.scanned_lsn. This fixes a serious database corruption bug that was introduced by commit 2f9e264781f702b8da1ed418ac9f4f5e8f8aa843 (MDEV-29911). --- storage/innobase/log/log0recv.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 6f58be6ed35..f078a98acca 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -4147,7 +4147,8 @@ static bool recv_scan_log(bool last_phase) if (recv_sys.is_corrupt_log()) break; - if (recv_sys.offset < log_sys.get_block_size()) + if (recv_sys.offset < log_sys.get_block_size() && + recv_sys.lsn == recv_sys.scanned_lsn) goto got_eof; if (recv_sys.offset > buf_size / 4 || @@ -4662,6 +4663,13 @@ err_exit: } mysql_mutex_lock(&recv_sys.mutex); + if (UNIV_UNLIKELY(recv_sys.scanned_lsn != recv_sys.lsn) + && log_sys.is_latest()) { + ut_ad("log parsing error" == 0); + mysql_mutex_unlock(&recv_sys.mutex); + err = DB_CORRUPTION; + goto early_exit; + } recv_sys.apply_log_recs = true; recv_no_ibuf_operations = false; ut_d(recv_no_log_write = srv_operation == SRV_OPERATION_RESTORE From 8e8c020fb37e7f8e127cfa619b358bba20af2136 Mon Sep 17 00:00:00 2001 From: Oleg Smirnov Date: Wed, 26 Jul 2023 19:09:32 +0700 Subject: [PATCH 167/171] MDEV-31743 Server crash in store_length, assertion failure in Type_handler_string_result::sort_length After MDEV-21580 the truncation of SORT_FIELD::length set_if_smaller(sortorder->length, thd->variables.max_sort_length) became conditional: if (is_variable_sized()) set_if_smaller(length, thd->variables.max_sort_length) To provide correct functioning of is_variable_sized() SORT_FIELD::type must be set properly. This commit adds the necessary initialization of SORT_FIELD::type to JOIN_TAB::remove_duplicates() as it is done in filesort's sortlength() function. DBUG_ASSERT is added to sortlength() just in case to prevent a possible uint32 overflow --- mysql-test/main/distinct.result | 11 +++++++++++ mysql-test/main/distinct.test | 12 ++++++++++++ sql/filesort.cc | 3 ++- sql/sql_select.cc | 3 +++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/distinct.result b/mysql-test/main/distinct.result index ac693421ba2..ec9253837be 100644 --- a/mysql-test/main/distinct.result +++ b/mysql-test/main/distinct.result @@ -1180,5 +1180,16 @@ a 1 drop table t1,t2; # +# MDEV-31743 Server crash in store_length, assertion failure in +# Type_handler_string_result::sort_length +# +create table t1 (a int, b longtext, c varchar(18)); +insert into t1 values (1, 'Aa123456', 'abc'), (2, 'Bb7897777', 'def'), +(3, 'Cc01287', 'xyz'), (5, 'd12345', 'efg'); +select distinct if(sum(a), b, 0) from t1 group by value(c) with rollup; +if(sum(a), b, 0) +Aa123456 +drop table t1; +# # end of 10.5 tests # diff --git a/mysql-test/main/distinct.test b/mysql-test/main/distinct.test index 6737600ea84..0658949597c 100644 --- a/mysql-test/main/distinct.test +++ b/mysql-test/main/distinct.test @@ -914,6 +914,18 @@ select distinct a from t1 where t1.a=1 and t1.a in (select a+0 from t2 where t2. select distinct a from t1 where t1.a=1 and t1.a in (select a+0 from t2 where t2.b in (1,2)) limit 0,1; drop table t1,t2; +--echo # +--echo # MDEV-31743 Server crash in store_length, assertion failure in +--echo # Type_handler_string_result::sort_length +--echo # + +create table t1 (a int, b longtext, c varchar(18)); +insert into t1 values (1, 'Aa123456', 'abc'), (2, 'Bb7897777', 'def'), + (3, 'Cc01287', 'xyz'), (5, 'd12345', 'efg'); + +select distinct if(sum(a), b, 0) from t1 group by value(c) with rollup; +drop table t1; + --echo # --echo # end of 10.5 tests --echo # diff --git a/sql/filesort.cc b/sql/filesort.cc index 262ffecb882..5f23df22342 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -2275,7 +2275,8 @@ sortlength(THD *thd, Sort_keys *sort_keys, bool *allow_packing_for_sortkeys) set_if_smaller(sortorder->length, thd->variables.max_sort_length); set_if_smaller(sortorder->original_length, thd->variables.max_sort_length); } - length+=sortorder->length; + DBUG_ASSERT(length < UINT_MAX32 - sortorder->length); + length+= sortorder->length; sort_keys->increment_size_of_packable_fields(sortorder->length_bytes); sort_keys->increment_original_sort_length(sortorder->original_length); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 7a7f2c0b26b..d7797fef775 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -24629,6 +24629,9 @@ JOIN_TAB::remove_duplicates() { /* Item is not stored in temporary table, remember it */ sorder->item= item; + sorder->type= sorder->item->type_handler()->is_packable() ? + SORT_FIELD_ATTR::VARIABLE_SIZE : + SORT_FIELD_ATTR::FIXED_SIZE; /* Calculate sorder->length */ item->type_handler()->sort_length(thd, item, sorder); sorder++; From 6b8310c27aa44469741c67a49d08fc4bdfb7003d Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Fri, 4 Aug 2023 10:11:03 +0200 Subject: [PATCH 168/171] fix postmerge 32bit tests --- .../r/sysvars_server_notembedded,32bit.rdiff | 308 +++++++++--------- 1 file changed, 154 insertions(+), 154 deletions(-) diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff index d4852f1aef9..39deee979d0 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff @@ -1,5 +1,5 @@ ---- ../../mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result 2021-05-12 15:30:19.783373551 +0530 -+++ ../../mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.reject 2021-05-12 15:32:40.170343130 +0530 +--- sysvars_server_notembedded.result 2023-08-01 16:37:40.350222956 +0200 ++++ sysvars_server_notembedded,32bit.result 2023-08-04 10:09:14.211943206 +0200 @@ -34,7 +34,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_BLOCK_SIZE @@ -45,7 +45,7 @@ VARIABLE_COMMENT Interval between commits in microseconds (1/1000000 sec). 0 stands for no waiting for other threads to come and do a commit in "hard" mode and no sync()/commit at all in "soft" mode. Option has only an effect if aria_group_commit is used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -104,7 +104,7 @@ +@@ -114,7 +114,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_LOG_FILE_SIZE VARIABLE_SCOPE GLOBAL @@ -54,7 +54,7 @@ VARIABLE_COMMENT Limit for transaction log size NUMERIC_MIN_VALUE 8388608 NUMERIC_MAX_VALUE 4294967295 -@@ -134,10 +134,10 @@ +@@ -144,10 +144,10 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_AGE_THRESHOLD VARIABLE_SCOPE GLOBAL @@ -67,7 +67,7 @@ NUMERIC_BLOCK_SIZE 100 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -154,7 +154,7 @@ +@@ -164,7 +164,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_DIVISION_LIMIT VARIABLE_SCOPE GLOBAL @@ -76,7 +76,7 @@ VARIABLE_COMMENT The minimum percentage of warm blocks in key cache NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100 -@@ -164,7 +164,7 @@ +@@ -174,7 +174,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_PAGECACHE_FILE_HASH_SIZE VARIABLE_SCOPE GLOBAL @@ -85,7 +85,7 @@ VARIABLE_COMMENT Number of hash buckets for open and changed files. If you have a lot of Aria files open you should increase this for faster flush of changes. A good value is probably 1/10 of number of possible open Aria files. NUMERIC_MIN_VALUE 128 NUMERIC_MAX_VALUE 16384 -@@ -194,7 +194,7 @@ +@@ -204,7 +204,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ARIA_REPAIR_THREADS VARIABLE_SCOPE SESSION @@ -94,16 +94,16 @@ VARIABLE_COMMENT Number of threads to use when repairing Aria tables. The value of 1 disables parallel repair. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -207,7 +207,7 @@ +@@ -217,7 +217,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. - NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 9223372036854775807 -+NUMERIC_MAX_VALUE 2147483647 + NUMERIC_MIN_VALUE 16376 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -264,7 +264,7 @@ +@@ -274,7 +274,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME AUTO_INCREMENT_INCREMENT VARIABLE_SCOPE SESSION @@ -112,7 +112,7 @@ VARIABLE_COMMENT Auto-increment columns are incremented by this NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -274,7 +274,7 @@ +@@ -284,7 +284,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME AUTO_INCREMENT_OFFSET VARIABLE_SCOPE SESSION @@ -121,7 +121,7 @@ VARIABLE_COMMENT Offset added to Auto-increment columns. Used when auto-increment-increment != 1 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 65535 -@@ -284,7 +284,7 @@ +@@ -294,7 +294,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME BACK_LOG VARIABLE_SCOPE GLOBAL @@ -130,7 +130,7 @@ VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -337,7 +337,7 @@ +@@ -347,7 +347,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the transactional cache for updates to transactional engines for the binary log. If you often use transactions containing many statements, you can increase this to get more performance NUMERIC_MIN_VALUE 4096 @@ -139,7 +139,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -354,20 +354,20 @@ +@@ -364,20 +364,20 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME BINLOG_COMMIT_WAIT_COUNT VARIABLE_SCOPE GLOBAL @@ -164,7 +164,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -384,7 +384,7 @@ +@@ -394,7 +394,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME BINLOG_EXPIRE_LOGS_SECONDS VARIABLE_SCOPE GLOBAL @@ -173,7 +173,7 @@ VARIABLE_COMMENT If non-zero, binary logs will be purged after binlog_expire_logs_seconds seconds; It and expire_logs_days are linked, such that changes in one are converted into the other. Possible purges happen at startup and at binary log rotation. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 8553600 -@@ -397,7 +397,7 @@ +@@ -407,7 +407,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of file cache for the binary log NUMERIC_MIN_VALUE 8192 @@ -182,7 +182,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -447,7 +447,7 @@ +@@ -457,7 +457,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the statement cache for updates to non-transactional engines for the binary log. If you often use statements updating a great number of rows, you can increase this to get more performance. NUMERIC_MIN_VALUE 4096 @@ -191,7 +191,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -457,7 +457,7 @@ +@@ -467,7 +467,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Size of tree cache used in bulk insert optimisation. Note that this is a limit per thread! NUMERIC_MIN_VALUE 0 @@ -200,7 +200,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -644,7 +644,7 @@ +@@ -654,7 +654,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME CONNECT_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -209,7 +209,7 @@ VARIABLE_COMMENT The number of seconds the mysqld server is waiting for a connect packet before responding with 'Bad handshake' NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 31536000 -@@ -694,7 +694,7 @@ +@@ -704,7 +704,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_SEARCH_DEPTH_LONG VARIABLE_SCOPE SESSION @@ -218,7 +218,7 @@ VARIABLE_COMMENT Long search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 33 -@@ -704,7 +704,7 @@ +@@ -714,7 +714,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_SEARCH_DEPTH_SHORT VARIABLE_SCOPE SESSION @@ -227,7 +227,7 @@ VARIABLE_COMMENT Short search depth for the two-step deadlock detection NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 32 -@@ -714,7 +714,7 @@ +@@ -724,7 +724,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_TIMEOUT_LONG VARIABLE_SCOPE SESSION @@ -236,7 +236,7 @@ VARIABLE_COMMENT Long timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -724,7 +724,7 @@ +@@ -734,7 +734,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DEADLOCK_TIMEOUT_SHORT VARIABLE_SCOPE SESSION @@ -245,7 +245,7 @@ VARIABLE_COMMENT Short timeout for the two-step deadlock detection (in microseconds) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -784,7 +784,7 @@ +@@ -794,7 +794,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME DEFAULT_WEEK_FORMAT VARIABLE_SCOPE SESSION @@ -254,7 +254,7 @@ VARIABLE_COMMENT The default week format used by WEEK() functions NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 7 -@@ -794,7 +794,7 @@ +@@ -804,7 +804,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_INSERT_LIMIT VARIABLE_SCOPE GLOBAL @@ -263,7 +263,7 @@ VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -804,7 +804,7 @@ +@@ -814,7 +814,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_INSERT_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -272,7 +272,7 @@ VARIABLE_COMMENT How long a INSERT DELAYED thread should wait for INSERT statements before terminating NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -814,7 +814,7 @@ +@@ -824,7 +824,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME DELAYED_QUEUE_SIZE VARIABLE_SCOPE GLOBAL @@ -281,7 +281,7 @@ VARIABLE_COMMENT What size queue (in rows) should be allocated for handling INSERT DELAYED. If the queue becomes full, any client that does INSERT DELAYED will wait until there is room in the queue again NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -844,7 +844,7 @@ +@@ -854,7 +854,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME DIV_PRECISION_INCREMENT VARIABLE_SCOPE SESSION @@ -290,7 +290,7 @@ VARIABLE_COMMENT Precision of the result of '/' operator will be increased on that value NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 38 -@@ -964,7 +964,7 @@ +@@ -974,7 +974,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME EXTRA_MAX_CONNECTIONS VARIABLE_SCOPE GLOBAL @@ -299,7 +299,7 @@ VARIABLE_COMMENT The number of connections on extra-port NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100000 -@@ -994,7 +994,7 @@ +@@ -1004,7 +1004,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME FLUSH_TIME VARIABLE_SCOPE GLOBAL @@ -308,7 +308,7 @@ VARIABLE_COMMENT A dedicated thread is created to flush all tables at the given interval NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -1024,7 +1024,7 @@ +@@ -1034,7 +1034,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_MAX_WORD_LEN VARIABLE_SCOPE GLOBAL @@ -317,7 +317,7 @@ VARIABLE_COMMENT The maximum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -1034,7 +1034,7 @@ +@@ -1044,7 +1044,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_MIN_WORD_LEN VARIABLE_SCOPE GLOBAL @@ -326,7 +326,7 @@ VARIABLE_COMMENT The minimum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 84 -@@ -1044,7 +1044,7 @@ +@@ -1054,7 +1054,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME FT_QUERY_EXPANSION_LIMIT VARIABLE_SCOPE GLOBAL @@ -335,7 +335,7 @@ VARIABLE_COMMENT Number of best matches to use for query expansion NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 -@@ -1294,7 +1294,7 @@ +@@ -1304,7 +1304,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME HISTOGRAM_SIZE VARIABLE_SCOPE SESSION @@ -344,7 +344,7 @@ VARIABLE_COMMENT Number of bytes used for a histogram. If set to 0, no histograms are created by ANALYZE. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -1324,7 +1324,7 @@ +@@ -1334,7 +1334,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME HOST_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -353,7 +353,7 @@ VARIABLE_COMMENT How many host names should be cached to avoid resolving. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65536 -@@ -1434,7 +1434,7 @@ +@@ -1444,7 +1444,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME INTERACTIVE_TIMEOUT VARIABLE_SCOPE SESSION @@ -362,7 +362,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on an interactive connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -1467,7 +1467,7 @@ +@@ -1477,7 +1477,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the buffer that is used for joins NUMERIC_MIN_VALUE 128 @@ -371,7 +371,7 @@ NUMERIC_BLOCK_SIZE 128 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1484,7 +1484,7 @@ +@@ -1494,7 +1494,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME JOIN_CACHE_LEVEL VARIABLE_SCOPE SESSION @@ -380,7 +380,7 @@ VARIABLE_COMMENT Controls what join operations can be executed with join buffers. Odd numbers are used for plain join buffers while even numbers are used for linked buffers NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 8 -@@ -1507,7 +1507,7 @@ +@@ -1517,7 +1517,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The size of the buffer used for index blocks for MyISAM tables. Increase this to get better index handling (for all reads and multiple writes) to as much as you can afford NUMERIC_MIN_VALUE 0 @@ -389,7 +389,7 @@ NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1674,7 +1674,7 @@ +@@ -1684,7 +1684,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME LOCK_WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -398,7 +398,7 @@ VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -1824,7 +1824,7 @@ +@@ -1834,7 +1834,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_SLOW_RATE_LIMIT VARIABLE_SCOPE SESSION @@ -407,7 +407,7 @@ VARIABLE_COMMENT Write to slow log every #th slow query. Set to 1 to log everything. Increase it to reduce the size of the slow or the performance impact of slow logging NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1854,7 +1854,7 @@ +@@ -1864,7 +1864,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME LOG_WARNINGS VARIABLE_SCOPE SESSION @@ -416,7 +416,7 @@ VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1914,7 +1914,7 @@ +@@ -1924,7 +1924,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MAX_ALLOWED_PACKET VARIABLE_SCOPE SESSION @@ -425,7 +425,7 @@ VARIABLE_COMMENT Max packet length to send to or receive from the server NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -1927,14 +1927,14 @@ +@@ -1937,14 +1937,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the transactional cache NUMERIC_MIN_VALUE 4096 @@ -442,7 +442,7 @@ VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 1073741824 -@@ -1947,14 +1947,14 @@ +@@ -1957,14 +1957,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the total size of the statement cache NUMERIC_MIN_VALUE 4096 @@ -459,7 +459,7 @@ VARIABLE_COMMENT The number of simultaneous clients allowed NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 100000 -@@ -1964,7 +1964,7 @@ +@@ -1974,7 +1974,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_CONNECT_ERRORS VARIABLE_SCOPE GLOBAL @@ -468,7 +468,7 @@ VARIABLE_COMMENT If there is more than this number of interrupted connections from a host this host will be blocked from further connections NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -1974,7 +1974,7 @@ +@@ -1984,7 +1984,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_DELAYED_THREADS VARIABLE_SCOPE SESSION @@ -477,7 +477,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -1994,7 +1994,7 @@ +@@ -2004,7 +2004,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_ERROR_COUNT VARIABLE_SCOPE SESSION @@ -486,7 +486,7 @@ VARIABLE_COMMENT Max number of errors/warnings to store for a statement NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 65535 -@@ -2007,14 +2007,14 @@ +@@ -2017,14 +2017,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Don't allow creation of heap tables bigger than this NUMERIC_MIN_VALUE 16384 @@ -503,7 +503,7 @@ VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -2034,7 +2034,7 @@ +@@ -2044,7 +2044,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_LENGTH_FOR_SORT_DATA VARIABLE_SCOPE SESSION @@ -512,7 +512,7 @@ VARIABLE_COMMENT Max number of bytes in sorted records NUMERIC_MIN_VALUE 4 NUMERIC_MAX_VALUE 8388608 -@@ -2064,7 +2064,7 @@ +@@ -2074,7 +2074,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_RECURSIVE_ITERATIONS VARIABLE_SCOPE SESSION @@ -521,7 +521,7 @@ VARIABLE_COMMENT Maximum number of iterations when executing recursive queries NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2087,14 +2087,14 @@ +@@ -2097,14 +2097,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The maximum size of the container of a rowid filter NUMERIC_MIN_VALUE 1024 @@ -538,7 +538,7 @@ VARIABLE_COMMENT Limit assumed max number of seeks when looking up rows based on a key NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2114,7 +2114,7 @@ +@@ -2124,7 +2124,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SORT_LENGTH VARIABLE_SCOPE SESSION @@ -547,7 +547,7 @@ VARIABLE_COMMENT The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored) NUMERIC_MIN_VALUE 64 NUMERIC_MAX_VALUE 8388608 -@@ -2124,7 +2124,7 @@ +@@ -2134,7 +2134,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_SP_RECURSION_DEPTH VARIABLE_SCOPE SESSION @@ -556,7 +556,7 @@ VARIABLE_COMMENT Maximum stored procedure recursion depth NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 255 -@@ -2144,7 +2144,7 @@ +@@ -2154,7 +2154,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_TMP_TABLES VARIABLE_SCOPE SESSION @@ -565,7 +565,7 @@ VARIABLE_COMMENT Unused, will be removed. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2164,7 +2164,7 @@ +@@ -2174,7 +2174,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MAX_WRITE_LOCK_COUNT VARIABLE_SCOPE GLOBAL @@ -574,7 +574,7 @@ VARIABLE_COMMENT After this many write locks, allow some read locks to run in between NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2174,7 +2174,7 @@ +@@ -2184,7 +2184,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -583,7 +583,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1048576 -@@ -2184,7 +2184,7 @@ +@@ -2194,7 +2194,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME METADATA_LOCKS_HASH_INSTANCES VARIABLE_SCOPE GLOBAL @@ -592,7 +592,7 @@ VARIABLE_COMMENT Unused NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -2194,7 +2194,7 @@ +@@ -2204,7 +2204,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MIN_EXAMINED_ROW_LIMIT VARIABLE_SCOPE SESSION @@ -601,7 +601,7 @@ VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2204,7 +2204,7 @@ +@@ -2214,7 +2214,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MRR_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -610,7 +610,7 @@ VARIABLE_COMMENT Size of buffer to use when using MRR with range access NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -2214,7 +2214,7 @@ +@@ -2224,7 +2224,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_BLOCK_SIZE VARIABLE_SCOPE GLOBAL @@ -619,7 +619,7 @@ VARIABLE_COMMENT Block size to be used for MyISAM index pages NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 16384 -@@ -2224,7 +2224,7 @@ +@@ -2234,7 +2234,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME MYISAM_DATA_POINTER_SIZE VARIABLE_SCOPE GLOBAL @@ -628,7 +628,7 @@ VARIABLE_COMMENT Default pointer size to be used for MyISAM tables NUMERIC_MIN_VALUE 2 NUMERIC_MAX_VALUE 7 -@@ -2247,7 +2247,7 @@ +@@ -2257,7 +2257,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Restricts the total memory used for memory mapping of MySQL tables NUMERIC_MIN_VALUE 7 @@ -637,7 +637,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -2264,10 +2264,10 @@ +@@ -2274,10 +2274,10 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME MYISAM_REPAIR_THREADS VARIABLE_SCOPE SESSION @@ -650,16 +650,16 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2277,7 +2277,7 @@ +@@ -2287,7 +2287,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -2314,7 +2314,7 @@ +@@ -2324,7 +2324,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME NET_BUFFER_LENGTH VARIABLE_SCOPE SESSION @@ -668,7 +668,7 @@ VARIABLE_COMMENT Buffer length for TCP/IP and socket communication NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1048576 -@@ -2324,7 +2324,7 @@ +@@ -2334,7 +2334,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_READ_TIMEOUT VARIABLE_SCOPE SESSION @@ -677,7 +677,7 @@ VARIABLE_COMMENT Number of seconds to wait for more data from a connection before aborting the read NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2334,7 +2334,7 @@ +@@ -2344,7 +2344,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_RETRY_COUNT VARIABLE_SCOPE SESSION @@ -686,7 +686,7 @@ VARIABLE_COMMENT If a read on a communication port is interrupted, retry this many times before giving up NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -2344,7 +2344,7 @@ +@@ -2354,7 +2354,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME NET_WRITE_TIMEOUT VARIABLE_SCOPE SESSION @@ -695,7 +695,7 @@ VARIABLE_COMMENT Number of seconds to wait for a block to be written to a connection before aborting the write NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -2394,7 +2394,7 @@ +@@ -2404,7 +2404,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME OPEN_FILES_LIMIT VARIABLE_SCOPE GLOBAL @@ -704,7 +704,7 @@ VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 or autoset then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2404,17 +2404,17 @@ +@@ -2414,17 +2414,17 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARG_WEIGHT VARIABLE_SCOPE SESSION @@ -725,7 +725,7 @@ VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search; 1 - prune plans based on number of retrieved rows NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1 -@@ -2424,7 +2424,7 @@ +@@ -2434,7 +2434,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SEARCH_DEPTH VARIABLE_SCOPE SESSION @@ -734,7 +734,7 @@ VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2434,7 +2434,7 @@ +@@ -2444,7 +2444,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SELECTIVITY_SAMPLING_LIMIT VARIABLE_SCOPE SESSION @@ -743,7 +743,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2464,17 +2464,17 @@ +@@ -2474,17 +2474,17 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_TRACE_MAX_MEM_SIZE VARIABLE_SCOPE SESSION @@ -764,7 +764,7 @@ VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join.5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2494,7 +2494,7 @@ +@@ -2504,7 +2504,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME PERFORMANCE_SCHEMA_ACCOUNTS_SIZE VARIABLE_SCOPE GLOBAL @@ -773,7 +773,7 @@ VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2504,7 +2504,7 @@ +@@ -2514,7 +2514,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_DIGESTS_SIZE VARIABLE_SCOPE GLOBAL @@ -782,7 +782,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2514,7 +2514,7 @@ +@@ -2524,7 +2524,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -791,7 +791,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2524,7 +2524,7 @@ +@@ -2534,7 +2534,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -800,7 +800,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2534,7 +2534,7 @@ +@@ -2544,7 +2544,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -809,7 +809,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2544,7 +2544,7 @@ +@@ -2554,7 +2554,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -818,7 +818,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2554,7 +2554,7 @@ +@@ -2564,7 +2564,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -827,7 +827,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_TRANSACTIONS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2564,7 +2564,7 @@ +@@ -2574,7 +2574,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -836,7 +836,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_TRANSACTIONS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2574,7 +2574,7 @@ +@@ -2584,7 +2584,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -845,7 +845,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2584,7 +2584,7 @@ +@@ -2594,7 +2594,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -854,7 +854,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2594,7 +2594,7 @@ +@@ -2604,7 +2604,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_HOSTS_SIZE VARIABLE_SCOPE GLOBAL @@ -863,7 +863,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2604,7 +2604,7 @@ +@@ -2614,7 +2614,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_CLASSES VARIABLE_SCOPE GLOBAL @@ -872,7 +872,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2614,7 +2614,7 @@ +@@ -2624,7 +2624,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_INSTANCES VARIABLE_SCOPE GLOBAL @@ -881,7 +881,7 @@ VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2624,7 +2624,7 @@ +@@ -2634,7 +2634,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_DIGEST_LENGTH VARIABLE_SCOPE GLOBAL @@ -890,7 +890,7 @@ VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2634,7 +2634,7 @@ +@@ -2644,7 +2644,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_CLASSES VARIABLE_SCOPE GLOBAL @@ -899,7 +899,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2644,7 +2644,7 @@ +@@ -2654,7 +2654,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_HANDLES VARIABLE_SCOPE GLOBAL @@ -908,7 +908,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2654,7 +2654,7 @@ +@@ -2664,7 +2664,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -917,7 +917,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2664,7 +2664,7 @@ +@@ -2674,7 +2674,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_INDEX_STAT VARIABLE_SCOPE GLOBAL @@ -926,7 +926,7 @@ VARIABLE_COMMENT Maximum number of index statistics for instrumented tables. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2674,7 +2674,7 @@ +@@ -2684,7 +2684,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MEMORY_CLASSES VARIABLE_SCOPE GLOBAL @@ -935,7 +935,7 @@ VARIABLE_COMMENT Maximum number of memory pool instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2684,7 +2684,7 @@ +@@ -2694,7 +2694,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_METADATA_LOCKS VARIABLE_SCOPE GLOBAL @@ -944,7 +944,7 @@ VARIABLE_COMMENT Maximum number of metadata locks. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2694,7 +2694,7 @@ +@@ -2704,7 +2704,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_CLASSES VARIABLE_SCOPE GLOBAL @@ -953,7 +953,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2704,7 +2704,7 @@ +@@ -2714,7 +2714,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES VARIABLE_SCOPE GLOBAL @@ -962,7 +962,7 @@ VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2714,7 +2714,7 @@ +@@ -2724,7 +2724,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PREPARED_STATEMENTS_INSTANCES VARIABLE_SCOPE GLOBAL @@ -971,7 +971,7 @@ VARIABLE_COMMENT Maximum number of instrumented prepared statements. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2724,7 +2724,7 @@ +@@ -2734,7 +2734,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PROGRAM_INSTANCES VARIABLE_SCOPE GLOBAL @@ -980,7 +980,7 @@ VARIABLE_COMMENT Maximum number of instrumented programs. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2734,7 +2734,7 @@ +@@ -2744,7 +2744,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_CLASSES VARIABLE_SCOPE GLOBAL @@ -989,7 +989,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2744,7 +2744,7 @@ +@@ -2754,7 +2754,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_INSTANCES VARIABLE_SCOPE GLOBAL @@ -998,7 +998,7 @@ VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2754,7 +2754,7 @@ +@@ -2764,7 +2764,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_CLASSES VARIABLE_SCOPE GLOBAL @@ -1007,7 +1007,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2764,7 +2764,7 @@ +@@ -2774,7 +2774,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1016,7 +1016,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2774,7 +2774,7 @@ +@@ -2784,7 +2784,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SQL_TEXT_LENGTH VARIABLE_SCOPE GLOBAL @@ -1025,7 +1025,7 @@ VARIABLE_COMMENT Maximum length of displayed sql text. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2784,7 +2784,7 @@ +@@ -2794,7 +2794,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STAGE_CLASSES VARIABLE_SCOPE GLOBAL @@ -1034,7 +1034,7 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2794,7 +2794,7 @@ +@@ -2804,7 +2804,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES VARIABLE_SCOPE GLOBAL @@ -1043,7 +1043,7 @@ VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2804,7 +2804,7 @@ +@@ -2814,7 +2814,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_STACK VARIABLE_SCOPE GLOBAL @@ -1052,7 +1052,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_CURRENT. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 256 -@@ -2814,7 +2814,7 @@ +@@ -2824,7 +2824,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_HANDLES VARIABLE_SCOPE GLOBAL @@ -1061,7 +1061,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2824,7 +2824,7 @@ +@@ -2834,7 +2834,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1070,7 +1070,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2834,7 +2834,7 @@ +@@ -2844,7 +2844,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_LOCK_STAT VARIABLE_SCOPE GLOBAL @@ -1079,7 +1079,7 @@ VARIABLE_COMMENT Maximum number of lock statistics for instrumented tables. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2844,7 +2844,7 @@ +@@ -2854,7 +2854,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_CLASSES VARIABLE_SCOPE GLOBAL @@ -1088,7 +1088,7 @@ VARIABLE_COMMENT Maximum number of thread instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2854,7 +2854,7 @@ +@@ -2864,7 +2864,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1097,7 +1097,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2864,7 +2864,7 @@ +@@ -2874,7 +2874,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SESSION_CONNECT_ATTRS_SIZE VARIABLE_SCOPE GLOBAL @@ -1106,7 +1106,7 @@ VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2874,7 +2874,7 @@ +@@ -2884,7 +2884,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_ACTORS_SIZE VARIABLE_SCOPE GLOBAL @@ -1115,7 +1115,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2884,7 +2884,7 @@ +@@ -2894,7 +2894,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_OBJECTS_SIZE VARIABLE_SCOPE GLOBAL @@ -1124,7 +1124,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2894,7 +2894,7 @@ +@@ -2904,7 +2904,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_USERS_SIZE VARIABLE_SCOPE GLOBAL @@ -1133,7 +1133,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2944,7 +2944,7 @@ +@@ -2954,7 +2954,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PRELOAD_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1142,7 +1142,7 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -2964,7 +2964,7 @@ +@@ -2974,7 +2974,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME PROFILING_HISTORY_SIZE VARIABLE_SCOPE SESSION @@ -1151,7 +1151,7 @@ VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -2974,7 +2974,7 @@ +@@ -2984,7 +2984,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PROGRESS_REPORT_TIME VARIABLE_SCOPE SESSION @@ -1160,7 +1160,7 @@ VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3034,7 +3034,7 @@ +@@ -3044,7 +3044,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME QUERY_ALLOC_BLOCK_SIZE VARIABLE_SCOPE SESSION @@ -1169,7 +1169,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3044,7 +3044,7 @@ +@@ -3054,7 +3054,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_LIMIT VARIABLE_SCOPE GLOBAL @@ -1178,7 +1178,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3054,7 +3054,7 @@ +@@ -3064,7 +3064,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_MIN_RES_UNIT VARIABLE_SCOPE GLOBAL @@ -1187,7 +1187,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3067,7 +3067,7 @@ +@@ -3077,7 +3077,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1196,7 +1196,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3104,7 +3104,7 @@ +@@ -3114,7 +3114,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME QUERY_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1205,7 +1205,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3117,7 +3117,7 @@ +@@ -3127,7 +3127,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1214,7 +1214,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3127,14 +3127,14 @@ +@@ -3137,14 +3137,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1231,7 +1231,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3147,14 +3147,14 @@ +@@ -3157,14 +3157,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Maximum speed(KB/s) to read binlog from master (0 = no limit) NUMERIC_MIN_VALUE 0 @@ -1248,7 +1248,7 @@ VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -3174,7 +3174,7 @@ +@@ -3184,7 +3184,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME READ_RND_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1257,7 +1257,7 @@ VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -3384,10 +3384,10 @@ +@@ -3394,10 +3394,10 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ROWID_MERGE_BUFF_SIZE VARIABLE_SCOPE SESSION @@ -1270,7 +1270,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3404,20 +3404,20 @@ +@@ -3414,20 +3414,20 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME RPL_SEMI_SYNC_MASTER_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -1295,7 +1295,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3474,10 +3474,10 @@ +@@ -3484,10 +3484,10 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_TRACE_LEVEL VARIABLE_SCOPE GLOBAL @@ -1308,7 +1308,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3514,7 +3514,7 @@ +@@ -3524,7 +3524,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SERVER_ID VARIABLE_SCOPE SESSION @@ -1317,7 +1317,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -3644,7 +3644,7 @@ +@@ -3654,7 +3654,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_DOMAIN_PARALLEL_THREADS VARIABLE_SCOPE GLOBAL @@ -1326,7 +1326,7 @@ VARIABLE_COMMENT Maximum number of parallel threads to use on slave for events in a single replication domain. When using multiple domains, this can be used to limit a single domain from grabbing all threads and thus stalling other domains. The default of 0 means to allow a domain to grab as many threads as it wants, up to the value of slave_parallel_threads. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3674,7 +3674,7 @@ +@@ -3684,7 +3684,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_MAX_ALLOWED_PACKET VARIABLE_SCOPE GLOBAL @@ -1335,7 +1335,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3694,7 +3694,7 @@ +@@ -3704,7 +3704,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_PARALLEL_MAX_QUEUED VARIABLE_SCOPE GLOBAL @@ -1344,7 +1344,7 @@ VARIABLE_COMMENT Limit on how much memory SQL threads should use per parallel replication thread when reading ahead in the relay log looking for opportunities for parallel replication. Only used when --slave-parallel-threads > 0. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2147483647 -@@ -3714,7 +3714,7 @@ +@@ -3724,7 +3724,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME SLAVE_PARALLEL_THREADS VARIABLE_SCOPE GLOBAL @@ -1353,7 +1353,7 @@ VARIABLE_COMMENT If non-zero, number of threads to spawn to apply in parallel events on the slave that were group-committed on the master or were logged with GTID in different replication domains. Note that these threads are in addition to the IO and SQL threads, which are always created by a replication slave NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3724,7 +3724,7 @@ +@@ -3734,7 +3734,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_PARALLEL_WORKERS VARIABLE_SCOPE GLOBAL @@ -1362,7 +1362,7 @@ VARIABLE_COMMENT Alias for slave_parallel_threads NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3764,7 +3764,7 @@ +@@ -3774,7 +3774,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME SLAVE_TRANSACTION_RETRIES VARIABLE_SCOPE GLOBAL @@ -1371,7 +1371,7 @@ VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock, elapsed lock wait timeout or listed in slave_transaction_retry_errors, before giving up and stopping NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3784,7 +3784,7 @@ +@@ -3794,7 +3794,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_TRANSACTION_RETRY_INTERVAL VARIABLE_SCOPE GLOBAL @@ -1380,7 +1380,7 @@ VARIABLE_COMMENT Interval of the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout or listed in slave_transaction_retry_errors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 3600 -@@ -3804,7 +3804,7 @@ +@@ -3814,7 +3814,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLOW_LAUNCH_TIME VARIABLE_SCOPE GLOBAL @@ -1389,7 +1389,7 @@ VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -3847,7 +3847,7 @@ +@@ -3857,7 +3857,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1398,7 +1398,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4074,7 +4074,7 @@ +@@ -4084,7 +4084,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME STORED_PROGRAM_CACHE VARIABLE_SCOPE GLOBAL @@ -1407,7 +1407,7 @@ VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -4174,7 +4174,7 @@ +@@ -4184,7 +4184,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME TABLE_DEFINITION_CACHE VARIABLE_SCOPE GLOBAL @@ -1416,7 +1416,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 2097152 -@@ -4184,7 +4184,7 @@ +@@ -4194,7 +4194,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE VARIABLE_SCOPE GLOBAL @@ -1425,7 +1425,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 -@@ -4244,7 +4244,7 @@ +@@ -4254,7 +4254,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME THREAD_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -1434,7 +1434,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -4417,7 +4417,7 @@ +@@ -4427,7 +4427,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 @@ -1443,7 +1443,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4427,7 +4427,7 @@ +@@ -4437,7 +4437,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. NUMERIC_MIN_VALUE 0 @@ -1452,7 +1452,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4437,14 +4437,14 @@ +@@ -4447,14 +4447,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 0 @@ -1469,7 +1469,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4454,7 +4454,7 @@ +@@ -4464,7 +4464,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TRANSACTION_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1478,7 +1478,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4594,7 +4594,7 @@ +@@ -4604,7 +4604,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -1487,7 +1487,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -4621,7 +4621,7 @@ +@@ -4631,7 +4631,7 @@ VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO VARIABLE_SCOPE GLOBAL From 9aef479ac8df8636b7ccbe83157490d1a0dd3517 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Fri, 4 Aug 2023 10:24:40 +0200 Subject: [PATCH 169/171] fix postmerge view protocol test --- mysql-test/main/delayed.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/main/delayed.test b/mysql-test/main/delayed.test index a99af07232c..a3a8e929b51 100644 --- a/mysql-test/main/delayed.test +++ b/mysql-test/main/delayed.test @@ -611,7 +611,6 @@ disconnect con1; --source include/wait_until_disconnected.inc connection default; drop tables tm, t1, t2; ---enable_view_protocol --echo # --echo # MDEV-9621 INSERT DELAYED fails on insert for tables with many columns @@ -660,3 +659,4 @@ INSERT DELAYED INTO t1 VALUES (0); INSERT DELAYED INTO t1 VALUES (0); DROP TABLE t1; +--enable_view_protocol From 6eb69434c7dfcc63578c254ca505977b7c6592c5 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Fri, 4 Aug 2023 10:30:30 +0200 Subject: [PATCH 170/171] Roksdb test postmerge fix --- .../rocksdb/r/corrupted_data_reads_debug.result | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/storage/rocksdb/mysql-test/rocksdb/r/corrupted_data_reads_debug.result b/storage/rocksdb/mysql-test/rocksdb/r/corrupted_data_reads_debug.result index 88a62028be9..9a12f51e3b5 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/corrupted_data_reads_debug.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/corrupted_data_reads_debug.result @@ -20,7 +20,7 @@ set @tmp1=@@rocksdb_verify_row_debug_checksums; set rocksdb_verify_row_debug_checksums=1; set session debug_dbug= "+d,myrocks_simulate_bad_row_read1"; select * from t1 where pk=1; -ERROR HY000: Got error 204 'Found data corruption.' from ROCKSDB +ERROR HY000: Got error 205 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_row_read1"; set rocksdb_verify_row_debug_checksums=@tmp1; select * from t1 where pk=1; @@ -28,11 +28,11 @@ pk col1 1 1 set session debug_dbug= "+d,myrocks_simulate_bad_row_read2"; select * from t1 where pk=1; -ERROR HY000: Got error 204 'Found data corruption.' from ROCKSDB +ERROR HY000: Got error 205 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_row_read2"; set session debug_dbug= "+d,myrocks_simulate_bad_row_read3"; select * from t1 where pk=1; -ERROR HY000: Got error 204 'Found data corruption.' from ROCKSDB +ERROR HY000: Got error 205 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_row_read3"; insert into t1 values(4,'0123456789'); select * from t1; @@ -56,7 +56,7 @@ pk col1 ABCD 1 set session debug_dbug= "+d,myrocks_simulate_bad_pk_read1"; select * from t2; -ERROR HY000: Got error 204 'Found data corruption.' from ROCKSDB +ERROR HY000: Got error 205 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_pk_read1"; drop table t2; create table t2 ( @@ -69,6 +69,6 @@ pk col1 ABCD 1 set session debug_dbug= "+d,myrocks_simulate_bad_pk_read1"; select * from t2; -ERROR HY000: Got error 204 'Found data corruption.' from ROCKSDB +ERROR HY000: Got error 205 'Found data corruption.' from ROCKSDB set session debug_dbug= "-d,myrocks_simulate_bad_pk_read1"; drop table t2; From 10eff9c809cf22d6822264e47bde718b1245415a Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Fri, 4 Aug 2023 18:38:51 +1000 Subject: [PATCH 171/171] MDEV-31524 Post-merge fixup --- storage/spider/ha_spider.cc | 9 +-- .../spider/bugfix/r/sql_mode_mariadb.result | 2 +- .../spider/bugfix/r/sql_mode_mysql.result | 2 +- storage/spider/spd_param.cc | 56 +++---------------- storage/spider/spd_table.cc | 4 -- 5 files changed, 13 insertions(+), 60 deletions(-) diff --git a/storage/spider/ha_spider.cc b/storage/spider/ha_spider.cc index 1700cd0557e..ca708329839 100644 --- a/storage/spider/ha_spider.cc +++ b/storage/spider/ha_spider.cc @@ -564,12 +564,9 @@ int ha_spider::open( wide_handler->sql_command = pt_clone_source_handler->wide_handler->sql_command; } - } else { - if (share->semi_table_lock) - { - wide_handler->semi_table_lock = TRUE; - } - } + } else + wide_handler->semi_table_lock = + spider_param_semi_table_lock(thd, share->semi_table_lock); #ifdef HA_CAN_BULK_ACCESS external_lock_cnt = 0; #endif diff --git a/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mariadb.result b/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mariadb.result index 9c506c3bb24..1bf6fbccbc9 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mariadb.result +++ b/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mariadb.result @@ -50,7 +50,7 @@ pkey connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%sql_mode%'; argument -set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session wait_timeout = 604800;set session sql_mode = 'real_as_float,ignore_bad_table_options,no_unsigned_subtraction,no_dir_in_create,no_auto_value_on_zero,strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,allow_invalid_dates,error_for_division_by_zero,no_auto_create_user,high_not_precedence,no_engine_substitution,pad_char_to_full_length,empty_string_is_null,simultaneous_assignment,time_round_fractional';set session time_zone = '+00:00';set @`spider_lc_./auto_test_remote/tbl_a` = '-xxxxxxxxxxxx-xxxxx-./auto_test_local/tbl_a-' +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session wait_timeout = 604800;set session sql_mode = 'real_as_float,ignore_bad_table_options,no_unsigned_subtraction,no_dir_in_create,no_auto_value_on_zero,strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,allow_invalid_dates,error_for_division_by_zero,no_auto_create_user,high_not_precedence,no_engine_substitution,pad_char_to_full_length,empty_string_is_null,simultaneous_assignment,time_round_fractional';set session time_zone = '+00:00';set @`spider_lc_./auto_test_remote/tbl_a` = '-xxxxxxxxxxxx-xxxxx-./auto_test_local/tbl_a-';start transaction SELECT argument FROM mysql.general_log WHERE argument LIKE '%sql_mode%' SELECT pkey FROM tbl_a ORDER BY pkey; pkey diff --git a/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mysql.result b/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mysql.result index 19ac1caae0e..3ec96a66031 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mysql.result +++ b/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mysql.result @@ -50,7 +50,7 @@ pkey connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE '%sql_mode%'; argument -set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session wait_timeout = 604800;set session sql_mode = 'real_as_float,ignore_bad_table_options,no_unsigned_subtraction,no_dir_in_create,no_auto_value_on_zero,strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,allow_invalid_dates,error_for_division_by_zero,no_auto_create_user,high_not_precedence,no_engine_substitution,pad_char_to_full_length';set session time_zone = '+00:00';set @`spider_lc_./auto_test_remote/tbl_a` = '-xxxxxxxxxxxx-xxxxx-./auto_test_local/tbl_a-' +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session wait_timeout = 604800;set session sql_mode = 'real_as_float,ignore_bad_table_options,no_unsigned_subtraction,no_dir_in_create,no_auto_value_on_zero,strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,allow_invalid_dates,error_for_division_by_zero,no_auto_create_user,high_not_precedence,no_engine_substitution,pad_char_to_full_length';set session time_zone = '+00:00';set @`spider_lc_./auto_test_remote/tbl_a` = '-xxxxxxxxxxxx-xxxxx-./auto_test_local/tbl_a-';start transaction SELECT argument FROM mysql.general_log WHERE argument LIKE '%sql_mode%' SELECT pkey FROM tbl_a ORDER BY pkey; pkey diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc index 445c3a01d01..f9b232372ab 100644 --- a/storage/spider/spd_param.cc +++ b/storage/spider/spd_param.cc @@ -945,14 +945,6 @@ static MYSQL_THDVAR_INT( SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, buffer_size) -/* - Notes on merge conflicts (remove after merging): - 10.5: 48faa20db848012e2187a09e05aba832078cb82e - 10.6: 51ff9eddf7c0aaf1e022fcb3b48ec36835df7785 - 10.9: 06a61b8e453126c2de1649073f247d34e85f9702 - 10.10: 90cd0c156f5bb53fd058d2bbfb83f850ffae6722 - 10.11+: 124eb662700708f3c4b0fb77968f8b854d6bb4aa -*/ /* -1 :fallback to default 0 :off @@ -1577,12 +1569,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -double spider_param_hs_ping_interval( - THD *thd -) { - DBUG_ENTER("spider_param_hs_ping_interval"); - DBUG_RETURN(THDVAR(thd, hs_ping_interval)); -} +SPIDER_THDVAR_VALUE_FUNC(double, hs_ping_interval) #endif /* @@ -2105,12 +2092,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_hs_r_conn_recycle_mode( - THD *thd -) { - DBUG_ENTER("spider_param_hs_r_conn_recycle_mode"); - DBUG_RETURN(THDVAR(thd, hs_r_conn_recycle_mode)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, hs_r_conn_recycle_mode) /* 0: weak @@ -2128,12 +2110,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_hs_r_conn_recycle_strict( - THD *thd -) { - DBUG_ENTER("spider_param_hs_r_conn_recycle_strict"); - DBUG_RETURN(THDVAR(thd, hs_r_conn_recycle_strict)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, hs_r_conn_recycle_strict) /* 0: no recycle @@ -2152,12 +2129,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_hs_w_conn_recycle_mode( - THD *thd -) { - DBUG_ENTER("spider_param_hs_w_conn_recycle_mode"); - DBUG_RETURN(THDVAR(thd, hs_w_conn_recycle_mode)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, hs_w_conn_recycle_mode) /* 0: weak @@ -2175,12 +2147,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_hs_w_conn_recycle_strict( - THD *thd -) { - DBUG_ENTER("spider_param_hs_w_conn_recycle_strict"); - DBUG_RETURN(THDVAR(thd, hs_w_conn_recycle_strict)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, hs_w_conn_recycle_strict) /* -1 :fallback to default @@ -2838,7 +2805,7 @@ static MYSQL_THDVAR_BOOL( SPIDER_THDVAR_VALUE_FUNC(bool, sync_sql_mode) /* - -1 : use table parameter + -1 : fallback to default 0 : do not strict 1 : do strict */ @@ -2848,20 +2815,13 @@ static MYSQL_THDVAR_INT( "Use columns in select clause strictly for group by clause", NULL, /* check */ NULL, /* update */ - -1, /* def */ + 1, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_strict_group_by( - THD *thd, - int strict_group_by -) { - DBUG_ENTER("spider_param_strict_group_by"); - DBUG_RETURN(THDVAR(thd, strict_group_by) == -1 ? - strict_group_by : THDVAR(thd, strict_group_by)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, strict_group_by) static struct st_mysql_storage_engine spider_storage_engine = { MYSQL_HANDLERTON_INTERFACE_VERSION }; diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 7f9707786d1..34d46d48403 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -3902,16 +3902,12 @@ int spider_set_connect_info_default( #endif if (share->access_balances[roop_count] == -1) share->access_balances[roop_count] = 100; - if (share->strict_group_bys[roop_count] == -1) - share->strict_group_bys[roop_count] = 1; } if (share->query_cache == -1) share->query_cache = 0; if (share->query_cache_sync == -1) share->query_cache_sync = 0; - if (share->buffer_size == -1) - share->buffer_size = 16000; if (share->scan_rate == -1) share->scan_rate = 1; if (share->read_rate == -1)