diff --git a/.gitignore b/.gitignore index c4109b63dc2..255759e76dd 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,7 @@ include/sql_state.h include/probes_mysql.d include/probes_mysql_dtrace.h include/probes_mysql_nodtrace.h +include/source_revision.h info_macros.cmake libmysql*/libmysql*_exports_file.cc libmysql*/merge_archives_mysql*.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index aefc6711fbc..b16105a710b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,12 +115,14 @@ FOREACH(_base ENDIF() ENDFOREACH() -FOREACH(tool gtar tar git) +FOREACH(tool gtar tar) STRING(TOUPPER ${tool} TOOL) FIND_PROGRAM(${TOOL}_EXECUTABLE ${tool} DOC "path to the executable") MARK_AS_ADVANCED(${TOOL}_EXECUTABLE) ENDFOREACH() +FIND_PACKAGE(Git) + # Following autotools tradition, add preprocessor definitions # specified in environment variable CPPFLAGS IF(DEFINED ENV{CPPFLAGS}) @@ -443,7 +445,6 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/include/mysql_version.h.in CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc.in ${CMAKE_BINARY_DIR}/sql/sql_builtin.cc) -FIND_PACKAGE(Git) IF(GIT_EXECUTABLE) EXECUTE_PROCESS( COMMAND ${GIT_EXECUTABLE} rev-parse HEAD diff --git a/README.md b/README.md index 58e08f89ca0..f46888e4b2f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ see the Credits appendix. You can also run 'SHOW authors' to get a list of active contributors. A description of the MariaDB project and a manual can be found at: -http://mariadb.org/ +https://mariadb.org/ https://mariadb.com/kb/en/ https://mariadb.com/kb/en/mariadb-vs-mysql-features/ https://mariadb.com/kb/en/mariadb-versus-mysql-features/ @@ -55,9 +55,9 @@ Bug Reports: ------------ Bug and/or error reports regarding MariaDB should be submitted at -http://mariadb.org/jira +https://mariadb.org/jira -Bugs in the MySQL code can also be submitted at http://bugs.mysql.com +Bugs in the MySQL code can also be submitted at https://bugs.mysql.com The code for MariaDB, including all revision history, can be found at: https://github.com/MariaDB/server diff --git a/cmake/CMakeLis.txt b/cmake/CMakeLis.txt deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/cmake/systemd.cmake b/cmake/systemd.cmake index 6986cb748ce..f7365066ef6 100644 --- a/cmake/systemd.cmake +++ b/cmake/systemd.cmake @@ -13,11 +13,10 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -INCLUDE(FindPkgConfig) -# http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html - MACRO(CHECK_SYSTEMD) IF(UNIX) + INCLUDE(FindPkgConfig) + # http://www.cmake.org/cmake/help/v3.0/module/FindPkgConfig.html SET(WITH_SYSTEMD "auto" CACHE STRING "Enable systemd scripts and notification support") IF(WITH_SYSTEMD STREQUAL "yes" OR WITH_SYSTEMD STREQUAL "auto") IF(PKG_CONFIG_FOUND) diff --git a/mysql-test/extra/rpl_tests/rpl_cant_read_event_incident.inc b/mysql-test/extra/rpl_tests/rpl_cant_read_event_incident.inc index a9534a999e2..7dfef023947 100644 --- a/mysql-test/extra/rpl_tests/rpl_cant_read_event_incident.inc +++ b/mysql-test/extra/rpl_tests/rpl_cant_read_event_incident.inc @@ -18,8 +18,8 @@ # and replication is started from it. # ---source include/master-slave.inc --source include/have_binlog_format_mixed.inc +--source include/master-slave.inc --connection slave # Make sure the slave is stopped while we are messing with master. diff --git a/mysql-test/extra/rpl_tests/rpl_checksum.inc b/mysql-test/extra/rpl_tests/rpl_checksum.inc index 28d16658a7c..b5e70abe4d0 100644 --- a/mysql-test/extra/rpl_tests/rpl_checksum.inc +++ b/mysql-test/extra/rpl_tests/rpl_checksum.inc @@ -7,9 +7,9 @@ # WL2540 replication events checksum # Testing configuration parameters ---source include/master-slave.inc --source include/have_debug.inc --source include/have_binlog_format_mixed.inc +--source include/master-slave.inc call mtr.add_suppression('Slave can not handle replication events with the checksum that master is configured to log'); call mtr.add_suppression('Replication event checksum verification failed'); diff --git a/mysql-test/extra/rpl_tests/rpl_init_slave_errors.inc b/mysql-test/extra/rpl_tests/rpl_init_slave_errors.inc index a8ac4e3cd6e..4fdea651edd 100644 --- a/mysql-test/extra/rpl_tests/rpl_init_slave_errors.inc +++ b/mysql-test/extra/rpl_tests/rpl_init_slave_errors.inc @@ -35,8 +35,8 @@ # Configuring the Environment ###################################################################### source include/have_debug.inc; -source include/master-slave.inc; source include/have_log_bin.inc; +source include/master-slave.inc; connection slave; diff --git a/mysql-test/extra/rpl_tests/rpl_loaddata.test b/mysql-test/extra/rpl_tests/rpl_loaddata.test index e1942dad239..f0933c1023f 100644 --- a/mysql-test/extra/rpl_tests/rpl_loaddata.test +++ b/mysql-test/extra/rpl_tests/rpl_loaddata.test @@ -11,8 +11,8 @@ # check if START SLAVE, RESET SLAVE, CHANGE MASTER reset Last_slave_error and # Last_slave_errno in SHOW SLAVE STATUS (1st and 3rd commands did not: bug 986) --- source include/master-slave.inc source include/have_innodb.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"); diff --git a/mysql-test/extra/rpl_tests/rpl_packet.inc b/mysql-test/extra/rpl_tests/rpl_packet.inc index 41bb374b802..cbde486bcbb 100644 --- a/mysql-test/extra/rpl_tests/rpl_packet.inc +++ b/mysql-test/extra/rpl_tests/rpl_packet.inc @@ -15,8 +15,9 @@ # BUG#55322: SHOW BINLOG EVENTS increases @@SESSION.MAX_ALLOWED_PACKET # max-out size db name -source include/master-slave.inc; source include/have_binlog_format_row.inc; +source include/master-slave.inc; + call mtr.add_suppression("Slave I/O: Got a packet bigger than 'slave_max_allowed_packet' bytes, .*error.* 1153"); call mtr.add_suppression("Log entry on master is longer than slave_max_allowed_packet"); let $db= DB_NAME_OF_MAX_LENGTH_AKA_NAME_LEN_64_BYTES_____________________; diff --git a/mysql-test/extra/rpl_tests/rpl_skip_replication.inc b/mysql-test/extra/rpl_tests/rpl_skip_replication.inc index 14e3339ff5e..ac0beef414d 100644 --- a/mysql-test/extra/rpl_tests/rpl_skip_replication.inc +++ b/mysql-test/extra/rpl_tests/rpl_skip_replication.inc @@ -16,8 +16,8 @@ # so if it is needed, it should be set explicitly before each call. # ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc connection slave; # Test that SUPER is required to change @@replicate_events_marked_for_skip. diff --git a/mysql-test/extra/rpl_tests/rpl_stm_relay_ign_space.inc b/mysql-test/extra/rpl_tests/rpl_stm_relay_ign_space.inc index 82c4b1881bf..41339f539f8 100644 --- a/mysql-test/extra/rpl_tests/rpl_stm_relay_ign_space.inc +++ b/mysql-test/extra/rpl_tests/rpl_stm_relay_ign_space.inc @@ -25,8 +25,8 @@ # IO thread does not do it in an uncontrolled manner. --source include/have_binlog_format_statement.inc ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc --disable_query_log CREATE TABLE t1 (c1 TEXT) engine=InnoDB; diff --git a/mysql-test/extra/rpl_tests/rpl_sync.inc b/mysql-test/extra/rpl_tests/rpl_sync.inc index ede3c3c515f..1e2ec2ca83b 100644 --- a/mysql-test/extra/rpl_tests/rpl_sync.inc +++ b/mysql-test/extra/rpl_tests/rpl_sync.inc @@ -32,12 +32,12 @@ # Configuring the environment ######################################################################################## --echo =====Configuring the enviroment=======; ---source include/master-slave.inc --source include/not_embedded.inc --source include/not_valgrind.inc --source include/have_debug.inc --source include/have_innodb.inc --source include/not_crashrep.inc +--source include/master-slave.inc call mtr.add_suppression('Attempting backtrace'); call mtr.add_suppression("Recovery from master pos .* and file master-bin.000001"); diff --git a/mysql-test/r/explain_json.result b/mysql-test/r/explain_json.result index a64d4af5890..d7cdeac499e 100644 --- a/mysql-test/r/explain_json.result +++ b/mysql-test/r/explain_json.result @@ -1525,12 +1525,12 @@ ANALYZE "key_length": "5", "used_key_parts": ["a"], "ref": ["test.t3.a"], - "r_loops": 0, + "r_loops": 1, "rows": 1, - "r_rows": null, + "r_rows": 10, "r_total_time_ms": "REPLACED", "filtered": 100, - "r_filtered": null, + "r_filtered": 100, "index_condition_bka": "t4.b + 1 <= t3.b + 1" }, "buffer_type": "flat", diff --git a/mysql-test/r/insert.result b/mysql-test/r/insert.result index 8e572c5fede..736aa917cae 100644 --- a/mysql-test/r/insert.result +++ b/mysql-test/r/insert.result @@ -745,3 +745,9 @@ f1 f2 drop view v1; drop table t1; SET @@sql_mode= @save_mode; +CREATE TABLE t1 (f INT); +CREATE VIEW v1 AS SELECT * FROM t1 WHERE f <=> 'foo' WITH CHECK OPTION; +REPLACE INTO v1 SET f = NULL; +ERROR 22007: Truncated incorrect DOUBLE value: 'foo' +DROP VIEW v1; +DROP TABLE t1; diff --git a/mysql-test/r/locale.result b/mysql-test/r/locale.result index a02e80ed21e..b750d038205 100644 --- a/mysql-test/r/locale.result +++ b/mysql-test/r/locale.result @@ -229,15 +229,80 @@ SET lc_time_names=@old_50915_lc_time_names; # End of 10.1 tests # create view v1 as select +date_format('2001-10-02', '%c %b %M') as a, +date_format('2001-10-02', '%c %b %M', 'ru_RU') as a1, format(123456789,2) as b, format(123456789,2,'rm_CH') as b1; select * from v1; -b b1 -123,456,789.00 123'456'789,00 +a a1 b b1 +10 Oct October 10 Окт Октября 123,456,789.00 123'456'789,00 show create view v1; View Create View character_set_client collation_connection -v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select format(123456789,2) AS `b`,format(123456789,2,'rm_CH') AS `b1` utf8 utf8_general_ci +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select date_format('2001-10-02','%c %b %M') AS `a`,date_format('2001-10-02','%c %b %M','ru_RU') AS `a1`,format(123456789,2) AS `b`,format(123456789,2,'rm_CH') AS `b1` utf8 utf8_general_ci drop view v1; # # End of 10.2 tests # +select date_format('2001-01-01', '%w %a %W', 'ro_RO'); +date_format('2001-01-01', '%w %a %W', 'ro_RO') +1 Lu Luni +select date_format('2001-01-03', '%w %a %W', 'ro_RO'); +date_format('2001-01-03', '%w %a %W', 'ro_RO') +3 Mi Miercuri +select date_format('2001-01-05', '%w %a %W', 'ro_RO'); +date_format('2001-01-05', '%w %a %W', 'ro_RO') +5 Vi Vineri +select date_format('2001-01-07', '%w %a %W', 'ro_RO'); +date_format('2001-01-07', '%w %a %W', 'ro_RO') +0 Du Duminică +select date_format('2001-01-01', '%w %a %W', 'de_AT'); +date_format('2001-01-01', '%w %a %W', 'de_AT') +1 Mon Montag +select date_format('2001-02-01', '%w %a %W', 'de_AT'); +date_format('2001-02-01', '%w %a %W', 'de_AT') +4 Don Donnerstag +select date_format('2001-03-01', '%w %a %W', 'de_AT'); +date_format('2001-03-01', '%w %a %W', 'de_AT') +4 Don Donnerstag +select date_format('2001-01-01', '%w %a %W', 'en_US'); +date_format('2001-01-01', '%w %a %W', 'en_US') +1 Mon Monday +select date_format('2001-03-01', '%c %b %M', 'en_US'); +date_format('2001-03-01', '%c %b %M', 'en_US') +3 Mar March +select date_format('2001-01-01', '%w %a %W', 'rm_CH'); +date_format('2001-01-01', '%w %a %W', 'rm_CH') +1 gli glindesdi +select date_format('2001-01-03', '%w %a %W', 'rm_CH'); +date_format('2001-01-03', '%w %a %W', 'rm_CH') +3 me mesemna +select date_format('2001-01-05', '%w %a %W', 'rm_CH'); +date_format('2001-01-05', '%w %a %W', 'rm_CH') +5 ve venderdi +select date_format('2001-01-07', '%w %a %W', 'rm_CH'); +date_format('2001-01-07', '%w %a %W', 'rm_CH') +0 du dumengia +select date_format('2001-02-01', '%c %b %M', 'rm_CH'); +date_format('2001-02-01', '%c %b %M', 'rm_CH') +2 favr favrer +select date_format('2001-04-01', '%c %b %M', 'rm_CH'); +date_format('2001-04-01', '%c %b %M', 'rm_CH') +4 avr avrigl +select date_format('2001-06-01', '%c %b %M', 'rm_CH'); +date_format('2001-06-01', '%c %b %M', 'rm_CH') +6 zercl zercladur +select date_format('2001-08-01', '%c %b %M', 'rm_CH'); +date_format('2001-08-01', '%c %b %M', 'rm_CH') +8 avust avust +select date_format('2001-10-01', '%c %b %M', 'rm_CH'); +date_format('2001-10-01', '%c %b %M', 'rm_CH') +10 oct october +select date_format('2001-12-01', '%c %b %M', 'rm_CH'); +date_format('2001-12-01', '%c %b %M', 'rm_CH') +12 dec december +select date_format('2001-01-06', '%w %a %W', 'de_CH'); +date_format('2001-01-06', '%w %a %W', 'de_CH') +6 Sa Samstag +select date_format('2001-09-01', '%c %b %M', 'de_CH'); +date_format('2001-09-01', '%c %b %M', 'de_CH') +9 Sep September diff --git a/mysql-test/r/myisam.result b/mysql-test/r/myisam.result index 5b41b35c1ba..78eb374b142 100644 --- a/mysql-test/r/myisam.result +++ b/mysql-test/r/myisam.result @@ -2569,6 +2569,14 @@ OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize status OK DROP TABLE t1; +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)) engine=myisam; +INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), +(6,'0'),(7,'0'); +flush tables test.t1 for export; +insert into t1 values (8,'0'); +ERROR HY000: Table 't1' was locked with a READ lock and can't be updated +unlock tables; +drop table t1; show variables like 'myisam_block_size'; Variable_name Value myisam_block_size 1024 diff --git a/mysql-test/r/old-mode.result b/mysql-test/r/old-mode.result index c61e30ef85c..73ad613048a 100644 --- a/mysql-test/r/old-mode.result +++ b/mysql-test/r/old-mode.result @@ -127,3 +127,56 @@ Warning 1264 Out of range value for column 'a' at row 1 Warning 1264 Out of range value for column 'b' at row 1 DROP TABLE t1; SET @@global.mysql56_temporal_format=DEFAULT; +set time_zone='Europe/Moscow'; +set global mysql56_temporal_format=false; +create table t1 (a timestamp); +set timestamp=1288477526; +insert t1 values (null); +insert t1 values (); +set timestamp=1288481126; +insert t1 values (null); +insert t1 values (); +select a, unix_timestamp(a) from t1; +a unix_timestamp(a) +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288481126 +2010-10-31 02:25:26 1288481126 +set global mysql56_temporal_format=true; +select a, unix_timestamp(a) from t1; +a unix_timestamp(a) +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288481126 +2010-10-31 02:25:26 1288481126 +alter table t1 modify a timestamp; +select a, unix_timestamp(a) from t1; +a unix_timestamp(a) +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288481126 +2010-10-31 02:25:26 1288481126 +drop table t1; +set global mysql56_temporal_format=false; +create table t1 (a timestamp); +set timestamp=1288477526; +insert t1 values (null); +set timestamp=1288481126; +insert t1 values (null); +select a, unix_timestamp(a) from t1; +a unix_timestamp(a) +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288481126 +set global mysql56_temporal_format=true; +select a, unix_timestamp(a) from t1; +a unix_timestamp(a) +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288481126 +create table t2 (a timestamp); +insert t2 select a from t1; +select a, unix_timestamp(a) from t2; +a unix_timestamp(a) +2010-10-31 02:25:26 1288477526 +2010-10-31 02:25:26 1288481126 +drop table t1, t2; +set time_zone=DEFAULT; diff --git a/mysql-test/suite/engines/funcs/t/rpl_insert.test b/mysql-test/suite/engines/funcs/t/rpl_insert.test index 763a484ea5d..f57a6e226d1 100644 --- a/mysql-test/suite/engines/funcs/t/rpl_insert.test +++ b/mysql-test/suite/engines/funcs/t/rpl_insert.test @@ -2,9 +2,9 @@ --echo # Bug#20821: INSERT DELAYED fails to write some rows to binlog --echo # ---source include/master-slave.inc --source include/not_embedded.inc --source include/not_windows.inc +--source include/master-slave.inc --disable_warnings CREATE SCHEMA IF NOT EXISTS mysqlslap; diff --git a/mysql-test/suite/innodb/r/innodb-table-online.result b/mysql-test/suite/innodb/r/innodb-table-online.result index ec5199e4f52..d6a0d4785f5 100644 --- a/mysql-test/suite/innodb/r/innodb-table-online.result +++ b/mysql-test/suite/innodb/r/innodb-table-online.result @@ -167,7 +167,8 @@ ROLLBACK; connection con1; KILL QUERY @id; ERROR 70100: Query execution was interrupted -SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt WAIT_FOR kill_done'; +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt WAIT_FOR dml_done'; +SET DEBUG_SYNC = 'row_log_table_apply2_before SIGNAL applied WAIT_FOR kill_done'; ALTER TABLE t1 ROW_FORMAT=REDUNDANT; # session default connection default; @@ -180,6 +181,10 @@ ddl_online_create_index 1 ddl_pending_alter_table 1 ddl_sort_file_alter_table 0 ddl_log_file_alter_table 0 +BEGIN; +INSERT INTO t1 VALUES(7,4,2); +ROLLBACK; +SET DEBUG_SYNC = 'now SIGNAL dml_done WAIT_FOR applied'; KILL QUERY @id; SET DEBUG_SYNC = 'now SIGNAL kill_done'; # session con1 @@ -227,6 +232,7 @@ t1 CREATE TABLE `t1` ( `c3` char(255) NOT NULL, PRIMARY KEY (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT +ALTER TABLE t1 ROW_FORMAT=REDUNDANT; SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt2 WAIT_FOR dml2_done'; SET lock_wait_timeout = 10; ALTER TABLE t1 ROW_FORMAT=COMPACT, ALGORITHM = INPLACE; diff --git a/mysql-test/suite/innodb/r/truncate_debug.result b/mysql-test/suite/innodb/r/truncate_debug.result index eb4e9cfbc85..c04b83dbbe8 100644 --- a/mysql-test/suite/innodb/r/truncate_debug.result +++ b/mysql-test/suite/innodb/r/truncate_debug.result @@ -1,6 +1,9 @@ # # Bug #23070734 CONCURRENT TRUNCATE TABLES CAUSE STALLS # +SET @ahi= @@global.innodb_adaptive_hash_index; +SET GLOBAL innodb_adaptive_hash_index=OFF; +SET GLOBAL innodb_adaptive_hash_index=ON; Test_1 :- Check if DDL operations are possible on table being truncated. Also check if DDL operations on other tables succeed. @@ -81,6 +84,5 @@ connection con2; disconnect con2; connection default; SET DEBUG_SYNC= 'RESET'; -SET session lock_wait_timeout=default; -set global innodb_adaptive_hash_index=on; +SET GLOBAL innodb_adaptive_hash_index=@ahi; drop table t1,t2,t3; diff --git a/mysql-test/suite/innodb/t/innodb-index-online.test b/mysql-test/suite/innodb/t/innodb-index-online.test index efd700498c6..5509d985edc 100644 --- a/mysql-test/suite/innodb/t/innodb-index-online.test +++ b/mysql-test/suite/innodb/t/innodb-index-online.test @@ -1,5 +1,6 @@ --source include/innodb_page_size_small.inc --source include/innodb_encrypt_log.inc +--source include/have_debug.inc --source include/have_debug_sync.inc let $innodb_metrics_select= diff --git a/mysql-test/suite/innodb/t/innodb-table-online.test b/mysql-test/suite/innodb/t/innodb-table-online.test index 51f5445693e..d3fbeffd19f 100644 --- a/mysql-test/suite/innodb/t/innodb-table-online.test +++ b/mysql-test/suite/innodb/t/innodb-table-online.test @@ -158,7 +158,8 @@ let $ID= `SELECT @id := CONNECTION_ID()`; --error ER_QUERY_INTERRUPTED KILL QUERY @id; -SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt WAIT_FOR kill_done'; +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt WAIT_FOR dml_done'; +SET DEBUG_SYNC = 'row_log_table_apply2_before SIGNAL applied WAIT_FOR kill_done'; --send ALTER TABLE t1 ROW_FORMAT=REDUNDANT; @@ -166,6 +167,10 @@ ALTER TABLE t1 ROW_FORMAT=REDUNDANT; connection default; SET DEBUG_SYNC = 'now WAIT_FOR rebuilt'; eval $innodb_metrics_select; +BEGIN; +INSERT INTO t1 VALUES(7,4,2); +ROLLBACK; +SET DEBUG_SYNC = 'now SIGNAL dml_done WAIT_FOR applied'; let $ignore= `SELECT @id := $ID`; KILL QUERY @id; SET DEBUG_SYNC = 'now SIGNAL kill_done'; @@ -201,6 +206,7 @@ WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); --echo # session con1 connection con1; SHOW CREATE TABLE t1; +ALTER TABLE t1 ROW_FORMAT=REDUNDANT; # Exceed the configured innodb_online_alter_log_max_size. # The actual limit is a multiple of innodb_sort_buf_size, diff --git a/mysql-test/suite/innodb/t/truncate_debug.test b/mysql-test/suite/innodb/t/truncate_debug.test index 915688ed354..5fee9174d98 100644 --- a/mysql-test/suite/innodb/t/truncate_debug.test +++ b/mysql-test/suite/innodb/t/truncate_debug.test @@ -8,6 +8,12 @@ --echo # Bug #23070734 CONCURRENT TRUNCATE TABLES CAUSE STALLS --echo # +SET @ahi= @@global.innodb_adaptive_hash_index; +# Ensure that there is no adaptive hash index on any system tables, +# or any other tables than the ones that we are creating below. +SET GLOBAL innodb_adaptive_hash_index=OFF; +SET GLOBAL innodb_adaptive_hash_index=ON; + --echo Test_1 :- Check if DDL operations are possible on --echo table being truncated. Also check if --echo DDL operations on other tables succeed. @@ -115,8 +121,7 @@ disconnect con2; connection default; SET DEBUG_SYNC= 'RESET'; -SET session lock_wait_timeout=default; -set global innodb_adaptive_hash_index=on; +SET GLOBAL innodb_adaptive_hash_index=@ahi; drop table t1,t2,t3; --source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/maria/maria.result b/mysql-test/suite/maria/maria.result index 88f39827f27..b5fbcbe113d 100644 --- a/mysql-test/suite/maria/maria.result +++ b/mysql-test/suite/maria/maria.result @@ -2790,3 +2790,11 @@ test.t1 check status OK SET aria_repair_threads=@@global.aria_repair_threads; SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; DROP TABLE t1; +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); +INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), +(6,'0'),(7,'0'); +flush tables test.t1 for export; +insert into t1 values (8,'0'); +ERROR HY000: Table 't1' was locked with a READ lock and can't be updated +unlock tables; +drop table t1; diff --git a/mysql-test/suite/maria/maria.test b/mysql-test/suite/maria/maria.test index 1b930a22c35..e710f32ef80 100644 --- a/mysql-test/suite/maria/maria.test +++ b/mysql-test/suite/maria/maria.test @@ -2018,6 +2018,19 @@ SET aria_repair_threads=@@global.aria_repair_threads; SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; DROP TABLE t1; +# +# Check FLUSH FOR EXPORT +# + +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); +INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), + (6,'0'),(7,'0'); +flush tables test.t1 for export; +--error ER_TABLE_NOT_LOCKED_FOR_WRITE +insert into t1 values (8,'0'); +unlock tables; +drop table t1; + # # End of test # diff --git a/mysql-test/suite/parts/t/rpl_partition.test b/mysql-test/suite/parts/t/rpl_partition.test index 529d94b2b31..85b3f348921 100644 --- a/mysql-test/suite/parts/t/rpl_partition.test +++ b/mysql-test/suite/parts/t/rpl_partition.test @@ -1,7 +1,7 @@ --source include/have_partition.inc --source include/have_innodb.inc ---source include/master-slave.inc --source include/big_test.inc +--source include/master-slave.inc --vertical_results diff --git a/mysql-test/suite/roles/rpl_grant_revoke_current_role-8638.test b/mysql-test/suite/roles/rpl_grant_revoke_current_role-8638.test index 6a6c4f2a756..10e5e938884 100644 --- a/mysql-test/suite/roles/rpl_grant_revoke_current_role-8638.test +++ b/mysql-test/suite/roles/rpl_grant_revoke_current_role-8638.test @@ -1,5 +1,5 @@ ---source include/master-slave.inc --source include/have_binlog_format_mixed.inc +--source include/master-slave.inc --enable_connect_log diff --git a/mysql-test/suite/rpl/r/rpl_temporal_format_mariadb53_to_mysql56_dst.result b/mysql-test/suite/rpl/r/rpl_temporal_format_mariadb53_to_mysql56_dst.result new file mode 100644 index 00000000000..4072376a120 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_temporal_format_mariadb53_to_mysql56_dst.result @@ -0,0 +1,32 @@ +include/master-slave.inc +[connection master] +connection slave; +set global time_zone='Europe/Moscow'; +set time_zone='UTC'; +stop slave; +start slave; +connection master; +set global mysql56_temporal_format=false; +set global time_zone='Europe/Moscow'; +set time_zone='UTC'; +create table t1 (pk int primary key, t timestamp not null); +set timestamp = 1288477526; +insert into t1 values (1,null); +set timestamp = 1288481126; +insert into t1 values (2,null); +connection slave; +select pk, t, unix_timestamp(t) from t1; +pk t unix_timestamp(t) +1 2010-10-30 22:25:26 1288477526 +2 2010-10-30 23:25:26 1288481126 +set time_zone=default; +select pk, t, unix_timestamp(t) from t1; +pk t unix_timestamp(t) +1 2010-10-31 02:25:26 1288477526 +2 2010-10-31 02:25:26 1288481126 +set global time_zone=default; +connection master; +drop table t1; +set global time_zone=default; +set global mysql56_temporal_format=default; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_alter_extra_persistent.test b/mysql-test/suite/rpl/t/rpl_alter_extra_persistent.test index 3b2fff1cb13..4e604787c70 100644 --- a/mysql-test/suite/rpl/t/rpl_alter_extra_persistent.test +++ b/mysql-test/suite/rpl/t/rpl_alter_extra_persistent.test @@ -1,5 +1,5 @@ ---source include/master-slave.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc --enable_connect_log --connection master diff --git a/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test b/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test index 6996e1c73c7..32f08be7c4d 100644 --- a/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test +++ b/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test @@ -5,9 +5,9 @@ # is replication unsafe. # -source include/master-slave.inc; source include/have_binlog_format_mixed.inc; source include/have_innodb.inc; +source include/master-slave.inc; call mtr.add_suppression('Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.'); diff --git a/mysql-test/suite/rpl/t/rpl_begin_commit_rollback.test b/mysql-test/suite/rpl/t/rpl_begin_commit_rollback.test index f0ed5dc0123..659f074e8e4 100644 --- a/mysql-test/suite/rpl/t/rpl_begin_commit_rollback.test +++ b/mysql-test/suite/rpl/t/rpl_begin_commit_rollback.test @@ -1,6 +1,6 @@ -source include/master-slave.inc; source include/have_innodb.inc; source include/have_binlog_format_statement.inc; +source include/master-slave.inc; connection slave; call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); diff --git a/mysql-test/suite/rpl/t/rpl_blackhole.test b/mysql-test/suite/rpl/t/rpl_blackhole.test index 5f9b955aaa4..76b2e2421c9 100644 --- a/mysql-test/suite/rpl/t/rpl_blackhole.test +++ b/mysql-test/suite/rpl/t/rpl_blackhole.test @@ -15,8 +15,8 @@ # primary key lookup), and index/key with multiple matches (forcing an # index search). -source include/master-slave.inc; source include/have_blackhole.inc; +source include/master-slave.inc; call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); diff --git a/mysql-test/suite/rpl/t/rpl_concurrency_error.test b/mysql-test/suite/rpl/t/rpl_concurrency_error.test index 37a05064641..72179ef263a 100644 --- a/mysql-test/suite/rpl/t/rpl_concurrency_error.test +++ b/mysql-test/suite/rpl/t/rpl_concurrency_error.test @@ -17,9 +17,9 @@ # log, the error is ignored and only the non-transactional tables are changed. ############################################################################### ---source include/master-slave.inc --source include/have_innodb.inc --source include/have_binlog_format_statement.inc +--source include/master-slave.inc call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); diff --git a/mysql-test/suite/rpl/t/rpl_conditional_comments.test b/mysql-test/suite/rpl/t/rpl_conditional_comments.test index 0e2c108bf6e..bcc964a92c7 100644 --- a/mysql-test/suite/rpl/t/rpl_conditional_comments.test +++ b/mysql-test/suite/rpl/t/rpl_conditional_comments.test @@ -8,8 +8,8 @@ # will be binlogged as # 'INSERT INTO t1 VALUES (1) /*!10000, (2)*/ /* 99999 ,(3)*/'. ############################################################################### -source include/master-slave.inc; source include/have_binlog_format_statement.inc; +source include/master-slave.inc; CREATE TABLE t1(c1 INT); source include/show_binlog_events.inc; diff --git a/mysql-test/suite/rpl/t/rpl_empty_master_host.test b/mysql-test/suite/rpl/t/rpl_empty_master_host.test index 66d30375a59..0fc2d11a29d 100644 --- a/mysql-test/suite/rpl/t/rpl_empty_master_host.test +++ b/mysql-test/suite/rpl/t/rpl_empty_master_host.test @@ -16,8 +16,8 @@ # along the way if error/no error is thrown and/or if replication starts # working when expected. ---source include/master-slave.inc --source include/have_binlog_format_mixed.inc +--source include/master-slave.inc connection slave; STOP SLAVE; diff --git a/mysql-test/suite/rpl/t/rpl_extra_col_master_innodb.test b/mysql-test/suite/rpl/t/rpl_extra_col_master_innodb.test index f48880b5dfa..201392346be 100644 --- a/mysql-test/suite/rpl/t/rpl_extra_col_master_innodb.test +++ b/mysql-test/suite/rpl/t/rpl_extra_col_master_innodb.test @@ -2,8 +2,8 @@ # Purpose: To test having extra columns on the master WL#3915 ############################################################# -- source include/have_binlog_format_row.inc --- source include/master-slave.inc -- source include/have_innodb.inc +-- source include/master-slave.inc let $engine_type = 'InnoDB'; --source extra/rpl_tests/rpl_extra_col_master.test diff --git a/mysql-test/suite/rpl/t/rpl_flush_logs.test b/mysql-test/suite/rpl/t/rpl_flush_logs.test index 1d19576d47c..6dad588f217 100644 --- a/mysql-test/suite/rpl/t/rpl_flush_logs.test +++ b/mysql-test/suite/rpl/t/rpl_flush_logs.test @@ -4,8 +4,8 @@ # works fine. # ---source include/master-slave.inc --source include/have_binlog_format_statement.inc +--source include/master-slave.inc connection master; # Test 'flush error logs' statement. diff --git a/mysql-test/suite/rpl/t/rpl_geometry.test b/mysql-test/suite/rpl/t/rpl_geometry.test index 769c49c96b1..415732a0228 100644 --- a/mysql-test/suite/rpl/t/rpl_geometry.test +++ b/mysql-test/suite/rpl/t/rpl_geometry.test @@ -1,5 +1,5 @@ -source include/master-slave.inc; source include/have_binlog_format_row.inc; +source include/master-slave.inc; # # Bug#48776, Bug#43784 diff --git a/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test b/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test index 17417a55b8c..dca32c30a94 100644 --- a/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test +++ b/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test @@ -8,9 +8,9 @@ # Finish the following tests by calling its common test script: # extra/rpl_tests/rpl_get_master_version_and_clock.test. -source include/master-slave.inc; source include/have_debug.inc; source include/have_debug_sync.inc; +source include/master-slave.inc; # # The test is not supposed to have any binglog affairs. diff --git a/mysql-test/suite/rpl/t/rpl_grant.test b/mysql-test/suite/rpl/t/rpl_grant.test index a1afa28847e..0220645380a 100644 --- a/mysql-test/suite/rpl/t/rpl_grant.test +++ b/mysql-test/suite/rpl/t/rpl_grant.test @@ -1,7 +1,7 @@ # Tests of grants and users -source include/master-slave.inc; source include/not_embedded.inc; +source include/master-slave.inc; connection master; diff --git a/mysql-test/suite/rpl/t/rpl_gtid_mdev4484.test b/mysql-test/suite/rpl/t/rpl_gtid_mdev4484.test index 57f78530b01..e1f5696f5a1 100644 --- a/mysql-test/suite/rpl/t/rpl_gtid_mdev4484.test +++ b/mysql-test/suite/rpl/t/rpl_gtid_mdev4484.test @@ -1,6 +1,6 @@ ---source include/master-slave.inc --source include/have_innodb.inc --source include/have_debug.inc +--source include/master-slave.inc --connection slave --source include/stop_slave.inc diff --git a/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test b/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test index 7cdf67d6532..6a426ed1e9f 100644 --- a/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test +++ b/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test @@ -1,7 +1,7 @@ # Testing master to slave heartbeat protocol, test cases that need debug build. ---source include/master-slave.inc --source include/have_debug.inc +--source include/master-slave.inc connection slave; --source include/stop_slave.inc diff --git a/mysql-test/suite/rpl/t/rpl_innodb_bug68220.test b/mysql-test/suite/rpl/t/rpl_innodb_bug68220.test index 76e7c60fd59..1e4f40a0019 100644 --- a/mysql-test/suite/rpl/t/rpl_innodb_bug68220.test +++ b/mysql-test/suite/rpl/t/rpl_innodb_bug68220.test @@ -1,6 +1,6 @@ --source include/have_innodb.inc ---source include/master-slave.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc # # Bug#68220: innodb_rows_updated is misleading on slave when *info_repository=TABLE diff --git a/mysql-test/suite/rpl/t/rpl_insert.test b/mysql-test/suite/rpl/t/rpl_insert.test index 2a29139ac48..48814508818 100644 --- a/mysql-test/suite/rpl/t/rpl_insert.test +++ b/mysql-test/suite/rpl/t/rpl_insert.test @@ -2,9 +2,9 @@ --echo # Bug#20821: INSERT DELAYED fails to write some rows to binlog --echo # ---source include/master-slave.inc --source include/not_embedded.inc --source include/not_windows.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"); diff --git a/mysql-test/suite/rpl/t/rpl_invoked_features.test b/mysql-test/suite/rpl/t/rpl_invoked_features.test index 7770c36c397..91391cf8372 100644 --- a/mysql-test/suite/rpl/t/rpl_invoked_features.test +++ b/mysql-test/suite/rpl/t/rpl_invoked_features.test @@ -5,8 +5,8 @@ # Features for Replication. ######################################### ---source include/master-slave.inc --source include/have_innodb.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"); diff --git a/mysql-test/suite/rpl/t/rpl_loaddata_symlink.test b/mysql-test/suite/rpl/t/rpl_loaddata_symlink.test index c73fa2897f3..e5ee400d231 100644 --- a/mysql-test/suite/rpl/t/rpl_loaddata_symlink.test +++ b/mysql-test/suite/rpl/t/rpl_loaddata_symlink.test @@ -4,8 +4,8 @@ # if the path of the load data file is a symbolic link. # --source include/not_windows.inc ---source include/master-slave.inc --source include/have_binlog_format_statement.inc +--source include/master-slave.inc create table t1(a int not null auto_increment, b int, primary key(a) ); load data infile '../../std_data/rpl_loaddata.dat' into table t1; diff --git a/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test b/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test index a8a6d562ee5..ed26e61d9b6 100644 --- a/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test +++ b/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test @@ -1,8 +1,8 @@ ---source include/master-slave.inc --source include/have_debug.inc --source include/have_debug_sync.inc --source include/have_binlog_format_row.inc --source include/have_innodb.inc +--source include/master-slave.inc connection master; diff --git a/mysql-test/suite/rpl/t/rpl_mdev-11092.test b/mysql-test/suite/rpl/t/rpl_mdev-11092.test index c8b2b7f2ad1..31a385b40e6 100644 --- a/mysql-test/suite/rpl/t/rpl_mdev-11092.test +++ b/mysql-test/suite/rpl/t/rpl_mdev-11092.test @@ -1,8 +1,8 @@ --source include/have_innodb.inc ---source include/master-slave.inc --source include/not_embedded.inc --source include/not_windows.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc ######################################################################################## call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); diff --git a/mysql-test/suite/rpl/t/rpl_mdev8193.test b/mysql-test/suite/rpl/t/rpl_mdev8193.test index 29c26bb3da4..dcad3e5f9b0 100644 --- a/mysql-test/suite/rpl/t/rpl_mdev8193.test +++ b/mysql-test/suite/rpl/t/rpl_mdev8193.test @@ -1,5 +1,5 @@ ---source include/master-slave.inc --source include/have_binlog_format_statement.inc +--source include/master-slave.inc --connection slave diff --git a/mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size.test b/mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size.test index 3850a84cbf1..81b01cc9140 100644 --- a/mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size.test +++ b/mysql-test/suite/rpl/t/rpl_mixed_binlog_max_cache_size.test @@ -1,8 +1,8 @@ --source include/have_innodb.inc ---source include/master-slave.inc --source include/not_embedded.inc --source include/not_windows.inc --source include/have_binlog_format_mixed.inc +--source include/master-slave.inc --source extra/rpl_tests/rpl_binlog_max_cache_size.test --source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_mixed_implicit_commit_binlog.test b/mysql-test/suite/rpl/t/rpl_mixed_implicit_commit_binlog.test index b2e8308b34d..fa948f8f5fe 100644 --- a/mysql-test/suite/rpl/t/rpl_mixed_implicit_commit_binlog.test +++ b/mysql-test/suite/rpl/t/rpl_mixed_implicit_commit_binlog.test @@ -3,8 +3,8 @@ ################################################################################ --source include/have_udf.inc --source include/have_binlog_format_mixed.inc ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc --let $engine=Innodb set session storage_engine=innodb; diff --git a/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test index 747374b89c2..a9c8f6fe3e1 100644 --- a/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test @@ -3,8 +3,8 @@ # tables. For further details, please, read WL#2687 and WL#5072. ################################################################################### --source include/have_binlog_format_mixed.inc ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc let $engine_type=Innodb; let $database_name=test; diff --git a/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test index 8092ff141db..93ec9acf5ea 100644 --- a/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test @@ -3,8 +3,8 @@ # tables. For further details, please, read WL#2687 and WL#5072. ################################################################################### --source include/have_binlog_format_mixed.inc ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc --disable_query_log SET SESSION binlog_direct_non_transactional_updates = OFF; diff --git a/mysql-test/suite/rpl/t/rpl_not_null_innodb.test b/mysql-test/suite/rpl/t/rpl_not_null_innodb.test index 1e67ba4eda1..6a1cc341060 100644 --- a/mysql-test/suite/rpl/t/rpl_not_null_innodb.test +++ b/mysql-test/suite/rpl/t/rpl_not_null_innodb.test @@ -11,9 +11,9 @@ # 3 - NULL --> NOT NULL ( sql-mode != STRICT and no failures) # ################################################################################# ---source include/master-slave.inc --source include/have_innodb.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc let $engine=Innodb; --source extra/rpl_tests/rpl_not_null.test diff --git a/mysql-test/suite/rpl/t/rpl_not_null_myisam.test b/mysql-test/suite/rpl/t/rpl_not_null_myisam.test index dcfaf006dad..6ef0b65d5ff 100644 --- a/mysql-test/suite/rpl/t/rpl_not_null_myisam.test +++ b/mysql-test/suite/rpl/t/rpl_not_null_myisam.test @@ -11,8 +11,8 @@ # 3 - NULL --> NOT NULL ( sql-mode != STRICT and no failures) # ################################################################################# ---source include/master-slave.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc let $engine=MyISAM; --source extra/rpl_tests/rpl_not_null.test diff --git a/mysql-test/suite/rpl/t/rpl_performance_schema.test b/mysql-test/suite/rpl/t/rpl_performance_schema.test index 0562b0ea658..18aabe5272d 100644 --- a/mysql-test/suite/rpl/t/rpl_performance_schema.test +++ b/mysql-test/suite/rpl/t/rpl_performance_schema.test @@ -1,6 +1,6 @@ ---source include/master-slave.inc --source include/have_perfschema.inc --source include/have_binlog_format_mixed.inc +--source include/master-slave.inc UPDATE performance_schema.setup_instruments SET ENABLED="NO"; diff --git a/mysql-test/suite/rpl/t/rpl_read_only.test b/mysql-test/suite/rpl/t/rpl_read_only.test index fb92803847a..c4781bbbb3b 100644 --- a/mysql-test/suite/rpl/t/rpl_read_only.test +++ b/mysql-test/suite/rpl/t/rpl_read_only.test @@ -1,6 +1,6 @@ # Test case for BUG #11733 --- source include/master-slave.inc -- source include/have_innodb.inc +-- source include/master-slave.inc call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); diff --git a/mysql-test/suite/rpl/t/rpl_report_port.test b/mysql-test/suite/rpl/t/rpl_report_port.test index 6e728a678ad..2a14d278d48 100644 --- a/mysql-test/suite/rpl/t/rpl_report_port.test +++ b/mysql-test/suite/rpl/t/rpl_report_port.test @@ -17,8 +17,8 @@ # case on doing SHOW SLAVE HOSTS on the master, we get the actual port number # of the slave (ie. SLAVE_PORT). -source include/master-slave.inc; source include/have_binlog_format_mixed.inc; +source include/master-slave.inc; connection master; diff --git a/mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size.test b/mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size.test index 9c8489658f8..cc031d382e0 100644 --- a/mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size.test +++ b/mysql-test/suite/rpl/t/rpl_row_binlog_max_cache_size.test @@ -1,8 +1,8 @@ --source include/have_innodb.inc ---source include/master-slave.inc --source include/not_embedded.inc --source include/not_windows.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc --source extra/rpl_tests/rpl_binlog_max_cache_size.test --source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_row_colSize.test b/mysql-test/suite/rpl/t/rpl_row_colSize.test index cdffe2e333b..21c68b55e92 100644 --- a/mysql-test/suite/rpl/t/rpl_row_colSize.test +++ b/mysql-test/suite/rpl/t/rpl_row_colSize.test @@ -6,8 +6,8 @@ # having columns that are smaller (shorter) than the slave. # ################################################################## --- source include/master-slave.inc -- source include/have_binlog_format_row.inc +-- source include/master-slave.inc --disable_warnings DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/rpl/t/rpl_row_corruption.test b/mysql-test/suite/rpl/t/rpl_row_corruption.test index e05273a2f9c..acf3964f0c5 100644 --- a/mysql-test/suite/rpl/t/rpl_row_corruption.test +++ b/mysql-test/suite/rpl/t/rpl_row_corruption.test @@ -1,7 +1,7 @@ # ---source include/master-slave.inc --source include/have_debug.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc # BUG#11753004: 44360: REPLICATION FAILED diff --git a/mysql-test/suite/rpl/t/rpl_row_create_table.test b/mysql-test/suite/rpl/t/rpl_row_create_table.test index 38e4c5a5e63..65f14295c19 100644 --- a/mysql-test/suite/rpl/t/rpl_row_create_table.test +++ b/mysql-test/suite/rpl/t/rpl_row_create_table.test @@ -1,8 +1,8 @@ # Testing table creations for row-based replication. --source include/have_binlog_format_row.inc ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc connection slave; --source include/have_innodb.inc connection master; diff --git a/mysql-test/suite/rpl/t/rpl_row_find_row.test b/mysql-test/suite/rpl/t/rpl_row_find_row.test index 7f633c5aa97..444706aca7f 100644 --- a/mysql-test/suite/rpl/t/rpl_row_find_row.test +++ b/mysql-test/suite/rpl/t/rpl_row_find_row.test @@ -16,8 +16,8 @@ # has been fixed. # --- source include/master-slave.inc -- source include/have_binlog_format_row.inc +-- source include/master-slave.inc # # Case #1: master has key, but slave has not. diff --git a/mysql-test/suite/rpl/t/rpl_row_implicit_commit_binlog.test b/mysql-test/suite/rpl/t/rpl_row_implicit_commit_binlog.test index 2b35f68ff63..6fdcd885930 100644 --- a/mysql-test/suite/rpl/t/rpl_row_implicit_commit_binlog.test +++ b/mysql-test/suite/rpl/t/rpl_row_implicit_commit_binlog.test @@ -3,8 +3,8 @@ ################################################################################ --source include/have_udf.inc --source include/have_binlog_format_row.inc ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc --let $engine=Innodb set session storage_engine=innodb; diff --git a/mysql-test/suite/rpl/t/rpl_row_index_choice.test b/mysql-test/suite/rpl/t/rpl_row_index_choice.test index 6d4053f9737..0ad9b315d66 100644 --- a/mysql-test/suite/rpl/t/rpl_row_index_choice.test +++ b/mysql-test/suite/rpl/t/rpl_row_index_choice.test @@ -1,7 +1,7 @@ --source include/have_binlog_format_row.inc ---source include/master-slave.inc --source include/have_debug.inc --source include/have_innodb.inc +--source include/master-slave.inc # Bug#58997: Row-based replication breaks on table with only fulltext index: connection master; diff --git a/mysql-test/suite/rpl/t/rpl_row_merge_engine.test b/mysql-test/suite/rpl/t/rpl_row_merge_engine.test index dcbb8b891d8..c28d4a89651 100644 --- a/mysql-test/suite/rpl/t/rpl_row_merge_engine.test +++ b/mysql-test/suite/rpl/t/rpl_row_merge_engine.test @@ -12,8 +12,8 @@ # deletes their contents through the merge table. Finally, the slave # is synchronized with the master and (after the fix) it won't crash. # ---source include/master-slave.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc --connection master CREATE TABLE t1 (a int) ENGINE=MyISAM; diff --git a/mysql-test/suite/rpl/t/rpl_row_rec_comp_innodb.test b/mysql-test/suite/rpl/t/rpl_row_rec_comp_innodb.test index 57d67c5c71b..b3808680db2 100644 --- a/mysql-test/suite/rpl/t/rpl_row_rec_comp_innodb.test +++ b/mysql-test/suite/rpl/t/rpl_row_rec_comp_innodb.test @@ -1,6 +1,6 @@ -- source include/have_binlog_format_row.inc --- source include/master-slave.inc -- source include/have_innodb.inc +-- source include/master-slave.inc # # BUG#52868 Wrong handling of NULL value during update, replication out of sync diff --git a/mysql-test/suite/rpl/t/rpl_row_show_relaylog_events.test b/mysql-test/suite/rpl/t/rpl_row_show_relaylog_events.test index a78f7ad4271..0882d603203 100644 --- a/mysql-test/suite/rpl/t/rpl_row_show_relaylog_events.test +++ b/mysql-test/suite/rpl/t/rpl_row_show_relaylog_events.test @@ -12,8 +12,8 @@ # This test issues SHOW [BINLOG|RELAYLOG] EVENTS both on master and slave after # some statements have been issued. --- source include/master-slave.inc -- source include/have_binlog_format_row.inc +-- source include/master-slave.inc -- source extra/rpl_tests/rpl_show_relaylog_events.inc --source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test b/mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test index 4c306d9ab30..b0588cb2d58 100644 --- a/mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test +++ b/mysql-test/suite/rpl/t/rpl_row_tbl_metadata.test @@ -26,9 +26,9 @@ # with mysqlbinlog reporting that it was unable to succeed in # reading the event. --- source include/master-slave.inc -- source include/have_innodb.inc -- source include/have_binlog_format_row.inc +-- source include/master-slave.inc -- disable_warnings DROP TABLE IF EXISTS `t1`; diff --git a/mysql-test/suite/rpl/t/rpl_row_trunc_temp.test b/mysql-test/suite/rpl/t/rpl_row_trunc_temp.test index 394bf949f72..a8d7f77d930 100644 --- a/mysql-test/suite/rpl/t/rpl_row_trunc_temp.test +++ b/mysql-test/suite/rpl/t/rpl_row_trunc_temp.test @@ -6,8 +6,8 @@ # table was binlogged in RBR. # ---source include/master-slave.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc #This statement is not binlogged in RBR. CREATE TEMPORARY TABLE t1(c1 INTEGER); diff --git a/mysql-test/suite/rpl/t/rpl_row_utf16.test b/mysql-test/suite/rpl/t/rpl_row_utf16.test index a48a36189ae..d5dcdc4233d 100644 --- a/mysql-test/suite/rpl/t/rpl_row_utf16.test +++ b/mysql-test/suite/rpl/t/rpl_row_utf16.test @@ -1,6 +1,6 @@ --- source include/master-slave.inc -- source include/have_binlog_format_row.inc -- source include/have_utf16.inc +-- source include/master-slave.inc # # BUG#51716: Char column with utf16 character set gives wrong padding on slave diff --git a/mysql-test/suite/rpl/t/rpl_row_wide_table.test b/mysql-test/suite/rpl/t/rpl_row_wide_table.test index b1d16133096..01473f991bf 100644 --- a/mysql-test/suite/rpl/t/rpl_row_wide_table.test +++ b/mysql-test/suite/rpl/t/rpl_row_wide_table.test @@ -8,8 +8,8 @@ # in corrupt binlog ################################################################## --- source include/master-slave.inc -- source include/have_binlog_format_row.inc +-- source include/master-slave.inc --disable_warnings DROP TABLE IF EXISTS t300; diff --git a/mysql-test/suite/rpl/t/rpl_savepoint.test b/mysql-test/suite/rpl/t/rpl_savepoint.test index 6cd7a7a2d39..31af6151728 100644 --- a/mysql-test/suite/rpl/t/rpl_savepoint.test +++ b/mysql-test/suite/rpl/t/rpl_savepoint.test @@ -1,5 +1,5 @@ ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc --echo # --echo # Bug#50124 Rpl failure on DROP table with concurrent txn/non-txn diff --git a/mysql-test/suite/rpl/t/rpl_server_id_ignore.test b/mysql-test/suite/rpl/t/rpl_server_id_ignore.test index 1e6d46c9d40..537978f1701 100644 --- a/mysql-test/suite/rpl/t/rpl_server_id_ignore.test +++ b/mysql-test/suite/rpl/t/rpl_server_id_ignore.test @@ -17,8 +17,8 @@ # b. nullifying the list and resuming of taking binlog from the very beginning with # executing events this time -source include/master-slave.inc; source include/have_binlog_format_mixed.inc; +source include/master-slave.inc; connection slave; diff --git a/mysql-test/suite/rpl/t/rpl_set_null_innodb.test b/mysql-test/suite/rpl/t/rpl_set_null_innodb.test index 2d0c34e1d0a..5ef10263498 100644 --- a/mysql-test/suite/rpl/t/rpl_set_null_innodb.test +++ b/mysql-test/suite/rpl/t/rpl_set_null_innodb.test @@ -1,6 +1,6 @@ -- source include/have_binlog_format_mixed_or_row.inc --- source include/master-slave.inc -- source include/have_innodb.inc +-- source include/master-slave.inc -- let $engine= InnoDB -- source extra/rpl_tests/rpl_set_null.test diff --git a/mysql-test/suite/rpl/t/rpl_skip_error.test b/mysql-test/suite/rpl/t/rpl_skip_error.test index 1144d6a1a7c..fa8eeb73fba 100644 --- a/mysql-test/suite/rpl/t/rpl_skip_error.test +++ b/mysql-test/suite/rpl/t/rpl_skip_error.test @@ -23,8 +23,8 @@ # bug in this test: BUG#30594: rpl.rpl_skip_error is nondeterministic: # BUG#39393: slave-skip-errors does not work when using ROW based replication -source include/master-slave.inc; source include/have_innodb.inc; +source include/master-slave.inc; --echo ==== Test Without sql_mode=strict_trans_tables ==== diff --git a/mysql-test/suite/rpl/t/rpl_skip_incident.test b/mysql-test/suite/rpl/t/rpl_skip_incident.test index c6db5ef61d1..704854aeed8 100644 --- a/mysql-test/suite/rpl/t/rpl_skip_incident.test +++ b/mysql-test/suite/rpl/t/rpl_skip_incident.test @@ -1,5 +1,5 @@ ---source include/master-slave.inc --source include/have_debug.inc +--source include/master-slave.inc connection master; SET GLOBAL BINLOG_CHECKSUM=NONE; diff --git a/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test b/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test index b1af6e92c29..69319bad4a0 100644 --- a/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test +++ b/mysql-test/suite/rpl/t/rpl_slave_load_remove_tmpfile.test @@ -20,9 +20,9 @@ --source include/have_binlog_format_statement.inc --source include/have_innodb.inc --source include/have_debug.inc ---source include/master-slave.inc --source include/not_embedded.inc --source include/not_var_link.inc +--source include/master-slave.inc ########################################################################## # Loading data diff --git a/mysql-test/suite/rpl/t/rpl_slave_skip.test b/mysql-test/suite/rpl/t/rpl_slave_skip.test index 09ecccaf193..2ec80758486 100644 --- a/mysql-test/suite/rpl/t/rpl_slave_skip.test +++ b/mysql-test/suite/rpl/t/rpl_slave_skip.test @@ -4,8 +4,8 @@ # test for MIXED mode. source include/have_binlog_format_mixed.inc; -source include/master-slave.inc; source include/have_innodb.inc; +source include/master-slave.inc; connection slave; source include/have_innodb.inc; diff --git a/mysql-test/suite/rpl/t/rpl_slow_query_log.test b/mysql-test/suite/rpl/t/rpl_slow_query_log.test index 3505883c58e..df88d42ed68 100644 --- a/mysql-test/suite/rpl/t/rpl_slow_query_log.test +++ b/mysql-test/suite/rpl/t/rpl_slow_query_log.test @@ -25,8 +25,8 @@ # Note that due to the sleep() command the insert is written to the binary # log in row format. -source include/master-slave.inc; source include/have_binlog_format_statement.inc; +source include/master-slave.inc; CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); diff --git a/mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size.test b/mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size.test index 352213304b6..93cc06111e4 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size.test +++ b/mysql-test/suite/rpl/t/rpl_stm_binlog_max_cache_size.test @@ -1,8 +1,8 @@ --source include/have_innodb.inc ---source include/master-slave.inc --source include/not_embedded.inc --source include/not_windows.inc --source include/have_binlog_format_statement.inc +--source include/master-slave.inc --source extra/rpl_tests/rpl_binlog_max_cache_size.test --source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_stm_drop_create_temp_table.test b/mysql-test/suite/rpl/t/rpl_stm_drop_create_temp_table.test index 7770fc77748..b395654a714 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_drop_create_temp_table.test +++ b/mysql-test/suite/rpl/t/rpl_stm_drop_create_temp_table.test @@ -5,8 +5,8 @@ ################################################################################### --source include/big_test.inc --source include/have_binlog_format_statement.inc ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc --source extra/rpl_tests/rpl_drop_create_temp_table.test --source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_stm_implicit_commit_binlog.test b/mysql-test/suite/rpl/t/rpl_stm_implicit_commit_binlog.test index 1e66b76abc8..774c87f551e 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_implicit_commit_binlog.test +++ b/mysql-test/suite/rpl/t/rpl_stm_implicit_commit_binlog.test @@ -3,8 +3,8 @@ ################################################################################ --source include/have_udf.inc --source include/have_binlog_format_statement.inc ---source include/master-slave.inc --source include/have_innodb.inc +--source include/master-slave.inc --let $engine=Innodb set session storage_engine=innodb; diff --git a/mysql-test/suite/rpl/t/rpl_stm_loadfile.test b/mysql-test/suite/rpl/t/rpl_stm_loadfile.test index e82c951ce0c..016d3ed6090 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_loadfile.test +++ b/mysql-test/suite/rpl/t/rpl_stm_loadfile.test @@ -12,8 +12,8 @@ ########## # Includes --- source include/master-slave.inc -- source include/have_binlog_format_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"); diff --git a/mysql-test/suite/rpl/t/rpl_stm_start_stop_slave.test b/mysql-test/suite/rpl/t/rpl_stm_start_stop_slave.test index dfe2e49bb90..76b2aed3f24 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_start_stop_slave.test +++ b/mysql-test/suite/rpl/t/rpl_stm_start_stop_slave.test @@ -1,9 +1,9 @@ ################################################################################ # Please, check ./extra/rpl_tests/rpl_start_stop_slave.test ################################################################################ ---source include/master-slave.inc --source include/have_binlog_format_statement.inc --source include/have_innodb.inc +--source include/master-slave.inc # make innodb updates run fast --connection slave diff --git a/mysql-test/suite/rpl/t/rpl_stm_user_variables.test b/mysql-test/suite/rpl/t/rpl_stm_user_variables.test index 493ea4cd967..18b90658b31 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_user_variables.test +++ b/mysql-test/suite/rpl/t/rpl_stm_user_variables.test @@ -2,8 +2,8 @@ # BUG#49562: SBR out of sync when using numeric data types + user variable # --- source include/master-slave.inc -- source include/have_binlog_format_statement.inc +-- source include/master-slave.inc ## Setup user variables for several numeric types, so that we get ## coverage on the User_var_log_event different val types diff --git a/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test index 070e5189949..cbbf4c5ffa7 100644 --- a/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test +++ b/mysql-test/suite/rpl/t/rpl_temp_table_mix_row.test @@ -9,9 +9,9 @@ # 4: sync to slave and check the number of temp tables on slave. # -source include/master-slave.inc; source include/have_binlog_format_mixed.inc; source include/have_innodb.inc; +source include/master-slave.inc; --echo ==== Initialize ==== diff --git a/mysql-test/suite/rpl/t/rpl_temporal_format_mariadb53_to_mysql56_dst.test b/mysql-test/suite/rpl/t/rpl_temporal_format_mariadb53_to_mysql56_dst.test new file mode 100644 index 00000000000..511bdc15184 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_temporal_format_mariadb53_to_mysql56_dst.test @@ -0,0 +1,37 @@ +# +# MDEV-12672 Replicated TIMESTAMP fields given wrong value near DST change +# +source include/have_binlog_format_row.inc; +source include/master-slave.inc; + +connection slave; +set global time_zone='Europe/Moscow'; +set time_zone='UTC'; +stop slave; +start slave; + +connection master; +set global mysql56_temporal_format=false; +set global time_zone='Europe/Moscow'; +set time_zone='UTC'; + +create table t1 (pk int primary key, t timestamp not null); +set timestamp = 1288477526; +insert into t1 values (1,null); +set timestamp = 1288481126; +insert into t1 values (2,null); + +sync_slave_with_master; + +select pk, t, unix_timestamp(t) from t1; +set time_zone=default; +select pk, t, unix_timestamp(t) from t1; + +set global time_zone=default; + +connection master; +drop table t1; +set global time_zone=default; +set global mysql56_temporal_format=default; + +source include/rpl_end.inc; diff --git a/mysql-test/suite/rpl/t/rpl_temporary_errors.test b/mysql-test/suite/rpl/t/rpl_temporary_errors.test index ab050cdc076..6392fb90b9b 100644 --- a/mysql-test/suite/rpl/t/rpl_temporary_errors.test +++ b/mysql-test/suite/rpl/t/rpl_temporary_errors.test @@ -1,6 +1,6 @@ source include/have_binlog_format_row.inc; -source include/master-slave.inc; source include/have_innodb.inc; +source include/master-slave.inc; call mtr.add_suppression("Deadlock found"); call mtr.add_suppression("Can't find record in 't.'"); diff --git a/mysql-test/suite/rpl/t/sec_behind_master-5114.test b/mysql-test/suite/rpl/t/sec_behind_master-5114.test index ff8cab54c4f..d1d21bfa766 100644 --- a/mysql-test/suite/rpl/t/sec_behind_master-5114.test +++ b/mysql-test/suite/rpl/t/sec_behind_master-5114.test @@ -1,5 +1,5 @@ -source include/master-slave.inc; source include/have_binlog_format_statement.inc; +source include/master-slave.inc; call mtr.add_suppression("Unsafe statement written to the binary log"); diff --git a/mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result b/mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result index 6605f7c99b4..2d5bcfe553d 100644 --- a/mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result +++ b/mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result @@ -247,3 +247,5 @@ ERROR HY000: Expression in the GENERATED ALWAYS AS clause is too big # Constant expression create or replace table t1 (a int as (PI()) PERSISTENT); drop table if exists t1; +create table t1 (a timestamp, b varchar(255) as (date_format(a, '%w %a %m %b')) stored); +ERROR HY000: Function or expression 'date_format()' cannot be used in the GENERATED ALWAYS AS clause of `b` diff --git a/mysql-test/suite/vcol/r/vcol_supported_sql_funcs.result b/mysql-test/suite/vcol/r/vcol_supported_sql_funcs.result index 3fa4f6e1431..10ab32f9486 100644 --- a/mysql-test/suite/vcol/r/vcol_supported_sql_funcs.result +++ b/mysql-test/suite/vcol/r/vcol_supported_sql_funcs.result @@ -2894,6 +2894,21 @@ a b 2012-12-12 Wednesday Wed December Dec drop table t1; set sql_warnings = 0; +# DATE_FORMAT() STORED +set sql_warnings = 1; +create table t1 (a date, b varchar(100) as (date_format(a, '%W %a %M %b', 'de_DE')) STORED); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` date DEFAULT NULL, + `b` varchar(100) GENERATED ALWAYS AS (date_format(`a`,'%W %a %M %b','de_DE')) STORED +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +insert into t1 values ('2012-12-12',default); +select * from t1; +a b +2012-12-12 Mittwoch Mi Dezember Dez +drop table t1; +set sql_warnings = 0; # CURRENT_USER() set sql_warnings = 1; create table t1 (a char, b varchar(32) as (current_user())); diff --git a/mysql-test/suite/vcol/t/vcol_blocked_sql_funcs_main.inc b/mysql-test/suite/vcol/t/vcol_blocked_sql_funcs_main.inc index 766d0c7410c..37de02a2b29 100644 --- a/mysql-test/suite/vcol/t/vcol_blocked_sql_funcs_main.inc +++ b/mysql-test/suite/vcol/t/vcol_blocked_sql_funcs_main.inc @@ -354,3 +354,6 @@ eval create or replace table t1 (a int, b varchar(16384) as (concat(a,'$tmp_long create or replace table t1 (a int as (PI()) PERSISTENT); drop table if exists t1; + +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create table t1 (a timestamp, b varchar(255) as (date_format(a, '%w %a %m %b')) stored); diff --git a/mysql-test/suite/vcol/t/vcol_supported_sql_funcs_main.inc b/mysql-test/suite/vcol/t/vcol_supported_sql_funcs_main.inc index dafc42098dd..fa2162e5981 100644 --- a/mysql-test/suite/vcol/t/vcol_supported_sql_funcs_main.inc +++ b/mysql-test/suite/vcol/t/vcol_supported_sql_funcs_main.inc @@ -1197,6 +1197,12 @@ let $values1 = '2012-12-12',default; let $rows = 1; --source suite/vcol/inc/vcol_supported_sql_funcs.inc +--echo # DATE_FORMAT() STORED +let $cols = a date, b varchar(100) as (date_format(a, '%W %a %M %b', 'de_DE')) STORED; +let $values1 = '2012-12-12',default; +let $rows = 1; +--source suite/vcol/inc/vcol_supported_sql_funcs.inc + --echo # CURRENT_USER() let $cols = a char, b varchar(32) as (current_user()); let $values1 = 'a', default; diff --git a/mysql-test/t/create_or_replace2.test b/mysql-test/t/create_or_replace2.test index 6cee7fac2e9..199e5523811 100644 --- a/mysql-test/t/create_or_replace2.test +++ b/mysql-test/t/create_or_replace2.test @@ -3,9 +3,9 @@ # --source include/have_debug.inc ---source include/master-slave.inc --source include/have_binlog_format_row.inc --source include/have_innodb.inc +--source include/master-slave.inc --disable_warnings drop table if exists t1; diff --git a/mysql-test/t/insert.test b/mysql-test/t/insert.test index 80caefa5a0f..d57e9051e3f 100644 --- a/mysql-test/t/insert.test +++ b/mysql-test/t/insert.test @@ -602,3 +602,13 @@ remove_file $MYSQLD_DATADIR/test/t1.txt; drop view v1; drop table t1; SET @@sql_mode= @save_mode; + +# +# MDEV-13861 Assertion `0' failed in Protocol::end_statement +# +CREATE TABLE t1 (f INT); +CREATE VIEW v1 AS SELECT * FROM t1 WHERE f <=> 'foo' WITH CHECK OPTION; +--error ER_TRUNCATED_WRONG_VALUE +REPLACE INTO v1 SET f = NULL; +DROP VIEW v1; +DROP TABLE t1; diff --git a/mysql-test/t/locale.test b/mysql-test/t/locale.test index 4570b968ecf..a9a507bc387 100644 --- a/mysql-test/t/locale.test +++ b/mysql-test/t/locale.test @@ -144,6 +144,8 @@ SET lc_time_names=@old_50915_lc_time_names; # Item::print create view v1 as select + date_format('2001-10-02', '%c %b %M') as a, + date_format('2001-10-02', '%c %b %M', 'ru_RU') as a1, format(123456789,2) as b, format(123456789,2,'rm_CH') as b1; select * from v1; @@ -153,3 +155,29 @@ drop view v1; --echo # --echo # End of 10.2 tests --echo # + +# +# MDEV-11553 Can't restore a PERSISTENT column that uses DATE_FORMAT() +# +# 3-argument syntax for DATE_FORMAT() +select date_format('2001-01-01', '%w %a %W', 'ro_RO'); +select date_format('2001-01-03', '%w %a %W', 'ro_RO'); +select date_format('2001-01-05', '%w %a %W', 'ro_RO'); +select date_format('2001-01-07', '%w %a %W', 'ro_RO'); +select date_format('2001-01-01', '%w %a %W', 'de_AT'); +select date_format('2001-02-01', '%w %a %W', 'de_AT'); +select date_format('2001-03-01', '%w %a %W', 'de_AT'); +select date_format('2001-01-01', '%w %a %W', 'en_US'); +select date_format('2001-03-01', '%c %b %M', 'en_US'); +select date_format('2001-01-01', '%w %a %W', 'rm_CH'); +select date_format('2001-01-03', '%w %a %W', 'rm_CH'); +select date_format('2001-01-05', '%w %a %W', 'rm_CH'); +select date_format('2001-01-07', '%w %a %W', 'rm_CH'); +select date_format('2001-02-01', '%c %b %M', 'rm_CH'); +select date_format('2001-04-01', '%c %b %M', 'rm_CH'); +select date_format('2001-06-01', '%c %b %M', 'rm_CH'); +select date_format('2001-08-01', '%c %b %M', 'rm_CH'); +select date_format('2001-10-01', '%c %b %M', 'rm_CH'); +select date_format('2001-12-01', '%c %b %M', 'rm_CH'); +select date_format('2001-01-06', '%w %a %W', 'de_CH'); +select date_format('2001-09-01', '%c %b %M', 'de_CH'); diff --git a/mysql-test/t/myisam.test b/mysql-test/t/myisam.test index 572fa55e70f..0da542e499e 100644 --- a/mysql-test/t/myisam.test +++ b/mysql-test/t/myisam.test @@ -1769,6 +1769,19 @@ ALTER TABLE t1 DISABLE KEYS; OPTIMIZE TABLE t1; DROP TABLE t1; +# +# Check FLUSH FOR EXPORT +# + +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)) engine=myisam; +INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), + (6,'0'),(7,'0'); +flush tables test.t1 for export; +--error ER_TABLE_NOT_LOCKED_FOR_WRITE +insert into t1 values (8,'0'); +unlock tables; +drop table t1; + # # Check some variables # diff --git a/mysql-test/t/old-mode.test b/mysql-test/t/old-mode.test index b9012a96713..d7e8ce8ee55 100644 --- a/mysql-test/t/old-mode.test +++ b/mysql-test/t/old-mode.test @@ -83,3 +83,39 @@ SELECT TO_DAYS(a), TO_DAYS(b) FROM t1; DROP TABLE t1; SET @@global.mysql56_temporal_format=DEFAULT; +# +# MDEV-12672 Replicated TIMESTAMP fields given wrong value near DST change +# + +# Copy_field +set time_zone='Europe/Moscow'; +set global mysql56_temporal_format=false; +create table t1 (a timestamp); +set timestamp=1288477526; +insert t1 values (null); +insert t1 values (); +set timestamp=1288481126; +insert t1 values (null); +insert t1 values (); +select a, unix_timestamp(a) from t1; +set global mysql56_temporal_format=true; +select a, unix_timestamp(a) from t1; +alter table t1 modify a timestamp; +select a, unix_timestamp(a) from t1; +drop table t1; + +# field_conv_incompatible() +set global mysql56_temporal_format=false; +create table t1 (a timestamp); +set timestamp=1288477526; +insert t1 values (null); +set timestamp=1288481126; +insert t1 values (null); +select a, unix_timestamp(a) from t1; +set global mysql56_temporal_format=true; +select a, unix_timestamp(a) from t1; +create table t2 (a timestamp); +insert t2 select a from t1; +select a, unix_timestamp(a) from t2; +drop table t1, t2; +set time_zone=DEFAULT; diff --git a/mysql-test/t/stat_tables_repl.test b/mysql-test/t/stat_tables_repl.test index 999c49d37cf..ac24c9dcbd7 100644 --- a/mysql-test/t/stat_tables_repl.test +++ b/mysql-test/t/stat_tables_repl.test @@ -1,6 +1,6 @@ --source include/have_stat_tables.inc ---source include/master-slave.inc --source include/have_binlog_format_row.inc +--source include/master-slave.inc --echo # --echo # Bug mdev-485: unexpected failure with replication of DROP/ALTER table diff --git a/scripts/galera_recovery.sh b/scripts/galera_recovery.sh index d734ceb7ac7..de2e653c497 100644 --- a/scripts/galera_recovery.sh +++ b/scripts/galera_recovery.sh @@ -69,7 +69,7 @@ parse_arguments() { wsrep_recover_position() { # Redirect server's error log to the log file. eval /usr/sbin/mysqld $cmdline_args --user=$user --wsrep_recover \ - --log-error="$log_file" + --disable-log-error 2> "$log_file" ret=$? if [ $ret -ne 0 ]; then # Something went wrong, let us also print the error log so that it diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh index 48baf61be3a..3a06f7e4858 100644 --- a/scripts/mysqld_safe.sh +++ b/scripts/mysqld_safe.sh @@ -245,7 +245,7 @@ wsrep_recover_position() { local euid=$(id -u) local ret=0 - local wr_logfile=$(mktemp $DATADIR/wsrep_recovery.XXXXXX) + local wr_logfile=$(mktemp wsrep_recovery.XXXXXX) # safety checks if [ -z $wr_logfile ]; then @@ -263,11 +263,11 @@ wsrep_recover_position() { local wr_pidfile="$DATADIR/"`@HOSTNAME@`"-recover.pid" - local wr_options="--log_error='$wr_logfile' --pid-file='$wr_pidfile'" + local wr_options="--disable-log-error --pid-file='$wr_pidfile'" log_notice "WSREP: Running position recovery with $wr_options" - eval_log_error "$mysqld_cmd --wsrep_recover $wr_options" + eval_log_error "$mysqld_cmd --wsrep_recover $wr_options 2> $wr_logfile" local rp="$(grep 'WSREP: Recovered position:' $wr_logfile)" if [ -z "$rp" ]; then diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index 0940b394d54..329682fb8b4 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -389,18 +389,9 @@ ADD_CUSTOM_TARGET( SET_TARGET_PROPERTIES(GenServerSource PROPERTIES EXCLUDE_FROM_ALL TRUE) IF(WIN32 OR HAVE_DLOPEN AND NOT DISABLE_SHARED) - ADD_LIBRARY(udf_example MODULE udf_example.c) + ADD_LIBRARY(udf_example MODULE udf_example.c udf_example.def) SET_TARGET_PROPERTIES(udf_example PROPERTIES PREFIX "") - # udf_example depends on strings - IF(WIN32) - IF(MSVC) - SET_TARGET_PROPERTIES(udf_example PROPERTIES LINK_FLAGS "/DEF:${CMAKE_CURRENT_SOURCE_DIR}/udf_example.def") - ENDIF() - TARGET_LINK_LIBRARIES(udf_example strings) - ELSE() - # udf_example is using safemutex exported by mysqld - TARGET_LINK_LIBRARIES(udf_example mysqld) - ENDIF() + TARGET_LINK_LIBRARIES(udf_example strings) ENDIF() CONFIGURE_FILE( diff --git a/sql/field.cc b/sql/field.cc index 4449d0ecf31..363c3bbf73b 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1713,6 +1713,33 @@ int Field::store(const char *to, uint length, CHARSET_INFO *cs, } +static int timestamp_to_TIME(THD *thd, MYSQL_TIME *ltime, my_time_t ts, + ulong sec_part, ulonglong fuzzydate) +{ + thd->time_zone_used= 1; + if (ts == 0 && sec_part == 0) + { + if (fuzzydate & TIME_NO_ZERO_DATE) + return 1; + set_zero_time(ltime, MYSQL_TIMESTAMP_DATETIME); + } + else + { + thd->variables.time_zone->gmt_sec_to_TIME(ltime, ts); + ltime->second_part= sec_part; + } + return 0; +} + + +int Field::store_timestamp(my_time_t ts, ulong sec_part) +{ + MYSQL_TIME ltime; + THD *thd= get_thd(); + timestamp_to_TIME(thd, <ime, ts, sec_part, 0); + return store_time_dec(<ime, decimals()); +} + /** Pack the field into a format suitable for storage and transfer. @@ -4810,6 +4837,13 @@ Field_timestamp::Field_timestamp(uchar *ptr_arg, uint32 len_arg, } +int Field_timestamp::save_in_field(Field *to) +{ + ulong sec_part; + my_time_t ts= get_timestamp(&sec_part); + return to->store_timestamp(ts, sec_part); +} + my_time_t Field_timestamp::get_timestamp(const uchar *pos, ulong *sec_part) const { @@ -4936,6 +4970,22 @@ int Field_timestamp::store(longlong nr, bool unsigned_val) } +int Field_timestamp::store_timestamp(my_time_t ts, ulong sec_part) +{ + store_TIME(ts, sec_part); + if (ts == 0 && sec_part == 0 && + get_thd()->variables.sql_mode & TIME_NO_ZERO_DATE) + { + ErrConvString s( + STRING_WITH_LEN("0000-00-00 00:00:00.000000") - (decimals() ? 6 - decimals() : 7), + system_charset_info); + set_datetime_warning(WARN_DATA_TRUNCATED, &s, MYSQL_TIMESTAMP_DATETIME, 1); + return 1; + } + return 0; +} + + double Field_timestamp::val_real(void) { return (double) Field_timestamp::val_int(); @@ -5039,22 +5089,9 @@ Field_timestamp::validate_value_in_record(THD *thd, const uchar *record) const bool Field_timestamp::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) { - THD *thd= get_thd(); - thd->time_zone_used= 1; ulong sec_part; - my_time_t temp= get_timestamp(&sec_part); - if (temp == 0 && sec_part == 0) - { /* Zero time is "000000" */ - if (fuzzydate & TIME_NO_ZERO_DATE) - return 1; - set_zero_time(ltime, MYSQL_TIMESTAMP_DATETIME); - } - else - { - thd->variables.time_zone->gmt_sec_to_TIME(ltime, (my_time_t)temp); - ltime->second_part= sec_part; - } - return 0; + my_time_t ts= get_timestamp(&sec_part); + return timestamp_to_TIME(get_thd(), ltime, ts, sec_part, fuzzydate); } @@ -5104,36 +5141,6 @@ int Field_timestamp::set_time() return 0; } -/** - Mark the field as having an explicit default value. - - @param value if available, the value that the field is being set to - @returns whether the explicit default bit was set - - @note - Fields that have an explicit default value should not be updated - automatically via the DEFAULT or ON UPDATE functions. The functions - that deal with data change functionality (INSERT/UPDATE/LOAD), - determine if there is an explicit value for each field before performing - the data change, and call this method to mark the field. - - For timestamp columns, the only case where a column is not marked - as been given a value are: - - It's explicitly assigned with DEFAULT - - We assign NULL to a timestamp field that is defined as NOT NULL. - This is how MySQL has worked since it's start. -*/ - -bool Field_timestamp::set_explicit_default(Item *value) -{ - if (((value->type() == Item::DEFAULT_VALUE_ITEM && - !((Item_default_value*)value)->arg) || - (!maybe_null() && value->null_value))) - return false; - set_has_explicit_value(); - return true; -} - #ifdef NOT_USED static void store_native(ulonglong num, uchar *to, uint bytes) { diff --git a/sql/field.h b/sql/field.h index 73a0ec8bbd3..7ad47df3909 100644 --- a/sql/field.h +++ b/sql/field.h @@ -213,7 +213,8 @@ protected: CHARSET_INFO *cs, const char *str, size_t length, my_decimal *buf) { - m_error= str2my_decimal(mask, str, length, cs, + DBUG_ASSERT(length < UINT_MAX32); + m_error= str2my_decimal(mask, str, (uint) length, cs, buf, (const char **) &m_end_of_num); // E_DEC_TRUNCATED means a very minor truncation: '1e-100' -> 0 m_edom= m_error && m_error != E_DEC_TRUNCATED; @@ -657,12 +658,16 @@ protected: static void do_field_real(Copy_field *copy); static void do_field_string(Copy_field *copy); static void do_field_temporal(Copy_field *copy); + static void do_field_timestamp(Copy_field *copy); static void do_field_decimal(Copy_field *copy); public: static void *operator new(size_t size, MEM_ROOT *mem_root) throw () { return alloc_root(mem_root, size); } static void *operator new(size_t size) throw () - { return thd_alloc(current_thd, size); } + { + DBUG_ASSERT(size < UINT_MAX32); + return thd_alloc(current_thd, (uint) size); + } static void operator delete(void *ptr_arg, size_t size) { TRASH(ptr_arg, size); } static void operator delete(void *ptr, MEM_ROOT *mem_root) { DBUG_ASSERT(0); } @@ -812,16 +817,26 @@ public: virtual int store(longlong nr, bool unsigned_val)=0; virtual int store_decimal(const my_decimal *d)=0; virtual int store_time_dec(MYSQL_TIME *ltime, uint dec); + virtual int store_timestamp(my_time_t timestamp, ulong sec_part); int store_time(MYSQL_TIME *ltime) { return store_time_dec(ltime, TIME_SECOND_PART_DIGITS); } int store(const char *to, uint length, CHARSET_INFO *cs, enum_check_fields check_level); int store(const LEX_STRING *ls, CHARSET_INFO *cs) - { return store(ls->str, ls->length, cs); } + { + DBUG_ASSERT(ls->length < UINT_MAX32); + return store(ls->str, (uint) ls->length, cs); + } int store(const LEX_CSTRING *ls, CHARSET_INFO *cs) - { return store(ls->str, ls->length, cs); } + { + DBUG_ASSERT(ls->length < UINT_MAX32); + return store(ls->str, (uint) ls->length, cs); + } int store(const LEX_CSTRING &ls, CHARSET_INFO *cs) - { return store(ls.str, ls.length, cs); } + { + DBUG_ASSERT(ls.length < UINT_MAX32); + return store(ls.str, (uint) ls.length, cs); + } virtual double val_real(void)=0; virtual longlong val_int(void)=0; virtual bool val_bool(void)= 0; @@ -982,7 +997,7 @@ public: { return bitmap_is_set(&table->has_value_set, field_index); } - virtual bool set_explicit_default(Item *value); + bool set_explicit_default(Item *value); /** Evaluates the @c UPDATE default function, if one exists, and stores the @@ -2385,11 +2400,14 @@ public: TABLE_SHARE *share); const Type_handler *type_handler() const { return &type_handler_timestamp; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } + Copy_func *get_copy_func(const Field *from) const; int store(const char *to,uint length,CHARSET_INFO *charset); int store(double nr); int store(longlong nr, bool unsigned_val); int store_time_dec(MYSQL_TIME *ltime, uint dec); int store_decimal(const my_decimal *); + int store_timestamp(my_time_t timestamp, ulong sec_part); + int save_in_field(Field *to); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -2400,7 +2418,6 @@ public: void sql_type(String &str) const; bool zero_pack() const { return 0; } int set_time(); - bool set_explicit_default(Item *value); int evaluate_update_default_function() { int res= 0; @@ -2509,7 +2526,7 @@ public: class Field_timestampf :public Field_timestamp_with_dec { int save_field_metadata(uchar *metadata_ptr) { - *metadata_ptr= decimals(); + *metadata_ptr= (uchar) decimals(); return 1; } public: @@ -2777,7 +2794,7 @@ class Field_timef :public Field_time_with_dec { void store_TIME(MYSQL_TIME *ltime); int save_field_metadata(uchar *metadata_ptr) { - *metadata_ptr= decimals(); + *metadata_ptr= (uchar) decimals(); return 1; } public: @@ -2939,7 +2956,7 @@ class Field_datetimef :public Field_datetime_with_dec { bool get_TIME(MYSQL_TIME *ltime, const uchar *pos, ulonglong fuzzydate) const; int save_field_metadata(uchar *metadata_ptr) { - *metadata_ptr= decimals(); + *metadata_ptr= (uchar) decimals(); return 1; } public: @@ -3582,7 +3599,7 @@ public: enum storage_type { GEOM_STORAGE_WKB= 0, GEOM_STORAGE_BINARY= 1}; enum storage_type storage; - Field_geom(uchar *ptr_arg, uchar *null_ptr_arg, uint null_bit_arg, + Field_geom(uchar *ptr_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg, TABLE_SHARE *share, uint blob_pack_length, enum geometry_type geom_type_arg, uint field_srid) @@ -3988,7 +4005,8 @@ class Column_definition: public Sql_alloc, *pos ; pos++, len++) { size_t length= charset->cset->numchars(charset, *pos, *pos + *len); - *tot_length+= length; + DBUG_ASSERT(length < UINT_MAX32); + *tot_length+= (uint) length; set_if_bigger(*max_length, (uint32)length); } } diff --git a/sql/field_conv.cc b/sql/field_conv.cc index d97c9f1fd04..a817db51569 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -417,6 +417,13 @@ void Field::do_field_decimal(Copy_field *copy) } +void Field::do_field_timestamp(Copy_field *copy) +{ + // XXX why couldn't we do it everywhere? + copy->from_field->save_in_field(copy->to_field); +} + + void Field::do_field_temporal(Copy_field *copy) { MYSQL_TIME ltime; @@ -706,6 +713,16 @@ void Copy_field::set(Field *to,Field *from,bool save) } +Field::Copy_func *Field_timestamp::get_copy_func(const Field *from) const +{ + Field::Copy_func *copy= Field_temporal::get_copy_func(from); + if (copy == do_field_temporal && from->type() == MYSQL_TYPE_TIMESTAMP) + return do_field_timestamp; + else + return copy; +} + + Field::Copy_func *Field_temporal::get_copy_func(const Field *from) const { /* If types are not 100 % identical then convert trough get_date() */ diff --git a/sql/item.cc b/sql/item.cc index 8e77a731400..92459bd6f7f 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1450,6 +1450,25 @@ bool Item::get_seconds(ulonglong *sec, ulong *sec_part) return my_decimal2seconds(dec, sec, sec_part); } +const MY_LOCALE *Item::locale_from_val_str() +{ + StringBuffer tmp; + String *locale_name= val_str_ascii(&tmp); + const MY_LOCALE *lc; + if (!locale_name || + !(lc= my_locale_by_name(locale_name->c_ptr_safe()))) + { + THD *thd= current_thd; + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_UNKNOWN_LOCALE, + ER_THD(thd, ER_UNKNOWN_LOCALE), + locale_name ? locale_name->c_ptr_safe() : "NULL"); + lc= &my_locale_en_US; + } + return lc; +} + + CHARSET_INFO *Item::default_charset() { return current_thd->variables.collation_connection; diff --git a/sql/item.h b/sql/item.h index 2dba7890d3b..e823d327441 100644 --- a/sql/item.h +++ b/sql/item.h @@ -491,6 +491,8 @@ struct find_selective_predicates_list_processor_data List list; }; +class MY_LOCALE; + class Item_equal; class COND_EQUAL; @@ -644,6 +646,8 @@ public: */ String *val_str() { return val_str(&str_value); } + const MY_LOCALE *locale_from_val_str(); + LEX_CSTRING name; /* Name of item */ /* Original item name (if it was renamed)*/ const char *orig_name; @@ -3549,7 +3553,7 @@ public: { str_value.set_or_copy_aligned(str, length, cs); fix_from_value(dv, Metadata(&str_value)); - set_name(thd, name_par, safe_strlen(name_par), system_charset_info); + set_name(thd, name_par, (uint) safe_strlen(name_par), system_charset_info); } Item_string(THD *thd, const char *name_par, const char *str, uint length, CHARSET_INFO *cs, Derivation dv, uint repertoire): @@ -3557,7 +3561,7 @@ public: { str_value.set_or_copy_aligned(str, length, cs); fix_from_value(dv, Metadata(&str_value, repertoire)); - set_name(thd, name_par, safe_strlen(name_par), system_charset_info); + set_name(thd, name_par, (uint) safe_strlen(name_par), system_charset_info); } void print_value(String *to) const { @@ -3679,7 +3683,7 @@ public: Item_string(thd, str, length, system_charset_info) { } Item_string_sys(THD *thd, const char *str): - Item_string(thd, str, strlen(str), system_charset_info) + Item_string(thd, str, (uint) strlen(str), system_charset_info) { } }; @@ -3692,7 +3696,7 @@ public: DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII) { } Item_string_ascii(THD *thd, const char *str): - Item_string(thd, str, strlen(str), &my_charset_latin1, + Item_string(thd, str, (uint) strlen(str), &my_charset_latin1, DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII) { } }; @@ -3769,7 +3773,8 @@ class Item_blob :public Item_partition_func_safe_string { public: Item_blob(THD *thd, const char *name_arg, uint length): - Item_partition_func_safe_string(thd, name_arg, safe_strlen(name_arg), &my_charset_bin) + Item_partition_func_safe_string(thd, name_arg, (uint) safe_strlen(name_arg), + &my_charset_bin) { max_length= length; } enum Type type() const { return TYPE_HOLDER; } const Type_handler *type_handler() const diff --git a/sql/item_create.cc b/sql/item_create.cc index 8bde2dcc53a..32f47ae5b23 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -783,19 +783,6 @@ protected: #endif -class Create_func_date_format : public Create_func_arg2 -{ -public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); - - static Create_func_date_format s_singleton; - -protected: - Create_func_date_format() {} - virtual ~Create_func_date_format() {} -}; - - class Create_func_datediff : public Create_func_arg2 { public: @@ -4051,15 +4038,6 @@ Create_func_crosses::create_2_arg(THD *thd, Item *arg1, Item *arg2) #endif -Create_func_date_format Create_func_date_format::s_singleton; - -Item* -Create_func_date_format::create_2_arg(THD *thd, Item *arg1, Item *arg2) -{ - return new (thd->mem_root) Item_func_date_format(thd, arg1, arg2, 0); -} - - Create_func_datediff Create_func_datediff::s_singleton; Item* @@ -4558,7 +4536,7 @@ Create_func_from_unixtime::create_native(THD *thd, LEX_CSTRING *name, Item *param_1= item_list->pop(); Item *param_2= item_list->pop(); Item *ut= new (thd->mem_root) Item_func_from_unixtime(thd, param_1); - func= new (thd->mem_root) Item_func_date_format(thd, ut, param_2, 0); + func= new (thd->mem_root) Item_func_date_format(thd, ut, param_2); break; } default: @@ -6511,7 +6489,7 @@ Create_func_time_format Create_func_time_format::s_singleton; Item* Create_func_time_format::create_2_arg(THD *thd, Item *arg1, Item *arg2) { - return new (thd->mem_root) Item_func_date_format(thd, arg1, arg2, 1); + return new (thd->mem_root) Item_func_time_format(thd, arg1, arg2); } @@ -6872,7 +6850,6 @@ static Native_func_registry func_array[] = { { C_STRING_WITH_LEN("CRC32") }, BUILDER(Create_func_crc32)}, { { C_STRING_WITH_LEN("CROSSES") }, GEOM_BUILDER(Create_func_crosses)}, { { C_STRING_WITH_LEN("DATEDIFF") }, BUILDER(Create_func_datediff)}, - { { C_STRING_WITH_LEN("DATE_FORMAT") }, BUILDER(Create_func_date_format)}, { { C_STRING_WITH_LEN("DAYNAME") }, BUILDER(Create_func_dayname)}, { { C_STRING_WITH_LEN("DAYOFMONTH") }, BUILDER(Create_func_dayofmonth)}, { { C_STRING_WITH_LEN("DAYOFWEEK") }, BUILDER(Create_func_dayofweek)}, diff --git a/sql/item_func.h b/sql/item_func.h index a25d9aed4d7..04045eefafb 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -928,7 +928,8 @@ class Item_decimal_typecast :public Item_func { my_decimal decimal_value; public: - Item_decimal_typecast(THD *thd, Item *a, int len, int dec): Item_func(thd, a) + Item_decimal_typecast(THD *thd, Item *a, uint len, uint dec) + :Item_func(thd, a) { decimals= (uint8) dec; collation.set_numeric(); @@ -956,7 +957,7 @@ public: class Item_double_typecast :public Item_real_func { public: - Item_double_typecast(THD *thd, Item *a, int len, int dec): + Item_double_typecast(THD *thd, Item *a, uint len, uint dec): Item_real_func(thd, a) { decimals= (uint8) dec; @@ -2398,7 +2399,10 @@ class Item_user_var_as_out_param :public Item public: Item_user_var_as_out_param(THD *thd, const LEX_CSTRING *a) :Item(thd), name(*a) - { set_name(thd, a->str, a->length, system_charset_info); } + { + DBUG_ASSERT(a->length < UINT_MAX32); + set_name(thd, a->str, (uint) a->length, system_charset_info); + } /* We should return something different from FIELD_ITEM here */ enum Type type() const { return STRING_ITEM;} double val_real(); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index cb05516964c..cc3c421f185 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2668,24 +2668,6 @@ String *Item_func_soundex::val_str(String *str) const int FORMAT_MAX_DECIMALS= 30; -MY_LOCALE *Item_func_format::get_locale(Item *item) -{ - DBUG_ASSERT(arg_count == 3); - String tmp, *locale_name= args[2]->val_str_ascii(&tmp); - MY_LOCALE *lc; - if (!locale_name || - !(lc= my_locale_by_name(locale_name->c_ptr_safe()))) - { - THD *thd= current_thd; - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_UNKNOWN_LOCALE, - ER_THD(thd, ER_UNKNOWN_LOCALE), - locale_name ? locale_name->c_ptr_safe() : "NULL"); - lc= &my_locale_en_US; - } - return lc; -} - void Item_func_format::fix_length_and_dec() { uint32 char_length= args[0]->max_char_length(); @@ -2693,7 +2675,7 @@ void Item_func_format::fix_length_and_dec() collation.set(default_charset()); fix_char_length(char_length + max_sep_count + decimals); if (arg_count == 3) - locale= args[2]->basic_const_item() ? get_locale(args[2]) : NULL; + locale= args[2]->basic_const_item() ? args[2]->locale_from_val_str() : NULL; else locale= &my_locale_en_US; /* Two arguments */ } @@ -2712,7 +2694,7 @@ String *Item_func_format::val_str_ascii(String *str) int dec; /* Number of characters used to represent the decimals, including '.' */ uint32 dec_length; - MY_LOCALE *lc; + const MY_LOCALE *lc; DBUG_ASSERT(fixed == 1); dec= (int) args[1]->val_int(); @@ -2722,7 +2704,7 @@ String *Item_func_format::val_str_ascii(String *str) return NULL; } - lc= locale ? locale : get_locale(args[2]); + lc= locale ? locale : args[2]->locale_from_val_str(); dec= set_zone(dec, 0, FORMAT_MAX_DECIMALS); dec_length= dec ? dec+1 : 0; diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 685a64816be..d73bd0b76d7 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -27,8 +27,6 @@ extern size_t username_char_length; -class MY_LOCALE; - class Item_str_func :public Item_func { protected: @@ -825,7 +823,7 @@ public: bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec() { - max_length= (username_char_length + + max_length= (uint32) (username_char_length + HOSTNAME_LENGTH + 1) * SYSTEM_CHARSET_MBMAXLEN; } const char *func_name() const { return "user"; } @@ -867,7 +865,7 @@ public: Item_func_sysconst(thd), context(context_arg) {} bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec() - { max_length= username_char_length * SYSTEM_CHARSET_MBMAXLEN; } + { max_length= (uint32) username_char_length * SYSTEM_CHARSET_MBMAXLEN; } int save_in_field(Field *field, bool no_conversions) { return save_str_value_in_field(field, &str_value); } const char *func_name() const { return "current_role"; } @@ -932,14 +930,13 @@ public: class Item_func_format :public Item_str_ascii_func { - MY_LOCALE *locale; + const MY_LOCALE *locale; public: Item_func_format(THD *thd, Item *org, Item *dec): Item_str_ascii_func(thd, org, dec) {} Item_func_format(THD *thd, Item *org, Item *dec, Item *lang): Item_str_ascii_func(thd, org, dec, lang) {} - MY_LOCALE *get_locale(Item *item); String *val_str_ascii(String *); void fix_length_and_dec(); const char *func_name() const { return "format"; } diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 0657d483408..f1f69d0723b 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -455,7 +455,8 @@ err: */ static bool make_date_time(DATE_TIME_FORMAT *format, MYSQL_TIME *l_time, - timestamp_type type, MY_LOCALE *locale, String *str) + timestamp_type type, const MY_LOCALE *locale, + String *str) { char intbuff[15]; uint hours_i; @@ -1706,6 +1707,25 @@ void Item_func_now::print(String *str, enum_query_type query_type) str->append(')'); } + +int Item_func_now_local::save_in_field(Field *field, bool no_conversions) +{ + if (field->type() == MYSQL_TYPE_TIMESTAMP) + { + THD *thd= field->get_thd(); + my_time_t ts= thd->query_start(); + uint dec= MY_MIN(decimals, field->decimals()); + ulong sec_part= dec ? thd->query_start_sec_part() : 0; + sec_part-= my_time_fraction_remainder(sec_part, dec); + field->set_notnull(); + ((Field_timestamp*)field)->store_TIME(ts, sec_part); + return 0; + } + else + return Item_temporal_func::save_in_field(field, no_conversions); +} + + /** Converts current time in my_time_t to MYSQL_TIME represenatation for local time zone. Defines time zone (local) used for whole NOW function. @@ -1814,7 +1834,14 @@ overflow: void Item_func_date_format::fix_length_and_dec() { THD* thd= current_thd; - locale= thd->variables.lc_time_names; + if (!is_time_format) + { + if (arg_count < 3) + locale= thd->variables.lc_time_names; + else + if (args[2]->basic_const_item()) + locale= args[2]->locale_from_val_str(); + } /* Must use this_item() in case it's a local SP variable @@ -1856,6 +1883,8 @@ bool Item_func_date_format::eq(const Item *item, bool binary_cmp) const if (this == item) return 1; item_func= (Item_func_date_format*) item; + if (arg_count != item_func->arg_count) + return 0; if (!args[0]->eq(item_func->args[0], binary_cmp)) return 0; /* @@ -1865,6 +1894,8 @@ bool Item_func_date_format::eq(const Item *item, bool binary_cmp) const */ if (!args[1]->eq(item_func->args[1], 1)) return 0; + if (arg_count > 2 && !args[2]->eq(item_func->args[2], 1)) + return 0; return 1; } @@ -1948,15 +1979,18 @@ String *Item_func_date_format::val_str(String *str) String *format; MYSQL_TIME l_time; uint size; - int is_time_flag = is_time_format ? TIME_TIME_ONLY : 0; + const MY_LOCALE *lc= 0; DBUG_ASSERT(fixed == 1); - if (get_arg0_date(&l_time, is_time_flag)) + if (get_arg0_date(&l_time, is_time_format ? TIME_TIME_ONLY : 0)) return 0; if (!(format = args[1]->val_str(str)) || !format->length()) goto null_date; + if (!is_time_format && !(lc= locale) && !(lc= args[2]->locale_from_val_str())) + goto null_date; // invalid locale + if (fixed_length) size=max_length; else @@ -1979,7 +2013,7 @@ String *Item_func_date_format::val_str(String *str) if (!make_date_time(&date_time_format, &l_time, is_time_format ? MYSQL_TIMESTAMP_TIME : MYSQL_TIMESTAMP_DATE, - locale, str)) + lc, str)) return str; null_date: diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index a752c160557..20ecb4774b3 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -729,6 +729,7 @@ class Item_func_now_local :public Item_func_now public: Item_func_now_local(THD *thd, uint dec): Item_func_now(thd, dec) {} const char *func_name() const { return "current_timestamp"; } + int save_in_field(Field *field, bool no_conversions); virtual void store_now_in_TIME(THD *thd, MYSQL_TIME *now_time); virtual enum Functype functype() const { return NOW_FUNC; } Item *get_copy(THD *thd, MEM_ROOT *mem_root) @@ -796,22 +797,24 @@ public: class Item_func_date_format :public Item_str_func { - MY_LOCALE *locale; + const MY_LOCALE *locale; int fixed_length; - const bool is_time_format; String value; +protected: + bool is_time_format; public: - Item_func_date_format(THD *thd, Item *a, Item *b, bool is_time_format_arg): - Item_str_func(thd, a, b), is_time_format(is_time_format_arg) {} + Item_func_date_format(THD *thd, Item *a, Item *b): + Item_str_func(thd, a, b), locale(0), is_time_format(false) {} + Item_func_date_format(THD *thd, Item *a, Item *b, Item *c): + Item_str_func(thd, a, b, c), locale(0), is_time_format(false) {} String *val_str(String *str); - const char *func_name() const - { return is_time_format ? "time_format" : "date_format"; } + const char *func_name() const { return "date_format"; } void fix_length_and_dec(); uint format_length(const String *format); bool eq(const Item *item, bool binary_cmp) const; bool check_vcol_func_processor(void *arg) { - if (is_time_format) + if (arg_count > 2) return false; return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } @@ -819,6 +822,17 @@ public: { return get_item_copy(thd, mem_root, this); } }; +class Item_func_time_format: public Item_func_date_format +{ +public: + Item_func_time_format(THD *thd, Item *a, Item *b): + Item_func_date_format(thd, a, b) { is_time_format= true; } + const char *func_name() const { return "time_format"; } + bool check_vcol_func_processor(void *arg) { return false; } + Item *get_copy(THD *thd, MEM_ROOT *mem_root) + { return get_item_copy(thd, mem_root, this); } +}; + class Item_func_from_unixtime :public Item_datetimefunc { diff --git a/sql/lex.h b/sql/lex.h index 17dd45f9c0b..ef03afb7a32 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -727,6 +727,7 @@ static SYMBOL sql_functions[] = { { "CURTIME", SYM(CURTIME)}, { "DATE_ADD", SYM(DATE_ADD_INTERVAL)}, { "DATE_SUB", SYM(DATE_SUB_INTERVAL)}, + { "DATE_FORMAT", SYM(DATE_FORMAT_SYM)}, { "DECODE", SYM(DECODE_SYM)}, { "DENSE_RANK", SYM(DENSE_RANK_SYM)}, { "EXTRACT", SYM(EXTRACT_SYM)}, diff --git a/sql/sql_alloc.h b/sql/sql_alloc.h index 36fe665c475..4db12964f0a 100644 --- a/sql/sql_alloc.h +++ b/sql/sql_alloc.h @@ -27,11 +27,13 @@ class Sql_alloc public: static void *operator new(size_t size) throw () { - return thd_alloc(thd_get_current_thd(), size); + DBUG_ASSERT(size < UINT_MAX32); + return thd_alloc(thd_get_current_thd(), uint(size)); } static void *operator new[](size_t size) throw () { - return thd_alloc(thd_get_current_thd(), size); + DBUG_ASSERT(size < UINT_MAX32); + return thd_alloc(thd_get_current_thd(), uint(size)); } static void *operator new[](size_t size, MEM_ROOT *mem_root) throw () { return alloc_root(mem_root, size); } diff --git a/sql/sql_class.h b/sql/sql_class.h index bbe074d9288..2bbcf3cd436 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1653,6 +1653,29 @@ public: }; +/** + Implements the trivial error handler which counts errors as they happen. +*/ + +class Counting_error_handler : public Internal_error_handler +{ +public: + int errors; + bool handle_condition(THD *thd, + uint sql_errno, + const char* sqlstate, + Sql_condition::enum_warning_level *level, + const char* msg, + Sql_condition ** cond_hdl) + { + if (*level == Sql_condition::WARN_LEVEL_ERROR) + errors++; + return false; + } + Counting_error_handler() : errors(0) {} +}; + + /** This class is an internal error handler implementation for DROP TABLE statements. The thing is that there may be warnings during diff --git a/sql/sql_error.h b/sql/sql_error.h index 12344ccf78c..f8b8adc805a 100644 --- a/sql/sql_error.h +++ b/sql/sql_error.h @@ -837,7 +837,10 @@ public: ErrConvString(const String *s) : ErrConv(), str(s->ptr()), len(s->length()), cs(s->charset()) {} const char *ptr() const - { return err_conv(err_buffer, sizeof(err_buffer), str, len, cs); } + { + DBUG_ASSERT(len < UINT_MAX32); + return err_conv(err_buffer, (uint) sizeof(err_buffer), str, (uint) len, cs); + } }; class ErrConvInteger : public ErrConv diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index 581a9cb8d1d..5b3d46fc747 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -3863,6 +3863,7 @@ int JOIN_TAB_SCAN_MRR::open() /* Dynamic range access is never used with BKA */ DBUG_ASSERT(join_tab->use_quick != 2); + join_tab->tracker->r_scans++; save_or_restore_used_tabs(join_tab, FALSE); init_mrr_buff(); @@ -3906,6 +3907,8 @@ int JOIN_TAB_SCAN_MRR::next() int rc= join_tab->table->file->multi_range_read_next((range_id_t*)ptr) ? -1 : 0; if (!rc) { + join_tab->tracker->r_rows++; + join_tab->tracker->r_rows_after_where++; /* If a record in in an incremental cache contains no fields then the association for the last record in cache will be equal to cache->end_pos diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 87891c87344..245e995bc2d 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -3424,9 +3424,13 @@ public: Item_param *add_placeholder(THD *thd, const LEX_CSTRING *name, uint pos_in_query, uint len_in_query); Item_param *add_placeholder(THD *thd, const LEX_CSTRING *name, - const char *pos, const char *end) + const char *start, const char *end) { - return add_placeholder(thd, name, pos - substatement_query(thd), end - pos); + size_t pos= start - substatement_query(thd); + size_t len= end - start; + DBUG_ASSERT(pos < UINT_MAX32); + DBUG_ASSERT(len < UINT_MAX32); + return add_placeholder(thd, name, (uint) pos, (uint) len); } /* Integer range FOR LOOP methods */ diff --git a/sql/sql_string.h b/sql/sql_string.h index 5dbb110135f..af3765443c5 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -469,9 +469,21 @@ public: } bool append(const String &s); bool append(const char *s); - bool append(const LEX_STRING *ls) { return append(ls->str, ls->length); } - bool append(const LEX_CSTRING *ls) { return append(ls->str, ls->length); } - bool append(const LEX_CSTRING &ls) { return append(ls.str, ls.length); } + bool append(const LEX_STRING *ls) + { + DBUG_ASSERT(ls->length < UINT_MAX32); + return append(ls->str, (uint32) ls->length); + } + bool append(const LEX_CSTRING *ls) + { + DBUG_ASSERT(ls->length < UINT_MAX32); + return append(ls->str, (uint32) ls->length); + } + bool append(const LEX_CSTRING &ls) + { + DBUG_ASSERT(ls.length < UINT_MAX32); + return append(ls.str, (uint32) ls.length); + } bool append(const char *s, uint32 arg_length); bool append(const char *s, uint32 arg_length, CHARSET_INFO *cs); bool append_ulonglong(ulonglong val); @@ -563,7 +575,8 @@ public: } void q_append(const LEX_CSTRING *ls) { - q_append(ls->str, ls->length); + DBUG_ASSERT(ls->length < UINT_MAX32); + q_append(ls->str, (uint32) ls->length); } void write_at_position(int position, uint32 value) @@ -647,7 +660,9 @@ public: } bool append_for_single_quote(const char *st) { - return append_for_single_quote(st, strlen(st)); + size_t len= strlen(st); + DBUG_ASSERT(len < UINT_MAX32); + return append_for_single_quote(st, (uint32) len); } /* Swap two string objects. Efficient way to exchange data without memcpy. */ @@ -691,10 +706,11 @@ public: } void q_net_store_data(const uchar *from, size_t length) { + DBUG_ASSERT(length < UINT_MAX32); DBUG_ASSERT(Alloced_length >= (str_length + length + net_length_size(length))); q_net_store_length(length); - q_append((const char *)from, length); + q_append((const char *)from, (uint32) length); } }; diff --git a/sql/sql_time.h b/sql/sql_time.h index c6462c93e21..91a026512c1 100644 --- a/sql/sql_time.h +++ b/sql/sql_time.h @@ -105,7 +105,7 @@ inline void datetime_to_date(MYSQL_TIME *ltime) DBUG_ASSERT(ltime->time_type == MYSQL_TIMESTAMP_DATE || ltime->time_type == MYSQL_TIMESTAMP_DATETIME); DBUG_ASSERT(ltime->neg == 0); - ltime->hour= ltime->minute= ltime->second= ltime->second_part= 0; + ltime->second_part= ltime->hour= ltime->minute= ltime->second= 0; ltime->time_type= MYSQL_TIMESTAMP_DATE; } inline void date_to_datetime(MYSQL_TIME *ltime) diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 3f6ba89fb50..df79a55f8e6 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -160,7 +160,7 @@ void Type_std_attributes::count_decimal_length(Item **item, uint nitems) } int precision= MY_MIN(max_int_part + decimals, DECIMAL_MAX_PRECISION); fix_char_length(my_decimal_precision_to_length_no_truncation(precision, - decimals, + (uint8) decimals, unsigned_flag)); } @@ -998,7 +998,8 @@ Type_handler::make_num_distinct_aggregator_field(MEM_ROOT *mem_root, Field_double(NULL, item->max_length, (uchar *) (item->maybe_null ? "" : 0), item->maybe_null ? 1 : 0, Field::NONE, - &item->name, item->decimals, 0, item->unsigned_flag); + &item->name, (uint8) item->decimals, + 0, item->unsigned_flag); } @@ -1011,7 +1012,8 @@ Type_handler_float::make_num_distinct_aggregator_field(MEM_ROOT *mem_root, Field_float(NULL, item->max_length, (uchar *) (item->maybe_null ? "" : 0), item->maybe_null ? 1 : 0, Field::NONE, - &item->name, item->decimals, 0, item->unsigned_flag); + &item->name, (uint8) item->decimals, + 0, item->unsigned_flag); } @@ -1026,7 +1028,8 @@ Type_handler_decimal_result::make_num_distinct_aggregator_field( Field_new_decimal(NULL, item->max_length, (uchar *) (item->maybe_null ? "" : 0), item->maybe_null ? 1 : 0, Field::NONE, - &item->name, item->decimals, 0, item->unsigned_flag); + &item->name, (uint8) item->decimals, + 0, item->unsigned_flag); } @@ -1143,7 +1146,7 @@ Field *Type_handler_newdecimal::make_conversion_table_field(TABLE *table, const { int precision= metadata >> 8; - uint decimals= metadata & 0x00ff; + uint8 decimals= metadata & 0x00ff; uint32 max_length= my_decimal_precision_to_length(precision, decimals, false); DBUG_ASSERT(decimals <= DECIMAL_MAX_SCALE); return new (table->in_use->mem_root) @@ -2058,7 +2061,7 @@ Field *Type_handler_float::make_table_field(const LEX_CSTRING *name, Field_float(addr.ptr, attr.max_char_length(), addr.null_ptr, addr.null_bit, Field::NONE, name, - attr.decimals, 0/*zerofill*/, attr.unsigned_flag); + (uint8) attr.decimals, 0/*zerofill*/, attr.unsigned_flag); } @@ -2071,7 +2074,7 @@ Field *Type_handler_double::make_table_field(const LEX_CSTRING *name, Field_double(addr.ptr, attr.max_char_length(), addr.null_ptr, addr.null_bit, Field::NONE, name, - attr.decimals, 0/*zerofill*/, attr.unsigned_flag); + (uint8) attr.decimals, 0/*zerofill*/, attr.unsigned_flag); } @@ -2091,7 +2094,7 @@ Type_handler_olddecimal::make_table_field(const LEX_CSTRING *name, DBUG_ASSERT(0); return new (table->in_use->mem_root) Field_decimal(addr.ptr, attr.max_length, addr.null_ptr, addr.null_bit, - Field::NONE, name, attr.decimals, + Field::NONE, name, (uint8) attr.decimals, 0/*zerofill*/,attr.unsigned_flag); } @@ -2102,8 +2105,8 @@ Type_handler_newdecimal::make_table_field(const LEX_CSTRING *name, const Type_all_attributes &attr, TABLE *table) const { - uint8 dec= attr.decimals; - uint8 intg= attr.decimal_precision() - dec; + uint8 dec= (uint8) attr.decimals; + uint8 intg= (uint8) (attr.decimal_precision() - dec); uint32 len= attr.max_char_length(); /* @@ -5313,7 +5316,7 @@ static void wrong_precision_error(uint errcode, Item *a, */ bool get_length_and_scale(ulonglong length, ulonglong decimals, - ulong *out_length, uint *out_decimals, + uint *out_length, uint *out_decimals, uint max_precision, uint max_scale, Item *a) { @@ -5330,7 +5333,7 @@ bool get_length_and_scale(ulonglong length, ulonglong decimals, *out_decimals= (uint) decimals; my_decimal_trim(&length, out_decimals); - *out_length= (ulong) length; + *out_length= (uint) length; if (*out_length < *out_decimals) { @@ -5396,8 +5399,7 @@ Item *Type_handler_decimal_result:: create_typecast_item(THD *thd, Item *item, const Type_cast_attributes &attr) const { - ulong len; - uint dec; + uint len, dec; if (get_length_and_scale(attr.length(), attr.decimals(), &len, &dec, DECIMAL_MAX_PRECISION, DECIMAL_MAX_SCALE, item)) return NULL; @@ -5409,8 +5411,7 @@ Item *Type_handler_double:: create_typecast_item(THD *thd, Item *item, const Type_cast_attributes &attr) const { - ulong len; - uint dec; + uint len, dec; if (!attr.length_specified()) return new (thd->mem_root) Item_double_typecast(thd, item, DBL_DIG + 7, diff --git a/sql/sql_type.h b/sql/sql_type.h index 4b23daeeb11..d71c48fb7a2 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -227,7 +227,7 @@ static inline uint32 char_to_byte_length_safe(size_t char_length_arg, uint32 mbmaxlen_arg) { ulonglong tmp= ((ulonglong) char_length_arg) * mbmaxlen_arg; - return tmp > UINT_MAX32 ? UINT_MAX32 : static_cast(tmp); + return tmp > UINT_MAX32 ? (uint32) UINT_MAX32 : static_cast(tmp); } /** @@ -531,11 +531,12 @@ class Name: private LEX_CSTRING public: Name(const char *str_arg, uint length_arg) { + DBUG_ASSERT(length_arg < UINT_MAX32); LEX_CSTRING::str= str_arg; LEX_CSTRING::length= length_arg; } const char *ptr() const { return LEX_CSTRING::str; } - uint length() const { return LEX_CSTRING::length; } + uint length() const { return (uint) LEX_CSTRING::length; } }; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 5543a3e2597..e4555ddeb11 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -875,7 +875,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); Comments for TOKENS. For each token, please include in the same line a comment that contains the following tags: - SQL-2011-N : Non Reserved keywird as per SQL-2011 + SQL-2011-N : Non Reserved keyword as per SQL-2011 SQL-2003-R : Reserved keyword as per SQL-2003 SQL-2003-N : Non Reserved keyword as per SQL-2003 SQL-1999-R : Reserved keyword as per SQL-1999 @@ -1010,6 +1010,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token DATA_SYM /* SQL-2003-N */ %token DATETIME %token DATE_ADD_INTERVAL /* MYSQL-FUNC */ +%token DATE_FORMAT_SYM /* MYSQL-FUNC */ %token DATE_SUB_INTERVAL /* MYSQL-FUNC */ %token DATE_SYM /* SQL-2003-R */ %token DAY_HOUR_SYM @@ -9818,6 +9819,18 @@ function_call_nonkeyword: if ($$ == NULL) MYSQL_YYABORT; } + | DATE_FORMAT_SYM '(' expr ',' expr ')' + { + $$= new (thd->mem_root) Item_func_date_format(thd, $3, $5); + if ($$ == NULL) + MYSQL_YYABORT; + } + | DATE_FORMAT_SYM '(' expr ',' expr ',' expr ')' + { + $$= new (thd->mem_root) Item_func_date_format(thd, $3, $5, $7); + if ($$ == NULL) + MYSQL_YYABORT; + } | DECODE_SYM '(' expr ',' expr ')' { $$= new (thd->mem_root) Item_func_decode(thd, $3, $5); @@ -14737,6 +14750,7 @@ keyword_sp_not_data_type: | CYCLE_SYM {} | DATA_SYM {} | DATAFILE_SYM {} + | DATE_FORMAT_SYM {} | DAY_SYM {} | DECODE_SYM {} | DEFINER_SYM {} diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index 1a3ce0ab372..a430512f3a1 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -284,7 +284,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); Comments for TOKENS. For each token, please include in the same line a comment that contains the following tags: - SQL-2011-N : Non Reserved keywird as per SQL-2011 + SQL-2011-N : Non Reserved keyword as per SQL-2011 SQL-2003-R : Reserved keyword as per SQL-2003 SQL-2003-N : Non Reserved keyword as per SQL-2003 SQL-1999-R : Reserved keyword as per SQL-1999 @@ -419,6 +419,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token DATA_SYM /* SQL-2003-N */ %token DATETIME %token DATE_ADD_INTERVAL /* MYSQL-FUNC */ +%token DATE_FORMAT_SYM /* MYSQL-FUNC */ %token DATE_SUB_INTERVAL /* MYSQL-FUNC */ %token DATE_SYM /* SQL-2003-R */ %token DAY_HOUR_SYM @@ -9463,6 +9464,18 @@ column_default_non_parenthesized_expr: if ($$ == NULL) MYSQL_YYABORT; } + | DATE_FORMAT_SYM '(' expr ',' expr ')' + { + $$= new (thd->mem_root) Item_func_date_format(thd, $3, $5); + if ($$ == NULL) + MYSQL_YYABORT; + } + | DATE_FORMAT_SYM '(' expr ',' expr ',' expr ')' + { + $$= new (thd->mem_root) Item_func_date_format(thd, $3, $5, $7); + if ($$ == NULL) + MYSQL_YYABORT; + } | DECODE_SYM '(' expr ',' decode_when_list ')' { $5->push_front($3, thd->mem_root); @@ -14900,6 +14913,7 @@ keyword_sp_not_data_type: | CYCLE_SYM {} | DATA_SYM {} | DATAFILE_SYM {} + | DATE_FORMAT_SYM {} | DAY_SYM {} | DECODE_SYM {} | DEFINER_SYM {} diff --git a/sql/table.cc b/sql/table.cc index eb9e848d549..7dd93d5107d 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -5066,23 +5066,28 @@ void TABLE_LIST::cleanup_items() int TABLE_LIST::view_check_option(THD *thd, bool ignore_failure) { - /* VIEW's CHECK OPTION CLAUSE */ - if (check_option && check_option->val_int() == 0) + if (check_option) { - TABLE_LIST *main_view= top_table(); - const char *name_db= (main_view->view ? main_view->view_db.str : - main_view->db); - const char *name_table= (main_view->view ? main_view->view_name.str : - main_view->table_name); - my_error(ER_VIEW_CHECK_FAILED, MYF(ignore_failure ? ME_JUST_WARNING : 0), - name_db, name_table); - return ignore_failure ? VIEW_CHECK_SKIP : VIEW_CHECK_ERROR; + /* VIEW's CHECK OPTION CLAUSE */ + Counting_error_handler ceh; + thd->push_internal_handler(&ceh); + bool res= check_option->val_int() == 0; + thd->pop_internal_handler(); + if (ceh.errors) + return(VIEW_CHECK_ERROR); + if (res) + { + TABLE_LIST *main_view= top_table(); + const char *name_db= (main_view->view ? main_view->view_db.str : + main_view->db); + const char *name_table= (main_view->view ? main_view->view_name.str : + main_view->table_name); + my_error(ER_VIEW_CHECK_FAILED, MYF(ignore_failure ? ME_JUST_WARNING : 0), + name_db, name_table); + return ignore_failure ? VIEW_CHECK_SKIP : VIEW_CHECK_ERROR; + } } - int result= table->verify_constraints(ignore_failure); - /* We check thd->error() because it can be set by conversion problem. */ - if (thd->is_error()) - return(VIEW_CHECK_ERROR); - return result; + return table->verify_constraints(ignore_failure); } diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index a1594f8797c..d422b076fc2 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -247,7 +247,7 @@ ENDIF(CONNECT_WITH_ODBC) # # JDBC with MongoDB Java Driver included but disabled # -OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON) +#OPTION(CONNECT_WITH_MONGO "Compile CONNECT storage engine with MONGO support" ON) OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) IF(CONNECT_WITH_JDBC) @@ -303,7 +303,7 @@ IF(CONNECT_WITH_MONGO) C:/mongo-c-driver/lib D:/mongo-c-driver/lib) ENDIF(WIN32) - FIND_PACKAGE(libmongoc-1.0 1.7) + FIND_PACKAGE(libmongoc-1.0 1.7 QUIET) IF (libmongoc-1.0_FOUND) INCLUDE_DIRECTORIES(${MONGOC_INCLUDE_DIRS}) SET(MONGOC_LIBRARY ${MONGOC_LIBRARIES}) diff --git a/storage/connect/preparse.h b/storage/connect/preparse.h index f16624548fb..3db7a2af1cd 100644 --- a/storage/connect/preparse.h +++ b/storage/connect/preparse.h @@ -8,7 +8,7 @@ /***********************************************************************/ typedef struct _datpar { const char *Format; // Points to format to decode - char *Curp; // Points to current parsing position + const char *Curp; // Points to current parsing position char *InFmt; // Start of input format char *OutFmt; // Start of output format int Index[8]; // Indexes of date values diff --git a/storage/connect/tabmysql.h b/storage/connect/tabmysql.h index 39fba87bcc9..4b61c7eb762 100644 --- a/storage/connect/tabmysql.h +++ b/storage/connect/tabmysql.h @@ -135,7 +135,7 @@ class TDBMYSQL : public TDBEXT { int m_Rc; // Return code from command //int AftRows; // The number of affected rows int N; // The current table index - int Port; // MySQL port number (0 = default) + unsigned Port; // MySQL port number (0 = default) //int Nparm; // The number of statement parameters //int Quoted; // The identifier quoting level }; // end of class TDBMYSQL diff --git a/storage/connect/tabutil.cpp b/storage/connect/tabutil.cpp index 9ab3d5e8806..e17e092661f 100644 --- a/storage/connect/tabutil.cpp +++ b/storage/connect/tabutil.cpp @@ -120,7 +120,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, FLD_REM, FLD_NO, FLD_CHARSET}; unsigned int length[] = {0, 4, 16, 4, 4, 4, 4, 4, 0, 32, 32}; PCSZ fmt; - char *pn, *tn, *fld, *colname, *chset, v; + char *pn, *tn, *fld, *colname, v; //, *chset; int i, n, ncol = sizeof(buftyp) / sizeof(int); int prec, len, type, scale; int zconv = GetConvSize(); @@ -185,7 +185,7 @@ PQRYRES TabColumns(PGLOBAL g, THD *thd, const char *db, colname = (char *)fp->field_name.str; crp->Kdata->SetValue(colname, i); - chset = (char *)fp->charset()->name; +// chset = (char *)fp->charset()->name; // v = (!strcmp(chset, "binary")) ? 'B' : 0; v = 0; diff --git a/storage/innobase/include/page0page.h b/storage/innobase/include/page0page.h index 3b6a0215249..53a58de229d 100644 --- a/storage/innobase/include/page0page.h +++ b/storage/innobase/include/page0page.h @@ -328,10 +328,10 @@ bool page_rec_is_leaf(const page_t* rec) { const page_t* page = page_align(rec); - ut_ad(rec - page >= page_get_infimum_offset(page)); + ut_ad(ulint(rec - page) >= page_get_infimum_offset(page)); bool leaf = page_is_leaf(page); ut_ad(!page_rec_is_comp(rec) - || !page_rec_is_user_rec_low(rec - page) + || !page_rec_is_user_rec_low(ulint(rec - page)) || leaf == !rec_get_node_ptr_flag(rec)); return leaf; } diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc index 23a11fcfaa3..113c31e44ae 100644 --- a/storage/innobase/page/page0cur.cc +++ b/storage/innobase/page/page0cur.cc @@ -1176,9 +1176,15 @@ page_cur_parse_insert_rec( ut_memcpy(buf + mismatch_index, ptr, end_seg_len); if (page_is_comp(page)) { + /* Make rec_get_offsets() and rec_offs_make_valid() happy. */ + ut_d(rec_set_heap_no_new(buf + origin_offset, + PAGE_HEAP_NO_USER_LOW)); rec_set_info_and_status_bits(buf + origin_offset, info_and_status_bits); } else { + /* Make rec_get_offsets() and rec_offs_make_valid() happy. */ + ut_d(rec_set_heap_no_old(buf + origin_offset, + PAGE_HEAP_NO_USER_LOW)); rec_set_info_bits_old(buf + origin_offset, info_and_status_bits); } diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index d4d1a2bab14..c26614d5eae 100644 --- a/storage/innobase/rem/rem0rec.cc +++ b/storage/innobase/rem/rem0rec.cc @@ -589,8 +589,6 @@ rec_get_offsets_func( infimum and supremum record based on the heap number. */ ut_d(const bool is_user_rec = rec_get_heap_no_old(rec) >= PAGE_HEAP_NO_USER_LOW); - ut_ad(n <= ulint(index->n_fields + !leaf) || index->is_dummy - || dict_index_is_ibuf(index)); /* The infimum and supremum records carry 1 field. */ ut_ad(is_user_rec || n == 1); ut_ad(!is_user_rec || leaf || index->is_dummy @@ -1130,17 +1128,14 @@ rec_convert_dtuple_to_rec_old( /* Calculate the offset of the origin in the physical record */ rec = buf + rec_get_converted_extra_size(data_size, n_fields, n_ext); -#ifdef UNIV_DEBUG - /* Suppress Valgrind warnings of ut_ad() - in mach_write_to_1(), mach_write_to_2() et al. */ - memset(buf, 0xff, rec - buf + data_size); -#endif /* UNIV_DEBUG */ /* Store the number of fields */ rec_set_n_fields_old(rec, n_fields); /* Set the info bits of the record */ rec_set_info_bits_old(rec, dtuple_get_info_bits(dtuple) & REC_INFO_BITS_MASK); + /* Make rec_get_offsets() and rec_offs_make_valid() happy. */ + ut_d(rec_set_heap_no_old(rec, PAGE_HEAP_NO_USER_LOW)); /* Store the data and the offsets */ @@ -1254,6 +1249,8 @@ rec_convert_dtuple_to_rec_comp( temp = false; } } else { + /* Make rec_get_offsets() and rec_offs_make_valid() happy. */ + ut_d(rec_set_heap_no_new(rec, PAGE_HEAP_NO_USER_LOW)); nulls = rec - (REC_N_NEW_EXTRA_BYTES + 1); switch (UNIV_EXPECT(status, REC_STATUS_ORDINARY)) { @@ -1570,7 +1567,8 @@ rec_copy_prefix_to_dtuple_func( ulint* offsets = offsets_; rec_offs_init(offsets_); - ut_ad(is_leaf || n_fields <= index->n_uniq + 1); + ut_ad(is_leaf || n_fields + <= dict_index_get_n_unique_in_tree_nonleaf(index) + 1); offsets = rec_get_offsets(rec, index, offsets, is_leaf, n_fields, &heap); diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index c109afe2682..5ebe6cdf619 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -1716,16 +1716,12 @@ PageConverter::update_records( m_rec_iter.open(block); + if (!page_is_leaf(block->frame)) { + return DB_SUCCESS; + } + while (!m_rec_iter.end()) { - rec_t* rec = m_rec_iter.current(); - - /* FIXME: Move out of the loop */ - - if (rec_get_status(rec) == REC_STATUS_NODE_PTR) { - break; - } - ibool deleted = rec_get_deleted_flag(rec, comp); /* For the clustered index we have to adjust the BLOB diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index 58c316c6327..a5dff03c16f 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -879,7 +879,7 @@ row_log_table_low_redundant( size = rec_get_converted_size_temp( index, tuple->fields, tuple->n_fields, &extra_size); - ulint v_size = ventry + ulint v_size = num_v ? rec_get_converted_size_temp_v(index, ventry) : 0; mrec_size = ROW_LOG_HEADER_SIZE + size + v_size + (extra_size >= 0x80); @@ -935,12 +935,10 @@ row_log_table_low_redundant( rec_convert_dtuple_to_temp( b + extra_size, index, tuple->fields, tuple->n_fields); b += size; - if (ventry) { + ut_ad(!num_v == !v_size); + if (num_v) { rec_convert_dtuple_to_temp_v(b, new_index, ventry); b += v_size; - } - - if (num_v) { if (o_ventry) { rec_convert_dtuple_to_temp_v( b, new_index, o_ventry); diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 84bd1353134..4c078b11e4d 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -989,7 +989,7 @@ int_table_flags(HA_NULL_IN_KEY | HA_CAN_FULLTEXT | HA_CAN_SQL_HANDLER | HA_DUPLICATE_POS | HA_CAN_INDEX_BLOBS | HA_AUTO_PART_KEY | HA_FILE_BASED | HA_CAN_GEOMETRY | CANNOT_ROLLBACK_FLAG | HA_CAN_BIT_FIELD | HA_CAN_RTREEKEYS | HA_CAN_REPAIR | - HA_CAN_VIRTUAL_COLUMNS | + HA_CAN_VIRTUAL_COLUMNS | HA_CAN_EXPORT | HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT | HA_CAN_TABLES_WITHOUT_ROLLBACK), can_enable_indexes(1), bulk_insert_single_undo(BULK_INSERT_NONE) diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index 44436de0445..80626bff6d5 100644 --- a/storage/maria/ma_create.c +++ b/storage/maria/ma_create.c @@ -660,11 +660,24 @@ int maria_create(const char *name, enum data_file_type datafile_type, if (length > max_key_length) max_key_length= length; - tot_length+= ((max_rows/(ulong) (((uint) maria_block_size - + + if (tot_length == ULLONG_MAX) + continue; + + ulonglong tot_length_part= (max_rows/(ulong) (((uint) maria_block_size - MAX_KEYPAGE_HEADER_SIZE - KEYPAGE_CHECKSUM_SIZE)/ - (length*2))) * - maria_block_size); + (length*2))); + if (tot_length_part >= (ULLONG_MAX / maria_block_size + + ULLONG_MAX % maria_block_size)) + tot_length= ULLONG_MAX; + else + { + if (tot_length > ULLONG_MAX - tot_length_part * maria_block_size) + tot_length= ULLONG_MAX; + else + tot_length+= tot_length_part * maria_block_size; + } } unique_key_parts=0; @@ -673,11 +686,24 @@ int maria_create(const char *name, enum data_file_type datafile_type, uniquedef->key=keys+i; unique_key_parts+=uniquedef->keysegs; share.state.key_root[keys+i]= HA_OFFSET_ERROR; - tot_length+= (max_rows/(ulong) (((uint) maria_block_size - + + if (tot_length == ULLONG_MAX) + continue; + ulonglong tot_length_part= (max_rows/(ulong) (((uint) maria_block_size - MAX_KEYPAGE_HEADER_SIZE - KEYPAGE_CHECKSUM_SIZE) / - ((MARIA_UNIQUE_HASH_LENGTH + pointer)*2)))* - (ulong) maria_block_size; + ((MARIA_UNIQUE_HASH_LENGTH + pointer)*2))); + + if (tot_length_part >= (ULLONG_MAX / maria_block_size + + ULLONG_MAX % maria_block_size)) + tot_length= ULLONG_MAX; + else + { + if (tot_length > ULLONG_MAX - tot_length_part * maria_block_size) + tot_length= ULLONG_MAX; + else + tot_length+= tot_length_part * maria_block_size; + } } keys+=uniques; /* Each unique has 1 key */ key_segs+=uniques; /* Each unique has 1 key seg */ @@ -746,8 +772,7 @@ int maria_create(const char *name, enum data_file_type datafile_type, Get estimate for index file length (this may be wrong for FT keys) This is used for pointers to other key pages. */ - tmp= (tot_length + maria_block_size * keys * - MARIA_INDEX_BLOCK_MARGIN) / maria_block_size; + tmp= (tot_length / maria_block_size + keys * MARIA_INDEX_BLOCK_MARGIN); /* use maximum of key_file_length we calculated and key_file_length value we diff --git a/storage/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt index be14e73bd65..39dad9ce16b 100644 --- a/storage/mroonga/CMakeLists.txt +++ b/storage/mroonga/CMakeLists.txt @@ -293,6 +293,9 @@ link_directories( if(MRN_BUNDLED) target_link_libraries(mroonga ${MRN_LIBRARIES}) + if(NOT TARGET mroonga) + return() + endif() else() add_library(mroonga MODULE ${MRN_ALL_SOURCES})