summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/suite/versioning/r/replace.result8
-rw-r--r--mysql-test/suite/versioning/t/replace.test10
-rw-r--r--sql/sql_insert.cc7
-rw-r--r--sql/sql_load.cc7
4 files changed, 20 insertions, 12 deletions
diff --git a/mysql-test/suite/versioning/r/replace.result b/mysql-test/suite/versioning/r/replace.result
index 52db0db429a..1711be5212e 100644
--- a/mysql-test/suite/versioning/r/replace.result
+++ b/mysql-test/suite/versioning/r/replace.result
@@ -26,3 +26,11 @@ id x current
1 2 0
1 3 1
drop table t;
+# MDEV-15645 Assertion `table->insert_values' failed in write_record upon REPLACE into a view with underlying versioned table
+create or replace table t1 (a int, b int, primary key (a), unique(b)) with system versioning;
+insert into t1 values (1,1);
+create or replace table t2 (c int);
+create or replace view v as select t1.* from t1 join t2;
+replace into v (a, b) select a, b from t1;
+drop database test;
+create database test;
diff --git a/mysql-test/suite/versioning/t/replace.test b/mysql-test/suite/versioning/t/replace.test
index a4f7b245988..bc7e084758d 100644
--- a/mysql-test/suite/versioning/t/replace.test
+++ b/mysql-test/suite/versioning/t/replace.test
@@ -29,4 +29,12 @@ replace t values (1, 3);
select *, current_row(row_end) as current from t for system_time all order by x;
drop table t;
---source suite/versioning/common_finish.inc
+--echo # MDEV-15645 Assertion `table->insert_values' failed in write_record upon REPLACE into a view with underlying versioned table
+create or replace table t1 (a int, b int, primary key (a), unique(b)) with system versioning;
+insert into t1 values (1,1);
+create or replace table t2 (c int);
+create or replace view v as select t1.* from t1 join t2;
+replace into v (a, b) select a, b from t1;
+
+drop database test;
+create database test;
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index a60a6f2975e..715d128c68f 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -1970,13 +1970,12 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
error= table->file->ha_delete_row(table->record[1]);
else
{
- DBUG_ASSERT(table->insert_values);
- store_record(table,insert_values);
- restore_record(table,record[1]);
+ store_record(table, record[2]);
+ restore_record(table, record[1]);
table->vers_update_end();
error= table->file->ha_update_row(table->record[1],
table->record[0]);
- restore_record(table,insert_values);
+ restore_record(table, record[2]);
}
if (unlikely(error))
goto err;
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index cc5a5c7c794..ddb5029c78a 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -431,13 +431,6 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list,
is_concurrent= (table_list->lock_type == TL_WRITE_CONCURRENT_INSERT);
#endif
- if (table->versioned(VERS_TIMESTAMP) && handle_duplicates == DUP_REPLACE)
- {
- // Additional memory may be required to create historical items.
- if (table_list->set_insert_values(thd->mem_root))
- DBUG_RETURN(TRUE);
- }
-
if (!fields_vars.elements)
{
Field_iterator_table_ref field_iterator;