Merge 10.8 into 10.9

This commit is contained in:
Marko Mäkelä 2022-04-13 13:39:00 +03:00
commit e98013cb5c
46 changed files with 1082 additions and 139 deletions

View File

@ -31,9 +31,12 @@ then
# build is not running on Travis or Gitlab-CI
sed '/-DPLUGIN_COLUMNSTORE=NO/d' -i debian/rules
# Take the files and part of control from MCS directory
cp -v storage/columnstore/columnstore/debian/mariadb-plugin-columnstore.* debian/
echo >> debian/control
sed "s/10.6/${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}/" <storage/columnstore/columnstore/debian/control >> debian/control
if [ ! -f debian/mariadb-plugin-columnstore.install ]
then
cp -v storage/columnstore/columnstore/debian/mariadb-plugin-columnstore.* debian/
echo >> debian/control
sed "s/10.6/${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}/" <storage/columnstore/columnstore/debian/control >> debian/control
fi
fi
# Look up distro-version specific stuff
@ -137,6 +140,11 @@ case "${CODENAME}" in
exit 1
esac
if [ -n "${AUTOBAKE_PREP_CONTROL_RULES_ONLY:-}" ]
then
exit 0
fi
# Adjust changelog, add new version
echo "Incrementing changelog and starting build scripts"

View File

@ -115,7 +115,7 @@ EOF
if [ -f "$mysql_datadir"/auto.cnf ] && [ -f "$mysql_datadir"/mysql/user.MYD ] &&
[ ! lsof -nt "$mysql_datadir"/mysql/user.MYD > /dev/null ] && [ ! -f "$mysql_datadir"/undo_001 ]; then
echo "UPDATE mysql.user SET plugin='unix_socket' WHERE plugin='auth_socket';" |
/usr/sbin/mariadbd --skip-innodb --key_buffer_size=0 --default-storage-engine=MyISAM --bootstrap 2> /dev/null
mariadbd --skip-innodb --key_buffer_size=0 --default-storage-engine=MyISAM --bootstrap 2> /dev/null
fi
# Ensure the existence and right permissions for the database and

2
debian/rules vendored
View File

@ -112,7 +112,7 @@ override_dh_auto_build:
@echo "RULES.$@"
# Print build env info to help debug builds on different platforms
dpkg-architecture
cd $(BUILDDIR) && $(MAKE)
cd $(BUILDDIR) && $(MAKE) --output-sync=target
override_dh_auto_test:
@echo "RULES.$@"

2
debian/salsa-ci.yml vendored
View File

@ -34,7 +34,7 @@ build:
- mv ${CCACHE_WORK_DIR} ${CCACHE_TMP_DIR}
# Run Salsa-CI .build-script equivalent, with extra devscripts so autobake-deb.sh can run 'dch'
- export CCACHE_DIR=${CCACHE_TMP_DIR}
- apt-get update && eatmydata apt-get install --no-install-recommends -y ccache fakeroot build-essential devscripts
- apt-get update && eatmydata apt-get install --no-install-recommends -y ccache fakeroot build-essential devscripts lsb-release
- cd ${WORKING_DIR}/${SOURCE_DIR}
- eatmydata apt-get build-dep --no-install-recommends -y .
- update-ccache-symlinks; ccache -z # Zero out ccache counters

View File

@ -2,7 +2,6 @@
# since package breaks/replaces these but at the same time also provides them
version-substvar-for-external-package mariadb-client-core-10.9 -> mysql-client-5.5
version-substvar-for-external-package mariadb-server-10.9 -> mysql-server
version-substvar-for-external-package mariadb-server-10.9 -> mysql-server
version-substvar-for-external-package libmariadb-dev -> libmysqlclient-dev
version-substvar-for-external-package libmariadb-dev -> libmysqld-dev
version-substvar-for-external-package mariadb-server-10.9 -> mysql-client-5.5
@ -10,14 +9,9 @@ version-substvar-for-external-package mariadb-server-10.9 -> mysql-client-5.6
version-substvar-for-external-package mariadb-server-10.9 -> mysql-client-5.7
version-substvar-for-external-package mariadb-server-10.9 -> mysql-client-8.0
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-5.1
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-5.1
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-5.5
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-5.5
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-5.6
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-5.6
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-5.7
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-5.7
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-8.0
version-substvar-for-external-package mariadb-client-10.9 -> mysql-client-core-8.0
version-substvar-for-external-package libmariadbd-dev -> libmariadbclient-dev
# ColumnStore not used in Debian, safe to ignore. Reported upstream in https://jira.mariadb.org/browse/MDEV-24124

View File

