From 4d6e458f9f3956931b7c4c093fb9a0775faa9931 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 3 May 2023 15:37:05 +0200 Subject: MDEV-31164 default current_timestamp() not working when used INSERT ON DUPLICATE KEY in some cases select_insert::store_values() must reset has_value_set bitmap before every row, just like mysql_insert() does. because ON DUPLICATE KEY UPDATE and triggers modify it --- mysql-test/main/insert_update.result | 41 ++++++++++++++++++++++++++++++++++++ mysql-test/main/insert_update.test | 26 +++++++++++++++++++++++ sql/sql_insert.cc | 1 + 3 files changed, 68 insertions(+) diff --git a/mysql-test/main/insert_update.result b/mysql-test/main/insert_update.result index 68a1003ad85..83344971c59 100644 --- a/mysql-test/main/insert_update.result +++ b/mysql-test/main/insert_update.result @@ -412,3 +412,44 @@ select if( @stamp1 = @stamp2, "correct", "wrong"); if( @stamp1 = @stamp2, "correct", "wrong") correct drop table t1; +# +# MDEV-31164 default current_timestamp() not working when used INSERT ON DUPLICATE KEY in some cases +# +set timestamp=unix_timestamp('2000-10-20 0:0:0'); +create table t1 (pk integer primary key, val varchar(20) not null, ts timestamp); +insert t1 (pk, val) values(1, 'val1'); +select * from t1; +pk val ts +1 val1 2000-10-20 00:00:00 +set timestamp=unix_timestamp('2000-10-20 1:0:0'); +insert t1 (pk, val) select 2, 'val3' union select 3, 'val4' + on duplicate key update ts=now(); +select * from t1; +pk val ts +1 val1 2000-10-20 00:00:00 +2 val3 2000-10-20 01:00:00 +3 val4 2000-10-20 01:00:00 +set timestamp=unix_timestamp('2000-10-20 2:0:0'); +insert t1 (pk, val) select 1, 'val1' union select 4, 'val2' + on duplicate key update ts=now(); +select * from t1; +pk val ts +1 val1 2000-10-20 02:00:00 +2 val3 2000-10-20 01:00:00 +3 val4 2000-10-20 01:00:00 +4 val2 2000-10-20 02:00:00 +set timestamp=unix_timestamp('2000-10-20 3:0:0'); +insert t1 (pk, val) select 5, 'val1' union select 1, 'val2' + on duplicate key update ts=now(); +select * from t1; +pk val ts +1 val1 2000-10-20 03:00:00 +2 val3 2000-10-20 01:00:00 +3 val4 2000-10-20 01:00:00 +4 val2 2000-10-20 02:00:00 +5 val1 2000-10-20 03:00:00 +drop table t1; +set timestamp=default; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/insert_update.test b/mysql-test/main/insert_update.test index 06e16be84d7..25953938ad1 100644 --- a/mysql-test/main/insert_update.test +++ b/mysql-test/main/insert_update.test @@ -311,3 +311,29 @@ insert into t1(f1) values(1) on duplicate key update f1=1; select @stamp2:=f2 from t1; select if( @stamp1 = @stamp2, "correct", "wrong"); drop table t1; + +--echo # +--echo # MDEV-31164 default current_timestamp() not working when used INSERT ON DUPLICATE KEY in some cases +--echo # +set timestamp=unix_timestamp('2000-10-20 0:0:0'); +create table t1 (pk integer primary key, val varchar(20) not null, ts timestamp); +insert t1 (pk, val) values(1, 'val1'); +select * from t1; +set timestamp=unix_timestamp('2000-10-20 1:0:0'); +insert t1 (pk, val) select 2, 'val3' union select 3, 'val4' + on duplicate key update ts=now(); +select * from t1; +set timestamp=unix_timestamp('2000-10-20 2:0:0'); +insert t1 (pk, val) select 1, 'val1' union select 4, 'val2' + on duplicate key update ts=now(); +select * from t1; +set timestamp=unix_timestamp('2000-10-20 3:0:0'); +insert t1 (pk, val) select 5, 'val1' union select 1, 'val2' + on duplicate key update ts=now(); +select * from t1; +drop table t1; +set timestamp=default; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 424296efcf5..0f1b66f7610 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -4028,6 +4028,7 @@ bool select_insert::store_values(List &values) DBUG_ENTER("select_insert::store_values"); bool error; + table->reset_default_fields(); if (fields->elements) error= fill_record_n_invoke_before_triggers(thd, table, *fields, values, true, TRG_EVENT_INSERT); -- cgit v1.2.1 From cf4a16b5557be5fb3568c1de0d6cc0a18291afc9 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 4 May 2023 16:05:08 +0200 Subject: MDEV-31057 rocksdb does not compile with gcc-13 RocksDB (in a submodule) has to include to use uint64_t but it doesn't. Until the submodule is upgraded, let's replace problematic types with something that's available --- storage/rocksdb/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index 15fc4dc735a..71259703e5a 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -30,6 +30,11 @@ IF(WITH_VALGRIND) ADD_DEFINITIONS(-DROCKSDB_VALGRIND_RUN=1) ENDIF() +ADD_DEFINITIONS(-Duint64_t=u_int64_t) +ADD_DEFINITIONS(-Duint32_t=u_int32_t) +ADD_DEFINITIONS(-Duint16_t=u_int16_t) +ADD_DEFINITIONS(-Duint8_t=u_int8_t) + # We've had our builders hang during the build process. This prevents MariaRocks # to be built on 32 bit intel OS kernels. IF(CMAKE_SYSTEM_PROCESSOR MATCHES "i[36]86") -- cgit v1.2.1 From 7973ffde0fede83049a1d611c379b9ee61dea9c9 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Thu, 4 May 2023 17:51:27 +0200 Subject: MDEV-31189 Server crash or assertion failure in upon 2nd execution of PS with views and HAVING Do not try to decide merge/materialize for derived if it was already decided (even if it is a view). --- mysql-test/main/view.result | 18 ++++++++++++++++++ mysql-test/main/view.test | 19 +++++++++++++++++++ sql/table.cc | 12 ++++++++---- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/mysql-test/main/view.result b/mysql-test/main/view.result index 8c31545eb84..97d19aa2690 100644 --- a/mysql-test/main/view.result +++ b/mysql-test/main/view.result @@ -6956,4 +6956,22 @@ create algorithm=merge view v as select * from t1 left join t2 on t1.a=t2.b and t1.a in (select d from t3); ERROR 42S22: Unknown column 'd' in 'field list' drop table t1,t2,t3; +# +# MDEV-31189: Server crash or assertion failure in upon 2nd +# execution of PS with views and HAVING +# +CREATE TABLE t (f INT); +INSERT INTO t VALUES (1),(2); +CREATE VIEW v1 AS SELECT 1 AS a; +CREATE VIEW v2 AS SELECT a FROM v1; +PREPARE stmt FROM "SELECT * FROM v2 HAVING 1 IN (SELECT f FROM t)"; +EXECUTE stmt; +a +1 +EXECUTE stmt; +a +1 +DROP VIEW v1; +DROP VIEW v2; +DROP TABLE t; # End of 10.4 tests diff --git a/mysql-test/main/view.test b/mysql-test/main/view.test index 0e2dce1fb70..385ca523436 100644 --- a/mysql-test/main/view.test +++ b/mysql-test/main/view.test @@ -6696,4 +6696,23 @@ create algorithm=merge view v as drop table t1,t2,t3; +--echo # +--echo # MDEV-31189: Server crash or assertion failure in upon 2nd +--echo # execution of PS with views and HAVING +--echo # + +CREATE TABLE t (f INT); +INSERT INTO t VALUES (1),(2); # Optional, fails either way +CREATE VIEW v1 AS SELECT 1 AS a; +CREATE VIEW v2 AS SELECT a FROM v1; + +PREPARE stmt FROM "SELECT * FROM v2 HAVING 1 IN (SELECT f FROM t)"; +EXECUTE stmt; +EXECUTE stmt; + +# Cleanup +DROP VIEW v1; +DROP VIEW v2; +DROP TABLE t; + --echo # End of 10.4 tests diff --git a/sql/table.cc b/sql/table.cc index 15a92818b81..0f296a85e58 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -9163,8 +9163,13 @@ void TABLE_LIST::wrap_into_nested_join(List &join_list) static inline bool derived_table_optimization_done(TABLE_LIST *table) { - return table->derived && - (table->derived->is_excluded() || + SELECT_LEX_UNIT *derived= (table->derived ? + table->derived : + (table->view ? + &table->view->unit: + NULL)); + return derived && + (derived->is_excluded() || table->is_materialized_derived()); } @@ -9226,8 +9231,7 @@ bool TABLE_LIST::init_derived(THD *thd, bool init_view) set_derived(); } - if (is_view() || - !derived_table_optimization_done(this)) + if (!derived_table_optimization_done(this)) { /* A subquery might be forced to be materialized due to a side-effect. */ if (!is_materialized_derived() && unit->can_be_merged() && -- cgit v1.2.1 From 83fa03359f0359b666c074a5dde8ae87ad6bb515 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 4 May 2023 23:28:45 +0200 Subject: after merge: update the test for 10.10 because explicit_defaults_for_timestamp is now true --- mysql-test/main/insert_update.result | 3 ++- mysql-test/main/insert_update.test | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mysql-test/main/insert_update.result b/mysql-test/main/insert_update.result index 83344971c59..3cbc1944b5e 100644 --- a/mysql-test/main/insert_update.result +++ b/mysql-test/main/insert_update.result @@ -416,7 +416,8 @@ drop table t1; # MDEV-31164 default current_timestamp() not working when used INSERT ON DUPLICATE KEY in some cases # set timestamp=unix_timestamp('2000-10-20 0:0:0'); -create table t1 (pk integer primary key, val varchar(20) not null, ts timestamp); +create table t1 (pk integer primary key, val varchar(20) not null, ts timestamp +default current_timestamp on update current_timestamp); insert t1 (pk, val) values(1, 'val1'); select * from t1; pk val ts diff --git a/mysql-test/main/insert_update.test b/mysql-test/main/insert_update.test index 25953938ad1..bb56f04c532 100644 --- a/mysql-test/main/insert_update.test +++ b/mysql-test/main/insert_update.test @@ -316,7 +316,8 @@ drop table t1; --echo # MDEV-31164 default current_timestamp() not working when used INSERT ON DUPLICATE KEY in some cases --echo # set timestamp=unix_timestamp('2000-10-20 0:0:0'); -create table t1 (pk integer primary key, val varchar(20) not null, ts timestamp); +create table t1 (pk integer primary key, val varchar(20) not null, ts timestamp + default current_timestamp on update current_timestamp); insert t1 (pk, val) values(1, 'val1'); select * from t1; set timestamp=unix_timestamp('2000-10-20 1:0:0'); -- cgit v1.2.1