diff --git a/config.h.cmake b/config.h.cmake index e51dcf51f32..fc582da337f 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -604,6 +604,9 @@ #cmakedefine SO_EXT "@CMAKE_SHARED_MODULE_SUFFIX@" +#define MYSQL_MAJOR_VERSION @MAJOR_VERSION@ +#define MYSQL_MINOR_VERSION @MINOR_VERSION@ + #define PACKAGE "mysql" #define PACKAGE_BUGREPORT "" #define PACKAGE_NAME "MySQL Server" diff --git a/include/my_base.h b/include/my_base.h index 28dc55b1b84..83b02bfd833 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -351,7 +351,7 @@ enum ha_base_keytype { /* update the 'variable' part of the info: handler::records, deleted, data_file_length, index_file_length, - delete_length, check_time, mean_rec_length + check_time, mean_rec_length */ #define HA_STATUS_VARIABLE 16 /* @@ -364,6 +364,11 @@ enum ha_base_keytype { update handler::auto_increment_value */ #define HA_STATUS_AUTO 64 +/* + Get also delete_length when HA_STATUS_VARIABLE is called. It's ok to set it also + when only HA_STATUS_VARIABLE but it won't be used. +*/ +#define HA_STATUS_VARIABLE_EXTRA 128 /* Errorcodes given by handler functions diff --git a/include/my_sys.h b/include/my_sys.h index 6e2cbd4c0b3..8f7d5b0925d 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -631,6 +631,7 @@ extern const char** get_global_errmsgs(); extern void wait_for_free_space(const char *filename, int errors); extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags); extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags); +extern FILE *my_freopen(const char *path, const char *mode, FILE *stream); extern int my_fclose(FILE *fd,myf MyFlags); extern File my_fileno(FILE *fd); extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags); diff --git a/include/mysql/innodb_priv.h b/include/mysql/innodb_priv.h index 993dad7cf99..5406c292b18 100644 --- a/include/mysql/innodb_priv.h +++ b/include/mysql/innodb_priv.h @@ -22,7 +22,6 @@ class THD; -uint filename_to_tablename(const char *from, char *to, uint to_length); int get_quote_char_for_identifier(THD *thd, const char *name, uint length); bool schema_table_store_record(THD *thd, TABLE *table); void localtime_to_TIME(MYSQL_TIME *to, struct tm *from); diff --git a/mysql-test/collections/default.experimental b/mysql-test/collections/default.experimental index aad3c62b0ea..b723b59eeff 100644 --- a/mysql-test/collections/default.experimental +++ b/mysql-test/collections/default.experimental @@ -4,7 +4,6 @@ binlog.binlog_multi_engine # joro : NDB tests marked as experimental as agreed with bochklin funcs_1.charset_collation_1 # depends on compile-time decisions -funcs_1.myisam_views @solaris # Bug#50595 2010-03-05 alik funcs_1.myisam_views takes longer time on 6.0 branch than 5.1 branch innodb.innodb_information_schema # Bug#48883 2010-05-11 alik Test "innodb_information_schema" takes fewer locks than expected @@ -14,7 +13,6 @@ main.gis-rtree @freebsd # Bug#38965 2010-05-04 alik test cases main.information_schema # Bug#47449 2009-09-19 alik main.information_schema and innodb.innodb_information_schema fail sporadically main.lock_multi_bug38499 # Bug#47448 2009-09-19 alik main.lock_multi_bug38499 times out sporadically main.lock_multi_bug38691 @solaris # Bug#47792 2009-10-02 alik main.lock_multi_bug38691 times out sporadically on Solaris 10 -main.log_tables # Bug#47924 2009-10-08 alik main.log_tables times out sporadically main.lowercase_table2 @darwin # Bug#55509 2010-07-26 alik main.lowercase_table2 fails on Mac OSX (again) main.outfile_loaddata @solaris # Bug#46895 2010-01-20 alik Test "outfile_loaddata" fails (reproducible) main.show_check # Bug#58414 2010-11-24 alik Race condition in show_check.test diff --git a/mysql-test/collections/default.weekly b/mysql-test/collections/default.weekly old mode 100644 new mode 100755 index 99a4f2130e3..ab792e14926 --- a/mysql-test/collections/default.weekly +++ b/mysql-test/collections/default.weekly @@ -1,2 +1,8 @@ perl mysql-test-run.pl --timer --force --parallel=auto --comment=1st --experimental=collections/default.experimental 1st -perl mysql-test-run.pl --timer --force --parallel=auto --comment=big-tests --experimental=collections/default.experimental --vardir=var-big-tests --big-test --testcase-timeout=60 --suite-timeout=600 main.alter_table-big main.archive-big main.count_distinct3 main.create-big main.events_stress main.events_time_zone main.information_schema-big main.log_tables-big main.merge-big main.mysqlbinlog_row_big main.read_many_rows_innodb main.ssl-big main.sum_distinct-big main.type_newdecimal-big main.variables-big parts.part_supported_sql_func_innodb parts.partition_alter1_1_2_innodb parts.partition_alter1_2_innodb parts.partition_alter2_1_1_innodb parts.partition_alter2_1_2_innodb parts.partition_alter2_2_2_innodb parts.partition_alter4_innodb +perl mysql-test-run.pl --timer --force --parallel=auto --comment=big-tests --experimental=collections/default.experimental --vardir=var-big-tests --big-test --testcase-timeout=60 --suite-timeout=600 main.alter_table-big main.archive-big main.count_distinct3 main.create-big main.events_stress main.events_time_zone main.information_schema-big main.log_tables-big main.merge-big main.mysqlbinlog_row_big main.read_many_rows_innodb main.ssl-big main.sum_distinct-big main.type_newdecimal-big main.variables-big parts.part_supported_sql_func_innodb parts.partition_alter1_1_2_innodb parts.partition_alter1_2_innodb parts.partition_alter2_1_1_innodb parts.partition_alter2_1_2_innodb parts.partition_alter2_2_2_innodb parts.partition_alter4_innodb funcs_1.myisam_views-big +perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-tests-myisam-engine --experimental=collections/default.experimental --vardir=var-stmt-eits-tests-myisam-engine --suite=engines/iuds,engines/funcs --suite-timeout=500 --max-test-fail=0 --retry-failure=0 --mysqld=--default-storage-engine=myisam +perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-rpl-binlog-row-tests-myisam-engine --experimental=collections/default.experimental --vardir=var-binlog-row-eits-tests-myisam-engine --suite=engines/iuds,engines/funcs --suite-timeout=500 --max-test-fail=0 --retry-failure=0 --mysqld=--default-storage-engine=myisam --do-test=rpl --mysqld=--binlog-format=row +perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-rpl-binlog-mixed-tests-myisam-engine --experimental=collections/default.experimental --vardir=var-binlog-mixed-eits-tests-myisam-engine --suite=engines/iuds,engines/funcs --suite-timeout=500 --max-test-fail=0 --retry-failure=0 --mysqld=--default-storage-engine=myisam --do-test=rpl --mysqld=--binlog-format=mixed +perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-tests-innodb-engine --experimental=collections/default.experimental --vardir=var-stmt-eits-tests-innodb-engine --suite=engines/iuds,engines/funcs --suite-timeout=500 --max-test-fail=0 --retry-failure=0 --mysqld=--default-storage-engine=innodb --mysqld=--innodb +perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-rpl-binlog-row-tests-innodb-engine --experimental=collections/default.experimental --vardir=var-binlog-row-eits-tests-innodb-engine --suite=engines/iuds,engines/funcs --suite-timeout=500 --max-test-fail=0 --retry-failure=0 --mysqld=--default-storage-engine=innodb --mysqld=--innodb --do-test=rpl --mysqld=--binlog-format=row +perl mysql-test-run.pl --timer --force --parallel=auto --comment=eits-rpl-binlog-mixed-tests-innodb-engine --experimental=collections/default.experimental --vardir=var-binlog-mixed-eits-tests-innodb-engine --suite=engines/iuds,engines/funcs --suite-timeout=500 --max-test-fail=0 --retry-failure=0 --mysqld=--default-storage-engine=innodb --mysqld=--innodb --do-test=rpl --mysqld=--binlog-format=mixed diff --git a/mysql-test/collections/mysql-5.1-innodb.push b/mysql-test/collections/mysql-5.1-innodb.push new file mode 100644 index 00000000000..a213706498e --- /dev/null +++ b/mysql-test/collections/mysql-5.1-innodb.push @@ -0,0 +1,5 @@ +perl mysql-test-run.pl --timer --force --parallel=auto --comment=n_mix --vardir=var-n_mix --mysqld=--binlog-format=mixed --experimental=collections/default.experimental --skip-ndb --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --comment=ps_row --vardir=var-ps_row --ps-protocol --mysqld=--binlog-format=row --experimental=collections/default.experimental --skip-ndb --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --comment=embedded --vardir=var-emebbed --embedded --experimental=collections/default.experimental --skip-ndb +perl mysql-test-run.pl --timer --force --parallel=auto --comment=rpl_binlog_row --vardir=var-rpl_binlog_row --suite=rpl,binlog --mysqld=--binlog-format=row --experimental=collections/default.experimental --skip-ndb --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --comment=funcs_1 --vardir=var-funcs_1 --suite=funcs_1 --experimental=collections/default.experimental --skip-ndb diff --git a/mysql-test/collections/mysql-5.5-innodb.push b/mysql-test/collections/mysql-5.5-innodb.push new file mode 100644 index 00000000000..a213706498e --- /dev/null +++ b/mysql-test/collections/mysql-5.5-innodb.push @@ -0,0 +1,5 @@ +perl mysql-test-run.pl --timer --force --parallel=auto --comment=n_mix --vardir=var-n_mix --mysqld=--binlog-format=mixed --experimental=collections/default.experimental --skip-ndb --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --comment=ps_row --vardir=var-ps_row --ps-protocol --mysqld=--binlog-format=row --experimental=collections/default.experimental --skip-ndb --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --comment=embedded --vardir=var-emebbed --embedded --experimental=collections/default.experimental --skip-ndb +perl mysql-test-run.pl --timer --force --parallel=auto --comment=rpl_binlog_row --vardir=var-rpl_binlog_row --suite=rpl,binlog --mysqld=--binlog-format=row --experimental=collections/default.experimental --skip-ndb --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --comment=funcs_1 --vardir=var-funcs_1 --suite=funcs_1 --experimental=collections/default.experimental --skip-ndb diff --git a/mysql-test/collections/mysql-trunk-innodb.push b/mysql-test/collections/mysql-trunk-innodb.push new file mode 100644 index 00000000000..df00743c6d8 --- /dev/null +++ b/mysql-test/collections/mysql-trunk-innodb.push @@ -0,0 +1,5 @@ +perl mysql-test-run.pl --timer --force --parallel=auto --experimental=collections/default.experimental --comment=n_mix --vardir=var-n_mix --mysqld=--binlog-format=mixed --suite=main,binlog,innodb,rpl,sys_vars,perfschema --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --experimental=collections/default.experimental --comment=ps_row --vardir=var-ps_row --ps-protocol --mysqld=--binlog-format=row --suite=main,binlog,innodb,rpl,sys_vars,perfschema --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --experimental=collections/default.experimental --comment=embedded --vardir=var-emebbed --embedded --suite=main,binlog,innodb,rpl,sys_vars,perfschema +perl mysql-test-run.pl --timer --force --parallel=auto --experimental=collections/default.experimental --comment=rpl_binlog_row --vardir=var-rpl_binlog_row --mysqld=--binlog-format=row --suite=rpl,binlog --skip-test-list=collections/disabled-per-push.list +perl mysql-test-run.pl --timer --force --parallel=auto --experimental=collections/default.experimental --comment=funcs_1 --vardir=var-funcs_1 --suite=funcs_1 diff --git a/mysql-test/r/auto_increment.result b/mysql-test/r/auto_increment.result index 5adbefe104c..d21e78428c5 100644 --- a/mysql-test/r/auto_increment.result +++ b/mysql-test/r/auto_increment.result @@ -497,3 +497,22 @@ SET @@SESSION.AUTO_INCREMENT_INCREMENT=default; SET @@SESSION.AUTO_INCREMENT_OFFSET=default; DROP TABLE t1; End of 5.1 tests +# +# Bug#50619 assert in handler::update_auto_increment +# +CREATE TABLE t1 (pk INT AUTO_INCREMENT, PRIMARY KEY (pk)); +INSERT INTO t1 VALUES (NULL), (-1), (NULL); +SELECT * FROM t1; +pk +-1 +1 +2 +DROP TABLE t1; +CREATE TABLE t1 (pk BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY (pk)); +INSERT INTO t1 VALUES (NULL), (18446744073709551615-1), (NULL); +ERROR HY000: Failed to read auto-increment value from storage engine +SELECT * FROM t1; +pk +1 +18446744073709551614 +DROP TABLE t1; diff --git a/mysql-test/r/lowercase_table4.result b/mysql-test/r/lowercase_table4.result index e3f861f8884..f896b9008e3 100755 --- a/mysql-test/r/lowercase_table4.result +++ b/mysql-test/r/lowercase_table4.result @@ -5,3 +5,111 @@ CREATE DATABASE XY; USE XY; DROP DATABASE XY; +USE TEST; +# +# Bug55222 Mysqldump table names case bug in REFERENCES clause +# InnoDB did not handle lower_case_table_names=2 for +# foreign_table_names and referenced_table_names. +# +SHOW VARIABLES LIKE 'lower_case_table_names'; +Variable_name Value +lower_case_table_names 2 +DROP TABLE IF EXISTS `Table2`; +DROP TABLE IF EXISTS `Table1`; +CREATE TABLE `Table1`(c1 INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE `Table2`(c1 INT PRIMARY KEY, c2 INT) ENGINE=InnoDB; +ALTER TABLE `Table2` ADD CONSTRAINT fk1 FOREIGN KEY(c2) REFERENCES `Table1`(c1); +SHOW CREATE TABLE `Table2`; +Table Table2 +Create Table CREATE TABLE `Table2` ( + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `fk1` (`c2`), + CONSTRAINT `fk1` FOREIGN KEY (`c2`) REFERENCES `Table1` (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS; +CONSTRAINT_CATALOG def +CONSTRAINT_SCHEMA test +CONSTRAINT_NAME fk1 +UNIQUE_CONSTRAINT_CATALOG def +UNIQUE_CONSTRAINT_SCHEMA test +UNIQUE_CONSTRAINT_NAME PRIMARY +MATCH_OPTION NONE +UPDATE_RULE RESTRICT +DELETE_RULE RESTRICT +TABLE_NAME Table2 +REFERENCED_TABLE_NAME Table1 +DROP TABLE `Table2`; +DROP TABLE `Table1`; +DROP TABLE IF EXISTS Product_Order; +DROP TABLE IF EXISTS Product; +DROP TABLE IF EXISTS Customer; +CREATE TABLE Product (Category INT NOT NULL, Id INT NOT NULL, +Price DECIMAL, PRIMARY KEY(Category, Id)) ENGINE=InnoDB; +CREATE TABLE Customer (Id INT NOT NULL, PRIMARY KEY (Id)) ENGINE=InnoDB; +CREATE TABLE Product_Order (No INT NOT NULL AUTO_INCREMENT, +Product_Category INT NOT NULL, +Product_Id INT NOT NULL, +Customer_Id INT NOT NULL, +PRIMARY KEY(No), +INDEX (Product_Category, Product_Id), +FOREIGN KEY (Product_Category, Product_Id) +REFERENCES Product(Category, Id) ON UPDATE CASCADE ON DELETE RESTRICT, +INDEX (Customer_Id), +FOREIGN KEY (Customer_Id) +REFERENCES Customer(Id) +) ENGINE=INNODB; +SHOW CREATE TABLE Product_Order; +Table Product_Order +Create Table CREATE TABLE `Product_Order` ( + `No` int(11) NOT NULL AUTO_INCREMENT, + `Product_Category` int(11) NOT NULL, + `Product_Id` int(11) NOT NULL, + `Customer_Id` int(11) NOT NULL, + PRIMARY KEY (`No`), + KEY `Product_Category` (`Product_Category`,`Product_Id`), + KEY `Customer_Id` (`Customer_Id`), + CONSTRAINT `product_order_ibfk_1` FOREIGN KEY (`Product_Category`, `Product_Id`) REFERENCES `Product` (`Category`, `Id`) ON UPDATE CASCADE, + CONSTRAINT `product_order_ibfk_2` FOREIGN KEY (`Customer_Id`) REFERENCES `Customer` (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE Product; +Table Product +Create Table CREATE TABLE `Product` ( + `Category` int(11) NOT NULL, + `Id` int(11) NOT NULL, + `Price` decimal(10,0) DEFAULT NULL, + PRIMARY KEY (`Category`,`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SHOW CREATE TABLE Customer; +Table Customer +Create Table CREATE TABLE `Customer` ( + `Id` int(11) NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS; +CONSTRAINT_CATALOG def +CONSTRAINT_SCHEMA test +CONSTRAINT_NAME product_order_ibfk_1 +UNIQUE_CONSTRAINT_CATALOG def +UNIQUE_CONSTRAINT_SCHEMA test +UNIQUE_CONSTRAINT_NAME PRIMARY +MATCH_OPTION NONE +UPDATE_RULE CASCADE +DELETE_RULE RESTRICT +TABLE_NAME Product_Order +REFERENCED_TABLE_NAME Product +CONSTRAINT_CATALOG def +CONSTRAINT_SCHEMA test +CONSTRAINT_NAME product_order_ibfk_2 +UNIQUE_CONSTRAINT_CATALOG def +UNIQUE_CONSTRAINT_SCHEMA test +UNIQUE_CONSTRAINT_NAME PRIMARY +MATCH_OPTION NONE +UPDATE_RULE RESTRICT +DELETE_RULE RESTRICT +TABLE_NAME Product_Order +REFERENCED_TABLE_NAME Customer +DROP TABLE Product_Order; +DROP TABLE Product; +DROP TABLE Customer; diff --git a/mysql-test/r/not_embedded_server.result b/mysql-test/r/not_embedded_server.result index ce229bf3e2e..1f8fdb65407 100644 --- a/mysql-test/r/not_embedded_server.result +++ b/mysql-test/r/not_embedded_server.result @@ -7,13 +7,13 @@ slave_skip_errors OFF # # FLUSH PRIVILEGES should not implicitly unlock locked tables. # -drop table if exists t1; -create table t1 (c1 int); -lock tables t1 read; -flush privileges; +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (c1 INT); +LOCK TABLES t1 READ; +FLUSH PRIVILEGES; ERROR HY000: Table 'host' was not locked with LOCK TABLES -unlock tables; -drop table t1; +UNLOCK TABLES; +DROP TABLE t1; # # Bug#54812: assert in Diagnostics_area::set_ok_status during EXPLAIN # @@ -28,7 +28,7 @@ CREATE FUNCTION f() RETURNS INT RETURN 1; GRANT FILE ON *.* TO 'nopriv_user'@'localhost'; FLUSH PRIVILEGES; connection: con1 -SELECT MAX(key1) FROM t1 WHERE f() < 1 INTO OUTFILE 'mytest'; +SELECT MAX(key1) FROM t1 WHERE f() < 1 INTO OUTFILE ''; ERROR 42000: execute command denied to user 'nopriv_user'@'localhost' for routine 'test.f' INSERT INTO t2 SELECT MAX(key1) FROM t1 WHERE f() < 1; ERROR 42000: execute command denied to user 'nopriv_user'@'localhost' for routine 'test.f' diff --git a/mysql-test/suite/engines/funcs/r/in_multicolumn_string_pk_constraint_error.result b/mysql-test/suite/engines/funcs/r/in_multicolumn_string_pk_constraint_error.result index 6f66eec52a0..ff161fbae7a 100644 --- a/mysql-test/suite/engines/funcs/r/in_multicolumn_string_pk_constraint_error.result +++ b/mysql-test/suite/engines/funcs/r/in_multicolumn_string_pk_constraint_error.result @@ -55,6 +55,12 @@ INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','def','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','def'); INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +ERROR 23000: Duplicate entry 'abc-abc-abc' for key 'PRIMARY' +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); +ERROR 23000: Duplicate entry 'abc-abc-def' for key 'PRIMARY' +INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +ERROR 23000: Duplicate entry 'abc-def-def' for key 'PRIMARY' SELECT hex(c1),hex(c2),hex(c3) FROM t1; hex(c1) hex(c2) hex(c3) 61626300000000000000 61626300000000000000 61626300000000000000 diff --git a/mysql-test/suite/engines/funcs/r/in_multicolumn_string_pk_constraint_ignore.result b/mysql-test/suite/engines/funcs/r/in_multicolumn_string_pk_constraint_ignore.result index ac0fe07af56..c4d03026a87 100644 --- a/mysql-test/suite/engines/funcs/r/in_multicolumn_string_pk_constraint_ignore.result +++ b/mysql-test/suite/engines/funcs/r/in_multicolumn_string_pk_constraint_ignore.result @@ -55,6 +55,12 @@ INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','def','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','def'); INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +ERROR 23000: Duplicate entry 'abc-abc-abc' for key 'PRIMARY' +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); +ERROR 23000: Duplicate entry 'abc-abc-def' for key 'PRIMARY' +INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +ERROR 23000: Duplicate entry 'abc-def-def' for key 'PRIMARY' SELECT * FROM t1; c1 c2 c3 abc diff --git a/mysql-test/suite/engines/funcs/r/in_multicolumn_string_unique_constraint_error.result b/mysql-test/suite/engines/funcs/r/in_multicolumn_string_unique_constraint_error.result index 23fd244b40b..39e08f2f4ac 100644 --- a/mysql-test/suite/engines/funcs/r/in_multicolumn_string_unique_constraint_error.result +++ b/mysql-test/suite/engines/funcs/r/in_multicolumn_string_unique_constraint_error.result @@ -55,6 +55,12 @@ INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','def','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','def'); INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +ERROR 23000: Duplicate entry 'abc-abc-abc' for key 'c1' +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); +ERROR 23000: Duplicate entry 'abc-abc-def' for key 'c1' +INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +ERROR 23000: Duplicate entry 'abc-def-def' for key 'c1' SELECT * FROM t1; c1 c2 c3 abc diff --git a/mysql-test/suite/engines/funcs/r/in_string_pk_constraint_error.result b/mysql-test/suite/engines/funcs/r/in_string_pk_constraint_error.result index bbbccf797e7..7f60b844b64 100644 Binary files a/mysql-test/suite/engines/funcs/r/in_string_pk_constraint_error.result and b/mysql-test/suite/engines/funcs/r/in_string_pk_constraint_error.result differ diff --git a/mysql-test/suite/engines/funcs/r/in_string_unique_constraint_error.result b/mysql-test/suite/engines/funcs/r/in_string_unique_constraint_error.result index b1163e0b08a..42be531343e 100644 Binary files a/mysql-test/suite/engines/funcs/r/in_string_unique_constraint_error.result and b/mysql-test/suite/engines/funcs/r/in_string_unique_constraint_error.result differ diff --git a/mysql-test/suite/engines/funcs/r/rpl_000015.result b/mysql-test/suite/engines/funcs/r/rpl_000015.result index cfb4f0ead5a..bb3620ebc84 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_000015.result +++ b/mysql-test/suite/engines/funcs/r/rpl_000015.result @@ -10,25 +10,174 @@ File Position Binlog_Do_DB Binlog_Ignore_DB master-bin.000001 107 stop slave; reset slave; +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_PORT +Connect_Retry # Master_Log_File Read_Master_Log_Pos 4 +Relay_Log_File # +Relay_Log_Pos # Relay_Master_Log_File +Slave_IO_Running No +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 Exec_Master_Log_Pos 0 +Relay_Log_Space # +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 change master to master_host='127.0.0.1'; +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_PORT +Connect_Retry # Master_Log_File Read_Master_Log_Pos 4 +Relay_Log_File # +Relay_Log_Pos # Relay_Master_Log_File +Slave_IO_Running No +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 Exec_Master_Log_Pos 0 +Relay_Log_Space # +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 change master to master_host='127.0.0.1',master_user='root', master_password='',master_port=MASTER_PORT; +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_PORT +Connect_Retry # Master_Log_File Read_Master_Log_Pos 4 +Relay_Log_File # +Relay_Log_Pos # Relay_Master_Log_File +Slave_IO_Running No +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 Exec_Master_Log_Pos 0 +Relay_Log_Space # +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 start slave; +show slave status; +Slave_IO_State Waiting for master to send event +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_PORT +Connect_Retry 1 Master_Log_File master-bin.000001 +Read_Master_Log_Pos 107 +Relay_Log_File slave-relay-bin.000002 +Relay_Log_Pos 254 Relay_Master_Log_File master-bin.000001 -Checking that both slave threads are running. +Slave_IO_Running Yes +Slave_SQL_Running Yes +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos 107 +Relay_Log_Space 410 +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 drop table if exists t1; create table t1 (n int, PRIMARY KEY(n)); insert into t1 values (10),(45),(90); diff --git a/mysql-test/suite/engines/funcs/r/rpl_change_master.result b/mysql-test/suite/engines/funcs/r/rpl_change_master.result index 2258a35a869..c187f16cc83 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_change_master.result +++ b/mysql-test/suite/engines/funcs/r/rpl_change_master.result @@ -11,7 +11,13 @@ stop slave sql_thread; insert into t1 values(1); insert into t1 values(2); stop slave; +show slave status; +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 # # # master-bin.000001 No No 0 0 192 # None 0 No # No 0 0 1 change master to master_user='root'; +show slave status; +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id +# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 # # # master-bin.000001 No No 0 0 192 # None 0 No # No 0 0 1 start slave; select * from t1; n diff --git a/mysql-test/suite/engines/funcs/r/rpl_flushlog_loop.result b/mysql-test/suite/engines/funcs/r/rpl_flushlog_loop.result index ef4d7797dbf..53a521aaf85 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_flushlog_loop.result +++ b/mysql-test/suite/engines/funcs/r/rpl_flushlog_loop.result @@ -17,6 +17,45 @@ let $result_pattern= '%127.0.0.1%root%slave-bin.000001%slave-bin.000001%Yes%Yes% --source include/wait_slave_status.inc flush logs; -Relay_Log_File mysqld-relay-bin.000003 -Checking that both slave threads are running. +SHOW SLAVE STATUS; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port SLAVE_PORT +Connect_Retry 60 +Master_Log_File slave-bin.000001 +Read_Master_Log_Pos 107 +Relay_Log_File # +Relay_Log_Pos # +Relay_Master_Log_File slave-bin.000001 +Slave_IO_Running Yes +Slave_SQL_Running Yes +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table # +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos 107 +Relay_Log_Space # +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 2 STOP SLAVE; diff --git a/mysql-test/suite/engines/funcs/r/rpl_loaddata_s.result b/mysql-test/suite/engines/funcs/r/rpl_loaddata_s.result index 779a3af9631..8b2da7ff9a1 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_loaddata_s.result +++ b/mysql-test/suite/engines/funcs/r/rpl_loaddata_s.result @@ -10,6 +10,6 @@ load data infile '../../std_data/rpl_loaddata.dat' into table test.t1; select count(*) from test.t1; count(*) 2 -show binlog events from ; +show binlog events from 107; Log_name Pos Event_type Server_id End_log_pos Info drop table test.t1; diff --git a/mysql-test/suite/engines/funcs/r/rpl_log_pos.result b/mysql-test/suite/engines/funcs/r/rpl_log_pos.result index 1b2ded26f66..df4512fa0ea 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_log_pos.result +++ b/mysql-test/suite/engines/funcs/r/rpl_log_pos.result @@ -4,23 +4,39 @@ reset master; reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; +show master status; +File Position Binlog_Do_DB Binlog_Ignore_DB +master-bin.000001 107 +show slave status; +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 107 # # master-bin.000001 Yes Yes 0 0 107 # None 0 No # No 0 0 1 stop slave; -change master to master_log_pos=MASTER_LOG_POS; +change master to master_log_pos=107; start slave; stop slave; -change master to master_log_pos=MASTER_LOG_POS; +change master to master_log_pos=107; +show slave status; +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 107 # # master-bin.000001 No No 0 0 107 # None 0 No # No 0 0 1 start slave; +show slave status; +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 107 # # master-bin.000001 Yes Yes 0 0 107 # None 0 No # No 0 0 1 stop slave; -# impossible position leads to an error -change master to master_log_pos=MASTER_LOG_POS; +change master to master_log_pos=178; start slave; -Last_IO_Error = Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position' +show slave status; +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id +# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 178 # # master-bin.000001 No Yes 0 0 178 # None 0 No # No 1236 Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position' 0 1 +show master status; +File Position Binlog_Do_DB Binlog_Ignore_DB +master-bin.000001 107 create table if not exists t1 (n int); drop table if exists t1; create table t1 (n int); insert into t1 values (1),(2),(3); stop slave; -change master to master_log_pos=MASTER_LOG_POS; +change master to master_log_pos=207; start slave; select * from t1 ORDER BY n; n diff --git a/mysql-test/suite/engines/funcs/r/rpl_rbr_to_sbr.result b/mysql-test/suite/engines/funcs/r/rpl_rbr_to_sbr.result index 0eb3d7e8ff9..13f7fbfbdeb 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_rbr_to_sbr.result +++ b/mysql-test/suite/engines/funcs/r/rpl_rbr_to_sbr.result @@ -8,17 +8,48 @@ start slave; CREATE TABLE t1 (a INT, b LONG); INSERT INTO t1 VALUES (1,1), (2,2); INSERT INTO t1 VALUES (3,UUID()), (4,UUID()); -show binlog events from ; +SHOW BINLOG EVENTS; **** On Slave **** -show binlog events from ; -Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a INT, b LONG) -slave-bin.000001 # Query # # BEGIN -slave-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1,1), (2,2) -slave-bin.000001 # Query # # COMMIT -slave-bin.000001 # Query # # BEGIN -slave-bin.000001 # Table_map # # table_id: # (test.t1) -slave-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F -slave-bin.000001 # Query # # COMMIT -show binlog events from ; +SHOW SLAVE STATUS; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_PORT +Connect_Retry 1 +Master_Log_File master-bin.000001 +Read_Master_Log_Pos # +Relay_Log_File # +Relay_Log_Pos # +Relay_Master_Log_File master-bin.000001 +Slave_IO_Running Yes +Slave_SQL_Running Yes +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos # +Relay_Log_Space # +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 +SHOW BINLOG EVENTS; DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/engines/funcs/r/rpl_row_drop.result b/mysql-test/suite/engines/funcs/r/rpl_row_drop.result index 048e07271b3..d45bbadf7df 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_row_drop.result +++ b/mysql-test/suite/engines/funcs/r/rpl_row_drop.result @@ -41,11 +41,14 @@ t1 t2 **** On Master **** DROP TABLE t1,t2; -show binlog events from ; +SHOW BINLOG EVENTS; Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a int) -master-bin.000001 # Query # # use `test`; CREATE TABLE t2 (a int) -master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ +master-bin.000001 4 Format_desc 1 107 Server ver: VERSION, Binlog ver: 4 +master-bin.000001 107 Query 1 193 use `test`; CREATE TABLE t1 (a int) +master-bin.000001 193 Query 1 279 use `test`; CREATE TABLE t2 (a int) +master-bin.000001 279 Query 1 403 use `test`; DROP TEMPORARY TABLE IF EXISTS `t2` /* generated by server */ +master-bin.000001 403 Query 1 527 use `test`; DROP TEMPORARY TABLE IF EXISTS `t2` /* generated by server */ +master-bin.000001 527 Query 1 631 use `test`; DROP TABLE `t1` /* generated by server */ SHOW TABLES; Tables_in_test t2 diff --git a/mysql-test/suite/engines/funcs/r/rpl_row_inexist_tbl.result b/mysql-test/suite/engines/funcs/r/rpl_row_inexist_tbl.result index cd7528280d0..aff54e01b95 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_row_inexist_tbl.result +++ b/mysql-test/suite/engines/funcs/r/rpl_row_inexist_tbl.result @@ -17,5 +17,45 @@ a 0 drop table t1; insert into t1 values (1); -Last_SQL_Error = Error 'Table 'test.t1' doesn't exist' on opening tables +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_MYPORT +Connect_Retry 1 +Master_Log_File master-bin.000001 +Read_Master_Log_Pos # +Relay_Log_File # +Relay_Log_Pos # +Relay_Master_Log_File master-bin.000001 +Slave_IO_Running Yes +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table test.t2 +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 1146 +Last_Error Error executing row event: 'Table 'test.t1' doesn't exist' +Skip_Counter 0 +Exec_Master_Log_Pos # +Relay_Log_Space # +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 1146 +Last_SQL_Error Error executing row event: 'Table 'test.t1' doesn't exist' +Replicate_Ignore_Server_Ids +Master_Server_Id 1 drop table t1, t2; diff --git a/mysql-test/suite/engines/funcs/r/rpl_row_reset_slave.result b/mysql-test/suite/engines/funcs/r/rpl_row_reset_slave.result index 7bf09df31ca..5499d41bc1f 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_row_reset_slave.result +++ b/mysql-test/suite/engines/funcs/r/rpl_row_reset_slave.result @@ -11,8 +11,9 @@ change master to master_user='test'; Master_User test Master_Host 127.0.0.1 reset slave; -Master_User root +Master_User test Master_Host 127.0.0.1 +change master to master_user='root'; include/start_slave.inc Master_User root Master_Host 127.0.0.1 @@ -30,11 +31,11 @@ include/stop_slave.inc reset slave; change master to master_user='impossible_user_name'; start slave; -include/stop_slave.inc +stop slave; change master to master_user='root'; include/start_slave.inc -include/stop_slave.inc +stop slave; change master to master_user='impossible_user_name'; start slave; -include/stop_slave.inc +stop slave; reset slave; diff --git a/mysql-test/suite/engines/funcs/r/rpl_row_sp005.result b/mysql-test/suite/engines/funcs/r/rpl_row_sp005.result index 01e1970e0df..58c53b394b2 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_row_sp005.result +++ b/mysql-test/suite/engines/funcs/r/rpl_row_sp005.result @@ -77,6 +77,8 @@ id2 < ---- Master selects-- > ------------------------- CALL test.p1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM test.t3 ORDER BY id3; id3 c 1 MySQL diff --git a/mysql-test/suite/engines/funcs/r/rpl_row_trig003.result b/mysql-test/suite/engines/funcs/r/rpl_row_trig003.result index 43c2ecde2b4..131af933b41 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_row_trig003.result +++ b/mysql-test/suite/engines/funcs/r/rpl_row_trig003.result @@ -69,9 +69,15 @@ INSERT INTO test.t2 VALUES(NULL,0,'Testing MySQL databases is a cool ', 'MySQL C UPDATE test.t1 SET b1 = 0 WHERE b1 = 1; INSERT INTO test.t2 VALUES(NULL,1,'This is an after update test.', 'If this works, total will not be zero on the master or slave',1.4321,5.221,0,YEAR(NOW()),NOW()); UPDATE test.t2 SET b1 = 0 WHERE b1 = 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed INSERT INTO test.t1 VALUES(NULL,1,'add some more test data test.', 'and hope for the best', 3.321,5.221,0,YEAR(NOW()),NOW()); DELETE FROM test.t1 WHERE id = 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DELETE FROM test.t2 WHERE id = 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed DROP TRIGGER test.t1_bi; DROP TRIGGER test.t2_ai; DROP TRIGGER test.t1_bu; diff --git a/mysql-test/suite/engines/funcs/r/rpl_row_until.result b/mysql-test/suite/engines/funcs/r/rpl_row_until.result index 72dd1a6a7c3..d8637578ecc 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_row_until.result +++ b/mysql-test/suite/engines/funcs/r/rpl_row_until.result @@ -12,39 +12,201 @@ create table t2(n int not null auto_increment primary key); insert into t2 values (1),(2); insert into t2 values (3),(4); drop table t2; -start slave until master_log_file='master-bin.000001', master_log_pos=MASTER_LOG_POS; +start slave until master_log_file='master-bin.000001', master_log_pos=311; select * from t1; n 1 2 3 4 -start slave until master_log_file='master-no-such-bin.000001', master_log_pos=MASTER_LOG_POS; +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_MYPORT +Connect_Retry 1 +Master_Log_File master-bin.000001 +Read_Master_Log_Pos # +Relay_Log_File slave-relay-bin.000004 +Relay_Log_Pos # +Relay_Master_Log_File master-bin.000001 +Slave_IO_Running # +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos # +Relay_Log_Space # +Until_Condition Master +Until_Log_File master-bin.000001 +Until_Log_Pos 311 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 +start slave until master_log_file='master-no-such-bin.000001', master_log_pos=291; select * from t1; -n -1 -2 -3 -4 -start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=RELAY_LOG_POS; +n 1 +n 2 +n 3 +n 4 +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_MYPORT +Connect_Retry 1 +Master_Log_File master-bin.000001 +Read_Master_Log_Pos # +Relay_Log_File slave-relay-bin.000004 +Relay_Log_Pos # +Relay_Master_Log_File master-bin.000001 +Slave_IO_Running # +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos # +Relay_Log_Space # +Until_Condition Master +Until_Log_File master-no-such-bin.000001 +Until_Log_Pos 291 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 +start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=728; select * from t2; -n -1 -2 +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_MYPORT +Connect_Retry 1 +Master_Log_File master-bin.000001 +Read_Master_Log_Pos # +Relay_Log_File slave-relay-bin.000004 +Relay_Log_Pos # +Relay_Master_Log_File master-bin.000001 +Slave_IO_Running # +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos # +Relay_Log_Space # +Until_Condition Relay +Until_Log_File slave-relay-bin.000004 +Until_Log_Pos 728 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 start slave; stop slave; -start slave until master_log_file='master-bin.000001', master_log_pos=MASTER_LOG_POS; -start slave until master_log_file='master-bin', master_log_pos=MASTER_LOG_POS; +start slave until master_log_file='master-bin.000001', master_log_pos=740; +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_MYPORT +Connect_Retry 1 +Master_Log_File master-bin.000001 +Read_Master_Log_Pos # +Relay_Log_File slave-relay-bin.000004 +Relay_Log_Pos # +Relay_Master_Log_File master-bin.000001 +Slave_IO_Running Yes +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos # +Relay_Log_Space # +Until_Condition Master +Until_Log_File master-bin.000001 +Until_Log_Pos 740 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 +start slave until master_log_file='master-bin', master_log_pos=561; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL -start slave until master_log_file='master-bin.000001', master_log_pos=MASTER_LOG_POS, relay_log_pos=RELAY_LOG_POS; +start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL start slave until master_log_file='master-bin.000001'; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL start slave until relay_log_file='slave-relay-bin.000002'; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL -start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=MASTER_LOG_POS; +start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=561; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL start slave sql_thread; -start slave until master_log_file='master-bin.000001', master_log_pos=MASTER_LOG_POS; +start slave until master_log_file='master-bin.000001', master_log_pos=740; Warnings: -Note 1254 Slave is already running +Level Note +Code 1254 +Message Slave is already running diff --git a/mysql-test/suite/engines/funcs/r/rpl_server_id1.result b/mysql-test/suite/engines/funcs/r/rpl_server_id1.result index 1e7108d7961..700bc270f07 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_server_id1.result +++ b/mysql-test/suite/engines/funcs/r/rpl_server_id1.result @@ -8,8 +8,10 @@ create table t1 (n int); reset master; stop slave; change master to master_port=SLAVE_PORT; +show slave status; +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id + 127.0.0.1 root SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # # 0 0 0 107 None 0 No NULL No 0 0 1 start slave; -Last_IO_Error = Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). insert into t1 values (1); show status like "slave_running"; Variable_name Value diff --git a/mysql-test/suite/engines/funcs/r/rpl_server_id2.result b/mysql-test/suite/engines/funcs/r/rpl_server_id2.result index 066b563c4e8..f8d24f70776 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_server_id2.result +++ b/mysql-test/suite/engines/funcs/r/rpl_server_id2.result @@ -8,6 +8,9 @@ create table t1 (n int); reset master; stop slave; change master to master_port=SLAVE_PORT; +show slave status; +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id + 127.0.0.1 root SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 107 None 0 No NULL No 0 0 1 start slave; insert into t1 values (1); select * from t1; diff --git a/mysql-test/suite/engines/funcs/r/rpl_slave_status.result b/mysql-test/suite/engines/funcs/r/rpl_slave_status.result index c4dc7686045..0e438d294fd 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_slave_status.result +++ b/mysql-test/suite/engines/funcs/r/rpl_slave_status.result @@ -18,5 +18,46 @@ drop user rpl@127.0.0.1; flush privileges; stop slave; start slave; +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User rpl +Master_Port MASTER_MYPORT +Connect_Retry 1 +Master_Log_File master-bin.000001 +Read_Master_Log_Pos # +Relay_Log_File # +Relay_Log_Pos # +Relay_Master_Log_File master-bin.000001 +Slave_IO_Running Connecting +Slave_SQL_Running Yes +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos # +Relay_Log_Space # +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master NULL +Master_SSL_Verify_Server_Cert No +Last_IO_Errno # +Last_IO_Error # +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 1 drop table t1; drop table t1; diff --git a/mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result b/mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result index e7306cd6293..b0d92f3ca3f 100644 --- a/mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result +++ b/mysql-test/suite/engines/funcs/r/rpl_switch_stm_row_mixed.result @@ -376,7 +376,7 @@ CREATE TABLE t12 (data LONG); LOCK TABLES t12 WRITE; INSERT INTO t12 VALUES(UUID()); UNLOCK TABLES; -show binlog events from ; -show binlog events from ; +show binlog events; +show binlog events; drop database mysqltest1; set global binlog_format= @saved_binlog_format; diff --git a/mysql-test/suite/engines/funcs/r/sf_alter.result b/mysql-test/suite/engines/funcs/r/sf_alter.result index e89f529ba09..8885b20d557 100644 --- a/mysql-test/suite/engines/funcs/r/sf_alter.result +++ b/mysql-test/suite/engines/funcs/r/sf_alter.result @@ -35,6 +35,8 @@ ALTER FUNCTION sf1 #DET# ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -52,6 +54,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -72,6 +76,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -98,6 +105,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -163,6 +172,8 @@ ALTER FUNCTION sf1 #DET# CONTAINS SQL ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -180,6 +191,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -200,6 +213,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -226,6 +242,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -291,6 +309,8 @@ ALTER FUNCTION sf1 #DET# NO SQL ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -308,6 +328,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -328,6 +350,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -354,6 +379,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -419,6 +446,8 @@ ALTER FUNCTION sf1 #DET# READS SQL DATA ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -436,6 +465,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -456,6 +487,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -482,6 +516,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -547,6 +583,8 @@ ALTER FUNCTION sf1 #DET# MODIFIES SQL DATA ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -564,6 +602,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -584,6 +624,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -610,6 +653,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -675,6 +720,8 @@ ALTER FUNCTION sf1 #DET# COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -692,6 +739,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -712,6 +761,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -738,6 +790,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -803,6 +857,8 @@ ALTER FUNCTION sf1 #DET# CONTAINS SQL COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -820,6 +876,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -840,6 +898,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -866,6 +927,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -931,6 +994,8 @@ ALTER FUNCTION sf1 #DET# NO SQL COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -948,6 +1013,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -968,6 +1035,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -994,6 +1064,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1059,6 +1131,8 @@ ALTER FUNCTION sf1 #DET# READS SQL DATA COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1076,6 +1150,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1096,6 +1172,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1122,6 +1201,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1187,6 +1268,8 @@ ALTER FUNCTION sf1 #DET# MODIFIES SQL DATA COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1204,6 +1287,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1224,6 +1309,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1250,6 +1338,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1315,6 +1405,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1332,6 +1424,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1352,6 +1446,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1378,6 +1475,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1443,6 +1542,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# CONTAINS SQL ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1460,6 +1561,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1480,6 +1583,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1506,6 +1612,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1571,6 +1679,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# NO SQL ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1588,6 +1698,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1608,6 +1720,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1634,6 +1749,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1699,6 +1816,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# READS SQL DATA ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1716,6 +1835,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1736,6 +1857,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1762,6 +1886,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1827,6 +1953,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# MODIFIES SQL DATA ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1844,6 +1972,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1864,6 +1994,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1890,6 +2023,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1955,6 +2090,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1972,6 +2109,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1992,6 +2131,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2018,6 +2160,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2083,6 +2227,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# CONTAINS SQL COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2100,6 +2246,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2120,6 +2268,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2146,6 +2297,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2211,6 +2364,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# NO SQL COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2228,6 +2383,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2248,6 +2405,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2274,6 +2434,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2339,6 +2501,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# READS SQL DATA COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2356,6 +2520,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2376,6 +2542,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2402,6 +2571,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2467,6 +2638,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# MODIFIES SQL DATA COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2484,6 +2657,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2504,6 +2679,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2530,6 +2708,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2595,6 +2775,8 @@ ALTER FUNCTION sf1 #DET# SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2612,6 +2794,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2632,6 +2816,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2658,6 +2845,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2723,6 +2912,8 @@ ALTER FUNCTION sf1 #DET# CONTAINS SQL SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2740,6 +2931,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2760,6 +2953,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2786,6 +2982,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2851,6 +3049,8 @@ ALTER FUNCTION sf1 #DET# NO SQL SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2868,6 +3068,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2888,6 +3090,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2914,6 +3119,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2979,6 +3186,8 @@ ALTER FUNCTION sf1 #DET# READS SQL DATA SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2996,6 +3205,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3016,6 +3227,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3042,6 +3256,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3107,6 +3323,8 @@ ALTER FUNCTION sf1 #DET# MODIFIES SQL DATA SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3124,6 +3342,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3144,6 +3364,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3170,6 +3393,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3235,6 +3460,8 @@ ALTER FUNCTION sf1 #DET# SQL SECURITY INVOKER COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3252,6 +3479,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3272,6 +3501,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3298,6 +3530,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3363,6 +3597,8 @@ ALTER FUNCTION sf1 #DET# CONTAINS SQL SQL SECURITY INVOKER COMMENT 'comment' SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3380,6 +3616,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3400,6 +3638,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3426,6 +3667,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3491,6 +3734,8 @@ ALTER FUNCTION sf1 #DET# NO SQL SQL SECURITY INVOKER COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3508,6 +3753,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3528,6 +3775,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3554,6 +3804,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3619,6 +3871,8 @@ ALTER FUNCTION sf1 #DET# READS SQL DATA SQL SECURITY INVOKER COMMENT 'comment SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3636,6 +3890,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3656,6 +3912,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3682,6 +3941,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3747,6 +4008,8 @@ ALTER FUNCTION sf1 #DET# MODIFIES SQL DATA SQL SECURITY INVOKER COMMENT 'comm SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3764,6 +4027,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3784,6 +4049,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3810,6 +4078,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3875,6 +4145,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3892,6 +4164,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3912,6 +4186,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -3938,6 +4215,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4003,6 +4282,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# CONTAINS SQL SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4020,6 +4301,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4040,6 +4323,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4066,6 +4352,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4131,6 +4419,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# NO SQL SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4148,6 +4438,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4168,6 +4460,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4194,6 +4489,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4259,6 +4556,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# READS SQL DATA SQL SECURITY INVOKER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4276,6 +4575,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4296,6 +4597,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4322,6 +4626,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4387,6 +4693,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# MODIFIES SQL DATA SQL SECURITY INVOKER SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4404,6 +4712,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4424,6 +4734,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4450,6 +4763,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4515,6 +4830,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# SQL SECURITY INVOKER COMMENT 'comment' SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4532,6 +4849,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4552,6 +4871,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4578,6 +4900,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4643,6 +4967,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# CONTAINS SQL SQL SECURITY INVOKER COMMENT SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4660,6 +4986,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4680,6 +5008,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4706,6 +5037,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4771,6 +5104,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# NO SQL SQL SECURITY INVOKER COMMENT 'comm SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4788,6 +5123,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4808,6 +5145,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4834,6 +5174,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4899,6 +5241,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# READS SQL DATA SQL SECURITY INVOKER COMME SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4916,6 +5260,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4936,6 +5282,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -4962,6 +5311,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5027,6 +5378,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# MODIFIES SQL DATA SQL SECURITY INVOKER CO SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5044,6 +5397,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5064,6 +5419,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5090,6 +5448,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5155,6 +5515,8 @@ ALTER FUNCTION sf1 #DET# SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5172,6 +5534,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5192,6 +5556,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5218,6 +5585,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5283,6 +5652,8 @@ ALTER FUNCTION sf1 #DET# CONTAINS SQL SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5300,6 +5671,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5320,6 +5693,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5346,6 +5722,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5411,6 +5789,8 @@ ALTER FUNCTION sf1 #DET# NO SQL SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5428,6 +5808,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5448,6 +5830,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5474,6 +5859,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5539,6 +5926,8 @@ ALTER FUNCTION sf1 #DET# READS SQL DATA SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5556,6 +5945,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5576,6 +5967,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5602,6 +5996,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5667,6 +6063,8 @@ ALTER FUNCTION sf1 #DET# MODIFIES SQL DATA SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5684,6 +6082,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5704,6 +6104,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5730,6 +6133,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5795,6 +6200,8 @@ ALTER FUNCTION sf1 #DET# SQL SECURITY DEFINER COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5812,6 +6219,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5832,6 +6241,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5858,6 +6270,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5923,6 +6337,8 @@ ALTER FUNCTION sf1 #DET# CONTAINS SQL SQL SECURITY DEFINER COMMENT 'comment' SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5940,6 +6356,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5960,6 +6378,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -5986,6 +6407,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6051,6 +6474,8 @@ ALTER FUNCTION sf1 #DET# NO SQL SQL SECURITY DEFINER COMMENT 'comment' ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6068,6 +6493,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6088,6 +6515,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6114,6 +6544,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6179,6 +6611,8 @@ ALTER FUNCTION sf1 #DET# READS SQL DATA SQL SECURITY DEFINER COMMENT 'commen SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6196,6 +6630,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6216,6 +6652,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6242,6 +6681,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6307,6 +6748,8 @@ ALTER FUNCTION sf1 #DET# MODIFIES SQL DATA SQL SECURITY DEFINER COMMENT 'com SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6324,6 +6767,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6344,6 +6789,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6370,6 +6818,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6435,6 +6885,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6452,6 +6904,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6472,6 +6926,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6498,6 +6955,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6563,6 +7022,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# CONTAINS SQL SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6580,6 +7041,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6600,6 +7063,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6626,6 +7092,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6691,6 +7159,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# NO SQL SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6708,6 +7178,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6728,6 +7200,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6754,6 +7229,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6819,6 +7296,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# READS SQL DATA SQL SECURITY DEFINER ; SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6836,6 +7315,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6856,6 +7337,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6882,6 +7366,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6947,6 +7433,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# MODIFIES SQL DATA SQL SECURITY DEFINER SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6964,6 +7452,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -6984,6 +7474,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7010,6 +7503,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7075,6 +7570,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# SQL SECURITY DEFINER COMMENT 'comment' SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7092,6 +7589,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7112,6 +7611,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7138,6 +7640,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7203,6 +7707,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# CONTAINS SQL SQL SECURITY DEFINER COMMEN SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7220,6 +7726,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7240,6 +7748,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7266,6 +7777,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7331,6 +7844,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# NO SQL SQL SECURITY DEFINER COMMENT 'com SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7348,6 +7863,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7368,6 +7885,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7394,6 +7914,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7459,6 +7981,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# READS SQL DATA SQL SECURITY DEFINER COMM SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7476,6 +8000,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7496,6 +8022,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7522,6 +8051,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7587,6 +8118,8 @@ ALTER FUNCTION sf1 LANGUAGE SQL #DET# MODIFIES SQL DATA SQL SECURITY DEFINER C SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7604,6 +8137,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7624,6 +8159,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -7650,6 +8188,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 diff --git a/mysql-test/suite/engines/funcs/r/sf_cursor.result b/mysql-test/suite/engines/funcs/r/sf_cursor.result index 2fe2171b39d..e43bcaa50a3 100644 --- a/mysql-test/suite/engines/funcs/r/sf_cursor.result +++ b/mysql-test/suite/engines/funcs/r/sf_cursor.result @@ -34,6 +34,8 @@ END// SELECT sf1(); sf1() 0 +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -51,6 +53,8 @@ id data 2 1 3 3 INSERT INTO t4 VALUES(sf1()); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -71,6 +75,9 @@ id data 3 3 3 3 UPDATE t4 SET i = sf1() + 1 WHERE i = sf1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -97,6 +104,8 @@ id data 3 3 3 3 DELETE FROM t4 WHERE i = sf1() + 1; +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 diff --git a/mysql-test/suite/engines/funcs/r/sp_alter.result b/mysql-test/suite/engines/funcs/r/sp_alter.result index 22036fecde7..794a692edc4 100644 --- a/mysql-test/suite/engines/funcs/r/sp_alter.result +++ b/mysql-test/suite/engines/funcs/r/sp_alter.result @@ -31,6 +31,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -80,6 +82,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# CONTAINS SQL ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -129,6 +133,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# NO SQL ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -178,6 +184,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# READS SQL DATA ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -227,6 +235,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# MODIFIES SQL DATA ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -276,6 +286,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -325,6 +337,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# CONTAINS SQL COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -374,6 +388,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# NO SQL COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -423,6 +439,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# READS SQL DATA COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -472,6 +490,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# MODIFIES SQL DATA COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -521,6 +541,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -570,6 +592,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# CONTAINS SQL ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -619,6 +643,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# NO SQL ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -668,6 +694,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# READS SQL DATA ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -717,6 +745,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# MODIFIES SQL DATA ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -766,6 +796,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -815,6 +847,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# CONTAINS SQL COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -864,6 +898,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# NO SQL COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -913,6 +949,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# READS SQL DATA COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -962,6 +1000,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# MODIFIES SQL DATA COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1011,6 +1051,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1060,6 +1102,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# CONTAINS SQL SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1109,6 +1153,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# NO SQL SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1158,6 +1204,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# READS SQL DATA SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1207,6 +1255,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# MODIFIES SQL DATA SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1256,6 +1306,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1305,6 +1357,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# CONTAINS SQL SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1354,6 +1408,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# NO SQL SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1403,6 +1459,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# READS SQL DATA SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1452,6 +1510,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# MODIFIES SQL DATA SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1501,6 +1561,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1550,6 +1612,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# CONTAINS SQL SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1599,6 +1663,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# NO SQL SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1648,6 +1714,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# READS SQL DATA SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1697,6 +1765,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# MODIFIES SQL DATA SQL SECURITY INVOKER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1746,6 +1816,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1795,6 +1867,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# CONTAINS SQL SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1844,6 +1918,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# NO SQL SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1893,6 +1969,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# READS SQL DATA SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1942,6 +2020,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# MODIFIES SQL DATA SQL SECURITY INVOKER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -1991,6 +2071,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2040,6 +2122,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# CONTAINS SQL SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2089,6 +2173,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# NO SQL SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2138,6 +2224,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# READS SQL DATA SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2187,6 +2275,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# MODIFIES SQL DATA SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2236,6 +2326,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2285,6 +2377,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# CONTAINS SQL SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2334,6 +2428,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# NO SQL SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2383,6 +2479,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# READS SQL DATA SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2432,6 +2530,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 #DET# MODIFIES SQL DATA SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2481,6 +2581,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2530,6 +2632,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# CONTAINS SQL SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2579,6 +2683,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# NO SQL SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2628,6 +2734,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# READS SQL DATA SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2677,6 +2785,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# MODIFIES SQL DATA SQL SECURITY DEFINER ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2726,6 +2836,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2775,6 +2887,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# CONTAINS SQL SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2824,6 +2938,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# NO SQL SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2873,6 +2989,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# READS SQL DATA SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 @@ -2922,6 +3040,8 @@ CLOSE cur2; END// ALTER PROCEDURE sp1 LANGUAGE SQL #DET# MODIFIES SQL DATA SQL SECURITY DEFINER COMMENT 'comment' ; CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 diff --git a/mysql-test/suite/engines/funcs/r/sp_cursor.result b/mysql-test/suite/engines/funcs/r/sp_cursor.result index 6ce2aae030c..58383f8a9cb 100644 --- a/mysql-test/suite/engines/funcs/r/sp_cursor.result +++ b/mysql-test/suite/engines/funcs/r/sp_cursor.result @@ -30,6 +30,8 @@ CLOSE cur1; CLOSE cur2; END// CALL sp1(); +Warnings: +Error 1329 No data - zero rows fetched, selected, or processed SELECT * FROM t1 ORDER BY id; id data 1 1 diff --git a/mysql-test/suite/engines/funcs/t/disabled.def b/mysql-test/suite/engines/funcs/t/disabled.def index 19de28441f0..2d8ea2d4ff8 100644 --- a/mysql-test/suite/engines/funcs/t/disabled.def +++ b/mysql-test/suite/engines/funcs/t/disabled.def @@ -1,8 +1,99 @@ # List of disabled tests # test name : comment -rpl_redirect : Fails due to bug#49978 -crash_manycolumns_string : Bug#50495 'Row size too large' for plugin, but works for built-in innodb -ix_unique_lob : Bug#52283 Innodb reports extra warnings when SELECT/WHERE is performed using invalid value -ix_unique_string_length : Bug#52283 Innodb reports extra warnings when SELECT/WHERE is performed using invalid value -rpl_empty_master_crash : Test not applicable in 5.5+ -rpl_REDIRECT : Test not applicable in 5.5+ +rpl_redirect : Fails due to bug#49978 +crash_manycolumns_string : Bug#50495 'Row size too large' for plugin, but works for built-in innodb +ix_unique_lob : Bug#52283 Innodb reports extra warnings when SELECT/WHERE is performed using invalid value +ix_unique_string_length : Bug#52283 Innodb reports extra warnings when SELECT/WHERE is performed using invalid value +rpl_empty_master_crash : Test not applicable in 5.5+ +rpl_REDIRECT : Test not applicable in 5.5+ + +rpl_create_database : Result Difference Due To Change In .inc file +rpl_loaddata_m : Result Difference Due To Change In .inc file +rpl_sp_effects : Result Difference Due To Change In .inc file +rpl_variables : Result Difference Due To Change In .inc file +rpl_loaddata_s : Result Difference Due To Change In .inc file +rpl_dual_pos_advance : Result Difference Due To Change In .inc file +rpl000011 : Result Difference Due To Change In .inc file +rpl000013 : Result Difference Due To Change In .inc file +rpl_000015 : Result Difference Due To Change In .inc file +rpl_LD_INFILE : Result Difference Due To Change In .inc file +rpl_alter : Result Difference Due To Change In .inc file +rpl_alter_db : Result Difference Due To Change In .inc file +rpl_alter_db : Result Difference Due To Change In .inc file +rpl_bit : Result Difference Due To Change In .inc file +rpl_bit_npk : Result Difference Due To Change In .inc file +rpl_change_master : Result Difference Due To Change In .inc file +rpl_do_grant : Result Difference Due To Change In .inc file +rpl_drop : Result Difference Due To Change In .inc file +rpl_drop_db : Result Difference Due To Change In .inc file +rpl_flushlog_loop : Result Difference Due To Change In .inc file +rpl_get_lock : Result Difference Due To Change In .inc file +rpl_get_lock : Result Difference Due To Change In .inc file +rpl_insert : Result Difference Due To Change In .inc file +rpl_insert_select : Result Difference Due To Change In .inc file +rpl_loaddata2 : Result Difference Due To Change In .inc file +rpl_loaddatalocal : Result Difference Due To Change In .inc file +rpl_loadfile : Result Difference Due To Change In .inc file +rpl_log_pos : Result Difference Due To Change In .inc file +rpl_many_optimize : Result Difference Due To Change In .inc file +rpl_master_pos_wait : Result Difference Due To Change In .inc file +rpl_misc_functions : Result Difference Due To Change In .inc file +rpl_ps : Result Difference Due To Change In .inc file +rpl_server_id1 : Result Difference Due To Change In .inc file +rpl_session_var : Result Difference Due To Change In .inc file +rpl_sf : Result Difference Due To Change In .inc file +rpl_slave_status : Result Difference Due To Change In .inc file +rpl_sp004 : Result Difference Due To Change In .inc file +rpl_start_stop_slave : Result Difference Due To Change In .inc file +rpl_stm_max_relay_size : Result Difference Due To Change In .inc file +rpl_stm_mystery22 : Result Difference Due To Change In .inc file +rpl_stm_no_op : Result Difference Due To Change In .inc file +rpl_stm_reset_slave : Result Difference Due To Change In .inc file +rpl_temp_table : Result Difference Due To Change In .inc file +rpl_temporary : Result Difference Due To Change In .inc file +rpl_trigger : Result Difference Due To Change In .inc file +rpl_trunc_temp : Result Difference Due To Change In .inc file +rpl_user_variables : Result Difference Due To Change In .inc file +rpl_server_id2 : Result Difference Due To Change In .inc file +rpl000010 : Result Difference Due To Change In .inc file +rpl_init_slave : Result Difference Due To Change In .inc file +rpl_multi_delete2 : Result Difference Due To Change In .inc file +rpl_view : Result Difference Due To Change In .inc file +rpl_ignore_table_update : Result Difference Due To Change In .inc file +rpl_err_ignoredtable : Result Difference Due To Change In .inc file +rpl_multi_update4 : Result Difference Due To Change In .inc file +rpl_multi_delete : Result Difference Due To Change In .inc file +rpl_ignore_grant : Result Difference Due To Change In .inc file +rpl_ignore_revoke : Result Difference Due To Change In .inc file +rpl_free_items : Result Difference Due To Change In .inc file +rpl_replicate_ignore_db : Result Difference Due To Change In .inc file +rpl000017 : Result Difference Due To Change In .inc file +rpl_skip_error : Result Difference Due To Change In .inc file + +rpl_row_until : Test Present in rpl suite as well . Test Fails table with t2 table not found. +rpl_loaddata_s : Test Present in rpl suite as well . Test Fails due to bin log truncation. +rpl_log_pos : Test Present in rpl suite as well . Test Fails due to bin log truncation. +rpl_row_NOW : Result Difference Due To Change In .inc file +rpl_row_USER : Result Difference Due To Change In .inc file +rpl_row_drop : Result Difference Due To Change In .inc file +rpl_row_func001 : Result Difference Due To Change In .inc file +rpl_row_max_relay_size : Result Difference Due To Change In .inc file +rpl_row_reset_slave : Result Difference Due To Change In .inc file +rpl_row_sp001 : Result Difference Due To Change In .inc file +rpl_row_sp005 : Result Difference Due To Change In .inc file +rpl_row_sp008 : Result Difference Due To Change In .inc file +rpl_row_sp009 : Result Difference Due To Change In .inc file +rpl_row_sp010 : Result Difference Due To Change In .inc file +rpl_row_sp011 : Result Difference Due To Change In .inc file +rpl_row_sp012 : Result Difference Due To Change In .inc file +rpl_row_stop_middle : Result Difference Due To Change In .inc file +rpl_row_trig001 : Result Difference Due To Change In .inc file +rpl_row_trig002 : Result Difference Due To Change In .inc file +rpl_row_trig003 : Result Difference Due To Change In .inc file +rpl_row_view01 : Result Difference Due To Change In .inc file +rpl_switch_stm_row_mixed : Result Difference Due To Change In .inc file +rpl_relayspace : Result Difference Due To Change In .inc file +rpl_row_inexist_tbl : Result Difference Due To Change In .inc file +rpl_sp : Result Difference Due To Change In .inc file +rpl_rbr_to_sbr : Result Difference Due To Change In .inc file +rpl_row_until : Test Timesout diff --git a/mysql-test/suite/engines/funcs/t/in_multicolumn_string_pk_constraint_error.test b/mysql-test/suite/engines/funcs/t/in_multicolumn_string_pk_constraint_error.test index 1b07a750b7e..f2b8a0afcdd 100644 --- a/mysql-test/suite/engines/funcs/t/in_multicolumn_string_pk_constraint_error.test +++ b/mysql-test/suite/engines/funcs/t/in_multicolumn_string_pk_constraint_error.test @@ -43,14 +43,13 @@ INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','def','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','def'); INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); -# Bug#52430 : Uncomment the following lines -# when the bug is fixed -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +# Bug#52430 +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); --sorted_result SELECT hex(c1),hex(c2),hex(c3) FROM t1; DROP TABLE t1; diff --git a/mysql-test/suite/engines/funcs/t/in_multicolumn_string_pk_constraint_ignore.test b/mysql-test/suite/engines/funcs/t/in_multicolumn_string_pk_constraint_ignore.test index 58d97d9793f..98d34144b14 100644 --- a/mysql-test/suite/engines/funcs/t/in_multicolumn_string_pk_constraint_ignore.test +++ b/mysql-test/suite/engines/funcs/t/in_multicolumn_string_pk_constraint_ignore.test @@ -43,14 +43,13 @@ INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','def','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','def'); INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); -# Bug#52430 : Uncomment the following lines -# when the bug is fixed -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +# Bug#52430 +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); --sorted_result SELECT * FROM t1; DROP TABLE t1; diff --git a/mysql-test/suite/engines/funcs/t/in_multicolumn_string_unique_constraint_error.test b/mysql-test/suite/engines/funcs/t/in_multicolumn_string_unique_constraint_error.test index d5e58f1bb1d..07529317f88 100644 --- a/mysql-test/suite/engines/funcs/t/in_multicolumn_string_unique_constraint_error.test +++ b/mysql-test/suite/engines/funcs/t/in_multicolumn_string_unique_constraint_error.test @@ -43,14 +43,13 @@ INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','def','abc'); INSERT INTO t1 (c1,c2,c3) VALUES('def','abc','def'); INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); -# Bug#52430 : Uncomment the following lines -# when the bug is fixed -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); +# Bug#52430 +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','abc'); +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','abc','def'); +--error ER_DUP_ENTRY +INSERT INTO t1 (c1,c2,c3) VALUES('abc','def','def'); --sorted_result SELECT * FROM t1; DROP TABLE t1; diff --git a/mysql-test/suite/engines/funcs/t/in_string_pk_constraint_error.test b/mysql-test/suite/engines/funcs/t/in_string_pk_constraint_error.test index 9a47ad296b2..5202992947c 100644 --- a/mysql-test/suite/engines/funcs/t/in_string_pk_constraint_error.test +++ b/mysql-test/suite/engines/funcs/t/in_string_pk_constraint_error.test @@ -18,10 +18,9 @@ DROP TABLE t1; CREATE TABLE t1(c1 BINARY(10) NOT NULL PRIMARY KEY); INSERT INTO t1 (c1) VALUES('abc'); INSERT INTO t1 (c1) VALUES('def'); -# Bug#52430 : Uncomment the following lines -# when the bug is fixed -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1) VALUES('abc'); +# Bug#52430 +--error ER_DUP_ENTRY +INSERT INTO t1 (c1) VALUES('abc'); SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1(c1 VARBINARY(10) NOT NULL PRIMARY KEY); diff --git a/mysql-test/suite/engines/funcs/t/in_string_unique_constraint_error.test b/mysql-test/suite/engines/funcs/t/in_string_unique_constraint_error.test index 27d60c9caad..bc29aa57ec9 100644 --- a/mysql-test/suite/engines/funcs/t/in_string_unique_constraint_error.test +++ b/mysql-test/suite/engines/funcs/t/in_string_unique_constraint_error.test @@ -18,10 +18,9 @@ DROP TABLE t1; CREATE TABLE t1(c1 BINARY(10) NULL UNIQUE); INSERT INTO t1 (c1) VALUES('abc'); INSERT INTO t1 (c1) VALUES('def'); -# Bug#52430 : Uncomment the following lines -# when the bug is fixed -#--error ER_DUP_ENTRY -#INSERT INTO t1 (c1) VALUES('abc'); +# Bug#52430 +--error ER_DUP_ENTRY +INSERT INTO t1 (c1) VALUES('abc'); SELECT * FROM t1; DROP TABLE t1; CREATE TABLE t1(c1 VARBINARY(10) NULL UNIQUE); diff --git a/mysql-test/suite/engines/funcs/t/rpl000013.test b/mysql-test/suite/engines/funcs/t/rpl000013.test index 69a102e84ce..2c727107563 100644 --- a/mysql-test/suite/engines/funcs/t/rpl000013.test +++ b/mysql-test/suite/engines/funcs/t/rpl000013.test @@ -14,14 +14,22 @@ connection slave; sync_with_master; connection master; +--disable_query_log +CALL mtr.add_suppression(" Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +--enable_query_log + create table t2(n int); create temporary table t1 (n int); insert into t1 values(1),(2),(3); +--disable_warnings insert into t2 select * from t1; +--enable_warnings connection master1; create temporary table t1 (n int); insert into t1 values (4),(5); +--disable_warnings insert into t2 select * from t1 as t10; +--enable_warnings save_master_pos; disconnect master; connection slave; diff --git a/mysql-test/suite/engines/funcs/t/rpl_000015.test b/mysql-test/suite/engines/funcs/t/rpl_000015.test index 6c18e66a3a6..817ed6f407c 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_000015.test +++ b/mysql-test/suite/engines/funcs/t/rpl_000015.test @@ -11,25 +11,31 @@ save_master_pos; connection slave; stop slave; reset slave; -let $status_items= Master_Log_File, Read_Master_Log_Pos, Relay_Master_Log_File, Exec_Master_Log_Pos; -source include/show_slave_status.inc; +--vertical_results +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 5 # 8 # 9 # 23 # 33 # +show slave status; change master to master_host='127.0.0.1'; # The following needs to be cleaned up when change master is fixed -source include/show_slave_status.inc; - +--vertical_results +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 5 # 8 # 9 # 23 # 33 # +show slave status; --replace_result $MASTER_MYPORT MASTER_PORT eval change master to master_host='127.0.0.1',master_user='root', master_password='',master_port=$MASTER_MYPORT; -source include/show_slave_status.inc; - +--vertical_results +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 5 # 8 # 9 # 23 # 33 # +show slave status; start slave; sync_with_master; -let $status_items= Master_Log_File, Relay_Master_Log_File; -source include/show_slave_status.inc; -source include/check_slave_is_running.inc; - --vertical_results +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 5 # 8 # 9 # 23 # 33 # +--replace_column 33 # +show slave status; connection master; --disable_warnings drop table if exists t1; diff --git a/mysql-test/suite/engines/funcs/t/rpl_change_master.test b/mysql-test/suite/engines/funcs/t/rpl_change_master.test index ce8c921c2ad..c031464c95e 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_change_master.test +++ b/mysql-test/suite/engines/funcs/t/rpl_change_master.test @@ -18,26 +18,13 @@ save_master_pos; connection slave; --real_sleep 3 # wait for I/O thread to have read updates stop slave; -source include/wait_for_slave_to_stop.inc; - -let $read_pos= query_get_value(SHOW SLAVE STATUS, Read_Master_Log_Pos, 1); -let $exec_pos= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1); -if (`SELECT $read_pos = $exec_pos`) -{ - source include/show_rpl_debug_info.inc; - echo 'Read_Master_Log_Pos: $read_pos' == 'Exec_Master_Log_Pos: $exec_pos'; - die Failed because Read_Master_Log_Pos is equal to Exec_Master_Log_Pos; -} +--replace_result $MASTER_MYPORT MASTER_MYPORT +--replace_column 1 # 7 # 8 # 9 # 23 # 33 # +show slave status; change master to master_user='root'; -let $read_pos= query_get_value(SHOW SLAVE STATUS, Read_Master_Log_Pos, 1); -let $exec_pos= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1); -if (`SELECT $read_pos <> $exec_pos`) -{ - source include/show_rpl_debug_info.inc; - echo 'Read_Master_Log_Pos: $read_pos' <> 'Exec_Master_Log_Pos: $exec_pos'; - die Failed because Read_Master_Log_Pos is not equal to Exec_Master_Log_Pos; -} - +--replace_result $MASTER_MYPORT MASTER_MYPORT +--replace_column 1 # 7 # 8 # 9 # 23 # 33 # +show slave status; start slave; sync_with_master; select * from t1; diff --git a/mysql-test/suite/engines/funcs/t/rpl_err_ignoredtable.test b/mysql-test/suite/engines/funcs/t/rpl_err_ignoredtable.test index 5f7af126940..6b23f1a0d03 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_err_ignoredtable.test +++ b/mysql-test/suite/engines/funcs/t/rpl_err_ignoredtable.test @@ -8,7 +8,7 @@ -- source include/master-slave.inc --disable_query_log -call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); --enable_query_log connection master; diff --git a/mysql-test/suite/engines/funcs/t/rpl_flushlog_loop.test b/mysql-test/suite/engines/funcs/t/rpl_flushlog_loop.test index 0b71817226a..2e481f5e5e7 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_flushlog_loop.test +++ b/mysql-test/suite/engines/funcs/t/rpl_flushlog_loop.test @@ -41,7 +41,8 @@ sleep 5; # # Show status of slave # ---let status_items= Relay_Log_File ---source include/show_slave_status.inc ---source include/check_slave_is_running.inc +--replace_result $SLAVE_MYPORT SLAVE_PORT +--replace_column 1 # 8 # 9 # 16 # 23 # 33 # +--vertical_results +SHOW SLAVE STATUS; STOP SLAVE; diff --git a/mysql-test/suite/engines/funcs/t/rpl_get_lock.test b/mysql-test/suite/engines/funcs/t/rpl_get_lock.test index 6a6489954c9..c57e9313899 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_get_lock.test +++ b/mysql-test/suite/engines/funcs/t/rpl_get_lock.test @@ -1,7 +1,7 @@ source include/master-slave.inc; --disable_query_log -call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); --enable_query_log create table t1(n int); diff --git a/mysql-test/suite/engines/funcs/t/rpl_loaddata_s.test b/mysql-test/suite/engines/funcs/t/rpl_loaddata_s.test index 2dd2218eb5c..a06df3bbfc9 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_loaddata_s.test +++ b/mysql-test/suite/engines/funcs/t/rpl_loaddata_s.test @@ -20,7 +20,9 @@ save_master_pos; connection slave; sync_with_master; select count(*) from test.t1; # check that LOAD was replicated -source include/show_binlog_events.inc; +--replace_column 2 # 5 # +--replace_regex /table_id: [0-9]+/table_id: #/ +show binlog events from 107; # should be nothing # Cleanup connection master; diff --git a/mysql-test/suite/engines/funcs/t/rpl_loadfile.test b/mysql-test/suite/engines/funcs/t/rpl_loadfile.test index 8216af76341..97ee89a6d95 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_loadfile.test +++ b/mysql-test/suite/engines/funcs/t/rpl_loadfile.test @@ -13,7 +13,7 @@ -- source include/master-slave.inc --disable_query_log -call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); --enable_query_log # Begin clean up test section diff --git a/mysql-test/suite/engines/funcs/t/rpl_log_pos.test b/mysql-test/suite/engines/funcs/t/rpl_log_pos.test index e07f0d5f2a7..3a762b19756 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_log_pos.test +++ b/mysql-test/suite/engines/funcs/t/rpl_log_pos.test @@ -11,41 +11,36 @@ # Passes with rbr no problem, removed statement include [jbm] source include/master-slave.inc; -let $master_log_pos= query_get_value(SHOW MASTER STATUS, Position, 1); +--replace_column 3 +show master status; sync_slave_with_master; +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 8 # 9 # 23 # 33 # +show slave status; stop slave; - ---replace_result $master_log_pos MASTER_LOG_POS -eval change master to master_log_pos=$master_log_pos; +change master to master_log_pos=107; start slave; sleep 5; stop slave; - ---replace_result $master_log_pos MASTER_LOG_POS -eval change master to master_log_pos=$master_log_pos; ---let $slave_param= Read_Master_Log_Pos ---let $slave_param_value= $master_log_pos ---source include/wait_for_slave_param.inc - +change master to master_log_pos=107; +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 8 # 9 # 23 # 33 # +show slave status; start slave; sleep 5; ---let $slave_param= Read_Master_Log_Pos ---let $slave_param_value= $master_log_pos ---source include/wait_for_slave_param.inc ---source include/check_slave_no_error.inc - +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 8 # 9 # 23 # 33 # +show slave status; stop slave; ---echo # impossible position leads to an error ---replace_result 177 MASTER_LOG_POS -change master to master_log_pos=177; +change master to master_log_pos=178; start slave; sleep 2; -let $slave_io_errno= 1236; -let $show_slave_io_error= 1; -source include/wait_for_slave_io_error.inc; +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 8 # 9 # 23 # 33 # +show slave status; connection master; - -let $master_log_pos= query_get_value(SHOW MASTER STATUS, Position, 1); +--replace_column 3 +show master status; create table if not exists t1 (n int); drop table if exists t1; create table t1 (n int); @@ -53,9 +48,7 @@ insert into t1 values (1),(2),(3); save_master_pos; connection slave; stop slave; - ---replace_result $master_log_pos MASTER_LOG_POS -eval change master to master_log_pos=$master_log_pos; +change master to master_log_pos=207; start slave; sync_with_master; select * from t1 ORDER BY n; diff --git a/mysql-test/suite/engines/funcs/t/rpl_misc_functions.test b/mysql-test/suite/engines/funcs/t/rpl_misc_functions.test index 205155a9a0e..6e4bedf7371 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_misc_functions.test +++ b/mysql-test/suite/engines/funcs/t/rpl_misc_functions.test @@ -4,7 +4,7 @@ source include/master-slave.inc; --disable_query_log -call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); --enable_query_log create table t1(id int, i int, r1 int, r2 int, p varchar(100)); diff --git a/mysql-test/suite/engines/funcs/t/rpl_rbr_to_sbr.test b/mysql-test/suite/engines/funcs/t/rpl_rbr_to_sbr.test index e78c74ab423..30d2688c3fb 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_rbr_to_sbr.test +++ b/mysql-test/suite/engines/funcs/t/rpl_rbr_to_sbr.test @@ -9,17 +9,25 @@ CREATE TABLE t1 (a INT, b LONG); INSERT INTO t1 VALUES (1,1), (2,2); INSERT INTO t1 VALUES (3,UUID()), (4,UUID()); +let $VERSION=`select version()`; +--replace_result $VERSION VERSION +--replace_column 2 # 5 # +--replace_regex /table_id: [0-9]+/table_id: #/ # Different number of binlog events are generated by different engines --disable_result_log -source include/show_binlog_events.inc; +SHOW BINLOG EVENTS; --enable_result_log sync_slave_with_master; --echo **** On Slave **** -source include/show_binlog_events.inc; - +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 # +--query_vertical SHOW SLAVE STATUS +--replace_result $VERSION VERSION +--replace_column 2 # 5 # +--replace_regex /table_id: [0-9]+/table_id: #/ # Different number of binlog events are generated by different engines --disable_result_log -source include/show_binlog_events.inc; +SHOW BINLOG EVENTS; --enable_result_log --exec $MYSQL_DUMP --compact --order-by-primary --skip-extended-insert --no-create-info test > $MYSQLTEST_VARDIR/tmp/rpl_rbr_to_sbr_master.sql --exec $MYSQL_DUMP_SLAVE --compact --order-by-primary --skip-extended-insert --no-create-info test > $MYSQLTEST_VARDIR/tmp/rpl_rbr_to_sbr_slave.sql diff --git a/mysql-test/suite/engines/funcs/t/rpl_row_drop.test b/mysql-test/suite/engines/funcs/t/rpl_row_drop.test index d18ebc2846b..20c217a7c3a 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_row_drop.test +++ b/mysql-test/suite/engines/funcs/t/rpl_row_drop.test @@ -30,7 +30,10 @@ connection master; --echo **** On Master **** # Should drop the non-temporary table t1 and the temporary table t2 DROP TABLE t1,t2; -source include/show_binlog_events.inc; +let $VERSION=`select version()`; +--replace_result $VERSION VERSION +--replace_regex /table_id: [0-9]+/table_id: #/ +SHOW BINLOG EVENTS; SHOW TABLES; sync_slave_with_master; --echo **** On Slave **** diff --git a/mysql-test/suite/engines/funcs/t/rpl_row_inexist_tbl.test b/mysql-test/suite/engines/funcs/t/rpl_row_inexist_tbl.test index dca2894c9da..736071a8ece 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_row_inexist_tbl.test +++ b/mysql-test/suite/engines/funcs/t/rpl_row_inexist_tbl.test @@ -22,11 +22,13 @@ connection master; insert into t1 values (1); connection slave; -# slave should have stopped because can't find table t1 +# slave should have stopped because can't find table t1 +wait_for_slave_to_stop; # see if we have a good error message: ---let $slave_sql_errno= 1146 ---let $show_slave_sql_error= 1 ---source include/wait_for_slave_sql_error.inc +--replace_result $MASTER_MYPORT MASTER_MYPORT +--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 33 # +--vertical_results +show slave status; # cleanup connection master; diff --git a/mysql-test/suite/engines/funcs/t/rpl_row_until.test b/mysql-test/suite/engines/funcs/t/rpl_row_until.test index b60734317c6..ccd9ce11637 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_row_until.test +++ b/mysql-test/suite/engines/funcs/t/rpl_row_until.test @@ -18,50 +18,44 @@ connection master; # create some events on master create table t1(n int not null auto_increment primary key); insert into t1 values (1),(2),(3),(4); -let $master_log_pos_1= query_get_value(SHOW MASTER STATUS, Position, 1); drop table t1; - create table t2(n int not null auto_increment primary key); insert into t2 values (1),(2); -let $master_log_pos_2= query_get_value(SHOW MASTER STATUS, Position, 1); insert into t2 values (3),(4); drop table t2; # try to replicate all queries until drop of t1 connection slave; ---replace_result $master_log_pos_1 MASTER_LOG_POS -eval start slave until master_log_file='master-bin.000001', master_log_pos=$master_log_pos_1; +start slave until master_log_file='master-bin.000001', master_log_pos=311; sleep 2; wait_for_slave_to_stop; # here table should be still not deleted select * from t1; ---let $slave_param= Exec_Master_Log_Pos ---let $slave_param_value= $master_log_pos_1 ---source include/check_slave_param.inc +--vertical_results +--replace_result $MASTER_MYPORT MASTER_MYPORT +--replace_column 1 # 7 # 9 # 11 # 22 # 23 # 33 # +show slave status; # this should fail right after start ---replace_result 291 MASTER_LOG_POS start slave until master_log_file='master-no-such-bin.000001', master_log_pos=291; # again this table should be still not deleted select * from t1; sleep 2; wait_for_slave_to_stop; ---let $slave_param= Exec_Master_Log_Pos ---let $slave_param_value= $master_log_pos_1 ---source include/check_slave_param.inc +--vertical_results +--replace_result $MASTER_MYPORT MASTER_MYPORT +--replace_column 1 # 7 # 9 # 11 # 22 # 23 # 33 # +show slave status; # try replicate all up to and not including the second insert to t2; -let $master_log_pos= $master_log_pos_2; -let $relay_log_file= slave-relay-bin.000004; ---source include/get_relay_log_pos.inc ---replace_result $relay_log_pos RELAY_LOG_POS -eval start slave until relay_log_file='$relay_log_file', relay_log_pos=$relay_log_pos; +start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=728; sleep 2; wait_for_slave_to_stop; select * from t2; ---let $slave_param= Exec_Master_Log_Pos ---let $slave_param_value= $master_log_pos ---source include/check_slave_param.inc +--vertical_results +--replace_result $MASTER_MYPORT MASTER_MYPORT +--replace_column 1 # 7 # 9 # 11 # 22 # 23 # 33 # +show slave status; # clean up start slave; @@ -71,32 +65,27 @@ connection slave; sync_with_master; stop slave; ---let $exec_log_pos_1= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1) # this should stop immediately as we are already there ---replace_result $master_log_pos_2 MASTER_LOG_POS -eval start slave until master_log_file='master-bin.000001', master_log_pos=$master_log_pos_2; +start slave until master_log_file='master-bin.000001', master_log_pos=740; sleep 2; wait_for_slave_to_stop; # here the sql slave thread should be stopped ---let $slave_param= Exec_Master_Log_Pos ---let $slave_param_value= $exec_log_pos_1 ---source include/check_slave_param.inc +--vertical_results +--replace_result $MASTER_MYPORT MASTER_MYPORT bin.000005 bin.000004 bin.000006 bin.000004 bin.000007 bin.000004 +--replace_column 1 # 7 # 9 # 22 # 23 # 33 # +show slave status; #testing various error conditions ---replace_result 561 MASTER_LOG_POS --error 1277 start slave until master_log_file='master-bin', master_log_pos=561; ---replace_result 561 MASTER_LOG_POS 12 RELAY_LOG_POS --error 1277 start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12; --error 1277 start slave until master_log_file='master-bin.000001'; --error 1277 start slave until relay_log_file='slave-relay-bin.000002'; ---replace_result 561 MASTER_LOG_POS --error 1277 start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=561; # Warning should be given for second command start slave sql_thread; ---replace_result 740 MASTER_LOG_POS start slave until master_log_file='master-bin.000001', master_log_pos=740; diff --git a/mysql-test/suite/engines/funcs/t/rpl_server_id1.test b/mysql-test/suite/engines/funcs/t/rpl_server_id1.test index 014f38d3544..71310750b60 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_server_id1.test +++ b/mysql-test/suite/engines/funcs/t/rpl_server_id1.test @@ -12,13 +12,10 @@ reset master; stop slave; --replace_result $SLAVE_MYPORT SLAVE_PORT eval change master to master_port=$SLAVE_MYPORT; -source include/check_slave_no_error.inc; - +--replace_result $SLAVE_MYPORT SLAVE_PORT +--replace_column 16 # 18 # +show slave status; start slave; -let $slave_io_errno= 1593; -let $show_slave_io_error= 1; -source include/wait_for_slave_io_error.inc; - insert into t1 values (1); # can't MASTER_POS_WAIT(), it does not work in this weird setup # (when slave is its own master without --replicate-same-server-id) diff --git a/mysql-test/suite/engines/funcs/t/rpl_server_id2.test b/mysql-test/suite/engines/funcs/t/rpl_server_id2.test index 5b8683ecfb1..0f2eb560d18 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_server_id2.test +++ b/mysql-test/suite/engines/funcs/t/rpl_server_id2.test @@ -9,6 +9,9 @@ reset master; stop slave; --replace_result $SLAVE_MYPORT SLAVE_PORT eval change master to master_port=$SLAVE_MYPORT; +--replace_result $SLAVE_MYPORT SLAVE_PORT +--replace_column 18 # +show slave status; start slave; insert into t1 values (1); save_master_pos; diff --git a/mysql-test/suite/engines/funcs/t/rpl_slave_status.test b/mysql-test/suite/engines/funcs/t/rpl_slave_status.test index cc3fbf6abee..b3d6e49e215 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_slave_status.test +++ b/mysql-test/suite/engines/funcs/t/rpl_slave_status.test @@ -22,7 +22,9 @@ drop table if exists t1; --enable_warnings create table t1 (n int); insert into t1 values (1); -sync_slave_with_master; +save_master_pos; +connection slave; +sync_with_master; select * from t1; # 3. Delete new replication user @@ -38,8 +40,12 @@ stop slave; start slave; # 5. Make sure Slave_IO_Running = No -let $slave_io_errno= 1045; -source include/wait_for_slave_io_error.inc; +--replace_result $MASTER_MYPORT MASTER_MYPORT +# Column 1 is replaced, since the output can be either +# "Connecting to master" or "Waiting for master update" +--replace_column 1 # 7 # 8 # 9 # 22 # 23 # 35 # 36 # +--vertical_results +show slave status; # Cleanup (Note that slave IO thread is not running) connection slave; diff --git a/mysql-test/suite/engines/funcs/t/rpl_switch_stm_row_mixed.test b/mysql-test/suite/engines/funcs/t/rpl_switch_stm_row_mixed.test index c9e2ab6b703..b9df07101fb 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_switch_stm_row_mixed.test +++ b/mysql-test/suite/engines/funcs/t/rpl_switch_stm_row_mixed.test @@ -510,7 +510,9 @@ INSERT INTO t12 VALUES(UUID()); UNLOCK TABLES; --disable_result_log -source include/show_binlog_events.inc; +--replace_column 2 # 5 # +--replace_regex /table_id: [0-9]+/table_id: #/ +show binlog events; --enable_result_log sync_slave_with_master; @@ -527,7 +529,9 @@ diff_files $MYSQLTEST_VARDIR/tmp/rpl_switch_stm_row_mixed_master.sql $MYSQLTEST_ connection master; --disable_result_log -source include/show_binlog_events.inc; +--replace_column 2 # 5 # +--replace_regex /table_id: [0-9]+/table_id: #/ +show binlog events; --enable_result_log # Now test that mysqlbinlog works fine on a binlog generated by the diff --git a/mysql-test/suite/engines/funcs/t/rpl_temp_table.test b/mysql-test/suite/engines/funcs/t/rpl_temp_table.test index 9b73961aeea..c13470f20b6 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_temp_table.test +++ b/mysql-test/suite/engines/funcs/t/rpl_temp_table.test @@ -4,18 +4,26 @@ -- source include/have_binlog_format_mixed_or_statement.inc -- source include/master-slave.inc +--disable_query_log +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +--enable_query_log + create table t2 (n int, PRIMARY KEY(n)); create temporary table t1 (n int); create temporary table t3 (n int not null); insert into t1 values(1),(2),(3),(100),(25),(26),(200),(300); +--disable_warnings insert into t2 select * from t1; +--enable_warnings alter table t3 add primary key(n); flush logs; insert into t3 values (1010); +--disable_warnings insert into t2 select * from t3; +--enable_warnings drop table if exists t3; insert into t2 values (1012); @@ -23,7 +31,9 @@ insert into t2 values (1012); connection master1; create temporary table t1 (n int); insert into t1 values (4),(5); +--disable_warnings insert into t2 select * from t1; +--enable_warnings save_master_pos; disconnect master; diff --git a/mysql-test/suite/engines/funcs/t/rpl_temporary.test b/mysql-test/suite/engines/funcs/t/rpl_temporary.test index 1539abeaceb..aa90a5153bf 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_temporary.test +++ b/mysql-test/suite/engines/funcs/t/rpl_temporary.test @@ -18,6 +18,10 @@ sync_with_master; reset master; connection master; +--disable_query_log +CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +--enable_query_log + connect (con1,localhost,root,,); #added on 2007/5/18 @@ -62,7 +66,9 @@ insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); connection con1; create temporary table t3(f int); +--disable_warnings insert into t3 select * from t1 where f<6; +--enable_warnings sleep 1; connection con2; @@ -70,11 +76,15 @@ create temporary table t3(f int); sleep 1; connection con1; +--disable_warnings insert into t2 select count(*) from t3; +--enable_warnings sleep 1; connection con2; +--disable_warnings insert into t3 select * from t1 where f>=4; +--enable_warnings sleep 1; connection con1; @@ -82,7 +92,9 @@ drop temporary table t3; sleep 1; connection con2; +--disable_warnings insert into t2 select count(*) from t3; +--enable_warnings drop temporary table t3; select * from t2 ORDER BY f; @@ -107,22 +119,30 @@ SET @@session.pseudo_thread_id=1; create temporary table t3(f int); SET TIMESTAMP=1040323952; SET @@session.pseudo_thread_id=1; +--disable_warnings insert into t3 select * from t1 where f<6; +--enable_warnings SET TIMESTAMP=1040324145; SET @@session.pseudo_thread_id=2; create temporary table t3(f int); SET TIMESTAMP=1040324186; SET @@session.pseudo_thread_id=1; +--disable_warnings insert into t2 select count(*) from t3; +--enable_warnings SET TIMESTAMP=1040324200; SET @@session.pseudo_thread_id=2; +--disable_warnings insert into t3 select * from t1 where f>=4; +--enable_warnings SET TIMESTAMP=1040324211; SET @@session.pseudo_thread_id=1; drop temporary table t3; SET TIMESTAMP=1040324219; SET @@session.pseudo_thread_id=2; +--disable_warnings insert into t2 select count(*) from t3; +--enable_warnings SET TIMESTAMP=1040324224; SET @@session.pseudo_thread_id=2; drop temporary table t3; @@ -149,7 +169,9 @@ create table t5 (f int); # find dumper's $id select id from information_schema.processlist where command='Binlog Dump' into @id; kill @id; # to stimulate reconnection by slave w/o timeout +--disable_warnings insert into t5 select * from t4; +--enable_warnings save_master_pos; connection slave; diff --git a/mysql-test/suite/engines/funcs/t/rpl_trigger.test b/mysql-test/suite/engines/funcs/t/rpl_trigger.test index 2162c488bfc..77cc7a3b2c0 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_trigger.test +++ b/mysql-test/suite/engines/funcs/t/rpl_trigger.test @@ -6,7 +6,7 @@ --source include/master-slave.inc disable_query_log; -call mtr.add_suppression("Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); enable_query_log; --disable_warnings diff --git a/mysql-test/suite/engines/iuds/r/update_delete_calendar.result b/mysql-test/suite/engines/iuds/r/update_delete_calendar.result index e2dd83e03b4..a04585dfd72 100644 --- a/mysql-test/suite/engines/iuds/r/update_delete_calendar.result +++ b/mysql-test/suite/engines/iuds/r/update_delete_calendar.result @@ -791,6 +791,9 @@ Warning 1292 Truncated incorrect datetime value: '2009-01-10 23:60:59' SELECT count(*) FROM t1 WHERE c2='2001-01-11 23:59:60' /* returns 0 */; count(*) 0 +Warnings: +Warning 1292 Incorrect datetime value: '2001-01-11 23:59:60' for column 'c2' at row 1 +Warning 1292 Incorrect datetime value: '2001-01-11 23:59:60' for column 'c2' at row 1 SELECT * FROM t1 WHERE c1='0000-00-00 00:00:00' OR c2='0000-00-00 00:00:00'; c1 c2 c3 0000-00-00 00:00:00 0000-00-00 00:00:00 6 diff --git a/mysql-test/suite/engines/iuds/r/update_delete_number.result b/mysql-test/suite/engines/iuds/r/update_delete_number.result index 2ff7276f058..8e190870092 100644 --- a/mysql-test/suite/engines/iuds/r/update_delete_number.result +++ b/mysql-test/suite/engines/iuds/r/update_delete_number.result @@ -63,7 +63,7 @@ c1 c2 c3 4294967295 2147483647 9 UPDATE t1 SET c2=-2147483649 WHERE c1=109 ORDER BY c1; Warnings: -Warning 1264 Out of range value for column 'c2' at row 1 +Warning 1264 Out of range value for column 'c2' at row 13 SELECT c1,c2 FROM t1 WHERE c1=109; c1 c2 109 -2147483648 @@ -1158,7 +1158,7 @@ c1 c2 c3 255 127 9 UPDATE t1 SET c2=-129 WHERE c1=109 ORDER BY c1; Warnings: -Warning 1264 Out of range value for column 'c2' at row 1 +Warning 1264 Out of range value for column 'c2' at row 13 SELECT c1,c2 FROM t1 WHERE c1=109; c1 c2 109 -128 @@ -1929,7 +1929,7 @@ c1 c2 c3 65535 32767 9 UPDATE t1 SET c2=-32769 WHERE c1=109 ORDER BY c1; Warnings: -Warning 1264 Out of range value for column 'c2' at row 1 +Warning 1264 Out of range value for column 'c2' at row 13 SELECT c1,c2 FROM t1 WHERE c1=109; c1 c2 109 -32768 @@ -2676,7 +2676,7 @@ c1 c2 c3 16777215 8388607 9 UPDATE t1 SET c2=-8388609 WHERE c1=109 ORDER BY c1; Warnings: -Warning 1264 Out of range value for column 'c2' at row 1 +Warning 1264 Out of range value for column 'c2' at row 13 SELECT c1,c2 FROM t1 WHERE c1=109; c1 c2 109 -8388608 @@ -3423,7 +3423,7 @@ c1 c2 c3 18446744073709551615 9223372036854775807 9 UPDATE t1 SET c2=-9223372036854775809 WHERE c1=109 ORDER BY c1; Warnings: -Warning 1264 Out of range value for column 'c2' at row 1 +Warning 1264 Out of range value for column 'c2' at row 13 SELECT c1,c2 FROM t1 WHERE c1=109; c1 c2 109 -9223372036854775808 diff --git a/mysql-test/suite/engines/iuds/t/disabled.def b/mysql-test/suite/engines/iuds/t/disabled.def index c8fdf80274b..7fd504c0996 100644 --- a/mysql-test/suite/engines/iuds/t/disabled.def +++ b/mysql-test/suite/engines/iuds/t/disabled.def @@ -1,2 +1,3 @@ insert_calendar : Bug#52283 Innodb reports extra warnings when SELECT/WHERE is performed using invalid value update_delete_calendar : Bug#52824 + Bug#52283(in case of Innodb) + diff --git a/mysql-test/suite/engines/iuds/t/insert_number.test b/mysql-test/suite/engines/iuds/t/insert_number.test index b55bd8dc98a..e2c809fad85 100644 --- a/mysql-test/suite/engines/iuds/t/insert_number.test +++ b/mysql-test/suite/engines/iuds/t/insert_number.test @@ -7812,9 +7812,6 @@ SELECT * FROM t2 ORDER BY c1,c6 LIMIT 2; SELECT * FROM t2 ORDER BY c1,c6 DESC LIMIT 2; ## ref type access - -# Bug#52283 : Remove the following --disable_warnings -# command when the bug is fixed --disable_warnings SELECT * FROM t2 WHERE c1 = 18446744073709551616 ORDER BY c1,c6; SELECT * FROM t2 WHERE c1 = 18446744073709551616 ORDER BY c1,c6 LIMIT 2; diff --git a/mysql-test/suite/engines/iuds/t/update_delete_calendar.test b/mysql-test/suite/engines/iuds/t/update_delete_calendar.test index c6a22511766..aa695953ce1 100644 --- a/mysql-test/suite/engines/iuds/t/update_delete_calendar.test +++ b/mysql-test/suite/engines/iuds/t/update_delete_calendar.test @@ -300,12 +300,7 @@ INSERT INTO t1 VALUES('2001-01-09','2001-01-10',6),('2001-01-11','2001-01-12',7) UPDATE t1 SET c1='2001-01-09 24:59:59',c2='2009-01-10 23:60:59' WHERE c1='2001-01-09'; UPDATE t1 SET c2='2001-01-11 23:59:60' WHERE c1='2001-01-11'; SELECT count(*) FROM t1 WHERE c1='2001-01-09 24:59:59' AND c2='2009-01-10 23:60:59'; - -# Bug#52283 : Remove the following --disable_warnings -# command when the bug is fixed ---disable_warnings SELECT count(*) FROM t1 WHERE c2='2001-01-11 23:59:60' /* returns 0 */; ---enable_warnings --sorted_result SELECT * FROM t1 WHERE c1='0000-00-00 00:00:00' OR c2='0000-00-00 00:00:00'; diff --git a/mysql-test/suite/funcs_1/r/myisam_views.result b/mysql-test/suite/funcs_1/r/myisam_views-big.result similarity index 100% rename from mysql-test/suite/funcs_1/r/myisam_views.result rename to mysql-test/suite/funcs_1/r/myisam_views-big.result diff --git a/mysql-test/suite/funcs_1/t/myisam_views.test b/mysql-test/suite/funcs_1/t/myisam_views-big.test similarity index 87% rename from mysql-test/suite/funcs_1/t/myisam_views.test rename to mysql-test/suite/funcs_1/t/myisam_views-big.test index fe72843cfaf..21613e78b24 100644 --- a/mysql-test/suite/funcs_1/t/myisam_views.test +++ b/mysql-test/suite/funcs_1/t/myisam_views-big.test @@ -1,6 +1,9 @@ #### suite/funcs_1/t/myisam_views.test --source include/no_valgrind_without_big.inc +# because of a pair of slow Solaris Sparc machines in pb2, +# this test is marked as big: +--source include/big_test.inc # MyISAM tables should be used # diff --git a/mysql-test/suite/innodb/r/innodb-autoinc-18274.result b/mysql-test/suite/innodb/r/innodb-autoinc-18274.result new file mode 100644 index 00000000000..22afc65a649 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-autoinc-18274.result @@ -0,0 +1,26 @@ +drop table if exists t1; +SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (null); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 +DELETE FROM t1; +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize note Table does not support optimize, doing recreate + analyze instead +test.t1 optimize status OK +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 +INSERT INTO t1 VALUES(null); +SELECT * FROM t1; +c1 +2 +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-timeout.result b/mysql-test/suite/innodb/r/innodb-timeout.result index be9a688cd72..bb71ba5cb3d 100644 --- a/mysql-test/suite/innodb/r/innodb-timeout.result +++ b/mysql-test/suite/innodb/r/innodb-timeout.result @@ -13,13 +13,14 @@ set global innodb_lock_wait_timeout=347; select @@innodb_lock_wait_timeout; @@innodb_lock_wait_timeout 42 -set innodb_lock_wait_timeout=1; +set innodb_lock_wait_timeout=10; select @@innodb_lock_wait_timeout; @@innodb_lock_wait_timeout -1 +10 select @@innodb_lock_wait_timeout; @@innodb_lock_wait_timeout 347 +SET @connection_b_id = ; create table t1(a int primary key)engine=innodb; begin; insert into t1 values(1),(2),(3); @@ -31,8 +32,9 @@ a 3 begin; insert into t1 values(4); +set innodb_lock_wait_timeout=3; select * from t1 for update; commit; ERROR HY000: Lock wait timeout exceeded; try restarting transaction drop table t1; -set global innodb_lock_wait_timeout=50; +set global innodb_lock_wait_timeout=; diff --git a/mysql-test/suite/innodb/r/innodb.result b/mysql-test/suite/innodb/r/innodb.result index 09a2c5b9ef4..3aafd81084e 100644 --- a/mysql-test/suite/innodb/r/innodb.result +++ b/mysql-test/suite/innodb/r/innodb.result @@ -1,5 +1,8 @@ drop table if exists t1,t2,t3,t4; drop database if exists mysqltest; +CREATE TABLE bug58912 (a BLOB, b TEXT, PRIMARY KEY(a(1))) ENGINE=InnoDB; +INSERT INTO bug58912 VALUES(REPEAT('a',8000),REPEAT('b',8000)); +UPDATE bug58912 SET a=REPEAT('a',7999); create table t1 (id int unsigned not null auto_increment, code tinyint unsigned not null, name char(20) not null, primary key (id), key (code), unique (name)) engine=innodb; insert into t1 (code, name) values (1, 'Tim'), (1, 'Monty'), (2, 'David'), (2, 'Erik'), (3, 'Sasha'), (3, 'Jeremy'), (4, 'Matt'); select id, code, name from t1 order by id; @@ -1670,10 +1673,10 @@ variable_value - @innodb_rows_deleted_orig 71 SELECT variable_value - @innodb_rows_inserted_orig FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_rows_inserted'; variable_value - @innodb_rows_inserted_orig -1065 +1066 SELECT variable_value - @innodb_rows_updated_orig FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_rows_updated'; variable_value - @innodb_rows_updated_orig -865 +866 SELECT variable_value - @innodb_row_lock_waits_orig FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_row_lock_waits'; variable_value - @innodb_row_lock_waits_orig 0 @@ -3173,3 +3176,4 @@ Variable_name Value Handler_update 1 Variable_name Value Handler_delete 1 +DROP TABLE bug58912; diff --git a/mysql-test/suite/innodb/r/innodb_bug57904.result b/mysql-test/suite/innodb/r/innodb_bug57904.result index 84868dcf46b..d265adc385f 100755 --- a/mysql-test/suite/innodb/r/innodb_bug57904.result +++ b/mysql-test/suite/innodb/r/innodb_bug57904.result @@ -1,16 +1,16 @@ -CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, +CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB; CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; -CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, -product_category INT NOT NULL, -product_id INT NOT NULL, -customer_id INT NOT NULL, -PRIMARY KEY(no), -INDEX (product_category, product_id), -FOREIGN KEY (product_category, product_id) -REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, -INDEX (customer_id), -FOREIGN KEY (customer_id) +CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, +product_category INT NOT NULL, +product_id INT NOT NULL, +customer_id INT NOT NULL, +PRIMARY KEY(no), +INDEX (product_category, product_id), +FOREIGN KEY (product_category, product_id) +REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, +INDEX (customer_id), +FOREIGN KEY (customer_id) REFERENCES customer(id) ) ENGINE=INNODB; SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS; diff --git a/mysql-test/suite/innodb/t/innodb-autoinc-18274.test b/mysql-test/suite/innodb/t/innodb-autoinc-18274.test new file mode 100644 index 00000000000..de9f3e3d18b --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-autoinc-18274.test @@ -0,0 +1,26 @@ +-- source include/have_innodb.inc +# embedded server ignores 'delayed', so skip this +-- source include/not_embedded.inc + +--disable_warnings +drop table if exists t1; +--enable_warnings + +# +# Bug #18274 InnoDB auto_increment field reset on OPTIMIZE TABLE +SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1; +CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (null); +SHOW CREATE TABLE t1; +DELETE FROM t1; +OPTIMIZE TABLE t1; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES(null); +SELECT * FROM t1; +DROP TABLE t1; + +# +# restore environment to the state it was before this test execution +# + +-- disable_query_log diff --git a/mysql-test/suite/innodb/t/innodb-timeout.test b/mysql-test/suite/innodb/t/innodb-timeout.test index f23fe3cff2d..b29aec8e83d 100644 --- a/mysql-test/suite/innodb/t/innodb-timeout.test +++ b/mysql-test/suite/innodb/t/innodb-timeout.test @@ -1,6 +1,6 @@ -- source include/have_innodb.inc -let $timeout=`select @@innodb_lock_wait_timeout`; +let $initial_timeout=`select @@innodb_lock_wait_timeout`; set global innodb_lock_wait_timeout=42; connect (a,localhost,root,,); @@ -12,19 +12,24 @@ set innodb_lock_wait_timeout=1; select @@innodb_lock_wait_timeout; connection b; +let $connection_b_id=`SELECT CONNECTION_ID()`; select @@innodb_lock_wait_timeout; set global innodb_lock_wait_timeout=347; select @@innodb_lock_wait_timeout; -set innodb_lock_wait_timeout=1; +set innodb_lock_wait_timeout=10; select @@innodb_lock_wait_timeout; connect (c,localhost,root,,); connection c; + select @@innodb_lock_wait_timeout; -connection default; + disconnect c; +--source include/wait_until_disconnected.inc connection a; +--replace_result $connection_b_id +eval SET @connection_b_id = $connection_b_id; create table t1(a int primary key)engine=innodb; begin; insert into t1 values(1),(2),(3); @@ -33,7 +38,37 @@ connection b; --send select * from t1 for update; +# Observation on information_schema.processlist (2010-12 mysql-5.5) +# ----------------------------------------------------------------- +# As soon as the server started the execution of the +# connection a: --send select ... for update +# High parallel load could delay this up to two seconds. +# and before either +# - the innodb_lock_wait_timeout was exceeded +# -> connection b reap gets ER_LOCK_WAIT_TIMEOUT +# or +# - connection a commits, the lock disappears and the statement +# of connection b finishes +# -> connection b reap gets success + result set +# we see within information_schema.processlist for connection b a row +# command state info +# Query Sending data select * from t1 for update +# The highest time value seen was @@innodb_lock_wait_timeout + 1. +# Please note that there is unfortunately nothing which says +# that we are just waiting for a lock. + connection a; +# In order to ensure that the execution of +# connection b: select * from t1 for update +# has really started and is most probably waiting for the lock now we poll on +# information_schema.processlist. +# Also our current session innodb_lock_wait_timeout of 10 seconds should big +# enough to prevent that connection b ends up with getting ER_LOCK_WAIT_TIMEOUT. +# +let $wait_timeout= 10; +let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist +WHERE id = @connection_b_id AND INFO = 'select * from t1 for update'; +--source include/wait_condition.inc commit; connection b; @@ -44,21 +79,39 @@ begin; insert into t1 values(4); connection b; +set innodb_lock_wait_timeout=3; +# 3 seconds should be big enough that the wait routine of connection a will +# hit the time span where our next statement is visible within the +# information_schema.processlist. --send select * from t1 for update; connection a; -sleep 2; +# Wait till the execution of the connection b statement was started. +let $wait_timeout= 10; +let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist +WHERE id = @connection_b_id AND INFO = 'select * from t1 for update'; +--source include/wait_condition.inc +# Wait till the execution of the connection b statement has ended. +let $wait_timeout= 10; +let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist +WHERE id = @connection_b_id AND INFO IS NULL; +--source include/wait_condition.inc +# Give "commit" though this must be too late for the statement of connection b. commit; connection b; --error ER_LOCK_WAIT_TIMEOUT reap; -drop table t1; + +disconnect b; +--source include/wait_until_disconnected.inc + +connection a; +disconnect a; +--source include/wait_until_disconnected.inc connection default; - -disconnect a; -disconnect b; - -eval set global innodb_lock_wait_timeout=$timeout; +drop table t1; +--replace_result $initial_timeout +eval set global innodb_lock_wait_timeout=$initial_timeout; diff --git a/mysql-test/suite/innodb/t/innodb.test b/mysql-test/suite/innodb/t/innodb.test index 8c24457e07c..69876297797 100644 --- a/mysql-test/suite/innodb/t/innodb.test +++ b/mysql-test/suite/innodb/t/innodb.test @@ -49,6 +49,15 @@ drop table if exists t1,t2,t3,t4; drop database if exists mysqltest; --enable_warnings +# Bug#58912 InnoDB unnecessarily avoids update-in-place on column prefixes +CREATE TABLE bug58912 (a BLOB, b TEXT, PRIMARY KEY(a(1))) ENGINE=InnoDB; +INSERT INTO bug58912 VALUES(REPEAT('a',8000),REPEAT('b',8000)); +UPDATE bug58912 SET a=REPEAT('a',7999); +# The above statements used to trigger a failure during purge when +# Bug#55284 was fixed while Bug#58912 was not. Defer the DROP TABLE, +# so that purge gets a chance to run (and a double free of the +# off-page column can be detected, if one is to occur.) + # # Small basic test with ignore # @@ -2548,6 +2557,9 @@ SET GLOBAL innodb_thread_concurrency = @innodb_thread_concurrency_orig; -- enable_query_log +# Clean up after the Bug#55284/Bug#58912 test case. +DROP TABLE bug58912; + ####################################################################### # # # Please, DO NOT TOUCH this file as well as the innodb.result file. # diff --git a/mysql-test/suite/innodb/t/innodb_bug57255.test b/mysql-test/suite/innodb/t/innodb_bug57255.test index 2b37a0a6092..0bf686578b2 100644 --- a/mysql-test/suite/innodb/t/innodb_bug57255.test +++ b/mysql-test/suite/innodb/t/innodb_bug57255.test @@ -12,6 +12,7 @@ create table C(id int not null auto_increment primary key, f1 int not null, fore insert into A values(1), (2); --disable_query_log +begin; let $i=257; while ($i) { @@ -24,6 +25,7 @@ while ($i) insert into C(f1) values(2); dec $i; } +commit; --enable_query_log # Following Deletes should not report error diff --git a/mysql-test/suite/innodb/t/innodb_bug57904.test b/mysql-test/suite/innodb/t/innodb_bug57904.test index d283ad11c3a..1131e24844d 100755 --- a/mysql-test/suite/innodb/t/innodb_bug57904.test +++ b/mysql-test/suite/innodb/t/innodb_bug57904.test @@ -3,19 +3,19 @@ # -- source include/have_innodb.inc -CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, +CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB; CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB; -CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, - product_category INT NOT NULL, - product_id INT NOT NULL, - customer_id INT NOT NULL, - PRIMARY KEY(no), - INDEX (product_category, product_id), - FOREIGN KEY (product_category, product_id) - REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, - INDEX (customer_id), - FOREIGN KEY (customer_id) +CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, + product_category INT NOT NULL, + product_id INT NOT NULL, + customer_id INT NOT NULL, + PRIMARY KEY(no), + INDEX (product_category, product_id), + FOREIGN KEY (product_category, product_id) + REFERENCES product(category, id) ON UPDATE CASCADE ON DELETE RESTRICT, + INDEX (customer_id), + FOREIGN KEY (customer_id) REFERENCES customer(id) ) ENGINE=INNODB; diff --git a/mysql-test/suite/parts/r/partition_auto_increment_innodb.result b/mysql-test/suite/parts/r/partition_auto_increment_innodb.result index 5fd576322d5..34e47f58272 100644 --- a/mysql-test/suite/parts/r/partition_auto_increment_innodb.result +++ b/mysql-test/suite/parts/r/partition_auto_increment_innodb.result @@ -134,7 +134,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 +) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 DROP TABLE t1; CREATE TABLE t1 (a INT NULL AUTO_INCREMENT, @@ -440,7 +440,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `c1` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`c1`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 +) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=latin1 /*!50100 PARTITION BY HASH (c1) PARTITIONS 2 */ DROP TABLE t1; diff --git a/mysql-test/suite/perfschema/include/binlog_common.inc b/mysql-test/suite/perfschema/include/binlog_common.inc index 96c01d9a4c8..bbe09de3e19 100644 --- a/mysql-test/suite/perfschema/include/binlog_common.inc +++ b/mysql-test/suite/perfschema/include/binlog_common.inc @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Sun Microsystems, Inc +# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. # # 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 @@ -10,8 +10,8 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA # Tests for PERFORMANCE_SCHEMA @@ -19,8 +19,13 @@ RESET MASTER; select count(*) > 0 from performance_schema.setup_instruments; +# Note: +# Do not include records that could depend on +# compiling options (storage engines, SSL), +# to ensure the expected output in the binlog is predictable. update performance_schema.setup_instruments set enabled='NO' - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); select count(*) > 0 from performance_schema.events_waits_current; @@ -37,13 +42,15 @@ insert into test.t1 insert into test.t2 select name from performance_schema.setup_instruments - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); drop table test.t1; drop table test.t2; update performance_schema.setup_instruments set enabled='YES' - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); --source include/show_binlog_events.inc diff --git a/mysql-test/suite/perfschema/r/binlog_mix.result b/mysql-test/suite/perfschema/r/binlog_mix.result index b31b853b06d..3b2ab2bb435 100644 --- a/mysql-test/suite/perfschema/r/binlog_mix.result +++ b/mysql-test/suite/perfschema/r/binlog_mix.result @@ -4,7 +4,8 @@ select count(*) > 0 from performance_schema.setup_instruments; count(*) > 0 1 update performance_schema.setup_instruments set enabled='NO' - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); select count(*) > 0 from performance_schema.events_waits_current; count(*) > 0 1 @@ -16,16 +17,17 @@ insert into test.t1 select thread_id from performance_schema.events_waits_current; insert into test.t2 select name from performance_schema.setup_instruments -where name like "wait/synch/rwlock/%"; +where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); drop table test.t1; drop table test.t2; update performance_schema.setup_instruments set enabled='YES' - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); show binlog events from ; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Query # # BEGIN master-bin.000001 # Table_map # # table_id: # (performance_schema.setup_instruments) -master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `t1` /* generated by server */ @@ -44,6 +46,5 @@ master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server master-bin.000001 # Query # # use `test`; DROP TABLE `t2` /* generated by server */ master-bin.000001 # Query # # BEGIN master-bin.000001 # Table_map # # table_id: # (performance_schema.setup_instruments) -master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Query # # COMMIT diff --git a/mysql-test/suite/perfschema/r/binlog_row.result b/mysql-test/suite/perfschema/r/binlog_row.result index 010f2de06e6..644e5d58e23 100644 --- a/mysql-test/suite/perfschema/r/binlog_row.result +++ b/mysql-test/suite/perfschema/r/binlog_row.result @@ -4,7 +4,8 @@ select count(*) > 0 from performance_schema.setup_instruments; count(*) > 0 1 update performance_schema.setup_instruments set enabled='NO' - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); select count(*) > 0 from performance_schema.events_waits_current; count(*) > 0 1 @@ -16,16 +17,17 @@ insert into test.t1 select thread_id from performance_schema.events_waits_current; insert into test.t2 select name from performance_schema.setup_instruments -where name like "wait/synch/rwlock/%"; +where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); drop table test.t1; drop table test.t2; update performance_schema.setup_instruments set enabled='YES' - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); show binlog events from ; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Query # # BEGIN master-bin.000001 # Table_map # # table_id: # (performance_schema.setup_instruments) -master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `t1` /* generated by server */ @@ -44,6 +46,5 @@ master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server master-bin.000001 # Query # # use `test`; DROP TABLE `t2` /* generated by server */ master-bin.000001 # Query # # BEGIN master-bin.000001 # Table_map # # table_id: # (performance_schema.setup_instruments) -master-bin.000001 # Update_rows # # table_id: # master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F master-bin.000001 # Query # # COMMIT diff --git a/mysql-test/suite/perfschema/r/binlog_stmt.result b/mysql-test/suite/perfschema/r/binlog_stmt.result index 60054ee8a74..3fcecfdd1ca 100644 --- a/mysql-test/suite/perfschema/r/binlog_stmt.result +++ b/mysql-test/suite/perfschema/r/binlog_stmt.result @@ -5,7 +5,8 @@ select count(*) > 0 from performance_schema.setup_instruments; count(*) > 0 1 update performance_schema.setup_instruments set enabled='NO' - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses the general log, slow query log, or performance_schema table(s). This is unsafe because system tables may differ on slaves. select count(*) > 0 from performance_schema.events_waits_current; @@ -21,20 +22,23 @@ Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses the general log, slow query log, or performance_schema table(s). This is unsafe because system tables may differ on slaves. insert into test.t2 select name from performance_schema.setup_instruments -where name like "wait/synch/rwlock/%"; +where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses the general log, slow query log, or performance_schema table(s). This is unsafe because system tables may differ on slaves. drop table test.t1; drop table test.t2; update performance_schema.setup_instruments set enabled='YES' - where name like "wait/synch/rwlock/%"; + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock"); Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses the general log, slow query log, or performance_schema table(s). This is unsafe because system tables may differ on slaves. show binlog events from ; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # use `test`; update performance_schema.setup_instruments set enabled='NO' - where name like "wait/synch/rwlock/%" + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock") master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `t1` /* generated by server */ master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `t2` /* generated by server */ @@ -47,11 +51,13 @@ master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # use `test`; insert into test.t2 select name from performance_schema.setup_instruments -where name like "wait/synch/rwlock/%" +where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock") master-bin.000001 # Query # # COMMIT master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ master-bin.000001 # Query # # use `test`; DROP TABLE `t2` /* generated by server */ master-bin.000001 # Query # # BEGIN master-bin.000001 # Query # # use `test`; update performance_schema.setup_instruments set enabled='YES' - where name like "wait/synch/rwlock/%" + where name like "wait/synch/rwlock/sql/%" + and name not in ("wait/synch/rwlock/sql/CRYPTO_dynlock_value::lock") master-bin.000001 # Query # # COMMIT diff --git a/mysql-test/suite/perfschema/t/binlog_mix.test b/mysql-test/suite/perfschema/t/binlog_mix.test index 4fe7d68b555..5e2c65d6fe4 100644 --- a/mysql-test/suite/perfschema/t/binlog_mix.test +++ b/mysql-test/suite/perfschema/t/binlog_mix.test @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Sun Microsystems, Inc +# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. # # 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 @@ -10,8 +10,8 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA # Tests for PERFORMANCE_SCHEMA @@ -19,9 +19,6 @@ --source include/not_embedded.inc --source include/have_perfschema.inc -# See Bug#46896 binlog: case sensitivity of table names ---source include/have_lowercase0.inc - set binlog_format=mixed; --source ../include/binlog_common.inc diff --git a/mysql-test/suite/perfschema/t/binlog_row.test b/mysql-test/suite/perfschema/t/binlog_row.test index c1c1e06d3f0..d09baaa3011 100644 --- a/mysql-test/suite/perfschema/t/binlog_row.test +++ b/mysql-test/suite/perfschema/t/binlog_row.test @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Sun Microsystems, Inc +# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. # # 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 @@ -10,8 +10,8 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA # Tests for PERFORMANCE_SCHEMA @@ -19,9 +19,6 @@ --source include/not_embedded.inc --source include/have_perfschema.inc -# See Bug#46896 binlog: case sensitivity of table names ---source include/have_lowercase0.inc - set binlog_format=row; --source ../include/binlog_common.inc diff --git a/mysql-test/suite/perfschema/t/binlog_stmt.test b/mysql-test/suite/perfschema/t/binlog_stmt.test index a0fbc5ef335..46418d5703f 100644 --- a/mysql-test/suite/perfschema/t/binlog_stmt.test +++ b/mysql-test/suite/perfschema/t/binlog_stmt.test @@ -1,4 +1,4 @@ -# Copyright (C) 2009 Sun Microsystems, Inc +# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. # # 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 @@ -10,8 +10,8 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# along with this program; if not, write to the Free Software Foundation, +# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA # Tests for PERFORMANCE_SCHEMA diff --git a/mysql-test/suite/rpl/t/disabled.def b/mysql-test/suite/rpl/t/disabled.def index 347b0dff70a..f4806bdba1e 100644 --- a/mysql-test/suite/rpl/t/disabled.def +++ b/mysql-test/suite/rpl/t/disabled.def @@ -15,3 +15,4 @@ rpl_read_only : WL#4284: Setting Read only won't succeed until all m rpl_row_create_table : Bug#51574 2010-02-27 andrei failed different way than earlier with bug#45576 rpl_spec_variables : BUG#47661 2009-10-27 jasonh rpl_spec_variables fails on PB2 hpux rpl_log_pos : BUG#55675 2010-09-10 alfranio rpl.rpl_log_pos fails sporadically with error binlog truncated in the middle +rpl_get_master_version_and_clock : Bug#59178 Jan 05 2011 joro Valgrind warnings rpl_get_master_version_and_clock diff --git a/mysql-test/t/auto_increment.test b/mysql-test/t/auto_increment.test index 9da8c759d45..2854f503034 100644 --- a/mysql-test/t/auto_increment.test +++ b/mysql-test/t/auto_increment.test @@ -363,3 +363,20 @@ SET @@SESSION.AUTO_INCREMENT_OFFSET=default; DROP TABLE t1; --echo End of 5.1 tests + +--echo # +--echo # Bug#50619 assert in handler::update_auto_increment +--echo # + +CREATE TABLE t1 (pk INT AUTO_INCREMENT, PRIMARY KEY (pk)); +# This triggered the assert +INSERT INTO t1 VALUES (NULL), (-1), (NULL); +SELECT * FROM t1; +DROP TABLE t1; + +# Check that that true overflow still gives error +CREATE TABLE t1 (pk BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY (pk)); +--error ER_AUTOINC_READ_FAILED +INSERT INTO t1 VALUES (NULL), (18446744073709551615-1), (NULL); +SELECT * FROM t1; +DROP TABLE t1; diff --git a/mysql-test/t/lowercase_table4.test b/mysql-test/t/lowercase_table4.test index 93956047145..783a4fcae51 100755 --- a/mysql-test/t/lowercase_table4.test +++ b/mysql-test/t/lowercase_table4.test @@ -53,4 +53,56 @@ eval SELECT * FROM XY.T_$tcs LIMIT 1; --enable_query_log --enable_result_log DROP DATABASE XY; +USE TEST; + +--echo # +--echo # Bug55222 Mysqldump table names case bug in REFERENCES clause +--echo # InnoDB did not handle lower_case_table_names=2 for +--echo # foreign_table_names and referenced_table_names. +--echo # + +SHOW VARIABLES LIKE 'lower_case_table_names'; + +--disable_warnings +DROP TABLE IF EXISTS `Table2`; +DROP TABLE IF EXISTS `Table1`; +--disable_warnings + +CREATE TABLE `Table1`(c1 INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE `Table2`(c1 INT PRIMARY KEY, c2 INT) ENGINE=InnoDB; +ALTER TABLE `Table2` ADD CONSTRAINT fk1 FOREIGN KEY(c2) REFERENCES `Table1`(c1); +query_vertical SHOW CREATE TABLE `Table2`; +query_vertical SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS; +DROP TABLE `Table2`; +DROP TABLE `Table1`; + +--disable_warnings +DROP TABLE IF EXISTS Product_Order; +DROP TABLE IF EXISTS Product; +DROP TABLE IF EXISTS Customer; +--enable_warnings + +CREATE TABLE Product (Category INT NOT NULL, Id INT NOT NULL, + Price DECIMAL, PRIMARY KEY(Category, Id)) ENGINE=InnoDB; +CREATE TABLE Customer (Id INT NOT NULL, PRIMARY KEY (Id)) ENGINE=InnoDB; +CREATE TABLE Product_Order (No INT NOT NULL AUTO_INCREMENT, + Product_Category INT NOT NULL, + Product_Id INT NOT NULL, + Customer_Id INT NOT NULL, + PRIMARY KEY(No), + INDEX (Product_Category, Product_Id), + FOREIGN KEY (Product_Category, Product_Id) + REFERENCES Product(Category, Id) ON UPDATE CASCADE ON DELETE RESTRICT, + INDEX (Customer_Id), + FOREIGN KEY (Customer_Id) + REFERENCES Customer(Id) + ) ENGINE=INNODB; + +query_vertical SHOW CREATE TABLE Product_Order; +query_vertical SHOW CREATE TABLE Product; +query_vertical SHOW CREATE TABLE Customer; +query_vertical SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS; +DROP TABLE Product_Order; +DROP TABLE Product; +DROP TABLE Customer; diff --git a/mysql-test/t/not_embedded_server.test b/mysql-test/t/not_embedded_server.test index 3fea1f630e0..c1dbba82292 100644 --- a/mysql-test/t/not_embedded_server.test +++ b/mysql-test/t/not_embedded_server.test @@ -4,31 +4,7 @@ -- source include/not_embedded.inc -# The following fails sporadically because 'check-testcase' runs -# queries before this test and there is no way to guarantee that any -# previous process finishes. The purpose of the test is not clearly -# stated, there is no reference to any bug report, and "select from -# I_S from prepared statement" doesn't look like something that's -# really imporant to test. I'm commenting out this for now. If -# anyone wants to keep this, please fix the race and motivate why we -# need to test this. If you see this comment and it is after mid-2009 -# or so, feel free to remove this test from the file. /Sven -# -# -## Show full process list with prepare -## To not show other connections, this must be the first test and we must -## have a server restart before this one -## -## We don't have any 4.1 tests as we use I_S to query the PROCESSLIST to -## exclude system threads that may/may not be active in the server -## (namely the ndb injector thread) -## -## End of 4.1 tests -# -#prepare stmt1 from ' SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND!=\'Daemon\' '; -#--replace_column 1 number 6 time 3 localhost -#execute stmt1; -#deallocate prepare stmt1; +# End of 4.1 tests call mtr.add_suppression("Can't open and lock privilege tables: Table 'host' was not locked with LOCK TABLES"); @@ -46,14 +22,14 @@ SHOW VARIABLES like 'slave_skip_errors'; --echo # FLUSH PRIVILEGES should not implicitly unlock locked tables. --echo # --disable_warnings -drop table if exists t1; +DROP TABLE IF EXISTS t1; --enable_warnings -create table t1 (c1 int); -lock tables t1 read; +CREATE TABLE t1 (c1 INT); +LOCK TABLES t1 READ; --error ER_TABLE_NOT_LOCKED -flush privileges; -unlock tables; -drop table t1; +FLUSH PRIVILEGES; +UNLOCK TABLES; +DROP TABLE t1; --echo # --echo # Bug#54812: assert in Diagnostics_area::set_ok_status during EXPLAIN @@ -83,8 +59,18 @@ connect (con1,localhost,nopriv_user,,); connection con1; --echo connection: con1 +let outfile=$MYSQLTEST_VARDIR/tmp/mytest; +--error 0,1 +--remove_file $outfile +--replace_result $outfile --error ER_PROCACCESS_DENIED_ERROR -SELECT MAX(key1) FROM t1 WHERE f() < 1 INTO OUTFILE 'mytest'; +eval SELECT MAX(key1) FROM t1 WHERE f() < 1 INTO OUTFILE '$outfile'; +# A removal of the outfile is necessary, at least today (2010-12-07), because +# the outfile is created even if the SELECT statement fails. +# If the server is improved in the future this may not happen. +# ==> Do not fail if the outfile does not exist. +--error 0,1 +--remove_file $outfile --error ER_PROCACCESS_DENIED_ERROR INSERT INTO t2 SELECT MAX(key1) FROM t1 WHERE f() < 1; diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index fc3cfc76939..32b1f6bbc90 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -5,9 +5,6 @@ # depends on the presence of the log tables (which are CSV-based). --source include/have_csv.inc -# Save the initial number of concurrent sessions ---source include/count_sessions.inc - # # Test of some show commands # @@ -53,7 +50,7 @@ optimize table t1; optimize table t1; drop table t1; -#show variables; +# show variables; --echo -- Here we enable metadata just to check that the collation of the --echo -- resultset is non-binary for string type. This should be changed @@ -332,6 +329,7 @@ drop table t1; --error ER_DBACCESS_DENIED_ERROR drop database mysqltest; disconnect con1; +--source include/wait_until_disconnected.inc connect (con2,localhost,mysqltest_2,,test); connection con2; @@ -344,6 +342,7 @@ drop table mysqltest.t1; --error ER_DBACCESS_DENIED_ERROR drop database mysqltest; disconnect con2; +--source include/wait_until_disconnected.inc connect (con3,localhost,mysqltest_3,,test); connection con3; @@ -353,6 +352,7 @@ show create database mysqltest; drop table mysqltest.t1; drop database mysqltest; disconnect con3; +--source include/wait_until_disconnected.inc connection default; set names binary; @@ -900,10 +900,12 @@ CREATE TABLE t1( --let $outfile1=$MYSQLTEST_VARDIR/tmp/show_check.mysqltest1.sql +--source include/count_sessions.inc --echo --echo ---> Dumping mysqltest1 to outfile1 - --exec $MYSQL_DUMP --default-character-set=latin1 --character-sets-dir=$MYSQL_SHAREDIR/charsets --databases mysqltest1 > $outfile1 +# Take care that the additional session caused by MYSQL_DUMP has disappeared. +--source include/wait_until_count_sessions.inc # - Clean mysqltest1; @@ -917,9 +919,12 @@ DROP DATABASE mysqltest1; --echo --echo +--source include/count_sessions.inc --echo ---> Restoring mysqltest1... --exec $MYSQL test < $outfile1 --remove_file $outfile1 +# Take care that the additional session caused by MYSQL has disappeared. +--source include/wait_until_count_sessions.inc # - Check definition of the table. @@ -989,14 +994,14 @@ grant select on `mysqltest`.`t1` to mysqltest_4@localhost; connect (con4,localhost,mysqltest_4,,mysqltest); connection con4; show create database mysqltest; +disconnect con4; +--source include/wait_until_disconnected.inc connection default; delete from mysql.user where user='mysqltest_4'; delete from mysql.db where user='mysqltest_4'; delete from mysql.tables_priv where user='mysqltest_4'; flush privileges; drop database mysqltest; -connection default; -disconnect con4; # # Ensure that show plugin code is tested @@ -1192,6 +1197,7 @@ SHOW ENGINE MYISAM STATUS; --enable_result_log disconnect conn1; +--source include/wait_until_disconnected.inc connection default; DROP USER test_u@localhost; @@ -1214,8 +1220,9 @@ CONNECTION con1; --error ER_QUERY_INTERRUPTED SHOW CREATE TABLE non_existent; -CONNECTION default; DISCONNECT con1; +--source include/wait_until_disconnected.inc +CONNECTION default; --echo End of 5.1 tests @@ -1239,9 +1246,11 @@ connection con1; --echo # This statement used to be blocked. SHOW CREATE TABLE t1; +disconnect con1; +--source include/wait_until_disconnected.inc + --echo # Switching to connection 'default'. connection default; -disconnect con1; UNLOCK TABLES; DROP TABLE t1; @@ -1317,17 +1326,16 @@ connection con1; # Should not block. ALTER TABLE t1 CHARACTER SET = utf8; +disconnect con1; +--source include/wait_until_disconnected.inc + --echo # Connection default connection default; COMMIT; DROP TRIGGER t1_bi; DROP TABLE t1; -disconnect con1; -# Wait till all disconnects are completed ---source include/wait_until_count_sessions.inc - --echo # --echo # Bug#57306 SHOW PROCESSLIST does not display string literals well. --echo # @@ -1352,6 +1360,7 @@ SELECT RELEASE_LOCK('t'); --connection con1 --reap --disconnect con1 +--source include/wait_until_disconnected.inc --connection default SET NAMES latin1; diff --git a/mysys/my_fopen.c b/mysys/my_fopen.c index 861e4380690..e184c8308fc 100644 --- a/mysys/my_fopen.c +++ b/mysys/my_fopen.c @@ -18,6 +18,10 @@ #include #include "mysys_err.h" +#if defined(__FreeBSD__) +extern int getosreldate(void); +#endif + static void make_ftype(char * to,int flag); /* @@ -89,7 +93,135 @@ FILE *my_fopen(const char *filename, int flags, myf MyFlags) } /* my_fopen */ - /* Close a stream */ +#if defined(_WIN32) + +static FILE *my_win_freopen(const char *path, const char *mode, FILE *stream) +{ + int handle_fd, fd= _fileno(stream); + HANDLE osfh; + + DBUG_ASSERT(path && stream); + + /* Services don't have stdout/stderr on Windows, so _fileno returns -1. */ + if (fd < 0) + { + if (!freopen(path, mode, stream)) + return NULL; + + fd= _fileno(stream); + } + + if ((osfh= CreateFile(path, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE | + FILE_SHARE_DELETE, NULL, + OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, + NULL)) == INVALID_HANDLE_VALUE) + return NULL; + + if ((handle_fd= _open_osfhandle((intptr_t)osfh, + _O_APPEND | _O_TEXT)) == -1) + { + CloseHandle(osfh); + return NULL; + } + + if (_dup2(handle_fd, fd) < 0) + { + CloseHandle(osfh); + return NULL; + } + + _close(handle_fd); + + return stream; +} + +#elif defined(__FreeBSD__) + +/* No close operation hook. */ + +static int no_close(void *cookie __attribute__((unused))) +{ + return 0; +} + +/* + A hack around a race condition in the implementation of freopen. + + The race condition steams from the fact that the current fd of + the stream is closed before its number is used to duplicate the + new file descriptor. This defeats the desired atomicity of the + close and duplicate of dup2(). + + See PR number 79887 for reference: + http://www.freebsd.org/cgi/query-pr.cgi?pr=79887 +*/ + +static FILE *my_freebsd_freopen(const char *path, const char *mode, FILE *stream) +{ + int old_fd; + FILE *result; + + flockfile(stream); + + old_fd= fileno(stream); + + /* Use a no operation close hook to avoid having the fd closed. */ + stream->_close= no_close; + + /* Relies on the implicit dup2 to close old_fd. */ + result= freopen(path, mode, stream); + + /* If successful, the _close hook was replaced. */ + + if (result == NULL) + close(old_fd); + else + funlockfile(result); + + return result; +} + +#endif + + +/** + Change the file associated with a file stream. + + @param path Path to file. + @param mode Mode of the stream. + @param stream File stream. + + @note + This function is used to redirect stdout and stderr to a file and + subsequently to close and reopen that file for log rotation. + + @retval A FILE pointer on success. Otherwise, NULL. +*/ + +FILE *my_freopen(const char *path, const char *mode, FILE *stream) +{ + FILE *result; + +#if defined(_WIN32) + result= my_win_freopen(path, mode, stream); +#elif defined(__FreeBSD__) + /* + XXX: Once the fix is ported to the stable releases, this should + be dependent upon the specific FreeBSD versions. Check at: + http://www.freebsd.org/cgi/query-pr.cgi?pr=79887 + */ + if (getosreldate() > 900027) + result= freopen(path, mode, stream); + else + result= my_freebsd_freopen(path, mode, stream); +#else + result= freopen(path, mode, stream); +#endif + + return result; +} + /* Close a stream */ int my_fclose(FILE *fd, myf MyFlags) diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 1bec2d7b082..4c75ae39755 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -132,7 +132,7 @@ IF(NOT WITHOUT_DYNAMIC_PLUGINS) ENDIF() SET_TARGET_PROPERTIES(mysqld PROPERTIES ENABLE_EXPORTS TRUE) -TARGET_LINK_LIBRARIES(mysqld sql) +TARGET_LINK_LIBRARIES(mysqld sql mysys) # Provide plugins with minimal set of libraries SET(INTERFACE_LIBS ${LIBRT}) diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 4e0fb7c804a..f717870915f 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -5172,6 +5172,8 @@ int ha_partition::handle_ordered_prev(uchar *buf) int ha_partition::info(uint flag) { + uint no_lock_flag= flag & HA_STATUS_NO_LOCK; + uint extra_var_flag= flag & HA_STATUS_VARIABLE_EXTRA; DBUG_ENTER("ha_partition::info"); if (flag & HA_STATUS_AUTO) @@ -5203,7 +5205,7 @@ int ha_partition::info(uint flag) do { file= *file_array; - file->info(HA_STATUS_AUTO); + file->info(HA_STATUS_AUTO | no_lock_flag); set_if_bigger(auto_increment_value, file->stats.auto_increment_value); } while (*(++file_array)); @@ -5257,7 +5259,7 @@ int ha_partition::info(uint flag) if (bitmap_is_set(&(m_part_info->used_partitions), (file_array - m_file))) { file= *file_array; - file->info(HA_STATUS_VARIABLE); + file->info(HA_STATUS_VARIABLE | no_lock_flag | extra_var_flag); stats.records+= file->stats.records; stats.deleted+= file->stats.deleted; stats.data_file_length+= file->stats.data_file_length; @@ -5339,7 +5341,7 @@ int ha_partition::info(uint flag) if (!(flag & HA_STATUS_VARIABLE) || !bitmap_is_set(&(m_part_info->used_partitions), (file_array - m_file))) - file->info(HA_STATUS_VARIABLE); + file->info(HA_STATUS_VARIABLE | no_lock_flag | extra_var_flag); if (file->stats.records > max_records) { max_records= file->stats.records; @@ -5349,7 +5351,7 @@ int ha_partition::info(uint flag) } while (*(++file_array)); file= m_file[handler_instance]; - file->info(HA_STATUS_CONST); + file->info(HA_STATUS_CONST | no_lock_flag); stats.block_size= file->stats.block_size; stats.create_time= file->stats.create_time; ref_length= m_ref_length; @@ -5365,7 +5367,7 @@ int ha_partition::info(uint flag) Note: all engines does not support HA_STATUS_ERRKEY, so set errkey. */ file->errkey= errkey; - file->info(HA_STATUS_ERRKEY); + file->info(HA_STATUS_ERRKEY | no_lock_flag); errkey= file->errkey; } if (flag & HA_STATUS_TIME) @@ -5382,7 +5384,7 @@ int ha_partition::info(uint flag) do { file= *file_array; - file->info(HA_STATUS_TIME); + file->info(HA_STATUS_TIME | no_lock_flag); if (file->stats.update_time > stats.update_time) stats.update_time= file->stats.update_time; } while (*(++file_array)); @@ -5396,7 +5398,7 @@ void ha_partition::get_dynamic_partition_info(PARTITION_STATS *stat_info, { handler *file= m_file[part_id]; file->info(HA_STATUS_CONST | HA_STATUS_TIME | HA_STATUS_VARIABLE | - HA_STATUS_NO_LOCK); + HA_STATUS_VARIABLE_EXTRA | HA_STATUS_NO_LOCK); stat_info->records= file->stats.records; stat_info->mean_rec_length= file->stats.mean_rec_length; diff --git a/sql/item.h b/sql/item.h index 6d10c6a6076..3fa11cfd8dd 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1231,7 +1231,7 @@ public: maybe_null= 1; } else - max_length= max_result_length; + max_length= (uint32) max_result_length; } void fix_length_and_charset_datetime(uint32 max_char_length_arg) { diff --git a/sql/log.cc b/sql/log.cc index b9be66f8ce7..7ab4b6b4a61 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -5686,80 +5686,26 @@ void sql_perror(const char *message) } -#ifdef __WIN__ +/* + Change the file associated with two output streams. Used to + redirect stdout and stderr to a file. The streams are reopened + only for appending (writing at end of file). +*/ extern "C" my_bool reopen_fstreams(const char *filename, FILE *outstream, FILE *errstream) { - int handle_fd; - int err_fd, out_fd; - HANDLE osfh; + if (outstream && !my_freopen(filename, "a", outstream)) + return TRUE; - DBUG_ASSERT(filename && errstream); - - // Services don't have stdout/stderr on Windows, so _fileno returns -1. - err_fd= _fileno(errstream); - if (err_fd < 0) - { - if (!freopen(filename, "a+", errstream)) - return TRUE; + if (errstream && !my_freopen(filename, "a", errstream)) + return TRUE; + /* The error stream must be unbuffered. */ + if (errstream) setbuf(errstream, NULL); - err_fd= _fileno(errstream); - } - - if (outstream) - { - out_fd= _fileno(outstream); - if (out_fd < 0) - { - if (!freopen(filename, "a+", outstream)) - return TRUE; - out_fd= _fileno(outstream); - } - } - - if ((osfh= CreateFile(filename, GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE | - FILE_SHARE_DELETE, NULL, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, - NULL)) == INVALID_HANDLE_VALUE) - return TRUE; - - if ((handle_fd= _open_osfhandle((intptr_t)osfh, - _O_APPEND | _O_TEXT)) == -1) - { - CloseHandle(osfh); - return TRUE; - } - - if (_dup2(handle_fd, err_fd) < 0) - { - CloseHandle(osfh); - return TRUE; - } - - if (outstream && _dup2(handle_fd, out_fd) < 0) - { - CloseHandle(osfh); - return TRUE; - } - - _close(handle_fd); - return FALSE; -} -#else -extern "C" my_bool reopen_fstreams(const char *filename, - FILE *outstream, FILE *errstream) -{ - if (outstream && !freopen(filename, "a+", outstream)) - return TRUE; - - if (errstream && !freopen(filename, "a+", errstream)) - return TRUE; return FALSE; } -#endif /* diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 5309713cc13..9bf24bb88f9 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -3925,6 +3925,7 @@ static int get_schema_tables_record(THD *thd, TABLE_LIST *tables, /* If info() fails, then there's nothing else to do */ if ((info_error= file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | + HA_STATUS_VARIABLE_EXTRA | HA_STATUS_AUTO)) != 0) goto err; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 772496a10d5..064c2b36e17 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -371,7 +371,11 @@ uint explain_filename(THD* thd, Table name length. */ -uint filename_to_tablename(const char *from, char *to, uint to_length) +uint filename_to_tablename(const char *from, char *to, uint to_length +#ifndef DBUG_OFF + , bool stay_quiet +#endif /* DBUG_OFF */ + ) { uint errors; size_t res; @@ -391,7 +395,13 @@ uint filename_to_tablename(const char *from, char *to, uint to_length) { res= (strxnmov(to, to_length, MYSQL50_TABLE_NAME_PREFIX, from, NullS) - to); - sql_print_error("Invalid (old?) table or database name '%s'", from); +#ifndef DBUG_OFF + if (!stay_quiet) { +#endif /* DBUG_OFF */ + sql_print_error("Invalid (old?) table or database name '%s'", from); +#ifndef DBUG_OFF + } +#endif /* DBUG_OFF */ /* TODO: add a stored procedure for fix table and database names, and mention its name in error log. diff --git a/sql/sql_table.h b/sql/sql_table.h index aa5738fd4c9..2924301e6b3 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -123,7 +123,11 @@ enum enum_explain_filename_mode #define NO_FRM_RENAME (1 << 2) #define FRM_ONLY (1 << 3) -uint filename_to_tablename(const char *from, char *to, uint to_length); +uint filename_to_tablename(const char *from, char *to, uint to_length +#ifndef DBUG_OFF + , bool stay_quiet = false +#endif /* DBUG_OFF */ + ); uint tablename_to_filename(const char *from, char *to, uint to_length); uint check_n_cut_mysql50_prefix(const char *from, char *to, uint to_length); bool check_mysql50_prefix(const char *name); diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index fa45cc96687..4bbda0d2477 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -40,10 +40,9 @@ IF(UNIX) ENDIF() ENDIF() -# Enable InnoDB's UNIV_DEBUG if MySQL's WITH_DEBUG is defined -IF(WITH_DEBUG) - ADD_DEFINITIONS("-DUNIV_DEBUG") -ENDIF() +# Enable InnoDB's UNIV_DEBUG for debug builds +SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DUNIV_DEBUG") +SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DUNIV_DEBUG") IF(NOT MSVC) # either define HAVE_IB_GCC_ATOMIC_BUILTINS or not @@ -190,7 +189,7 @@ IF(SIZEOF_PTHREAD_T) ENDIF() IF(MSVC) - ADD_DEFINITIONS(-DHAVE_WINDOWS_ATOMICS -DHAVE_IB_PAUSE_INSTRUCTION) + ADD_DEFINITIONS(-DHAVE_WINDOWS_ATOMICS) ENDIF() diff --git a/storage/innobase/btr/btr0btr.c b/storage/innobase/btr/btr0btr.c index 06cfdf5a798..ff82372b52b 100644 --- a/storage/innobase/btr/btr0btr.c +++ b/storage/innobase/btr/btr0btr.c @@ -664,7 +664,7 @@ btr_page_get_father_node_ptr_func( " to fix the\n" "InnoDB: corruption. If the crash happens at " "the database startup, see\n" - "InnoDB: " REFMAN "forcing-recovery.html about\n" + "InnoDB: " REFMAN "forcing-innodb-recovery.html about\n" "InnoDB: forcing recovery. " "Then dump + drop + reimport.\n", stderr); diff --git a/storage/innobase/btr/btr0cur.c b/storage/innobase/btr/btr0cur.c index 50489ae4cc6..a5856479147 100644 --- a/storage/innobase/btr/btr0cur.c +++ b/storage/innobase/btr/btr0cur.c @@ -1874,7 +1874,8 @@ btr_cur_update_in_place( NOT call it if index is secondary */ if (!dict_index_is_clust(index) - || row_upd_changes_ord_field_binary(NULL, index, update)) { + || row_upd_changes_ord_field_binary(NULL, NULL, + index, update)) { /* Remove possible hash index pointer to this record */ btr_search_update_hash_on_delete(cursor); @@ -2626,27 +2627,24 @@ ulint btr_cur_del_mark_set_clust_rec( /*===========================*/ ulint flags, /*!< in: undo logging and locking flags */ - btr_cur_t* cursor, /*!< in: cursor */ + buf_block_t* block, /*!< in/out: buffer block of the record */ + rec_t* rec, /*!< in/out: record */ + dict_index_t* index, /*!< in: clustered index of the record */ + const ulint* offsets,/*!< in: rec_get_offsets(rec) */ ibool val, /*!< in: value to set */ que_thr_t* thr, /*!< in: query thread */ mtr_t* mtr) /*!< in: mtr */ { - dict_index_t* index; - buf_block_t* block; roll_ptr_t roll_ptr; ulint err; - rec_t* rec; page_zip_des_t* page_zip; trx_t* trx; - mem_heap_t* heap = NULL; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets = offsets_; - rec_offs_init(offsets_); - rec = btr_cur_get_rec(cursor); - index = cursor->index; + ut_ad(dict_index_is_clust(index)); + ut_ad(rec_offs_validate(rec, index, offsets)); ut_ad(!!page_rec_is_comp(rec) == dict_table_is_comp(index->table)); - offsets = rec_get_offsets(rec, index, offsets, ULINT_UNDEFINED, &heap); + ut_ad(buf_block_get_frame(block) == page_align(rec)); + ut_ad(page_is_leaf(page_align(rec))); #ifdef UNIV_DEBUG if (btr_cur_print_record_ops && thr) { @@ -2658,13 +2656,12 @@ btr_cur_del_mark_set_clust_rec( ut_ad(dict_index_is_clust(index)); ut_ad(!rec_get_deleted_flag(rec, rec_offs_comp(offsets))); - err = lock_clust_rec_modify_check_and_lock(flags, - btr_cur_get_block(cursor), + err = lock_clust_rec_modify_check_and_lock(flags, block, rec, index, offsets, thr); if (err != DB_SUCCESS) { - goto func_exit; + return(err); } err = trx_undo_report_row_operation(flags, TRX_UNDO_MODIFY_OP, thr, @@ -2672,11 +2669,9 @@ btr_cur_del_mark_set_clust_rec( &roll_ptr); if (err != DB_SUCCESS) { - goto func_exit; + return(err); } - block = btr_cur_get_block(cursor); - if (block->is_hashed) { rw_lock_x_lock(&btr_search_latch); } @@ -2699,10 +2694,6 @@ btr_cur_del_mark_set_clust_rec( btr_cur_del_mark_set_clust_rec_log(flags, rec, index, val, trx, roll_ptr, mtr); -func_exit: - if (UNIV_LIKELY_NULL(heap)) { - mem_heap_free(heap); - } return(err); } @@ -3754,108 +3745,36 @@ btr_cur_set_ownership_of_extern_field( } /*******************************************************************//** -Marks not updated extern fields as not-owned by this record. The ownership -is transferred to the updated record which is inserted elsewhere in the +Marks non-updated off-page fields as disowned by this record. The ownership +must be transferred to the updated record which is inserted elsewhere in the index tree. In purge only the owner of externally stored field is allowed -to free the field. -@return TRUE if BLOB ownership was transferred */ +to free the field. */ UNIV_INTERN -ibool -btr_cur_mark_extern_inherited_fields( -/*=================================*/ +void +btr_cur_disown_inherited_fields( +/*============================*/ page_zip_des_t* page_zip,/*!< in/out: compressed page whose uncompressed part will be updated, or NULL */ rec_t* rec, /*!< in/out: record in a clustered index */ dict_index_t* index, /*!< in: index of the page */ const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ const upd_t* update, /*!< in: update vector */ - mtr_t* mtr) /*!< in: mtr, or NULL if not logged */ + mtr_t* mtr) /*!< in/out: mini-transaction */ { - ulint n; - ulint j; ulint i; - ibool change_ownership = FALSE; - ut_ad(rec_offs_validate(rec, NULL, offsets)); + ut_ad(rec_offs_validate(rec, index, offsets)); ut_ad(!rec_offs_comp(offsets) || !rec_get_node_ptr_flag(rec)); + ut_ad(rec_offs_any_extern(offsets)); + ut_ad(mtr); - if (!rec_offs_any_extern(offsets)) { - - return(FALSE); - } - - n = rec_offs_n_fields(offsets); - - for (i = 0; i < n; i++) { - if (rec_offs_nth_extern(offsets, i)) { - - /* Check it is not in updated fields */ - - if (update) { - for (j = 0; j < upd_get_n_fields(update); - j++) { - if (upd_get_nth_field(update, j) - ->field_no == i) { - - goto updated; - } - } - } - + for (i = 0; i < rec_offs_n_fields(offsets); i++) { + if (rec_offs_nth_extern(offsets, i) + && !upd_get_field_by_field_no(update, i)) { btr_cur_set_ownership_of_extern_field( page_zip, rec, index, offsets, i, FALSE, mtr); - - change_ownership = TRUE; -updated: - ; } } - - return(change_ownership); -} - -/*******************************************************************//** -The complement of the previous function: in an update entry may inherit -some externally stored fields from a record. We must mark them as inherited -in entry, so that they are not freed in a rollback. */ -UNIV_INTERN -void -btr_cur_mark_dtuple_inherited_extern( -/*=================================*/ - dtuple_t* entry, /*!< in/out: updated entry to be - inserted to clustered index */ - const upd_t* update) /*!< in: update vector */ -{ - ulint i; - - for (i = 0; i < dtuple_get_n_fields(entry); i++) { - - dfield_t* dfield = dtuple_get_nth_field(entry, i); - byte* data; - ulint len; - ulint j; - - if (!dfield_is_ext(dfield)) { - continue; - } - - /* Check if it is in updated fields */ - - for (j = 0; j < upd_get_n_fields(update); j++) { - if (upd_get_nth_field(update, j)->field_no == i) { - - goto is_updated; - } - } - - data = dfield_get_data(dfield); - len = dfield_get_len(dfield); - data[len - BTR_EXTERN_FIELD_REF_SIZE + BTR_EXTERN_LEN] - |= BTR_EXTERN_INHERITED_FLAG; - -is_updated: - ; - } } /*******************************************************************//** @@ -3893,29 +3812,6 @@ btr_cur_unmark_extern_fields( } } -/*******************************************************************//** -Marks all extern fields in a dtuple as owned by the record. */ -UNIV_INTERN -void -btr_cur_unmark_dtuple_extern_fields( -/*================================*/ - dtuple_t* entry) /*!< in/out: clustered index entry */ -{ - ulint i; - - for (i = 0; i < dtuple_get_n_fields(entry); i++) { - dfield_t* dfield = dtuple_get_nth_field(entry, i); - - if (dfield_is_ext(dfield)) { - byte* data = dfield_get_data(dfield); - ulint len = dfield_get_len(dfield); - - data[len - BTR_EXTERN_FIELD_REF_SIZE + BTR_EXTERN_LEN] - &= ~BTR_EXTERN_OWNER_FLAG; - } - } -} - /*******************************************************************//** Flags the data tuple fields that are marked as extern storage in the update vector. We use this function to remember which fields we must diff --git a/storage/innobase/buf/buf0buf.c b/storage/innobase/buf/buf0buf.c index b79b5634957..3ff69d8fd1b 100644 --- a/storage/innobase/buf/buf0buf.c +++ b/storage/innobase/buf/buf0buf.c @@ -536,7 +536,7 @@ buf_page_is_corrupted( "you may have copied the InnoDB\n" "InnoDB: tablespace but not the InnoDB " "log files. See\n" - "InnoDB: " REFMAN "forcing-recovery.html\n" + "InnoDB: " REFMAN "forcing-innodb-recovery.html\n" "InnoDB: for more information.\n", (ulong) mach_read_from_4(read_buf + FIL_PAGE_OFFSET), @@ -2745,7 +2745,8 @@ buf_page_get_gen( ut_ad(zip_size == fil_space_get_zip_size(space)); ut_ad(ut_is_2pow(zip_size)); #ifndef UNIV_LOG_DEBUG - ut_ad(!ibuf_inside() || ibuf_page(space, zip_size, offset, NULL)); + ut_ad(!ibuf_inside() || ibuf_page_low(space, zip_size, offset, + FALSE, file, line, NULL)); #endif buf_pool->stat.n_page_gets++; fold = buf_page_address_fold(space, offset); @@ -4038,7 +4039,7 @@ corrupt: "InnoDB: TABLE to scan your" " table for corruption.\n" "InnoDB: See also " - REFMAN "forcing-recovery.html\n" + REFMAN "forcing-innodb-recovery.html\n" "InnoDB: about forcing recovery.\n", stderr); if (srv_force_recovery < SRV_FORCE_IGNORE_CORRUPT) { @@ -4793,23 +4794,203 @@ buf_get_modified_ratio_pct(void) return(ratio); } +/*******************************************************************//** +Aggregates a pool stats information with the total buffer pool stats */ +static +void +buf_stats_aggregate_pool_info( +/*==========================*/ + buf_pool_info_t* total_info, /*!< in/out: the buffer pool + info to store aggregated + result */ + const buf_pool_info_t* pool_info) /*!< in: individual buffer pool + stats info */ +{ + ut_a(total_info && pool_info); + + /* Nothing to copy if total_info is the same as pool_info */ + if (total_info == pool_info) { + return; + } + + total_info->pool_size += pool_info->pool_size; + total_info->lru_len += pool_info->lru_len; + total_info->old_lru_len += pool_info->old_lru_len; + total_info->free_list_len += pool_info->free_list_len; + total_info->flush_list_len += pool_info->flush_list_len; + total_info->n_pend_unzip += pool_info->n_pend_unzip; + total_info->n_pend_reads += pool_info->n_pend_reads; + total_info->n_pending_flush_lru += pool_info->n_pending_flush_lru; + total_info->n_pending_flush_list += pool_info->n_pending_flush_list; + total_info->n_pending_flush_single_page += + pool_info->n_pending_flush_single_page; + total_info->n_pages_made_young += pool_info->n_pages_made_young; + total_info->n_pages_not_made_young += pool_info->n_pages_not_made_young; + total_info->n_pages_read += pool_info->n_pages_read; + total_info->n_pages_created += pool_info->n_pages_created; + total_info->n_pages_written += pool_info->n_pages_written; + total_info->n_page_gets += pool_info->n_page_gets; + total_info->n_ra_pages_read += pool_info->n_ra_pages_read; + total_info->n_ra_pages_evicted += pool_info->n_ra_pages_evicted; + total_info->page_made_young_rate += pool_info->page_made_young_rate; + total_info->page_not_made_young_rate += + pool_info->page_not_made_young_rate; + total_info->pages_read_rate += pool_info->pages_read_rate; + total_info->pages_created_rate += pool_info->pages_created_rate; + total_info->pages_written_rate += pool_info->pages_written_rate; + total_info->n_page_get_delta += pool_info->n_page_get_delta; + total_info->page_read_delta += pool_info->page_read_delta; + total_info->young_making_delta += pool_info->young_making_delta; + total_info->not_young_making_delta += pool_info->not_young_making_delta; + total_info->pages_readahead_rate += pool_info->pages_readahead_rate; + total_info->pages_evicted_rate += pool_info->pages_evicted_rate; + total_info->unzip_lru_len += pool_info->unzip_lru_len; + total_info->io_sum += pool_info->io_sum; + total_info->io_cur += pool_info->io_cur; + total_info->unzip_sum += pool_info->unzip_sum; + total_info->unzip_cur += pool_info->unzip_cur; +} +/*******************************************************************//** +Collect buffer pool stats information for a buffer pool. Also +record aggregated stats if there are more than one buffer pool +in the server */ +static +void +buf_stats_get_pool_info( +/*====================*/ + buf_pool_t* buf_pool, /*!< in: buffer pool */ + ulint pool_id, /*!< in: buffer pool ID */ + buf_pool_info_t* all_pool_info) /*!< in/out: buffer pool info + to fill */ +{ + buf_pool_info_t* pool_info; + time_t current_time; + double time_elapsed; + + /* Find appropriate pool_info to store stats for this buffer pool */ + pool_info = &all_pool_info[pool_id]; + + buf_pool_mutex_enter(buf_pool); + buf_flush_list_mutex_enter(buf_pool); + + pool_info->pool_unique_id = pool_id; + + pool_info->pool_size = buf_pool->curr_size; + + pool_info->lru_len = UT_LIST_GET_LEN(buf_pool->LRU); + + pool_info->old_lru_len = buf_pool->LRU_old_len; + + pool_info->free_list_len = UT_LIST_GET_LEN(buf_pool->free); + + pool_info->flush_list_len = UT_LIST_GET_LEN(buf_pool->flush_list); + + pool_info->n_pend_unzip = UT_LIST_GET_LEN(buf_pool->unzip_LRU); + + pool_info->n_pend_reads = buf_pool->n_pend_reads; + + pool_info->n_pending_flush_lru = + (buf_pool->n_flush[BUF_FLUSH_LRU] + + buf_pool->init_flush[BUF_FLUSH_LRU]); + + pool_info->n_pending_flush_list = + (buf_pool->n_flush[BUF_FLUSH_LIST] + + buf_pool->init_flush[BUF_FLUSH_LIST]); + + pool_info->n_pending_flush_single_page = + buf_pool->n_flush[BUF_FLUSH_SINGLE_PAGE]; + + buf_flush_list_mutex_exit(buf_pool); + + current_time = time(NULL); + time_elapsed = 0.001 + difftime(current_time, + buf_pool->last_printout_time); + + pool_info->n_pages_made_young = buf_pool->stat.n_pages_made_young; + + pool_info->n_pages_not_made_young = + buf_pool->stat.n_pages_not_made_young; + + pool_info->n_pages_read = buf_pool->stat.n_pages_read; + + pool_info->n_pages_created = buf_pool->stat.n_pages_created; + + pool_info->n_pages_written = buf_pool->stat.n_pages_written; + + pool_info->n_page_gets = buf_pool->stat.n_page_gets; + + pool_info->n_ra_pages_read = buf_pool->stat.n_ra_pages_read; + + pool_info->n_ra_pages_evicted = buf_pool->stat.n_ra_pages_evicted; + + pool_info->page_made_young_rate = + (buf_pool->stat.n_pages_made_young + - buf_pool->old_stat.n_pages_made_young) / time_elapsed; + + pool_info->page_not_made_young_rate = + (buf_pool->stat.n_pages_not_made_young + - buf_pool->old_stat.n_pages_not_made_young) / time_elapsed; + + pool_info->pages_read_rate = + (buf_pool->stat.n_pages_read + - buf_pool->old_stat.n_pages_read) / time_elapsed; + + pool_info->pages_created_rate = + (buf_pool->stat.n_pages_created + - buf_pool->old_stat.n_pages_created) / time_elapsed; + + pool_info->pages_written_rate = + (buf_pool->stat.n_pages_written + - buf_pool->old_stat.n_pages_written) / time_elapsed; + + pool_info->n_page_get_delta = buf_pool->stat.n_page_gets + - buf_pool->old_stat.n_page_gets; + + if (pool_info->n_page_get_delta) { + pool_info->page_read_delta = buf_pool->stat.n_pages_read + - buf_pool->old_stat.n_pages_read; + + pool_info->young_making_delta = + buf_pool->stat.n_pages_made_young + - buf_pool->old_stat.n_pages_made_young; + + pool_info->not_young_making_delta = + buf_pool->stat.n_pages_not_made_young + - buf_pool->old_stat.n_pages_not_made_young; + } + + pool_info->pages_readahead_rate = + (buf_pool->stat.n_ra_pages_read + - buf_pool->old_stat.n_ra_pages_read) / time_elapsed; + + pool_info->pages_evicted_rate = + (buf_pool->stat.n_ra_pages_evicted + - buf_pool->old_stat.n_ra_pages_evicted) / time_elapsed; + + pool_info->unzip_lru_len = UT_LIST_GET_LEN(buf_pool->unzip_LRU); + + pool_info->io_sum = buf_LRU_stat_sum.io; + + pool_info->io_cur = buf_LRU_stat_cur.io; + + pool_info->unzip_sum = buf_LRU_stat_sum.unzip; + + pool_info->unzip_cur = buf_LRU_stat_cur.unzip; + + buf_refresh_io_stats(buf_pool); + buf_pool_mutex_exit(buf_pool); +} + /*********************************************************************//** Prints info of the buffer i/o. */ UNIV_INTERN void buf_print_io_instance( /*==================*/ - buf_pool_t* buf_pool, /*!< in: buffer pool instance */ + buf_pool_info_t*pool_info, /*!< in: buffer pool info */ FILE* file) /*!< in/out: buffer where to print */ { - time_t current_time; - double time_elapsed; - ulint n_gets_diff; - - ut_ad(buf_pool); - - buf_pool_mutex_enter(buf_pool); - buf_flush_list_mutex_enter(buf_pool); + ut_ad(pool_info); fprintf(file, "Buffer pool size %lu\n" @@ -4819,70 +5000,42 @@ buf_print_io_instance( "Modified db pages %lu\n" "Pending reads %lu\n" "Pending writes: LRU %lu, flush list %lu, single page %lu\n", - (ulong) buf_pool->curr_size, - (ulong) UT_LIST_GET_LEN(buf_pool->free), - (ulong) UT_LIST_GET_LEN(buf_pool->LRU), - (ulong) buf_pool->LRU_old_len, - (ulong) UT_LIST_GET_LEN(buf_pool->flush_list), - (ulong) buf_pool->n_pend_reads, - (ulong) buf_pool->n_flush[BUF_FLUSH_LRU] - + buf_pool->init_flush[BUF_FLUSH_LRU], - (ulong) buf_pool->n_flush[BUF_FLUSH_LIST] - + buf_pool->init_flush[BUF_FLUSH_LIST], - (ulong) buf_pool->n_flush[BUF_FLUSH_SINGLE_PAGE]); - - buf_flush_list_mutex_exit(buf_pool); - - current_time = time(NULL); - time_elapsed = 0.001 + difftime(current_time, - buf_pool->last_printout_time); + pool_info->pool_size, + pool_info->free_list_len, + pool_info->lru_len, + pool_info->old_lru_len, + pool_info->flush_list_len, + pool_info->n_pend_reads, + pool_info->n_pending_flush_lru, + pool_info->n_pending_flush_list, + pool_info->n_pending_flush_single_page); fprintf(file, "Pages made young %lu, not young %lu\n" "%.2f youngs/s, %.2f non-youngs/s\n" "Pages read %lu, created %lu, written %lu\n" "%.2f reads/s, %.2f creates/s, %.2f writes/s\n", - (ulong) buf_pool->stat.n_pages_made_young, - (ulong) buf_pool->stat.n_pages_not_made_young, - (buf_pool->stat.n_pages_made_young - - buf_pool->old_stat.n_pages_made_young) - / time_elapsed, - (buf_pool->stat.n_pages_not_made_young - - buf_pool->old_stat.n_pages_not_made_young) - / time_elapsed, - (ulong) buf_pool->stat.n_pages_read, - (ulong) buf_pool->stat.n_pages_created, - (ulong) buf_pool->stat.n_pages_written, - (buf_pool->stat.n_pages_read - - buf_pool->old_stat.n_pages_read) - / time_elapsed, - (buf_pool->stat.n_pages_created - - buf_pool->old_stat.n_pages_created) - / time_elapsed, - (buf_pool->stat.n_pages_written - - buf_pool->old_stat.n_pages_written) - / time_elapsed); + pool_info->n_pages_made_young, + pool_info->n_pages_not_made_young, + pool_info->page_made_young_rate, + pool_info->page_not_made_young_rate, + pool_info->n_pages_read, + pool_info->n_pages_created, + pool_info->n_pages_written, + pool_info->pages_read_rate, + pool_info->pages_created_rate, + pool_info->pages_written_rate); - n_gets_diff = buf_pool->stat.n_page_gets - - buf_pool->old_stat.n_page_gets; - - if (n_gets_diff) { + if (pool_info->n_page_get_delta) { fprintf(file, "Buffer pool hit rate %lu / 1000," " young-making rate %lu / 1000 not %lu / 1000\n", - (ulong) - (1000 - ((1000 * (buf_pool->stat.n_pages_read - - buf_pool->old_stat.n_pages_read)) - / (buf_pool->stat.n_page_gets - - buf_pool->old_stat.n_page_gets))), - (ulong) - (1000 * (buf_pool->stat.n_pages_made_young - - buf_pool->old_stat.n_pages_made_young) - / n_gets_diff), - (ulong) - (1000 * (buf_pool->stat.n_pages_not_made_young - - buf_pool->old_stat.n_pages_not_made_young) - / n_gets_diff)); + (ulong) (1000 - (1000 * pool_info->page_read_delta + / pool_info->n_page_get_delta)), + (ulong) (1000 * pool_info->young_making_delta + / pool_info->n_page_get_delta), + (ulong) (1000 * pool_info->not_young_making_delta + / pool_info->n_page_get_delta)); } else { fputs("No buffer pool page gets since the last printout\n", file); @@ -4891,25 +5044,17 @@ buf_print_io_instance( /* Statistics about read ahead algorithm */ fprintf(file, "Pages read ahead %.2f/s," " evicted without access %.2f/s\n", - (buf_pool->stat.n_ra_pages_read - - buf_pool->old_stat.n_ra_pages_read) - / time_elapsed, - (buf_pool->stat.n_ra_pages_evicted - - buf_pool->old_stat.n_ra_pages_evicted) - / time_elapsed); + pool_info->pages_readahead_rate, + pool_info->pages_evicted_rate); /* Print some values to help us with visualizing what is happening with LRU eviction. */ fprintf(file, "LRU len: %lu, unzip_LRU len: %lu\n" "I/O sum[%lu]:cur[%lu], unzip sum[%lu]:cur[%lu]\n", - UT_LIST_GET_LEN(buf_pool->LRU), - UT_LIST_GET_LEN(buf_pool->unzip_LRU), - buf_LRU_stat_sum.io, buf_LRU_stat_cur.io, - buf_LRU_stat_sum.unzip, buf_LRU_stat_cur.unzip); - - buf_refresh_io_stats(buf_pool); - buf_pool_mutex_exit(buf_pool); + pool_info->lru_len, pool_info->unzip_lru_len, + pool_info->io_sum, pool_info->io_cur, + pool_info->unzip_sum, pool_info->unzip_cur); } /*********************************************************************//** @@ -4920,14 +5065,58 @@ buf_print_io( /*=========*/ FILE* file) /*!< in/out: buffer where to print */ { - ulint i; + ulint i; + buf_pool_info_t* pool_info; + buf_pool_info_t* pool_info_total; + + /* If srv_buf_pool_instances is greater than 1, allocate + one extra buf_pool_info_t, the last one stores + aggregated/total values from all pools */ + if (srv_buf_pool_instances > 1) { + pool_info = (buf_pool_info_t*) mem_zalloc(( + srv_buf_pool_instances + 1) * sizeof *pool_info); + + pool_info_total = &pool_info[srv_buf_pool_instances]; + } else { + ut_a(srv_buf_pool_instances == 1); + pool_info_total = pool_info = (buf_pool_info_t*) mem_zalloc( + sizeof *pool_info) + } for (i = 0; i < srv_buf_pool_instances; i++) { buf_pool_t* buf_pool; buf_pool = buf_pool_from_array(i); - buf_print_io_instance(buf_pool, file); + + /* Fetch individual buffer pool info and calculate + aggregated stats along the way */ + buf_stats_get_pool_info(buf_pool, i, pool_info); + + /* If we have more than one buffer pool, store + the aggregated stats */ + if (srv_buf_pool_instances > 1) { + buf_stats_aggregate_pool_info(pool_info_total, + &pool_info[i]); + } } + + /* Print the aggreate buffer pool info */ + buf_print_io_instance(pool_info_total, file); + + /* If there are more than one buffer pool, print each individual pool + info */ + if (srv_buf_pool_instances > 1) { + fputs("----------------------\n" + "INDIVIDUAL BUFFER POOL INFO\n" + "----------------------\n", file); + + for (i = 0; i < srv_buf_pool_instances; i++) { + fprintf(file, "---BUFFER POOL %lu\n", i); + buf_print_io_instance(&pool_info[i], file); + } + } + + mem_free(pool_info); } /**********************************************************************//** diff --git a/storage/innobase/buf/buf0flu.c b/storage/innobase/buf/buf0flu.c index 5b0617f17b1..07a32e55f97 100644 --- a/storage/innobase/buf/buf0flu.c +++ b/storage/innobase/buf/buf0flu.c @@ -88,6 +88,34 @@ ibool buf_flush_validate_low( /*===================*/ buf_pool_t* buf_pool); /*!< in: Buffer pool instance */ + +/******************************************************************//** +Validates the flush list some of the time. +@return TRUE if ok or the check was skipped */ +static +ibool +buf_flush_validate_skip( +/*====================*/ + buf_pool_t* buf_pool) /*!< in: Buffer pool instance */ +{ +/** Try buf_flush_validate_low() every this many times */ +# define BUF_FLUSH_VALIDATE_SKIP 23 + + /** The buf_flush_validate_low() call skip counter. + Use a signed type because of the race condition below. */ + static int buf_flush_validate_count = BUF_FLUSH_VALIDATE_SKIP; + + /* There is a race condition below, but it does not matter, + because this call is only for heuristic purposes. We want to + reduce the call frequency of the costly buf_flush_validate_low() + check in debug builds. */ + if (--buf_flush_validate_count > 0) { + return(TRUE); + } + + buf_flush_validate_count = BUF_FLUSH_VALIDATE_SKIP; + return(buf_flush_validate_low(buf_pool)); +} #endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */ /******************************************************************//** @@ -293,7 +321,7 @@ buf_flush_insert_into_flush_list( } #endif /* UNIV_DEBUG_VALGRIND */ #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG - ut_a(buf_flush_validate_low(buf_pool)); + ut_a(buf_flush_validate_skip(buf_pool)); #endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */ buf_flush_list_mutex_exit(buf_pool); @@ -515,7 +543,7 @@ buf_flush_remove( bpage->oldest_modification = 0; #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG - ut_a(buf_flush_validate_low(buf_pool)); + ut_a(buf_flush_validate_skip(buf_pool)); #endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */ buf_flush_list_mutex_exit(buf_pool); diff --git a/storage/innobase/buf/buf0lru.c b/storage/innobase/buf/buf0lru.c index 8ad5f2dad83..d819782ac9d 100644 --- a/storage/innobase/buf/buf0lru.c +++ b/storage/innobase/buf/buf0lru.c @@ -2076,6 +2076,7 @@ buf_LRU_stat_update(void) buf_LRU_stat_t* item; buf_pool_t* buf_pool; ibool evict_started = FALSE; + buf_LRU_stat_t cur_stat; /* If we haven't started eviction yet then don't update stats. */ for (i = 0; i < srv_buf_pool_instances; i++) { @@ -2097,12 +2098,19 @@ buf_LRU_stat_update(void) buf_LRU_stat_arr_ind++; buf_LRU_stat_arr_ind %= BUF_LRU_STAT_N_INTERVAL; - /* Add the current value and subtract the obsolete entry. */ - buf_LRU_stat_sum.io += buf_LRU_stat_cur.io - item->io; - buf_LRU_stat_sum.unzip += buf_LRU_stat_cur.unzip - item->unzip; + /* Add the current value and subtract the obsolete entry. + Since buf_LRU_stat_cur is not protected by any mutex, + it can be changing between adding to buf_LRU_stat_sum + and copying to item. Assign it to local variables to make + sure the same value assign to the buf_LRU_stat_sum + and item */ + cur_stat = buf_LRU_stat_cur; + + buf_LRU_stat_sum.io += cur_stat.io - item->io; + buf_LRU_stat_sum.unzip += cur_stat.unzip - item->unzip; /* Put current entry in the array. */ - memcpy(item, &buf_LRU_stat_cur, sizeof *item); + memcpy(item, &cur_stat, sizeof *item); func_exit: /* Clear the current entry. */ diff --git a/storage/innobase/dict/dict0dict.c b/storage/innobase/dict/dict0dict.c index 0d15ad8b716..ee862d8c709 100644 --- a/storage/innobase/dict/dict0dict.c +++ b/storage/innobase/dict/dict0dict.c @@ -52,8 +52,9 @@ UNIV_INTERN dict_index_t* dict_ind_compact; #include "que0que.h" #include "rem0cmp.h" #include "row0merge.h" +#include "srv0srv.h" /* srv_lower_case_table_names */ #include "m_ctype.h" /* my_isspace() */ -#include "ha_prototypes.h" /* innobase_strcasecmp() */ +#include "ha_prototypes.h" /* innobase_strcasecmp(), innobase_casedn_str()*/ #include @@ -74,6 +75,7 @@ UNIV_INTERN rw_lock_t dict_operation_lock; #ifdef UNIV_PFS_RWLOCK UNIV_INTERN mysql_pfs_key_t dict_operation_lock_key; UNIV_INTERN mysql_pfs_key_t index_tree_rw_lock_key; +UNIV_INTERN mysql_pfs_key_t dict_table_stats_latch_key; #endif /* UNIV_PFS_RWLOCK */ #ifdef UNIV_PFS_MUTEX @@ -714,7 +716,7 @@ dict_init(void) &dict_foreign_err_mutex, SYNC_ANY_LATCH); for (i = 0; i < DICT_TABLE_STATS_LATCHES_SIZE; i++) { - rw_lock_create(PFS_NOT_INSTRUMENTED, + rw_lock_create(dict_table_stats_latch_key, &dict_table_stats_latches[i], SYNC_INDEX_TREE); } } @@ -1080,13 +1082,13 @@ dict_table_rename_in_cache( /* Allocate a longer name buffer; TODO: store buf len to save memory */ - foreign->foreign_table_name - = mem_heap_alloc(foreign->heap, - ut_strlen(table->name) + 1); + foreign->foreign_table_name = mem_heap_strdup( + foreign->heap, table->name); + dict_mem_foreign_table_name_lookup_set(foreign, TRUE); + } else { + strcpy(foreign->foreign_table_name, table->name); + dict_mem_foreign_table_name_lookup_set(foreign, FALSE); } - - strcpy(foreign->foreign_table_name, table->name); - if (strchr(foreign->id, '/')) { ulint db_len; char* old_id; @@ -1152,12 +1154,14 @@ dict_table_rename_in_cache( /* Allocate a longer name buffer; TODO: store buf len to save memory */ - foreign->referenced_table_name = mem_heap_alloc( - foreign->heap, strlen(table->name) + 1); + foreign->referenced_table_name = mem_heap_strdup( + foreign->heap, table->name); + dict_mem_referenced_table_name_lookup_set(foreign, TRUE); + } else { + /* Use the same buffer */ + strcpy(foreign->referenced_table_name, table->name); + dict_mem_referenced_table_name_lookup_set(foreign, FALSE); } - - strcpy(foreign->referenced_table_name, table->name); - foreign = UT_LIST_GET_NEXT(referenced_list, foreign); } @@ -2583,10 +2587,10 @@ dict_foreign_add_to_cache( ut_ad(mutex_own(&(dict_sys->mutex))); for_table = dict_table_check_if_in_cache_low( - foreign->foreign_table_name); + foreign->foreign_table_name_lookup); ref_table = dict_table_check_if_in_cache_low( - foreign->referenced_table_name); + foreign->referenced_table_name_lookup); ut_a(for_table || ref_table); if (for_table) { @@ -2703,7 +2707,7 @@ dict_scan_to( quote = '\0'; } else if (quote) { /* Within quotes: do nothing. */ - } else if (*ptr == '`' || *ptr == '"') { + } else if (*ptr == '`' || *ptr == '"' || *ptr == '\'') { /* Starting quote: remember the quote character. */ quote = *ptr; } else { @@ -3015,19 +3019,25 @@ dict_scan_table_name( memcpy(ref, database_name, database_name_len); ref[database_name_len] = '/'; memcpy(ref + database_name_len + 1, table_name, table_name_len + 1); -#ifndef __WIN__ - if (srv_lower_case_table_names) { -#endif /* !__WIN__ */ - /* The table name is always put to lower case on Windows. */ + + /* Values; 0 = Store and compare as given; case sensitive + 1 = Store and compare in lower; case insensitive + 2 = Store as given, compare in lower; case semi-sensitive */ + if (srv_lower_case_table_names == 2) { innobase_casedn_str(ref); -#ifndef __WIN__ + *table = dict_table_get_low(ref); + memcpy(ref, database_name, database_name_len); + ref[database_name_len] = '/'; + memcpy(ref + database_name_len + 1, table_name, table_name_len + 1); + } else { + if (srv_lower_case_table_names == 1) { + innobase_casedn_str(ref); + } + *table = dict_table_get_low(ref); } -#endif /* !__WIN__ */ *success = TRUE; *ref_name = ref; - *table = dict_table_get_low(ref); - return(ptr); } @@ -3516,8 +3526,10 @@ col_loop1: } foreign->foreign_table = table; - foreign->foreign_table_name = mem_heap_strdup(foreign->heap, - table->name); + foreign->foreign_table_name = mem_heap_strdup( + foreign->heap, table->name); + dict_mem_foreign_table_name_lookup_set(foreign, TRUE); + foreign->foreign_index = index; foreign->n_fields = (unsigned int) i; foreign->foreign_col_names = mem_heap_alloc(foreign->heap, @@ -3774,8 +3786,9 @@ try_find_index: foreign->referenced_index = index; foreign->referenced_table = referenced_table; - foreign->referenced_table_name - = mem_heap_strdup(foreign->heap, referenced_table_name); + foreign->referenced_table_name = mem_heap_strdup( + foreign->heap, referenced_table_name); + dict_mem_referenced_table_name_lookup_set(foreign, TRUE); foreign->referenced_col_names = mem_heap_alloc(foreign->heap, i * sizeof(void*)); @@ -4586,8 +4599,8 @@ dict_print_info_on_foreign_key_in_create_format( fputs(") REFERENCES ", file); - if (dict_tables_have_same_db(foreign->foreign_table_name, - foreign->referenced_table_name)) { + if (dict_tables_have_same_db(foreign->foreign_table_name_lookup, + foreign->referenced_table_name_lookup)) { /* Do not print the database name of the referenced table */ ut_print_name(file, trx, TRUE, dict_remove_db_name( diff --git a/storage/innobase/dict/dict0load.c b/storage/innobase/dict/dict0load.c index 5b01669af29..3252e85b358 100644 --- a/storage/innobase/dict/dict0load.c +++ b/storage/innobase/dict/dict0load.c @@ -40,6 +40,7 @@ Created 4/24/1996 Heikki Tuuri #include "rem0cmp.h" #include "srv0start.h" #include "srv0srv.h" +#include "ha_prototypes.h" /* innobase_casedn_str() */ /** Following are six InnoDB system tables */ @@ -435,10 +436,12 @@ dict_process_sys_fields_rec( return(err_msg); } + +#ifdef FOREIGN_NOT_USED /********************************************************************//** This function parses a SYS_FOREIGN record and populate a dict_foreign_t structure with the information from the record. For detail information -about SYS_FOREIGN fields, please refer to dict_load_foreign() function +about SYS_FOREIGN fields, please refer to dict_load_foreign() function. @return error message, or NULL on success */ UNIV_INTERN const char* @@ -466,6 +469,11 @@ dict_process_sys_foreign_rec( err_len: return("incorrect column length in SYS_FOREIGN"); } + + /* This recieves a dict_foreign_t* that points to a stack variable. + So mem_heap_free(foreign->heap) is not used as elsewhere. + Since the heap used here is freed elsewhere, foreign->heap + is not assigned. */ foreign->id = mem_heap_strdupl(heap, (const char*) field, len); rec_get_nth_field_offs_old(rec, 1/*DB_TRX_ID*/, &len); @@ -477,6 +485,9 @@ err_len: goto err_len; } + /* The _lookup versions of the referenced and foreign table names + are not assigned since they are not used in this dict_foreign_t */ + field = rec_get_nth_field_old(rec, 3/*FOR_NAME*/, &len); if (UNIV_UNLIKELY(len < 1 || len == UNIV_SQL_NULL)) { goto err_len; @@ -502,6 +513,9 @@ err_len: return(NULL); } +#endif /* FOREIGN_NOT_USED */ + +#ifdef FOREIGN_NOT_USED /********************************************************************//** This function parses a SYS_FOREIGN_COLS record and extract necessary information from the record and return to caller. @@ -565,6 +579,8 @@ err_len: return(NULL); } +#endif /* FOREIGN_NOT_USED */ + /********************************************************************//** Determine the flags of a table described in SYS_TABLES. @return compressed page size in kilobytes; or 0 if the tablespace is @@ -2057,12 +2073,15 @@ dict_load_foreign( foreign->id = mem_heap_strdup(foreign->heap, id); field = rec_get_nth_field_old(rec, 3, &len); + foreign->foreign_table_name = mem_heap_strdupl( foreign->heap, (char*) field, len); + dict_mem_foreign_table_name_lookup_set(foreign, TRUE); field = rec_get_nth_field_old(rec, 4, &len); foreign->referenced_table_name = mem_heap_strdupl( foreign->heap, (char*) field, len); + dict_mem_referenced_table_name_lookup_set(foreign, TRUE); btr_pcur_close(&pcur); mtr_commit(&mtr); @@ -2070,7 +2089,7 @@ dict_load_foreign( dict_load_foreign_cols(id, foreign); ref_table = dict_table_check_if_in_cache_low( - foreign->referenced_table_name); + foreign->referenced_table_name_lookup); /* We could possibly wind up in a deep recursive calls if we call dict_table_get_low() again here if there @@ -2103,7 +2122,7 @@ dict_load_foreign( have to load it so that we are able to make type comparisons in the next function call. */ - for_table = dict_table_get_low(foreign->foreign_table_name); + for_table = dict_table_get_low(foreign->foreign_table_name_lookup); if (for_table && ref_table && check_recursive) { /* This is to record the longest chain of ancesters diff --git a/storage/innobase/dict/dict0mem.c b/storage/innobase/dict/dict0mem.c index bbb8f810f44..8d3d78f3900 100644 --- a/storage/innobase/dict/dict0mem.c +++ b/storage/innobase/dict/dict0mem.c @@ -33,6 +33,8 @@ Created 1/8/1996 Heikki Tuuri #include "data0type.h" #include "mach0data.h" #include "dict0dict.h" +#include "srv0srv.h" /* srv_lower_case_table_names */ +#include "ha_prototypes.h" /* innobase_casedn_str()*/ #ifndef UNIV_HOTBACKUP # include "lock0lock.h" #endif /* !UNIV_HOTBACKUP */ @@ -287,6 +289,60 @@ dict_mem_foreign_create(void) return(foreign); } +/**********************************************************************//** +Sets the foreign_table_name_lookup pointer based on the value of +srv_lower_case_table_names. If that is 0 or 1, foreign_table_name_lookup +will point to foreign_table_name. If 2, then another string is allocated +of the heap and set to lower case. */ +UNIV_INTERN +void +dict_mem_foreign_table_name_lookup_set( +/*===================================*/ + dict_foreign_t* foreign, /*!< in/out: foreign struct */ + ibool do_alloc) /*!< in: is an alloc needed */ +{ + if (srv_lower_case_table_names == 2) { + if (do_alloc) { + foreign->foreign_table_name_lookup = mem_heap_alloc( + foreign->heap, + strlen(foreign->foreign_table_name) + 1); + } + strcpy(foreign->foreign_table_name_lookup, + foreign->foreign_table_name); + innobase_casedn_str(foreign->foreign_table_name_lookup); + } else { + foreign->foreign_table_name_lookup + = foreign->foreign_table_name; + } +} + +/**********************************************************************//** +Sets the referenced_table_name_lookup pointer based on the value of +srv_lower_case_table_names. If that is 0 or 1, +referenced_table_name_lookup will point to referenced_table_name. If 2, +then another string is allocated of the heap and set to lower case. */ +UNIV_INTERN +void +dict_mem_referenced_table_name_lookup_set( +/*======================================*/ + dict_foreign_t* foreign, /*!< in/out: foreign struct */ + ibool do_alloc) /*!< in: is an alloc needed */ +{ + if (srv_lower_case_table_names == 2) { + if (do_alloc) { + foreign->referenced_table_name_lookup = mem_heap_alloc( + foreign->heap, + strlen(foreign->referenced_table_name) + 1); + } + strcpy(foreign->referenced_table_name_lookup, + foreign->referenced_table_name); + innobase_casedn_str(foreign->referenced_table_name_lookup); + } else { + foreign->referenced_table_name_lookup + = foreign->referenced_table_name; + } +} + /**********************************************************************//** Adds a field definition to an index. NOTE: does not take a copy of the column name if the field is a column. The memory occupied diff --git a/storage/innobase/fil/fil0fil.c b/storage/innobase/fil/fil0fil.c index cb4ccc005b5..d940bc70609 100644 --- a/storage/innobase/fil/fil0fil.c +++ b/storage/innobase/fil/fil0fil.c @@ -299,6 +299,34 @@ struct fil_system_struct { initialized. */ static fil_system_t* fil_system = NULL; +#ifdef UNIV_DEBUG +/** Try fil_validate() every this many times */ +# define FIL_VALIDATE_SKIP 17 + +/******************************************************************//** +Checks the consistency of the tablespace cache some of the time. +@return TRUE if ok or the check was skipped */ +static +ibool +fil_validate_skip(void) +/*===================*/ +{ + /** The fil_validate() call skip counter. Use a signed type + because of the race condition below. */ + static int fil_validate_count = FIL_VALIDATE_SKIP; + + /* There is a race condition below, but it does not matter, + because this call is only for heuristic purposes. We want to + reduce the call frequency of the costly fil_validate() check + in debug builds. */ + if (--fil_validate_count > 0) { + return(TRUE); + } + + fil_validate_count = FIL_VALIDATE_SKIP; + return(fil_validate()); +} +#endif /* UNIV_DEBUG */ /********************************************************************//** NOTE: you must call fil_mutex_enter_and_prepare_for_io() first! @@ -4307,7 +4335,7 @@ fil_io( #if (1 << UNIV_PAGE_SIZE_SHIFT) != UNIV_PAGE_SIZE # error "(1 << UNIV_PAGE_SIZE_SHIFT) != UNIV_PAGE_SIZE" #endif - ut_ad(fil_validate()); + ut_ad(fil_validate_skip()); #ifndef UNIV_HOTBACKUP # ifndef UNIV_LOG_DEBUG /* ibuf bitmap pages must be read in the sync aio mode: */ @@ -4466,7 +4494,7 @@ fil_io( mutex_exit(&fil_system->mutex); - ut_ad(fil_validate()); + ut_ad(fil_validate_skip()); } return(DB_SUCCESS); @@ -4490,7 +4518,7 @@ fil_aio_wait( void* message; ulint type; - ut_ad(fil_validate()); + ut_ad(fil_validate_skip()); if (srv_use_native_aio) { srv_set_io_thread_op_info(segment, "native aio handle"); @@ -4521,7 +4549,7 @@ fil_aio_wait( mutex_exit(&fil_system->mutex); - ut_ad(fil_validate()); + ut_ad(fil_validate_skip()); /* Do the i/o handling */ /* IMPORTANT: since i/o handling for reads will read also the insert diff --git a/storage/innobase/fsp/fsp0fsp.c b/storage/innobase/fsp/fsp0fsp.c index ffe2b21b80c..5bf5411bc6a 100644 --- a/storage/innobase/fsp/fsp0fsp.c +++ b/storage/innobase/fsp/fsp0fsp.c @@ -3321,7 +3321,7 @@ fseg_free_page_low( "InnoDB: database!\n", (ulong) page); crash: fputs("InnoDB: Please refer to\n" - "InnoDB: " REFMAN "forcing-recovery.html\n" + "InnoDB: " REFMAN "forcing-innodb-recovery.html\n" "InnoDB: about forcing recovery.\n", stderr); ut_error; } diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index b0d620c060d..e35eabcaea6 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -285,7 +285,8 @@ static PSI_rwlock_info all_innodb_rwlocks[] = { {&checkpoint_lock_key, "checkpoint_lock", 0}, {&trx_i_s_cache_lock_key, "trx_i_s_cache_lock", 0}, {&trx_purge_latch_key, "trx_purge_latch", 0}, - {&index_tree_rw_lock_key, "index_tree_rw_lock", 0} + {&index_tree_rw_lock_key, "index_tree_rw_lock", 0}, + {&dict_table_stats_latch_key, "dict_table_stats", 0} }; # endif /* UNIV_PFS_RWLOCK */ @@ -2164,13 +2165,13 @@ innobase_init( ut_a(DATA_MYSQL_TRUE_VARCHAR == (ulint)MYSQL_TYPE_VARCHAR); -#ifdef UNIV_DEBUG +#ifndef DBUG_OFF static const char test_filename[] = "-@"; char test_tablename[sizeof test_filename + sizeof srv_mysql50_table_name_prefix]; if ((sizeof test_tablename) - 1 != filename_to_tablename(test_filename, test_tablename, - sizeof test_tablename) + sizeof test_tablename, true) || strncmp(test_tablename, srv_mysql50_table_name_prefix, sizeof srv_mysql50_table_name_prefix) @@ -2180,7 +2181,7 @@ innobase_init( sql_print_error("tablename encoding has been changed"); goto error; } -#endif /* UNIV_DEBUG */ +#endif /* DBUG_OFF */ /* Check that values don't overflow on 32-bit systems. */ if (sizeof(ulint) == 4) { @@ -3639,6 +3640,7 @@ ha_innobase::open( UT_NOT_USED(test_if_locked); thd = ha_thd(); + srv_lower_case_table_names = lower_case_table_names; /* Under some cases MySQL seems to call this function while holding btr_search_latch. This breaks the latching order as @@ -6498,10 +6500,11 @@ create_clustered_index_when_no_primary( /*****************************************************************//** Return a display name for the row format @return row format name */ - -const char *get_row_format_name( -/*============================*/ -enum row_type row_format) /*!< in: Row Format */ +UNIV_INTERN +const char* +get_row_format_name( +/*================*/ + enum row_type row_format) /*!< in: Row Format */ { switch (row_format) { case ROW_TYPE_COMPACT: @@ -6516,12 +6519,38 @@ enum row_type row_format) /*!< in: Row Format */ return("DEFAULT"); case ROW_TYPE_FIXED: return("FIXED"); - default: + case ROW_TYPE_PAGE: + case ROW_TYPE_NOT_USED: break; } return("NOT USED"); } +/** If file-per-table is missing, issue warning and set ret false */ +#define CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE \ + if (!srv_file_per_table) { \ + push_warning_printf( \ + thd, MYSQL_ERROR::WARN_LEVEL_WARN, \ + ER_ILLEGAL_HA_CREATE_OPTION, \ + "InnoDB: ROW_FORMAT=%s requires" \ + " innodb_file_per_table.", \ + get_row_format_name(row_format)); \ + ret = FALSE; \ + } + +/** If file-format is Antelope, issue warning and set ret false */ +#define CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE \ + if (srv_file_format < DICT_TF_FORMAT_ZIP) { \ + push_warning_printf( \ + thd, MYSQL_ERROR::WARN_LEVEL_WARN, \ + ER_ILLEGAL_HA_CREATE_OPTION, \ + "InnoDB: ROW_FORMAT=%s requires" \ + " innodb_file_format > Antelope.", \ + get_row_format_name(row_format)); \ + ret = FALSE; \ + } + + /*****************************************************************//** Validates the create options. We may build on this function in future. For now, it checks two specifiers: @@ -6539,7 +6568,7 @@ create_options_are_valid( { ibool kbs_specified = FALSE; ibool ret = TRUE; - enum row_type row_type = form->s->row_type; + enum row_type row_format = form->s->row_type; ut_ad(thd != NULL); @@ -6548,23 +6577,6 @@ create_options_are_valid( return(TRUE); } - /* Check for a valid Innodb ROW_FORMAT specifier. For example, - ROW_TYPE_FIXED can be sent to Innodb */ - switch (row_type) { - case ROW_TYPE_COMPACT: - case ROW_TYPE_COMPRESSED: - case ROW_TYPE_DYNAMIC: - case ROW_TYPE_REDUNDANT: - case ROW_TYPE_DEFAULT: - break; - default: - push_warning( - thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: invalid ROW_FORMAT specifier."); - ret = FALSE; - } - ut_ad(form != NULL); ut_ad(create_info != NULL); @@ -6577,7 +6589,23 @@ create_options_are_valid( case 4: case 8: case 16: - /* Valid value. */ + /* Valid KEY_BLOCK_SIZE, check its dependencies. */ + if (!srv_file_per_table) { + push_warning( + thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_ILLEGAL_HA_CREATE_OPTION, + "InnoDB: KEY_BLOCK_SIZE requires" + " innodb_file_per_table."); + ret = FALSE; + } + if (srv_file_format < DICT_TF_FORMAT_ZIP) { + push_warning( + thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_ILLEGAL_HA_CREATE_OPTION, + "InnoDB: KEY_BLOCK_SIZE requires" + " innodb_file_format > Antelope."); + ret = FALSE; + } break; default: push_warning_printf( @@ -6587,72 +6615,43 @@ create_options_are_valid( " Valid values are [1, 2, 4, 8, 16]", create_info->key_block_size); ret = FALSE; + break; } } - /* If KEY_BLOCK_SIZE was specified, check for its - dependencies. */ - if (kbs_specified && !srv_file_per_table) { - push_warning( - thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: KEY_BLOCK_SIZE requires" - " innodb_file_per_table."); - ret = FALSE; - } - - if (kbs_specified && srv_file_format < DICT_TF_FORMAT_ZIP) { - push_warning( - thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: KEY_BLOCK_SIZE requires" - " innodb_file_format > Antelope."); - ret = FALSE; - } - - switch (row_type) { + /* Check for a valid Innodb ROW_FORMAT specifier and + other incompatibilities. */ + switch (row_format) { case ROW_TYPE_COMPRESSED: - case ROW_TYPE_DYNAMIC: - /* These two ROW_FORMATs require srv_file_per_table - and srv_file_format > Antelope */ - if (!srv_file_per_table) { - push_warning_printf( - thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: ROW_FORMAT=%s requires" - " innodb_file_per_table.", - get_row_format_name(row_type)); - ret = FALSE; - } - - if (srv_file_format < DICT_TF_FORMAT_ZIP) { - push_warning_printf( - thd, MYSQL_ERROR::WARN_LEVEL_WARN, - ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: ROW_FORMAT=%s requires" - " innodb_file_format > Antelope.", - get_row_format_name(row_type)); - ret = FALSE; - } - default: + CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE; + CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE; break; - } - - switch (row_type) { - case ROW_TYPE_REDUNDANT: - case ROW_TYPE_COMPACT: case ROW_TYPE_DYNAMIC: - /* KEY_BLOCK_SIZE is only allowed with Compressed or Default */ + CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE; + CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE; + /* fall through since dynamic also shuns KBS */ + case ROW_TYPE_COMPACT: + case ROW_TYPE_REDUNDANT: if (kbs_specified) { push_warning_printf( thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, "InnoDB: cannot specify ROW_FORMAT = %s" " with KEY_BLOCK_SIZE.", - get_row_format_name(row_type)); - ret = FALSE; + get_row_format_name(row_format)); + ret = FALSE; } - default: + break; + case ROW_TYPE_DEFAULT: + break; + case ROW_TYPE_FIXED: + case ROW_TYPE_PAGE: + case ROW_TYPE_NOT_USED: + push_warning( + thd, MYSQL_ERROR::WARN_LEVEL_WARN, + ER_ILLEGAL_HA_CREATE_OPTION, \ + "InnoDB: invalid ROW_FORMAT specifier."); + ret = FALSE; break; } @@ -6703,7 +6702,7 @@ ha_innobase::create( const ulint file_format = srv_file_format; const char* stmt; size_t stmt_len; - enum row_type row_type; + enum row_type row_format; DBUG_ENTER("ha_innobase::create"); @@ -6753,11 +6752,7 @@ ha_innobase::create( trx = innobase_trx_allocate(thd); - if (lower_case_table_names) { - srv_lower_case_table_names = TRUE; - } else { - srv_lower_case_table_names = FALSE; - } + srv_lower_case_table_names = lower_case_table_names; strcpy(name2, name); @@ -6821,20 +6816,19 @@ ha_innobase::create( push_warning_printf( thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, - "InnoDB: ignoring" - " KEY_BLOCK_SIZE=%lu.", + "InnoDB: ignoring KEY_BLOCK_SIZE=%lu.", create_info->key_block_size); } } - row_type = form->s->row_type; + row_format = form->s->row_type; if (flags) { /* if ROW_FORMAT is set to default, automatically change it to COMPRESSED.*/ - if (row_type == ROW_TYPE_DEFAULT) { - row_type = ROW_TYPE_COMPRESSED; - } else if (row_type != ROW_TYPE_COMPRESSED) { + if (row_format == ROW_TYPE_DEFAULT) { + row_format = ROW_TYPE_COMPRESSED; + } else if (row_format != ROW_TYPE_COMPRESSED) { /* ROW_FORMAT other than COMPRESSED ignores KEY_BLOCK_SIZE. It does not make sense to reject conflicting @@ -6851,7 +6845,7 @@ ha_innobase::create( } } else { /* flags == 0 means no KEY_BLOCK_SIZE.*/ - if (row_type == ROW_TYPE_COMPRESSED) { + if (row_format == ROW_TYPE_COMPRESSED) { /* ROW_FORMAT=COMPRESSED without KEY_BLOCK_SIZE implies half the maximum KEY_BLOCK_SIZE. */ @@ -6866,7 +6860,7 @@ ha_innobase::create( } } - switch (row_type) { + switch (row_format) { case ROW_TYPE_REDUNDANT: break; case ROW_TYPE_COMPRESSED: @@ -6877,25 +6871,25 @@ ha_innobase::create( ER_ILLEGAL_HA_CREATE_OPTION, "InnoDB: ROW_FORMAT=%s requires" " innodb_file_per_table.", - get_row_format_name(row_type)); + get_row_format_name(row_format)); } else if (file_format < DICT_TF_FORMAT_ZIP) { push_warning_printf( thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, "InnoDB: ROW_FORMAT=%s requires" " innodb_file_format > Antelope.", - get_row_format_name(row_type)); + get_row_format_name(row_format)); } else { flags |= DICT_TF_COMPACT - | (DICT_TF_FORMAT_ZIP - << DICT_TF_FORMAT_SHIFT); + | (DICT_TF_FORMAT_ZIP + << DICT_TF_FORMAT_SHIFT); break; } /* fall through */ case ROW_TYPE_NOT_USED: case ROW_TYPE_FIXED: - default: + case ROW_TYPE_PAGE: push_warning( thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_ILLEGAL_HA_CREATE_OPTION, @@ -7036,23 +7030,25 @@ ha_innobase::create( setup at this stage and so we use thd. */ /* We need to copy the AUTOINC value from the old table if - this is an ALTER TABLE or CREATE INDEX because CREATE INDEX - does a table copy too. */ + this is an ALTER|OPTIMIZE TABLE or CREATE INDEX because CREATE INDEX + does a table copy too. If query was one of : + + CREATE TABLE ...AUTO_INCREMENT = x; or + ALTER TABLE...AUTO_INCREMENT = x; or + OPTIMIZE TABLE t; or + CREATE INDEX x on t(...); + + Find out a table definition from the dictionary and get + the current value of the auto increment field. Set a new + value to the auto increment field if the value is greater + than the maximum value in the column. */ if (((create_info->used_fields & HA_CREATE_USED_AUTO) || thd_sql_command(thd) == SQLCOM_ALTER_TABLE + || thd_sql_command(thd) == SQLCOM_OPTIMIZE || thd_sql_command(thd) == SQLCOM_CREATE_INDEX) && create_info->auto_increment_value > 0) { - /* Query was one of : - CREATE TABLE ...AUTO_INCREMENT = x; or - ALTER TABLE...AUTO_INCREMENT = x; or - CREATE INDEX x on t(...); - Find out a table definition from the dictionary and get - the current value of the auto increment field. Set a new - value to the auto increment field if the value is greater - than the maximum value in the column. */ - auto_inc_value = create_info->auto_increment_value; dict_table_autoinc_lock(innobase_table); @@ -7181,11 +7177,7 @@ ha_innobase::delete_table( trx = innobase_trx_allocate(thd); - if (lower_case_table_names) { - srv_lower_case_table_names = TRUE; - } else { - srv_lower_case_table_names = FALSE; - } + srv_lower_case_table_names = lower_case_table_names; name_len = strlen(name); @@ -7308,11 +7300,7 @@ innobase_rename_table( char* norm_to; char* norm_from; - if (lower_case_table_names) { - srv_lower_case_table_names = TRUE; - } else { - srv_lower_case_table_names = FALSE; - } + srv_lower_case_table_names = lower_case_table_names; // Magic number 64 arbitrary norm_to = (char*) my_malloc(strlen(to) + 64, MYF(0)); @@ -7849,11 +7837,14 @@ ha_innobase::info_low( are asked by MySQL to avoid locking. Another reason to avoid the call is that it uses quite a lot of CPU. See Bug#38185. */ - if (flag & HA_STATUS_NO_LOCK) { + if (flag & HA_STATUS_NO_LOCK + || !(flag & HA_STATUS_VARIABLE_EXTRA)) { /* We do not update delete_length if no locking is requested so the "old" value can remain. delete_length is initialized to 0 in - the ha_statistics' constructor. */ + the ha_statistics' constructor. Also we only + need delete_length to be set when + HA_STATUS_VARIABLE_EXTRA is set */ } else if (UNIV_UNLIKELY (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE)) { /* Avoid accessing the tablespace if diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc index 9f0e465a4d9..709274bab16 100644 --- a/storage/innobase/handler/i_s.cc +++ b/storage/innobase/handler/i_s.cc @@ -495,8 +495,16 @@ fill_innodb_trx_from_cache( row->trx_mysql_thread_id)); /* trx_query */ - OK(field_store_string(fields[IDX_TRX_QUERY], - row->trx_query)); + if (row->trx_query) { + /* store will do appropriate character set + conversion check */ + fields[IDX_TRX_QUERY]->store( + row->trx_query, strlen(row->trx_query), + row->trx_query_cs); + fields[IDX_TRX_QUERY]->set_notnull(); + } else { + fields[IDX_TRX_QUERY]->set_null(); + } /* trx_operation_state */ OK(field_store_string(fields[IDX_TRX_OPERATION_STATE], diff --git a/storage/innobase/ibuf/ibuf0ibuf.c b/storage/innobase/ibuf/ibuf0ibuf.c index ab42f1ad4f3..0cec0318bf4 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.c +++ b/storage/innobase/ibuf/ibuf0ibuf.c @@ -656,22 +656,49 @@ ibuf_parse_bitmap_init( return(ptr); } #ifndef UNIV_HOTBACKUP +# ifdef UNIV_DEBUG +/** Gets the desired bits for a given page from a bitmap page. +@param page in: bitmap page +@param offset in: page whose bits to get +@param zs in: compressed page size in bytes; 0 for uncompressed pages +@param bit in: IBUF_BITMAP_FREE, IBUF_BITMAP_BUFFERED, ... +@param mtr in: mini-transaction holding an x-latch on the bitmap page +@return value of bits */ +# define ibuf_bitmap_page_get_bits(page, offset, zs, bit, mtr) \ + ibuf_bitmap_page_get_bits_low(page, offset, zs, \ + MTR_MEMO_PAGE_X_FIX, mtr, bit) +# else /* UNIV_DEBUG */ +/** Gets the desired bits for a given page from a bitmap page. +@param page in: bitmap page +@param offset in: page whose bits to get +@param zs in: compressed page size in bytes; 0 for uncompressed pages +@param bit in: IBUF_BITMAP_FREE, IBUF_BITMAP_BUFFERED, ... +@param mtr in: mini-transaction holding an x-latch on the bitmap page +@return value of bits */ +# define ibuf_bitmap_page_get_bits(page, offset, zs, bit, mtr) \ + ibuf_bitmap_page_get_bits_low(page, offset, zs, bit) +# endif /* UNIV_DEBUG */ + /********************************************************************//** Gets the desired bits for a given page from a bitmap page. @return value of bits */ UNIV_INLINE ulint -ibuf_bitmap_page_get_bits( -/*======================*/ +ibuf_bitmap_page_get_bits_low( +/*==========================*/ const page_t* page, /*!< in: bitmap page */ ulint page_no,/*!< in: page whose bits to get */ ulint zip_size,/*!< in: compressed page size in bytes; 0 for uncompressed pages */ - ulint bit, /*!< in: IBUF_BITMAP_FREE, +#ifdef UNIV_DEBUG + ulint latch_type, + /*!< in: MTR_MEMO_PAGE_X_FIX, + MTR_MEMO_BUF_FIX, ... */ + mtr_t* mtr, /*!< in: mini-transaction holding latch_type + on the bitmap page */ +#endif /* UNIV_DEBUG */ + ulint bit) /*!< in: IBUF_BITMAP_FREE, IBUF_BITMAP_BUFFERED, ... */ - mtr_t* mtr __attribute__((unused))) - /*!< in: mtr containing an - x-latch to the bitmap page */ { ulint byte_offset; ulint bit_offset; @@ -683,7 +710,7 @@ ibuf_bitmap_page_get_bits( # error "IBUF_BITS_PER_PAGE % 2 != 0" #endif ut_ad(ut_is_2pow(zip_size)); - ut_ad(mtr_memo_contains_page(mtr, page, MTR_MEMO_PAGE_X_FIX)); + ut_ad(mtr_memo_contains_page(mtr, page, latch_type)); if (!zip_size) { bit_offset = (page_no % UNIV_PAGE_SIZE) * IBUF_BITS_PER_PAGE @@ -1109,21 +1136,29 @@ Must not be called when recv_no_ibuf_operations==TRUE. @return TRUE if level 2 or level 3 page */ UNIV_INTERN ibool -ibuf_page( -/*======*/ - ulint space, /*!< in: space id */ - ulint zip_size,/*!< in: compressed page size in bytes, or 0 */ - ulint page_no,/*!< in: page number */ - mtr_t* mtr) /*!< in: mtr which will contain an x-latch to the - bitmap page if the page is not one of the fixed - address ibuf pages, or NULL, in which case a new - transaction is created. */ +ibuf_page_low( +/*==========*/ + ulint space, /*!< in: space id */ + ulint zip_size,/*!< in: compressed page size in bytes, or 0 */ + ulint page_no,/*!< in: page number */ +#ifdef UNIV_DEBUG + ibool x_latch,/*!< in: FALSE if relaxed check + (avoid latching the bitmap page) */ +#endif /* UNIV_DEBUG */ + const char* file, /*!< in: file name */ + ulint line, /*!< in: line where called */ + mtr_t* mtr) /*!< in: mtr which will contain an + x-latch to the bitmap page if the page + is not one of the fixed address ibuf + pages, or NULL, in which case a new + transaction is created. */ { ibool ret; mtr_t local_mtr; page_t* bitmap_page; ut_ad(!recv_no_ibuf_operations); + ut_ad(x_latch || mtr == NULL); if (ibuf_fixed_addr_page(space, zip_size, page_no)) { @@ -1135,12 +1170,55 @@ ibuf_page( ut_ad(fil_space_get_type(IBUF_SPACE_ID) == FIL_TABLESPACE); +#ifdef UNIV_DEBUG + if (!x_latch) { + mtr_start(&local_mtr); + + /* Get the bitmap page without a page latch, so that + we will not be violating the latching order when + another bitmap page has already been latched by this + thread. The page will be buffer-fixed, and thus it + cannot be removed or relocated while we are looking at + it. The contents of the page could change, but the + IBUF_BITMAP_IBUF bit that we are interested in should + not be modified by any other thread. Nobody should be + calling ibuf_add_free_page() or ibuf_remove_free_page() + while the page is linked to the insert buffer b-tree. */ + + bitmap_page = buf_block_get_frame( + buf_page_get_gen( + space, zip_size, + ibuf_bitmap_page_no_calc(zip_size, page_no), + RW_NO_LATCH, NULL, BUF_GET_NO_LATCH, + file, line, &local_mtr)); +# ifdef UNIV_SYNC_DEBUG + /* This is for tracking Bug #58212. This check and message can + be removed once it has been established that our assumptions + about this condition are correct. The bug was only a one-time + occurrence, unable to repeat since then. */ + void* latch = sync_thread_levels_contains(SYNC_IBUF_BITMAP); + if (latch) { + fprintf(stderr, "Bug#58212 UNIV_SYNC_DEBUG" + " levels %p (%u,%u)\n", + latch, (unsigned) space, (unsigned) page_no); + } +# endif /* UNIV_SYNC_DEBUG */ + ret = ibuf_bitmap_page_get_bits_low( + bitmap_page, page_no, zip_size, + MTR_MEMO_BUF_FIX, &local_mtr, IBUF_BITMAP_IBUF); + + mtr_commit(&local_mtr); + return(ret); + } +#endif /* UNIV_DEBUG */ + if (mtr == NULL) { mtr = &local_mtr; mtr_start(mtr); } - bitmap_page = ibuf_bitmap_get_map_page(space, page_no, zip_size, mtr); + bitmap_page = ibuf_bitmap_get_map_page_func(space, page_no, zip_size, + file, line, mtr); ret = ibuf_bitmap_page_get_bits(bitmap_page, page_no, zip_size, IBUF_BITMAP_IBUF, mtr); diff --git a/storage/innobase/include/btr0cur.h b/storage/innobase/include/btr0cur.h index 9865ebfbfc2..cb65c6bfab7 100644 --- a/storage/innobase/include/btr0cur.h +++ b/storage/innobase/include/btr0cur.h @@ -333,10 +333,14 @@ ulint btr_cur_del_mark_set_clust_rec( /*===========================*/ ulint flags, /*!< in: undo logging and locking flags */ - btr_cur_t* cursor, /*!< in: cursor */ + buf_block_t* block, /*!< in/out: buffer block of the record */ + rec_t* rec, /*!< in/out: record */ + dict_index_t* index, /*!< in: clustered index of the record */ + const ulint* offsets,/*!< in: rec_get_offsets(rec) */ ibool val, /*!< in: value to set */ que_thr_t* thr, /*!< in: query thread */ - mtr_t* mtr); /*!< in: mtr */ + mtr_t* mtr) /*!< in: mtr */ + __attribute__((nonnull)); /***********************************************************//** Sets a secondary index record delete mark to TRUE or FALSE. @return DB_SUCCESS, DB_LOCK_WAIT, or error number */ @@ -469,40 +473,22 @@ btr_estimate_number_of_different_key_vals( /*======================================*/ dict_index_t* index); /*!< in: index */ /*******************************************************************//** -Marks not updated extern fields as not-owned by this record. The ownership -is transferred to the updated record which is inserted elsewhere in the +Marks non-updated off-page fields as disowned by this record. The ownership +must be transferred to the updated record which is inserted elsewhere in the index tree. In purge only the owner of externally stored field is allowed -to free the field. -@return TRUE if BLOB ownership was transferred */ +to free the field. */ UNIV_INTERN -ibool -btr_cur_mark_extern_inherited_fields( -/*=================================*/ +void +btr_cur_disown_inherited_fields( +/*============================*/ page_zip_des_t* page_zip,/*!< in/out: compressed page whose uncompressed part will be updated, or NULL */ rec_t* rec, /*!< in/out: record in a clustered index */ dict_index_t* index, /*!< in: index of the page */ const ulint* offsets,/*!< in: array returned by rec_get_offsets() */ const upd_t* update, /*!< in: update vector */ - mtr_t* mtr); /*!< in: mtr, or NULL if not logged */ -/*******************************************************************//** -The complement of the previous function: in an update entry may inherit -some externally stored fields from a record. We must mark them as inherited -in entry, so that they are not freed in a rollback. */ -UNIV_INTERN -void -btr_cur_mark_dtuple_inherited_extern( -/*=================================*/ - dtuple_t* entry, /*!< in/out: updated entry to be - inserted to clustered index */ - const upd_t* update); /*!< in: update vector */ -/*******************************************************************//** -Marks all extern fields in a dtuple as owned by the record. */ -UNIV_INTERN -void -btr_cur_unmark_dtuple_extern_fields( -/*================================*/ - dtuple_t* entry); /*!< in/out: clustered index entry */ + mtr_t* mtr) /*!< in/out: mini-transaction */ + __attribute__((nonnull(2,3,4,5,6))); /*******************************************************************//** Stores the fields in big_rec_vec to the tablespace and puts pointers to them in rec. The extern flags in rec will have to be set beforehand. diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index a42eba57fd2..46cae25f0f5 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -116,6 +116,76 @@ enum buf_page_state { before putting to the free list */ }; + +/** This structure defines information we will fetch from each buffer pool. It +will be used to print table IO stats */ +struct buf_pool_info_struct{ + /* General buffer pool info */ + ulint pool_unique_id; /*!< Buffer Pool ID */ + ulint pool_size; /*!< Buffer Pool size in pages */ + ulint lru_len; /*!< Length of buf_pool->LRU */ + ulint old_lru_len; /*!< buf_pool->LRU_old_len */ + ulint free_list_len; /*!< Length of buf_pool->free list */ + ulint flush_list_len; /*!< Length of buf_pool->flush_list */ + ulint n_pend_unzip; /*!< buf_pool->n_pend_unzip, pages + pending decompress */ + ulint n_pend_reads; /*!< buf_pool->n_pend_reads, pages + pending read */ + ulint n_pending_flush_lru; /*!< Pages pending flush in LRU */ + ulint n_pending_flush_list; /*!< Pages pending flush in FLUSH + LIST */ + ulint n_pending_flush_single_page;/*!< Pages pending flush in + BUF_FLUSH_SINGLE_PAGE list */ + ulint n_pages_made_young; /*!< number of pages made young */ + ulint n_pages_not_made_young; /*!< number of pages not made young */ + ulint n_pages_read; /*!< buf_pool->n_pages_read */ + ulint n_pages_created; /*!< buf_pool->n_pages_created */ + ulint n_pages_written; /*!< buf_pool->n_pages_written */ + ulint n_page_gets; /*!< buf_pool->n_page_gets */ + ulint n_ra_pages_read; /*!< buf_pool->n_ra_pages_read, number + of pages readahead */ + ulint n_ra_pages_evicted; /*!< buf_pool->n_ra_pages_evicted, + number of readahead pages evicted + without access */ + ulint n_page_get_delta; /*!< num of buffer pool page gets since + last printout */ + + /* Buffer pool access stats */ + double page_made_young_rate; /*!< page made young rate in pages + per second */ + double page_not_made_young_rate;/*!< page not made young rate + in pages per second */ + double pages_read_rate; /*!< num of pages read per second */ + double pages_created_rate; /*!< num of pages create per second */ + double pages_written_rate; /*!< num of pages written per second */ + ulint page_read_delta; /*!< num of pages read since last + printout */ + ulint young_making_delta; /*!< num of pages made young since + last printout */ + ulint not_young_making_delta; /*!< num of pages not make young since + last printout */ + + /* Statistics about read ahead algorithm. */ + double pages_readahead_rate; /*!< readahead rate in pages per + second */ + double pages_evicted_rate; /*!< rate of readahead page evicted + without access, in pages per second */ + + /* Stats about LRU eviction */ + ulint unzip_lru_len; /*!< length of buf_pool->unzip_LRU + list */ + /* Counters for LRU policy */ + ulint io_sum; /*!< buf_LRU_stat_sum.io */ + ulint io_cur; /*!< buf_LRU_stat_cur.io, num of IO + for current interval */ + ulint unzip_sum; /*!< buf_LRU_stat_sum.unzip */ + ulint unzip_cur; /*!< buf_LRU_stat_cur.unzip, num + pages decompressed in current + interval */ +}; + +typedef struct buf_pool_info_struct buf_pool_info_t; + #ifndef UNIV_HOTBACKUP /********************************************************************//** Acquire mutex on all buffer pool instances */ diff --git a/storage/innobase/include/data0data.h b/storage/innobase/include/data0data.h index 11e4027777a..f7bdd29ed90 100644 --- a/storage/innobase/include/data0data.h +++ b/storage/innobase/include/data0data.h @@ -154,14 +154,19 @@ dfield_dup( dfield_t* field, /*!< in/out: data field */ mem_heap_t* heap); /*!< in: memory heap where allocated */ /*********************************************************************//** -Tests if data length and content is equal for two dfields. -@return TRUE if equal */ +Tests if two data fields are equal. +If len==0, tests the data length and content for equality. +If len>0, tests the first len bytes of the content for equality. +@return TRUE if both fields are NULL or if they are equal */ UNIV_INLINE ibool dfield_datas_are_binary_equal( /*==========================*/ const dfield_t* field1, /*!< in: field */ - const dfield_t* field2);/*!< in: field */ + const dfield_t* field2, /*!< in: field */ + ulint len) /*!< in: maximum prefix to compare, + or 0 to compare the whole field length */ + __attribute__((nonnull, warn_unused_result)); /*********************************************************************//** Tests if dfield data length and content is equal to the given. @return TRUE if equal */ diff --git a/storage/innobase/include/data0data.ic b/storage/innobase/include/data0data.ic index 2e3adf4b707..5c0f8039c80 100644 --- a/storage/innobase/include/data0data.ic +++ b/storage/innobase/include/data0data.ic @@ -229,20 +229,30 @@ dfield_dup( } /*********************************************************************//** -Tests if data length and content is equal for two dfields. -@return TRUE if equal */ +Tests if two data fields are equal. +If len==0, tests the data length and content for equality. +If len>0, tests the first len bytes of the content for equality. +@return TRUE if both fields are NULL or if they are equal */ UNIV_INLINE ibool dfield_datas_are_binary_equal( /*==========================*/ const dfield_t* field1, /*!< in: field */ - const dfield_t* field2) /*!< in: field */ + const dfield_t* field2, /*!< in: field */ + ulint len) /*!< in: maximum prefix to compare, + or 0 to compare the whole field length */ { - ulint len; + ulint len2 = len; - len = field1->len; + if (field1->len == UNIV_SQL_NULL || len == 0 || field1->len < len) { + len = field1->len; + } - return(len == field2->len + if (field2->len == UNIV_SQL_NULL || len2 == 0 || field2->len < len2) { + len2 = field2->len; + } + + return(len == len2 && (len == UNIV_SQL_NULL || !memcmp(field1->data, field2->data, len))); } diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index d448e57e395..7526e4dc8dc 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -238,6 +238,26 @@ dict_foreign_t* dict_mem_foreign_create(void); /*=========================*/ +/**********************************************************************//** +Sets the foreign_table_name_lookup pointer based on the value of +srv_lower_case_table_names. */ +UNIV_INTERN +void +dict_mem_foreign_table_name_lookup_set( +/*===================================*/ + dict_foreign_t* foreign, /*!< in/out: foreign struct */ + ibool do_alloc); /*!< in: is an alloc needed */ + +/**********************************************************************//** +Sets the reference_table_name_lookup pointer based on the value of +srv_lower_case_table_names. */ +UNIV_INTERN +void +dict_mem_referenced_table_name_lookup_set( +/*======================================*/ + dict_foreign_t* foreign, /*!< in/out: foreign struct */ + ibool do_alloc); /*!< in: is an alloc needed */ + /** Data structure for a column in a table */ struct dict_col_struct{ /*----------------------*/ @@ -393,10 +413,14 @@ struct dict_foreign_struct{ unsigned type:6; /*!< 0 or DICT_FOREIGN_ON_DELETE_CASCADE or DICT_FOREIGN_ON_DELETE_SET_NULL */ char* foreign_table_name;/*!< foreign table name */ + char* foreign_table_name_lookup; + /*!< foreign table name used for dict lookup */ dict_table_t* foreign_table; /*!< table where the foreign key is */ const char** foreign_col_names;/*!< names of the columns in the foreign key */ char* referenced_table_name;/*!< referenced table name */ + char* referenced_table_name_lookup; + /*!< referenced table name for dict lookup*/ dict_table_t* referenced_table;/*!< table where the referenced key is */ const char** referenced_col_names;/*!< names of the referenced diff --git a/storage/innobase/include/ibuf0ibuf.h b/storage/innobase/include/ibuf0ibuf.h index dd05bcb0608..330efae780c 100644 --- a/storage/innobase/include/ibuf0ibuf.h +++ b/storage/innobase/include/ibuf0ibuf.h @@ -244,15 +244,44 @@ Must not be called when recv_no_ibuf_operations==TRUE. @return TRUE if level 2 or level 3 page */ UNIV_INTERN ibool -ibuf_page( -/*======*/ - ulint space, /*!< in: space id */ - ulint zip_size,/*!< in: compressed page size in bytes, or 0 */ - ulint page_no,/*!< in: page number */ - mtr_t* mtr); /*!< in: mtr which will contain an x-latch to the - bitmap page if the page is not one of the fixed - address ibuf pages, or NULL, in which case a new - transaction is created. */ +ibuf_page_low( +/*==========*/ + ulint space, /*!< in: space id */ + ulint zip_size,/*!< in: compressed page size in bytes, or 0 */ + ulint page_no,/*!< in: page number */ +#ifdef UNIV_DEBUG + ibool x_latch,/*!< in: FALSE if relaxed check + (avoid latching the bitmap page) */ +#endif /* UNIV_DEBUG */ + const char* file, /*!< in: file name */ + ulint line, /*!< in: line where called */ + mtr_t* mtr) /*!< in: mtr which will contain an + x-latch to the bitmap page if the page + is not one of the fixed address ibuf + pages, or NULL, in which case a new + transaction is created. */ + __attribute__((warn_unused_result)); +#ifdef UNIV_DEBUG +/** Checks if a page is a level 2 or 3 page in the ibuf hierarchy of +pages. Must not be called when recv_no_ibuf_operations==TRUE. +@param space tablespace identifier +@param zip_size compressed page size in bytes, or 0 +@param page_no page number +@param mtr mini-transaction or NULL +@return TRUE if level 2 or level 3 page */ +# define ibuf_page(space, zip_size, page_no, mtr) \ + ibuf_page_low(space, zip_size, page_no, TRUE, __FILE__, __LINE__, mtr) +#else /* UVIV_DEBUG */ +/** Checks if a page is a level 2 or 3 page in the ibuf hierarchy of +pages. Must not be called when recv_no_ibuf_operations==TRUE. +@param space tablespace identifier +@param zip_size compressed page size in bytes, or 0 +@param page_no page number +@param mtr mini-transaction or NULL +@return TRUE if level 2 or level 3 page */ +# define ibuf_page(space, zip_size, page_no, mtr) \ + ibuf_page_low(space, zip_size, page_no, __FILE__, __LINE__, mtr) +#endif /* UVIV_DEBUG */ /***********************************************************************//** Frees excess pages from the ibuf free list. This function is called when an OS thread calls fsp services to allocate a new file segment, or a new page to a diff --git a/storage/innobase/include/mem0mem.ic b/storage/innobase/include/mem0mem.ic index cbce2edc661..d214c3fe6c9 100644 --- a/storage/innobase/include/mem0mem.ic +++ b/storage/innobase/include/mem0mem.ic @@ -350,27 +350,27 @@ mem_heap_get_top( ulint n) /*!< in: size of the topmost element */ { mem_block_t* block; - void* buf; + byte* buf; ut_ad(mem_heap_check(heap)); block = UT_LIST_GET_LAST(heap->base); - buf = (byte*)block + mem_block_get_free(block) - MEM_SPACE_NEEDED(n); + buf = (byte*) block + mem_block_get_free(block) - MEM_SPACE_NEEDED(n); #ifdef UNIV_MEM_DEBUG - ut_ad(mem_block_get_start(block) <=(ulint)((byte*)buf - (byte*)block)); + ut_ad(mem_block_get_start(block) <= (ulint) (buf - (byte*) block)); /* In the debug version, advance buf to point at the storage which was given to the caller in the allocation*/ - buf = (byte*)buf + MEM_FIELD_HEADER_SIZE; + buf += MEM_FIELD_HEADER_SIZE; /* Check that the field lengths agree */ - ut_ad(n == (ulint)mem_field_header_get_len(buf)); + ut_ad(n == mem_field_header_get_len(buf)); #endif - return(buf); + return((void*) buf); } /*****************************************************************//** diff --git a/storage/innobase/include/mtr0mtr.ic b/storage/innobase/include/mtr0mtr.ic index 18f8e87b3cf..55f3cf7f147 100644 --- a/storage/innobase/include/mtr0mtr.ic +++ b/storage/innobase/include/mtr0mtr.ic @@ -160,7 +160,7 @@ mtr_memo_contains( while (offset > 0) { offset -= sizeof(mtr_memo_slot_t); - slot = dyn_array_get_element(memo, offset); + slot = (mtr_memo_slot_t*) dyn_array_get_element(memo, offset); if ((object == slot->object) && (type == slot->type)) { diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index 6d95b280330..fb13120a481 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -373,6 +373,7 @@ typedef HANDLE os_file_dir_t; /*!< directory stream */ typedef DIR* os_file_dir_t; /*!< directory stream */ #endif +#ifdef __WIN__ /***********************************************************************//** Gets the operating system version. Currently works only on Windows. @return OS_WIN95, OS_WIN31, OS_WINNT, OS_WIN2000, OS_WINXP, OS_WINVISTA, @@ -381,6 +382,7 @@ UNIV_INTERN ulint os_get_os_version(void); /*===================*/ +#endif /* __WIN__ */ #ifndef UNIV_HOTBACKUP /****************************************************************//** Creates the seek mutexes used in positioned reads and writes. */ diff --git a/storage/innobase/include/row0upd.h b/storage/innobase/include/row0upd.h index 051beb09277..9c2e003c609 100644 --- a/storage/innobase/include/row0upd.h +++ b/storage/innobase/include/row0upd.h @@ -286,10 +286,13 @@ row_upd_changes_ord_field_binary( row and the data values in update are not known when this function is called, e.g., at compile time */ + const row_ext_t*ext, /*!< NULL, or prefixes of the externally + stored columns in the old row */ dict_index_t* index, /*!< in: index of the record */ - const upd_t* update);/*!< in: update vector for the row; NOTE: the + const upd_t* update) /*!< in: update vector for the row; NOTE: the field numbers in this MUST be clustered index positions! */ + __attribute__((nonnull(3,4), warn_unused_result)); /***********************************************************//** Checks if an update vector changes an ordering field of an index record. This function is fast if the update vector is short or the number of ordering @@ -462,11 +465,16 @@ struct upd_node_struct{ #define UPD_NODE_INSERT_CLUSTERED 3 /* clustered index record should be inserted, old record is already delete marked */ -#define UPD_NODE_UPDATE_ALL_SEC 4 /* an ordering field of the clustered +#define UPD_NODE_INSERT_BLOB 4 /* clustered index record should be + inserted, old record is already + delete-marked; non-updated BLOBs + should be inherited by the new record + and disowned by the old record */ +#define UPD_NODE_UPDATE_ALL_SEC 5 /* an ordering field of the clustered index record was changed, or this is a delete operation: should update all the secondary index records */ -#define UPD_NODE_UPDATE_SOME_SEC 5 /* secondary index entries should be +#define UPD_NODE_UPDATE_SOME_SEC 6 /* secondary index entries should be looked at and updated if an ordering field changed */ diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index 98b07f5e893..612ff4c6e54 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -71,8 +71,8 @@ at a time */ #define SRV_AUTO_EXTEND_INCREMENT \ (srv_auto_extend_increment * ((1024 * 1024) / UNIV_PAGE_SIZE)) -/* This is set to TRUE if the MySQL user has set it in MySQL */ -extern ibool srv_lower_case_table_names; +/* This is set to the MySQL server value for this variable. */ +extern uint srv_lower_case_table_names; /* Mutex for locking srv_monitor_file */ extern mutex_t srv_monitor_file_mutex; @@ -476,6 +476,14 @@ enum srv_thread_type srv_get_thread_type(void); /*=====================*/ /*********************************************************************//** +Check whether thread type has reserved a slot. +@return slot number or UNDEFINED if not found*/ +UNIV_INTERN +ulint +srv_thread_has_reserved_slot( +/*=========================*/ + enum srv_thread_type type); /*!< in: thread type to check */ +/*********************************************************************//** Sets the info describing an i/o thread current state. */ UNIV_INTERN void diff --git a/storage/innobase/include/sync0rw.h b/storage/innobase/include/sync0rw.h index 70471186f6d..5988fdfb382 100644 --- a/storage/innobase/include/sync0rw.h +++ b/storage/innobase/include/sync0rw.h @@ -122,6 +122,7 @@ extern mysql_pfs_key_t checkpoint_lock_key; extern mysql_pfs_key_t trx_i_s_cache_lock_key; extern mysql_pfs_key_t trx_purge_latch_key; extern mysql_pfs_key_t index_tree_rw_lock_key; +extern mysql_pfs_key_t dict_table_stats_latch_key; #endif /* UNIV_PFS_RWLOCK */ diff --git a/storage/innobase/include/trx0i_s.h b/storage/innobase/include/trx0i_s.h index 8f8b7367fb0..73896a3cb76 100644 --- a/storage/innobase/include/trx0i_s.h +++ b/storage/innobase/include/trx0i_s.h @@ -140,6 +140,9 @@ struct i_s_trx_row_struct { ulint trx_mysql_thread_id; /*!< thd_get_thread_id() */ const char* trx_query; /*!< MySQL statement being executed in the transaction */ + struct charset_info_st* trx_query_cs; + /*!< charset encode the MySQL + statement */ const char* trx_operation_state; /*!< trx_struct::op_info */ ulint trx_tables_in_use;/*!< n_mysql_tables_in_use in trx_struct */ diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index 9cf823c2ff3..4470d221da9 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -44,9 +44,14 @@ Created 1/20/1994 Heikki Tuuri #include "hb_univ.i" #endif /* UNIV_HOTBACKUP */ +/* aux macros to convert M into "123" (string) if M is defined like +#define M 123 */ +#define _IB_TO_STR(s) #s +#define IB_TO_STR(s) _IB_TO_STR(s) + #define INNODB_VERSION_MAJOR 1 #define INNODB_VERSION_MINOR 1 -#define INNODB_VERSION_BUGFIX 4 +#define INNODB_VERSION_BUGFIX 5 /* The following is the InnoDB version as shown in SELECT plugin_version FROM information_schema.plugins; @@ -57,16 +62,14 @@ component, i.e. we show M.N.P as M.N */ #define INNODB_VERSION_SHORT \ (INNODB_VERSION_MAJOR << 8 | INNODB_VERSION_MINOR) -/* auxiliary macros to help creating the version as string */ -#define __INNODB_VERSION(a, b, c) (#a "." #b "." #c) -#define _INNODB_VERSION(a, b, c) __INNODB_VERSION(a, b, c) - #define INNODB_VERSION_STR \ - _INNODB_VERSION(INNODB_VERSION_MAJOR, \ - INNODB_VERSION_MINOR, \ - INNODB_VERSION_BUGFIX) + IB_TO_STR(INNODB_VERSION_MAJOR) "." \ + IB_TO_STR(INNODB_VERSION_MINOR) "." \ + IB_TO_STR(INNODB_VERSION_BUGFIX) -#define REFMAN "http://dev.mysql.com/doc/refman/5.1/en/" +#define REFMAN "http://dev.mysql.com/doc/refman/" \ + IB_TO_STR(MYSQL_MAJOR_VERSION) "." \ + IB_TO_STR(MYSQL_MINOR_VERSION) "/en/" #ifdef MYSQL_DYNAMIC_PLUGIN /* In the dynamic plugin, redefine some externally visible symbols @@ -250,7 +253,7 @@ easy way to get it to work. See http://bugs.mysql.com/bug.php?id=52263. */ # define UNIV_INTERN #endif -#if (!defined(UNIV_DEBUG) && !defined(UNIV_MUST_NOT_INLINE)) +#ifndef UNIV_MUST_NOT_INLINE /* Definition for inline version */ #ifdef __WIN__ diff --git a/storage/innobase/include/ut0ut.h b/storage/innobase/include/ut0ut.h index dd59b3eba46..cd5c7ca99f1 100644 --- a/storage/innobase/include/ut0ut.h +++ b/storage/innobase/include/ut0ut.h @@ -55,24 +55,24 @@ Created 1/20/1994 Heikki Tuuri typedef time_t ib_time_t; #ifndef UNIV_HOTBACKUP -#if defined(HAVE_IB_PAUSE_INSTRUCTION) -# ifdef WIN32 - /* In the Win32 API, the x86 PAUSE instruction is executed by calling - the YieldProcessor macro defined in WinNT.h. It is a CPU architecture- - independent way by using YieldProcessor.*/ -# define UT_RELAX_CPU() YieldProcessor() -# else - /* According to the gcc info page, asm volatile means that the - instruction has important side-effects and must not be removed. - Also asm volatile may trigger a memory barrier (spilling all registers - to memory). */ -# define UT_RELAX_CPU() __asm__ __volatile__ ("pause") -# endif +#if defined(HAVE_PAUSE_INSTRUCTION) + /* According to the gcc info page, asm volatile means that the + instruction has important side-effects and must not be removed. + Also asm volatile may trigger a memory barrier (spilling all registers + to memory). */ +# define UT_RELAX_CPU() __asm__ __volatile__ ("pause") +#elif defined(HAVE_FAKE_PAUSE_INSTRUCTION) +# define UT_RELAX_CPU() __asm__ __volatile__ ("rep; nop") #elif defined(HAVE_ATOMIC_BUILTINS) # define UT_RELAX_CPU() do { \ volatile lint volatile_var; \ os_compare_and_swap_lint(&volatile_var, 0, 1); \ } while (0) +#elif defined(HAVE_WINDOWS_ATOMICS) + /* In the Win32 API, the x86 PAUSE instruction is executed by calling + the YieldProcessor macro defined in WinNT.h. It is a CPU architecture- + independent way by using YieldProcessor. */ +# define UT_RELAX_CPU() YieldProcessor() #else # define UT_RELAX_CPU() ((void)0) /* avoid warning for an empty statement */ #endif diff --git a/storage/innobase/log/log0recv.c b/storage/innobase/log/log0recv.c index 5d5caf1b48a..f9e0fecb6c6 100644 --- a/storage/innobase/log/log0recv.c +++ b/storage/innobase/log/log0recv.c @@ -2199,7 +2199,7 @@ recv_report_corrupt_log( "InnoDB: far enough in recovery! Please run CHECK TABLE\n" "InnoDB: on your InnoDB tables to check that they are ok!\n" "InnoDB: If mysqld crashes after this recovery, look at\n" - "InnoDB: " REFMAN "forcing-recovery.html\n" + "InnoDB: " REFMAN "forcing-innodb-recovery.html\n" "InnoDB: about forcing recovery.\n", stderr); fflush(stderr); diff --git a/storage/innobase/os/os0file.c b/storage/innobase/os/os0file.c index 93d2f72746d..74dbac3bc96 100644 --- a/storage/innobase/os/os0file.c +++ b/storage/innobase/os/os0file.c @@ -302,6 +302,36 @@ UNIV_INTERN ulint os_n_pending_writes = 0; /** Number of pending read operations */ UNIV_INTERN ulint os_n_pending_reads = 0; +#ifdef UNIV_DEBUG +/**********************************************************************//** +Validates the consistency the aio system some of the time. +@return TRUE if ok or the check was skipped */ +UNIV_INTERN +ibool +os_aio_validate_skip(void) +/*======================*/ +{ +/** Try os_aio_validate() every this many times */ +# define OS_AIO_VALIDATE_SKIP 13 + + /** The os_aio_validate() call skip counter. + Use a signed type because of the race condition below. */ + static int os_aio_validate_count = OS_AIO_VALIDATE_SKIP; + + /* There is a race condition below, but it does not matter, + because this call is only for heuristic purposes. We want to + reduce the call frequency of the costly os_aio_validate() + check in debug builds. */ + if (--os_aio_validate_count > 0) { + return(TRUE); + } + + os_aio_validate_count = OS_AIO_VALIDATE_SKIP; + return(os_aio_validate()); +} +#endif /* UNIV_DEBUG */ + +#ifdef __WIN__ /***********************************************************************//** Gets the operating system version. Currently works only on Windows. @return OS_WIN95, OS_WIN31, OS_WINNT, OS_WIN2000, OS_WINXP, OS_WINVISTA, @@ -311,7 +341,6 @@ ulint os_get_os_version(void) /*===================*/ { -#ifdef __WIN__ OSVERSIONINFO os_info; os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); @@ -340,12 +369,8 @@ os_get_os_version(void) ut_error; return(0); } -#else - ut_error; - - return(0); -#endif } +#endif /* __WIN__ */ /***********************************************************************//** Retrieves the last error number if an error occurs in a file io function. @@ -4008,7 +4033,7 @@ os_aio_func( ut_ad(n > 0); ut_ad(n % OS_FILE_LOG_BLOCK_SIZE == 0); ut_ad(offset % OS_FILE_LOG_BLOCK_SIZE == 0); - ut_ad(os_aio_validate()); + ut_ad(os_aio_validate_skip()); #ifdef WIN_ASYNC_IO ut_ad((n & 0xFFFFFFFFUL) == n); #endif @@ -4210,7 +4235,7 @@ os_aio_windows_handle( /* NOTE! We only access constant fields in os_aio_array. Therefore we do not have to acquire the protecting mutex yet */ - ut_ad(os_aio_validate()); + ut_ad(os_aio_validate_skip()); ut_ad(segment < array->n_segments); n = array->n_slots / array->n_segments; @@ -4630,7 +4655,7 @@ restart: srv_set_io_thread_op_info(global_segment, "looking for i/o requests (a)"); - ut_ad(os_aio_validate()); + ut_ad(os_aio_validate_skip()); ut_ad(segment < array->n_segments); n = array->n_slots / array->n_segments; diff --git a/storage/innobase/row/row0ins.c b/storage/innobase/row/row0ins.c index 09ae80adff4..dbfba358f9f 100644 --- a/storage/innobase/row/row0ins.c +++ b/storage/innobase/row/row0ins.c @@ -1525,7 +1525,7 @@ row_ins_check_foreign_constraints( if (foreign->foreign_index == index) { if (foreign->referenced_table == NULL) { - dict_table_get(foreign->referenced_table_name, + dict_table_get(foreign->referenced_table_name_lookup, FALSE); } diff --git a/storage/innobase/row/row0mysql.c b/storage/innobase/row/row0mysql.c index 709750fc4e7..63f30276df6 100644 --- a/storage/innobase/row/row0mysql.c +++ b/storage/innobase/row/row0mysql.c @@ -632,7 +632,7 @@ handle_new_error: "InnoDB: If the mysqld server crashes" " after the startup or when\n" "InnoDB: you dump the tables, look at\n" - "InnoDB: " REFMAN "forcing-recovery.html" + "InnoDB: " REFMAN "forcing-innodb-recovery.html" " for help.\n", stderr); break; case DB_FOREIGN_EXCEED_MAX_CASCADE: @@ -3163,7 +3163,7 @@ check_next_foreign: if (foreign && trx->check_foreigns && !(drop_db && dict_tables_have_same_db( - name, foreign->foreign_table_name))) { + name, foreign->foreign_table_name_lookup))) { FILE* ef = dict_foreign_err_file; /* We only allow dropping a referenced table if diff --git a/storage/innobase/row/row0purge.c b/storage/innobase/row/row0purge.c index 031b5258e98..08abc8a3e59 100644 --- a/storage/innobase/row/row0purge.c +++ b/storage/innobase/row/row0purge.c @@ -515,7 +515,7 @@ row_purge_upd_exist_or_extern( while (node->index != NULL) { index = node->index; - if (row_upd_changes_ord_field_binary(NULL, node->index, + if (row_upd_changes_ord_field_binary(NULL, NULL, node->index, node->update)) { /* Build the older version of the index entry */ entry = row_build_index_entry(node->row, NULL, diff --git a/storage/innobase/row/row0umod.c b/storage/innobase/row/row0umod.c index aef653b3150..0d4c42b958c 100644 --- a/storage/innobase/row/row0umod.c +++ b/storage/innobase/row/row0umod.c @@ -693,19 +693,18 @@ row_undo_mod_upd_exist_sec( while (node->index != NULL) { index = node->index; - if (row_upd_changes_ord_field_binary(node->row, node->index, - node->update)) { + if (row_upd_changes_ord_field_binary( + node->row, node->ext, node->index, node->update)) { /* Build the newest version of the index entry */ entry = row_build_index_entry(node->row, node->ext, index, heap); if (UNIV_UNLIKELY(!entry)) { /* The server must have crashed in - row_upd_clust_rec_by_insert(), in - row_ins_index_entry_low() before - btr_store_big_rec_extern_fields() - has written the externally stored columns - (BLOBs) of the new clustered index entry. */ + row_upd_clust_rec_by_insert() before + the updated externally stored columns (BLOBs) + of the new clustered index entry were + written. */ /* The table must be in DYNAMIC or COMPRESSED format. REDUNDANT and COMPACT formats diff --git a/storage/innobase/row/row0upd.c b/storage/innobase/row/row0upd.c index 81750938f58..03ed40c6647 100644 --- a/storage/innobase/row/row0upd.c +++ b/storage/innobase/row/row0upd.c @@ -238,7 +238,7 @@ row_upd_check_references_constraints( foreign->n_fields))) { if (foreign->foreign_table == NULL) { - dict_table_get(foreign->foreign_table_name, + dict_table_get(foreign->foreign_table_name_lookup, FALSE); } @@ -1198,20 +1198,21 @@ row_upd_changes_ord_field_binary( row and the data values in update are not known when this function is called, e.g., at compile time */ + const row_ext_t*ext, /*!< NULL, or prefixes of the externally + stored columns in the old row */ dict_index_t* index, /*!< in: index of the record */ const upd_t* update) /*!< in: update vector for the row; NOTE: the field numbers in this MUST be clustered index positions! */ { - ulint n_unique; - ulint n_upd_fields; - ulint i, j; - dict_index_t* clust_index; + ulint n_unique; + ulint i; + const dict_index_t* clust_index; - ut_ad(update && index); + ut_ad(update); + ut_ad(index); n_unique = dict_index_get_n_unique(index); - n_upd_fields = upd_get_n_fields(update); clust_index = dict_table_get_first_index(index->table); @@ -1219,33 +1220,72 @@ row_upd_changes_ord_field_binary( const dict_field_t* ind_field; const dict_col_t* col; - ulint col_pos; ulint col_no; + const upd_field_t* upd_field; + const dfield_t* dfield; + dfield_t dfield_ext; + ulint dfield_len; + const byte* buf; ind_field = dict_index_get_nth_field(index, i); col = dict_field_get_col(ind_field); - col_pos = dict_col_get_clust_pos(col, clust_index); col_no = dict_col_get_no(col); - for (j = 0; j < n_upd_fields; j++) { + upd_field = upd_get_field_by_field_no( + update, dict_col_get_clust_pos(col, clust_index)); - const upd_field_t* upd_field - = upd_get_nth_field(update, j); + if (upd_field == NULL) { + continue; + } - /* Note that if the index field is a column prefix - then it may be that row does not contain an externally - stored part of the column value, and we cannot compare - the datas */ + if (row == NULL) { + ut_ad(ext == NULL); + return(TRUE); + } - if (col_pos == upd_field->field_no - && (row == NULL - || ind_field->prefix_len > 0 - || !dfield_datas_are_binary_equal( - dtuple_get_nth_field(row, col_no), - &(upd_field->new_val)))) { + dfield = dtuple_get_nth_field(row, col_no); - return(TRUE); + /* This treatment of column prefix indexes is loosely + based on row_build_index_entry(). */ + + if (UNIV_LIKELY(ind_field->prefix_len == 0) + || dfield_is_null(dfield)) { + /* do nothing special */ + } else if (UNIV_LIKELY_NULL(ext)) { + /* See if the column is stored externally. */ + buf = row_ext_lookup(ext, col_no, &dfield_len); + + ut_ad(col->ord_part); + + if (UNIV_LIKELY_NULL(buf)) { + if (UNIV_UNLIKELY(buf == field_ref_zero)) { + /* This should never happen, but + we try to fail safe here. */ + ut_ad(0); + return(TRUE); + } + + goto copy_dfield; } + } else if (dfield_is_ext(dfield)) { + dfield_len = dfield_get_len(dfield); + ut_a(dfield_len > BTR_EXTERN_FIELD_REF_SIZE); + dfield_len -= BTR_EXTERN_FIELD_REF_SIZE; + ut_a(dict_index_is_clust(index) + || ind_field->prefix_len <= dfield_len); + buf = dfield_get_data(dfield); +copy_dfield: + ut_a(dfield_len > 0); + dfield_copy(&dfield_ext, dfield); + dfield_set_data(&dfield_ext, buf, dfield_len); + dfield = &dfield_ext; + } + + if (!dfield_datas_are_binary_equal( + dfield, &upd_field->new_val, + ind_field->prefix_len)) { + + return(TRUE); } } @@ -1329,7 +1369,7 @@ row_upd_changes_first_fields_binary( if (col_pos == upd_field->field_no && !dfield_datas_are_binary_equal( dtuple_get_nth_field(entry, i), - &(upd_field->new_val))) { + &upd_field->new_val, 0)) { return(TRUE); } @@ -1596,14 +1636,99 @@ row_upd_sec_step( ut_ad(!dict_index_is_clust(node->index)); if (node->state == UPD_NODE_UPDATE_ALL_SEC - || row_upd_changes_ord_field_binary(node->row, node->index, - node->update)) { + || row_upd_changes_ord_field_binary(node->row, node->ext, + node->index, node->update)) { return(row_upd_sec_index_entry(node, thr)); } return(DB_SUCCESS); } +#ifdef UNIV_DEBUG +# define row_upd_clust_rec_by_insert_inherit(rec,offsets,entry,update) \ + row_upd_clust_rec_by_insert_inherit_func(rec,offsets,entry,update) +#else /* UNIV_DEBUG */ +# define row_upd_clust_rec_by_insert_inherit(rec,offsets,entry,update) \ + row_upd_clust_rec_by_insert_inherit_func(entry,update) +#endif /* UNIV_DEBUG */ +/*******************************************************************//** +Mark non-updated off-page columns inherited when the primary key is +updated. We must mark them as inherited in entry, so that they are not +freed in a rollback. A limited version of this function used to be +called btr_cur_mark_dtuple_inherited_extern(). +@return TRUE if any columns were inherited */ +static __attribute__((warn_unused_result)) +ibool +row_upd_clust_rec_by_insert_inherit_func( +/*=====================================*/ +#ifdef UNIV_DEBUG + const rec_t* rec, /*!< in: old record, or NULL */ + const ulint* offsets,/*!< in: rec_get_offsets(rec), or NULL */ +#endif /* UNIV_DEBUG */ + dtuple_t* entry, /*!< in/out: updated entry to be + inserted into the clustered index */ + const upd_t* update) /*!< in: update vector */ +{ + ibool inherit = FALSE; + ulint i; + + ut_ad(!rec == !offsets); + ut_ad(!rec || rec_offs_any_extern(offsets)); + + for (i = 0; i < dtuple_get_n_fields(entry); i++) { + dfield_t* dfield = dtuple_get_nth_field(entry, i); + byte* data; + ulint len; + + ut_ad(!offsets + || !rec_offs_nth_extern(offsets, i) + == !dfield_is_ext(dfield) + || upd_get_field_by_field_no(update, i)); + if (!dfield_is_ext(dfield) + || upd_get_field_by_field_no(update, i)) { + continue; + } + +#ifdef UNIV_DEBUG + if (UNIV_LIKELY(rec != NULL)) { + const byte* rec_data + = rec_get_nth_field(rec, offsets, i, &len); + ut_ad(len == dfield_get_len(dfield)); + ut_ad(len != UNIV_SQL_NULL); + ut_ad(len >= BTR_EXTERN_FIELD_REF_SIZE); + + rec_data += len - BTR_EXTERN_FIELD_REF_SIZE; + + /* The pointer must not be zero. */ + ut_ad(memcmp(rec_data, field_ref_zero, + BTR_EXTERN_FIELD_REF_SIZE)); + /* The BLOB must be owned. */ + ut_ad(!(rec_data[BTR_EXTERN_LEN] + & BTR_EXTERN_OWNER_FLAG)); + } +#endif /* UNIV_DEBUG */ + + len = dfield_get_len(dfield); + ut_a(len != UNIV_SQL_NULL); + ut_a(len >= BTR_EXTERN_FIELD_REF_SIZE); + data = dfield_get_data(dfield); + data += len - BTR_EXTERN_FIELD_REF_SIZE; + /* The pointer must not be zero. */ + ut_a(memcmp(data, field_ref_zero, BTR_EXTERN_FIELD_REF_SIZE)); + /* The BLOB must be owned. */ + ut_a(!(data[BTR_EXTERN_LEN] & BTR_EXTERN_OWNER_FLAG)); + + data[BTR_EXTERN_LEN] |= BTR_EXTERN_INHERITED_FLAG; + /* The BTR_EXTERN_INHERITED_FLAG only matters in + rollback. Purge will always free the extern fields of + a delete-marked row. */ + + inherit = TRUE; + } + + return(inherit); +} + /***********************************************************//** Marks the clustered index record deleted and inserts the updated version of the record to the index. This function should be used when the ordering @@ -1622,14 +1747,16 @@ row_upd_clust_rec_by_insert( a foreign key constraint */ mtr_t* mtr) /*!< in/out: mtr; gets committed here */ { - mem_heap_t* heap = NULL; + mem_heap_t* heap; btr_pcur_t* pcur; btr_cur_t* btr_cur; trx_t* trx; dict_table_t* table; dtuple_t* entry; ulint err; - ibool change_ownership = FALSE; + ibool change_ownership = FALSE; + rec_t* rec; + ulint* offsets = NULL; ut_ad(node); ut_ad(dict_index_is_clust(index)); @@ -1639,59 +1766,7 @@ row_upd_clust_rec_by_insert( pcur = node->pcur; btr_cur = btr_pcur_get_btr_cur(pcur); - if (node->state != UPD_NODE_INSERT_CLUSTERED) { - rec_t* rec; - dict_index_t* index; - ulint offsets_[REC_OFFS_NORMAL_SIZE]; - ulint* offsets; - rec_offs_init(offsets_); - - err = btr_cur_del_mark_set_clust_rec(BTR_NO_LOCKING_FLAG, - btr_cur, TRUE, thr, mtr); - if (err != DB_SUCCESS) { - mtr_commit(mtr); - return(err); - } - - /* Mark as not-owned the externally stored fields which the new - row inherits from the delete marked record: purge should not - free those externally stored fields even if the delete marked - record is removed from the index tree, or updated. */ - - rec = btr_cur_get_rec(btr_cur); - index = dict_table_get_first_index(table); - offsets = rec_get_offsets(rec, index, offsets_, - ULINT_UNDEFINED, &heap); - change_ownership = btr_cur_mark_extern_inherited_fields( - btr_cur_get_page_zip(btr_cur), - rec, index, offsets, node->update, mtr); - if (referenced) { - - /* NOTE that the following call loses - the position of pcur ! */ - - err = row_upd_check_references_constraints( - node, pcur, table, index, offsets, thr, mtr); - - if (err != DB_SUCCESS) { - - mtr_commit(mtr); - - if (UNIV_LIKELY_NULL(heap)) { - mem_heap_free(heap); - } - - return(err); - } - } - } - - mtr_commit(mtr); - - if (!heap) { - heap = mem_heap_create(500); - } - node->state = UPD_NODE_INSERT_CLUSTERED; + heap = mem_heap_create(1000); entry = row_build_index_entry(node->upd_row, node->upd_ext, index, heap); @@ -1699,23 +1774,106 @@ row_upd_clust_rec_by_insert( row_upd_index_entry_sys_field(entry, index, DATA_TRX_ID, trx->id); - if (change_ownership) { - /* If we return from a lock wait, for example, we may have - extern fields marked as not-owned in entry (marked in the - if-branch above). We must unmark them, take the ownership - back. */ + switch (node->state) { + default: + ut_error; + case UPD_NODE_INSERT_BLOB: + /* A lock wait occurred in row_ins_index_entry() in + the previous invocation of this function. Mark the + off-page columns in the entry inherited. */ - btr_cur_unmark_dtuple_extern_fields(entry); + change_ownership = row_upd_clust_rec_by_insert_inherit( + NULL, NULL, entry, node->update); + ut_a(change_ownership); + /* fall through */ + case UPD_NODE_INSERT_CLUSTERED: + /* A lock wait occurred in row_ins_index_entry() in + the previous invocation of this function. */ + break; + case UPD_NODE_UPDATE_CLUSTERED: + /* This is the first invocation of the function where + we update the primary key. Delete-mark the old record + in the clustered index and prepare to insert a new entry. */ + rec = btr_cur_get_rec(btr_cur); + offsets = rec_get_offsets(rec, index, NULL, + ULINT_UNDEFINED, &heap); + ut_ad(page_rec_is_user_rec(rec)); - /* We must mark non-updated extern fields in entry as - inherited, so that a possible rollback will not free them. */ + err = btr_cur_del_mark_set_clust_rec( + BTR_NO_LOCKING_FLAG, btr_cur_get_block(btr_cur), + rec, index, offsets, TRUE, thr, mtr); + if (err != DB_SUCCESS) { +err_exit: + mtr_commit(mtr); + mem_heap_free(heap); + return(err); + } - btr_cur_mark_dtuple_inherited_extern(entry, node->update); + /* If the the new row inherits externally stored + fields (off-page columns a.k.a. BLOBs) from the + delete-marked old record, mark them disowned by the + old record and owned by the new entry. */ + + if (rec_offs_any_extern(offsets)) { + change_ownership = row_upd_clust_rec_by_insert_inherit( + rec, offsets, entry, node->update); + + if (change_ownership) { + btr_pcur_store_position(pcur, mtr); + } + } + + if (referenced) { + /* NOTE that the following call loses + the position of pcur ! */ + + err = row_upd_check_references_constraints( + node, pcur, table, index, offsets, thr, mtr); + + if (err != DB_SUCCESS) { + goto err_exit; + } + } } + mtr_commit(mtr); + err = row_ins_index_entry(index, entry, node->upd_ext ? node->upd_ext->n_ext : 0, TRUE, thr); + node->state = change_ownership + ? UPD_NODE_INSERT_BLOB + : UPD_NODE_INSERT_CLUSTERED; + + if (err == DB_SUCCESS && change_ownership) { + /* Mark the non-updated fields disowned by the old record. */ + + /* NOTE: this transaction has an x-lock on the record + and therefore other transactions cannot modify the + record when we have no latch on the page. In addition, + we assume that other query threads of the same + transaction do not modify the record in the meantime. + Therefore we can assert that the restoration of the + cursor succeeds. */ + + mtr_start(mtr); + + if (!btr_pcur_restore_position(BTR_MODIFY_LEAF, pcur, mtr)) { + ut_error; + } + + rec = btr_cur_get_rec(btr_cur); + offsets = rec_get_offsets(rec, index, offsets, + ULINT_UNDEFINED, &heap); + ut_ad(page_rec_is_user_rec(rec)); + + btr_cur_disown_inherited_fields( + btr_cur_get_page_zip(btr_cur), + rec, index, offsets, node->update, mtr); + + mtr_commit(mtr); + } + mem_heap_free(heap); return(err); @@ -1860,8 +2018,9 @@ row_upd_del_mark_clust_rec( /* Mark the clustered index record deleted; we do not have to check locks, because we assume that we have an x-lock on the record */ - err = btr_cur_del_mark_set_clust_rec(BTR_NO_LOCKING_FLAG, - btr_cur, TRUE, thr, mtr); + err = btr_cur_del_mark_set_clust_rec( + BTR_NO_LOCKING_FLAG, btr_cur_get_block(btr_cur), + btr_cur_get_rec(btr_cur), index, offsets, TRUE, thr, mtr); if (err == DB_SUCCESS && referenced) { /* NOTE that the following call loses the position of pcur ! */ @@ -2006,7 +2165,8 @@ exit_func: row_upd_store_row(node); - if (row_upd_changes_ord_field_binary(node->row, index, node->update)) { + if (row_upd_changes_ord_field_binary(node->row, node->ext, index, + node->update)) { /* Update causes an ordering field (ordering fields within the B-tree) of the clustered index record to change: perform @@ -2076,7 +2236,8 @@ row_upd( } if (node->state == UPD_NODE_UPDATE_CLUSTERED - || node->state == UPD_NODE_INSERT_CLUSTERED) { + || node->state == UPD_NODE_INSERT_CLUSTERED + || node->state == UPD_NODE_INSERT_BLOB) { log_free_check(); err = row_upd_clust_step(node, thr); diff --git a/storage/innobase/srv/srv0srv.c b/storage/innobase/srv/srv0srv.c index 2ac5c8ce4fc..1c57d6960d0 100644 --- a/storage/innobase/srv/srv0srv.c +++ b/storage/innobase/srv/srv0srv.c @@ -87,9 +87,11 @@ Created 10/8/1995 Heikki Tuuri #include "mysql/plugin.h" #include "mysql/service_thd_wait.h" -/* This is set to TRUE if the MySQL user has set it in MySQL; currently -affects only FOREIGN KEY definition parsing */ -UNIV_INTERN ibool srv_lower_case_table_names = FALSE; +/* This is set to the MySQL server value for this variable. It is only +needed for FOREIGN KEY definition parsing since FOREIGN KEY names are not +stored in the server metadata. The server stores and enforces it for +regular database and table names.*/ +UNIV_INTERN uint srv_lower_case_table_names = 0; /* The following counter is incremented whenever there is some user activity in the server */ @@ -831,6 +833,7 @@ srv_table_reserve_slot( ut_a(type > 0); ut_a(type <= SRV_MASTER); + ut_ad(mutex_own(&kernel_mutex)); i = 0; slot = srv_table_get_nth_slot(i); @@ -979,6 +982,37 @@ srv_get_thread_type(void) return(type); } +/*********************************************************************//** +Check whether thread type has reserved a slot. Return the first slot that +is found. This works because we currently have only 1 thread of each type. +@return slot number or ULINT_UNDEFINED if not found*/ +UNIV_INTERN +ulint +srv_thread_has_reserved_slot( +/*=========================*/ + enum srv_thread_type type) /*!< in: thread type to check */ +{ + ulint i; + ulint slot_no = ULINT_UNDEFINED; + + mutex_enter(&kernel_mutex); + + for (i = 0; i < OS_THREAD_MAX_N; i++) { + srv_slot_t* slot; + + slot = srv_table_get_nth_slot(i); + + if (slot->in_use && slot->type == type) { + slot_no = i; + break; + } + } + + mutex_exit(&kernel_mutex); + + return(slot_no); +} + /*********************************************************************//** Initializes the server. */ UNIV_INTERN @@ -2627,10 +2661,10 @@ srv_master_thread( srv_main_thread_process_no = os_proc_get_number(); srv_main_thread_id = os_thread_pf(os_thread_get_curr_id()); - srv_table_reserve_slot(SRV_MASTER); - mutex_enter(&kernel_mutex); + srv_table_reserve_slot(SRV_MASTER); + srv_n_threads_active[SRV_MASTER]++; mutex_exit(&kernel_mutex); diff --git a/storage/innobase/srv/srv0start.c b/storage/innobase/srv/srv0start.c index d7ea3d5d3da..acb448a1a67 100644 --- a/storage/innobase/srv/srv0start.c +++ b/storage/innobase/srv/srv0start.c @@ -1026,26 +1026,35 @@ innobase_start_or_create_for_mysql(void) on Mac OS X 10.3 or later. */ struct utsname utsname; if (uname(&utsname)) { - fputs("InnoDB: cannot determine Mac OS X version!\n", stderr); + ut_print_timestamp(stderr); + fputs(" InnoDB: cannot determine Mac OS X version!\n", stderr); } else { srv_have_fullfsync = strcmp(utsname.release, "7.") >= 0; } if (!srv_have_fullfsync) { - fputs("InnoDB: On Mac OS X, fsync() may be" - " broken on internal drives,\n" - "InnoDB: making transactions unsafe!\n", stderr); + ut_print_timestamp(stderr); + fputs(" InnoDB: On Mac OS X, fsync() may be " + "broken on internal drives,\n", stderr); + ut_print_timestamp(stderr); + fputs(" InnoDB: making transactions unsafe!\n", stderr); } # endif /* F_FULLFSYNC */ #endif /* HAVE_DARWIN_THREADS */ if (sizeof(ulint) != sizeof(void*)) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Error: size of InnoDB's ulint is %lu," - " but size of void* is %lu.\n" - "InnoDB: The sizes should be the same" - " so that on a 64-bit platform you can\n" - "InnoDB: allocate more than 4 GB of memory.", - (ulong)sizeof(ulint), (ulong)sizeof(void*)); + " InnoDB: Error: size of InnoDB's ulint is %lu, " + "but size of void*\n", (ulong) sizeof(ulint)); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: is %lu. The sizes should be the same " + "so that on a 64-bit\n", + (ulong) sizeof(void*)); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: platforms you can allocate more than 4 GB " + "of memory.\n"); } /* System tables are created in tablespace 0. Thus, we must @@ -1054,53 +1063,68 @@ innobase_start_or_create_for_mysql(void) innodb_file_per_table) until this function has returned. */ srv_file_per_table = FALSE; #ifdef UNIV_DEBUG + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: !!!!!!!! UNIV_DEBUG switched on !!!!!!!!!\n"); + " InnoDB: !!!!!!!! UNIV_DEBUG switched on !!!!!!!!!\n"); #endif #ifdef UNIV_IBUF_DEBUG + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: !!!!!!!! UNIV_IBUF_DEBUG switched on !!!!!!!!!\n" + " InnoDB: !!!!!!!! UNIV_IBUF_DEBUG switched on !!!!!!!!!\n"); # ifdef UNIV_IBUF_COUNT_DEBUG - "InnoDB: !!!!!!!! UNIV_IBUF_COUNT_DEBUG switched on !!!!!!!!!\n" - "InnoDB: Crash recovery will fail with UNIV_IBUF_COUNT_DEBUG\n" + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: !!!!!!!! UNIV_IBUF_COUNT_DEBUG switched on " + "!!!!!!!!!\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: Crash recovery will fail with UNIV_IBUF_COUNT_DEBUG\n"); # endif - ); #endif #ifdef UNIV_SYNC_DEBUG + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: !!!!!!!! UNIV_SYNC_DEBUG switched on !!!!!!!!!\n"); + " InnoDB: !!!!!!!! UNIV_SYNC_DEBUG switched on !!!!!!!!!\n"); #endif #ifdef UNIV_SEARCH_DEBUG + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: !!!!!!!! UNIV_SEARCH_DEBUG switched on !!!!!!!!!\n"); + " InnoDB: !!!!!!!! UNIV_SEARCH_DEBUG switched on !!!!!!!!!\n"); #endif #ifdef UNIV_LOG_LSN_DEBUG + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: !!!!!!!! UNIV_LOG_LSN_DEBUG switched on !!!!!!!!!\n"); + " InnoDB: !!!!!!!! UNIV_LOG_LSN_DEBUG switched on !!!!!!!!!\n"); #endif /* UNIV_LOG_LSN_DEBUG */ #ifdef UNIV_MEM_DEBUG + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: !!!!!!!! UNIV_MEM_DEBUG switched on !!!!!!!!!\n"); + " InnoDB: !!!!!!!! UNIV_MEM_DEBUG switched on !!!!!!!!!\n"); #endif if (UNIV_LIKELY(srv_use_sys_malloc)) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: The InnoDB memory heap is disabled\n"); + " InnoDB: The InnoDB memory heap is disabled\n"); } - fputs("InnoDB: " IB_ATOMICS_STARTUP_MSG - "\nInnoDB: Compressed tables use zlib " ZLIB_VERSION + ut_print_timestamp(stderr); + fputs(" InnoDB: " IB_ATOMICS_STARTUP_MSG "\n", stderr); + + ut_print_timestamp(stderr); + fputs(" InnoDB: Compressed tables use zlib " ZLIB_VERSION #ifdef UNIV_ZIP_DEBUG " with validation" #endif /* UNIV_ZIP_DEBUG */ -#ifdef UNIV_ZIP_COPY - " and extra copying" -#endif /* UNIV_ZIP_COPY */ "\n" , stderr); +#ifdef UNIV_ZIP_COPY + ut_print_timestamp(stderr); + fputs(" InnoDB: and extra copying\n", stderr); +#endif /* UNIV_ZIP_COPY */ /* Since InnoDB does not currently clean up all its internal data structures in MySQL Embedded Server Library server_end(), we @@ -1108,13 +1132,17 @@ innobase_start_or_create_for_mysql(void) second time during the process lifetime. */ if (srv_start_has_been_called) { - fprintf(stderr, - "InnoDB: Error: startup called second time" - " during the process lifetime.\n" - "InnoDB: In the MySQL Embedded Server Library" - " you cannot call server_init()\n" - "InnoDB: more than once during" - " the process lifetime.\n"); + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: Error: startup called second time " + "during the process\n"); + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: lifetime. In the MySQL Embedded " + "Server Library you\n"); + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: cannot call server_init() more " + "than once during the\n"); + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: process lifetime.\n"); } srv_start_has_been_called = TRUE; @@ -1158,7 +1186,7 @@ innobase_start_or_create_for_mysql(void) if (srv_use_native_aio) { ut_print_timestamp(stderr); fprintf(stderr, - " InnoDB: Using Linux native AIO\n"); + " InnoDB: Using Linux native AIO\n"); } #else /* Currently native AIO is supported only on windows and linux @@ -1203,8 +1231,9 @@ innobase_start_or_create_for_mysql(void) srv_win_file_flush_method = SRV_WIN_IO_UNBUFFERED; #endif } else { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Unrecognized value %s for" + " InnoDB: Unrecognized value %s for" " innodb_flush_method\n", srv_file_flush_method_str); return(DB_ERROR); @@ -1285,7 +1314,8 @@ innobase_start_or_create_for_mysql(void) we'll emit a message telling the user that this parameter is now deprecated. */ if (srv_n_file_io_threads != 4) { - fprintf(stderr, "InnoDB: Warning:" + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: Warning:" " innodb_file_io_threads is deprecated." " Please use innodb_read_io_threads and" " innodb_write_io_threads instead\n"); @@ -1316,7 +1346,7 @@ innobase_start_or_create_for_mysql(void) /* Print time to initialize the buffer pool */ ut_print_timestamp(stderr); fprintf(stderr, - " InnoDB: Initializing buffer pool, size ="); + " InnoDB: Initializing buffer pool, size ="); if (srv_buf_pool_size >= 1024 * 1024 * 1024) { fprintf(stderr, @@ -1332,11 +1362,12 @@ innobase_start_or_create_for_mysql(void) ut_print_timestamp(stderr); fprintf(stderr, - " InnoDB: Completed initialization of buffer pool\n"); + " InnoDB: Completed initialization of buffer pool\n"); if (err != DB_SUCCESS) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Fatal error: cannot allocate the memory" + " InnoDB: Fatal error: cannot allocate memory" " for the buffer pool\n"); return(DB_ERROR); @@ -1348,7 +1379,8 @@ innobase_start_or_create_for_mysql(void) if (srv_buf_pool_size <= 5 * 1024 * 1024) { - fprintf(stderr, "InnoDB: Warning: Small buffer pool size " + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: Warning: Small buffer pool size " "(%luM), the flst_validate() debug function " "can cause a deadlock if the buffer pool fills up.\n", srv_buf_pool_size / 1024 / 1024); @@ -1370,18 +1402,19 @@ innobase_start_or_create_for_mysql(void) #ifdef UNIV_LOG_ARCHIVE if (0 != ut_strcmp(srv_log_group_home_dirs[0], srv_arch_dir)) { - fprintf(stderr, - "InnoDB: Error: you must set the log group" - " home dir in my.cnf the\n" - "InnoDB: same as log arch dir.\n"); + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: Error: you must set the log group home dir in my.cnf\n"); + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: the same as log arch dir.\n"); return(DB_ERROR); } #endif /* UNIV_LOG_ARCHIVE */ if (srv_n_log_files * srv_log_file_size >= 262144) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Error: combined size of log files" + " InnoDB: Error: combined size of log files" " must be < 4 GB\n"); return(DB_ERROR); @@ -1392,10 +1425,13 @@ innobase_start_or_create_for_mysql(void) for (i = 0; i < srv_n_data_files; i++) { #ifndef __WIN__ if (sizeof(off_t) < 5 && srv_data_file_sizes[i] >= 262144) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Error: file size must be < 4 GB" - " with this MySQL binary\n" - "InnoDB: and operating system combination," + " InnoDB: Error: file size must be < 4 GB" + " with this MySQL binary\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: and operating system combination," " in some OS's < 2 GB\n"); return(DB_ERROR); @@ -1405,8 +1441,9 @@ innobase_start_or_create_for_mysql(void) } if (sum_of_new_sizes < 10485760 / UNIV_PAGE_SIZE) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Error: tablespace size must be" + " InnoDB: Error: tablespace size must be" " at least 10 MB\n"); return(DB_ERROR); @@ -1419,19 +1456,32 @@ innobase_start_or_create_for_mysql(void) &min_flushed_lsn, &max_flushed_lsn, &sum_of_new_sizes); if (err != DB_SUCCESS) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Could not open or create data files.\n" - "InnoDB: If you tried to add new data files," - " and it failed here,\n" - "InnoDB: you should now edit innodb_data_file_path" - " in my.cnf back\n" - "InnoDB: to what it was, and remove the" - " new ibdata files InnoDB created\n" - "InnoDB: in this failed attempt. InnoDB only wrote" - " those files full of\n" - "InnoDB: zeros, but did not yet use them in any way." - " But be careful: do not\n" - "InnoDB: remove old data files" + " InnoDB: Could not open or create data files.\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: If you tried to add new data files," + " and it failed here,\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: you should now edit innodb_data_file_path" + " in my.cnf back\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: to what it was, and remove the" + " new ibdata files InnoDB created\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: in this failed attempt. InnoDB only wrote" + " those files full of\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: zeros, but did not yet use them in any way." + " But be careful: do not\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: remove old data files" " which contain your precious data!\n"); return((int) err); @@ -1457,18 +1507,29 @@ innobase_start_or_create_for_mysql(void) } if ((log_opened && create_new_db) || (log_opened && log_created)) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Error: all log files must be" - " created at the same time.\n" - "InnoDB: All log files must be" - " created also in database creation.\n" - "InnoDB: If you want bigger or smaller" - " log files, shut down the\n" - "InnoDB: database and make sure there" - " were no errors in shutdown.\n" - "InnoDB: Then delete the existing log files." - " Edit the .cnf file\n" - "InnoDB: and start the database again.\n"); + " InnoDB: Error: all log files must be" + " created at the same time.\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: All log files must be" + " created also in database creation.\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: If you want bigger or smaller" + " log files, shut down the\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: database and make sure there" + " were no errors in shutdown.\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: Then delete the existing log files." + " Edit the .cnf file\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: and start the database again.\n"); return(DB_ERROR); } @@ -1489,27 +1550,41 @@ innobase_start_or_create_for_mysql(void) || max_arch_log_no != min_arch_log_no #endif /* UNIV_LOG_ARCHIVE */ ) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Cannot initialize created" - " log files because\n" - "InnoDB: data files were not in sync" - " with each other\n" - "InnoDB: or the data files are corrupt.\n"); + " InnoDB: Cannot initialize created" + " log files because\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: data files were not in sync" + " with each other\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: or the data files are corrupt.\n"); return(DB_ERROR); } if (max_flushed_lsn < (ib_uint64_t) 1000) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Cannot initialize created" - " log files because\n" - "InnoDB: data files are corrupt," - " or new data files were\n" - "InnoDB: created when the database" - " was started previous\n" - "InnoDB: time but the database" - " was not shut down\n" - "InnoDB: normally after that.\n"); + " InnoDB: Cannot initialize created" + " log files because\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: data files are corrupt," + " or new data files were\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: created when the database" + " was started previous\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: time but the database" + " was not shut down\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: normally after that.\n"); return(DB_ERROR); } @@ -1548,8 +1623,9 @@ innobase_start_or_create_for_mysql(void) #ifdef UNIV_LOG_ARCHIVE } else if (srv_archive_recovery) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Starting archive" + " InnoDB: Starting archive" " recovery from a backup...\n"); err = recv_recovery_from_archive_start( min_flushed_lsn, srv_archive_recovery_limit_lsn, @@ -1757,6 +1833,24 @@ innobase_start_or_create_for_mysql(void) os_thread_create(&srv_purge_thread, NULL, NULL); } + /* Wait for the purge and master thread to startup. */ + + while (srv_shutdown_state == SRV_SHUTDOWN_NONE) { + if (srv_thread_has_reserved_slot(SRV_MASTER) == ULINT_UNDEFINED + || (srv_n_purge_threads == 1 + && srv_thread_has_reserved_slot(SRV_WORKER) + == ULINT_UNDEFINED)) { + + ut_print_timestamp(stderr); + fprintf(stderr, " InnoDB: " + "Waiting for the background threads to " + "start\n"); + os_thread_sleep(1000000); + } else { + break; + } + } + #ifdef UNIV_DEBUG /* buf_debug_prints = TRUE; */ #endif /* UNIV_DEBUG */ @@ -1771,11 +1865,14 @@ innobase_start_or_create_for_mysql(void) if (!srv_auto_extend_last_data_file && sum_of_data_file_sizes != tablespace_size_in_header) { + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: Error: tablespace size" + " stored in header is %lu pages, but\n", + (ulong) tablespace_size_in_header); + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Error: tablespace size" - " stored in header is %lu pages, but\n" "InnoDB: the sum of data file sizes is %lu pages\n", - (ulong) tablespace_size_in_header, (ulong) sum_of_data_file_sizes); if (srv_force_recovery == 0 @@ -1783,16 +1880,25 @@ innobase_start_or_create_for_mysql(void) /* This is a fatal error, the tail of a tablespace is missing */ + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Cannot start InnoDB." - " The tail of the system tablespace is\n" - "InnoDB: missing. Have you edited" - " innodb_data_file_path in my.cnf in an\n" - "InnoDB: inappropriate way, removing" - " ibdata files from there?\n" - "InnoDB: You can set innodb_force_recovery=1" - " in my.cnf to force\n" - "InnoDB: a startup if you are trying" + " InnoDB: Cannot start InnoDB." + " The tail of the system tablespace is\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: missing. Have you edited" + " innodb_data_file_path in my.cnf in an\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: inappropriate way, removing" + " ibdata files from there?\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: You can set innodb_force_recovery=1" + " in my.cnf to force\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: a startup if you are trying" " to recover a badly corrupt database.\n"); return(DB_ERROR); @@ -1802,26 +1908,38 @@ innobase_start_or_create_for_mysql(void) if (srv_auto_extend_last_data_file && sum_of_data_file_sizes < tablespace_size_in_header) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Error: tablespace size stored in header" - " is %lu pages, but\n" - "InnoDB: the sum of data file sizes" + " InnoDB: Error: tablespace size stored in header" + " is %lu pages, but\n", + (ulong) tablespace_size_in_header); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: the sum of data file sizes" " is only %lu pages\n", - (ulong) tablespace_size_in_header, (ulong) sum_of_data_file_sizes); if (srv_force_recovery == 0) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Cannot start InnoDB. The tail of" - " the system tablespace is\n" - "InnoDB: missing. Have you edited" - " innodb_data_file_path in my.cnf in an\n" - "InnoDB: inappropriate way, removing" - " ibdata files from there?\n" - "InnoDB: You can set innodb_force_recovery=1" - " in my.cnf to force\n" - "InnoDB: a startup if you are trying to" + " InnoDB: Cannot start InnoDB. The tail of" + " the system tablespace is\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: missing. Have you edited" + " innodb_data_file_path in my.cnf in an\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: inappropriate way, removing" + " ibdata files from there?\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: You can set innodb_force_recovery=1" + " in my.cnf to force\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: a startup if you are trying to" " recover a badly corrupt database.\n"); return(DB_ERROR); @@ -1832,10 +1950,13 @@ innobase_start_or_create_for_mysql(void) os_fast_mutex_init(&srv_os_test_mutex); if (0 != os_fast_mutex_trylock(&srv_os_test_mutex)) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Error: pthread_mutex_trylock returns" - " an unexpected value on\n" - "InnoDB: success! Cannot continue.\n"); + " InnoDB: Error: pthread_mutex_trylock returns" + " an unexpected value on\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: success! Cannot continue.\n"); exit(1); } @@ -1850,14 +1971,15 @@ innobase_start_or_create_for_mysql(void) if (srv_print_verbose_log) { ut_print_timestamp(stderr); fprintf(stderr, - " InnoDB: %s started; " + " InnoDB: %s started; " "log sequence number %llu\n", INNODB_VERSION_STR, srv_start_lsn); } if (srv_force_recovery > 0) { + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: !!! innodb_force_recovery" + " InnoDB: !!! innodb_force_recovery" " is set to %lu !!!\n", (ulong) srv_force_recovery); } @@ -1878,12 +2000,17 @@ innobase_start_or_create_for_mysql(void) 4.1.1. It is essential that the insert buffer is emptied here! */ + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: You are upgrading to an" - " InnoDB version which allows multiple\n" - "InnoDB: tablespaces. Wait that purge" - " and insert buffer merge run to\n" - "InnoDB: completion...\n"); + " InnoDB: You are upgrading to an" + " InnoDB version which allows multiple\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: tablespaces. Wait that purge" + " and insert buffer merge run to\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: completion...\n"); for (;;) { os_thread_sleep(1000000); @@ -1895,21 +2022,29 @@ innobase_start_or_create_for_mysql(void) break; } } + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: Full purge and insert buffer merge" + " InnoDB: Full purge and insert buffer merge" " completed.\n"); trx_sys_mark_upgraded_to_multiple_tablespaces(); + ut_print_timestamp(stderr); fprintf(stderr, - "InnoDB: You have now successfully upgraded" - " to the multiple tablespaces\n" - "InnoDB: format. You should NOT DOWNGRADE" - " to an earlier version of\n" - "InnoDB: InnoDB! But if you absolutely need to" - " downgrade, see\n" - "InnoDB: " REFMAN "multiple-tablespaces.html\n" - "InnoDB: for instructions.\n"); + " InnoDB: You have now successfully upgraded" + " to the multiple tablespaces\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: format. You should NOT DOWNGRADE" + " to an earlier version of\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: InnoDB! But if you absolutely need to" + " downgrade, see\n"); + ut_print_timestamp(stderr); + fprintf(stderr, + " InnoDB: " REFMAN "multiple-tablespaces.html\n" + " InnoDB: for instructions.\n"); } if (srv_force_recovery == 0) { diff --git a/storage/innobase/sync/sync0arr.c b/storage/innobase/sync/sync0arr.c index 753ebd958ac..ce9d42c4921 100644 --- a/storage/innobase/sync/sync0arr.c +++ b/storage/innobase/sync/sync0arr.c @@ -590,9 +590,6 @@ sync_array_deadlock_step( ulint depth) /*!< in: recursion depth */ { sync_cell_t* new; - ibool ret; - - depth++; if (pass != 0) { /* If pass != 0, then we do not know which threads are @@ -604,7 +601,7 @@ sync_array_deadlock_step( new = sync_array_find_thread(arr, thread); - if (new == start) { + if (UNIV_UNLIKELY(new == start)) { /* Stop running of other threads */ ut_dbg_stop_threads = TRUE; @@ -616,11 +613,7 @@ sync_array_deadlock_step( return(TRUE); } else if (new) { - ret = sync_array_detect_deadlock(arr, start, new, depth); - - if (ret) { - return(TRUE); - } + return(sync_array_detect_deadlock(arr, start, new, depth + 1)); } return(FALSE); } @@ -930,12 +923,25 @@ sync_array_print_long_waits(void) ulint fatal_timeout = srv_fatal_semaphore_wait_threshold; ibool fatal = FALSE; +#ifdef UNIV_DEBUG_VALGRIND + /* Increase the timeouts if running under valgrind because it executes + extremely slowly. UNIV_DEBUG_VALGRIND does not necessary mean that + we are running under valgrind but we have no better way to tell. + See Bug#58432 innodb.innodb_bug56143 fails under valgrind + for an example */ +# define SYNC_ARRAY_TIMEOUT 2400 + fatal_timeout *= 10; +#else +# define SYNC_ARRAY_TIMEOUT 240 +#endif + for (i = 0; i < sync_primary_wait_array->n_cells; i++) { cell = sync_array_get_nth_cell(sync_primary_wait_array, i); if (cell->wait_object != NULL && cell->waiting - && difftime(time(NULL), cell->reservation_time) > 240) { + && difftime(time(NULL), cell->reservation_time) + > SYNC_ARRAY_TIMEOUT) { fputs("InnoDB: Warning: a long semaphore wait:\n", stderr); sync_array_cell_print(stderr, cell); @@ -977,6 +983,8 @@ sync_array_print_long_waits(void) " to the standard error stream\n"); } +#undef SYNC_ARRAY_TIMEOUT + return(fatal); } diff --git a/storage/innobase/trx/trx0i_s.c b/storage/innobase/trx/trx0i_s.c index 8b11e706180..aff49e20726 100644 --- a/storage/innobase/trx/trx0i_s.c +++ b/storage/innobase/trx/trx0i_s.c @@ -442,7 +442,7 @@ i_s_locks_row_validate( /* record lock */ ut_ad(!strcmp("RECORD", row->lock_type)); ut_ad(row->lock_index != NULL); - ut_ad(row->lock_data != NULL); + /* row->lock_data == NULL if buf_page_try_get() == NULL */ ut_ad(row->lock_page != ULINT_UNDEFINED); ut_ad(row->lock_rec != ULINT_UNDEFINED); } @@ -508,7 +508,6 @@ fill_trx_row( stmt = innobase_get_stmt(trx->mysql_thd, &stmt_len); if (stmt != NULL) { - char query[TRX_I_S_TRX_QUERY_MAX_LEN + 1]; if (stmt_len > TRX_I_S_TRX_QUERY_MAX_LEN) { @@ -522,6 +521,8 @@ fill_trx_row( cache->storage, stmt, stmt_len + 1, MAX_ALLOWED_FOR_STORAGE(cache)); + row->trx_query_cs = innobase_get_charset(trx->mysql_thd); + if (row->trx_query == NULL) { return(FALSE); diff --git a/storage/innobase/trx/trx0sys.c b/storage/innobase/trx/trx0sys.c index 26498a1b712..101f225a06f 100644 --- a/storage/innobase/trx/trx0sys.c +++ b/storage/innobase/trx/trx0sys.c @@ -1160,7 +1160,7 @@ trx_sys_file_format_max_check( ut_print_timestamp(stderr); fprintf(stderr, - " InnoDB: highest supported file format is %s.\n", + " InnoDB: highest supported file format is %s.\n", trx_sys_file_format_id_to_name(DICT_TF_FORMAT_MAX)); if (format_id > DICT_TF_FORMAT_MAX) { @@ -1169,7 +1169,7 @@ trx_sys_file_format_max_check( ut_print_timestamp(stderr); fprintf(stderr, - " InnoDB: %s: the system tablespace is in a file " + " InnoDB: %s: the system tablespace is in a file " "format that this version doesn't support - %s\n", ((max_format_id <= DICT_TF_FORMAT_MAX) ? "Error" : "Warning"), diff --git a/storage/innobase/ut/ut0dbg.c b/storage/innobase/ut/ut0dbg.c index e79217d5b86..42ad8c03762 100644 --- a/storage/innobase/ut/ut0dbg.c +++ b/storage/innobase/ut/ut0dbg.c @@ -74,7 +74,7 @@ ut_dbg_assertion_failed( " or crashes, even\n" "InnoDB: immediately after the mysqld startup, there may be\n" "InnoDB: corruption in the InnoDB tablespace. Please refer to\n" - "InnoDB: " REFMAN "forcing-recovery.html\n" + "InnoDB: " REFMAN "forcing-innodb-recovery.html\n" "InnoDB: about forcing recovery.\n", stderr); #if defined(UNIV_SYNC_DEBUG) || !defined(UT_DBG_USE_ABORT) ut_dbg_stop_threads = TRUE;