1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Merge branch bb-10.2-release into bb-10.3-release

This commit is contained in:
Nikita Malyavin
2021-05-04 14:49:31 +03:00
88 changed files with 1696 additions and 469 deletions

View File

@@ -634,3 +634,87 @@ REPLACE t2(number) VALUES('1');
REPLACE t2(number) VALUES('1');
DROP TABLE t2;
--echo # MDEV-24583 SELECT aborts after failed REPLACE into table with vcol
CREATE TABLE t1 (pk INT, a VARCHAR(3), v VARCHAR(3) AS (CONCAT('x-',a)),
PRIMARY KEY(pk)) ENGINE=MyISAM;
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (pk, a) VALUES (1,'foo');
SET sql_mode=CONCAT(@@sql_mode,',STRICT_ALL_TABLES');
--error 0,ER_DATA_TOO_LONG
REPLACE INTO t1 (pk,a) VALUES (1,'qux');
SELECT * FROM v1;
# Cleanup
DROP VIEW v1;
DROP TABLE t1;
CREATE TABLE t1 (
pk INT,
a VARCHAR(1),
v VARCHAR(1) AS (CONCAT('virt-',a)) VIRTUAL,
PRIMARY KEY (pk)
) ENGINE=InnoDB;
INSERT INTO t1 (pk,a) VALUES
(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e'),(6,'f');
--error ER_DATA_TOO_LONG
REPLACE INTO t1 (pk) VALUES (1);
SELECT * FROM t1 ORDER BY a;
SET SQL_MODE=DEFAULT;
DROP TABLE t1;
--echo # (duplicate) MDEV-24656
--echo # [FATAL] InnoDB: Data field type 0, len 0, ASAN heap-buffer-overflow
--echo # upon LOAD DATA with virtual columns
CREATE TABLE t1 (id INT PRIMARY KEY, a VARCHAR(2333),
va VARCHAR(171) AS (a)) ENGINE=InnoDB;
INSERT INTO t1 (id,a) VALUES (1,REPEAT('x',200));
SELECT id, va INTO OUTFILE 'load_t1' FROM t1;
--error ER_DATA_TOO_LONG
LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id,va);
SELECT * FROM t1;
LOAD DATA INFILE 'load_t1' IGNORE INTO TABLE t1 (id,va);
DROP TABLE t1;
--let $datadir= `select @@datadir`
--remove_file $datadir/test/load_t1
CREATE TABLE t1 (id BIGINT PRIMARY KEY, a VARCHAR(2333),
va VARCHAR(171) AS (a)) ENGINE=InnoDB;
INSERT INTO t1 (id,a) VALUES (1,REPEAT('x',200));
SELECT id, va INTO OUTFILE 'load_t1' FROM t1;
--error ER_DATA_TOO_LONG
LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id,va);
SELECT * FROM t1;
LOAD DATA INFILE 'load_t1' IGNORE INTO TABLE t1 (id,va);
# Cleanup
DROP TABLE t1;
--let $datadir= `select @@datadir`
--remove_file $datadir/test/load_t1
--echo # (duplicate) MDEV-24665
--echo # ASAN errors, assertion failures, corrupt values after failed
--echo # LOAD DATA into table with virtual/stored column
CREATE TABLE t1 (id INT PRIMARY KEY,
ts TIMESTAMP DEFAULT '1971-01-01 00:00:00',
c VARBINARY(8) DEFAULT '', vc VARCHAR(3) AS (c) STORED);
INSERT IGNORE INTO t1 (id,c) VALUES (1,'foobar');
SELECT id, ts, vc INTO OUTFILE 'load_t1' FROM t1;
--error 0,ER_DATA_TOO_LONG
LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id, ts, vc);
INSERT IGNORE INTO t1 (id) VALUES (2);
# Cleanup
DROP TABLE t1;
--let $datadir= `select @@datadir`
--remove_file $datadir/test/load_t1

View File