@ -1784,6 +1784,18 @@ unexpected_eof:
}
if (ferror(fil_in)) {
#ifdef _AIX
/*
AIX fseeko can go past eof without error.
the error occurs on read, hence output the
same error here as would show up on other
platforms. This shows up in the mtr test
innodb_zip.innochecksum_3-4k,crc32,innodb
*/
if (errno == EFBIG) {
goto unexpected_eof;
}
#endif
fprintf(stderr, "Error reading " ULINTPF " bytes",
physical_page_size);
perror(" ");

View File

@ -43,7 +43,12 @@
#define SD_LISTEN_FDS_START (0)
#define sd_notify(X, Y)
#define sd_notifyf(E, F, ...)
#define service_manager_extend_timeout(I, FMTSTR, ...)
#ifdef _WIN32
#define service_manager_extend_timeout(I, F, ...) \
mysqld_win_extend_service_timeout(I)
#else
#define service_manager_extend_timeout(I, FMTSTR, ...)
#endif
#endif
#endif /* MY_SERVICE_MANAGER_INCLUDED */

View File

@ -18,5 +18,3 @@ file_contents : MDEV-6526 these files are not installed anymore
max_statement_time : cannot possibly work, depends on timing
partition_open_files_limit : open_files_limit check broken by MDEV-18360
partition_innodb : Waiting for fix MDEV-20169
type_enum : Waiting for fix MDEV-6978
type_set : Waiting for fix MDEV-6978

View File

@ -2532,3 +2532,24 @@ progress
#
# End of 10.3 tests
#
#
# Start of 10.5 tests
#
#
# MDEV-26507 Assertion `tmp != ((long long) 0x8000000000000000LL)' failed in TIME_from_longlong_datetime_packed
#
CREATE TABLE t1 (a int);
CREATE ALGORITHM=TEMPTABLE VIEW i AS
SELECT a.created
FROM t1 w JOIN INFORMATION_SCHEMA.routines a
WHERE a.routine_name='not existing'
ORDER BY a.last_altered;
SET SESSION sql_mode='ALLOW_INVALID_DATES';
SELECT * FROM i;
created
SET SESSION sql_mode=DEFAULT;
DROP VIEW i;
DROP TABLE t1;
#
# End of 10.5 tests
#

View File

@ -2111,3 +2111,27 @@ select progress from information_schema.processlist limit 1;
--echo #
--echo # End of 10.3 tests
--echo #
--echo #
--echo # Start of 10.5 tests
--echo #
--echo #
--echo # MDEV-26507 Assertion `tmp != ((long long) 0x8000000000000000LL)' failed in TIME_from_longlong_datetime_packed
--echo #
CREATE TABLE t1 (a int);
CREATE ALGORITHM=TEMPTABLE VIEW i AS
SELECT a.created
FROM t1 w JOIN INFORMATION_SCHEMA.routines a
WHERE a.routine_name='not existing'
ORDER BY a.last_altered;
SET SESSION sql_mode='ALLOW_INVALID_DATES';
SELECT * FROM i;
SET SESSION sql_mode=DEFAULT;
DROP VIEW i;
DROP TABLE t1;
--echo #
--echo # End of 10.5 tests
--echo #

View File

@ -391,3 +391,424 @@ END
$$
compressed
1
#
# Testing various keywords in various contexts
#
CREATE PROCEDURE p1(query TEXT, var TEXT)
BEGIN
DECLARE errmsg TEXT DEFAULT '';
DECLARE CONTINUE HANDLER
FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 errmsg = MESSAGE_TEXT;
SET errmsg= REPLACE(errmsg, 'You have an error in your SQL ', '..');
SET errmsg= REPLACE(errmsg, '; check the manual that corresponds to your MariaDB server version for the right syntax to use', '..');
END;
SET query=REPLACE(query, '$(VAR)', var);
EXECUTE IMMEDIATE query;
SELECT CONCAT(query, '; -- ', LEFT(COALESCE(errmsg,''),40)) AS `--------`;
END;
$$
CREATE PROCEDURE p2(query TEXT)
BEGIN
FOR row IN (SELECT word FROM t1 ORDER BY category, word)
DO
CALL p1(query, row.word);
END FOR;
END;
$$
CREATE TABLE t1 (word TEXT, category TEXT);
INSERT INTO t1 VALUES ('non_keyword', '00 Simple identifier');
INSERT INTO t1 VALUES ('lpad', '01 Built-in native function');
INSERT INTO t1 VALUES ('rpad', '01 Built-in native function');
INSERT INTO t1 VALUES ('adddate', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('substr', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('substring', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('trim_oracle', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('ascii', '03 function_call_conflict');
INSERT INTO t1 VALUES ('replace', '03 function_call_conflict');
INSERT INTO t1 VALUES ('weight_string', '03 function_call_conflict');
INSERT INTO t1 VALUES ('char', '04 function_call_keyword');
INSERT INTO t1 VALUES ('trim', '04 function_call_keyword');
INSERT INTO t1 VALUES ('year', '04 function_call_keyword');
INSERT INTO t1 VALUES ('create', '05 Reserved keyword');
CALL p2('SELECT @@$(VAR)');
--------
SELECT @@non_keyword; -- Unknown system variable 'non_keyword'
--------
SELECT @@lpad; -- Unknown system variable 'lpad'
--------
SELECT @@rpad; -- Unknown system variable 'rpad'
--------
SELECT @@adddate; -- Unknown system variable 'adddate'
--------
SELECT @@substr; -- Unknown system variable 'substr'
--------
SELECT @@substring; -- Unknown system variable 'substring'
--------
SELECT @@trim_oracle; -- Unknown system variable 'trim_oracle'
--------
SELECT @@ascii; -- Unknown system variable 'ascii'
--------
SELECT @@replace; -- ..syntax.. near 'replace' at line 1
--------
SELECT @@weight_string; -- Unknown system variable 'weight_string'
--------
SELECT @@char; -- ..syntax.. near 'char' at line 1
--------
SELECT @@trim; -- Unknown system variable 'trim'
--------
SELECT @@year; -- Unknown system variable 'year'
--------
SELECT @@create; -- ..syntax.. near 'create' at line 1
CALL p2('SELECT @@global.$(VAR)');
--------
SELECT @@global.non_keyword; -- Unknown system variable 'non_keyword'
--------
SELECT @@global.lpad; -- Unknown system variable 'lpad'
--------
SELECT @@global.rpad; -- Unknown system variable 'rpad'
--------
SELECT @@global.adddate; -- Unknown system variable 'adddate'
--------
SELECT @@global.substr; -- Unknown system variable 'substr'
--------
SELECT @@global.substring; -- Unknown system variable 'substring'
--------
SELECT @@global.trim_oracle; -- Unknown system variable 'trim_oracle'
--------
SELECT @@global.ascii; -- Unknown system variable 'ascii'
--------
SELECT @@global.replace; -- Unknown system variable 'replace'
--------
SELECT @@global.weight_string; -- Unknown system variable 'weight_string'
--------
SELECT @@global.char; -- Unknown system variable 'char'
--------
SELECT @@global.trim; -- Unknown system variable 'trim'
--------
SELECT @@global.year; -- Unknown system variable 'year'
--------
SELECT @@global.create; -- Unknown system variable 'create'
CALL p2('SELECT @@global.$(VAR)()');
--------
SELECT @@global.non_keyword(); -- Unknown system variable 'non_keyword'
--------
SELECT @@global.lpad(); -- Unknown system variable 'lpad'
--------
SELECT @@global.rpad(); -- Unknown system variable 'rpad'
--------
SELECT @@global.adddate(); -- Unknown system variable 'adddate'
--------
SELECT @@global.substr(); -- Unknown system variable 'substr'
--------
SELECT @@global.substring(); -- Unknown system variable 'substring'
--------
SELECT @@global.trim_oracle(); -- Unknown system variable 'trim_oracle'
--------
SELECT @@global.ascii(); -- Unknown system variable 'ascii'
--------
SELECT @@global.replace(); -- Unknown system variable 'replace'
--------
SELECT @@global.weight_string(); -- Unknown system variable 'weight_string'
--------
SELECT @@global.char(); -- Unknown system variable 'char'
--------
SELECT @@global.trim(); -- Unknown system variable 'trim'
--------
SELECT @@global.year(); -- Unknown system variable 'year'
--------
SELECT @@global.create(); -- Unknown system variable 'create'
CALL p2('SELECT $(VAR)()');
--------
SELECT non_keyword(); -- FUNCTION test.non_keyword does not exist
--------
SELECT lpad(); -- Incorrect parameter count in the call to
--------
SELECT rpad(); -- Incorrect parameter count in the call to
--------
SELECT adddate(); -- ..syntax.. near ')' at line 1
--------
SELECT substr(); -- ..syntax.. near ')' at line 1
--------
SELECT substring(); -- ..syntax.. near ')' at line 1
--------
SELECT trim_oracle(); -- ..syntax.. near ')' at line 1
--------
SELECT ascii(); -- ..syntax.. near ')' at line 1
--------
SELECT replace(); -- ..syntax.. near ')' at line 1
--------
SELECT weight_string(); -- ..syntax.. near ')' at line 1
--------
SELECT char(); -- ..syntax.. near ')' at line 1
--------
SELECT trim(); -- ..syntax.. near ')' at line 1
--------
SELECT year(); -- ..syntax.. near ')' at line 1
--------
SELECT create(); -- ..syntax.. near 'create()' at line 1
CALL p2('SELECT test.$(VAR)()');
--------
SELECT test.non_keyword(); -- FUNCTION test.non_keyword does not exist
--------
SELECT test.lpad(); -- FUNCTION test.lpad does not exist
--------
SELECT test.rpad(); -- FUNCTION test.rpad does not exist
--------
SELECT test.adddate(); -- FUNCTION test.adddate does not exist. Ch
--------
SELECT test.substr(); -- FUNCTION test.substr does not exist. Che
--------
SELECT test.substring(); -- FUNCTION test.substring does not exist.
--------
SELECT test.trim_oracle(); -- FUNCTION test.trim_oracle does not exist
--------
SELECT test.ascii(); -- FUNCTION test.ascii does not exist. Chec
--------
SELECT test.replace(); -- FUNCTION test.replace does not exist. Ch
--------
SELECT test.weight_string(); -- FUNCTION test.weight_string does not exi
--------
SELECT test.char(); -- FUNCTION test.char does not exist. Check
--------
SELECT test.trim(); -- FUNCTION test.trim does not exist. Check
--------
SELECT test.year(); -- FUNCTION test.year does not exist. Check
--------
SELECT test.create(); -- FUNCTION test.create does not exist. Che
CALL p2('SELECT $(VAR) FROM t1');
--------
SELECT non_keyword FROM t1; -- Unknown column 'non_keyword' in 'field l
--------
SELECT lpad FROM t1; -- Unknown column 'lpad' in 'field list'
--------
SELECT rpad FROM t1; -- Unknown column 'rpad' in 'field list'
--------
SELECT adddate FROM t1; -- Unknown column 'adddate' in 'field list'
--------
SELECT substr FROM t1; -- Unknown column 'substr' in 'field list'
--------
SELECT substring FROM t1; -- Unknown column 'substring' in 'field lis
--------
SELECT trim_oracle FROM t1; -- Unknown column 'trim_oracle' in 'field l
--------
SELECT ascii FROM t1; -- Unknown column 'ascii' in 'field list'
--------
SELECT replace FROM t1; -- ..syntax.. near 'FROM t1' at line 1
--------
SELECT weight_string FROM t1; -- Unknown column 'weight_string' in 'field
--------
SELECT char FROM t1; -- ..syntax.. near 'FROM t1' at line 1
--------
SELECT trim FROM t1; -- Unknown column 'trim' in 'field list'
--------
SELECT year FROM t1; -- Unknown column 'year' in 'field list'
--------
SELECT create FROM t1; -- ..syntax.. near 'create FROM t1' at line
CALL p2('SELECT t1.$(VAR) FROM t1');
--------
SELECT t1.non_keyword FROM t1; -- Unknown column 't1.non_keyword' in 'fiel
--------
SELECT t1.lpad FROM t1; -- Unknown column 't1.lpad' in 'field list'
--------
SELECT t1.rpad FROM t1; -- Unknown column 't1.rpad' in 'field list'
--------
SELECT t1.adddate FROM t1; -- Unknown column 't1.adddate' in 'field li
--------
SELECT t1.substr FROM t1; -- Unknown column 't1.substr' in 'field lis
--------
SELECT t1.substring FROM t1; -- Unknown column 't1.substring' in 'field
--------
SELECT t1.trim_oracle FROM t1; -- Unknown column 't1.trim_oracle' in 'fiel
--------
SELECT t1.ascii FROM t1; -- Unknown column 't1.ascii' in 'field list
--------
SELECT t1.replace FROM t1; -- Unknown column 't1.replace' in 'field li
--------
SELECT t1.weight_string FROM t1; -- Unknown column 't1.weight_string' in 'fi
--------
SELECT t1.char FROM t1; -- Unknown column 't1.char' in 'field list'
--------
SELECT t1.trim FROM t1; -- Unknown column 't1.trim' in 'field list'
--------
SELECT t1.year FROM t1; -- Unknown column 't1.year' in 'field list'
--------
SELECT t1.create FROM t1; -- Unknown column 't1.create' in 'field lis
CALL p2('DROP TABLE $(VAR)');
--------
DROP TABLE non_keyword; -- Unknown table 'test.non_keyword'
--------
DROP TABLE lpad; -- Unknown table 'test.lpad'
--------
DROP TABLE rpad; -- Unknown table 'test.rpad'
--------
DROP TABLE adddate; -- Unknown table 'test.adddate'
--------
DROP TABLE substr; -- Unknown table 'test.substr'
--------
DROP TABLE substring; -- Unknown table 'test.substring'
--------
DROP TABLE trim_oracle; -- Unknown table 'test.trim_oracle'
--------
DROP TABLE ascii; -- Unknown table 'test.ascii'
--------
DROP TABLE replace; -- ..syntax.. near 'replace' at line 1
--------
DROP TABLE weight_string; -- Unknown table 'test.weight_string'
--------
DROP TABLE char; -- ..syntax.. near 'char' at line 1
--------
DROP TABLE trim; -- Unknown table 'test.trim'
--------
DROP TABLE year; -- Unknown table 'test.year'
--------
DROP TABLE create; -- ..syntax.. near 'create' at line 1
CALL p2('DROP TABLE test.$(VAR)');
--------
DROP TABLE test.non_keyword; -- Unknown table 'test.non_keyword'
--------
DROP TABLE test.lpad; -- Unknown table 'test.lpad'
--------
DROP TABLE test.rpad; -- Unknown table 'test.rpad'
--------
DROP TABLE test.adddate; -- Unknown table 'test.adddate'
--------
DROP TABLE test.substr; -- Unknown table 'test.substr'
--------
DROP TABLE test.substring; -- Unknown table 'test.substring'
--------
DROP TABLE test.trim_oracle; -- Unknown table 'test.trim_oracle'
--------
DROP TABLE test.ascii; -- Unknown table 'test.ascii'
--------
DROP TABLE test.replace; -- Unknown table 'test.replace'
--------
DROP TABLE test.weight_string; -- Unknown table 'test.weight_string'
--------
DROP TABLE test.char; -- Unknown table 'test.char'
--------
DROP TABLE test.trim; -- Unknown table 'test.trim'
--------
DROP TABLE test.year; -- Unknown table 'test.year'
--------
DROP TABLE test.create; -- Unknown table 'test.create'
CALL p2('CREATE FUNCTION $(VAR)() RETURNS OOPS');
--------
CREATE FUNCTION non_keyword() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION lpad() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION rpad() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION adddate() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION substr() RETURNS OOPS; -- ..syntax.. near 'substr() RETURNS OOPS'
--------
CREATE FUNCTION substring() RETURNS OOPS; -- ..syntax.. near 'substring() RETURNS OOP
--------
CREATE FUNCTION trim_oracle() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION ascii() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION replace() RETURNS OOPS; -- ..syntax.. near 'replace() RETURNS OOPS'
--------
CREATE FUNCTION weight_string() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION char() RETURNS OOPS; -- ..syntax.. near 'char() RETURNS OOPS' at
--------
CREATE FUNCTION trim() RETURNS OOPS; -- ..syntax.. near 'trim() RETURNS OOPS' at
--------
CREATE FUNCTION year() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION create() RETURNS OOPS; -- ..syntax.. near 'create() RETURNS OOPS'
CALL p2('CREATE FUNCTION test.$(VAR)() RETURNS OOPS');
--------
CREATE FUNCTION test.non_keyword() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.lpad() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.rpad() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.adddate() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.substr() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.substring() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.trim_oracle() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.ascii() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.replace() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.weight_string() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.char() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.trim() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.year() RETURNS OOPS; -- Unknown data type: 'OOPS'
--------
CREATE FUNCTION test.create() RETURNS OOPS; -- Unknown data type: 'OOPS'
CALL p2('DROP FUNCTION $(VAR)');
--------
DROP FUNCTION non_keyword; -- FUNCTION test.non_keyword does not exist
--------
DROP FUNCTION lpad; -- FUNCTION test.lpad does not exist
--------
DROP FUNCTION rpad; -- FUNCTION test.rpad does not exist
--------
DROP FUNCTION adddate; -- FUNCTION test.adddate does not exist
--------
DROP FUNCTION substr; -- FUNCTION test.substr does not exist
--------
DROP FUNCTION substring; -- FUNCTION test.substring does not exist
--------
DROP FUNCTION trim_oracle; -- FUNCTION test.trim_oracle does not exist
--------
DROP FUNCTION ascii; -- FUNCTION test.ascii does not exist
--------
DROP FUNCTION replace; -- ..syntax.. near 'replace' at line 1
--------
DROP FUNCTION weight_string; -- FUNCTION test.weight_string does not exi
--------
DROP FUNCTION char; -- ..syntax.. near 'char' at line 1
--------
DROP FUNCTION trim; -- FUNCTION test.trim does not exist
--------
DROP FUNCTION year; -- FUNCTION test.year does not exist
--------
DROP FUNCTION create; -- ..syntax.. near 'create' at line 1
CALL p2('DROP FUNCTION test.$(VAR)');
--------
DROP FUNCTION test.non_keyword; -- FUNCTION test.non_keyword does not exist
--------
DROP FUNCTION test.lpad; -- FUNCTION test.lpad does not exist
--------
DROP FUNCTION test.rpad; -- FUNCTION test.rpad does not exist
--------
DROP FUNCTION test.adddate; -- FUNCTION test.adddate does not exist
--------
DROP FUNCTION test.substr; -- FUNCTION test.substr does not exist
--------
DROP FUNCTION test.substring; -- FUNCTION test.substring does not exist
--------
DROP FUNCTION test.trim_oracle; -- FUNCTION test.trim_oracle does not exist
--------
DROP FUNCTION test.ascii; -- FUNCTION test.ascii does not exist
--------
DROP FUNCTION test.replace; -- FUNCTION test.replace does not exist
--------
DROP FUNCTION test.weight_string; -- FUNCTION test.weight_string does not exi
--------
DROP FUNCTION test.char; -- FUNCTION test.char does not exist
--------
DROP FUNCTION test.trim; -- FUNCTION test.trim does not exist
--------
DROP FUNCTION test.year; -- FUNCTION test.year does not exist
--------
DROP FUNCTION test.create; -- FUNCTION test.create does not exist
DROP TABLE t1;
DROP PROCEDURE p1;
DROP PROCEDURE p2;

View File

@ -295,3 +295,80 @@ BEGIN NOT ATOMIC
END
$$
DELIMITER ;$$
--echo #
--echo # Testing various keywords in various contexts
--echo #
DELIMITER $$;
CREATE PROCEDURE p1(query TEXT, var TEXT)
BEGIN
DECLARE errmsg TEXT DEFAULT '';
DECLARE CONTINUE HANDLER
FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 errmsg = MESSAGE_TEXT;
SET errmsg= REPLACE(errmsg, 'You have an error in your SQL ', '..');
SET errmsg= REPLACE(errmsg, '; check the manual that corresponds to your MariaDB server version for the right syntax to use', '..');
END;
SET query=REPLACE(query, '$(VAR)', var);
EXECUTE IMMEDIATE query;
SELECT CONCAT(query, '; -- ', LEFT(COALESCE(errmsg,''),40)) AS `--------`;
END;
$$
CREATE PROCEDURE p2(query TEXT)
BEGIN
FOR row IN (SELECT word FROM t1 ORDER BY category, word)
DO
CALL p1(query, row.word);
END FOR;
END;
$$
DELIMITER ;$$
CREATE TABLE t1 (word TEXT, category TEXT);
INSERT INTO t1 VALUES ('non_keyword', '00 Simple identifier');
INSERT INTO t1 VALUES ('lpad', '01 Built-in native function');
INSERT INTO t1 VALUES ('rpad', '01 Built-in native function');
INSERT INTO t1 VALUES ('adddate', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('substr', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('substring', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('trim_oracle', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('ascii', '03 function_call_conflict');
INSERT INTO t1 VALUES ('replace', '03 function_call_conflict');
INSERT INTO t1 VALUES ('weight_string', '03 function_call_conflict');
INSERT INTO t1 VALUES ('char', '04 function_call_keyword');
INSERT INTO t1 VALUES ('trim', '04 function_call_keyword');
INSERT INTO t1 VALUES ('year', '04 function_call_keyword');
INSERT INTO t1 VALUES ('create', '05 Reserved keyword');
CALL p2('SELECT @@$(VAR)');
CALL p2('SELECT @@global.$(VAR)');
CALL p2('SELECT @@global.$(VAR)()');
CALL p2('SELECT $(VAR)()');
CALL p2('SELECT test.$(VAR)()');
CALL p2('SELECT $(VAR) FROM t1');
CALL p2('SELECT t1.$(VAR) FROM t1');
CALL p2('DROP TABLE $(VAR)');
CALL p2('DROP TABLE test.$(VAR)');
CALL p2('CREATE FUNCTION $(VAR)() RETURNS OOPS');
CALL p2('CREATE FUNCTION test.$(VAR)() RETURNS OOPS');
CALL p2('DROP FUNCTION $(VAR)');
CALL p2('DROP FUNCTION test.$(VAR)');
DROP TABLE t1;
DROP PROCEDURE p1;
DROP PROCEDURE p2;

View File

@ -1,4 +1,5 @@
source include/not_embedded.inc;
source include/not_aix.inc;
let $have_plugin = `SELECT COUNT(*) FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_STATUS='ACTIVE' AND PLUGIN_NAME = 'THREAD_POOL_GROUPS'`;
if(!$have_plugin)

View File

@ -1699,7 +1699,7 @@ a ENUM('
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` enum('ä','ö','ü') CHARACTER SET utf8 DEFAULT 'ü'
`a` enum('ä','ö','ü') CHARACTER SET utf8mb3 DEFAULT 'ü'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
insert into t1 values ('ä'), ('ö'), ('ü');
select a from t1 order by a;
@ -1932,14 +1932,16 @@ ALTER TABLE t2 ADD PRIMARY KEY(c1);
SELECT t1.* FROM t1 JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
c1
a
a
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
c1
a
a
# t2 should NOT be eliminated
EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 system NULL NULL NULL NULL 1
1 SIMPLE t2 range PRIMARY PRIMARY 1 NULL 1 Using where; Using index
1 SIMPLE t2 index PRIMARY PRIMARY 1 NULL 2 Using where; Using index
DROP TABLE IF EXISTS t1,t2;
CREATE TABLE t1 (c1 SET('a') CHARACTER SET latin1 PRIMARY KEY);
INSERT INTO t1 VALUES ('a');
@ -1957,14 +1959,16 @@ ALTER TABLE t2 ADD PRIMARY KEY(c1);
SELECT t1.* FROM t1 JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
c1
a
a
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
c1
a
a
# t2 should NOT be eliminated
EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 system NULL NULL NULL NULL 1
1 SIMPLE t2 range PRIMARY PRIMARY 1 NULL 1 Using where; Using index
1 SIMPLE t2 index PRIMARY PRIMARY 1 NULL 2 Using where; Using index
DROP TABLE IF EXISTS t1,t2;
CREATE TABLE t1 (c1 VARCHAR(10) CHARACTER SET latin1 PRIMARY KEY);
INSERT INTO t1 VALUES ('a');
@ -1982,14 +1986,16 @@ ALTER TABLE t2 ADD PRIMARY KEY(c1);
SELECT t1.* FROM t1 JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
c1
a
a
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
c1
a
a
# t2 should NOT be eliminated
EXPLAIN SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.c1 COLLATE latin1_swedish_ci=t2.c1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 system NULL NULL NULL NULL 1
1 SIMPLE t2 range PRIMARY PRIMARY 1 NULL 1 Using where; Using index
1 SIMPLE t2 index PRIMARY PRIMARY 1 NULL 2 Using where; Using index
DROP TABLE IF EXISTS t1,t2;
#
# MDEV-6991 GROUP_MIN_MAX optimization is erroneously applied in some cases

View File

@ -0,0 +1,21 @@
CREATE TABLE t1 (a INT NOT NULL) ENGINE=InnoDB STATS_PERSISTENT=0;
connect ddl,localhost,root;
SET DEBUG_SYNC='after_trx_committed_in_memory SIGNAL stuck WAIT_FOR ever EXECUTE 2';
ALTER TABLE t1 ADD PRIMARY KEY(a);
connection default;
SET DEBUG_SYNC='now WAIT_FOR stuck';
SET DEBUG_SYNC='now SIGNAL ever';
SET DEBUG_SYNC='now WAIT_FOR stuck';
SET GLOBAL innodb_log_checkpoint_now=ON;
# restart
disconnect ddl;
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 STATS_PERSISTENT=0
SELECT * FROM t1;
a
DROP TABLE t1;
InnoDB 0 transactions not purged

View File

@ -0,0 +1,53 @@
SET @buffering= @@innodb_change_buffering;
SET GLOBAL innodb_change_buffering= deletes;
Warnings:
Warning 1287 '@@innodb_change_buffering' is deprecated and will be removed in a future release
SET @flush= @@innodb_flush_log_at_trx_commit;
SET GLOBAL innodb_flush_log_at_trx_commit= 0;
CREATE TABLE t1 (
a varchar(1024),
b varchar(1024),
c varchar(1024),
d varchar(1024),
e varchar(1024),
f varchar(1024),
g varchar(1024),
h varchar(1024),
key (a),
key (b),
key (c),
key (d)
) ENGINE=InnoDB;
INSERT INTO t1
SELECT REPEAT('x',10), REPEAT('x',13), REPEAT('x',427), REPEAT('x',244),
REPEAT('x',9), REPEAT('x',112), REPEAT('x',814), REPEAT('x',633)
FROM seq_1_to_1024;
CREATE TEMPORARY TABLE t2 (
a varchar(1024),
b varchar(1024),
c varchar(1024),
d varchar(1024),
e varchar(1024),
f varchar(1024),
g varchar(1024),
h varchar(1024),
i varchar(1024),
j varchar(1024),
k varchar(1024),
l varchar(1024),
m varchar(1024),
key (a),
key (b),
key (c),
key (d),
key (e),
key (f)
) ENGINE=InnoDB;
SET @x=REPEAT('x',512);
INSERT INTO t2 SELECT @x, @x, @x, @x, @x, @x, @x, @x, @x, @x, @x, @x, @x
FROM seq_1_to_768;
DROP TABLE t1, t2;
SET GLOBAL innodb_change_buffering= @buffering;
Warnings:
Warning 1287 '@@innodb_change_buffering' is deprecated and will be removed in a future release
SET GLOBAL innodb_flush_log_at_trx_commit= @flush;

View File

@ -268,3 +268,16 @@ INSERT INTO t1 VALUES (0),(0),(0),(0),(0),(0),(0);
ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
DELETE FROM t1;
DROP TABLE t1;
#
# MDEV-28037 Assertion `trx->bulk_insert' failed in innodb_prepare_commit_versioned
#
CREATE TABLE t1 (c INT) ENGINE=InnoDB;
CREATE TABLE t2 (c INT) ENGINE=InnoDB;
CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW UPDATE t2 SET c=1;
INSERT INTO t1 VALUES (0);
SELECT * FROM t1;
c
0
SELECT * FROM t2;
c
DROP TABLE t2, t1;

View File

@ -0,0 +1,67 @@
--source include/have_innodb.inc
--source include/have_sequence.inc
SET @buffering= @@innodb_change_buffering;
SET GLOBAL innodb_change_buffering= deletes;
SET @flush= @@innodb_flush_log_at_trx_commit;
SET GLOBAL innodb_flush_log_at_trx_commit= 0;
CREATE TABLE t1 (
a varchar(1024),
b varchar(1024),
c varchar(1024),
d varchar(1024),
e varchar(1024),
f varchar(1024),
g varchar(1024),
h varchar(1024),
key (a),
key (b),
key (c),
key (d)
) ENGINE=InnoDB;
INSERT INTO t1
SELECT REPEAT('x',10), REPEAT('x',13), REPEAT('x',427), REPEAT('x',244),
REPEAT('x',9), REPEAT('x',112), REPEAT('x',814), REPEAT('x',633)
FROM seq_1_to_1024;
CREATE TEMPORARY TABLE t2 (
a varchar(1024),
b varchar(1024),
c varchar(1024),
d varchar(1024),
e varchar(1024),
f varchar(1024),
g varchar(1024),
h varchar(1024),
i varchar(1024),
j varchar(1024),
k varchar(1024),
l varchar(1024),
m varchar(1024),
key (a),
key (b),
key (c),
key (d),
key (e),
key (f)
) ENGINE=InnoDB;
SET @x=REPEAT('x',512);
INSERT INTO t2 SELECT @x, @x, @x, @x, @x, @x, @x, @x, @x, @x, @x, @x, @x
FROM seq_1_to_768;
--disable_query_log
--let $run=1024
while ($run)
{
eval DELETE FROM t1 LIMIT 1 /* $run */;
--dec $run
}
--enable_query_log
# Cleanup
DROP TABLE t1, t2;
SET GLOBAL innodb_change_buffering= @buffering;
SET GLOBAL innodb_flush_log_at_trx_commit= @flush;

View File

@ -281,3 +281,14 @@ CREATE TABLE t1 (c0 YEAR UNIQUE) ENGINE=InnoDB;
INSERT INTO t1 VALUES (0),(0),(0),(0),(0),(0),(0);
DELETE FROM t1;
DROP TABLE t1;
--echo #
--echo # MDEV-28037 Assertion `trx->bulk_insert' failed in innodb_prepare_commit_versioned
--echo #
CREATE TABLE t1 (c INT) ENGINE=InnoDB;
CREATE TABLE t2 (c INT) ENGINE=InnoDB;
CREATE TRIGGER tr AFTER INSERT ON t1 FOR EACH ROW UPDATE t2 SET c=1;
INSERT INTO t1 VALUES (0);
SELECT * FROM t1;
SELECT * FROM t2;
DROP TABLE t2, t1;

View File

@ -28,3 +28,21 @@ CREATE TEMPORARY TABLE t1 LIKE INFORMATION_SCHEMA.INNODB_TRX;
DROP TEMPORARY TABLE t1;
CREATE TEMPORARY TABLE t1 AS SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX LIMIT 0;
DROP TEMPORARY TABLE t1;
#
# Start of 10.5 tests
#
#
# MDEV-26507 Assertion `tmp != ((long long) 0x8000000000000000LL)' failed in TIME_from_longlong_datetime_packed
#
CREATE ALGORITHM=TEMPTABLE VIEW i AS
SELECT a.trx_started
FROM INFORMATION_SCHEMA.innodb_lock_waits w
JOIN INFORMATION_SCHEMA.innodb_trx a
ORDER BY a.trx_wait_started;
SET SESSION sql_mode='ALLOW_INVALID_DATES';
SELECT * FROM i;
SET SESSION sql_mode=DEFAULT;
DROP VIEW i;
#
# End of 10.5 tests
#

View File

@ -7,3 +7,28 @@ DROP TEMPORARY TABLE t1;
CREATE TEMPORARY TABLE t1 AS SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX LIMIT 0;
DROP TEMPORARY TABLE t1;
--echo #
--echo # Start of 10.5 tests
--echo #
--echo #
--echo # MDEV-26507 Assertion `tmp != ((long long) 0x8000000000000000LL)' failed in TIME_from_longlong_datetime_packed
--echo #
CREATE ALGORITHM=TEMPTABLE VIEW i AS
SELECT a.trx_started
FROM INFORMATION_SCHEMA.innodb_lock_waits w
JOIN INFORMATION_SCHEMA.innodb_trx a
ORDER BY a.trx_wait_started;
SET SESSION sql_mode='ALLOW_INVALID_DATES';
--disable_result_log
SELECT * FROM i;
--enable_result_log
SET SESSION sql_mode=DEFAULT;
DROP VIEW i;
--echo #
--echo # End of 10.5 tests
--echo #

View File

@ -1,6 +1,6 @@
SET GLOBAL event_scheduler = OFF;
SELECT name, type, processlist_user, processlist_host, processlist_db,
processlist_command, processlist_info,
processlist_command, processlist_info, connection_type,
IF(parent_thread_id IS NULL, parent_thread_id, 'unified parent_thread_id')
AS unified_parent_thread_id,
role, instrumented
@ -14,6 +14,7 @@ processlist_host NULL
processlist_db mysql
processlist_command NULL
processlist_info NULL
connection_type NULL
unified_parent_thread_id NULL
role NULL
instrumented YES
@ -24,6 +25,7 @@ processlist_host NULL
processlist_db NULL
processlist_command NULL
processlist_info NULL
connection_type NULL
unified_parent_thread_id unified parent_thread_id
role NULL
instrumented YES
@ -34,13 +36,14 @@ processlist_host localhost
processlist_db test
processlist_command Query
processlist_info SELECT name, type, processlist_user, processlist_host, processlist_db,
processlist_command, processlist_info,
processlist_command, processlist_info, connection_type,
IF(parent_thread_id IS NULL, parent_thread_id, 'unified parent_thread_id')
AS unified_parent_thread_id,
role, instrumented
FROM performance_schema.threads
WHERE name LIKE 'thread/sql%'
ORDER BY name
connection_type Socket
unified_parent_thread_id unified parent_thread_id
role NULL
instrumented YES
@ -51,6 +54,7 @@ processlist_host NULL
processlist_db NULL
processlist_command NULL
processlist_info NULL
connection_type NULL
unified_parent_thread_id unified parent_thread_id
role NULL
instrumented YES

View File

@ -32,7 +32,7 @@ SET GLOBAL event_scheduler = OFF;
# Therefore we have to disable this protocol for the next statement.
--disable_ps_protocol
SELECT name, type, processlist_user, processlist_host, processlist_db,
processlist_command, processlist_info,
processlist_command, processlist_info, connection_type,
IF(parent_thread_id IS NULL, parent_thread_id, 'unified parent_thread_id')
AS unified_parent_thread_id,
role, instrumented

View File

@ -56,3 +56,15 @@ blocking_trx_rows_modified bigint(21) unsigned NO NULL
sql_kill_blocking_query varchar(32) YES NULL
sql_kill_blocking_connection varchar(26) YES NULL
SELECT * FROM sys.x$innodb_lock_waits;
#
# Start of 10.6 tests
#
#
# MDEV-26507 Assertion `tmp != ((long long) 0x8000000000000000LL)' failed in TIME_from_longlong_datetime_packed
#
SET SESSION sql_mode='ALLOW_INVALID_DATES';
SELECT * FROM sys.x$innodb_lock_waits;
SET SESSION sql_mode=DEFAULT;
#
# End of 10.6 tests
#

View File

@ -21,3 +21,21 @@ DESC sys.x$innodb_lock_waits;
SELECT * FROM sys.x$innodb_lock_waits;
--enable_result_log
--echo #
--echo # Start of 10.6 tests
--echo #
--echo #
--echo # MDEV-26507 Assertion `tmp != ((long long) 0x8000000000000000LL)' failed in TIME_from_longlong_datetime_packed
--echo #
SET SESSION sql_mode='ALLOW_INVALID_DATES';
--disable_result_log
SELECT * FROM sys.x$innodb_lock_waits;
--enable_result_log
SET SESSION sql_mode=DEFAULT;
--echo #
--echo # End of 10.6 tests
--echo #

View File

@ -2788,6 +2788,12 @@ void mysqld_win_set_startup_complete()
}
void mysqld_win_extend_service_timeout(DWORD sec)
{
my_report_svc_status((DWORD)-1, 0, 2*1000*sec);
}
void mysqld_win_set_service_name(const char *name)
{
if (stricmp(name, "mysql"))

View File

@ -979,6 +979,7 @@ extern int mysqld_main(int argc, char **argv);
extern HANDLE hEventShutdown;
extern void mysqld_win_initiate_shutdown();
extern void mysqld_win_set_startup_complete();
extern void mysqld_win_extend_service_timeout(DWORD sec);
extern void mysqld_set_service_status_callback(void (*)(DWORD, DWORD, DWORD));
extern void mysqld_win_set_service_name(const char *name);
#endif

View File

@ -82,7 +82,8 @@ static void report_svc_status(DWORD current_state, DWORD exit_code, DWORD wait_h
return;
static DWORD check_point= 1;
svc_status.dwCurrentState= current_state;
if (current_state != (DWORD)-1)
svc_status.dwCurrentState= current_state;
svc_status.dwWaitHint= wait_hint;
if (exit_code)

View File

@ -2136,15 +2136,17 @@ void buf_pool_t::watch_unset(const page_id_t id, buf_pool_t::hash_chain &chain)
if (!watch_is_sentinel(*w))
{
no_watch:
ut_d(const auto s=) w->unfix();
ut_ad(~buf_page_t::LRU_MASK & s);
w->unfix();
w= nullptr;
}
const auto state= w->state();
ut_ad(~buf_page_t::LRU_MASK & state);
ut_ad(state >= buf_page_t::UNFIXED);
if (state != buf_page_t::UNFIXED + 1)
goto no_watch;
else
{
const auto state= w->state();
ut_ad(~buf_page_t::LRU_MASK & state);
ut_ad(state >= buf_page_t::UNFIXED + 1);
if (state != buf_page_t::UNFIXED + 1)
goto no_watch;
}
}
if (!w)

View File

@ -68,6 +68,7 @@ Created 1/8/1996 Heikki Tuuri
#include "srv0mon.h"
#include "srv0start.h"
#include "trx0undo.h"
#include "trx0purge.h"
#include <vector>
#include <algorithm>
@ -601,13 +602,13 @@ dict_index_get_nth_field_pos(
}
/** Parse the table file name into table name and database name.
@tparam dict_locked whether dict_sys.lock() was called
@param[in,out] db_name database name buffer
@param[in,out] tbl_name table name buffer
@param[out] db_name_len database name length
@param[out] tbl_name_len table name length
@tparam dict_frozen whether the caller holds dict_sys.latch
@param[in,out] db_name database name buffer
@param[in,out] tbl_name table name buffer
@param[out] db_name_len database name length
@param[out] tbl_name_len table name length
@return whether the table name is visible to SQL */
template<bool dict_locked>
template<bool dict_frozen>
bool dict_table_t::parse_name(char (&db_name)[NAME_LEN + 1],
char (&tbl_name)[NAME_LEN + 1],
size_t *db_name_len, size_t *tbl_name_len) const
@ -615,7 +616,7 @@ bool dict_table_t::parse_name(char (&db_name)[NAME_LEN + 1],
char db_buf[MAX_DATABASE_NAME_LEN + 1];
char tbl_buf[MAX_TABLE_NAME_LEN + 1];
if (!dict_locked)
if (!dict_frozen)
dict_sys.freeze(SRW_LOCK_CALL); /* protect against renaming */
ut_ad(dict_sys.frozen());
const size_t db_len= name.dblen();
@ -635,7 +636,7 @@ bool dict_table_t::parse_name(char (&db_name)[NAME_LEN + 1],
memcpy(tbl_buf, mdl_name.m_name + db_len + 1, tbl_len);
tbl_buf[tbl_len]= 0;
if (!dict_locked)
if (!dict_frozen)
dict_sys.unfreeze();
*db_name_len= filename_to_tablename(db_buf, db_name,
@ -781,7 +782,7 @@ return_without_mdl:
size_t db1_len, tbl1_len;
if (!table->parse_name<!trylock>(db_buf1, tbl_buf1, &db1_len, &tbl1_len))
if (!table->parse_name<true>(db_buf1, tbl_buf1, &db1_len, &tbl1_len))
{
/* The table was renamed to #sql prefix.
Release MDL (if any) for the old name and return. */
@ -819,12 +820,14 @@ template dict_table_t* dict_acquire_mdl_shared<true>
(dict_table_t*,THD*,MDL_ticket**,dict_table_op_t);
/** Look up a table by numeric identifier.
@tparam purge_thd Whether the function is called by purge thread
@param[in] table_id table identifier
@param[in] dict_locked data dictionary locked
@param[in] table_op operation to perform when opening
@param[in,out] thd background thread, or NULL to not acquire MDL
@param[out] mdl mdl ticket, or NULL
@return table, NULL if does not exist */
template <bool purge_thd>
dict_table_t*
dict_table_open_on_id(table_id_t table_id, bool dict_locked,
dict_table_op_t table_op, THD *thd,
@ -837,6 +840,12 @@ dict_table_open_on_id(table_id_t table_id, bool dict_locked,
if (table)
{
if (purge_thd && purge_sys.must_wait_FTS())
{
table= nullptr;
goto func_exit;
}
table->acquire();
if (thd && !dict_locked)
table= dict_acquire_mdl_shared<false>(table, thd, mdl, table_op);
@ -853,7 +862,14 @@ dict_table_open_on_id(table_id_t table_id, bool dict_locked,
? DICT_ERR_IGNORE_RECOVER_LOCK
: DICT_ERR_IGNORE_FK_NOKEY);
if (table)
{
if (purge_thd && purge_sys.must_wait_FTS())
{
dict_sys.unlock();
return nullptr;
}
table->acquire();
}
if (!dict_locked)
{
dict_sys.unlock();
@ -867,12 +883,22 @@ dict_table_open_on_id(table_id_t table_id, bool dict_locked,
}
}
func_exit:
if (!dict_locked)
dict_sys.unfreeze();
return table;
}
template dict_table_t* dict_table_open_on_id<false>
(table_id_t table_id, bool dict_locked,
dict_table_op_t table_op, THD *thd,
MDL_ticket **mdl);
template dict_table_t* dict_table_open_on_id<true>
(table_id_t table_id, bool dict_locked,
dict_table_op_t table_op, THD *thd,
MDL_ticket **mdl);
/********************************************************************//**
Looks for column n position in the clustered index.
@return position in internal representation of the clustered index */

View File

@ -1555,12 +1555,16 @@ have any other reference count.
static void fts_table_no_ref_count(const char *table_name)
{
dict_table_t *table= dict_table_open_on_name(
table_name, false, DICT_ERR_IGNORE_TABLESPACE);
table_name, true, DICT_ERR_IGNORE_TABLESPACE);
if (!table)
return;
while (table->get_ref_count() > 1)
{
dict_sys.unlock();
std::this_thread::sleep_for(std::chrono::milliseconds(50));
dict_sys.lock(SRW_LOCK_CALL);
}
table->release();
}
@ -1572,8 +1576,10 @@ and common table associated with the fts table.
already stopped*/
void purge_sys_t::stop_FTS(const dict_table_t &table, bool already_stopped)
{
dict_sys.lock(SRW_LOCK_CALL);
if (!already_stopped)
purge_sys.stop_FTS();
fts_table_t fts_table;
char table_name[MAX_FULL_NAME_LEN];
@ -1582,28 +1588,31 @@ void purge_sys_t::stop_FTS(const dict_table_t &table, bool already_stopped)
for (const char **suffix= fts_common_tables; *suffix; suffix++)
{
fts_table.suffix= *suffix;
fts_get_table_name(&fts_table, table_name, false);
fts_get_table_name(&fts_table, table_name, true);
fts_table_no_ref_count(table_name);
}
if (!table.fts)
return;
auto indexes= table.fts->indexes;
if (!indexes)
return;
for (ulint i= 0;i < ib_vector_size(indexes); ++i)
if (table.fts)
{
const dict_index_t *index= static_cast<const dict_index_t*>(
ib_vector_getp(indexes, i));
FTS_INIT_INDEX_TABLE(&fts_table, nullptr, FTS_INDEX_TABLE, index);
for (const fts_index_selector_t *s= fts_index_selector;
s->suffix; s++)
if (auto indexes= table.fts->indexes)
{
fts_table.suffix= s->suffix;
fts_get_table_name(&fts_table, table_name, false);
fts_table_no_ref_count(table_name);
for (ulint i= 0;i < ib_vector_size(indexes); ++i)
{
const dict_index_t *index= static_cast<const dict_index_t*>(
ib_vector_getp(indexes, i));
FTS_INIT_INDEX_TABLE(&fts_table, nullptr, FTS_INDEX_TABLE, index);
for (const fts_index_selector_t *s= fts_index_selector;
s->suffix; s++)
{
fts_table.suffix= s->suffix;
fts_get_table_name(&fts_table, table_name, true);
fts_table_no_ref_count(table_name);
}
}
}
}
dict_sys.unlock();
}
/** Lock the internal FTS_ tables for table, before fts_drop_tables().

View File

@ -15788,6 +15788,12 @@ ha_innobase::start_stmt(
if (!trx->bulk_insert) {
break;
}
/* Trigger could've initiated another stmt.
So apply all bulk operation and mark as
end bulk insert for all tables */
trx->bulk_insert_apply();
trx->end_bulk_insert();
trx->bulk_insert = false;
trx->last_sql_stat_start.least_undo_no = trx->undo_no;
}

View File

@ -2003,7 +2003,8 @@ inline void buf_page_t::set_state(uint32_t s)
{
mysql_mutex_assert_owner(&buf_pool.mutex);
ut_ad(s <= REMOVE_HASH || s >= UNFIXED);
ut_ad(s <= READ_FIX);
ut_ad(s < WRITE_FIX);
ut_ad(s <= READ_FIX || zip.fix == READ_FIX);
zip.fix= s;
}

View File

@ -2,7 +2,7 @@
Copyright (c) 1996, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc.
Copyright (c) 2013, 2021, MariaDB Corporation.
Copyright (c) 2013, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@ -146,6 +146,7 @@ dict_acquire_mdl_shared(dict_table_t *table,
@param[in,out] thd background thread, or NULL to not acquire MDL
@param[out] mdl mdl ticket, or NULL
@return table, NULL if does not exist */
template<bool purge_thd= false>
dict_table_t*
dict_table_open_on_id(table_id_t table_id, bool dict_locked,
dict_table_op_t table_op, THD *thd= nullptr,
@ -1566,7 +1567,7 @@ public:
}
else
lock_wait(SRW_LOCK_ARGS(file, line));
}
}
#ifdef UNIV_PFS_RWLOCK
/** Unlock the data dictionary cache. */

View File

@ -2,7 +2,7 @@
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc.
Copyright (c) 2013, 2021, MariaDB Corporation.
Copyright (c) 2013, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@ -1947,17 +1947,17 @@ struct dict_table_t {
/** For overflow fields returns potential max length stored inline */
inline size_t get_overflow_field_local_len() const;
/** Parse the table file name into table name and database name.
@tparam dict_locked whether dict_sys.lock() was called
@param[in,out] db_name database name buffer
@param[in,out] tbl_name table name buffer
@param[out] db_name_len database name length
@param[out] tbl_name_len table name length
@return whether the table name is visible to SQL */
template<bool dict_locked= false>
bool parse_name(char (&db_name)[NAME_LEN + 1],
char (&tbl_name)[NAME_LEN + 1],
size_t *db_name_len, size_t *tbl_name_len) const;
/** Parse the table file name into table name and database name.
@tparam dict_frozen whether the caller holds dict_sys.latch
@param[in,out] db_name database name buffer
@param[in,out] tbl_name table name buffer
@param[out] db_name_len database name length
@param[out] tbl_name_len table name length
@return whether the table name is visible to SQL */
template<bool dict_frozen= false>
bool parse_name(char (&db_name)[NAME_LEN + 1],
char (&tbl_name)[NAME_LEN + 1],
size_t *db_name_len, size_t *tbl_name_len) const;
/** Clear the table when rolling back TRX_UNDO_EMPTY */
void clear(que_thr_t *thr);

View File

@ -1871,7 +1871,7 @@ dberr_t recv_sys_t::find_checkpoint()
sql_print_error("%s The redo log was created with %s%s",
srv_operation == SRV_OPERATION_NORMAL
? "InnoDB: Upgrade after a crash is not supported."
: "mariadb-backup --prepare is not possible", creator,
: "mariadb-backup --prepare is not possible.", creator,
(err == DB_ERROR ? "." : ", and it appears corrupted."));
return err;
}

View File

@ -1027,10 +1027,14 @@ row_purge_parse_undo_rec(
try_again:
purge_sys.check_stop_FTS();
node->table = dict_table_open_on_id(
node->table = dict_table_open_on_id<true>(
table_id, false, DICT_TABLE_OP_NORMAL, node->purge_thd,
&node->mdl_ticket);
if (!node->table && purge_sys.must_wait_FTS()) {
goto try_again;
}
if (!node->table) {
/* The table has been dropped: no need to do purge and
release mdl happened as a part of open process itself */

View File

@ -851,54 +851,83 @@ int ha_spider::external_lock(
int error_num = 0;
SPIDER_TRX *trx;
backup_error_status();
DBUG_ENTER("ha_spider::external_lock");
DBUG_PRINT("info",("spider this=%p", this));
DBUG_PRINT("info",("spider lock_type=%x", lock_type));
if (
wide_handler->stage == SPD_HND_STAGE_EXTERNAL_LOCK &&
wide_handler->stage_executor != this)
DBUG_PRINT("info", ("spider sql_command=%d", thd_sql_command(thd)));
if (wide_handler->stage == SPD_HND_STAGE_EXTERNAL_LOCK)
{
/* Only the stage executor deals with table locks. */
if (wide_handler->stage_executor != this)
{
DBUG_RETURN(0);
}
}
else
{
/* Update the stage executor when the stage changes */
wide_handler->stage= SPD_HND_STAGE_EXTERNAL_LOCK;
wide_handler->stage_executor= this;
}
info_auto_called = FALSE;
wide_handler->external_lock_type= lock_type;
wide_handler->sql_command = thd_sql_command(thd);
/* We treat BEGIN as if UNLOCK TABLE. */
if (wide_handler->sql_command == SQLCOM_BEGIN)
{
wide_handler->sql_command = SQLCOM_UNLOCK_TABLES;
}
if (lock_type == F_UNLCK &&
wide_handler->sql_command != SQLCOM_UNLOCK_TABLES)
{
DBUG_RETURN(0);
}
wide_handler->stage = SPD_HND_STAGE_EXTERNAL_LOCK;
wide_handler->stage_executor = this;
info_auto_called = FALSE;
wide_handler->sql_command = thd_sql_command(thd);
if (wide_handler->sql_command == SQLCOM_BEGIN)
wide_handler->sql_command = SQLCOM_UNLOCK_TABLES;
trx = spider_get_trx(thd, TRUE, &error_num);
if (error_num)
{
DBUG_RETURN(error_num);
}
wide_handler->trx = trx;
DBUG_PRINT("info",("spider sql_command=%d", wide_handler->sql_command));
if (
lock_type == F_UNLCK &&
wide_handler->sql_command != SQLCOM_UNLOCK_TABLES
)
DBUG_RETURN(0);
/* Question: Why the following if block is necessary? Why here? */
if (store_error_num)
{
DBUG_RETURN(store_error_num);
wide_handler->external_lock_type = lock_type;
if (
/* SQLCOM_RENAME_TABLE and SQLCOM_DROP_DB don't come here */
wide_handler->sql_command == SQLCOM_DROP_TABLE ||
wide_handler->sql_command == SQLCOM_ALTER_TABLE
) {
if (trx->locked_connections)
{
my_message(ER_SPIDER_ALTER_BEFORE_UNLOCK_NUM,
ER_SPIDER_ALTER_BEFORE_UNLOCK_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_ALTER_BEFORE_UNLOCK_NUM);
}
DBUG_RETURN(0);
}
DBUG_ASSERT(wide_handler->sql_command != SQLCOM_RENAME_TABLE &&
wide_handler->sql_command != SQLCOM_DROP_DB);
if (wide_handler->sql_command == SQLCOM_DROP_TABLE ||
wide_handler->sql_command == SQLCOM_ALTER_TABLE)
{
if (trx->locked_connections)
{
my_message(ER_SPIDER_ALTER_BEFORE_UNLOCK_NUM,
ER_SPIDER_ALTER_BEFORE_UNLOCK_STR, MYF(0));
DBUG_RETURN(ER_SPIDER_ALTER_BEFORE_UNLOCK_NUM);
}
if (unlikely((error_num = spider_internal_start_trx(this))))
DBUG_RETURN(0);
}
if (lock_type != F_UNLCK)
{
if (unlikely((error_num= spider_internal_start_trx(this))))
{
DBUG_RETURN(error_num);
}
if (wide_handler->sql_command != SQLCOM_SELECT &&
wide_handler->sql_command != SQLCOM_HA_READ)
{
trx->updated_in_this_trx= TRUE;
DBUG_PRINT("info", ("spider trx->updated_in_this_trx=TRUE"));
}
}
if (wide_handler->lock_table_type > 0 ||
wide_handler->sql_command == SQLCOM_UNLOCK_TABLES)
@ -913,9 +942,8 @@ int ha_spider::external_lock(
/* lock/unlock tables */
if (partition_handler && partition_handler->handlers)
{
uint roop_count;
for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
for (uint roop_count= 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if (unlikely((error_num =
partition_handler->handlers[roop_count]->lock_tables())))
@ -923,41 +951,13 @@ int ha_spider::external_lock(
DBUG_RETURN(error_num);
}
}
} else {
if (unlikely((error_num = lock_tables())))
{
DBUG_RETURN(error_num);
}
}
else if (unlikely((error_num= lock_tables())))
{
DBUG_RETURN(error_num);
}
}
DBUG_PRINT("info",("spider trx_start=%s",
trx->trx_start ? "TRUE" : "FALSE"));
/* need to check after spider_internal_start_trx() */
if (trx->trx_start)
{
switch (wide_handler->sql_command)
{
case SQLCOM_SELECT:
case SQLCOM_HA_READ:
/* nothing to do */
break;
case SQLCOM_UPDATE:
case SQLCOM_UPDATE_MULTI:
case SQLCOM_CREATE_TABLE:
case SQLCOM_INSERT:
case SQLCOM_INSERT_SELECT:
case SQLCOM_DELETE:
case SQLCOM_LOAD:
case SQLCOM_REPLACE:
case SQLCOM_REPLACE_SELECT:
case SQLCOM_DELETE_MULTI:
default:
trx->updated_in_this_trx = TRUE;
DBUG_PRINT("info",("spider trx->updated_in_this_trx=TRUE"));
break;
}
}
DBUG_RETURN(0);
}

View File

@ -0,0 +1,20 @@
#
# MDEV-27239 Spider: Assertion `thd->transaction->stmt.ha_list == __null || trans == &thd->transaction->stmt' failed in ha_commit_trans on BEGIN WORK after FTWRL
#
for master_1
for child2
for child3
CREATE DATABASE auto_test_local;
USE auto_test_local;
CREATE TABLE tbl_a (a INT) ENGINE=SPIDER;
FLUSH TABLE tbl_a WITH READ LOCK;
Warnings:
Error 1429 Unable to connect to foreign data source: localhost
Error 1429 Unable to connect to foreign data source: localhost
Error 1429 Unable to connect to foreign data source: localhost
Error 1429 Unable to connect to foreign data source: localhost
BEGIN;
DROP DATABASE auto_test_local;
for master_1
for child2
for child3

View File

@ -0,0 +1,2 @@
!include include/default_mysqld.cnf
!include ../my_1_1.cnf

View File

@ -0,0 +1,24 @@
--echo #
--echo # MDEV-27239 Spider: Assertion `thd->transaction->stmt.ha_list == __null || trans == &thd->transaction->stmt' failed in ha_commit_trans on BEGIN WORK after FTWRL
--echo #
--disable_query_log
--disable_result_log
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
CREATE DATABASE auto_test_local;
USE auto_test_local;
CREATE TABLE tbl_a (a INT) ENGINE=SPIDER;
FLUSH TABLE tbl_a WITH READ LOCK;
BEGIN;
DROP DATABASE auto_test_local;
--disable_query_log
--disable_result_log
--source ../../t/test_deinit.inc
--enable_result_log
--enable_query_log

View File

@ -26,6 +26,8 @@ Warning 1287 The table parameter 'uhd' is deprecated and will be removed in a fu
CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='use_handler "3"';
Warnings:
Warning 1287 The table parameter 'use_handler' is deprecated and will be removed in a future release
DROP TABLE tbl_a;
DROP TABLE tbl_b;
# MDEV-28005 Deprecate Spider plugin variables regarding UDFs
SET GLOBAL spider_udf_ds_bulk_insert_rows = 1;
Warnings:
@ -57,6 +59,21 @@ Warning 1287 '@@spider_udf_ct_bulk_insert_rows' is deprecated and will be remove
SHOW VARIABLES LIKE "spider_udf_ct_bulk_insert_rows";
Variable_name Value
spider_udf_ct_bulk_insert_rows 1
# MDEV-27981 Deprecate spider_internal_limit
SET spider_internal_limit = 1;
Warnings:
Warning 1287 '@@spider_internal_limit' is deprecated and will be removed in a future release
SHOW VARIABLES LIKE "spider_internal_limit";
Variable_name Value
spider_internal_limit 9223372032559808513
CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='ilm "1"';
Warnings:
Warning 1287 The table parameter 'ilm' is deprecated and will be removed in a future release
CREATE TABLE tbl_b (a INT) ENGINE=Spider COMMENT='internal_limit "1"';
Warnings:
Warning 1287 The table parameter 'internal_limit' is deprecated and will be removed in a future release
DROP TABLE tbl_a;
DROP TABLE tbl_b;
DROP DATABASE auto_test_local;
for master_1
for child2

View File

@ -18,6 +18,9 @@ SHOW VARIABLES LIKE "spider_use_handler";
eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='uhd "3"';
eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='use_handler "3"';
DROP TABLE tbl_a;
DROP TABLE tbl_b;
--echo # MDEV-28005 Deprecate Spider plugin variables regarding UDFs
SET GLOBAL spider_udf_ds_bulk_insert_rows = 1;
SHOW VARIABLES LIKE "spider_udf_ds_bulk_insert_rows";
@ -34,6 +37,15 @@ SHOW VARIABLES LIKE "spider_udf_ct_bulk_insert_interval";
SET GLOBAL spider_udf_ct_bulk_insert_rows = 1;
SHOW VARIABLES LIKE "spider_udf_ct_bulk_insert_rows";
--echo # MDEV-27981 Deprecate spider_internal_limit
SET spider_internal_limit = 1;
SHOW VARIABLES LIKE "spider_internal_limit";
eval CREATE TABLE tbl_a (a INT) $MASTER_1_ENGINE COMMENT='ilm "1"';
eval CREATE TABLE tbl_b (a INT) $MASTER_1_ENGINE COMMENT='internal_limit "1"';
DROP TABLE tbl_a;
DROP TABLE tbl_b;
DROP DATABASE auto_test_local;
--disable_query_log

View File

@ -458,7 +458,7 @@ longlong spider_param_internal_offset(
*/
static MYSQL_THDVAR_LONGLONG(
internal_limit, /* name */
PLUGIN_VAR_RQCMDARG, /* opt */
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_DEPRECATED, /* opt */
"Internal limit", /* comment */
NULL, /* check */
spider_use_table_value_deprecated, /* update */

View File

@ -2257,6 +2257,7 @@ int spider_parse_connect_info(
SPIDER_PARAM_LONGLONG("frd", first_read, 0);
SPIDER_PARAM_INT("isa", init_sql_alloc_size, 0);
SPIDER_PARAM_INT_WITH_MAX("idl", internal_delayed, 0, 1);
SPIDER_PARAM_DEPRECATED_WARNING("ilm");
SPIDER_PARAM_LONGLONG("ilm", internal_limit, 0);
SPIDER_PARAM_LONGLONG("ios", internal_offset, 0);
SPIDER_PARAM_INT_WITH_MAX("iom", internal_optimize, 0, 1);
@ -2422,6 +2423,7 @@ int spider_parse_connect_info(
error_num = connect_string_parse.print_param_error();
goto error;
case 14:
SPIDER_PARAM_DEPRECATED_WARNING("internal_limit");
SPIDER_PARAM_LONGLONG("internal_limit", internal_limit, 0);
SPIDER_PARAM_LONGLONG("bgs_first_read", bgs_first_read, 0);
SPIDER_PARAM_INT_WITH_MAX("read_only_mode", read_only_mode, 0, 1);

View File

@ -613,7 +613,7 @@ enum enum_vio_type vio_type(Vio* vio)
static const LEX_CSTRING vio_type_names[] =
{
{ STRING_WITH_LEN("Error") }, // cannot happen
{ STRING_WITH_LEN("") }, // internal threads
{ STRING_WITH_LEN("TCP/IP") },
{ STRING_WITH_LEN("Socket") },
{ STRING_WITH_LEN("Named Pipe") },