summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2022-05-23 08:07:56 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2022-05-23 08:07:56 +0300
commita0f0687f6ce64b282d0712ca1d769fc1bc55c140 (patch)
tree4a6211278eed9252e7171e280297fa38ff2b680b
parentf73bb928480694ce39ff7a949bd29a944cb8d932 (diff)
parent2f6a014fa2f54e3a51e4e103f0f32166b1dd39b3 (diff)
downloadmariadb-git-a0f0687f6ce64b282d0712ca1d769fc1bc55c140.tar.gz
Merge 10.4 into 10.5
-rw-r--r--mysql-test/main/multi_update.result90
-rw-r--r--mysql-test/main/multi_update.test31
-rw-r--r--mysql-test/main/partition_exchange.result13
-rw-r--r--mysql-test/main/partition_exchange.test18
-rw-r--r--sql/sql_partition_admin.cc9
-rw-r--r--sql/sql_update.cc3
6 files changed, 160 insertions, 4 deletions
diff --git a/mysql-test/main/multi_update.result b/mysql-test/main/multi_update.result
index 3ec9ea0caa5..61e04c3d4a9 100644
--- a/mysql-test/main/multi_update.result
+++ b/mysql-test/main/multi_update.result
@@ -1161,3 +1161,93 @@ ERROR 21000: Subquery returns more than 1 row
update t1 set a= (select 2 from t1 having (a = 3));
ERROR 21000: Subquery returns more than 1 row
drop tables t1;
+#
+# MDEV-28246 Optimizer uses all partitions during an update in MariaDB 10.6.x but not in 10.2.x
+#
+CREATE TABLE t1 (
+part INT(1),
+a INT(1),
+b INT(1),
+PRIMARY KEY (a,part),
+INDEX b (b,part)
+) PARTITION BY LIST (part) (
+PARTITION Current VALUES IN (0),
+PARTITION Relevant VALUES IN (1),
+PARTITION Archive VALUES IN (2)
+);
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t1 (part,a,b) VALUES (0,0,0),(1,1,1),(2,2,2);
+INSERT INTO t2 (part,a,b) VALUES (0,0,0),(1,1,1),(2,2,2);
+# Expecting partition "Current"
+EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=0 AND t1.part=0;
+EXPLAIN
+{
+ "query_block": {
+ "select_id": 1,
+ "table": {
+ "table_name": "t2",
+ "partitions": ["Current"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ },
+ "table": {
+ "table_name": "t1",
+ "partitions": ["Current"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+}
+# Expecting partition "Relevant"
+EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=2 WHERE t2.part=1 AND t1.part=1;
+EXPLAIN
+{
+ "query_block": {
+ "select_id": 1,
+ "table": {
+ "table_name": "t2",
+ "partitions": ["Relevant"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ },
+ "table": {
+ "table_name": "t1",
+ "partitions": ["Relevant"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+}
+# Expecting partition "Archive"
+EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=2 AND t1.part=2;
+EXPLAIN
+{
+ "query_block": {
+ "select_id": 1,
+ "table": {
+ "table_name": "t2",
+ "partitions": ["Archive"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ },
+ "table": {
+ "table_name": "t1",
+ "partitions": ["Archive"],
+ "access_type": "system",
+ "possible_keys": ["PRIMARY"],
+ "rows": 1,
+ "filtered": 100
+ }
+ }
+}
+DROP TABLES t1, t2;
diff --git a/mysql-test/main/multi_update.test b/mysql-test/main/multi_update.test
index 3ee36f97fc5..5f4b5fc8ec3 100644
--- a/mysql-test/main/multi_update.test
+++ b/mysql-test/main/multi_update.test
@@ -1098,3 +1098,34 @@ select a from t1 where a= (select 2 from t1 having (a = 3));
--error ER_SUBQUERY_NO_1_ROW
update t1 set a= (select 2 from t1 having (a = 3));
drop tables t1;
+
+--echo #
+--echo # MDEV-28246 Optimizer uses all partitions during an update in MariaDB 10.6.x but not in 10.2.x
+--echo #
+--source include/have_partition.inc
+CREATE TABLE t1 (
+ part INT(1),
+ a INT(1),
+ b INT(1),
+ PRIMARY KEY (a,part),
+ INDEX b (b,part)
+) PARTITION BY LIST (part) (
+ PARTITION Current VALUES IN (0),
+ PARTITION Relevant VALUES IN (1),
+ PARTITION Archive VALUES IN (2)
+);
+
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t1 (part,a,b) VALUES (0,0,0),(1,1,1),(2,2,2);
+INSERT INTO t2 (part,a,b) VALUES (0,0,0),(1,1,1),(2,2,2);
+
+--echo # Expecting partition "Current"
+EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=0 AND t1.part=0;
+
+--echo # Expecting partition "Relevant"
+EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=2 WHERE t2.part=1 AND t1.part=1;
+
+--echo # Expecting partition "Archive"
+EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=2 AND t1.part=2;
+
+DROP TABLES t1, t2;
diff --git a/mysql-test/main/partition_exchange.result b/mysql-test/main/partition_exchange.result
index b27da5b9b8c..ac1b8c99cf7 100644
--- a/mysql-test/main/partition_exchange.result
+++ b/mysql-test/main/partition_exchange.result
@@ -1308,3 +1308,16 @@ ALTER TABLE t2 REMOVE PARTITIONING;
ALTER TABLE t1 EXCHANGE PARTITION pm WITH TABLE t2;
ERROR HY000: Non matching attribute 'TABLESPACE' between partition and table
DROP TABLE t1, t2;
+#
+# MDEV-14642 Assertion `table->s->db_create_options == part_table->s->db_create_options' failed in compare_table_with_partition
+#
+CREATE TABLE t1 (a INT) ROW_FORMAT=DYNAMIC PARTITION BY KEY(a) PARTITIONS 2;
+CREATE TABLE t2 (a INT) ;
+ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
+ERROR HY000: Tables have different definitions
+DROP TABLE t1, t2;
+CREATE TABLE t1 (a INT, PRIMARY KEY(a)) ENGINE=InnoDB PARTITION BY KEY(a) PARTITIONS 2;
+CREATE TABLE t2 (a INT, PRIMARY KEY(a)) CHECKSUM=1, ENGINE=InnoDB;
+ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
+ERROR HY000: Tables have different definitions
+DROP TABLE t1, t2;
diff --git a/mysql-test/main/partition_exchange.test b/mysql-test/main/partition_exchange.test
index cb33b8dd857..4125e998623 100644
--- a/mysql-test/main/partition_exchange.test
+++ b/mysql-test/main/partition_exchange.test
@@ -536,3 +536,21 @@ ALTER TABLE t2 REMOVE PARTITIONING;
ALTER TABLE t1 EXCHANGE PARTITION pm WITH TABLE t2;
DROP TABLE t1, t2;
+--echo #
+--echo # MDEV-14642 Assertion `table->s->db_create_options == part_table->s->db_create_options' failed in compare_table_with_partition
+--echo #
+CREATE TABLE t1 (a INT) ROW_FORMAT=DYNAMIC PARTITION BY KEY(a) PARTITIONS 2;
+CREATE TABLE t2 (a INT) ;
+--error ER_TABLES_DIFFERENT_METADATA
+ALTER TABLE t1 EXCHANGE PARTITION p1 WITH TABLE t2;
+
+# Cleanup
+DROP TABLE t1, t2;
+
+CREATE TABLE t1 (a INT, PRIMARY KEY(a)) ENGINE=InnoDB PARTITION BY KEY(a) PARTITIONS 2;
+CREATE TABLE t2 (a INT, PRIMARY KEY(a)) CHECKSUM=1, ENGINE=InnoDB;
+--error ER_TABLES_DIFFERENT_METADATA
+ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;
+
+# Cleanup
+DROP TABLE t1, t2;
diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc
index 55abee72a52..058e5909a25 100644
--- a/sql/sql_partition_admin.cc
+++ b/sql/sql_partition_admin.cc
@@ -259,8 +259,13 @@ static bool compare_table_with_partition(THD *thd, TABLE *table,
my_error(ER_TABLES_DIFFERENT_METADATA, MYF(0));
DBUG_RETURN(TRUE);
}
- DBUG_ASSERT(table->s->db_create_options ==
- part_table->s->db_create_options);
+
+ if (table->s->db_create_options != part_table->s->db_create_options)
+ {
+ my_error(ER_TABLES_DIFFERENT_METADATA, MYF(0));
+ DBUG_RETURN(TRUE);
+ }
+
DBUG_ASSERT(table->s->db_options_in_use ==
part_table->s->db_options_in_use);
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index a1d4ae4a12f..7a59e8780e9 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -2116,10 +2116,9 @@ int multi_update::prepare(List<Item> &not_used_values,
if (!tl)
DBUG_RETURN(1);
update.link_in_list(tl, &tl->next_local);
- tl->shared= table_count++;
+ table_ref->shared= tl->shared= table_count++;
table->no_keyread=1;
table->covering_keys.clear_all();
- table->pos_in_table_list= tl;
table->prepare_triggers_for_update_stmt_or_event();
table->reset_default_fields();
}