@@ -310,4 +310,115 @@ drop table t1;
--source include/wait_until_count_sessions.inc
set debug_sync=reset;
--echo #
--echo # MDEV-18546 ASAN heap-use-after-free
--echo # in innobase_get_computed_value / row_purge
--echo #
CREATE TABLE t1 (
pk INT AUTO_INCREMENT,
b BIT(15),
v BIT(15) AS (b) VIRTUAL,
PRIMARY KEY(pk),
UNIQUE(v)
) ENGINE=InnoDB;
INSERT IGNORE INTO t1 (b) VALUES
(NULL),(b'011'),(b'000110100'),
(b'01101101010'),(b'01111001001011'),(NULL);
SET GLOBAL innodb_debug_sync = "ib_clust_v_col_before_row_allocated "
"SIGNAL before_row_allocated "
"WAIT_FOR flush_unlock";
SET GLOBAL innodb_debug_sync = "ib_open_after_dict_open "
"SIGNAL purge_open "
"WAIT_FOR select_open";
# In 10.2 trx_undo_roll_ptr_is_insert(t_roll_ptr) condition never pass in purge,
# so this condition is forced to pass in row_vers_old_has_index_entry
set global debug_dbug= "d,ib_purge_virtual_index_callback";
# The purge starts from REPLACE command. To avoid possible race, separate
# connection is used.
--connect(purge_waiter,localhost,root)
--send
SET debug_sync= "now WAIT_FOR before_row_allocated";
--connection default
REPLACE INTO t1 (pk, b) SELECT pk, b FROM t1;
--connection purge_waiter
# Now we will definitely catch ib_clust_v_col_before_row_allocated
--reap
--connection default
--disconnect purge_waiter
# purge hangs on the sync point. table is purged, ref_count is set to 0
FLUSH TABLES;
# Avoid hang on repeating purge.
# Reset Will be applied after first record is purged
SET GLOBAL innodb_debug_sync = reset;
SET debug_sync= "now SIGNAL flush_unlock WAIT_FOR purge_open";
# Avoid hang on repeating purge
SET GLOBAL innodb_debug_sync = reset;
# select unblocks purge thread
SET debug_sync= "ib_open_after_dict_open SIGNAL select_open";
SELECT * FROM t1;
# Cleanup
DROP TABLE t1;
SET debug_sync= reset;
set global debug_dbug= @old_dbug;
--echo # MDEV-16962 Assertion '!error || !ot_ctx.can_recover_from_failed_open()'
--echo # failed in open_purge_table upon concurrent ALTER and FLUSH
CREATE TABLE t1 (
pk SERIAL,
c VARCHAR(128),
d DATE,
vd DATE AS (d) VIRTUAL,
PRIMARY KEY(pk),
KEY(vd,c)
) ENGINE=InnoDB;
INSERT IGNORE INTO t1 (pk,c) VALUES (1,'foo');
--send
set debug_sync="now WAIT_FOR purge";
--connect (con1,localhost,root,,test)
# Will break innodb purge thread inside open_purge_table after mdl
# acquired, but before tdc->flushed check
SET GLOBAL innodb_debug_sync="after_open_table_mdl_shared SIGNAL purge WAIT_FOR flush";
# Workaround to pass trx_undo_roll_ptr_is_insert() in 10.2
SET global debug_dbug="d,ib_purge_virtual_index_callback";
REPLACE INTO t1 (pk,c) VALUES (1,'bar');
--connection default
# wait for MDL acquired by purge
--reap
# MDL_SHARED will be acquired, but will hang before MDL upgrade started.
SET debug_sync="alter_table_before_rename_result_table WAIT_FOR flush";
--send
ALTER TABLE t1 ADD FULLTEXT KEY(c), ALGORITHM=COPY;
--connection con1
# Will hang after tdc->flushed is set, but before emptying tdc cache.
SET debug_sync="after_flush_unlock SIGNAL flush ";
FLUSH TABLES;
# Cleanup
--disconnect con1
--connection default
--reap
--source ../../innodb/include/wait_all_purged.inc
DROP TABLE t1;
SET debug_sync= reset;
SET global debug_dbug=@old_dbug;
SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;