diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-04-06 12:08:30 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-04-06 12:08:30 +0300 |
commit | 9d94c60f2b67b6008c69d51b0b85ac539a1ce647 (patch) | |
tree | f4a3198e4326358343abf9bfe3c667a726e23495 | |
parent | d6758efbe126cdc6a0718a4b560d9e8f494c0399 (diff) | |
parent | cacb61b6be78b01a9c62890cc81d059ee46921ac (diff) | |
download | mariadb-git-9d94c60f2b67b6008c69d51b0b85ac539a1ce647.tar.gz |
Merge 10.5 into 10.6
67 files changed, 686 insertions, 563 deletions
diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index 68f82f6f8e0..06a1992bbfa 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -1047,6 +1047,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/client/mysqltest.cc b/client/mysqltest.cc index eb98b18c5b4..bde7666f47d 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -8613,7 +8613,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; } @@ -8692,7 +8695,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(PSI_NOT_INSTRUMENTED, p, MYF(MY_WME)); ps_params[i].buffer_length= (unsigned long)strlen(p); } } diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index 65224c8c3f5..befd89290c1 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. - Copyright (c) 2014, 2021, MariaDB Corporation. + Copyright (c) 2014, 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 @@ -817,7 +817,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); @@ -869,7 +869,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); } @@ -880,7 +880,7 @@ 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); } @@ -890,7 +890,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"); } @@ -898,7 +898,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"); } @@ -906,7 +906,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"); @@ -915,7 +915,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"); } @@ -925,14 +925,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); } @@ -940,7 +940,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); } @@ -948,7 +948,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); } @@ -956,7 +956,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); } @@ -964,7 +964,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); } @@ -972,7 +972,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); } @@ -980,7 +980,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); } @@ -988,7 +988,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); } @@ -996,7 +996,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); } @@ -1004,7 +1004,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); } @@ -1012,7 +1012,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); } @@ -1020,7 +1020,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); } @@ -1028,7 +1028,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/include/my_time.h b/include/my_time.h index b7b54db5586..9f3e61b944f 100644 --- a/include/my_time.h +++ b/include/my_time.h @@ -244,9 +244,12 @@ static inline void my_time_trunc(MYSQL_TIME *ltime, uint decimals) !ltime->hour && !ltime->minute && !ltime->second) ltime->neg= FALSE; } +#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); } diff --git a/mysql-test/main/backup_locks.result b/mysql-test/main/backup_locks.result index 478cd1ef537..2942231678e 100644 --- a/mysql-test/main/backup_locks.result +++ b/mysql-test/main/backup_locks.result @@ -49,7 +49,7 @@ create sequence seq2; backup lock seq1; connection con1; CREATE OR REPLACE SEQUENCE seq1 START -28; -ERROR HY000: Sequence 'test.seq1' values are conflicting +ERROR HY000: Sequence 'test.seq1' has out of range value for options SET STATEMENT max_statement_time=10 FOR CREATE OR REPLACE SEQUENCE seq1 START 50; ERROR 70100: Query execution was interrupted (max_statement_time exceeded) SET STATEMENT max_statement_time=10 FOR ALTER SEQUENCE IF EXISTS seq1 NOMAXVALUE; diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index de9ff8d8e4d..ad78f413ea1 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -2524,5 +2524,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 d8c23e1f673..0c403caa599 100644 --- a/mysql-test/main/information_schema.test +++ b/mysql-test/main/information_schema.test @@ -2103,7 +2103,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/mysql-test/main/ps.result b/mysql-test/main/ps.result index 22df8559e4f..1dd04636d49 100644 --- a/mysql-test/main/ps.result +++ b/mysql-test/main/ps.result @@ -5576,6 +5576,28 @@ 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 <union2,3> 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 <union2,3> ALL NULL NULL NULL NULL NULL +DEALLOCATE PREPARE stmt; +DROP TABLE t1; # End of 10.2 tests # # @@ -5640,5 +5662,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 c4ec92540a2..678c24db1eb 100644 --- a/mysql-test/main/ps.test +++ b/mysql-test/main/ps.test @@ -5006,6 +5006,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 # @@ -5084,5 +5097,24 @@ 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 479a56010fb..1d6ce57ceae 100644 --- a/mysql-test/main/sp.result +++ b/mysql-test/main/sp.result @@ -8897,6 +8897,19 @@ 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 # # Start of 10.4 tests @@ -8911,5 +8924,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 058f42d5e92..fd076ee9efe 100644 --- a/mysql-test/main/sp.test +++ b/mysql-test/main/sp.test @@ -10460,6 +10460,21 @@ 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 @@ -10480,7 +10495,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/mysql-test/main/trigger.result b/mysql-test/main/trigger.result index ea4bb41efb3..a58986dc88a 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 a 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/encryption/r/innochecksum.result b/mysql-test/suite/encryption/r/innochecksum.result index 5dc6ed90acc..7c68164e52a 100644 --- a/mysql-test/suite/encryption/r/innochecksum.result +++ b/mysql-test/suite/encryption/r/innochecksum.result @@ -7,7 +7,7 @@ CREATE TABLE t3 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB ROW_FOR CREATE TABLE t4 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB PAGE_COMPRESSED=1; CREATE TABLE t5 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB PAGE_COMPRESSED=1 ENCRYPTED=YES ENCRYPTION_KEY_ID=4; CREATE TABLE t6 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT) ENGINE=InnoDB; -# 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 72e95de84e5..59d90fbb3d7 100644 --- a/mysql-test/suite/encryption/t/innochecksum.test +++ b/mysql-test/suite/encryption/t/innochecksum.test @@ -63,9 +63,9 @@ let MYSQLD_DATADIR=`select @@datadir`; --source include/shutdown_mysqld.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 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..fb5d105448f 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 a 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..7228c4cffd9 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 a 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..7228c4cffd9 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 a view, temporary table or sequence drop table t1_temp; Testcase 3.5.5.3: diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 76992e9d59b..f6cb6732f69 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -44,4 +44,4 @@ pxc-421: wsrep_provider is read-only for security reasons 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/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/mysql-test/suite/mariabackup/full_backup.result b/mysql-test/suite/mariabackup/full_backup.result index 690c5e64b4a..e2d5cf185d5 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/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 diff --git a/mysql-test/suite/sql_sequence/alter.result b/mysql-test/suite/sql_sequence/alter.result index 612e2201d26..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,21 +200,20 @@ 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; 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/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 6f70f335d88..add23c1ad2d 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 4090 'test.t1' is not a SEQUENCE 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; @@ -477,7 +477,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 @@ -506,7 +506,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 @@ -686,3 +686,33 @@ 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' +# 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 +# Task 4: +CREATE TEMPORARY TABLE s1 (s1 INT); +DROP TEMPORARY SEQUENCE s1; +ERROR 42S02: Unknown SEQUENCE: 'test.s1' +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; +# 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 a 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 61430740560..49b39fbb40c 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,41 @@ 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; + +--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; + +--echo # Task 4: +CREATE TEMPORARY TABLE s1 (s1 INT); +--error ER_UNKNOWN_SEQUENCES +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; + +--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/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/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/mysql-test/suite/sql_sequence/other.result b/mysql-test/suite/sql_sequence/other.result index 5226ce78789..d237be635f7 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/mysql-test/suite/versioning/r/debug.result b/mysql-test/suite/versioning/r/debug.result index c1c134692a2..0e2c67fd9aa 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/r/update.result b/mysql-test/suite/versioning/r/update.result index c62a992ceb1..f6a36ec9ce1 100644 --- a/mysql-test/suite/versioning/r/update.result +++ b/mysql-test/suite/versioning/r/update.result @@ -411,6 +411,17 @@ 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; +# # MDEV-24522 Assertion `inited==NONE' fails upon UPDATE on versioned table with unique blob # create table t1 (a int, b int, c text, unique(c), key (b)) engine=myisam with system versioning; @@ -426,3 +437,4 @@ update t1 set a = 3 where b <= 9; update t2 set a = 3 where b <= 9; update t1, t2 set t1.a = 3, t2.a = 3 where t1.b <= 10 and t2.b <= 10 and t1.b = t2.b; drop tables t1, t2; +# End of 10.4 tests diff --git a/mysql-test/suite/versioning/t/debug.test b/mysql-test/suite/versioning/t/debug.test index 5069d7f6002..be58b67546d 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; @@ -30,6 +32,18 @@ set debug_dbug='+d,sysvers_show'; show create table t3; create table t4 (a int); show create table t4; +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 $datadir ./ +--error ER_NOT_FORM_FILE +show create table t1; +--replace_result $datadir ./ +show warnings; +drop table t1; set global debug_dbug=@old_dbug; -drop table t1, t2, t3, t4; diff --git a/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test index 8ef304f2de3..5d250bb2162 100644 --- a/mysql-test/suite/versioning/t/update.test +++ b/mysql-test/suite/versioning/t/update.test @@ -337,6 +337,19 @@ select check_row_ts(row_start, row_end) from t1 for system_time all where row_st 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; + +--echo # --echo # MDEV-24522 Assertion `inited==NONE' fails upon UPDATE on versioned table with unique blob --echo # create table t1 (a int, b int, c text, unique(c), key (b)) engine=myisam with system versioning; @@ -360,4 +373,6 @@ update t1, t2 set t1.a = 3, t2.a = 3 where t1.b <= 10 and t2.b <= 10 and t1.b = # cleanup drop tables t1, t2; +--echo # End of 10.4 tests + source suite/versioning/common_finish.inc; diff --git a/plugin/versioning/versioning.cc b/plugin/versioning/versioning.cc index 6275fadba44..6d8f77550f6 100644 --- a/plugin/versioning/versioning.cc +++ b/plugin/versioning/versioning.cc @@ -30,7 +30,8 @@ template <TR_table::field_id_t TRT_FIELD> class Create_func_trt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_trt<TRT_FIELD> s_singleton; @@ -44,7 +45,7 @@ Create_func_trt<TRT_FIELD> Create_func_trt<TRT_FIELD>::s_singleton; template <TR_table::field_id_t TRT_FIELD> Item* -Create_func_trt<TRT_FIELD>::create_native(THD *thd, LEX_CSTRING *name, +Create_func_trt<TRT_FIELD>::create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) { Item *func= NULL; @@ -103,7 +104,8 @@ template <class Item_func_trt_trx_seesX> class Create_func_trt_trx_sees : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list) + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql index cee47a0e5d6..bc204323d96 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(255) binary DEFAULT '', User char(128) 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(255) binary DEFAULT '' NOT NU 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(255) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(128) 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'; 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 diff --git a/sql/datadict.cc b/sql/datadict.cc index b2c4b615c4d..e85478a710c 100644 --- a/sql/datadict.cc +++ b/sql/datadict.cc @@ -1,4 +1,5 @@ /* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2017, 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 @@ -105,16 +106,12 @@ Table_type dd_frm_type(THD *thd, char *path, LEX_CSTRING *engine_name, goto err; } - /* engine_name is 0 if we only want to know if table is view or not */ - if (!engine_name) - goto err; - if (!is_binary_frm_header(header)) goto err; dbt= header[3]; - if (((header[39] >> 4) & 3) == HA_CHOICE_YES) + if ((header[39] & 0x30) == (HA_CHOICE_YES << 4)) { DBUG_PRINT("info", ("Sequence found")); type= TABLE_TYPE_SEQUENCE; @@ -134,7 +131,8 @@ Table_type dd_frm_type(THD *thd, char *path, LEX_CSTRING *engine_name, handlerton *ht= ha_resolve_by_legacy_type(thd, (legacy_db_type) dbt); if (ht) { - *engine_name= hton2plugin[ht->slot]->name; + if (engine_name) + *engine_name= hton2plugin[ht->slot]->name; #ifdef WITH_PARTITION_STORAGE_ENGINE if (partition_engine_name && dbt == DB_TYPE_PARTITION_DB) { @@ -155,6 +153,7 @@ Table_type dd_frm_type(THD *thd, char *path, LEX_CSTRING *engine_name, cont: #endif /* read the true engine name */ + if (engine_name) { MY_STAT state; uchar *frm_image= 0; diff --git a/sql/events.cc b/sql/events.cc index 213f634fde0..1c185a8d489 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -670,6 +670,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; diff --git a/sql/ha_partition.h b/sql/ha_partition.h index dd14cd7a6d4..29763447e6e 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 @@ -1108,10 +1108,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 d30c91f2195..8e310f8adbf 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, 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 @@ -6092,7 +6092,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 @@ -7829,17 +7831,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; @@ -7908,177 +7899,6 @@ int ha_abort_transaction(THD *bf_thd, THD *victim_thd, my_bool signal) #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 <my_dir.h> -#include <my_sys.h> -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 4da750fcff7..4b83ea30403 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1143,31 +1143,6 @@ extern MYSQL_PLUGIN_IMPORT st_plugin_int *hton2plugin[MAX_HA]; #define view_pseudo_hton ((handlerton *)1) -/* 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. @@ -1282,46 +1257,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; class derived_handler; @@ -1586,22 +1521,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); @@ -4144,15 +4063,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, const key_range *min_key, const key_range *max_key, diff --git a/sql/item_create.cc b/sql/item_create.cc index c80cf7b03d7..18a0a20c4fb 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2011, Oracle and/or its affiliates. - Copyright (c) 2008, 2021, MariaDB Corporation. + Copyright (c) 2008, 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 @@ -81,7 +81,9 @@ extern Native_func_registry_array native_func_registry_array_geom; 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> *item_list); static Create_sp_func s_singleton; @@ -181,7 +183,8 @@ protected: class Create_func_atan : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_atan s_singleton; @@ -372,7 +375,8 @@ protected: class Create_func_concat : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_concat s_singleton; @@ -385,7 +389,8 @@ protected: class Create_func_concat_operator_oracle : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_concat_operator_oracle s_singleton; @@ -411,7 +416,8 @@ protected: class Create_func_decode_oracle : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_decode_oracle s_singleton; @@ -424,7 +430,8 @@ protected: class Create_func_concat_ws : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_concat_ws s_singleton; @@ -606,7 +613,8 @@ protected: class Create_func_des_decrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_des_decrypt s_singleton; @@ -619,7 +627,8 @@ protected: class Create_func_des_encrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_des_encrypt s_singleton; @@ -632,7 +641,8 @@ protected: class Create_func_elt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_elt s_singleton; @@ -658,7 +668,8 @@ protected: class Create_func_encrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_encrypt s_singleton; @@ -684,7 +695,8 @@ protected: class Create_func_export_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_export_set s_singleton; @@ -697,7 +709,8 @@ protected: class Create_func_field : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_field s_singleton; @@ -736,7 +749,8 @@ protected: class Create_func_format : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_format s_singleton; @@ -788,7 +802,8 @@ protected: class Create_func_from_unixtime : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_from_unixtime s_singleton; @@ -814,7 +829,8 @@ protected: class Create_func_greatest : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_greatest s_singleton; @@ -957,7 +973,8 @@ protected: class Create_func_json_detailed: public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_detailed s_singleton; @@ -1022,7 +1039,8 @@ protected: class Create_func_json_keys: public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_keys s_singleton; @@ -1035,7 +1053,8 @@ protected: class Create_func_json_contains: public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_contains s_singleton; @@ -1048,7 +1067,8 @@ protected: class Create_func_json_contains_path : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_contains_path s_singleton; @@ -1061,7 +1081,8 @@ protected: class Create_func_json_extract : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_extract s_singleton; @@ -1074,7 +1095,8 @@ protected: class Create_func_json_search : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_search s_singleton; @@ -1087,7 +1109,8 @@ protected: class Create_func_json_array : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_array s_singleton; @@ -1100,7 +1123,8 @@ protected: class Create_func_json_array_append : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_array_append s_singleton; @@ -1113,7 +1137,8 @@ protected: class Create_func_json_array_insert : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_array_insert s_singleton; @@ -1126,7 +1151,8 @@ protected: class Create_func_json_insert : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_insert s_singleton; @@ -1139,7 +1165,8 @@ protected: class Create_func_json_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_set s_singleton; @@ -1152,7 +1179,8 @@ protected: class Create_func_json_replace : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_replace s_singleton; @@ -1165,7 +1193,8 @@ protected: class Create_func_json_remove : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_remove s_singleton; @@ -1178,7 +1207,8 @@ protected: class Create_func_json_object : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_object s_singleton; @@ -1191,7 +1221,8 @@ protected: class Create_func_json_length : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_length s_singleton; @@ -1204,7 +1235,8 @@ protected: class Create_func_json_merge : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_merge s_singleton; @@ -1217,7 +1249,8 @@ protected: class Create_func_json_merge_patch : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_json_merge_patch s_singleton; @@ -1269,7 +1302,8 @@ protected: class Create_func_last_insert_id : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_last_insert_id s_singleton; @@ -1295,7 +1329,8 @@ protected: class Create_func_least : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_least s_singleton; @@ -1387,7 +1422,8 @@ protected: class Create_func_locate : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_locate s_singleton; @@ -1400,7 +1436,8 @@ protected: class Create_func_log : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_log s_singleton; @@ -1439,7 +1476,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> *item_list) { return thd->variables.sql_mode & MODE_ORACLE ? @@ -1451,15 +1488,18 @@ public: protected: Create_func_lpad() {} virtual ~Create_func_lpad() {} - Item *create_native_std(THD *thd, LEX_CSTRING *name, List<Item> *items); - Item *create_native_oracle(THD *thd, LEX_CSTRING *name, List<Item> *items); + Item *create_native_std(THD *thd, const LEX_CSTRING *name, + List<Item> *items); + Item *create_native_oracle(THD *thd, const LEX_CSTRING *name, + List<Item> *items); }; class Create_func_lpad_oracle : public Create_func_lpad { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { return create_native_oracle(thd, name, item_list); } @@ -1522,7 +1562,8 @@ protected: class Create_func_make_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_make_set s_singleton; @@ -1535,7 +1576,8 @@ protected: class Create_func_master_pos_wait : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_master_pos_wait s_singleton; @@ -1548,7 +1590,8 @@ protected: class Create_func_master_gtid_wait : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_master_gtid_wait s_singleton; @@ -1756,7 +1799,8 @@ protected: class Create_func_rand : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_rand s_singleton; @@ -1817,7 +1861,8 @@ protected: class Create_func_round : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_round s_singleton; @@ -1830,7 +1875,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> *item_list) { return thd->variables.sql_mode & MODE_ORACLE ? @@ -1842,15 +1887,18 @@ public: protected: Create_func_rpad() {} virtual ~Create_func_rpad() {} - Item *create_native_std(THD *thd, LEX_CSTRING *name, List<Item> *items); - Item *create_native_oracle(THD *thd, LEX_CSTRING *name, List<Item> *items); + Item *create_native_std(THD *thd, const LEX_CSTRING *name, + List<Item> *items); + Item *create_native_oracle(THD *thd, const LEX_CSTRING *name, + List<Item> *items); }; class Create_func_rpad_oracle : public Create_func_rpad { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { return create_native_oracle(thd, name, item_list); } @@ -2043,7 +2091,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> *item_list); static Create_func_substr_oracle s_singleton; @@ -2135,7 +2183,8 @@ protected: class Create_func_to_char : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; static Create_func_to_char s_singleton; @@ -2225,7 +2274,8 @@ protected: class Create_func_unix_timestamp : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_unix_timestamp s_singleton; @@ -2341,7 +2391,8 @@ protected: class Create_func_wsrep_sync_wait_upto : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; static Create_func_wsrep_sync_wait_upto s_singleton; @@ -2381,7 +2432,8 @@ protected: class Create_func_year_week : public Create_native_func { public: - virtual Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + virtual Item *create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list); static Create_func_year_week s_singleton; @@ -2422,7 +2474,8 @@ static bool has_named_parameters(List<Item> *params) Item* -Create_qfunc::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list) +Create_qfunc::create_func(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { LEX_CSTRING db; @@ -2455,7 +2508,8 @@ Create_qfunc::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list) Create_udf_func Create_udf_func::s_singleton; Item* -Create_udf_func::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list) +Create_udf_func::create_func(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { udf_func *udf= find_udf(name->str, name->length); DBUG_ASSERT(udf); @@ -2565,7 +2619,9 @@ Create_udf_func::create(THD *thd, udf_func *udf, List<Item> *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> *item_list) { int arg_count= 0; @@ -2612,7 +2668,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> *item_list) +Create_native_func::create_func(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { if (unlikely(has_named_parameters(item_list))) { @@ -2625,7 +2682,8 @@ Create_native_func::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_li Item* -Create_func_arg0::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list) +Create_func_arg0::create_func(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { int arg_count= 0; @@ -2643,7 +2701,8 @@ Create_func_arg0::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list Item* -Create_func_arg1::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list) +Create_func_arg1::create_func(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { int arg_count= 0; @@ -2669,7 +2728,8 @@ Create_func_arg1::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list Item* -Create_func_arg2::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list) +Create_func_arg2::create_func(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { int arg_count= 0; @@ -2697,7 +2757,8 @@ Create_func_arg2::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list Item* -Create_func_arg3::create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list) +Create_func_arg3::create_func(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { int arg_count= 0; @@ -2783,7 +2844,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> *item_list) { Item* func= NULL; @@ -2945,7 +3006,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> *item_list) { int arg_count= 0; @@ -2968,7 +3029,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> *item_list) { int arg_count= 0; @@ -2996,7 +3057,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> *item_list) { uint arg_count= item_list ? item_list->elements : 0; @@ -3011,7 +3072,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> *item_list) { int arg_count= 0; @@ -3163,7 +3224,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> *item_list) { Item *func= NULL; @@ -3200,7 +3261,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> *item_list) { Item *func= NULL; @@ -3237,7 +3298,7 @@ Create_func_des_encrypt::create_native(THD *thd, LEX_CSTRING *name, 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> *item_list) { int arg_count= 0; @@ -3267,7 +3328,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> *item_list) { Item *func= NULL; @@ -3314,7 +3375,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> *item_list) { Item *func= NULL; @@ -3367,7 +3428,7 @@ Create_func_export_set::create_native(THD *thd, LEX_CSTRING *name, 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> *item_list) { int arg_count= 0; @@ -3406,7 +3467,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> *item_list) { Item *func= NULL; @@ -3471,7 +3532,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> *item_list) { Item *func= NULL; @@ -3521,7 +3582,7 @@ Create_func_get_lock::create_2_arg(THD *thd, Item *arg1, Item *arg2) 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> *item_list) { int arg_count= 0; @@ -3610,8 +3671,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> *item_list) +Create_func_json_detailed::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; @@ -3737,7 +3798,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> *item_list) { Item *func; @@ -3759,8 +3820,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> *item_list) +Create_func_json_array_append::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; @@ -3785,8 +3846,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> *item_list) +Create_func_json_array_insert::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; @@ -3811,8 +3872,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> *item_list) +Create_func_json_insert::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; @@ -3838,7 +3899,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> *item_list) { Item *func= NULL; @@ -3865,7 +3926,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> *item_list) { Item *func= NULL; @@ -3892,7 +3953,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> *item_list) { Item *func= NULL; @@ -3918,7 +3979,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> *item_list) { Item *func; @@ -3951,7 +4012,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> *item_list) { Item *func; @@ -3976,7 +4037,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> *item_list) { Item *func; @@ -4001,8 +4062,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> *item_list) +Create_func_json_merge_patch::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func; int arg_count; @@ -4025,7 +4086,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> *item_list) { Item *func= NULL; @@ -4051,7 +4112,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> *item_list) { Item *func= NULL; @@ -4077,8 +4138,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> *item_list) +Create_func_json_contains_path::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; @@ -4103,8 +4164,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> *item_list) +Create_func_json_extract::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; @@ -4129,7 +4190,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> *item_list) { Item *func= NULL; @@ -4155,7 +4216,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> *item_list) { Item *func= NULL; @@ -4201,7 +4262,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> *item_list) { int arg_count= 0; @@ -4283,7 +4344,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> *item_list) { Item *func= NULL; @@ -4324,7 +4385,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> *item_list) { Item *func= NULL; @@ -4381,7 +4442,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> *item_list) { Item *func= NULL; @@ -4413,7 +4474,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> *item_list) { int arg_count= item_list ? item_list->elements : 0; @@ -4479,7 +4540,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> *item_list) { int arg_count= 0; @@ -4500,7 +4561,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> *item_list) { @@ -4551,7 +4612,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> *item_list) { Item *func= NULL; @@ -4749,7 +4810,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> *item_list) { Item *func= NULL; @@ -4840,7 +4901,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> *item_list) { Item *func= NULL; @@ -4880,7 +4941,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> *item_list) { Item *func= NULL; @@ -4912,7 +4973,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> *item_list) { int arg_count= item_list ? item_list->elements : 0; @@ -5070,8 +5131,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> *item_list) +Create_func_substr_oracle::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= item_list ? item_list->elements : 0; @@ -5158,7 +5219,7 @@ Create_func_to_base64::create_1_arg(THD *thd, Item *arg1) Create_func_to_char Create_func_to_char::s_singleton; Item* -Create_func_to_char::create_native(THD *thd, LEX_CSTRING *name, +Create_func_to_char::create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) { Item *func= NULL; @@ -5250,7 +5311,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> *item_list) { Item *func= NULL; @@ -5379,8 +5440,8 @@ Create_func_wsrep_sync_wait_upto::s_singleton; Item* Create_func_wsrep_sync_wait_upto::create_native(THD *thd, - LEX_CSTRING *name, - List<Item> *item_list) + const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; @@ -5430,7 +5491,7 @@ Create_func_xml_update::create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg 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> *item_list) { Item *func= NULL; diff --git a/sql/item_create.h b/sql/item_create.h index c04adad469c..89769f76254 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2010, Oracle and/or its affiliates. - Copyright (c) 2008-2011 Monty Program Ab + 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 @@ -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> *item_list) = 0; + virtual Item *create_func(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) = 0; protected: /** Constructor */ @@ -75,8 +76,8 @@ protected: class Create_func_arg0 : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, - List<Item> *item_list); + Item *create_func(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; /** Builder method, with no arguments. @@ -100,7 +101,8 @@ protected: class Create_func_arg1 : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_func(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; /** Builder method, with one argument. @@ -125,7 +127,8 @@ protected: class Create_func_arg2 : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_func(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; /** Builder method, with two arguments. @@ -151,7 +154,8 @@ protected: class Create_func_arg3 : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_func(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; /** Builder method, with three arguments. @@ -184,8 +188,8 @@ protected: class Create_native_func : public Create_func { public: - virtual Item *create_func(THD *thd, LEX_CSTRING *name, - List<Item> *item_list); + Item *create_func(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; /** Builder method, with no arguments. @@ -194,7 +198,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> *item_list) = 0; protected: @@ -222,8 +226,8 @@ 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, - List<Item> *item_list); + Item *create_func(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; /** The builder create method, for qualified functions. @@ -234,7 +238,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> *item_list) = 0; @@ -272,8 +278,8 @@ 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, - List<Item> *item_list); + Item *create_func(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; /** The builder create method, for User Defined Functions. diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index 49b85e2213b..7a1115425d9 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2003, 2016, Oracle and/or its affiliates. - Copyright (c) 2011, 2021, MariaDB + Copyright (c) 2011, 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 @@ -2989,19 +2989,19 @@ protected: class Create_func_distance_sphere: public Create_native_func { - public: - Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list) - override; - static Create_func_distance_sphere s_singleton; +public: + Item *create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; + static Create_func_distance_sphere s_singleton; - protected: - Create_func_distance_sphere() {} - virtual ~Create_func_distance_sphere() {} +protected: + Create_func_distance_sphere() {} + virtual ~Create_func_distance_sphere() {} }; 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> *item_list) { int arg_count= 0; @@ -3121,7 +3121,8 @@ protected: class Create_func_geometry_from_text : public Create_native_func { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; static Create_func_geometry_from_text s_singleton; @@ -3132,7 +3133,8 @@ protected: 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> *item_list) { Item *func= NULL; @@ -3170,7 +3172,8 @@ Create_func_geometry_from_text::create_native(THD *thd, LEX_CSTRING *name, class Create_func_geometry_from_wkb : public Create_native_func { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; static Create_func_geometry_from_wkb s_singleton; @@ -3181,7 +3184,7 @@ protected: 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> *item_list) { Item *func= NULL; @@ -3219,7 +3222,8 @@ Create_func_geometry_from_wkb::create_native(THD *thd, LEX_CSTRING *name, class Create_func_geometry_from_json : public Create_native_func { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; static Create_func_geometry_from_json s_singleton; @@ -3230,8 +3234,9 @@ protected: Item* -Create_func_geometry_from_json::create_native(THD *thd, LEX_CSTRING *name, - List<Item> *item_list) +Create_func_geometry_from_json::create_native(THD *thd, + const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; @@ -3277,7 +3282,8 @@ Create_func_geometry_from_json::create_native(THD *thd, LEX_CSTRING *name, class Create_func_as_geojson : public Create_native_func { public: - Item *create_native(THD *thd, LEX_CSTRING *name, List<Item> *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, List<Item> *item_list) + override; static Create_func_as_geojson s_singleton; @@ -3288,8 +3294,8 @@ protected: Item* -Create_func_as_geojson::create_native(THD *thd, LEX_CSTRING *name, - List<Item> *item_list) +Create_func_as_geojson::create_native(THD *thd, const LEX_CSTRING *name, + List<Item> *item_list) { Item *func= NULL; int arg_count= 0; diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index e25f8474c95..f7df1311afc 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -5499,9 +5499,10 @@ ER_TRG_DOES_NOT_EXIST hindi "TRIGGER मौजूद नहीं है" spa "El disparador no existe" 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" - spa "El disparador '%-.192s' es una vista o tabla temporal" + eng "Trigger's '%-.192s' is a view, temporary table or sequence" + ger "'%-.192s' des Triggers ist ein View, temporäre Tabelle oder Sequence" + spa "El disparador '%-.192s' es una vista, tabla temporal o secuencia" + hindi "Trigger का '%-.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" @@ -8574,8 +8575,8 @@ ER_SEQUENCE_RUN_OUT eng "Sequence '%-.64s.%-.64s' has run out" spa "La secuencia '%-.64s.%-.64s' se ha agotado" ER_SEQUENCE_INVALID_DATA - eng "Sequence '%-.64s.%-.64s' values are conflicting" - spa "Los valores de secuencia '%-.64s.%-.64s' son conflictivos" + eng "Sequence '%-.64s.%-.64s' has out of range value for options" + spa "La secuencia '%-.64s.%-.64s' tiene un valor fuera de rango para las opciones" ER_SEQUENCE_INVALID_TABLE_STRUCTURE eng "Sequence '%-.64s.%-.64s' table structure is invalid (%s)" spa "La estuctura de tabla de secuencia '%-.64s.%-.64s' es inválida (%s)" diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 72e06d2662c..8d6ad006805 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -9262,18 +9262,18 @@ bool LEX::call_statement_start(THD *thd, (static_cast<const LEX_CSTRING*>(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); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 27f269ab61b..b704a8574a4 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 @@ -9219,7 +9219,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); @@ -9270,7 +9270,8 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ else #endif /* WITH_WSREP */ { - WSREP_DEBUG("kill_one_thread victim: %lld 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; @@ -9283,7 +9284,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); } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 604ab6cc7df..6a9d1f44463 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -27796,8 +27796,11 @@ bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result) if (unit->is_unit_op() || 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= unit_operation_text[unit->common_op()]; unit->fake_select_lex->options|= SELECT_DESCRIBE; @@ -27808,6 +27811,9 @@ bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result) if (!is_pushed_union) res= unit->exec(); } + + if (unit->union_needs_tmp_table() && unit->fake_select_lex) + unit->fake_select_lex->options= save_options; } else { diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index 91ee97f7822..7ef30641888 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -122,7 +122,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); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index aad43a2d9b9..50554d50843 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3325,16 +3325,6 @@ static my_bool processlist_callback(THD *tmp, processlist_callback_arg *arg) arg->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. - */ - arg->table->field[11]->store((longlong) 0, true); - } mysql_mutex_unlock(&tmp->LOCK_thd_data); } @@ -8656,6 +8646,7 @@ bool optimize_schema_tables_memory_usage(List<TABLE_LIST> &tables) if (bitmap_is_set(table->read_set, i)) { field->move_field(cur); + field->reset(); *to_recinfo++= *from_recinfo; cur+= from_recinfo->length; } @@ -8677,6 +8668,7 @@ bool optimize_schema_tables_memory_usage(List<TABLE_LIST> &tables) to_recinfo->type= FIELD_NORMAL; to_recinfo++; } + store_record(table, s->default_values); p->recinfo= to_recinfo; // TODO switch from Aria to Memory if all blobs were optimized away? diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index cce426b842f..6685b91b02e 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2004, 2012, Oracle and/or its affiliates. - Copyright (c) 2010, 2021, MariaDB + Copyright (c) 2010, 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 @@ -439,6 +439,8 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) Query_tables_list backup; DDL_LOG_STATE ddl_log_state, ddl_log_state_tmp_file; char trn_path_buff[FN_REFLEN]; + char path[FN_REFLEN + 1]; + DBUG_ENTER("mysql_create_or_drop_trigger"); /* Charset of the buffer for statement must be system one. */ @@ -568,8 +570,12 @@ 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, NULL, NULL, NULL); + + /* We do not allow creation of triggers on temporary tables or sequence. */ + if (tables->required_type == TABLE_TYPE_SEQUENCE || + (create && thd->find_tmp_table_share(tables))) { my_error(ER_TRG_ON_VIEW_OR_TEMP_TABLE, MYF(0), tables->alias.str); goto end; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 304574da2f0..e46ed9c4f27 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2657,7 +2657,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)) @@ -2669,7 +2669,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)) @@ -8952,7 +8952,7 @@ subselect: query_expression { if (!($$= Lex->parsed_subselect($1))) - YYABORT; + MYSQL_YYABORT; } ; @@ -8997,14 +8997,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; } ; diff --git a/sql/table.cc b/sql/table.cc index 8d3ffc8083e..e88aba5aa78 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -2660,7 +2660,12 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, if (flags & VERS_SYSTEM_FIELD) { - switch (handler->real_field_type()) + auto field_type= handler->real_field_type(); + + if (DBUG_EVALUATE_IF("error_vers_wrong_type", 1, 0)) + field_type= MYSQL_TYPE_BLOB; + + switch (field_type) { case MYSQL_TYPE_TIMESTAMP2: break; @@ -2672,9 +2677,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; } } @@ -8981,9 +8990,6 @@ bool TABLE::check_period_overlaps(const KEY &key, 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(); @@ -8992,17 +8998,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); 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; diff --git a/storage/federatedx/ha_federatedx.cc b/storage/federatedx/ha_federatedx.cc index 99513d70950..20a78b8e3ce 100644 --- a/storage/federatedx/ha_federatedx.cc +++ b/storage/federatedx/ha_federatedx.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2008-2009, Patrick Galbraith & Antony Curtis -Copyright (c) 2020, MariaDB Corporation. +Copyright (c) 2020, 2022, MariaDB Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index e62b2e538d4..f33091ace3e 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -992,6 +992,9 @@ fil_space_t *fil_space_t::create(ulint id, ulint flags, if (UNIV_LIKELY(id <= fil_system.max_assigned_id)) { break; } + if (UNIV_UNLIKELY(srv_operation == SRV_OPERATION_BACKUP)) { + break; + } if (!fil_system.space_id_reuse_warned) { ib::warn() << "Allocated tablespace ID " << id << ", old maximum was " diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index ca18e602a87..d2921ddf34a 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -8937,20 +8937,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 diff --git a/wsrep-lib b/wsrep-lib -Subproject edd141127c11d78ef073f9f3ca61708821f20b3 +Subproject 23fb8624624c9144c77f3874647fa0f7394b0aa |