From 58cd2a8dedd78b25ada0996dee2bd3e0520c17b6 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Tue, 29 Mar 2022 13:44:14 +0300 Subject: [PATCH 01/28] MDEV-19525 remove ER_VERS_FIELD_WRONG_TYPE from init_from_binary_frm_image() Throw ER_NOT_FORM_FILE if this is wrong FRM data (warning with ER_VERS_FIELD_WRONG_TYPE is still printed for deeper knowledge of what was happened). Keep ER_VERS_FIELD_WRONG_TYPE for creating partitioned table with trx-versioning. Tested by MDEV-15951 in trx_id.test --- mysql-test/suite/versioning/r/debug.result | 14 +++++++++++++- mysql-test/suite/versioning/t/debug.test | 15 +++++++++++++-- sql/table.cc | 13 ++++++++++--- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/mysql-test/suite/versioning/r/debug.result b/mysql-test/suite/versioning/r/debug.result index 72bd1f18a68..20e21ff2811 100644 --- a/mysql-test/suite/versioning/r/debug.result +++ b/mysql-test/suite/versioning/r/debug.result @@ -50,5 +50,17 @@ t4 CREATE TABLE `t4` ( `row_end` timestamp(6) GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (`row_start`, `row_end`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING -set global debug_dbug=@old_dbug; drop table t1, t2, t3, t4; +# +# MDEV-19525 remove ER_VERS_FIELD_WRONG_TYPE from init_from_binary_frm_image() +# +create table t1 (x int) with system versioning; +set debug_dbug='+d,error_vers_wrong_type'; +show create table t1; +ERROR HY000: Incorrect information in file: './test/t1.frm' +show warnings; +Level Code Message +Warning 4110 `row_start` must be of type TIMESTAMP(6) for system-versioned table `t1` +Error 1033 Incorrect information in file: './test/t1.frm' +drop table t1; +set global debug_dbug=@old_dbug; diff --git a/mysql-test/suite/versioning/t/debug.test b/mysql-test/suite/versioning/t/debug.test index c6d5bd60861..59dde0d26fb 100644 --- a/mysql-test/suite/versioning/t/debug.test +++ b/mysql-test/suite/versioning/t/debug.test @@ -30,6 +30,17 @@ set debug_dbug='+d,sysvers_show'; show create table t3; create table t4 (a int); show create table t4; - -set global debug_dbug=@old_dbug; drop table t1, t2, t3, t4; + + +--echo # +--echo # MDEV-19525 remove ER_VERS_FIELD_WRONG_TYPE from init_from_binary_frm_image() +--echo # +create table t1 (x int) with system versioning; +set debug_dbug='+d,error_vers_wrong_type'; +--replace_result $MYSQLTEST_VARDIR . master-data// '' '\\' '/' +--error ER_NOT_FORM_FILE +show create table t1; +show warnings; +drop table t1; +set global debug_dbug=@old_dbug; diff --git a/sql/table.cc b/sql/table.cc index 2ab947d69cd..7d022ba8ca3 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -2082,6 +2082,9 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, if (flags & VERS_SYSTEM_FIELD) { + if (DBUG_EVALUATE_IF("error_vers_wrong_type", 1, 0)) + field_type= MYSQL_TYPE_BLOB; + switch (field_type) { case MYSQL_TYPE_TIMESTAMP2: @@ -2094,9 +2097,13 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, } /* Fallthrough */ default: - my_error(ER_VERS_FIELD_WRONG_TYPE, MYF(0), fieldnames.type_names[i], - versioned == VERS_TIMESTAMP ? "TIMESTAMP(6)" : "BIGINT(20) UNSIGNED", - table_name.str); + my_error(ER_VERS_FIELD_WRONG_TYPE, + (field_type == MYSQL_TYPE_LONGLONG ? + MYF(0) : MYF(ME_WARNING)), + fieldnames.type_names[i], + (versioned == VERS_TIMESTAMP ? + "TIMESTAMP(6)" : "BIGINT(20) UNSIGNED"), + table_name.str); goto err; } } From 1e859d4abcfd7e3b2c238e5dc8c909254661082a Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Tue, 29 Mar 2022 13:44:14 +0300 Subject: [PATCH 02/28] MDEV-22973 Assertion in compare_record upon multi-update involving versioned table via view records_are_comparable() requires this condition: bitmap_is_subset(table->write_set, table->read_set) On first iteration vers_update_fields() changes write_set and read_set. On second iteration the above condition fails. Added missing read bit for ROW_START. Also reorganized bitmap_set_bit() so it is called only when needed. --- mysql-test/suite/versioning/r/update.result | 11 +++++++++++ mysql-test/suite/versioning/t/update.test | 13 +++++++++++++ sql/table.cc | 7 ++++--- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/versioning/r/update.result b/mysql-test/suite/versioning/r/update.result index d123331cc8c..1db5682c69b 100644 --- a/mysql-test/suite/versioning/r/update.result +++ b/mysql-test/suite/versioning/r/update.result @@ -410,3 +410,14 @@ select check_row_ts(row_start, row_end) from t1 for system_time all where row_st check_row_ts(row_start, row_end) CURRENT ROW drop table t1; +# +# MDEV-22973 Assertion in compare_record upon multi-update involving versioned table via view +# +create or replace table t1 (a int, primary key (a)) engine=myisam; +insert into t1 values (0); +create or replace table t2 (pk int, b int, primary key (pk), key(b)) engine=innodb with system versioning; +insert into t2 values (1, 0), (2, 0); +create or replace view v as select a, b from t1, t2; +update v set b= null where a = 0 order by b; +drop view v; +drop table t1, t2; diff --git a/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test index 058d2f4c865..edf4e4598ab 100644 --- a/mysql-test/suite/versioning/t/update.test +++ b/mysql-test/suite/versioning/t/update.test @@ -336,4 +336,17 @@ select row_start from t1 into @r; select check_row_ts(row_start, row_end) from t1 for system_time all where row_start = @r; drop table t1; +--echo # +--echo # MDEV-22973 Assertion in compare_record upon multi-update involving versioned table via view +--echo # +create or replace table t1 (a int, primary key (a)) engine=myisam; +insert into t1 values (0); +create or replace table t2 (pk int, b int, primary key (pk), key(b)) engine=innodb with system versioning; +insert into t2 values (1, 0), (2, 0); +create or replace view v as select a, b from t1, t2; +update v set b= null where a = 0 order by b; +# cleanup +drop view v; +drop table t1, t2; + source suite/versioning/common_finish.inc; diff --git a/sql/table.cc b/sql/table.cc index 7d022ba8ca3..08d91678b25 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -8161,9 +8161,6 @@ void TABLE::evaluate_update_default_function() void TABLE::vers_update_fields() { - bitmap_set_bit(write_set, vers_start_field()->field_index); - bitmap_set_bit(write_set, vers_end_field()->field_index); - if (!vers_write) { file->column_bitmaps_signal(); @@ -8172,17 +8169,21 @@ void TABLE::vers_update_fields() if (versioned(VERS_TIMESTAMP)) { + bitmap_set_bit(write_set, vers_start_field()->field_index); if (vers_start_field()->store_timestamp(in_use->query_start(), in_use->query_start_sec_part())) { DBUG_ASSERT(0); } vers_start_field()->set_has_explicit_value(); + bitmap_set_bit(read_set, vers_start_field()->field_index); } + bitmap_set_bit(write_set, vers_end_field()->field_index); vers_end_field()->set_max(); vers_end_field()->set_has_explicit_value(); bitmap_set_bit(read_set, vers_end_field()->field_index); + file->column_bitmaps_signal(); if (vfield) update_virtual_fields(file, VCOL_UPDATE_FOR_READ); From 33ff18627ea009709bb0ba55b68f873e6c6c784c Mon Sep 17 00:00:00 2001 From: Vlad Lesin Date: Mon, 28 Mar 2022 19:16:14 +0300 Subject: [PATCH 03/28] MDEV-27835 innochecksum -S crashes for encrypted .ibd tablespace As main() invokes parse_page() when -S or -D are set, it can be a case when parse_page() is invoked when -D filename is not set, that is why any attempt to write to page dump file must be done only if the file name is set with -D. The bug is caused by 2ef7a5a13a988842450cbeeaceaf0ea1a78a3c27 (MDEV-13443). --- extra/innochecksum.cc | 48 +++++++++---------- .../suite/encryption/r/innochecksum.result | 2 +- .../suite/encryption/t/innochecksum.test | 4 +- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index 06001fd451b..4b287e918e6 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -886,7 +886,7 @@ parse_page( is_leaf = (!*(const uint16*) (page + (PAGE_HEADER + PAGE_LEVEL))); - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tIndex page\t\t\t|" "\tindex id=%llu,", cur_page_num, id); @@ -939,7 +939,7 @@ parse_page( index.total_data_bytes += data_bytes; index.pages_in_size_range[size_range_id] ++; } - } else { + } else if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tEncrypted Index page\t\t\t|" "\tkey_version " UINT32PF ",%s\n", cur_page_num, key_version, str); } @@ -950,20 +950,20 @@ parse_page( page_type.n_fil_page_undo_log++; undo_page_type = mach_read_from_2(page + TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE); - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tUndo log page\t\t\t|", cur_page_num); } if (undo_page_type == TRX_UNDO_INSERT) { page_type.n_undo_insert++; - if (page_type_dump) { + if (file) { fprintf(file, "\t%s", "Insert Undo log page"); } } else if (undo_page_type == TRX_UNDO_UPDATE) { page_type.n_undo_update++; - if (page_type_dump) { + if (file) { fprintf(file, "\t%s", "Update undo log page"); } @@ -974,7 +974,7 @@ parse_page( switch (undo_page_type) { case TRX_UNDO_ACTIVE: page_type.n_undo_state_active++; - if (page_type_dump) { + if (file) { fprintf(file, ", %s", "Undo log of " "an active transaction"); } @@ -982,7 +982,7 @@ parse_page( case TRX_UNDO_CACHED: page_type.n_undo_state_cached++; - if (page_type_dump) { + if (file) { fprintf(file, ", %s", "Page is " "cached for quick reuse"); } @@ -990,7 +990,7 @@ parse_page( case TRX_UNDO_TO_FREE: page_type.n_undo_state_to_free++; - if (page_type_dump) { + if (file) { fprintf(file, ", %s", "Insert undo " "segment that can be freed"); } @@ -998,7 +998,7 @@ parse_page( case TRX_UNDO_TO_PURGE: page_type.n_undo_state_to_purge++; - if (page_type_dump) { + if (file) { fprintf(file, ", %s", "Will be " "freed in purge when all undo" "data in it is removed"); @@ -1007,7 +1007,7 @@ parse_page( case TRX_UNDO_PREPARED: page_type.n_undo_state_prepared++; - if (page_type_dump) { + if (file) { fprintf(file, ", %s", "Undo log of " "an prepared transaction"); } @@ -1017,14 +1017,14 @@ parse_page( page_type.n_undo_state_other++; break; } - if(page_type_dump) { + if(file) { fprintf(file, ", %s\n", str); } break; case FIL_PAGE_INODE: page_type.n_fil_page_inode++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tInode page\t\t\t|" "\t%s\n",cur_page_num, str); } @@ -1032,7 +1032,7 @@ parse_page( case FIL_PAGE_IBUF_FREE_LIST: page_type.n_fil_page_ibuf_free_list++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tInsert buffer free list" " page\t|\t%s\n", cur_page_num, str); } @@ -1040,7 +1040,7 @@ parse_page( case FIL_PAGE_TYPE_ALLOCATED: page_type.n_fil_page_type_allocated++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tFreshly allocated " "page\t\t|\t%s\n", cur_page_num, str); } @@ -1048,7 +1048,7 @@ parse_page( case FIL_PAGE_IBUF_BITMAP: page_type.n_fil_page_ibuf_bitmap++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tInsert Buffer " "Bitmap\t\t|\t%s\n", cur_page_num, str); } @@ -1056,7 +1056,7 @@ parse_page( case FIL_PAGE_TYPE_SYS: page_type.n_fil_page_type_sys++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tSystem page\t\t\t|" "\t%s\n", cur_page_num, str); } @@ -1064,7 +1064,7 @@ parse_page( case FIL_PAGE_TYPE_TRX_SYS: page_type.n_fil_page_type_trx_sys++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tTransaction system " "page\t\t|\t%s\n", cur_page_num, str); } @@ -1072,7 +1072,7 @@ parse_page( case FIL_PAGE_TYPE_FSP_HDR: page_type.n_fil_page_type_fsp_hdr++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tFile Space " "Header\t\t|\t%s\n", cur_page_num, str); } @@ -1080,7 +1080,7 @@ parse_page( case FIL_PAGE_TYPE_XDES: page_type.n_fil_page_type_xdes++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tExtent descriptor " "page\t\t|\t%s\n", cur_page_num, str); } @@ -1088,7 +1088,7 @@ parse_page( case FIL_PAGE_TYPE_BLOB: page_type.n_fil_page_type_blob++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tBLOB page\t\t\t|\t%s\n", cur_page_num, str); } @@ -1096,7 +1096,7 @@ parse_page( case FIL_PAGE_TYPE_ZBLOB: page_type.n_fil_page_type_zblob++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tCompressed BLOB " "page\t\t|\t%s\n", cur_page_num, str); } @@ -1104,7 +1104,7 @@ parse_page( case FIL_PAGE_TYPE_ZBLOB2: page_type.n_fil_page_type_zblob2++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tSubsequent Compressed " "BLOB page\t|\t%s\n", cur_page_num, str); } @@ -1112,7 +1112,7 @@ parse_page( case FIL_PAGE_PAGE_COMPRESSED: page_type.n_fil_page_type_page_compressed++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tPage compressed " "page\t|\t%s\n", cur_page_num, str); } @@ -1120,7 +1120,7 @@ parse_page( case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: page_type.n_fil_page_type_page_compressed_encrypted++; - if (page_type_dump) { + if (file) { fprintf(file, "#::" UINT32PF "\t\t|\t\tPage compressed encrypted " "page\t|\t%s\n", cur_page_num, str); } diff --git a/mysql-test/suite/encryption/r/innochecksum.result b/mysql-test/suite/encryption/r/innochecksum.result index 2c1279cd232..213be3a7f76 100644 --- a/mysql-test/suite/encryption/r/innochecksum.result +++ b/mysql-test/suite/encryption/r/innochecksum.result @@ -14,7 +14,7 @@ CREATE TABLE t6 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB; # to redo apply the pages of t1.ibd at the time of recovery. # We want SQL to initiate the first access to t1.ibd. # Wait until disconnected. -# Run innochecksum on t1 +# Run innochecksum on t1, check -S does not cause crash for encrypted file # Run innochecksum on t2 # Run innochecksum on t3 # Run innochecksum on t4 diff --git a/mysql-test/suite/encryption/t/innochecksum.test b/mysql-test/suite/encryption/t/innochecksum.test index 5423a70f5d9..c2e125368b1 100644 --- a/mysql-test/suite/encryption/t/innochecksum.test +++ b/mysql-test/suite/encryption/t/innochecksum.test @@ -68,9 +68,9 @@ shutdown_server; --echo # Wait until disconnected. --source include/wait_until_disconnected.inc ---echo # Run innochecksum on t1 -- disable_result_log ---exec $INNOCHECKSUM $t1_IBD +--echo # Run innochecksum on t1, check -S does not cause crash for encrypted file +--exec $INNOCHECKSUM -S $t1_IBD --echo # Run innochecksum on t2 From d59b16dd9605d7caecb454fb9efdaa4dfc5770cc Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Tue, 29 Mar 2022 14:58:19 +0200 Subject: [PATCH 04/28] Galera test failure on galera_bf_abort_ps_bind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix a possible crash on my_free() due to the use of strdup() versus my_strdup(), and a memory leak. Reviewed-by: Jan Lindström --- client/mysqltest.cc | 5 ++++- mysql-test/suite/galera/disabled.def | 2 +- mysql-test/suite/galera/r/galera_bf_abort_ps_bind.result | 1 + mysql-test/suite/galera/t/galera_bf_abort_ps_bind.test | 2 ++ wsrep-lib | 2 +- 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 814c07ba60f..0f910d00927 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -8535,7 +8535,10 @@ void run_prepare_stmt(struct st_connection *cn, struct st_command *command, cons separate string */ if (!disable_warnings) + { append_warnings(&ds_prepare_warnings, mysql); + dynstr_free(&ds_prepare_warnings); + } end: DBUG_VOID_RETURN; } @@ -8611,7 +8614,7 @@ void run_bind_stmt(struct st_connection *cn, struct st_command *command, else { ps_params[i].buffer_type= MYSQL_TYPE_STRING; - ps_params[i].buffer= strdup(p); + ps_params[i].buffer= my_strdup(p, MYF(MY_WME)); ps_params[i].buffer_length= (unsigned long)strlen(p); } } diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 6db86abaa3b..6e8ee8e17a4 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -36,4 +36,4 @@ partition : MDEV-19958 Galera test failure on galera.partition query_cache: MDEV-15805 Test failure on galera.query_cache versioning_trx_id: MDEV-18590: galera.versioning_trx_id: Test failure: mysqltest: Result content mismatch galera_bf_abort_at_after_statement : Unstable -galera_bf_abort_ps_bind : MDEV-28193 Galera test failure on galera_bf_abort_ps_bind + diff --git a/mysql-test/suite/galera/r/galera_bf_abort_ps_bind.result b/mysql-test/suite/galera/r/galera_bf_abort_ps_bind.result index adc7da58eae..02f4dd25f7c 100644 --- a/mysql-test/suite/galera/r/galera_bf_abort_ps_bind.result +++ b/mysql-test/suite/galera/r/galera_bf_abort_ps_bind.result @@ -28,6 +28,7 @@ PS_execute; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction PS_execute; commit; +PS_close; select * from t; i j 1 node2 diff --git a/mysql-test/suite/galera/t/galera_bf_abort_ps_bind.test b/mysql-test/suite/galera/t/galera_bf_abort_ps_bind.test index a840f612a82..072a68fc79d 100644 --- a/mysql-test/suite/galera/t/galera_bf_abort_ps_bind.test +++ b/mysql-test/suite/galera/t/galera_bf_abort_ps_bind.test @@ -53,6 +53,8 @@ update t set j='node2' where i=1; --PS_execute commit; +--PS_close + select * from t; drop table t; diff --git a/wsrep-lib b/wsrep-lib index edd141127c1..23fb8624624 160000 --- a/wsrep-lib +++ b/wsrep-lib @@ -1 +1 @@ -Subproject commit edd141127c11d78ef073f9f3ca61708821f20b32 +Subproject commit 23fb8624624c9144c77f3874647fa0f7394b0aa8 From bdba1d46bbf08044274cbb5a94a6cb395485c0af Mon Sep 17 00:00:00 2001 From: Dmitry Shulga Date: Sun, 27 Mar 2022 14:02:34 +0700 Subject: [PATCH 05/28] MDEV-19631: Assertion `0' failed in st_select_lex_unit::optimize or different plan upon 2nd execution of PS with EXPLAIN Second execution of a prepared statement for a query containing a constant subquery with union that can be optimized away, could result in server abnormal termination for debug build or incorrect result set output for release build. For example, the following test case crashes a server built with debug on second run of the statement EXECUTE stmt CREATE TABLE t1 (a INT); PREPARE stmt FROM 'EXPLAIN SELECT * FROM t1 HAVING 6 IN ( SELECT 6 UNION SELECT 5 )'; EXECUTE stmt; EXECUTE stmt; The reason for incorrect result set output or abnormal server termination is careless working with the data member fake_select_lex->options inside the function mysql_explain_union(). Once the flag SELECT_DESCRIBE is set in the data member fake_select_lex->option before calling the methods SELECT_LEX_UNIT::prepare/SELECT_LEX_UNIT::execute the original value of the option is no longer restored. As a consequence, next time the prepared statement is re-executed we have the fake_select_lex with the flag SELECT_DESCRIBE set in the data member fake_select_lex->option, that is incorrect. In result, the method Item_subselect::assigned() is not invoked during evaluation of a constant condition (constant subquery with union) that being performed on OPTIMIZE phase of query handling. This leads to the fact that records in the temporary table are not deleted before calling table->file->ha_enable_indexes(HA_KEY_SWITCH_ALL) in the method st_select_lex_unit::optimize(). In result table->file->ha_enable_indexes(HA_KEY_SWITCH_ALL) returns error and DBUG_ASSERT(0) is fired. Stack trace to the line where the error generated on re-enabling indexes for next subselect iteration is below: st_select_lex_unit::optimize (at sql_union.cc:954) handler::ha_enable_indexes (at handler.cc:4338) ha_heap::enable_indexes (at ha_heap.cc:519) heap_enable_indexes (at hp_clear.c:164) The code snippet to clarify raising the error is also listed: int heap_enable_indexes(HP_INFO *info) { int error= 0; HP_SHARE *share= info->s; if (share->data_length || share->index_length) error= HA_ERR_CRASHED; <<== set error the value HA_ERR_CRASHED since share->data_length != 0 To fix this issue the original value of unit->fake_select_lex->options has to be saved before setting the flag SELECT_DESCRIBE and restored on return from invocation of SELECT_LEX_UNIT::prepare/SELECT_LEX_UNIT::execute --- mysql-test/r/ps.result | 22 ++++++++++++++++++++++ mysql-test/t/ps.test | 13 +++++++++++++ sql/sql_select.cc | 6 ++++++ 3 files changed, 41 insertions(+) diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 1cd41e5b3a4..81167bc85c0 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -5487,5 +5487,27 @@ a DEALLOCATE PREPARE stmt; DROP VIEW v1; DROP TABLE t1; +# +# MDEV-19631: Assertion `0' failed in st_select_lex_unit::optimize or +# different plan upon 2nd execution of PS with EXPLAIN +# +CREATE TABLE t1 (a INT); +PREPARE stmt FROM 'EXPLAIN SELECT * FROM t1 HAVING 6 IN ( SELECT 6 UNION SELECT 5 )'; +EXECUTE stmt; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found +2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +# Without the patch the second execution of the 'stmt' prepared statement +# would result in server crash. +EXECUTE stmt; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found +2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +DEALLOCATE PREPARE stmt; +DROP TABLE t1; # End of 10.2 tests # diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 4097d28a949..81d8e8e0fed 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -4976,6 +4976,19 @@ DEALLOCATE PREPARE stmt; DROP VIEW v1; DROP TABLE t1; +--echo # +--echo # MDEV-19631: Assertion `0' failed in st_select_lex_unit::optimize or +--echo # different plan upon 2nd execution of PS with EXPLAIN +--echo # +CREATE TABLE t1 (a INT); +PREPARE stmt FROM 'EXPLAIN SELECT * FROM t1 HAVING 6 IN ( SELECT 6 UNION SELECT 5 )'; +EXECUTE stmt; +--echo # Without the patch the second execution of the 'stmt' prepared statement +--echo # would result in server crash. +EXECUTE stmt; +# Cleanup +DEALLOCATE PREPARE stmt; +DROP TABLE t1; --echo # End of 10.2 tests --echo # diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a3e8b453897..22d3597de16 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -25400,14 +25400,20 @@ bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result) if (unit->is_union() || unit->fake_select_lex) { + ulonglong save_options= 0; + if (unit->union_needs_tmp_table() && unit->fake_select_lex) { + save_options= unit->fake_select_lex->options; unit->fake_select_lex->select_number= FAKE_SELECT_LEX_ID; // just for initialization unit->fake_select_lex->type= "UNION RESULT"; unit->fake_select_lex->options|= SELECT_DESCRIBE; } if (!(res= unit->prepare(thd, result, SELECT_NO_UNLOCK | SELECT_DESCRIBE))) res= unit->exec(); + + if (unit->union_needs_tmp_table() && unit->fake_select_lex) + unit->fake_select_lex->options= save_options; } else { From bb4dd70e7c6509ed9bf8c38d44dffb6d2fcca415 Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Mon, 28 Mar 2022 15:03:09 +0530 Subject: [PATCH 06/28] MDEV-13005: Fixing bugs in SEQUENCE, part 3, 1/5 Task 1: If table is added to list using option TL_OPTION_SEQUENCE (done when we have sequence functions) then then we are dealing with sequence instead of table. So global table list will have sequence set to true. This is used to check and give correct error message about unknown sequence instead of table doesn't exist. --- mysql-test/suite/sql_sequence/alter.result | 5 ++--- mysql-test/suite/sql_sequence/alter.test | 3 ++- mysql-test/suite/sql_sequence/create.result | 12 ++++++++++-- mysql-test/suite/sql_sequence/create.test | 14 ++++++++++++-- mysql-test/suite/sql_sequence/next.result | 2 +- mysql-test/suite/sql_sequence/next.test | 2 +- sql/handler.cc | 4 +++- 7 files changed, 31 insertions(+), 11 deletions(-) diff --git a/mysql-test/suite/sql_sequence/alter.result b/mysql-test/suite/sql_sequence/alter.result index 612e2201d26..e0acc1c1b23 100644 --- a/mysql-test/suite/sql_sequence/alter.result +++ b/mysql-test/suite/sql_sequence/alter.result @@ -211,10 +211,9 @@ alter sequence t1 minvalue=100; ERROR 42S02: 'test.t1' is not a SEQUENCE drop table t1; alter sequence if exists t1 minvalue=100; -Warnings: -Note 4091 Unknown SEQUENCE: 'test.t1' +ERROR 42S02: Unknown SEQUENCE: 't1' alter sequence t1 minvalue=100; -ERROR 42S02: Table 'test.t1' doesn't exist +ERROR 42S02: Unknown SEQUENCE: 't1' create sequence t1; alter sequence t1; 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 '' at line 1 diff --git a/mysql-test/suite/sql_sequence/alter.test b/mysql-test/suite/sql_sequence/alter.test index 53f71018337..a5e6245d609 100644 --- a/mysql-test/suite/sql_sequence/alter.test +++ b/mysql-test/suite/sql_sequence/alter.test @@ -119,8 +119,9 @@ create table t1 (a int); alter sequence t1 minvalue=100; drop table t1; +--error ER_UNKNOWN_SEQUENCES alter sequence if exists t1 minvalue=100; ---error ER_NO_SUCH_TABLE +--error ER_UNKNOWN_SEQUENCES alter sequence t1 minvalue=100; create sequence t1; diff --git a/mysql-test/suite/sql_sequence/create.result b/mysql-test/suite/sql_sequence/create.result index 5a53a66c9a8..65a4697a6ca 100644 --- a/mysql-test/suite/sql_sequence/create.result +++ b/mysql-test/suite/sql_sequence/create.result @@ -478,7 +478,7 @@ next value for t1 1 drop temporary table t1; select previous value for t1; -ERROR 42S02: Table 'test.t1' doesn't exist +ERROR 42S02: Unknown SEQUENCE: 't1' CREATE SEQUENCE t1 start with 1 minvalue 1 maxvalue 10 increment by 1 cache 10; select next value for t1; next value for t1 @@ -507,7 +507,7 @@ next value for t1 1 drop temporary table t1; select previous value for t1; -ERROR 42S02: Table 'test.t1' doesn't exist +ERROR 42S02: Unknown SEQUENCE: 't1' CREATE SEQUENCE t1 start with 1 minvalue 1 maxvalue 10 increment by 1 cache 10 engine=innodb; select next value for t1; next value for t1 @@ -687,3 +687,11 @@ set global innodb_force_primary_key=default; ALTER TABLE s1 ADD PRIMARY KEY (next_not_cached_value); ERROR HY000: Sequence 'test.s1' table structure is invalid (Sequence tables cannot have any keys) DROP SEQUENCE s1; +# +# Beginning of 10.4 Test +# +# MDEV-13005: Fixing bugs in SEQUENCE, part 3 +# +# Task 1: +SET @x = PREVIOUS VALUE FOR x; +ERROR 42S02: Unknown SEQUENCE: 'x' diff --git a/mysql-test/suite/sql_sequence/create.test b/mysql-test/suite/sql_sequence/create.test index ac3aae845cd..9d69924ca71 100644 --- a/mysql-test/suite/sql_sequence/create.test +++ b/mysql-test/suite/sql_sequence/create.test @@ -382,7 +382,7 @@ drop view v1; CREATE TEMPORARY SEQUENCE t1; select next value for t1; drop temporary table t1; ---error ER_NO_SUCH_TABLE +--error ER_UNKNOWN_SEQUENCES select previous value for t1; CREATE SEQUENCE t1 start with 1 minvalue 1 maxvalue 10 increment by 1 cache 10; select next value for t1; @@ -398,7 +398,7 @@ drop sequence t1; CREATE TEMPORARY SEQUENCE t1 engine=innodb; select next value for t1; drop temporary table t1; ---error ER_NO_SUCH_TABLE +--error ER_UNKNOWN_SEQUENCES select previous value for t1; CREATE SEQUENCE t1 start with 1 minvalue 1 maxvalue 10 increment by 1 cache 10 engine=innodb; select next value for t1; @@ -515,3 +515,13 @@ set global innodb_force_primary_key=default; --error ER_SEQUENCE_INVALID_TABLE_STRUCTURE ALTER TABLE s1 ADD PRIMARY KEY (next_not_cached_value); DROP SEQUENCE s1; + +--echo # +--echo # Beginning of 10.4 Test +--echo # +--echo # MDEV-13005: Fixing bugs in SEQUENCE, part 3 +--echo # + +--echo # Task 1: +--error ER_UNKNOWN_SEQUENCES +SET @x = PREVIOUS VALUE FOR x; diff --git a/mysql-test/suite/sql_sequence/next.result b/mysql-test/suite/sql_sequence/next.result index 76991fbe68c..9d55921006b 100644 --- a/mysql-test/suite/sql_sequence/next.result +++ b/mysql-test/suite/sql_sequence/next.result @@ -387,7 +387,7 @@ previous value for t1 1 drop sequence t1; select previous value for t1; -ERROR 42S02: Table 'test.t1' doesn't exist +ERROR 42S02: Unknown SEQUENCE: 't1' CREATE SEQUENCE t1 start with 5 minvalue 1 maxvalue 10 increment by 1 cache 5 cycle; select previous value for t1; previous value for t1 diff --git a/mysql-test/suite/sql_sequence/next.test b/mysql-test/suite/sql_sequence/next.test index 9f0eebdf774..a80f9fad561 100644 --- a/mysql-test/suite/sql_sequence/next.test +++ b/mysql-test/suite/sql_sequence/next.test @@ -166,7 +166,7 @@ select previous value for t1; flush tables; select previous value for t1; drop sequence t1; ---error ER_NO_SUCH_TABLE +--error ER_UNKNOWN_SEQUENCES select previous value for t1; CREATE SEQUENCE t1 start with 5 minvalue 1 maxvalue 10 increment by 1 cache 5 cycle; select previous value for t1; diff --git a/sql/handler.cc b/sql/handler.cc index 4aff21851a6..1b914012355 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -5469,7 +5469,9 @@ int ha_discover_table(THD *thd, TABLE_SHARE *share) else found= plugin_foreach(thd, discover_handlerton, MYSQL_STORAGE_ENGINE_PLUGIN, share); - + + if (thd->lex->query_tables && thd->lex->query_tables->sequence && !found) + my_error(ER_UNKNOWN_SEQUENCES, MYF(0),share->table_name.str); if (!found) open_table_error(share, OPEN_FRM_OPEN_ERROR, ENOENT); // not found From 0b9842a3e766ec56ff3e14bec387dc639677c4db Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Mon, 28 Mar 2022 15:08:25 +0530 Subject: [PATCH 07/28] MDEV-13005: Fixing bugs in SEQUENCE, part 3, 2/5 Task 2: changed the error message and made it more reusable. --- mysql-test/suite/sql_sequence/alter.result | 6 +++--- mysql-test/suite/sql_sequence/aria.result | 2 +- mysql-test/suite/sql_sequence/create.result | 11 +++++++---- mysql-test/suite/sql_sequence/create.test | 4 ++++ mysql-test/suite/sql_sequence/gtid.result | 10 +++++----- mysql-test/suite/sql_sequence/other.result | 6 +++--- mysql-test/suite/sql_sequence/replication.result | 12 ++++++------ sql/share/errmsg-utf8.txt | 2 +- 8 files changed, 30 insertions(+), 23 deletions(-) diff --git a/mysql-test/suite/sql_sequence/alter.result b/mysql-test/suite/sql_sequence/alter.result index e0acc1c1b23..90de2ebfcc0 100644 --- a/mysql-test/suite/sql_sequence/alter.result +++ b/mysql-test/suite/sql_sequence/alter.result @@ -29,7 +29,7 @@ select * from t1; next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count 3 -100 9223372036854775806 50 1 0 0 0 alter sequence t1 minvalue=100 start=100; -ERROR HY000: Sequence 'test.t1' values are conflicting +ERROR HY000: Sequence 'test.t1' has out of range value for options alter sequence t1 minvalue=100 start=100 restart=100; show create sequence t1; Table Create Table @@ -200,11 +200,11 @@ next_not_cached_value minimum_value maximum_value start_value increment cache_si drop sequence t1; CREATE SEQUENCE t1 engine=myisam; alter sequence t1 minvalue=100; -ERROR HY000: Sequence 'test.t1' values are conflicting +ERROR HY000: Sequence 'test.t1' has out of range value for options drop sequence t1; CREATE SEQUENCE t1 engine=myisam; alter sequence t1 minvalue=25 maxvalue=20; -ERROR HY000: Sequence 'test.t1' values are conflicting +ERROR HY000: Sequence 'test.t1' has out of range value for options drop sequence t1; create table t1 (a int); alter sequence t1 minvalue=100; diff --git a/mysql-test/suite/sql_sequence/aria.result b/mysql-test/suite/sql_sequence/aria.result index b39d85d58ca..cfc7d946772 100644 --- a/mysql-test/suite/sql_sequence/aria.result +++ b/mysql-test/suite/sql_sequence/aria.result @@ -53,7 +53,7 @@ next value for s1 drop sequence s1; CREATE SEQUENCE t1; alter sequence t1 minvalue=100; -ERROR HY000: Sequence 'test.t1' values are conflicting +ERROR HY000: Sequence 'test.t1' has out of range value for options alter sequence t1 minvalue=100 start=100 restart=100; rename table t1 to t2; select next value for t2; diff --git a/mysql-test/suite/sql_sequence/create.result b/mysql-test/suite/sql_sequence/create.result index 65a4697a6ca..a7138756b11 100644 --- a/mysql-test/suite/sql_sequence/create.result +++ b/mysql-test/suite/sql_sequence/create.result @@ -167,11 +167,11 @@ drop sequence if exists t1; Warnings: Note 4091 Unknown SEQUENCE: 'test.t1' create sequence t1 start with 10 maxvalue=9; -ERROR HY000: Sequence 'test.t1' values are conflicting +ERROR HY000: Sequence 'test.t1' has out of range value for options create sequence t1 minvalue= 100 maxvalue=10; -ERROR HY000: Sequence 'test.t1' values are conflicting +ERROR HY000: Sequence 'test.t1' has out of range value for options create sequence t1 start with 9 minvalue=10; -ERROR HY000: Sequence 'test.t1' values are conflicting +ERROR HY000: Sequence 'test.t1' has out of range value for options create or replace sequence t1 maxvalue=13, increment by -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 ' increment by -1' at line 1 create or replace sequence t1 start with= 10 maxvalue=13; @@ -183,7 +183,7 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp create or replace sequence t1 start with 10 min_value=1 NO MINVALUE; 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 'NO MINVALUE' at line 1 create sequence t1 start with 10 maxvalue=9223372036854775807; -ERROR HY000: Sequence 'test.t1' values are conflicting +ERROR HY000: Sequence 'test.t1' has out of range value for options create sequence t1 start with 10 minvalue=-9223372036854775808; 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 '9223372036854775808' at line 1 create sequence t1 RESTART WITH 10; @@ -695,3 +695,6 @@ DROP SEQUENCE s1; # Task 1: SET @x = PREVIOUS VALUE FOR x; ERROR 42S02: Unknown SEQUENCE: 'x' +# Task 2: +CREATE SEQUENCE x START WITH 1 INCREMENT BY 123456789012345678; +ERROR HY000: Sequence 'test.x' has out of range value for options diff --git a/mysql-test/suite/sql_sequence/create.test b/mysql-test/suite/sql_sequence/create.test index 9d69924ca71..39fb5a9c9cd 100644 --- a/mysql-test/suite/sql_sequence/create.test +++ b/mysql-test/suite/sql_sequence/create.test @@ -525,3 +525,7 @@ DROP SEQUENCE s1; --echo # Task 1: --error ER_UNKNOWN_SEQUENCES SET @x = PREVIOUS VALUE FOR x; + +--echo # Task 2: +--error ER_SEQUENCE_INVALID_DATA +CREATE SEQUENCE x START WITH 1 INCREMENT BY 123456789012345678; diff --git a/mysql-test/suite/sql_sequence/gtid.result b/mysql-test/suite/sql_sequence/gtid.result index 8ca9a397354..495e4b806b7 100644 --- a/mysql-test/suite/sql_sequence/gtid.result +++ b/mysql-test/suite/sql_sequence/gtid.result @@ -109,28 +109,28 @@ maxvalue 100000 increment by 1 nocache nocycle; -ERROR HY000: Sequence 's_db.s2' values are conflicting +ERROR HY000: Sequence 's_db.s2' has out of range value for options create sequence s2 start with 1 minvalue 5 maxvalue 5 increment by 1 nocache nocycle; -ERROR HY000: Sequence 's_db.s2' values are conflicting +ERROR HY000: Sequence 's_db.s2' has out of range value for options create sequence s2 start with 1 minvalue 5 maxvalue 4 increment by 1 nocache nocycle; -ERROR HY000: Sequence 's_db.s2' values are conflicting +ERROR HY000: Sequence 's_db.s2' has out of range value for options create sequence s2 start with 1 minvalue 5 maxvalue 4 increment by 0 nocache nocycle; -ERROR HY000: Sequence 's_db.s2' values are conflicting +ERROR HY000: Sequence 's_db.s2' has out of range value for options ########################################### global read lock prevent query sequence ########################################### @@ -314,7 +314,7 @@ next_not_cached_value minimum_value maximum_value start_value increment cache_si update s_t set next_not_cached_value= 11,start_value=10, minimum_value=11; ERROR HY000: Storage engine SEQUENCE of the table `s_db`.`s_t` doesn't have this option ALTER SEQUENCE s_t restart with 11 start=10 minvalue=11; -ERROR HY000: Sequence 's_db.s_t' values are conflicting +ERROR HY000: Sequence 's_db.s_t' has out of range value for options commit; create table t_1(id int); insert into t_1 value(1111); diff --git a/mysql-test/suite/sql_sequence/other.result b/mysql-test/suite/sql_sequence/other.result index 643233149d2..8ac766702d3 100644 --- a/mysql-test/suite/sql_sequence/other.result +++ b/mysql-test/suite/sql_sequence/other.result @@ -50,9 +50,9 @@ ERROR HY000: Field 'maximum_value' doesn't have a default value insert into s1 values (next value for s1, 1,9223372036854775806,1,1,1000,0,0); ERROR HY000: Table 's1' is specified twice, both as a target for 'INSERT' and as a separate source for data insert into s1 values(1000,9223372036854775806,1,1,1,1000,0,0); -ERROR HY000: Sequence 'test.s1' values are conflicting +ERROR HY000: Sequence 'test.s1' has out of range value for options insert into s1 values(0,9223372036854775806,1,1,1,1000,0,0); -ERROR HY000: Sequence 'test.s1' values are conflicting +ERROR HY000: Sequence 'test.s1' has out of range value for options select * from s1; next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count 1 1 9223372036854775806 1 1 1000 0 0 @@ -67,7 +67,7 @@ select * from s1; next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count 2000 1 9223372036854775806 1 1 1000 0 0 insert into s2 values(0, 1, 10, 1, 2, 1, 1, 0); -ERROR HY000: Sequence 'test.s2' values are conflicting +ERROR HY000: Sequence 'test.s2' has out of range value for options select * from s1; next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count 2000 1 9223372036854775806 1 1 1000 0 0 diff --git a/mysql-test/suite/sql_sequence/replication.result b/mysql-test/suite/sql_sequence/replication.result index 7bf0eac8c47..c429b74b4cd 100644 --- a/mysql-test/suite/sql_sequence/replication.result +++ b/mysql-test/suite/sql_sequence/replication.result @@ -227,28 +227,28 @@ maxvalue 100000 increment by 1 nocache nocycle; -ERROR HY000: Sequence 's_db.s2' values are conflicting +ERROR HY000: Sequence 's_db.s2' has out of range value for options create sequence s2 start with 1 minvalue 5 maxvalue 5 increment by 1 nocache nocycle; -ERROR HY000: Sequence 's_db.s2' values are conflicting +ERROR HY000: Sequence 's_db.s2' has out of range value for options create sequence s2 start with 1 minvalue 5 maxvalue 4 increment by 1 nocache nocycle; -ERROR HY000: Sequence 's_db.s2' values are conflicting +ERROR HY000: Sequence 's_db.s2' has out of range value for options create sequence s2 start with 1 minvalue 5 maxvalue 4 increment by 0 nocache nocycle; -ERROR HY000: Sequence 's_db.s2' values are conflicting +ERROR HY000: Sequence 's_db.s2' has out of range value for options ########################################### global read lock prevent query sequence ########################################### @@ -412,12 +412,12 @@ select * from s_t; next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count 16 1 20 1 1 5 1 0 alter sequence s_t minvalue=11 maxvalue=9; -ERROR HY000: Sequence 's_db.s_t' values are conflicting +ERROR HY000: Sequence 's_db.s_t' has out of range value for options select * from s_t; next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count 16 1 20 1 1 5 1 0 alter sequence s_t restart= 12 start=10 minvalue=11 maxvalue=20; -ERROR HY000: Sequence 's_db.s_t' values are conflicting +ERROR HY000: Sequence 's_db.s_t' has out of range value for options select * from s_t; next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count 16 1 20 1 1 5 1 0 diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 4b744140afb..d913563dae3 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7762,7 +7762,7 @@ ER_END_IDENTIFIER_DOES_NOT_MATCH ER_SEQUENCE_RUN_OUT eng "Sequence '%-.64s.%-.64s' has run out" ER_SEQUENCE_INVALID_DATA - eng "Sequence '%-.64s.%-.64s' values are conflicting" + eng "Sequence '%-.64s.%-.64s' has out of range value for options" ER_SEQUENCE_INVALID_TABLE_STRUCTURE eng "Sequence '%-.64s.%-.64s' table structure is invalid (%s)" ER_SEQUENCE_ACCESS_ERROR From c6eeacd10f87eb437097d755d8dd29211ebdab87 Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Mon, 28 Mar 2022 15:12:33 +0530 Subject: [PATCH 08/28] MDEV-13005: Fixing bugs in SEQUENCE, part 3, 3/5 Task 3: Added an additional condition for SEQUENCE option to check if cache < 0. --- mysql-test/suite/sql_sequence/create.result | 3 +++ mysql-test/suite/sql_sequence/create.test | 4 ++++ sql/sql_sequence.cc | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/sql_sequence/create.result b/mysql-test/suite/sql_sequence/create.result index a7138756b11..e80400023e7 100644 --- a/mysql-test/suite/sql_sequence/create.result +++ b/mysql-test/suite/sql_sequence/create.result @@ -698,3 +698,6 @@ ERROR 42S02: Unknown SEQUENCE: 'x' # Task 2: CREATE SEQUENCE x START WITH 1 INCREMENT BY 123456789012345678; ERROR HY000: Sequence 'test.x' has out of range value for options +# Task 3: +CREATE SEQUENCE seq1 START WITH 1 cache -1; +ERROR HY000: Sequence 'test.seq1' has out of range value for options diff --git a/mysql-test/suite/sql_sequence/create.test b/mysql-test/suite/sql_sequence/create.test index 39fb5a9c9cd..766282be781 100644 --- a/mysql-test/suite/sql_sequence/create.test +++ b/mysql-test/suite/sql_sequence/create.test @@ -529,3 +529,7 @@ SET @x = PREVIOUS VALUE FOR x; --echo # Task 2: --error ER_SEQUENCE_INVALID_DATA CREATE SEQUENCE x START WITH 1 INCREMENT BY 123456789012345678; + +--echo # Task 3: +--error ER_SEQUENCE_INVALID_DATA +CREATE SEQUENCE seq1 START WITH 1 cache -1; diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index 03f2f1b117f..367fbad144c 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -121,7 +121,7 @@ bool sequence_definition::check_and_adjust(bool set_reserved_until) start >= min_value && max_value != LONGLONG_MAX && min_value != LONGLONG_MIN && - cache < (LONGLONG_MAX - max_increment) / max_increment && + cache >= 0 && cache < (LONGLONG_MAX - max_increment) / max_increment && ((real_increment > 0 && reserved_until >= min_value) || (real_increment < 0 && reserved_until <= max_value))) DBUG_RETURN(FALSE); From a8e7e7c0b4a66a9e92c03b0fe084e98393bafdce Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Mon, 28 Mar 2022 15:18:42 +0530 Subject: [PATCH 09/28] MDEV-13005: Fixing bugs in SEQUENCE, part 3, 4/5 Task 4 and 5: Already fixed when I started working on bug. Task 4 correctly gives syntax error ('(' and ')' are not part of create sequence syntax). Task 5 also gives correct error because s1 is table not sequence. Fails with ER_NOT_SEQUENCE2 --- mysql-test/suite/sql_sequence/create.result | 10 ++++++++++ mysql-test/suite/sql_sequence/create.test | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/mysql-test/suite/sql_sequence/create.result b/mysql-test/suite/sql_sequence/create.result index e80400023e7..a2f63042cd6 100644 --- a/mysql-test/suite/sql_sequence/create.result +++ b/mysql-test/suite/sql_sequence/create.result @@ -701,3 +701,13 @@ ERROR HY000: Sequence 'test.x' has out of range value for options # Task 3: CREATE SEQUENCE seq1 START WITH 1 cache -1; ERROR HY000: Sequence 'test.seq1' has out of range value for options +# Task 4: +CREATE TEMPORARY TABLE s1 (s1 INT); +DROP TEMPORARY SEQUENCE s1; +ERROR 42S02: 'test.s1' is not a SEQUENCE +DROP TEMPORARY TABLE s1; +# Task 5: +CREATE TEMPORARY TABLE s1 (s1 INT); +CREATE TEMPORARY SEQUENCE s1 (s1 INT); +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 '(s1 INT)' at line 1 +DROP TEMPORARY TABLE s1; diff --git a/mysql-test/suite/sql_sequence/create.test b/mysql-test/suite/sql_sequence/create.test index 766282be781..7e0c8f373dd 100644 --- a/mysql-test/suite/sql_sequence/create.test +++ b/mysql-test/suite/sql_sequence/create.test @@ -533,3 +533,15 @@ CREATE SEQUENCE x START WITH 1 INCREMENT BY 123456789012345678; --echo # Task 3: --error ER_SEQUENCE_INVALID_DATA CREATE SEQUENCE seq1 START WITH 1 cache -1; + +--echo # Task 4: +CREATE TEMPORARY TABLE s1 (s1 INT); +--error ER_NOT_SEQUENCE2 +DROP TEMPORARY SEQUENCE s1; +DROP TEMPORARY TABLE s1; + +--echo # Task 5: +CREATE TEMPORARY TABLE s1 (s1 INT); +--error ER_PARSE_ERROR +CREATE TEMPORARY SEQUENCE s1 (s1 INT); +DROP TEMPORARY TABLE s1; From 2eaaa8874fbc5212a3813e150d437b36ec34f22e Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Mon, 28 Mar 2022 15:45:29 +0530 Subject: [PATCH 10/28] MDEV-13005: Fixing bugs in SEQUENCE, part 3, 5/5 Task 6: We can find the .frm type of file. If it is sequence then is_sequence passed to dd_frm_type() will be true. Since there is already a check to give error message if we trigger is on temporary table or view, an additional condition is added to check if .frm is sequence (is_sequence==true) and error message is changed to show "Trigger's '%-.192s' is view, temporary table or sequence" instead of "Trigger's '%-.192s' is view or temporary table". --- mysql-test/main/trigger.result | 2 +- mysql-test/suite/funcs_1/r/innodb_trig_0407.result | 2 +- mysql-test/suite/funcs_1/r/memory_trig_0407.result | 2 +- mysql-test/suite/funcs_1/r/myisam_trig_0407.result | 2 +- mysql-test/suite/sql_sequence/create.result | 6 ++++++ mysql-test/suite/sql_sequence/create.test | 8 ++++++++ sql/share/errmsg-utf8.txt | 4 ++-- sql/sql_trigger.cc | 12 ++++++++++-- 8 files changed, 30 insertions(+), 8 deletions(-) diff --git a/mysql-test/main/trigger.result b/mysql-test/main/trigger.result index 756fd8591dd..571d78aa9e2 100644 --- a/mysql-test/main/trigger.result +++ b/mysql-test/main/trigger.result @@ -319,7 +319,7 @@ drop table t1; drop table t3; create temporary table t1 (i int); create trigger trg before insert on t1 for each row set @a:=1; -ERROR HY000: Trigger's 't1' is view or temporary table +ERROR HY000: Trigger's 't1' is view, temporary table or sequence drop table t1; create table t1 (x1col char); create trigger tx1 before insert on t1 for each row set new.x1col = 'x'; diff --git a/mysql-test/suite/funcs_1/r/innodb_trig_0407.result b/mysql-test/suite/funcs_1/r/innodb_trig_0407.result index 4753efd1794..b2ea135e011 100644 --- a/mysql-test/suite/funcs_1/r/innodb_trig_0407.result +++ b/mysql-test/suite/funcs_1/r/innodb_trig_0407.result @@ -237,7 +237,7 @@ Testcase 3.5.5.2: Create temporary table t1_temp (f1 bigint signed, f2 bigint unsigned); Create trigger trg2 before INSERT on t1_temp for each row set new.f2=9999; -ERROR HY000: Trigger's 't1_temp' is view or temporary table +ERROR HY000: Trigger's 't1_temp' is view, temporary table or sequence drop table t1_temp; Testcase 3.5.5.3: diff --git a/mysql-test/suite/funcs_1/r/memory_trig_0407.result b/mysql-test/suite/funcs_1/r/memory_trig_0407.result index c21c206f118..48858e8787a 100644 --- a/mysql-test/suite/funcs_1/r/memory_trig_0407.result +++ b/mysql-test/suite/funcs_1/r/memory_trig_0407.result @@ -237,7 +237,7 @@ Testcase 3.5.5.2: Create temporary table t1_temp (f1 bigint signed, f2 bigint unsigned); Create trigger trg2 before INSERT on t1_temp for each row set new.f2=9999; -ERROR HY000: Trigger's 't1_temp' is view or temporary table +ERROR HY000: Trigger's 't1_temp' is view, temporary table or sequence drop table t1_temp; Testcase 3.5.5.3: diff --git a/mysql-test/suite/funcs_1/r/myisam_trig_0407.result b/mysql-test/suite/funcs_1/r/myisam_trig_0407.result index c21c206f118..48858e8787a 100644 --- a/mysql-test/suite/funcs_1/r/myisam_trig_0407.result +++ b/mysql-test/suite/funcs_1/r/myisam_trig_0407.result @@ -237,7 +237,7 @@ Testcase 3.5.5.2: Create temporary table t1_temp (f1 bigint signed, f2 bigint unsigned); Create trigger trg2 before INSERT on t1_temp for each row set new.f2=9999; -ERROR HY000: Trigger's 't1_temp' is view or temporary table +ERROR HY000: Trigger's 't1_temp' is view, temporary table or sequence drop table t1_temp; Testcase 3.5.5.3: diff --git a/mysql-test/suite/sql_sequence/create.result b/mysql-test/suite/sql_sequence/create.result index a2f63042cd6..beb1561f9d5 100644 --- a/mysql-test/suite/sql_sequence/create.result +++ b/mysql-test/suite/sql_sequence/create.result @@ -711,3 +711,9 @@ CREATE TEMPORARY TABLE s1 (s1 INT); CREATE TEMPORARY SEQUENCE s1 (s1 INT); 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 '(s1 INT)' at line 1 DROP TEMPORARY TABLE s1; +# Task 6: +CREATE SEQUENCE seq1 START WITH 2; +CREATE TRIGGER s1 BEFORE UPDATE ON seq1 FOR EACH ROW SET @a= 5; +ERROR HY000: Trigger's 'seq1' is view, temporary table or sequence +DROP SEQUENCE seq1; +# End of 10.4 test diff --git a/mysql-test/suite/sql_sequence/create.test b/mysql-test/suite/sql_sequence/create.test index 7e0c8f373dd..aa58b0c5fec 100644 --- a/mysql-test/suite/sql_sequence/create.test +++ b/mysql-test/suite/sql_sequence/create.test @@ -545,3 +545,11 @@ CREATE TEMPORARY TABLE s1 (s1 INT); --error ER_PARSE_ERROR CREATE TEMPORARY SEQUENCE s1 (s1 INT); DROP TEMPORARY TABLE s1; + +--echo # Task 6: +CREATE SEQUENCE seq1 START WITH 2; +--error ER_TRG_ON_VIEW_OR_TEMP_TABLE +CREATE TRIGGER s1 BEFORE UPDATE ON seq1 FOR EACH ROW SET @a= 5; +DROP SEQUENCE seq1; + +--echo # End of 10.4 test diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index d913563dae3..40d99ec86b3 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -5421,8 +5421,8 @@ ER_TRG_DOES_NOT_EXIST ger "Trigger existiert nicht" hindi "TRIGGER मौजूद नहीं है" ER_TRG_ON_VIEW_OR_TEMP_TABLE - eng "Trigger's '%-.192s' is view or temporary table" - ger "'%-.192s' des Triggers ist View oder temporäre Tabelle" + eng "Trigger's '%-.192s' is view, temporary table or sequence" + hindi "'%-.192s' एक व्यू, टेम्पररी टेबल या सीक्वेंस है" ER_TRG_CANT_CHANGE_ROW eng "Updating of %s row is not allowed in %strigger" ger "Aktualisieren einer %s-Zeile ist in einem %s-Trigger nicht erlaubt" diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 08cc2113706..8df3cdc6a2e 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -413,6 +413,11 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) bool lock_upgrade_done= FALSE; MDL_ticket *mdl_ticket= NULL; Query_tables_list backup; + char path[FN_REFLEN + 1]; + char engine_name_buf[NAME_CHAR_LEN + 1]; + LEX_CSTRING engine_name= { engine_name_buf, 0 }; + bool is_sequence= 0; + DBUG_ENTER("mysql_create_or_drop_trigger"); /* Charset of the buffer for statement must be system one. */ @@ -529,8 +534,11 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) /* We should have only one table in table list. */ DBUG_ASSERT(tables->next_global == 0); - /* We do not allow creation of triggers on temporary tables. */ - if (create && thd->find_tmp_table_share(tables)) + build_table_filename(path, sizeof(path) - 1, tables->db.str, tables->alias.str, ".frm", 0); + tables->required_type= dd_frm_type(NULL, path, &engine_name, &is_sequence); + + /* We do not allow creation of triggers on temporary tables or sequence. */ + if (is_sequence || (create && thd->find_tmp_table_share(tables))) { my_error(ER_TRG_ON_VIEW_OR_TEMP_TABLE, MYF(0), tables->alias.str); goto end; From 35425cfc55b461176f3e1c60d0435595b772ff3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 30 Mar 2022 15:57:08 +0300 Subject: [PATCH 11/28] Cleanup: Remove some unused functions --- sql/ha_partition.h | 6 +- sql/handler.cc | 189 +--------------------------- sql/handler.h | 86 +------------ storage/federatedx/ha_federatedx.cc | 2 +- 4 files changed, 4 insertions(+), 279 deletions(-) diff --git a/sql/ha_partition.h b/sql/ha_partition.h index 2fccc37ec1f..3e481d9d67c 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -3,7 +3,7 @@ /* Copyright (c) 2005, 2012, Oracle and/or its affiliates. - Copyright (c) 2009, 2021, MariaDB Corporation. + Copyright (c) 2009, 2022, MariaDB Corporation. 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 @@ -793,10 +793,6 @@ public: NOTE: This cannot be cached since it can depend on TRANSACTION ISOLATION LEVEL which is dynamic, see bug#39084. - HA_READ_RND_SAME: - Not currently used. (Means that the handler supports the rnd_same() call) - (MyISAM, HEAP) - HA_TABLE_SCAN_ON_INDEX: Used to avoid scanning full tables on an index. If this flag is set then the handler always has a primary key (hidden if not defined) and this diff --git a/sql/handler.cc b/sql/handler.cc index 87592beb5d3..8ac6375ed7c 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2009, 2018, MariaDB Corporation. + Copyright (c) 2009, 2022, MariaDB Corporation. 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 @@ -2531,11 +2531,6 @@ double handler::keyread_time(uint index, uint ranges, ha_rows rows) len*rows/(stats.block_size+1)/TIME_FOR_COMPARE ; } -void **handler::ha_data(THD *thd) const -{ - return thd_ha_data(thd, ht); -} - THD *handler::ha_thd(void) const { DBUG_ASSERT(!table || !table->in_use || table->in_use == current_thd); @@ -6271,17 +6266,6 @@ void handler::unlock_shared_ha_data() mysql_mutex_unlock(&table_share->LOCK_ha_data); } -/** @brief - Dummy function which accept information about log files which is not need - by handlers -*/ -void signal_log_not_needed(struct handlerton, char *log_file) -{ - DBUG_ENTER("signal_log_not_needed"); - DBUG_PRINT("enter", ("logfile '%s'", log_file)); - DBUG_VOID_RETURN; -} - void handler::set_lock_type(enum thr_lock_type lock) { table->reginfo.lock_type= lock; @@ -6384,177 +6368,6 @@ void ha_fake_trx_id(THD *thd) #endif /* WITH_WSREP */ -#ifdef TRANS_LOG_MGM_EXAMPLE_CODE -/* - Example of transaction log management functions based on assumption that logs - placed into a directory -*/ -#include -#include -int example_of_iterator_using_for_logs_cleanup(handlerton *hton) -{ - void *buffer; - int res= 1; - struct handler_iterator iterator; - struct handler_log_file_data data; - - if (!hton->create_iterator) - return 1; /* iterator creator is not supported */ - - if ((*hton->create_iterator)(hton, HA_TRANSACTLOG_ITERATOR, &iterator) != - HA_ITERATOR_OK) - { - /* error during creation of log iterator or iterator is not supported */ - return 1; - } - while((*iterator.next)(&iterator, (void*)&data) == 0) - { - printf("%s\n", data.filename.str); - if (data.status == HA_LOG_STATUS_FREE && - mysql_file_delete(INSTRUMENT_ME, - data.filename.str, MYF(MY_WME))) - goto err; - } - res= 0; -err: - (*iterator.destroy)(&iterator); - return res; -} - - -/* - Here we should get info from handler where it save logs but here is - just example, so we use constant. - IMHO FN_ROOTDIR ("/") is safe enough for example, because nobody has - rights on it except root and it consist of directories only at lest for - *nix (sorry, can't find windows-safe solution here, but it is only example). -*/ -#define fl_dir FN_ROOTDIR - - -/** @brief - Dummy function to return log status should be replaced by function which - really detect the log status and check that the file is a log of this - handler. -*/ -enum log_status fl_get_log_status(char *log) -{ - MY_STAT stat_buff; - if (mysql_file_stat(INSTRUMENT_ME, log, &stat_buff, MYF(0))) - return HA_LOG_STATUS_INUSE; - return HA_LOG_STATUS_NOSUCHLOG; -} - - -struct fl_buff -{ - LEX_STRING *names; - enum log_status *statuses; - uint32 entries; - uint32 current; -}; - - -int fl_log_iterator_next(struct handler_iterator *iterator, - void *iterator_object) -{ - struct fl_buff *buff= (struct fl_buff *)iterator->buffer; - struct handler_log_file_data *data= - (struct handler_log_file_data *) iterator_object; - if (buff->current >= buff->entries) - return 1; - data->filename= buff->names[buff->current]; - data->status= buff->statuses[buff->current]; - buff->current++; - return 0; -} - - -void fl_log_iterator_destroy(struct handler_iterator *iterator) -{ - my_free(iterator->buffer); -} - - -/** @brief - returns buffer, to be assigned in handler_iterator struct -*/ -enum handler_create_iterator_result -fl_log_iterator_buffer_init(struct handler_iterator *iterator) -{ - MY_DIR *dirp; - struct fl_buff *buff; - char *name_ptr; - uchar *ptr; - FILEINFO *file; - uint32 i; - - /* to be able to make my_free without crash in case of error */ - iterator->buffer= 0; - - if (!(dirp = my_dir(fl_dir, MYF(MY_THREAD_SPECIFIC)))) - { - return HA_ITERATOR_ERROR; - } - if ((ptr= (uchar*)my_malloc(ALIGN_SIZE(sizeof(fl_buff)) + - ((ALIGN_SIZE(sizeof(LEX_STRING)) + - sizeof(enum log_status) + - + FN_REFLEN + 1) * - (uint) dirp->number_off_files), - MYF(MY_THREAD_SPECIFIC))) == 0) - { - return HA_ITERATOR_ERROR; - } - buff= (struct fl_buff *)ptr; - buff->entries= buff->current= 0; - ptr= ptr + (ALIGN_SIZE(sizeof(fl_buff))); - buff->names= (LEX_STRING*) (ptr); - ptr= ptr + ((ALIGN_SIZE(sizeof(LEX_STRING)) * - (uint) dirp->number_off_files)); - buff->statuses= (enum log_status *)(ptr); - name_ptr= (char *)(ptr + (sizeof(enum log_status) * - (uint) dirp->number_off_files)); - for (i=0 ; i < (uint) dirp->number_off_files ; i++) - { - enum log_status st; - file= dirp->dir_entry + i; - if ((file->name[0] == '.' && - ((file->name[1] == '.' && file->name[2] == '\0') || - file->name[1] == '\0'))) - continue; - if ((st= fl_get_log_status(file->name)) == HA_LOG_STATUS_NOSUCHLOG) - continue; - name_ptr= strxnmov(buff->names[buff->entries].str= name_ptr, - FN_REFLEN, fl_dir, file->name, NullS); - buff->names[buff->entries].length= (name_ptr - - buff->names[buff->entries].str); - buff->statuses[buff->entries]= st; - buff->entries++; - } - - iterator->buffer= buff; - iterator->next= &fl_log_iterator_next; - iterator->destroy= &fl_log_iterator_destroy; - my_dirend(dirp); - return HA_ITERATOR_OK; -} - - -/* An example of a iterator creator */ -enum handler_create_iterator_result -fl_create_iterator(enum handler_iterator_type type, - struct handler_iterator *iterator) -{ - switch(type) { - case HA_TRANSACTLOG_ITERATOR: - return fl_log_iterator_buffer_init(iterator); - default: - return HA_ITERATOR_UNSUPPORTED; - } -} -#endif /*TRANS_LOG_MGM_EXAMPLE_CODE*/ - - bool HA_CREATE_INFO::check_conflicting_charset_declarations(CHARSET_INFO *cs) { if ((used_fields & HA_CREATE_USED_DEFAULT_CHARSET) && diff --git a/sql/handler.h b/sql/handler.h index 27836f1735f..9bbe8e2fe5e 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -783,31 +783,6 @@ typedef bool (stat_print_fn)(THD *thd, const char *type, size_t type_len, enum ha_stat_type { HA_ENGINE_STATUS, HA_ENGINE_LOGS, HA_ENGINE_MUTEX }; extern MYSQL_PLUGIN_IMPORT st_plugin_int *hton2plugin[MAX_HA]; -/* Transaction log maintains type definitions */ -enum log_status -{ - HA_LOG_STATUS_FREE= 0, /* log is free and can be deleted */ - HA_LOG_STATUS_INUSE= 1, /* log can't be deleted because it is in use */ - HA_LOG_STATUS_NOSUCHLOG= 2 /* no such log (can't be returned by - the log iterator status) */ -}; -/* - Function for signaling that the log file changed its state from - LOG_STATUS_INUSE to LOG_STATUS_FREE - - Now it do nothing, will be implemented as part of new transaction - log management for engines. - TODO: implement the function. -*/ -void signal_log_not_needed(struct handlerton, char *log_file); -/* - Data of transaction log iterator. -*/ -struct handler_log_file_data { - LEX_STRING filename; - enum log_status status; -}; - /* Definitions for engine-specific table/field/index options in the CREATE TABLE. @@ -922,46 +897,6 @@ typedef struct st_ha_create_table_option { struct st_mysql_sys_var *var; } ha_create_table_option; -enum handler_iterator_type -{ - /* request of transaction log iterator */ - HA_TRANSACTLOG_ITERATOR= 1 -}; -enum handler_create_iterator_result -{ - HA_ITERATOR_OK, /* iterator created */ - HA_ITERATOR_UNSUPPORTED, /* such type of iterator is not supported */ - HA_ITERATOR_ERROR /* error during iterator creation */ -}; - -/* - Iterator structure. Can be used by handler/handlerton for different purposes. - - Iterator should be created in the way to point "before" the first object - it iterate, so next() call move it to the first object or return !=0 if - there is nothing to iterate through. -*/ -struct handler_iterator { - /* - Moves iterator to next record and return 0 or return !=0 - if there is no records. - iterator_object will be filled by this function if next() returns 0. - Content of the iterator_object depend on iterator type. - */ - int (*next)(struct handler_iterator *, void *iterator_object); - /* - Free resources allocated by iterator, after this call iterator - is not usable. - */ - void (*destroy)(struct handler_iterator *); - /* - Pointer to buffer for the iterator to use. - Should be allocated by function which created the iterator and - destroyed by freed by above "destroy" call - */ - void *buffer; -}; - class handler; class group_by_handler; struct Query; @@ -1223,22 +1158,6 @@ struct handlerton const char *query, uint query_length, const char *db, const char *table_name); - /* - Get log status. - If log_status is null then the handler do not support transaction - log information (i.e. log iterator can't be created). - (see example of implementation in handler.cc, TRANS_LOG_MGM_EXAMPLE_CODE) - - */ - enum log_status (*get_log_status)(handlerton *hton, char *log); - - /* - Iterators creator. - Presence of the pointer should be checked before using - */ - enum handler_create_iterator_result - (*create_iterator)(handlerton *hton, enum handler_iterator_type type, - struct handler_iterator *fill_this_in); void (*abort_transaction)(handlerton *hton, THD *bf_thd, THD *victim_thd, my_bool signal); int (*set_checkpoint)(handlerton *hton, const XID* xid); @@ -3291,15 +3210,13 @@ public: inline int ha_read_first_row(uchar *buf, uint primary_key); /** - The following 3 function is only needed for tables that may be + The following 2 function is only needed for tables that may be internal temporary tables during joins. */ virtual int remember_rnd_pos() { return HA_ERR_WRONG_COMMAND; } virtual int restart_rnd_next(uchar *buf) { return HA_ERR_WRONG_COMMAND; } - virtual int rnd_same(uchar *buf, uint inx) - { return HA_ERR_WRONG_COMMAND; } virtual ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key) @@ -3970,7 +3887,6 @@ public: TABLE_SHARE* get_table_share() { return table_share; } protected: /* Service methods for use by storage engines. */ - void **ha_data(THD *) const; THD *ha_thd(void) const; /** diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc index 65947c730e0..80497ec4e76 100644 --- a/storage/federatedx/ha_federatedx.cc +++ b/storage/federatedx/ha_federatedx.cc @@ -1720,7 +1720,7 @@ ha_rows ha_federatedx::records_in_range(uint inx, key_range *start_key, federatedx_txn *ha_federatedx::get_txn(THD *thd, bool no_create) { - federatedx_txn **txnp= (federatedx_txn **) ha_data(thd); + federatedx_txn **txnp= (federatedx_txn **) thd_ha_data(thd, ht); if (!*txnp && !no_create) *txnp= new federatedx_txn(); return *txnp; From c1ab0e6fc6b390965e03867bd010b58b1c5cf29e Mon Sep 17 00:00:00 2001 From: Vlad Lesin Date: Wed, 30 Mar 2022 19:27:44 +0300 Subject: [PATCH 12/28] MDEV-27343 Useless warning "InnoDB: Allocated tablespace ID for , old maximum was 0" during backup stage mariabackup does not load dictionary during backup, but it loads tablespaces, that is why fil_system.max_assigned_id is not set with dict_check_tablespaces_and_store_max_id(). There is no sense to issue the warning during backup. --- mysql-test/suite/mariabackup/full_backup.result | 1 + mysql-test/suite/mariabackup/full_backup.test | 9 ++++++++- storage/innobase/fil/fil0fil.cc | 10 ++++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/mariabackup/full_backup.result b/mysql-test/suite/mariabackup/full_backup.result index c387f5328a7..954151bbad7 100644 --- a/mysql-test/suite/mariabackup/full_backup.result +++ b/mysql-test/suite/mariabackup/full_backup.result @@ -1,6 +1,7 @@ CREATE TABLE t(i INT) ENGINE INNODB; INSERT INTO t VALUES(1); # xtrabackup backup +NOT FOUND /InnoDB: Allocated tablespace ID/ in backup.log INSERT INTO t VALUES(2); # xtrabackup prepare # shutdown server diff --git a/mysql-test/suite/mariabackup/full_backup.test b/mysql-test/suite/mariabackup/full_backup.test index d1d2ea21c08..66bed34cf3d 100644 --- a/mysql-test/suite/mariabackup/full_backup.test +++ b/mysql-test/suite/mariabackup/full_backup.test @@ -4,11 +4,18 @@ CREATE TABLE t(i INT) ENGINE INNODB; INSERT INTO t VALUES(1); echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--let $backup_log=$MYSQLTEST_VARDIR/tmp/backup.log --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir > $backup_log 2>&1; --enable_result_log +# The following warning must not appear after MDEV-27343 fix +--let SEARCH_PATTERN=InnoDB: Allocated tablespace ID +--let SEARCH_FILE=$backup_log +--source include/search_pattern_in_file.inc +--remove_file $backup_log + INSERT INTO t VALUES(2); diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 6980078f87d..f65a7428482 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -1418,10 +1418,12 @@ fil_space_create( if (!fil_system->space_id_reuse_warned) { fil_system->space_id_reuse_warned = true; - - ib::warn() << "Allocated tablespace ID " << id - << " for " << name << ", old maximum was " - << fil_system->max_assigned_id; + if (srv_operation != SRV_OPERATION_BACKUP) { + ib::warn() << "Allocated tablespace ID " << id + << " for " << name + << ", old maximum was " + << fil_system->max_assigned_id; + } } fil_system->max_assigned_id = id; From 69be3c13b66f75a0f093b0685d28ea793266b172 Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 31 Mar 2022 15:40:17 +0300 Subject: [PATCH 13/28] Fixed unlikely assert/crash if initialization of translog failed This was noticed as part of verifying MDEV-28186 "crash on startup after crash while regular use" but is probably not related to the users issue. Still good to have it fixed --- storage/maria/ma_loghandler.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index 9de4480062b..8455cbb80de 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -8936,20 +8936,23 @@ void translog_hard_group_commit(my_bool mode) void translog_sync() { - uint32 max= get_current_logfile()->number; - uint32 min; DBUG_ENTER("ma_translog_sync"); - min= soft_sync_min; - if (!min) - min= max; + /* The following is only true if initalization of translog succeded */ + if (log_descriptor.open_files.elements != 0) + { + uint32 max= get_current_logfile()->number; + uint32 min; - translog_sync_files(min, max, sync_log_dir >= TRANSLOG_SYNC_DIR_ALWAYS); + min= soft_sync_min; + if (!min) + min= max; + translog_sync_files(min, max, sync_log_dir >= TRANSLOG_SYNC_DIR_ALWAYS); + } DBUG_VOID_RETURN; } - /** @brief set rate for group commit From c62843a055f52b27230926b12d9ee4f7aa68e1a0 Mon Sep 17 00:00:00 2001 From: Brandon Nesterenko Date: Thu, 31 Mar 2022 13:00:46 -0600 Subject: [PATCH 14/28] MDEV-25580: rpl.rpl_semi_sync_slave_compressed_protocol crashes because of wrong packet rpl.rpl_semi_sync_slave_compressed_protocol.test was manually re-enabled only in 10.3 but left disabled in 10.4+. The fix went into 10.3+, but the test was left disabled in later versions. This commit re-enables the test in 10.4+. --- mysql-test/suite/rpl/disabled.def | 1 - 1 file changed, 1 deletion(-) diff --git a/mysql-test/suite/rpl/disabled.def b/mysql-test/suite/rpl/disabled.def index bdc01f9efcb..548cff54834 100644 --- a/mysql-test/suite/rpl/disabled.def +++ b/mysql-test/suite/rpl/disabled.def @@ -14,6 +14,5 @@ rpl_partition_archive : MDEV-5077 2013-09-27 svoj Cannot exchange partition rpl_row_binlog_max_cache_size : MDEV-11092 rpl_row_index_choice : MDEV-11666 rpl_semi_sync_after_sync : fails after MDEV-16172 -rpl_semi_sync_slave_compressed_protocol : MDEV-25580 2021-05-05 Sujatha rpl_auto_increment_update_failure : disabled for now rpl_current_user : waits for MDEV-22374 fix From 49aee1a153a8401b0e8fc42bc73d7d42ab1be18d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Fri, 1 Apr 2022 13:29:31 +0300 Subject: [PATCH 15/28] MDEV-28210 : SIGSEGV in the test galera.galera_sst_rsync2 We should make sure that wsrep exists before calling wsrep->post_rollback --- sql/wsrep_hton.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/wsrep_hton.cc b/sql/wsrep_hton.cc index 05be257cbcb..1e302734df8 100644 --- a/sql/wsrep_hton.cc +++ b/sql/wsrep_hton.cc @@ -1,4 +1,4 @@ -/* Copyright 2008-2015 Codership Oy +/* Copyright 2008-2022 Codership Oy 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 @@ -155,7 +155,7 @@ void wsrep_post_commit(THD* thd, bool all) */ if (all && thd->wsrep_conflict_state != MUST_REPLAY && thd->wsrep_conflict_state != REPLAYING && - wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) + wsrep && wsrep->post_rollback(wsrep, &thd->wsrep_ws_handle)) { WSREP_WARN("post_rollback fail: %llu %d", (long long)thd->thread_id, thd->get_stmt_da()->status()); From 1118b66a22bbbe832b6429d7d1b3478119980f21 Mon Sep 17 00:00:00 2001 From: Anel Husakovic Date: Tue, 8 Sep 2020 00:01:09 +0200 Subject: [PATCH 16/28] MDEV-23626: CONNECT VIR tables return inconsistent error for UPDATE - Before the patch UPDATE error message for VIR tables was different from TRUNCATE,UPDATE,DELETE Reviewed by: , vicentiu@mariadb.org --- storage/connect/connect.cc | 7 +++++++ .../connect/mysql-test/connect/r/general.result | 14 ++++++++++++++ .../connect/mysql-test/connect/t/general.test | 17 +++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/storage/connect/connect.cc b/storage/connect/connect.cc index ee62e0cd03e..8aceee61f36 100644 --- a/storage/connect/connect.cc +++ b/storage/connect/connect.cc @@ -297,6 +297,13 @@ bool CntOpenTable(PGLOBAL g, PTDB tdbp, MODE mode, char *c1, char *c2, PTDB utp; if (!(utp = tdbp->Duplicate(g))) { + /* If table type is of type virtual retrieve global parameter as it was.*/ + if (tdbp->GetAmType() == TYPE_AM_VIR) { + if (tdbp->OpenDB(g)) { + printf("%s\n", g->Message); + throw 7; + } + } sprintf(g->Message, MSG(INV_UPDT_TABLE), tdbp->GetName()); throw 4; } // endif tp diff --git a/storage/connect/mysql-test/connect/r/general.result b/storage/connect/mysql-test/connect/r/general.result index ed2c903145d..ef023b7c8d9 100644 --- a/storage/connect/mysql-test/connect/r/general.result +++ b/storage/connect/mysql-test/connect/r/general.result @@ -16,3 +16,17 @@ SELECT * FROM t1; a 10 DROP TABLE t1; +# +# MDEV-23626: CONNECT VIR tables return inconsistent error for UPDATE +# +CREATE TABLE numbers +ENGINE=CONNECT, +TABLE_TYPE=VIR, +BLOCK_SIZE=3; +TRUNCATE TABLE numbers; +ERROR HY000: Got error 174 'Virtual tables are read only' from CONNECT +DELETE FROM numbers WHERE n = 1; +ERROR HY000: Got error 174 'Virtual tables are read only' from CONNECT +UPDATE numbers SET n = 10 WHERE n = 1; +ERROR HY000: Got error 174 'Virtual tables are read only' from CONNECT +DROP TABLE numbers; diff --git a/storage/connect/mysql-test/connect/t/general.test b/storage/connect/mysql-test/connect/t/general.test index 34e5d4c7b6d..e2f228738cf 100644 --- a/storage/connect/mysql-test/connect/t/general.test +++ b/storage/connect/mysql-test/connect/t/general.test @@ -14,3 +14,20 @@ SELECT * FROM t1; ALTER TABLE t1 TABLE_TYPE=NON_EXISTING; SELECT * FROM t1; DROP TABLE t1; + +--echo # +--echo # MDEV-23626: CONNECT VIR tables return inconsistent error for UPDATE +--echo # + +CREATE TABLE numbers +ENGINE=CONNECT, +TABLE_TYPE=VIR, +BLOCK_SIZE=3; + +--error ER_GET_ERRMSG +TRUNCATE TABLE numbers; +--error ER_GET_ERRMSG +DELETE FROM numbers WHERE n = 1; +--error ER_GET_ERRMSG +UPDATE numbers SET n = 10 WHERE n = 1; +DROP TABLE numbers; From 8c169f5e03441324d935b68335f0894ec51b0b60 Mon Sep 17 00:00:00 2001 From: Dmitry Shulga Date: Sat, 2 Apr 2022 16:43:51 +0700 Subject: [PATCH 17/28] MDEV-28220: Assert failure in sp_head::~sp_head on parsing a syntax incorrect statement CREATE SEQUENCE ... RESTART inside CREATE PROCEDURE/CREATE FUNCTION This bug report is about the same issue as MDEV-28129 and MDEV-21173. The issue is that the macros YYABORT is called instead of MYSQL_YYABORT on parse error. In result the method LEX::cleanup_lex_after_parse_error is not called to clean up data structures created on parsing of the statement. --- mysql-test/main/sp.result | 13 +++++++++++++ mysql-test/main/sp.test | 15 +++++++++++++++ sql/sql_yacc.yy | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/mysql-test/main/sp.result b/mysql-test/main/sp.result index 6e8ae437d8b..70fe91863a3 100644 --- a/mysql-test/main/sp.result +++ b/mysql-test/main/sp.result @@ -8921,4 +8921,17 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp BEGIN RETURN ''; END' at line 2 +# +# MDEV-28220: Assert failure in sp_head::~sp_head on parsing a syntax incorrect statement CREATE SEQUENCE ... RESTART inside CREATE PROCEDURE/CREATE FUNCTION + +# Specifying the RESTART clause for the statement CREATE SEQUENCE is a syntax error. +# Check that CREATE PROCEDURE doesn't crash server if the statement +# CREATE SEQUNCE ... RESTART is specified in its body. +# +CREATE PROCEDURE sp1() CREATE SEQUENCE s1 START WITH 300 INCREMENT BY 30 RESTART; +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 'RESTART' at line 1 +# CREATE SEQUNCE ... RESTART and CREATE SEQUNCE ... RESTART WITH ... are +# handled by different grammar rules, so check the both cases. +CREATE PROCEDURE sp1() CREATE SEQUENCE s1 START WITH 300 INCREMENT BY 30 RESTART WITH 100; +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 'RESTART' at line 1 # End of 10.3 tests diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test index f311baccd08..d167c1e8f73 100644 --- a/mysql-test/main/sp.test +++ b/mysql-test/main/sp.test @@ -10474,4 +10474,19 @@ END; $$ DELIMITER ;$$ +--echo # +--echo # MDEV-28220: Assert failure in sp_head::~sp_head on parsing a syntax incorrect statement CREATE SEQUENCE ... RESTART inside CREATE PROCEDURE/CREATE FUNCTION +--echo + +--echo # Specifying the RESTART clause for the statement CREATE SEQUENCE is a syntax error. +--echo # Check that CREATE PROCEDURE doesn't crash server if the statement +--echo # CREATE SEQUNCE ... RESTART is specified in its body. +--echo # +--error ER_PARSE_ERROR +CREATE PROCEDURE sp1() CREATE SEQUENCE s1 START WITH 300 INCREMENT BY 30 RESTART; +--echo # CREATE SEQUNCE ... RESTART and CREATE SEQUNCE ... RESTART WITH ... are +--echo # handled by different grammar rules, so check the both cases. +--error ER_PARSE_ERROR +CREATE PROCEDURE sp1() CREATE SEQUENCE s1 START WITH 300 INCREMENT BY 30 RESTART WITH 100; + --echo # End of 10.3 tests diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index a427c7a40c5..3770488f3f4 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3037,7 +3037,7 @@ sequence_def: if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) { thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); - YYABORT; + MYSQL_YYABORT; } if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_restart)) @@ -3049,7 +3049,7 @@ sequence_def: if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) { thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); - YYABORT; + MYSQL_YYABORT; } if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_restart)) From 75b9014fedd8bb85d15501a2281fbade6b56fe78 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Fri, 1 Apr 2022 16:07:12 +1100 Subject: [PATCH 18/28] MDEV-26136: Correct AIX/macOS cast warning (my_time.h) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tv_usec is a (suseconds_t) so we cast to it. Prevents the AIX(gcc-10) warning: include/my_time.h: In function 'void my_timeval_trunc(timeval*, uint)': include/my_time.h:249:65: warning: conversion from 'long int' to 'suseconds_t' {aka 'int'} may change value [-Wconversion] 249 | tv->tv_usec-= my_time_fraction_remainder(tv->tv_usec, decimals); | macOS is: conversion from 'long int' to '__darwin_suseconds_t' {aka 'int'} may change value On Windows suseconds_t isn't defined so we use the existing long return type of my_time_fraction_remainder. Reviewed by Marko Mäkelä Closes: #2079 --- include/my_time.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/my_time.h b/include/my_time.h index eeb790cdb54..9fb3bf199bf 100644 --- a/include/my_time.h +++ b/include/my_time.h @@ -220,9 +220,12 @@ static inline void my_time_trunc(MYSQL_TIME *ltime, uint decimals) { ltime->second_part-= my_time_fraction_remainder(ltime->second_part, decimals); } +#ifdef _WIN32 +#define suseconds_t long +#endif static inline void my_timeval_trunc(struct timeval *tv, uint decimals) { - tv->tv_usec-= my_time_fraction_remainder(tv->tv_usec, decimals); + tv->tv_usec-= (suseconds_t) my_time_fraction_remainder(tv->tv_usec, decimals); } From d271fbd392b02ff8b98d552aef7164270c9d66fd Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 4 Apr 2022 08:50:24 +0400 Subject: [PATCH 19/28] MDEV-28224 error: cannot initialize return object of type 'bool' with an rvalue of type 'nullptr_t' Fixing a typo in the fix for MDEV-19804, wrong return value in a bool function: < return NULL; > return true; The problem was found because it did not compile on some platforms. Strangley, it did not have visible problems on other platforms, which did not fail to compile, although "return NULL" should compile to "return false" rather than "return true". --- sql/sql_lex.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index c70fef9709f..7f1b362d91d 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -7906,18 +7906,18 @@ bool LEX::call_statement_start(THD *thd, const LEX_CSTRING &db, if (check_db_name((LEX_STRING*) const_cast(&db))) { my_error(ER_WRONG_DB_NAME, MYF(0), db.str); - return NULL; + return true; } if (check_routine_name(&pkg) || check_routine_name(&proc)) - return NULL; + return true; // Concat `pkg` and `name` to `pkg.name` LEX_CSTRING pkg_dot_proc; if (q_pkg_proc.make_qname(thd->mem_root, &pkg_dot_proc) || check_ident_length(&pkg_dot_proc) || !(spname= new (thd->mem_root) sp_name(&db, &pkg_dot_proc, true))) - return NULL; + return true; sp_handler_package_function.add_used_routine(thd->lex, thd, spname); sp_handler_package_body.add_used_routine(thd->lex, thd, &q_db_pkg); From 0ffaf19c53ccd102a369016cd01dec38ee9ac5a7 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 4 Apr 2022 09:45:29 +0400 Subject: [PATCH 20/28] Adding a "const" qualifier to arguments of create_func(), create_native() etc The "const" qualifier was obviously forgotten. This change will also simpily fixing of MDEV-27744. --- plugin/versioning/versioning.cc | 8 +- sql/item_create.cc | 334 +++++++++++++++++++------------- sql/item_create.h | 15 +- 3 files changed, 215 insertions(+), 142 deletions(-) diff --git a/plugin/versioning/versioning.cc b/plugin/versioning/versioning.cc index 56f8f1f5a1d..fd0e7099666 100644 --- a/plugin/versioning/versioning.cc +++ b/plugin/versioning/versioning.cc @@ -29,7 +29,8 @@ template class Create_func_trt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_trt s_singleton; @@ -43,7 +44,7 @@ Create_func_trt Create_func_trt::s_singleton; template Item* -Create_func_trt::create_native(THD *thd, LEX_CSTRING *name, +Create_func_trt::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -102,7 +103,8 @@ template class Create_func_trt_trx_sees : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list) + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; diff --git a/sql/item_create.cc b/sql/item_create.cc index 657397c41dd..52e0312f89b 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -49,7 +49,7 @@ class Create_func_arg0 : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, List *item_list); /** @@ -74,7 +74,8 @@ protected: class Create_func_arg1 : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, + List *item_list); /** Builder method, with one argument. @@ -99,7 +100,8 @@ protected: class Create_func_arg2 : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, + List *item_list); /** Builder method, with two arguments. @@ -124,7 +126,8 @@ protected: class Create_func_arg3 : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, + List *item_list); /** Builder method, with three arguments. @@ -150,7 +153,9 @@ protected: class Create_sp_func : public Create_qfunc { public: - virtual Item *create_with_db(THD *thd, LEX_CSTRING *db, LEX_CSTRING *name, + virtual Item *create_with_db(THD *thd, + const LEX_CSTRING *db, + const LEX_CSTRING *name, bool use_explicit_name, List *item_list); static Create_sp_func s_singleton; @@ -173,7 +178,8 @@ protected: class Create_func_no_geom : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, + List *item_list); /** Singleton. */ static Create_func_no_geom s_singleton; @@ -319,7 +325,8 @@ protected: class Create_func_atan : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_atan s_singleton; @@ -553,7 +560,8 @@ protected: class Create_func_concat : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_concat s_singleton; @@ -566,7 +574,8 @@ protected: class Create_func_concat_operator_oracle : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_concat_operator_oracle s_singleton; @@ -592,7 +601,8 @@ protected: class Create_func_decode_oracle : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_decode_oracle s_singleton; @@ -605,7 +615,8 @@ protected: class Create_func_concat_ws : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_concat_ws s_singleton; @@ -830,7 +841,8 @@ protected: class Create_func_des_decrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_des_decrypt s_singleton; @@ -843,7 +855,8 @@ protected: class Create_func_des_encrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_des_encrypt s_singleton; @@ -911,7 +924,8 @@ class Create_func_distance : public Create_func_arg2 class Create_func_distance_sphere: public Create_native_func { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_distance_sphere s_singleton; protected: @@ -925,7 +939,8 @@ class Create_func_distance_sphere: public Create_native_func class Create_func_elt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_elt s_singleton; @@ -951,7 +966,8 @@ protected: class Create_func_encrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_encrypt s_singleton; @@ -1047,7 +1063,8 @@ protected: class Create_func_export_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_export_set s_singleton; @@ -1075,7 +1092,8 @@ protected: class Create_func_field : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_field s_singleton; @@ -1114,7 +1132,8 @@ protected: class Create_func_format : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_format s_singleton; @@ -1166,7 +1185,8 @@ protected: class Create_func_from_unixtime : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_from_unixtime s_singleton; @@ -1180,7 +1200,8 @@ protected: class Create_func_geometry_from_text : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_geometry_from_text s_singleton; @@ -1195,7 +1216,8 @@ protected: class Create_func_geometry_from_wkb : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_geometry_from_wkb s_singleton; @@ -1210,7 +1232,8 @@ protected: class Create_func_geometry_from_json : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_geometry_from_json s_singleton; @@ -1223,7 +1246,8 @@ protected: class Create_func_as_geojson : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_as_geojson s_singleton; @@ -1310,7 +1334,8 @@ protected: class Create_func_greatest : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_greatest s_singleton; @@ -1736,7 +1761,8 @@ protected: class Create_func_json_detailed: public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_detailed s_singleton; @@ -1801,7 +1827,8 @@ protected: class Create_func_json_keys: public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_keys s_singleton; @@ -1814,7 +1841,8 @@ protected: class Create_func_json_contains: public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_contains s_singleton; @@ -1827,7 +1855,8 @@ protected: class Create_func_json_contains_path : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_contains_path s_singleton; @@ -1840,7 +1869,8 @@ protected: class Create_func_json_extract : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_extract s_singleton; @@ -1853,7 +1883,8 @@ protected: class Create_func_json_search : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_search s_singleton; @@ -1866,7 +1897,8 @@ protected: class Create_func_json_array : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_array s_singleton; @@ -1879,7 +1911,8 @@ protected: class Create_func_json_array_append : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_array_append s_singleton; @@ -1892,7 +1925,8 @@ protected: class Create_func_json_array_insert : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_array_insert s_singleton; @@ -1905,7 +1939,8 @@ protected: class Create_func_json_insert : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_insert s_singleton; @@ -1918,7 +1953,8 @@ protected: class Create_func_json_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_set s_singleton; @@ -1931,7 +1967,8 @@ protected: class Create_func_json_replace : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_replace s_singleton; @@ -1944,7 +1981,8 @@ protected: class Create_func_json_remove : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_remove s_singleton; @@ -1957,7 +1995,8 @@ protected: class Create_func_json_object : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_object s_singleton; @@ -1970,7 +2009,8 @@ protected: class Create_func_json_length : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_length s_singleton; @@ -1983,7 +2023,8 @@ protected: class Create_func_json_merge : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_merge s_singleton; @@ -1996,7 +2037,8 @@ protected: class Create_func_json_merge_patch : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_json_merge_patch s_singleton; @@ -2048,7 +2090,8 @@ protected: class Create_func_last_insert_id : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_last_insert_id s_singleton; @@ -2074,7 +2117,8 @@ protected: class Create_func_least : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_least s_singleton; @@ -2166,7 +2210,8 @@ protected: class Create_func_locate : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_locate s_singleton; @@ -2179,7 +2224,8 @@ protected: class Create_func_log : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_log s_singleton; @@ -2218,7 +2264,7 @@ protected: class Create_func_lpad : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { return thd->variables.sql_mode & MODE_ORACLE ? @@ -2230,15 +2276,18 @@ public: protected: Create_func_lpad() {} virtual ~Create_func_lpad() {} - Item *create_native_std(THD *thd, LEX_CSTRING *name, List *items); - Item *create_native_oracle(THD *thd, LEX_CSTRING *name, List *items); + Item *create_native_std(THD *thd, const LEX_CSTRING *name, + List *items); + Item *create_native_oracle(THD *thd, const LEX_CSTRING *name, + List *items); }; class Create_func_lpad_oracle : public Create_func_lpad { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { return create_native_oracle(thd, name, item_list); } @@ -2301,7 +2350,8 @@ protected: class Create_func_make_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_make_set s_singleton; @@ -2314,7 +2364,8 @@ protected: class Create_func_master_pos_wait : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_master_pos_wait s_singleton; @@ -2327,7 +2378,8 @@ protected: class Create_func_master_gtid_wait : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_master_gtid_wait s_singleton; @@ -2623,7 +2675,8 @@ protected: class Create_func_rand : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_rand s_singleton; @@ -2675,7 +2728,8 @@ protected: class Create_func_round : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_round s_singleton; @@ -2688,7 +2742,7 @@ protected: class Create_func_rpad : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { return thd->variables.sql_mode & MODE_ORACLE ? @@ -2700,15 +2754,18 @@ public: protected: Create_func_rpad() {} virtual ~Create_func_rpad() {} - Item *create_native_std(THD *thd, LEX_CSTRING *name, List *items); - Item *create_native_oracle(THD *thd, LEX_CSTRING *name, List *items); + Item *create_native_std(THD *thd, const LEX_CSTRING *name, + List *items); + Item *create_native_oracle(THD *thd, const LEX_CSTRING *name, + List *items); }; class Create_func_rpad_oracle : public Create_func_rpad { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { return create_native_oracle(thd, name, item_list); } @@ -2931,7 +2988,7 @@ protected: class Create_func_substr_oracle : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, List *item_list); static Create_func_substr_oracle s_singleton; @@ -3115,7 +3172,8 @@ protected: class Create_func_unix_timestamp : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_unix_timestamp s_singleton; @@ -3277,7 +3335,8 @@ protected: class Create_func_year_week : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list); static Create_func_year_week s_singleton; @@ -3321,7 +3380,7 @@ Create_func_no_geom Create_func_no_geom::s_singleton; Item* Create_func_no_geom::create_func(THD * /* unused */, - LEX_CSTRING /* unused */, + const LEX_CSTRING /* unused */, List * /* unused */) { /* FIXME: error message can't be translated. */ @@ -3333,7 +3392,8 @@ Create_func_no_geom::create_func(THD * /* unused */, Item* -Create_qfunc::create_func(THD *thd, LEX_CSTRING *name, List *item_list) +Create_qfunc::create_func(THD *thd, const LEX_CSTRING *name, + List *item_list) { LEX_CSTRING db; @@ -3366,7 +3426,8 @@ Create_qfunc::create_func(THD *thd, LEX_CSTRING *name, List *item_list) Create_udf_func Create_udf_func::s_singleton; Item* -Create_udf_func::create_func(THD *thd, LEX_CSTRING *name, List *item_list) +Create_udf_func::create_func(THD *thd, const LEX_CSTRING *name, + List *item_list) { udf_func *udf= find_udf(name->str, name->length); DBUG_ASSERT(udf); @@ -3476,7 +3537,9 @@ Create_udf_func::create(THD *thd, udf_func *udf, List *item_list) Create_sp_func Create_sp_func::s_singleton; Item* -Create_sp_func::create_with_db(THD *thd, LEX_CSTRING *db, LEX_CSTRING *name, +Create_sp_func::create_with_db(THD *thd, + const LEX_CSTRING *db, + const LEX_CSTRING *name, bool use_explicit_name, List *item_list) { int arg_count= 0; @@ -3524,7 +3587,8 @@ Create_sp_func::create_with_db(THD *thd, LEX_CSTRING *db, LEX_CSTRING *name, Item* -Create_native_func::create_func(THD *thd, LEX_CSTRING *name, List *item_list) +Create_native_func::create_func(THD *thd, const LEX_CSTRING *name, + List *item_list) { if (unlikely(has_named_parameters(item_list))) { @@ -3537,7 +3601,8 @@ Create_native_func::create_func(THD *thd, LEX_CSTRING *name, List *item_li Item* -Create_func_arg0::create_func(THD *thd, LEX_CSTRING *name, List *item_list) +Create_func_arg0::create_func(THD *thd, const LEX_CSTRING *name, + List *item_list) { int arg_count= 0; @@ -3555,7 +3620,8 @@ Create_func_arg0::create_func(THD *thd, LEX_CSTRING *name, List *item_list Item* -Create_func_arg1::create_func(THD *thd, LEX_CSTRING *name, List *item_list) +Create_func_arg1::create_func(THD *thd, const LEX_CSTRING *name, + List *item_list) { int arg_count= 0; @@ -3581,7 +3647,8 @@ Create_func_arg1::create_func(THD *thd, LEX_CSTRING *name, List *item_list Item* -Create_func_arg2::create_func(THD *thd, LEX_CSTRING *name, List *item_list) +Create_func_arg2::create_func(THD *thd, const LEX_CSTRING *name, + List *item_list) { int arg_count= 0; @@ -3609,7 +3676,8 @@ Create_func_arg2::create_func(THD *thd, LEX_CSTRING *name, List *item_list Item* -Create_func_arg3::create_func(THD *thd, LEX_CSTRING *name, List *item_list) +Create_func_arg3::create_func(THD *thd, const LEX_CSTRING *name, + List *item_list) { int arg_count= 0; @@ -3728,7 +3796,7 @@ Create_func_asin::create_1_arg(THD *thd, Item *arg1) Create_func_atan Create_func_atan::s_singleton; Item* -Create_func_atan::create_native(THD *thd, LEX_CSTRING *name, +Create_func_atan::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item* func= NULL; @@ -3919,7 +3987,7 @@ Create_func_dyncol_json::create_1_arg(THD *thd, Item *arg1) Create_func_concat Create_func_concat::s_singleton; Item* -Create_func_concat::create_native(THD *thd, LEX_CSTRING *name, +Create_func_concat::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -3942,7 +4010,7 @@ Create_func_concat_operator_oracle Create_func_concat_operator_oracle::s_singleton; Item* -Create_func_concat_operator_oracle::create_native(THD *thd, LEX_CSTRING *name, +Create_func_concat_operator_oracle::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -3970,7 +4038,7 @@ Create_func_decode_histogram::create_2_arg(THD *thd, Item *arg1, Item *arg2) Create_func_decode_oracle Create_func_decode_oracle::s_singleton; Item* -Create_func_decode_oracle::create_native(THD *thd, LEX_CSTRING *name, +Create_func_decode_oracle::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { uint arg_count= item_list ? item_list->elements : 0; @@ -3985,7 +4053,7 @@ Create_func_decode_oracle::create_native(THD *thd, LEX_CSTRING *name, Create_func_concat_ws Create_func_concat_ws::s_singleton; Item* -Create_func_concat_ws::create_native(THD *thd, LEX_CSTRING *name, +Create_func_concat_ws::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -4172,7 +4240,7 @@ Create_func_degrees::create_1_arg(THD *thd, Item *arg1) Create_func_des_decrypt Create_func_des_decrypt::s_singleton; Item* -Create_func_des_decrypt::create_native(THD *thd, LEX_CSTRING *name, +Create_func_des_decrypt::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -4209,7 +4277,7 @@ Create_func_des_decrypt::create_native(THD *thd, LEX_CSTRING *name, Create_func_des_encrypt Create_func_des_encrypt::s_singleton; Item* -Create_func_des_encrypt::create_native(THD *thd, LEX_CSTRING *name, +Create_func_des_encrypt::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -4288,7 +4356,7 @@ Create_func_distance::create_2_arg(THD *thd, Item *arg1, Item *arg2) Create_func_elt Create_func_elt::s_singleton; Item* -Create_func_elt::create_native(THD *thd, LEX_CSTRING *name, +Create_func_elt::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -4318,7 +4386,7 @@ Create_func_encode::create_2_arg(THD *thd, Item *arg1, Item *arg2) Create_func_encrypt Create_func_encrypt::s_singleton; Item* -Create_func_encrypt::create_native(THD *thd, LEX_CSTRING *name, +Create_func_encrypt::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -4419,7 +4487,7 @@ Create_func_exp::create_1_arg(THD *thd, Item *arg1) Create_func_export_set Create_func_export_set::s_singleton; Item* -Create_func_export_set::create_native(THD *thd, LEX_CSTRING *name, +Create_func_export_set::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -4484,7 +4552,7 @@ Create_func_exteriorring::create_1_arg(THD *thd, Item *arg1) Create_func_field Create_func_field::s_singleton; Item* -Create_func_field::create_native(THD *thd, LEX_CSTRING *name, +Create_func_field::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -4523,7 +4591,7 @@ Create_func_floor::create_1_arg(THD *thd, Item *arg1) Create_func_format Create_func_format::s_singleton; Item* -Create_func_format::create_native(THD *thd, LEX_CSTRING *name, +Create_func_format::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -4588,7 +4656,7 @@ Create_func_from_days::create_1_arg(THD *thd, Item *arg1) Create_func_from_unixtime Create_func_from_unixtime::s_singleton; Item* -Create_func_from_unixtime::create_native(THD *thd, LEX_CSTRING *name, +Create_func_from_unixtime::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -4627,7 +4695,7 @@ Create_func_from_unixtime::create_native(THD *thd, LEX_CSTRING *name, Create_func_geometry_from_text Create_func_geometry_from_text::s_singleton; Item* -Create_func_geometry_from_text::create_native(THD *thd, LEX_CSTRING *name, +Create_func_geometry_from_text::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -4667,7 +4735,7 @@ Create_func_geometry_from_text::create_native(THD *thd, LEX_CSTRING *name, Create_func_geometry_from_wkb Create_func_geometry_from_wkb::s_singleton; Item* -Create_func_geometry_from_wkb::create_native(THD *thd, LEX_CSTRING *name, +Create_func_geometry_from_wkb::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -4707,8 +4775,8 @@ Create_func_geometry_from_wkb::create_native(THD *thd, LEX_CSTRING *name, Create_func_geometry_from_json Create_func_geometry_from_json::s_singleton; Item* -Create_func_geometry_from_json::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_geometry_from_json::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; @@ -4754,8 +4822,8 @@ Create_func_geometry_from_json::create_native(THD *thd, LEX_CSTRING *name, Create_func_as_geojson Create_func_as_geojson::s_singleton; Item* -Create_func_as_geojson::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_as_geojson::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; @@ -4856,7 +4924,7 @@ Create_func_glength::create_1_arg(THD *thd, Item *arg1) Create_func_distance_sphere Create_func_distance_sphere::s_singleton; Item* -Create_func_distance_sphere::create_native(THD *thd, LEX_CSTRING *name, +Create_func_distance_sphere::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -4877,7 +4945,7 @@ Create_func_distance_sphere::create_native(THD *thd, LEX_CSTRING *name, Create_func_greatest Create_func_greatest::s_singleton; Item* -Create_func_greatest::create_native(THD *thd, LEX_CSTRING *name, +Create_func_greatest::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -5170,8 +5238,8 @@ Create_func_json_exists::create_2_arg(THD *thd, Item *arg1, Item *arg2) Create_func_json_detailed Create_func_json_detailed::s_singleton; Item* -Create_func_json_detailed::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_json_detailed::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; @@ -5297,7 +5365,7 @@ Create_func_last_day::create_1_arg(THD *thd, Item *arg1) Create_func_json_array Create_func_json_array::s_singleton; Item* -Create_func_json_array::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_array::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func; @@ -5319,8 +5387,8 @@ Create_func_json_array::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_array_append Create_func_json_array_append::s_singleton; Item* -Create_func_json_array_append::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_json_array_append::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; @@ -5345,8 +5413,8 @@ Create_func_json_array_append::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_array_insert Create_func_json_array_insert::s_singleton; Item* -Create_func_json_array_insert::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_json_array_insert::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; @@ -5371,8 +5439,8 @@ Create_func_json_array_insert::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_insert Create_func_json_insert::s_singleton; Item* -Create_func_json_insert::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_json_insert::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; @@ -5398,7 +5466,7 @@ Create_func_json_insert::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_set Create_func_json_set::s_singleton; Item* -Create_func_json_set::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_set::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5425,7 +5493,7 @@ Create_func_json_set::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_replace Create_func_json_replace::s_singleton; Item* -Create_func_json_replace::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_replace::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5452,7 +5520,7 @@ Create_func_json_replace::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_remove Create_func_json_remove::s_singleton; Item* -Create_func_json_remove::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_remove::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5478,7 +5546,7 @@ Create_func_json_remove::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_object Create_func_json_object::s_singleton; Item* -Create_func_json_object::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_object::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func; @@ -5511,7 +5579,7 @@ Create_func_json_object::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_length Create_func_json_length::s_singleton; Item* -Create_func_json_length::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_length::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func; @@ -5536,7 +5604,7 @@ Create_func_json_length::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_merge Create_func_json_merge::s_singleton; Item* -Create_func_json_merge::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_merge::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func; @@ -5561,8 +5629,8 @@ Create_func_json_merge::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_merge_patch Create_func_json_merge_patch::s_singleton; Item* -Create_func_json_merge_patch::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_json_merge_patch::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func; int arg_count; @@ -5585,7 +5653,7 @@ Create_func_json_merge_patch::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_contains Create_func_json_contains::s_singleton; Item* -Create_func_json_contains::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_contains::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5611,7 +5679,7 @@ Create_func_json_contains::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_keys Create_func_json_keys::s_singleton; Item* -Create_func_json_keys::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_keys::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5637,8 +5705,8 @@ Create_func_json_keys::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_contains_path Create_func_json_contains_path::s_singleton; Item* -Create_func_json_contains_path::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_json_contains_path::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; @@ -5663,8 +5731,8 @@ Create_func_json_contains_path::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_extract Create_func_json_extract::s_singleton; Item* -Create_func_json_extract::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_json_extract::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= 0; @@ -5689,7 +5757,7 @@ Create_func_json_extract::create_native(THD *thd, LEX_CSTRING *name, Create_func_json_search Create_func_json_search::s_singleton; Item* -Create_func_json_search::create_native(THD *thd, LEX_CSTRING *name, +Create_func_json_search::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5715,7 +5783,7 @@ Create_func_json_search::create_native(THD *thd, LEX_CSTRING *name, Create_func_last_insert_id Create_func_last_insert_id::s_singleton; Item* -Create_func_last_insert_id::create_native(THD *thd, LEX_CSTRING *name, +Create_func_last_insert_id::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5761,7 +5829,7 @@ Create_func_lcase::create_1_arg(THD *thd, Item *arg1) Create_func_least Create_func_least::s_singleton; Item* -Create_func_least::create_native(THD *thd, LEX_CSTRING *name, +Create_func_least::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -5843,7 +5911,7 @@ Create_func_load_file::create_1_arg(THD *thd, Item *arg1) Create_func_locate Create_func_locate::s_singleton; Item* -Create_func_locate::create_native(THD *thd, LEX_CSTRING *name, +Create_func_locate::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5884,7 +5952,7 @@ Create_func_locate::create_native(THD *thd, LEX_CSTRING *name, Create_func_log Create_func_log::s_singleton; Item* -Create_func_log::create_native(THD *thd, LEX_CSTRING *name, +Create_func_log::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5941,7 +6009,7 @@ Create_func_lpad Create_func_lpad::s_singleton; Create_func_lpad_oracle Create_func_lpad_oracle::s_singleton; Item* -Create_func_lpad::create_native_std(THD *thd, LEX_CSTRING *name, +Create_func_lpad::create_native_std(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -5973,7 +6041,7 @@ Create_func_lpad::create_native_std(THD *thd, LEX_CSTRING *name, Item* -Create_func_lpad::create_native_oracle(THD *thd, LEX_CSTRING *name, +Create_func_lpad::create_native_oracle(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= item_list ? item_list->elements : 0; @@ -6039,7 +6107,7 @@ Create_func_maketime::create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) Create_func_make_set Create_func_make_set::s_singleton; Item* -Create_func_make_set::create_native(THD *thd, LEX_CSTRING *name, +Create_func_make_set::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= 0; @@ -6060,7 +6128,7 @@ Create_func_make_set::create_native(THD *thd, LEX_CSTRING *name, Create_func_master_pos_wait Create_func_master_pos_wait::s_singleton; Item* -Create_func_master_pos_wait::create_native(THD *thd, LEX_CSTRING *name, +Create_func_master_pos_wait::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { @@ -6111,7 +6179,7 @@ Create_func_master_pos_wait::create_native(THD *thd, LEX_CSTRING *name, Create_func_master_gtid_wait Create_func_master_gtid_wait::s_singleton; Item* -Create_func_master_gtid_wait::create_native(THD *thd, LEX_CSTRING *name, +Create_func_master_gtid_wait::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -6357,7 +6425,7 @@ Create_func_radians::create_1_arg(THD *thd, Item *arg1) Create_func_rand Create_func_rand::s_singleton; Item* -Create_func_rand::create_native(THD *thd, LEX_CSTRING *name, +Create_func_rand::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -6437,7 +6505,7 @@ Create_func_reverse::create_1_arg(THD *thd, Item *arg1) Create_func_round Create_func_round::s_singleton; Item* -Create_func_round::create_native(THD *thd, LEX_CSTRING *name, +Create_func_round::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -6477,7 +6545,7 @@ Create_func_rpad Create_func_rpad::s_singleton; Create_func_rpad_oracle Create_func_rpad_oracle::s_singleton; Item* -Create_func_rpad::create_native_std(THD *thd, LEX_CSTRING *name, +Create_func_rpad::create_native_std(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -6509,7 +6577,7 @@ Create_func_rpad::create_native_std(THD *thd, LEX_CSTRING *name, Item* -Create_func_rpad::create_native_oracle(THD *thd, LEX_CSTRING *name, +Create_func_rpad::create_native_oracle(THD *thd, const LEX_CSTRING *name, List *item_list) { int arg_count= item_list ? item_list->elements : 0; @@ -6690,8 +6758,8 @@ Create_func_substr_index::create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *a Create_func_substr_oracle Create_func_substr_oracle::s_singleton; Item* -Create_func_substr_oracle::create_native(THD *thd, LEX_CSTRING *name, - List *item_list) +Create_func_substr_oracle::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) { Item *func= NULL; int arg_count= item_list ? item_list->elements : 0; @@ -6844,7 +6912,7 @@ Create_func_unhex::create_1_arg(THD *thd, Item *arg1) Create_func_unix_timestamp Create_func_unix_timestamp::s_singleton; Item* -Create_func_unix_timestamp::create_native(THD *thd, LEX_CSTRING *name, +Create_func_unix_timestamp::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; @@ -6999,7 +7067,7 @@ Create_func_y::create_1_arg(THD *thd, Item *arg1) Create_func_year_week Create_func_year_week::s_singleton; Item* -Create_func_year_week::create_native(THD *thd, LEX_CSTRING *name, +Create_func_year_week::create_native(THD *thd, const LEX_CSTRING *name, List *item_list) { Item *func= NULL; diff --git a/sql/item_create.h b/sql/item_create.h index 7e92016ab96..894e9777b8d 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -58,7 +58,8 @@ public: @param item_list The list of arguments to the function, can be NULL @return An item representing the parsed function call, or NULL */ - virtual Item *create_func(THD *thd, LEX_CSTRING *name, List *item_list) = 0; + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, + List *item_list) = 0; protected: /** Constructor */ @@ -79,7 +80,7 @@ protected: class Create_native_func : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, List *item_list); /** @@ -89,7 +90,7 @@ public: @param item_list The function parameters, none of which are named @return An item representing the function call */ - virtual Item *create_native(THD *thd, LEX_CSTRING *name, + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, List *item_list) = 0; protected: @@ -117,7 +118,7 @@ public: @param item_list The list of arguments to the function, can be NULL @return An item representing the parsed function call */ - virtual Item *create_func(THD *thd, LEX_CSTRING *name, + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, List *item_list); /** @@ -129,7 +130,9 @@ public: @param item_list The list of arguments to the function, can be NULL @return An item representing the parsed function call */ - virtual Item *create_with_db(THD *thd, LEX_CSTRING *db, LEX_CSTRING *name, + virtual Item *create_with_db(THD *thd, + const LEX_CSTRING *db, + const LEX_CSTRING *name, bool use_explicit_name, List *item_list) = 0; @@ -167,7 +170,7 @@ extern Create_qfunc * find_qualified_function_builder(THD *thd); class Create_udf_func : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, List *item_list); /** From daed558b2c15bd40bd957616da2a3872e5436ce2 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Mon, 4 Apr 2022 11:28:36 +0200 Subject: [PATCH 21/28] MDEV-28204: The tr utility does not work as expected on rsync SST This commit contains a fix to use modern syntax for selecting character classes in the tr utility options. Also one of the tests for SST via rsync (galera_sst_rysnc2) is made more reliable (to avoid rare failures during automatic testing). --- mysql-test/suite/galera/t/galera_sst_rsync2.cnf | 4 ++-- mysql-test/suite/galera/t/galera_sst_rsync2.test | 2 ++ scripts/wsrep_sst_mariabackup.sh | 2 +- scripts/wsrep_sst_rsync.sh | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/galera/t/galera_sst_rsync2.cnf b/mysql-test/suite/galera/t/galera_sst_rsync2.cnf index 0159596f99b..a089baacf36 100644 --- a/mysql-test/suite/galera/t/galera_sst_rsync2.cnf +++ b/mysql-test/suite/galera/t/galera_sst_rsync2.cnf @@ -5,10 +5,10 @@ wsrep_sst_method=rsync [mysqld.1] wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' -log_bin=@ENV.MYSQLTEST_VARDIR/server1_binlog +log_bin=@ENV.MYSQLTEST_VARDIR/mysqld.1/server1_binlog log_bin_index=@ENV.MYSQLTEST_VARDIR/tmp/server1_binlog_index.index [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' -log_bin=@ENV.MYSQLTEST_VARDIR/server2_binlog +log_bin=@ENV.MYSQLTEST_VARDIR/mysqld.2/server2_binlog log_bin_index=@ENV.MYSQLTEST_VARDIR/tmp/server2_binlog_index.index diff --git a/mysql-test/suite/galera/t/galera_sst_rsync2.test b/mysql-test/suite/galera/t/galera_sst_rsync2.test index f796356cac7..20fae4a751e 100644 --- a/mysql-test/suite/galera/t/galera_sst_rsync2.test +++ b/mysql-test/suite/galera/t/galera_sst_rsync2.test @@ -7,6 +7,8 @@ --source suite/galera/include/galera_st_shutdown_slave.inc --source suite/galera/include/galera_st_clean_slave.inc +--let $wsrep_recover_additional=--log-bin=$MYSQLTEST_VARDIR/mysqld.2/server2_binlog --log-bin-index=$MYSQLTEST_VARDIR/tmp/server2_binlog_index.index + --source suite/galera/include/galera_st_kill_slave.inc --source suite/galera/include/galera_st_kill_slave_ddl.inc --source include/auto_increment_offset_restore.inc diff --git a/scripts/wsrep_sst_mariabackup.sh b/scripts/wsrep_sst_mariabackup.sh index ce4001fdc56..067a777fb9c 100644 --- a/scripts/wsrep_sst_mariabackup.sh +++ b/scripts/wsrep_sst_mariabackup.sh @@ -472,7 +472,7 @@ read_cnf() encrypt=$(parse_cnf "$encgroups" 'encrypt' 0) tmode=$(parse_cnf "$encgroups" 'ssl-mode' 'DISABLED' | \ - tr [:lower:] [:upper:]) + tr '[[:lower:]]' '[[:upper:]]') case "$tmode" in 'VERIFY_IDENTITY'|'VERIFY_CA'|'REQUIRED'|'DISABLED') diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index 67a7afc638f..5f7ae4298b5 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -224,7 +224,7 @@ SSTCERT="$tpem" SSTCA="$tcert" SSTCAP="$tcap" -SSLMODE=$(parse_cnf "$encgroups" 'ssl-mode' | tr [:lower:] [:upper:]) +SSLMODE=$(parse_cnf "$encgroups" 'ssl-mode' | tr '[[:lower:]]' '[[:upper:]]') if [ -z "$SSLMODE" ]; then # Implicit verification if CA is set and the SSL mode From 09c7f78c2ef8c43d519eb4bad61d1be177a2c9b2 Mon Sep 17 00:00:00 2001 From: Monty Date: Wed, 23 Mar 2022 19:34:40 +0200 Subject: [PATCH 22/28] Fixed double free issue in events Server crashed during shutdown with: "corrupted double-linked list" when running mysql_upgrade multiple times against the server. Reason was that db_repostitory could be freed twice. --- sql/events.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/sql/events.cc b/sql/events.cc index 5e15b92dc49..7968697a8ba 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -666,6 +666,7 @@ Events::drop_schema_events(THD *thd, const char *db) { db_repository->drop_schema_events(thd, &db_lex); delete db_repository; + db_repository= 0; } } DBUG_VOID_RETURN; From c4ebb2bd04974807b3b81001fd2d733e75dfc1fb Mon Sep 17 00:00:00 2001 From: Monty Date: Wed, 23 Mar 2022 21:17:32 +0200 Subject: [PATCH 23/28] Fixed that mysql_upgrade doesn't give errors about mariadb.sys The reason for this fix was that when I tried to run mysql_upgrade at home to update an old 10.5 installation, mysql_upgrade failed with warnings about mariadb.sys user not existing. If the server was started with --skip-grants, there would be no warnings from mysql_upgrade, but in some cases running mysql_upgrade again could produce new warnings. The reason for the warnings was that any access of the mysql.user view will produce a warning if the mariadb.sys user does not exists. Fixed with the following changes: - Disable warnings about mariadb.sys user not existing - Don't overwrite old mariadb.sys entries in tables_priv and global_priv - Ensure that tables_priv has an entry for mariadb.sys if the user exists. This fixes an issue that tables_priv would not be updated if there was a failure directly after global_priv was updated. --- client/mysql_upgrade.c | 1 + scripts/mysql_system_tables.sql | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index 0608665d6fc..6d5c954bd08 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -1029,6 +1029,7 @@ static const char *expected_errors[]= "ERROR 1347", /* 'mysql.user' is not of type 'BASE TABLE' */ "ERROR 1348", /* Column 'Show_db_priv' is not updatable */ "ERROR 1356", /* definer of view lack rights (UPDATE) */ + "ERROR 1449", /* definer ('mariadb.sys'@'localhost') of mysql.user does not exist */ 0 }; diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql index 020385992ea..26639f613de 100644 --- a/scripts/mysql_system_tables.sql +++ b/scripts/mysql_system_tables.sql @@ -35,17 +35,15 @@ set @had_db_table= @@warning_count != 0; CREATE TABLE IF NOT EXISTS global_priv (Host char(60) binary DEFAULT '', User char(80) binary DEFAULT '', Priv JSON NOT NULL DEFAULT '{}' CHECK(JSON_VALID(Priv)), PRIMARY KEY (Host,User)) engine=Aria transactional=1 CHARACTER SET utf8 COLLATE utf8_bin comment='Users and global privileges'; -set @had_sys_user= 0 <> (select count(*) from mysql.global_priv where Host="localhost" and User="mariadb.sys"); - set @exists_user_view= EXISTS (SELECT * FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user'); set @exists_user_view_by_root= EXISTS (SELECT * FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'); -set @need_sys_user_creation= (NOT @had_sys_user) AND (( NOT @exists_user_view) OR @exists_user_view_by_root); +set @need_sys_user_creation= (( NOT @exists_user_view) OR @exists_user_view_by_root); CREATE TEMPORARY TABLE tmp_user_sys LIKE global_priv; INSERT INTO tmp_user_sys (Host,User,Priv) VALUES ('localhost','mariadb.sys','{"access":0,"plugin":"mysql_native_password","authentication_string":"","account_locked":true,"password_last_changed":0}'); -INSERT INTO global_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; +INSERT IGNORE INTO global_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; DROP TABLE tmp_user_sys; @@ -117,7 +115,7 @@ CREATE TABLE IF NOT EXISTS tables_priv ( Host char(60) binary DEFAULT '' NOT NUL CREATE TEMPORARY TABLE tmp_user_sys LIKE tables_priv; INSERT INTO tmp_user_sys (Host,Db,User,Table_name,Grantor,Timestamp,Table_priv) VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0','Select,Delete'); -INSERT INTO tables_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; +INSERT IGNORE INTO tables_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; DROP TABLE tmp_user_sys; CREATE TABLE IF NOT EXISTS columns_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(80) binary DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL, Column_name char(64) binary DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL, PRIMARY KEY (Host,Db,User,Table_name,Column_name) ) engine=Aria transactional=1 CHARACTER SET utf8 COLLATE utf8_bin comment='Column privileges'; From d7fd76456e7c7e52b28ee963ba074df73e619df6 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Tue, 5 Apr 2022 13:09:21 +0200 Subject: [PATCH 24/28] MDEV-19525 fix the test for embedded followup for 58cd2a8dedd7 --- mysql-test/suite/versioning/t/debug.test | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/versioning/t/debug.test b/mysql-test/suite/versioning/t/debug.test index 59dde0d26fb..ed1b842dab3 100644 --- a/mysql-test/suite/versioning/t/debug.test +++ b/mysql-test/suite/versioning/t/debug.test @@ -1,5 +1,7 @@ --source include/have_debug.inc +--let $datadir=`select @@datadir` + create table t1 (a int); show create table t1; @@ -38,9 +40,10 @@ drop table t1, t2, t3, t4; --echo # create table t1 (x int) with system versioning; set debug_dbug='+d,error_vers_wrong_type'; ---replace_result $MYSQLTEST_VARDIR . master-data// '' '\\' '/' +--replace_result $datadir ./ --error ER_NOT_FORM_FILE show create table t1; +--replace_result $datadir ./ show warnings; drop table t1; set global debug_dbug=@old_dbug; From cf8d30efd221f58a80261d04642da34635a17595 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 4 Apr 2022 21:39:34 +0200 Subject: [PATCH 25/28] Revert "MDEV-28131 Unexpected warning while selecting from information_schema.processlist" This reverts commit 0812d0de8dcb1f76d4a03cea3f20bfa30345b83b. But keeps the test case. --- sql/sql_show.cc | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 439cad1c858..e1090d450e8 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3351,16 +3351,6 @@ int fill_schema_processlist(THD* thd, TABLE_LIST* tables, COND* cond) table->field[11]->store((double) tmp->progress.counter / (double) max_counter*100.0); } - else - { - /* - This is a DECIMAL column without DEFAULT. - restore_record() fills its Field::ptr to zero bytes, - according to pack_length(). But an array of zero bytes - is not a valid decimal. Set it explicitly to 0. - */ - table->field[11]->store((longlong) 0, true); - } mysql_mutex_unlock(&tmp->LOCK_thd_data); } From 2d2c3da8ec846d8018c112d8901e2ae029f1c795 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 4 Apr 2022 21:34:05 +0200 Subject: [PATCH 26/28] MDEV-27673 Warning after "select progress from information_schema.processlist" after moving fields in optimize_schema_tables_memory_usage() store default values into their new, moved, locations. --- mysql-test/main/information_schema.result | 6 ++++++ mysql-test/main/information_schema.test | 5 ++++- sql/sql_show.cc | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index 8b7ab230ae6..cf452af216e 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -2370,5 +2370,11 @@ DROP TABLE t1; DROP TABLE t1; SET SQL_MODE=DEFAULT; # +# MDEV-27673 Warning after "select progress from information_schema.processlist" +# +select progress from information_schema.processlist limit 1; +progress +0.000 +# # End of 10.3 tests # diff --git a/mysql-test/main/information_schema.test b/mysql-test/main/information_schema.test index fb575c1ef24..2fac02d2fe0 100644 --- a/mysql-test/main/information_schema.test +++ b/mysql-test/main/information_schema.test @@ -2104,7 +2104,10 @@ DROP TABLE t1; DROP TABLE t1; SET SQL_MODE=DEFAULT; - +--echo # +--echo # MDEV-27673 Warning after "select progress from information_schema.processlist" +--echo # +select progress from information_schema.processlist limit 1; --echo # --echo # End of 10.3 tests diff --git a/sql/sql_show.cc b/sql/sql_show.cc index e1090d450e8..2a3dbceb4cb 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -8803,6 +8803,7 @@ bool optimize_schema_tables_memory_usage(List &tables) if (bitmap_is_set(table->read_set, i)) { field->move_field(cur); + field->reset(); *to_recinfo++= *from_recinfo; cur+= from_recinfo->length; } @@ -8823,6 +8824,7 @@ bool optimize_schema_tables_memory_usage(List &tables) table->s->reclength= to_recinfo->length= 1; to_recinfo++; } + store_record(table, s->default_values); p->recinfo= to_recinfo; // TODO switch from Aria to Memory if all blobs were optimized away? From f6b09a7ce58f564d8e5c08c799d2fc45cfc10870 Mon Sep 17 00:00:00 2001 From: Dmitry Shulga Date: Tue, 5 Apr 2022 20:20:09 +0700 Subject: [PATCH 27/28] MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head Some SQL statements that involves subqueries or stored routines could fail since execution of subqueries or stored routines is not supported for theses statements. Unfortunately, parsing error could result in abnormal termination by firing the following assert DBUG_ASSERT(m_thd == NULL); in a destructor of the class sp_head. The reason of the assert firing is that the method sp_head::restore_thd_mem_root() is not called on semantic action code to clean up resources allocated during parsing. This happens since the macros YYABORT is called instead of MYSQL_YYABORT by semantic action code for some grammar rules. So, to fix the bug YYABORT was just replaced with MYSQL_YYABORT. --- mysql-test/main/ps.result | 13 +++++++++++++ mysql-test/main/ps.test | 19 +++++++++++++++++++ mysql-test/main/sp.result | 6 ++++++ mysql-test/main/sp.test | 9 ++++++++- sql/sql_yacc.yy | 6 +++--- 5 files changed, 49 insertions(+), 4 deletions(-) diff --git a/mysql-test/main/ps.result b/mysql-test/main/ps.result index 6df83228875..5d72cde5dd2 100644 --- a/mysql-test/main/ps.result +++ b/mysql-test/main/ps.result @@ -5650,5 +5650,18 @@ connection default; SET GLOBAL disconnect_on_expired_password=@disconnect_on_expired_password_save; DROP USER user1@localhost; # +# MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head +# +CREATE TABLE t1 (a INT); +EXECUTE IMMEDIATE "CREATE PROCEDURE p1() SELECT 1 FROM t1 PROCEDURE ANALYSE( 10, (SELECT a FROM t1));"; +ERROR 42000: PROCEDURE does not support subqueries or stored functions +DROP TABLE t1; +BEGIN NOT ATOMIC +PREPARE stmt FROM 'SELECT ?'; +EXECUTE stmt USING ((SELECT 1)); +END; +$ +ERROR 42000: EXECUTE..USING does not support subqueries or stored functions +# # End of 10.4 tests # diff --git a/mysql-test/main/ps.test b/mysql-test/main/ps.test index 9b781f32631..c99731e768d 100644 --- a/mysql-test/main/ps.test +++ b/mysql-test/main/ps.test @@ -5082,6 +5082,25 @@ connection default; SET GLOBAL disconnect_on_expired_password=@disconnect_on_expired_password_save; DROP USER user1@localhost; +--echo # +--echo # MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head +--echo # +CREATE TABLE t1 (a INT); + +--error ER_SUBQUERIES_NOT_SUPPORTED +EXECUTE IMMEDIATE "CREATE PROCEDURE p1() SELECT 1 FROM t1 PROCEDURE ANALYSE( 10, (SELECT a FROM t1));"; +DROP TABLE t1; + +delimiter $; +--error ER_SUBQUERIES_NOT_SUPPORTED +BEGIN NOT ATOMIC + PREPARE stmt FROM 'SELECT ?'; + EXECUTE stmt USING ((SELECT 1)); +END; +$ + +delimiter ;$ + --echo # --echo # End of 10.4 tests --echo # diff --git a/mysql-test/main/sp.result b/mysql-test/main/sp.result index 7dfaa6176a3..3795e4db894 100644 --- a/mysql-test/main/sp.result +++ b/mysql-test/main/sp.result @@ -8916,5 +8916,11 @@ END; $$ ERROR 42000: Incorrect usage/placement of 'HIGH_PRIORITY' # +# MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head +# +CREATE TABLE t1 (a INT); +CREATE PROCEDURE p1() SELECT 1 FROM t1 PROCEDURE ANALYSE( 10, (SELECT a FROM t1)); +ERROR 42000: PROCEDURE does not support subqueries or stored functions +DROP TABLE t1; # End of 10.4 tests # diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test index bd614072e1a..4fa5085128a 100644 --- a/mysql-test/main/sp.test +++ b/mysql-test/main/sp.test @@ -10481,7 +10481,14 @@ END; $$ DELIMITER ;$$ - --echo # +--echo # MDEV-21173: Assertion `m_thd == __null' failed in sp_head::~sp_head +--echo # +CREATE TABLE t1 (a INT); +--error ER_SUBQUERIES_NOT_SUPPORTED +CREATE PROCEDURE p1() SELECT 1 FROM t1 PROCEDURE ANALYSE( 10, (SELECT a FROM t1)); + +DROP TABLE t1; + --echo # End of 10.4 tests --echo # diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3bda2381230..7d8b02a0f12 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -9610,7 +9610,7 @@ subselect: query_expression { if (!($$= Lex->parsed_subselect($1))) - YYABORT; + MYSQL_YYABORT; } ; @@ -9655,14 +9655,14 @@ subquery: else $1->fake_select_lex->braces= false; if (!($$= Lex->parsed_subselect($1))) - YYABORT; + MYSQL_YYABORT; } | '(' with_clause query_expression_no_with_clause ')' { $3->set_with_clause($2); $2->attach_to($3->first_select()); if (!($$= Lex->parsed_subselect($3))) - YYABORT; + MYSQL_YYABORT; } ; From f089f8d95e569291bdf4329124c34674f02e40fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 6 Apr 2022 08:59:41 +0300 Subject: [PATCH 28/28] MDEV-23328 fixup: sign mismatch in format strings kill_one_thread(): Fix integer sign mismatch in some format strings. Some of this was introduced in commit 5c230b21bfa582ac304db526c3638c514cf98b13 --- sql/sql_parse.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 35310d2655a..e3efa2d051c 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2017, Oracle and/or its affiliates. - Copyright (c) 2008, 2021, MariaDB + Copyright (c) 2008, 2022, MariaDB 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 @@ -9176,7 +9176,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ THD *tmp; uint error= (type == KILL_TYPE_QUERY ? ER_NO_SUCH_QUERY : ER_NO_SUCH_THREAD); DBUG_ENTER("kill_one_thread"); - DBUG_PRINT("enter", ("id: %lld signal: %u", id, (uint) kill_signal)); + DBUG_PRINT("enter", ("id: %lld signal: %d", id, kill_signal)); tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY); if (!tmp) DBUG_RETURN(error); @@ -9220,14 +9220,15 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ if (tmp->wsrep_aborter && tmp->wsrep_aborter != thd->thread_id) { /* victim is in hit list already, bail out */ - WSREP_DEBUG("victim %llu has wsrep aborter: %lu, skipping awake()", + WSREP_DEBUG("victim %lld has wsrep aborter: %lu, skipping awake()", id, tmp->wsrep_aborter); error= 0; } else #endif /* WITH_WSREP */ { - WSREP_DEBUG("kill_one_thread victim: %llu wsrep_aborter %lu by signal %d", + 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; @@ -9240,7 +9241,7 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ mysql_mutex_unlock(&tmp->LOCK_thd_data); } mysql_mutex_unlock(&tmp->LOCK_thd_kill); - DBUG_PRINT("exit", ("%d", error)); + DBUG_PRINT("exit", ("%u", error)); DBUG_RETURN(error); }