summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/suite/versioning/r/load_data.result8
-rw-r--r--mysql-test/suite/versioning/t/load_data.test12
-rw-r--r--sql/sql_load.cc7
3 files changed, 27 insertions, 0 deletions
diff --git a/mysql-test/suite/versioning/r/load_data.result b/mysql-test/suite/versioning/r/load_data.result
new file mode 100644
index 00000000000..83d64cee787
--- /dev/null
+++ b/mysql-test/suite/versioning/r/load_data.result
@@ -0,0 +1,8 @@
+CREATE TABLE t1 (a INT, b INT, c INT, vc INT AS (c), UNIQUE(a), UNIQUE(b)) WITH SYSTEM VERSIONING;
+INSERT IGNORE INTO t1 (a,b,c) VALUES (1,2,3);
+SELECT a, b, c FROM t1 INTO OUTFILE '15330.data';
+LOAD DATA INFILE '15330.data' IGNORE INTO TABLE t1 (a,b,c);
+Warnings:
+Warning 1062 Duplicate entry '1-2038-01-19 04:14:07.999999' for key 'a'
+LOAD DATA INFILE '15330.data' REPLACE INTO TABLE t1 (a,b,c);
+DROP TABLE t1;
diff --git a/mysql-test/suite/versioning/t/load_data.test b/mysql-test/suite/versioning/t/load_data.test
new file mode 100644
index 00000000000..4db6eee6c4d
--- /dev/null
+++ b/mysql-test/suite/versioning/t/load_data.test
@@ -0,0 +1,12 @@
+#
+# MDEV-15330 Server crash or assertion `table->insert_values' failure in write_record upon LOAD DATA
+#
+CREATE TABLE t1 (a INT, b INT, c INT, vc INT AS (c), UNIQUE(a), UNIQUE(b)) WITH SYSTEM VERSIONING;
+INSERT IGNORE INTO t1 (a,b,c) VALUES (1,2,3);
+
+SELECT a, b, c FROM t1 INTO OUTFILE '15330.data';
+LOAD DATA INFILE '15330.data' IGNORE INTO TABLE t1 (a,b,c);
+LOAD DATA INFILE '15330.data' REPLACE INTO TABLE t1 (a,b,c);
+
+# Cleanup
+DROP TABLE t1;
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index ad97e70bdd8..9d367149eaa 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -409,6 +409,13 @@ int mysql_load(THD *thd,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;