summaryrefslogtreecommitdiff
path: root/mysql-test
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2023-01-04 14:52:25 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2023-01-04 14:52:25 +0200
commit8356fb68c366b7f515f9060d964ee598653756a6 (patch)
tree310d7419ad32f74ad29b3da87dd1a21ab4d39dd7 /mysql-test
parentb5a54e8a9305885e2850d6dabde08ad369094ff3 (diff)
parentfe38d7cad4fab33beba90eefaea9e9d4aef06a7c (diff)
downloadmariadb-git-8356fb68c366b7f515f9060d964ee598653756a6.tar.gz
Merge 10.6 into 10.7
Diffstat (limited to 'mysql-test')
-rw-r--r--mysql-test/include/have_gzip.inc6
-rw-r--r--mysql-test/include/maybe_versioning.combinations7
-rw-r--r--mysql-test/include/maybe_versioning.inc47
-rw-r--r--mysql-test/include/start_mysqld.inc19
-rw-r--r--mysql-test/lib/My/CoreDump.pm4
-rw-r--r--mysql-test/main/cte_recursive.result5
-rw-r--r--mysql-test/main/cte_recursive.test5
-rw-r--r--mysql-test/main/func_group.result14
-rw-r--r--mysql-test/main/func_group.test11
-rw-r--r--mysql-test/main/gis.test3
-rw-r--r--mysql-test/main/information_schema.result5
-rw-r--r--mysql-test/main/information_schema.test5
-rw-r--r--mysql-test/main/join_cache.result24
-rw-r--r--mysql-test/main/log_slow.result22
-rw-r--r--mysql-test/main/log_slow.test21
-rw-r--r--mysql-test/main/mysqldump.result1
-rw-r--r--mysql-test/main/mysqldump.test2
-rw-r--r--mysql-test/main/opt_trace.result8
-rw-r--r--mysql-test/main/parser.result11
-rw-r--r--mysql-test/main/parser.test8
-rw-r--r--mysql-test/main/rowid_filter.result68
-rw-r--r--mysql-test/main/rowid_filter_innodb.result37
-rw-r--r--mysql-test/main/rowid_filter_innodb_debug.result26
-rw-r--r--mysql-test/main/rowid_filter_innodb_debug.test44
-rw-r--r--mysql-test/main/select.result8
-rw-r--r--mysql-test/main/select_jcl6.result8
-rw-r--r--mysql-test/main/select_pkeycache.result8
-rw-r--r--mysql-test/main/selectivity.result2
-rw-r--r--mysql-test/main/selectivity_innodb.result2
-rw-r--r--mysql-test/main/sp-security.result20
-rw-r--r--mysql-test/main/sp-security.test23
-rw-r--r--mysql-test/main/stat_tables.result2
-rw-r--r--mysql-test/main/subselect2.result2
-rw-r--r--mysql-test/main/view.result5
-rw-r--r--mysql-test/main/view.test5
-rwxr-xr-xmysql-test/mariadb-test-run.pl13
-rw-r--r--mysql-test/std_data/versioning/articles.frm.gzbin0 -> 287 bytes
-rw-r--r--mysql-test/std_data/versioning/articles2.frm.gzbin0 -> 291 bytes
-rw-r--r--mysql-test/std_data/versioning/ibdata1.gzbin0 -> 41597 bytes
-rw-r--r--mysql-test/std_data/versioning/user_stopword.frm.gzbin0 -> 199 bytes
-rw-r--r--mysql-test/suite/funcs_2/r/innodb_charset.result1
-rw-r--r--mysql-test/suite/funcs_2/t/innodb_charset.test4
-rw-r--r--mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_innodb.result2
-rw-r--r--mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_myisam.result2
-rw-r--r--mysql-test/suite/innodb/r/cursor-restore-locking.result1
-rw-r--r--mysql-test/suite/innodb/r/information_schema_grants.result1
-rw-r--r--mysql-test/suite/innodb/r/insert-before-delete.result35
-rw-r--r--mysql-test/suite/innodb/r/insert_into_empty.result2
-rw-r--r--mysql-test/suite/innodb/r/monitor.result2
-rw-r--r--mysql-test/suite/innodb/t/cursor-restore-locking.test4
-rw-r--r--mysql-test/suite/innodb/t/information_schema_grants.test2
-rw-r--r--mysql-test/suite/innodb/t/innodb-mdev7046.test2
-rw-r--r--mysql-test/suite/innodb/t/insert-before-delete.test72
-rw-r--r--mysql-test/suite/innodb/t/insert_into_empty.test3
-rw-r--r--mysql-test/suite/innodb/t/monitor.test3
-rw-r--r--mysql-test/suite/innodb_fts/r/basic.result6
-rw-r--r--mysql-test/suite/innodb_fts/r/innodb-fts-stopword.result761
-rw-r--r--mysql-test/suite/innodb_fts/r/stopword,vers.rdiff192
-rw-r--r--mysql-test/suite/innodb_fts/r/stopword.result12
-rw-r--r--mysql-test/suite/innodb_fts/r/versioning,prepare.result695
-rw-r--r--mysql-test/suite/innodb_fts/r/versioning.result304
-rw-r--r--mysql-test/suite/innodb_fts/t/basic.inc264
-rw-r--r--mysql-test/suite/innodb_fts/t/basic.test251
-rw-r--r--mysql-test/suite/innodb_fts/t/crash_recovery.test34
-rw-r--r--mysql-test/suite/innodb_fts/t/create.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext2.test11
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext3.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext_cache.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext_distinct.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext_left_join.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext_multi.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext_order_by.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext_update.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext_var.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test15
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb-fts-fic.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb-fts-stopword.opt1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb-fts-stopword.test664
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb_ft_aux_table.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb_fts_large_records.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb_fts_multiple_index.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb_fts_result_cache_limit.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb_fts_stopword_charset.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/innodb_fts_transaction.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/misc_debug.test8
-rw-r--r--mysql-test/suite/innodb_fts/t/stopword.inc55
-rw-r--r--mysql-test/suite/innodb_fts/t/stopword.test114
-rw-r--r--mysql-test/suite/innodb_fts/t/sync.test1
-rw-r--r--mysql-test/suite/innodb_fts/t/sync_ddl.test17
-rw-r--r--mysql-test/suite/innodb_fts/t/versioning.combinations2
-rw-r--r--mysql-test/suite/innodb_fts/t/versioning.opt2
-rw-r--r--mysql-test/suite/innodb_fts/t/versioning.test143
-rw-r--r--mysql-test/suite/mariabackup/incremental_backup.test2
-rw-r--r--mysql-test/suite/parts/t/partition_repair_myisam.test2
-rw-r--r--mysql-test/suite/perfschema/t/statement_program_concurrency.test4
-rw-r--r--mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result2
-rw-r--r--mysql-test/suite/versioning/r/alter.result5
-rw-r--r--mysql-test/suite/versioning/r/debug.result4
-rw-r--r--mysql-test/suite/versioning/r/delete.result1
-rw-r--r--mysql-test/suite/versioning/r/delete_history.result23
-rw-r--r--mysql-test/suite/versioning/r/foreign.result37
-rw-r--r--mysql-test/suite/versioning/t/alter.test2
-rw-r--r--mysql-test/suite/versioning/t/delete_history.test28
-rw-r--r--mysql-test/suite/versioning/t/foreign.test33
-rw-r--r--mysql-test/suite/wsrep/common.pm8
106 files changed, 2376 insertions, 1981 deletions
diff --git a/mysql-test/include/have_gzip.inc b/mysql-test/include/have_gzip.inc
new file mode 100644
index 00000000000..09f282b73de
--- /dev/null
+++ b/mysql-test/include/have_gzip.inc
@@ -0,0 +1,6 @@
+--error 0,1,127
+--exec gzip --version > /dev/null 2> /dev/null
+if ($sys_errno)
+{
+ --skip Requires gzip executable
+}
diff --git a/mysql-test/include/maybe_versioning.combinations b/mysql-test/include/maybe_versioning.combinations
new file mode 100644
index 00000000000..246ad30ce7e
--- /dev/null
+++ b/mysql-test/include/maybe_versioning.combinations
@@ -0,0 +1,7 @@
+[orig]
+
+[vers]
+system_versioning_alter_history=keep
+
+[vers_trx]
+system_versioning_alter_history=keep
diff --git a/mysql-test/include/maybe_versioning.inc b/mysql-test/include/maybe_versioning.inc
new file mode 100644
index 00000000000..8a7d7dad44f
--- /dev/null
+++ b/mysql-test/include/maybe_versioning.inc
@@ -0,0 +1,47 @@
+# include file for test files that can be run with and without debug
+# having debug and non-debug tests.
+
+# If $modify_create_table is true CREATE statement must be evaluated with
+# $create_options that adds WITH SYSTEM VERSIONING to the statement. Otherwise
+# system versioning is added implicitly via debug options. The second variant
+# can easily be added to any test but works only for debug builds.
+
+if ($modify_create_table)
+{
+ if ($MTR_COMBINATION_VERS)
+ {
+ let $create_options= `select ' WITH SYSTEM VERSIONING'`;
+ }
+
+ if ($MTR_COMBINATION_VERS_TRX)
+ {
+ --skip Not tested
+ }
+}
+
+if (!$modify_create_table)
+{
+ let $have_debug=`select version() like '%debug%'`;
+
+ if ($MTR_COMBINATION_VERS)
+ {
+ if (!$have_debug)
+ {
+ --skip Requires debug
+ }
+ --disable_query_log
+ set debug_dbug="d,sysvers_force_trx,sysvers_hide";
+ --enable_query_log
+ }
+
+ if ($MTR_COMBINATION_VERS_TRX)
+ {
+ if (!$have_debug)
+ {
+ --skip Requires debug
+ }
+ --disable_query_log
+ set debug_dbug="d,sysvers_force,sysvers_hide";
+ --enable_query_log
+ }
+}
diff --git a/mysql-test/include/start_mysqld.inc b/mysql-test/include/start_mysqld.inc
index b4fe116fe86..6e448cb2efd 100644
--- a/mysql-test/include/start_mysqld.inc
+++ b/mysql-test/include/start_mysqld.inc
@@ -12,25 +12,32 @@ if (!$restart_noprint)
--let $restart_noprint=0
}
+--let $restart_cmd= restart
+
+if ($restart_bindir)
+{
+ --let $restart_cmd= restart_bindir $restart_bindir
+}
+
if ($restart_parameters)
{
- --exec echo "restart: $restart_parameters" > $_expect_file_name
+ --exec echo "$restart_cmd: $restart_parameters" > $_expect_file_name
if (!$restart_noprint)
{
- --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
- --exec echo "# restart: $restart_parameters"
+ --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
+ --exec echo "# $restart_cmd: $restart_parameters"
}
if ($restart_noprint == 1)
{
- --exec echo "# restart: with restart_parameters"
+ --exec echo "# $restart_cmd: with restart_parameters"
}
}
if (!$restart_parameters)
{
- --exec echo "restart" > $_expect_file_name
+ --exec echo "$restart_cmd" > $_expect_file_name
if ($restart_noprint < 2)
{
- --exec echo "# restart"
+ --exec echo "# $restart_cmd"
}
}
diff --git a/mysql-test/lib/My/CoreDump.pm b/mysql-test/lib/My/CoreDump.pm
index 298cf9ef877..05b6edf1385 100644
--- a/mysql-test/lib/My/CoreDump.pm
+++ b/mysql-test/lib/My/CoreDump.pm
@@ -108,7 +108,7 @@ for my $f (keys %print_formats)
register_opt('print-core|C', ':s',
"Print core dump format: ". $print_formats. " (for not printing cores). ".
- "Defaults to value of MTR_PRINT_CORE or 'short'");
+ "Defaults to value of MTR_PRINT_CORE or 'medium'");
if (!IS_WINDOWS)
{
register_opt('print-method', '=s',
@@ -134,7 +134,7 @@ sub env_or_default($$) {
}
sub pre_setup() {
- $config{print_core}= env_or_default('short', 'MTR_PRINT_CORE')
+ $config{print_core}= env_or_default('medium', 'MTR_PRINT_CORE')
if not defined $config{print_core};
$config{print_method}= (IS_WINDOWS) ? 'cdb' : 'auto'
if not defined $config{print_method};
diff --git a/mysql-test/main/cte_recursive.result b/mysql-test/main/cte_recursive.result
index adbe02363b3..b3a2c66e3d0 100644
--- a/mysql-test/main/cte_recursive.result
+++ b/mysql-test/main/cte_recursive.result
@@ -4230,7 +4230,9 @@ drop table t1;
#
# MDEV-24019: query with recursive CTE when no default database is set
#
-drop database test;
+create database dummy;
+use dummy;
+drop database dummy;
with recursive a as
(select 1 from dual union select * from a as r)
select * from a;
@@ -4269,7 +4271,6 @@ a
1
deallocate prepare stmt;
drop database db1;
-create database test;
use test;
#
# MDEV-23406: query with mutually recursive CTEs when big_tables=1
diff --git a/mysql-test/main/cte_recursive.test b/mysql-test/main/cte_recursive.test
index 069997b0288..8efbdbf9677 100644
--- a/mysql-test/main/cte_recursive.test
+++ b/mysql-test/main/cte_recursive.test
@@ -2732,7 +2732,9 @@ drop table t1;
--echo # MDEV-24019: query with recursive CTE when no default database is set
--echo #
-drop database test;
+create database dummy;
+use dummy;
+drop database dummy;
let $q=
with recursive a as
@@ -2760,7 +2762,6 @@ deallocate prepare stmt;
drop database db1;
-create database test;
use test;
--echo #
diff --git a/mysql-test/main/func_group.result b/mysql-test/main/func_group.result
index 23ecbcdd2c8..aa2bcfef123 100644
--- a/mysql-test/main/func_group.result
+++ b/mysql-test/main/func_group.result
@@ -2553,5 +2553,19 @@ DROP TABLE t1;
#
SET STATEMENT sql_mode=ONLY_FULL_GROUP_BY FOR EXECUTE IMMEDIATE 'ALTER TABLE mysql.time_zone_transition ORDER BY Time_zone_id, Transition_time';
#
+# MDEV-19071 Wrong results when using STDDEV_SAMP() and view
+#
+create table t1(i int);
+insert into t1 values (1),(2),(3),(4),(5);
+create view v1 as select stddev_samp(i),stddev_pop(i),stddev(i),std(i) from t1;
+show create view v1;
+View Create View character_set_client collation_connection
+v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select stddev_samp(`t1`.`i`) AS `stddev_samp(i)`,std(`t1`.`i`) AS `stddev_pop(i)`,std(`t1`.`i`) AS `stddev(i)`,std(`t1`.`i`) AS `std(i)` from `t1` latin1 latin1_swedish_ci
+select * from v1;
+stddev_samp(i) stddev_pop(i) stddev(i) std(i)
+1.5811 1.4142 1.4142 1.4142
+drop view v1;
+drop table t1;
+#
# End of 10.3 tests
#
diff --git a/mysql-test/main/func_group.test b/mysql-test/main/func_group.test
index 624dc0620a4..4ceb6dc53fa 100644
--- a/mysql-test/main/func_group.test
+++ b/mysql-test/main/func_group.test
@@ -1797,5 +1797,16 @@ DROP TABLE t1;
SET STATEMENT sql_mode=ONLY_FULL_GROUP_BY FOR EXECUTE IMMEDIATE 'ALTER TABLE mysql.time_zone_transition ORDER BY Time_zone_id, Transition_time';
--echo #
+--echo # MDEV-19071 Wrong results when using STDDEV_SAMP() and view
+--echo #
+create table t1(i int);
+insert into t1 values (1),(2),(3),(4),(5);
+create view v1 as select stddev_samp(i),stddev_pop(i),stddev(i),std(i) from t1;
+show create view v1;
+select * from v1;
+drop view v1;
+drop table t1;
+
+--echo #
--echo # End of 10.3 tests
--echo #
diff --git a/mysql-test/main/gis.test b/mysql-test/main/gis.test
index 6fd1feda183..17151b1bc86 100644
--- a/mysql-test/main/gis.test
+++ b/mysql-test/main/gis.test
@@ -3092,12 +3092,15 @@ SELECT IS_USED_LOCK(POINT(1,1));
--echo #
--echo # MDEV-26161 crash in Gis_point::calculate_haversine
--echo #
+#enable after fix MDEV-30229
+--disable_view_protocol
--error ER_CANT_CREATE_GEOMETRY_OBJECT
select st_distance_sphere(x'01030000000400000004000000000000', multipoint(point(124,204)), 10);
--error ER_CANT_CREATE_GEOMETRY_OBJECT
select st_distance_sphere(x'010300000004000000040000', multipoint(point(124,204)), 10);
--error ER_CANT_CREATE_GEOMETRY_OBJECT
select st_distance_sphere(x'010300000001000000040000', multipoint(point(124,204)), 10);
+--enable_view_protocol
--echo #
--echo # End of 10.3 tests
diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result
index 6aa7d43dece..156a7a11578 100644
--- a/mysql-test/main/information_schema.result
+++ b/mysql-test/main/information_schema.result
@@ -2366,8 +2366,9 @@ Warning 1931 Query execution was interrupted. The query examined at least ### ro
# m_status == DA_OK_BULK' failed in Diagnostics_area::message()
#
call mtr.add_suppression("Sort aborted.*");
-DROP DATABASE test;
-CREATE DATABASE test;
+create database dummy;
+use dummy;
+drop database dummy;
USE test;
CREATE VIEW v AS SELECT table_schema AS object_schema, table_name AS object_name, table_type AS object_type FROM information_schema.tables ORDER BY object_schema;
SELECT * FROM v LIMIT ROWS EXAMINED 9;
diff --git a/mysql-test/main/information_schema.test b/mysql-test/main/information_schema.test
index 27f5dd6103d..7ef536c2a54 100644
--- a/mysql-test/main/information_schema.test
+++ b/mysql-test/main/information_schema.test
@@ -1939,8 +1939,9 @@ SELECT * FROM INFORMATION_SCHEMA.`COLUMNS` LIMIT ROWS EXAMINED 10;
call mtr.add_suppression("Sort aborted.*");
-DROP DATABASE test;
-CREATE DATABASE test;
+create database dummy;
+use dummy;
+drop database dummy;
USE test;
CREATE VIEW v AS SELECT table_schema AS object_schema, table_name AS object_name, table_type AS object_type FROM information_schema.tables ORDER BY object_schema;
diff --git a/mysql-test/main/join_cache.result b/mysql-test/main/join_cache.result
index e93ae5055c8..3ab6c1cf310 100644
--- a/mysql-test/main/join_cache.result
+++ b/mysql-test/main/join_cache.result
@@ -853,7 +853,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country hash_ALL PRIMARY #hash#PRIMARY 3 world.City.Country 239 Using where; Using join buffer (flat, BNLH join)
-1 SIMPLE CountryLanguage hash_ALL PRIMARY,Percentage #hash#PRIMARY 3 world.City.Country 984 Using where; Using join buffer (flat, BNLH join)
+1 SIMPLE CountryLanguage hash_ALL|filter PRIMARY,Percentage #hash#PRIMARY|Percentage 3|4 world.City.Country 984 (19%) Using where; Using join buffer (flat, BNLH join); Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -1053,7 +1053,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country hash_ALL PRIMARY #hash#PRIMARY 3 world.City.Country 239 Using where; Using join buffer (flat, BNLH join)
-1 SIMPLE CountryLanguage hash_ALL PRIMARY,Percentage #hash#PRIMARY 3 world.City.Country 984 Using where; Using join buffer (incremental, BNLH join)
+1 SIMPLE CountryLanguage hash_ALL|filter PRIMARY,Percentage #hash#PRIMARY|Percentage 3|4 world.City.Country 984 (19%) Using where; Using join buffer (incremental, BNLH join); Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -1312,7 +1312,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country eq_ref PRIMARY PRIMARY 3 world.City.Country 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
-1 SIMPLE CountryLanguage ref PRIMARY,Percentage PRIMARY 3 world.City.Country 4 Using index condition(BKA); Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
+1 SIMPLE CountryLanguage ref|filter PRIMARY,Percentage PRIMARY|Percentage 3|4 world.City.Country 4 (19%) Using index condition(BKA); Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan; Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -1509,7 +1509,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country eq_ref PRIMARY PRIMARY 3 world.City.Country 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
-1 SIMPLE CountryLanguage ref PRIMARY,Percentage PRIMARY 3 world.City.Country 4 Using index condition(BKA); Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
+1 SIMPLE CountryLanguage ref|filter PRIMARY,Percentage PRIMARY|Percentage 3|4 world.City.Country 4 (19%) Using index condition(BKA); Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan; Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -1706,7 +1706,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country eq_ref PRIMARY PRIMARY 3 world.City.Country 1 Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
-1 SIMPLE CountryLanguage ref PRIMARY,Percentage PRIMARY 3 world.City.Country 4 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
+1 SIMPLE CountryLanguage ref|filter PRIMARY,Percentage PRIMARY|Percentage 3|4 world.City.Country 4 (19%) Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan; Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -1903,7 +1903,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country eq_ref PRIMARY PRIMARY 3 world.City.Country 1 Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
-1 SIMPLE CountryLanguage ref PRIMARY,Percentage PRIMARY 3 world.City.Country 4 Using index condition(BKA); Using where; Using join buffer (incremental, BKAH join); Key-ordered Rowid-ordered scan
+1 SIMPLE CountryLanguage ref|filter PRIMARY,Percentage PRIMARY|Percentage 3|4 world.City.Country 4 (19%) Using index condition(BKA); Using where; Using join buffer (incremental, BKAH join); Key-ordered Rowid-ordered scan; Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -2104,7 +2104,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country hash_ALL PRIMARY #hash#PRIMARY 3 world.City.Country 239 Using where; Using join buffer (flat, BNLH join)
-1 SIMPLE CountryLanguage hash_ALL PRIMARY,Percentage #hash#PRIMARY 3 world.City.Country 984 Using where; Using join buffer (flat, BNLH join)
+1 SIMPLE CountryLanguage hash_ALL|filter PRIMARY,Percentage #hash#PRIMARY|Percentage 3|4 world.City.Country 984 (19%) Using where; Using join buffer (flat, BNLH join); Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -2208,7 +2208,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country hash_ALL PRIMARY #hash#PRIMARY 3 world.City.Country 239 Using where; Using join buffer (flat, BNLH join)
-1 SIMPLE CountryLanguage hash_ALL PRIMARY,Percentage #hash#PRIMARY 3 world.City.Country 984 Using where; Using join buffer (incremental, BNLH join)
+1 SIMPLE CountryLanguage hash_ALL|filter PRIMARY,Percentage #hash#PRIMARY|Percentage 3|4 world.City.Country 984 (19%) Using where; Using join buffer (incremental, BNLH join); Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -2312,7 +2312,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country eq_ref PRIMARY PRIMARY 3 world.City.Country 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
-1 SIMPLE CountryLanguage ref PRIMARY,Percentage PRIMARY 3 world.City.Country 4 Using index condition(BKA); Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
+1 SIMPLE CountryLanguage ref|filter PRIMARY,Percentage PRIMARY|Percentage 3|4 world.City.Country 4 (19%) Using index condition(BKA); Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan; Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -2416,7 +2416,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country eq_ref PRIMARY PRIMARY 3 world.City.Country 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
-1 SIMPLE CountryLanguage ref PRIMARY,Percentage PRIMARY 3 world.City.Country 4 Using index condition(BKA); Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
+1 SIMPLE CountryLanguage ref|filter PRIMARY,Percentage PRIMARY|Percentage 3|4 world.City.Country 4 (19%) Using index condition(BKA); Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan; Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -2520,7 +2520,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country eq_ref PRIMARY PRIMARY 3 world.City.Country 1 Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
-1 SIMPLE CountryLanguage ref PRIMARY,Percentage PRIMARY 3 world.City.Country 4 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
+1 SIMPLE CountryLanguage ref|filter PRIMARY,Percentage PRIMARY|Percentage 3|4 world.City.Country 4 (19%) Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan; Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
@@ -2624,7 +2624,7 @@ LENGTH(Language) < LENGTH(City.Name) - 2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE City ALL Country NULL NULL NULL 4079 Using where
1 SIMPLE Country eq_ref PRIMARY PRIMARY 3 world.City.Country 1 Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
-1 SIMPLE CountryLanguage ref PRIMARY,Percentage PRIMARY 3 world.City.Country 4 Using index condition(BKA); Using where; Using join buffer (incremental, BKAH join); Key-ordered Rowid-ordered scan
+1 SIMPLE CountryLanguage ref|filter PRIMARY,Percentage PRIMARY|Percentage 3|4 world.City.Country 4 (19%) Using index condition(BKA); Using where; Using join buffer (incremental, BKAH join); Key-ordered Rowid-ordered scan; Using rowid filter
SELECT City.Name, Country.Name, CountryLanguage.Language
FROM City,Country,CountryLanguage
WHERE City.Country=Country.Code AND
diff --git a/mysql-test/main/log_slow.result b/mysql-test/main/log_slow.result
index 31d52ff0323..6b9fddb7fb6 100644
--- a/mysql-test/main/log_slow.result
+++ b/mysql-test/main/log_slow.result
@@ -64,7 +64,7 @@ rows_affected int(11) NO NULL
flush slow logs;
set long_query_time=0.1;
set log_slow_filter='';
-set global slow_query_log=1;
+set slow_query_log=1;
set global log_output='TABLE';
select sleep(0.5);
sleep(0.5)
@@ -73,7 +73,7 @@ select count(*) FROM mysql.slow_log;
count(*)
1
set @@long_query_time=default;
-set global slow_query_log= @org_slow_query_log;
+set @@slow_query_log=default;
set @@log_slow_filter=default;
set @@log_slow_verbosity=default;
set global log_output= default;
@@ -115,3 +115,21 @@ Slow_queries_increment
SET log_slow_filter=DEFAULT;
SET @@long_query_time=default;
SET GLOBAL slow_query_log= @org_slow_query_log;
+#
+# MDEV-21187: log_slow_filter="" logs queries not using indexes
+#
+flush status;
+create table t (id int);
+insert into t values (1),(4);
+set log_slow_filter='';
+select * from t;
+id
+1
+4
+show session status like 'Slow_queries';
+Variable_name Value
+Slow_queries 0
+drop table t;
+#
+# End of 10.3 tests
+#
diff --git a/mysql-test/main/log_slow.test b/mysql-test/main/log_slow.test
index b51777d859e..d2e314cf667 100644
--- a/mysql-test/main/log_slow.test
+++ b/mysql-test/main/log_slow.test
@@ -50,14 +50,14 @@ flush slow logs;
# MDEV-4206 (empty filter should be no filter)
set long_query_time=0.1;
set log_slow_filter='';
-set global slow_query_log=1;
+set slow_query_log=1;
set global log_output='TABLE';
select sleep(0.5);
select count(*) FROM mysql.slow_log;
# Reset used variables
set @@long_query_time=default;
-set global slow_query_log= @org_slow_query_log;
+set @@slow_query_log=default;
set @@log_slow_filter=default;
set @@log_slow_verbosity=default;
set global log_output= default;
@@ -102,3 +102,20 @@ SET log_slow_filter=DEFAULT;
SET @@long_query_time=default;
SET GLOBAL slow_query_log= @org_slow_query_log;
+
+--echo #
+--echo # MDEV-21187: log_slow_filter="" logs queries not using indexes
+--echo #
+
+flush status;
+create table t (id int);
+insert into t values (1),(4);
+set log_slow_filter='';
+select * from t;
+show session status like 'Slow_queries';
+
+drop table t;
+
+--echo #
+--echo # End of 10.3 tests
+--echo #
diff --git a/mysql-test/main/mysqldump.result b/mysql-test/main/mysqldump.result
index b9cdfba9a09..0a84b89b687 100644
--- a/mysql-test/main/mysqldump.result
+++ b/mysql-test/main/mysqldump.result
@@ -4590,6 +4590,7 @@ Db Name Definer Time zone Type Execute at Interval value Interval field Starts E
# MDEV-13336: add ignore-database option
# with --all-databases
#
+SET GLOBAL innodb_max_purge_lag_wait=0;
DROP DATABASE test;
SHOW DATABASES LIKE 'test';
Database (test)
diff --git a/mysql-test/main/mysqldump.test b/mysql-test/main/mysqldump.test
index e8d5c6b2a95..7dc3cfe8558 100644
--- a/mysql-test/main/mysqldump.test
+++ b/mysql-test/main/mysqldump.test
@@ -1924,6 +1924,8 @@ SHOW EVENTS;
--echo # with --all-databases
--echo #
--exec $MYSQL_DUMP --default-character-set=utf8mb4 --ignore-database test --all-databases > $MYSQLTEST_VARDIR/tmp/mysqldump-MDEV-13336.sql
+# Starting with MariaDB 10.6, ensure that DDL recovery will have completed.
+SET GLOBAL innodb_max_purge_lag_wait=0;
DROP DATABASE test;
--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/mysqldump-MDEV-13336.sql
SHOW DATABASES LIKE 'test';
diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result
index 6d026bf7502..3ac9ad0f498 100644
--- a/mysql-test/main/opt_trace.result
+++ b/mysql-test/main/opt_trace.result
@@ -1020,6 +1020,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b {
"index": "a",
"used_range_estimates": false,
"cause": "not available",
+ "rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 200.0585794,
"chosen": true
@@ -1076,6 +1077,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b {
"index": "a",
"used_range_estimates": false,
"cause": "not available",
+ "rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 200.0585794,
"chosen": true
@@ -2103,6 +2105,7 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
"access_type": "ref",
"index": "a_c",
"used_range_estimates": true,
+ "rowid_filter_skipped": "worst/max seeks clipping",
"rows": 180,
"cost": 180.2743776,
"chosen": true
@@ -4027,6 +4030,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 {
"index": "a",
"used_range_estimates": false,
"cause": "not better than ref estimates",
+ "rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 3.001757383,
"chosen": true
@@ -4083,6 +4087,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 {
"rec_per_key_stats_missing": true,
"used_range_estimates": false,
"cause": "not better than ref estimates",
+ "rowid_filter_skipped": "worst/max seeks clipping",
"rows": 2,
"cost": 3.003514767,
"chosen": true
@@ -8187,6 +8192,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"index": "b",
"used_range_estimates": false,
"cause": "not available",
+ "rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 20.00585794,
"chosen": true
@@ -8411,6 +8417,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"index": "a",
"used_range_estimates": false,
"cause": "not available",
+ "rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 20.00585794,
"chosen": true
@@ -8486,6 +8493,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"index": "a",
"used_range_estimates": false,
"cause": "not available",
+ "rowid_filter_skipped": "cost_factor <= 0",
"rows": 1,
"cost": 200.0585794,
"chosen": true
diff --git a/mysql-test/main/parser.result b/mysql-test/main/parser.result
index a74f012d7ef..50be9dc49c8 100644
--- a/mysql-test/main/parser.result
+++ b/mysql-test/main/parser.result
@@ -1907,8 +1907,19 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
EXECUTE IMMEDIATE 'CREATE PROCEDURE p() UPDATE t SET c=\'\'"abc';
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"abc' at line 1
SET @@sql_mode=@save_sql_mode;
+#
+# MDEV-30151 parse error 1=2 not between/in
+#
+select 1=2 not in (3,4);
+1=2 not in (3,4)
+1
+select 1=2 not between 3 and 4;
+1=2 not between 3 and 4
+1
+#
# End of 10.3 tests
#
+#
# MDEV-19540: 10.4 allow lock options with SELECT in brackets
# which previous version do not
#
diff --git a/mysql-test/main/parser.test b/mysql-test/main/parser.test
index 523ccac8003..48cda68b416 100644
--- a/mysql-test/main/parser.test
+++ b/mysql-test/main/parser.test
@@ -1684,7 +1684,15 @@ EXECUTE IMMEDIATE 'CREATE PROCEDURE p() UPDATE t SET c=\'\'"abc';
SET @@sql_mode=@save_sql_mode;
+--echo #
+--echo # MDEV-30151 parse error 1=2 not between/in
+--echo #
+select 1=2 not in (3,4);
+select 1=2 not between 3 and 4;
+
+--echo #
--echo # End of 10.3 tests
+--echo #
--echo #
--echo # MDEV-19540: 10.4 allow lock options with SELECT in brackets
diff --git a/mysql-test/main/rowid_filter.result b/mysql-test/main/rowid_filter.result
index f7a340b57c5..209dfc44d7b 100644
--- a/mysql-test/main/rowid_filter.result
+++ b/mysql-test/main/rowid_filter.result
@@ -338,7 +338,7 @@ WHERE l_shipdate BETWEEN '1997-01-01' AND '1997-01-31' AND
o_totalprice between 200000 and 230000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE lineitem range PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 4 NULL 98 Using index condition
-1 SIMPLE orders eq_ref|filter PRIMARY,i_o_totalprice PRIMARY|i_o_totalprice 4|9 dbt3_s001.lineitem.l_orderkey 1 (5%) Using where; Using rowid filter
+1 SIMPLE orders eq_ref PRIMARY,i_o_totalprice PRIMARY 4 dbt3_s001.lineitem.l_orderkey 1 Using where
set statement optimizer_switch='rowid_filter=on' for EXPLAIN FORMAT=JSON SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
FROM orders JOIN lineitem ON o_orderkey=l_orderkey
WHERE l_shipdate BETWEEN '1997-01-01' AND '1997-01-31' AND
@@ -371,14 +371,6 @@ EXPLAIN
"key_length": "4",
"used_key_parts": ["o_orderkey"],
"ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_o_totalprice",
- "used_key_parts": ["o_totalprice"]
- },
- "rows": 69,
- "selectivity_pct": 4.6
- },
"rows": 1,
"filtered": 4.599999905,
"attached_condition": "orders.o_totalprice between 200000 and 230000"
@@ -391,7 +383,7 @@ WHERE l_shipdate BETWEEN '1997-01-01' AND '1997-01-31' AND
o_totalprice between 200000 and 230000;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
1 SIMPLE lineitem range PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 4 NULL 98 98.00 100.00 100.00 Using index condition
-1 SIMPLE orders eq_ref|filter PRIMARY,i_o_totalprice PRIMARY|i_o_totalprice 4|9 dbt3_s001.lineitem.l_orderkey 1 (5%) 0.11 (10%) 4.60 100.00 Using where; Using rowid filter
+1 SIMPLE orders eq_ref PRIMARY,i_o_totalprice PRIMARY 4 dbt3_s001.lineitem.l_orderkey 1 1.00 4.60 11.22 Using where
set statement optimizer_switch='rowid_filter=on' for ANALYZE FORMAT=JSON SELECT o_orderkey, l_linenumber, l_shipdate, o_totalprice
FROM orders JOIN lineitem ON o_orderkey=l_orderkey
WHERE l_shipdate BETWEEN '1997-01-01' AND '1997-01-31' AND
@@ -431,26 +423,13 @@ ANALYZE
"key_length": "4",
"used_key_parts": ["o_orderkey"],
"ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_o_totalprice",
- "used_key_parts": ["o_totalprice"]
- },
- "rows": 69,
- "selectivity_pct": 4.6,
- "r_rows": 71,
- "r_lookups": 96,
- "r_selectivity_pct": 10.41666667,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
"r_loops": 98,
"rows": 1,
- "r_rows": 0.112244898,
+ "r_rows": 1,
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"filtered": 4.599999905,
- "r_filtered": 100,
+ "r_filtered": 11.2244898,
"attached_condition": "orders.o_totalprice between 200000 and 230000"
}
}
@@ -596,7 +575,7 @@ l_quantity > 45 AND
o_totalprice between 180000 and 230000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE lineitem range|filter PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity,i_l_quantity i_l_shipdate|i_l_quantity 4|9 NULL 509 (12%) Using index condition; Using where; Using rowid filter
-1 SIMPLE orders eq_ref|filter PRIMARY,i_o_totalprice PRIMARY|i_o_totalprice 4|9 dbt3_s001.lineitem.l_orderkey 1 (9%) Using where; Using rowid filter
+1 SIMPLE orders eq_ref PRIMARY,i_o_totalprice PRIMARY 4 dbt3_s001.lineitem.l_orderkey 1 Using where
set statement optimizer_switch='rowid_filter=on' for EXPLAIN FORMAT=JSON SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
FROM orders JOIN lineitem ON o_orderkey=l_orderkey
WHERE l_shipdate BETWEEN '1997-01-01' AND '1997-06-30' AND
@@ -640,14 +619,6 @@ EXPLAIN
"key_length": "4",
"used_key_parts": ["o_orderkey"],
"ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_o_totalprice",
- "used_key_parts": ["o_totalprice"]
- },
- "rows": 139,
- "selectivity_pct": 9.266666667
- },
"rows": 1,
"filtered": 9.266666412,
"attached_condition": "orders.o_totalprice between 180000 and 230000"
@@ -661,7 +632,7 @@ l_quantity > 45 AND
o_totalprice between 180000 and 230000;
id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra
1 SIMPLE lineitem range|filter PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity,i_l_quantity i_l_shipdate|i_l_quantity 4|9 NULL 509 (12%) 60.00 (11%) 11.69 100.00 Using index condition; Using where; Using rowid filter
-1 SIMPLE orders eq_ref|filter PRIMARY,i_o_totalprice PRIMARY|i_o_totalprice 4|9 dbt3_s001.lineitem.l_orderkey 1 (9%) 0.27 (25%) 9.27 100.00 Using where; Using rowid filter
+1 SIMPLE orders eq_ref PRIMARY,i_o_totalprice PRIMARY 4 dbt3_s001.lineitem.l_orderkey 1 1.00 9.27 26.67 Using where
set statement optimizer_switch='rowid_filter=on' for ANALYZE FORMAT=JSON SELECT o_orderkey, l_linenumber, l_shipdate, l_quantity, o_totalprice
FROM orders JOIN lineitem ON o_orderkey=l_orderkey
WHERE l_shipdate BETWEEN '1997-01-01' AND '1997-06-30' AND
@@ -717,26 +688,13 @@ ANALYZE
"key_length": "4",
"used_key_parts": ["o_orderkey"],
"ref": ["dbt3_s001.lineitem.l_orderkey"],
- "rowid_filter": {
- "range": {
- "key": "i_o_totalprice",
- "used_key_parts": ["o_totalprice"]
- },
- "rows": 139,
- "selectivity_pct": 9.266666667,
- "r_rows": 144,
- "r_lookups": 59,
- "r_selectivity_pct": 25.42372881,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
"r_loops": 60,
"rows": 1,
- "r_rows": 0.266666667,
+ "r_rows": 1,
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"filtered": 9.266666412,
- "r_filtered": 100,
+ "r_filtered": 26.66666667,
"attached_condition": "orders.o_totalprice between 180000 and 230000"
}
}
@@ -2098,7 +2056,7 @@ EXPLAIN EXTENDED SELECT * FROM t1 INNER JOIN t2 ON ( pk1+1 = pk2+2 AND a1 = a2 )
WHERE b1 <= ( SELECT MAX(b2) FROM t2 WHERE pk2 <= 1 );
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t2 ALL NULL NULL NULL NULL 101 100.00 Using where
-1 PRIMARY t1 ref|filter a1,b1 a1|b1 5|4 test.t2.a2 36 (29%) 28.75 Using where; Using rowid filter
+1 PRIMARY t1 ref a1,b1 a1 5 test.t2.a2 36 28.75 Using where
2 SUBQUERY t2 range PRIMARY PRIMARY 4 NULL 1 100.00 Using index condition
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`pk1` AS `pk1`,`test`.`t1`.`a1` AS `a1`,`test`.`t1`.`b1` AS `b1`,`test`.`t2`.`pk2` AS `pk2`,`test`.`t2`.`a2` AS `a2`,`test`.`t2`.`b2` AS `b2` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a1` = `test`.`t2`.`a2` and `test`.`t1`.`b1` <= (/* select#2 */ select max(`test`.`t2`.`b2`) from `test`.`t2` where `test`.`t2`.`pk2` <= 1) and `test`.`t1`.`pk1` + 1 = `test`.`t2`.`pk2` + 2
@@ -2123,14 +2081,6 @@ EXPLAIN
"key_length": "5",
"used_key_parts": ["a1"],
"ref": ["test.t2.a2"],
- "rowid_filter": {
- "range": {
- "key": "b1",
- "used_key_parts": ["b1"]
- },
- "rows": 115,
- "selectivity_pct": 28.75
- },
"rows": 36,
"filtered": 28.75,
"attached_condition": "t1.b1 <= (subquery#2) and t1.pk1 + 1 = t2.pk2 + 2"
diff --git a/mysql-test/main/rowid_filter_innodb.result b/mysql-test/main/rowid_filter_innodb.result
index 936c688585c..3e673afbc99 100644
--- a/mysql-test/main/rowid_filter_innodb.result
+++ b/mysql-test/main/rowid_filter_innodb.result
@@ -2046,7 +2046,7 @@ EXPLAIN EXTENDED SELECT * FROM t1 INNER JOIN t2 ON ( pk1+1 = pk2+2 AND a1 = a2 )
WHERE b1 <= ( SELECT MAX(b2) FROM t2 WHERE pk2 <= 1 );
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t2 ALL NULL NULL NULL NULL 101 100.00 Using where
-1 PRIMARY t1 ref|filter a1,b1 a1|b1 5|4 test.t2.a2 36 (29%) 28.75 Using where; Using rowid filter
+1 PRIMARY t1 ref a1,b1 a1 5 test.t2.a2 36 28.75 Using where
2 SUBQUERY t2 range PRIMARY PRIMARY 4 NULL 1 100.00 Using index condition
Warnings:
Note 1003 /* select#1 */ select `test`.`t1`.`pk1` AS `pk1`,`test`.`t1`.`a1` AS `a1`,`test`.`t1`.`b1` AS `b1`,`test`.`t2`.`pk2` AS `pk2`,`test`.`t2`.`a2` AS `a2`,`test`.`t2`.`b2` AS `b2` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a1` = `test`.`t2`.`a2` and `test`.`t1`.`b1` <= (/* select#2 */ select max(`test`.`t2`.`b2`) from `test`.`t2` where `test`.`t2`.`pk2` <= 1) and `test`.`t1`.`pk1` + 1 = `test`.`t2`.`pk2` + 2
@@ -2071,14 +2071,6 @@ EXPLAIN
"key_length": "5",
"used_key_parts": ["a1"],
"ref": ["test.t2.a2"],
- "rowid_filter": {
- "range": {
- "key": "b1",
- "used_key_parts": ["b1"]
- },
- "rows": 115,
- "selectivity_pct": 28.75
- },
"rows": 36,
"filtered": 28.75,
"attached_condition": "t1.b1 <= (subquery#2) and t1.pk1 + 1 = t2.pk2 + 2"
@@ -2720,7 +2712,7 @@ id y x
explain extended select * from t1 join t2 on t1.id = t2.x where t2.y = 2 and t1.id = 1;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 100.00 Using index
-1 SIMPLE t2 ref x,y y 5 const 2 100.00 Using where
+1 SIMPLE t2 index_merge x,y y,x 5,5 NULL 1 100.00 Using intersect(y,x); Using where; Using index
Warnings:
Note 1003 select 1 AS `id`,`test`.`t2`.`y` AS `y`,`test`.`t2`.`x` AS `x` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`y` = 2 and `test`.`t2`.`x` = 1
drop table t1, t2;
@@ -2757,7 +2749,7 @@ count(*)
5
explain extended select count(*) from t1 where a between 21 and 30 and b=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ref|filter b,a b|a 5|5 const 24 (10%) 9.60 Using where; Using rowid filter
+1 SIMPLE t1 ref b,a b 5 const 24 9.60 Using where
Warnings:
Note 1003 select count(0) AS `count(*)` from `test`.`t1` where `test`.`t1`.`b` = 2 and `test`.`t1`.`a` between 21 and 30
select * from t1 where a between 21 and 30 and b=2;
@@ -3468,7 +3460,7 @@ fi.fh in (6311439873746261694,-397087483897438286,
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t index_merge PRIMARY,acli_rid,acli_tp acli_tp,acli_rid 2,767 NULL 2 100.00 Using intersect(acli_tp,acli_rid); Using where; Using index
1 SIMPLE a ref PRIMARY,acei_aclid acei_aclid 8 test.t.id 1 100.00 Using where
-1 SIMPLE fi ref|filter filt_aceid,filt_fh filt_aceid|filt_fh 8|8 test.a.id 24 (14%) 14.46 Using where; Using rowid filter
+1 SIMPLE fi ref filt_aceid,filt_fh filt_aceid 8 test.a.id 24 14.46 Using where
Warnings:
Note 1003 select `test`.`t`.`id` AS `id`,`test`.`fi`.`id` AS `id`,`test`.`fi`.`aceid` AS `aceid`,`test`.`fi`.`clid` AS `clid`,`test`.`fi`.`fh` AS `fh` from `test`.`acli` `t` join `test`.`acei` `a` join `test`.`filt` `fi` where `test`.`t`.`tp` = 121 and `test`.`a`.`atp` = 1 and `test`.`fi`.`aceid` = `test`.`a`.`id` and `test`.`a`.`aclid` = `test`.`t`.`id` and `test`.`t`.`rid` = 'B5FCC8C7111E4E3CBC21AAF5012F59C2' and `test`.`fi`.`fh` in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)
set statement optimizer_switch='rowid_filter=on' for select t.id, fi.*
@@ -3584,7 +3576,7 @@ fi.fh in (6311439873746261694,-397087483897438286,
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t index_merge PRIMARY,acli_rid,acli_tp acli_tp,acli_rid 2,767 NULL 2 100.00 Using intersect(acli_tp,acli_rid); Using where; Using index
1 SIMPLE a ref PRIMARY,acei_aclid acei_aclid 8 test.t.id 1 100.00 Using where; Using join buffer (flat, BKA join); Rowid-ordered scan
-1 SIMPLE fi ref|filter filt_aceid,filt_fh filt_aceid|filt_fh 8|8 test.a.id 24 (14%) 14.46 Using where; Using join buffer (incremental, BKA join); Rowid-ordered scan; Using rowid filter
+1 SIMPLE fi ref filt_aceid,filt_fh filt_aceid 8 test.a.id 24 14.46 Using where; Using join buffer (incremental, BKA join); Rowid-ordered scan
Warnings:
Note 1003 select `test`.`t`.`id` AS `id`,`test`.`fi`.`id` AS `id`,`test`.`fi`.`aceid` AS `aceid`,`test`.`fi`.`clid` AS `clid`,`test`.`fi`.`fh` AS `fh` from `test`.`acli` `t` join `test`.`acei` `a` join `test`.`filt` `fi` where `test`.`t`.`tp` = 121 and `test`.`a`.`atp` = 1 and `test`.`fi`.`aceid` = `test`.`a`.`id` and `test`.`a`.`aclid` = `test`.`t`.`id` and `test`.`t`.`rid` = 'B5FCC8C7111E4E3CBC21AAF5012F59C2' and `test`.`fi`.`fh` in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)
set statement optimizer_switch='rowid_filter=on' for select t.id, fi.*
@@ -3704,22 +3696,9 @@ ANALYZE
"key_length": "8",
"used_key_parts": ["aceid"],
"ref": ["test.a.id"],
- "rowid_filter": {
- "range": {
- "key": "filt_fh",
- "used_key_parts": ["fh"]
- },
- "rows": 81,
- "selectivity_pct": 14.46428571,
- "r_rows": 80,
- "r_lookups": 80,
- "r_selectivity_pct": 40,
- "r_buffer_size": "REPLACED",
- "r_filling_time_ms": "REPLACED"
- },
"r_loops": 1,
"rows": 24,
- "r_rows": 32,
+ "r_rows": 80,
"r_table_time_ms": "REPLACED",
"r_other_time_ms": "REPLACED",
"filtered": 14.46428585,
@@ -3730,7 +3709,7 @@ ANALYZE
"join_type": "BKA",
"mrr_type": "Rowid-ordered scan",
"attached_condition": "fi.fh in (6311439873746261694,-397087483897438286,8518228073041491534,-5420422472375069774)",
- "r_filtered": 100
+ "r_filtered": 40
}
}
}
@@ -3836,7 +3815,7 @@ WHERE t1.c1 NOT IN (SELECT t2.c1 FROM t2, t1 AS a1
WHERE t2.i1 = t1.pk AND t2.i1 BETWEEN 3 AND 5);
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 60 100.00 Using where
-2 DEPENDENT SUBQUERY t2 ref|filter c1,i1 c1|i1 3|5 func 38 (25%) 25.00 Using where; Full scan on NULL key; Using rowid filter
+2 DEPENDENT SUBQUERY t2 ref c1,i1 i1 5 test.t1.pk 20 100.00 Using index condition; Using where
2 DEPENDENT SUBQUERY a1 ALL NULL NULL NULL NULL 60 100.00 Using join buffer (flat, BNL join)
Warnings:
Note 1276 Field or reference 'test.t1.pk' of SELECT #2 was resolved in SELECT #1
diff --git a/mysql-test/main/rowid_filter_innodb_debug.result b/mysql-test/main/rowid_filter_innodb_debug.result
index 5a3fa374bd1..f82b29aa1e6 100644
--- a/mysql-test/main/rowid_filter_innodb_debug.result
+++ b/mysql-test/main/rowid_filter_innodb_debug.result
@@ -48,29 +48,3 @@ ERROR 70100: Query execution was interrupted
set debug_sync='RESET';
drop table t2,t3;
set default_storage_engine=default;
-set @save_optimizer_switch= @@optimizer_switch;
-set @save_use_stat_tables= @@use_stat_tables;
-set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
-set @@use_stat_tables=preferably;
-set optimizer_use_condition_selectivity=2;
-set optimizer_switch='rowid_filter=on';
-#
-# MDEV-22761 KILL QUERY during rowid_filter, crashes
-# (The smaller testcase)
-#
-CREATE TABLE t1 (a INT, b INT, INDEX(a), INDEX(b)) ENGINE=InnoDB;
-INSERT INTO t1 VALUES (0,0),(1,0),(-1,1), (-2,1), (-2,3), (-3,4), (-2,4);
-set debug_sync='handler_rowid_filter_check SIGNAL killme WAIT_FOR go';
-SELECT * FROM t1 WHERE a > 0 AND b=0;
-connect con1, localhost, root,,;
-set debug_sync='now WAIT_FOR killme';
-kill query @id;
-set debug_sync='now SIGNAL go';
-connection default;
-ERROR 70100: Query execution was interrupted
-set debug_sync='RESET';
-disconnect con1;
-drop table t1;
-set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
-set @@optimizer_switch=@save_optimizer_switch;
-set @@use_stat_tables=@save_use_stat_tables;
diff --git a/mysql-test/main/rowid_filter_innodb_debug.test b/mysql-test/main/rowid_filter_innodb_debug.test
index f89a2a82da8..60381658eaf 100644
--- a/mysql-test/main/rowid_filter_innodb_debug.test
+++ b/mysql-test/main/rowid_filter_innodb_debug.test
@@ -5,47 +5,3 @@ set default_storage_engine=innodb;
--source include/rowid_filter_debug_kill.inc
set default_storage_engine=default;
---source include/default_optimizer_switch.inc
---source include/count_sessions.inc
-
-set @save_optimizer_switch= @@optimizer_switch;
-set @save_use_stat_tables= @@use_stat_tables;
-set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
-
-set @@use_stat_tables=preferably;
-
-set optimizer_use_condition_selectivity=2;
-set optimizer_switch='rowid_filter=on';
-
---echo #
---echo # MDEV-22761 KILL QUERY during rowid_filter, crashes
---echo # (The smaller testcase)
---echo #
-
-CREATE TABLE t1 (a INT, b INT, INDEX(a), INDEX(b)) ENGINE=InnoDB;
-INSERT INTO t1 VALUES (0,0),(1,0),(-1,1), (-2,1), (-2,3), (-3,4), (-2,4);
-
-let $ID= `SELECT @id := CONNECTION_ID()`;
-
-set debug_sync='handler_rowid_filter_check SIGNAL killme WAIT_FOR go';
-send SELECT * FROM t1 WHERE a > 0 AND b=0;
-
-connect (con1, localhost, root,,);
-let $ignore= `SELECT @id := $ID`;
-set debug_sync='now WAIT_FOR killme';
-kill query @id;
-set debug_sync='now SIGNAL go';
-
-connection default;
---error ER_QUERY_INTERRUPTED
-reap;
-set debug_sync='RESET';
-
-disconnect con1;
-drop table t1;
-
-set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
-set @@optimizer_switch=@save_optimizer_switch;
-set @@use_stat_tables=@save_use_stat_tables;
-
---source include/wait_until_count_sessions.inc
diff --git a/mysql-test/main/select.result b/mysql-test/main/select.result
index acf08e6a8e9..93687056c91 100644
--- a/mysql-test/main/select.result
+++ b/mysql-test/main/select.result
@@ -3616,7 +3616,7 @@ t3.a=t2.a AND t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si si 5 NULL 4 Using index condition; Using where
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
EXPLAIN
SELECT t3.a FROM t1,t2,t3
WHERE t1.id = 8 AND t2.i BETWEEN t1.b AND t1.e AND
@@ -3624,7 +3624,7 @@ t3.a=t2.a AND t3.c IN ('bb','ee') ;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si,ai si 5 NULL 4 Using index condition; Using where
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
EXPLAIN
SELECT t3.a FROM t1,t2 FORCE INDEX (si),t3
WHERE t1.id = 8 AND (t2.i=t1.b OR t2.i=t1.e) AND t3.a=t2.a AND
@@ -3632,7 +3632,7 @@ t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si si 5 NULL 2 Using index condition; Using where
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
EXPLAIN
SELECT t3.a FROM t1,t2,t3
WHERE t1.id = 8 AND (t2.i=t1.b OR t2.i=t1.e) AND t3.a=t2.a AND
@@ -3640,7 +3640,7 @@ t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si,ai si 5 NULL 2 Using index condition; Using where
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
DROP TABLE t1,t2,t3;
CREATE TABLE t1 ( f1 int primary key, f2 int, f3 int, f4 int, f5 int, f6 int, checked_out int);
CREATE TABLE t2 ( f11 int PRIMARY KEY );
diff --git a/mysql-test/main/select_jcl6.result b/mysql-test/main/select_jcl6.result
index 9259fa750cf..c1098e660cd 100644
--- a/mysql-test/main/select_jcl6.result
+++ b/mysql-test/main/select_jcl6.result
@@ -3627,7 +3627,7 @@ t3.a=t2.a AND t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si si 5 NULL 4 Using index condition; Using where; Rowid-ordered scan
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
EXPLAIN
SELECT t3.a FROM t1,t2,t3
WHERE t1.id = 8 AND t2.i BETWEEN t1.b AND t1.e AND
@@ -3635,7 +3635,7 @@ t3.a=t2.a AND t3.c IN ('bb','ee') ;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si,ai si 5 NULL 4 Using index condition; Using where; Rowid-ordered scan
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
EXPLAIN
SELECT t3.a FROM t1,t2 FORCE INDEX (si),t3
WHERE t1.id = 8 AND (t2.i=t1.b OR t2.i=t1.e) AND t3.a=t2.a AND
@@ -3643,7 +3643,7 @@ t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si si 5 NULL 2 Using index condition; Using where; Rowid-ordered scan
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
EXPLAIN
SELECT t3.a FROM t1,t2,t3
WHERE t1.id = 8 AND (t2.i=t1.b OR t2.i=t1.e) AND t3.a=t2.a AND
@@ -3651,7 +3651,7 @@ t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si,ai si 5 NULL 2 Using index condition; Using where; Rowid-ordered scan
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
DROP TABLE t1,t2,t3;
CREATE TABLE t1 ( f1 int primary key, f2 int, f3 int, f4 int, f5 int, f6 int, checked_out int);
CREATE TABLE t2 ( f11 int PRIMARY KEY );
diff --git a/mysql-test/main/select_pkeycache.result b/mysql-test/main/select_pkeycache.result
index acf08e6a8e9..93687056c91 100644
--- a/mysql-test/main/select_pkeycache.result
+++ b/mysql-test/main/select_pkeycache.result
@@ -3616,7 +3616,7 @@ t3.a=t2.a AND t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si si 5 NULL 4 Using index condition; Using where
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
EXPLAIN
SELECT t3.a FROM t1,t2,t3
WHERE t1.id = 8 AND t2.i BETWEEN t1.b AND t1.e AND
@@ -3624,7 +3624,7 @@ t3.a=t2.a AND t3.c IN ('bb','ee') ;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si,ai si 5 NULL 4 Using index condition; Using where
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
EXPLAIN
SELECT t3.a FROM t1,t2 FORCE INDEX (si),t3
WHERE t1.id = 8 AND (t2.i=t1.b OR t2.i=t1.e) AND t3.a=t2.a AND
@@ -3632,7 +3632,7 @@ t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si si 5 NULL 2 Using index condition; Using where
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
EXPLAIN
SELECT t3.a FROM t1,t2,t3
WHERE t1.id = 8 AND (t2.i=t1.b OR t2.i=t1.e) AND t3.a=t2.a AND
@@ -3640,7 +3640,7 @@ t3.c IN ('bb','ee');
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1
1 SIMPLE t2 range si,ai si 5 NULL 2 Using index condition; Using where
-1 SIMPLE t3 eq_ref|filter PRIMARY,ci PRIMARY|ci 4|5 test.t2.a 1 (30%) Using where; Using rowid filter
+1 SIMPLE t3 eq_ref PRIMARY,ci PRIMARY 4 test.t2.a 1 Using where
DROP TABLE t1,t2,t3;
CREATE TABLE t1 ( f1 int primary key, f2 int, f3 int, f4 int, f5 int, f6 int, checked_out int);
CREATE TABLE t2 ( f11 int PRIMARY KEY );
diff --git a/mysql-test/main/selectivity.result b/mysql-test/main/selectivity.result
index 749c74f431b..1143a4deb46 100644
--- a/mysql-test/main/selectivity.result
+++ b/mysql-test/main/selectivity.result
@@ -1661,7 +1661,7 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`
# gives selectivity data
explain extended select * from t1 where a in (17,51,5) and b=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ref|filter b,a b|a 5|5 const 24 (3%) 2.90 Using where; Using rowid filter
+1 SIMPLE t1 ref b,a b 5 const 24 2.90 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`b` = 2 and `test`.`t1`.`a` in (17,51,5)
drop table t1;
diff --git a/mysql-test/main/selectivity_innodb.result b/mysql-test/main/selectivity_innodb.result
index d0de50722a7..e909e85a2c8 100644
--- a/mysql-test/main/selectivity_innodb.result
+++ b/mysql-test/main/selectivity_innodb.result
@@ -1673,7 +1673,7 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`
# gives selectivity data
explain extended select * from t1 where a in (17,51,5) and b=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SIMPLE t1 ref|filter b,a b|a 5|5 const 24 (3%) 2.90 Using where; Using rowid filter
+1 SIMPLE t1 ref b,a b 5 const 24 2.90 Using where
Warnings:
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`b` = 2 and `test`.`t1`.`a` in (17,51,5)
drop table t1;
diff --git a/mysql-test/main/sp-security.result b/mysql-test/main/sp-security.result
index 8a1f46c7c35..5c62a95b34a 100644
--- a/mysql-test/main/sp-security.result
+++ b/mysql-test/main/sp-security.result
@@ -659,7 +659,9 @@ USE test;
DROP USER 'tester';
DROP USER 'Tester';
DROP DATABASE B48872;
-End of 5.0 tests.
+#
+# End of 5.0 tests.
+#
#
# Test for bug#57061 "User without privilege on routine can discover
# its existence."
@@ -804,7 +806,7 @@ DROP DATABASE u1;
DROP USER u1@localhost;
set @@global.character_set_server=@save_character_set_server;
#
-# Start of 10.5 tests
+# End of 10.2 tests
#
#
# MDEV-20366 Server crashes in get_current_user upon SET PASSWORD via SP
@@ -821,3 +823,17 @@ DROP USER foo@localhost;
#
# End of 10.5 tests
#
+#
+# MDEV-29852 SIGSEGV in mysql_create_routine or is_acl_user on 2nd execution, ASAN use-after-poison in get_current_user (sql_acl.cc)
+#
+set @cmd:="create definer=u function f(i int) returns char binary reads sql data return concat (1,i)";
+prepare s from @cmd;
+execute s;
+Warnings:
+Note 1449 The user specified as a definer ('u'@'%') does not exist
+execute s;
+ERROR 42000: FUNCTION f already exists
+drop function f;
+#
+# End of 10.6 tests
+#
diff --git a/mysql-test/main/sp-security.test b/mysql-test/main/sp-security.test
index e11e8911b60..13fdbd68a55 100644
--- a/mysql-test/main/sp-security.test
+++ b/mysql-test/main/sp-security.test
@@ -911,8 +911,9 @@ DROP USER 'tester';
DROP USER 'Tester';
DROP DATABASE B48872;
---echo End of 5.0 tests.
-
+--echo #
+--echo # End of 5.0 tests.
+--echo #
--echo #
--echo # Test for bug#57061 "User without privilege on routine can discover
@@ -1080,9 +1081,8 @@ DROP USER u1@localhost;
set @@global.character_set_server=@save_character_set_server;
-
--echo #
---echo # Start of 10.5 tests
+--echo # End of 10.2 tests
--echo #
--echo #
@@ -1102,7 +1102,20 @@ CALL p1();
DROP PROCEDURE p1;
DROP USER foo@localhost;
-
--echo #
--echo # End of 10.5 tests
--echo #
+
+--echo #
+--echo # MDEV-29852 SIGSEGV in mysql_create_routine or is_acl_user on 2nd execution, ASAN use-after-poison in get_current_user (sql_acl.cc)
+--echo #
+set @cmd:="create definer=u function f(i int) returns char binary reads sql data return concat (1,i)";
+prepare s from @cmd;
+execute s;
+--error ER_SP_ALREADY_EXISTS
+execute s;
+drop function f;
+
+--echo #
+--echo # End of 10.6 tests
+--echo #
diff --git a/mysql-test/main/stat_tables.result b/mysql-test/main/stat_tables.result
index 22f5bfafb8e..379e9737e1c 100644
--- a/mysql-test/main/stat_tables.result
+++ b/mysql-test/main/stat_tables.result
@@ -216,8 +216,8 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE part ALL PRIMARY NULL NULL NULL 200 Using where; Using join buffer (flat, BNL join)
1 SIMPLE lineitem ref PRIMARY,i_l_suppkey_partkey,i_l_partkey,i_l_suppkey,i_l_orderkey,i_l_orderkey_quantity i_l_partkey 5 dbt3_s001.part.p_partkey 30 Using where
1 SIMPLE supplier eq_ref PRIMARY,i_s_nationkey PRIMARY 4 dbt3_s001.lineitem.l_suppkey 1 Using where
-1 SIMPLE orders eq_ref|filter PRIMARY,i_o_orderdate,i_o_custkey PRIMARY|i_o_orderdate 4|4 dbt3_s001.lineitem.l_orderkey 1 (27%) Using where; Using rowid filter
1 SIMPLE n2 eq_ref PRIMARY PRIMARY 4 dbt3_s001.supplier.s_nationkey 1
+1 SIMPLE orders eq_ref PRIMARY,i_o_orderdate,i_o_custkey PRIMARY 4 dbt3_s001.lineitem.l_orderkey 1 Using where
1 SIMPLE customer eq_ref PRIMARY,i_c_nationkey PRIMARY 4 dbt3_s001.orders.o_custkey 1 Using where
1 SIMPLE n1 eq_ref PRIMARY,i_n_regionkey PRIMARY 4 dbt3_s001.customer.c_nationkey 1 Using where
select o_year,
diff --git a/mysql-test/main/subselect2.result b/mysql-test/main/subselect2.result
index e6363610301..7dc3c2f463c 100644
--- a/mysql-test/main/subselect2.result
+++ b/mysql-test/main/subselect2.result
@@ -132,7 +132,7 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t3 eq_ref PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX PRIMARY 34 test.t3.PARENTID 1 Using where
1 PRIMARY t3 eq_ref PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX PRIMARY 34 test.t3.PARENTID 1 Using where
1 PRIMARY t3 eq_ref PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX PRIMARY 34 test.t3.PARENTID 1 Using where
-1 PRIMARY t3 ref|filter PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX FFOLDERID_IDX|CMFLDRPARNT_IDX 34|35 test.t3.PARENTID 1 (29%) Using where; Using rowid filter
+1 PRIMARY t3 eq_ref PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX PRIMARY 34 test.t3.PARENTID 1 Using where
drop table t1, t2, t3, t4;
CREATE TABLE t1 (a int(10) , PRIMARY KEY (a)) Engine=InnoDB;
INSERT INTO t1 VALUES (1),(2);
diff --git a/mysql-test/main/view.result b/mysql-test/main/view.result
index b653a5099f7..aec4a5d09f2 100644
--- a/mysql-test/main/view.result
+++ b/mysql-test/main/view.result
@@ -6730,7 +6730,9 @@ DROP TABLE t1;
#
# MDEV-24314: create view with derived table without default database
#
-drop database test;
+create database dummy;
+use dummy;
+drop database dummy;
create database db1;
create table db1.t1 (a int);
insert into db1.t1 values (3),(7),(1);
@@ -6760,7 +6762,6 @@ a
drop view db1.v1;
drop table db1.t1;
drop database db1;
-create database test;
use test;
#
# MDEV-16940: update of multi-table view returning error used in SP
diff --git a/mysql-test/main/view.test b/mysql-test/main/view.test
index f684f072eb3..c6cc9a69f93 100644
--- a/mysql-test/main/view.test
+++ b/mysql-test/main/view.test
@@ -6437,7 +6437,9 @@ DROP TABLE t1;
--echo # MDEV-24314: create view with derived table without default database
--echo #
-drop database test;
+create database dummy;
+use dummy;
+drop database dummy;
create database db1;
create table db1.t1 (a int);
@@ -6460,7 +6462,6 @@ drop view db1.v1;
drop table db1.t1;
drop database db1;
-create database test;
use test;
--echo #
diff --git a/mysql-test/mariadb-test-run.pl b/mysql-test/mariadb-test-run.pl
index 27d62400fd5..46a51d2fa58 100755
--- a/mysql-test/mariadb-test-run.pl
+++ b/mysql-test/mariadb-test-run.pl
@@ -1832,7 +1832,7 @@ sub collect_mysqld_features_from_running_server ()
sub find_mysqld {
- my ($mysqld_basedir)= $ENV{MTR_BINDIR}|| @_;
+ my ($mysqld_basedir)= $ENV{MTR_BINDIR_FORCED} || $ENV{MTR_BINDIR} || @_;
my @mysqld_names= ("mariadbd", "mysqld", "mysqld-max-nt", "mysqld-max",
"mysqld-nt");
@@ -1843,7 +1843,7 @@ sub find_mysqld {
unshift(@mysqld_names, "mysqld-debug");
}
- return my_find_bin($bindir,
+ return my_find_bin($mysqld_basedir,
["sql", "libexec", "sbin", "bin"],
[@mysqld_names]);
}
@@ -4718,6 +4718,7 @@ sub check_expected_crash_and_restart {
mtr_verbose("Test says wait before restart") if $waits == 0;
next;
}
+ delete $ENV{MTR_BINDIR_FORCED};
# Ignore any partial or unknown command
next unless $last_line =~ /^restart/;
@@ -4725,7 +4726,13 @@ sub check_expected_crash_and_restart {
# extra command line options to add to the restarted mysqld.
# Anything other than 'wait' or 'restart:' (with a colon) will
# result in a restart with original mysqld options.
- if ($last_line =~ /restart:(.+)/) {
+ if ($last_line =~ /restart_bindir\s+(\S+)(:.+)?/) {
+ $ENV{MTR_BINDIR_FORCED}= $1;
+ if ($2) {
+ my @rest_opt= split(' ', $2);
+ $mysqld->{'restart_opts'}= \@rest_opt;
+ }
+ } elsif ($last_line =~ /restart:(.+)/) {
my @rest_opt= split(' ', $1);
$mysqld->{'restart_opts'}= \@rest_opt;
} else {
diff --git a/mysql-test/std_data/versioning/articles.frm.gz b/mysql-test/std_data/versioning/articles.frm.gz
new file mode 100644
index 00000000000..fd3a0a8c0d4
--- /dev/null
+++ b/mysql-test/std_data/versioning/articles.frm.gz
Binary files differ
diff --git a/mysql-test/std_data/versioning/articles2.frm.gz b/mysql-test/std_data/versioning/articles2.frm.gz
new file mode 100644
index 00000000000..70f20c2e081
--- /dev/null
+++ b/mysql-test/std_data/versioning/articles2.frm.gz
Binary files differ
diff --git a/mysql-test/std_data/versioning/ibdata1.gz b/mysql-test/std_data/versioning/ibdata1.gz
new file mode 100644
index 00000000000..345217ba593
--- /dev/null
+++ b/mysql-test/std_data/versioning/ibdata1.gz
Binary files differ
diff --git a/mysql-test/std_data/versioning/user_stopword.frm.gz b/mysql-test/std_data/versioning/user_stopword.frm.gz
new file mode 100644
index 00000000000..4a17265fabb
--- /dev/null
+++ b/mysql-test/std_data/versioning/user_stopword.frm.gz
Binary files differ
diff --git a/mysql-test/suite/funcs_2/r/innodb_charset.result b/mysql-test/suite/funcs_2/r/innodb_charset.result
index 3f4e2af12e5..399fc1d9fe7 100644
--- a/mysql-test/suite/funcs_2/r/innodb_charset.result
+++ b/mysql-test/suite/funcs_2/r/innodb_charset.result
@@ -1,3 +1,4 @@
+SET GLOBAL innodb_max_purge_lag_wait=0;
set @save_character_set_database= @@character_set_database;
DROP TABLE IF EXISTS test.t1;
SET NAMES armscii8;
diff --git a/mysql-test/suite/funcs_2/t/innodb_charset.test b/mysql-test/suite/funcs_2/t/innodb_charset.test
index da4dea44ad7..631c20352d4 100644
--- a/mysql-test/suite/funcs_2/t/innodb_charset.test
+++ b/mysql-test/suite/funcs_2/t/innodb_charset.test
@@ -9,6 +9,10 @@
--source include/no_valgrind_without_big.inc
--source include/have_innodb.inc
+# Starting with MariaDB 10.6, ensure that DDL recovery will have completed
+# before DROP DATABASE test.
+SET GLOBAL innodb_max_purge_lag_wait=0;
+
let $engine_type= InnoDB;
--source suite/funcs_2/charset/charset_master.test
diff --git a/mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_innodb.result b/mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_innodb.result
index b9fe877b0f2..6b7faa18da8 100644
--- a/mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_innodb.result
+++ b/mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_innodb.result
@@ -129,7 +129,7 @@ create table t1 (a int, b int generated always as (stddev_pop(a)) virtual);
ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
# STDDEV_SAMP()
create table t1 (a int, b int generated always as (stddev_samp(a)) virtual);
-ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
+ERROR HY000: Function or expression 'stddev_samp()' cannot be used in the GENERATED ALWAYS AS clause of `b`
# STDDEV()
create table t1 (a int, b int generated always as (stddev(a)) virtual);
ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
diff --git a/mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_myisam.result b/mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_myisam.result
index 23fdea42488..99921c658b3 100644
--- a/mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_myisam.result
+++ b/mysql-test/suite/gcol/r/gcol_blocked_sql_funcs_myisam.result
@@ -131,7 +131,7 @@ create table t1 (a int, b int generated always as (stddev_pop(a)) virtual);
ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
# STDDEV_SAMP()
create table t1 (a int, b int generated always as (stddev_samp(a)) virtual);
-ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
+ERROR HY000: Function or expression 'stddev_samp()' cannot be used in the GENERATED ALWAYS AS clause of `b`
# STDDEV()
create table t1 (a int, b int generated always as (stddev(a)) virtual);
ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
diff --git a/mysql-test/suite/innodb/r/cursor-restore-locking.result b/mysql-test/suite/innodb/r/cursor-restore-locking.result
index beeb5a87844..9a9e47fd7c2 100644
--- a/mysql-test/suite/innodb/r/cursor-restore-locking.result
+++ b/mysql-test/suite/innodb/r/cursor-restore-locking.result
@@ -11,6 +11,7 @@ SET DEBUG_SYNC = 'lock_wait_start SIGNAL first_ins_locked';
SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL first_ins_row_inserted WAIT_FOR first_ins_cont';
INSERT INTO t VALUES(10, 20);
connect con_del_2,localhost,root,,;
+SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET DEBUG_SYNC = 'now WAIT_FOR first_ins_locked';
SET DEBUG_SYNC = 'lock_wait_start SIGNAL second_del_locked';
DELETE FROM t WHERE b = 20;
diff --git a/mysql-test/suite/innodb/r/information_schema_grants.result b/mysql-test/suite/innodb/r/information_schema_grants.result
index feadb7b8d12..a468081db20 100644
--- a/mysql-test/suite/innodb/r/information_schema_grants.result
+++ b/mysql-test/suite/innodb/r/information_schema_grants.result
@@ -263,6 +263,7 @@ select count(*) > -1 from d_trx;
count(*) > -1
1
connection default;
+SET GLOBAL innodb_max_purge_lag_wait=0;
drop database test;
create database test;
drop user select_only@localhost;
diff --git a/mysql-test/suite/innodb/r/insert-before-delete.result b/mysql-test/suite/innodb/r/insert-before-delete.result
new file mode 100644
index 00000000000..f2d2d260294
--- /dev/null
+++ b/mysql-test/suite/innodb/r/insert-before-delete.result
@@ -0,0 +1,35 @@
+connect pause_purge,localhost,root;
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
+CREATE TABLE t (pk int PRIMARY KEY, sk INT UNIQUE) ENGINE=InnoDB;
+INSERT INTO t VALUES (10, 100);
+connect con1,localhost,root;
+BEGIN;
+SELECT * FROM t WHERE sk = 100 FOR UPDATE;
+pk sk
+10 100
+connect con2,localhost,root;
+SET DEBUG_SYNC="lock_wait_start SIGNAL insert_wait_started";
+INSERT INTO t VALUES (5, 100) # trx 1;
+connect con3,localhost,root;
+SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
+SET DEBUG_SYNC="now WAIT_FOR insert_wait_started";
+SET DEBUG_SYNC="lock_wait_start SIGNAL delete_started_waiting";
+DELETE FROM t WHERE sk = 100 # trx 2;
+connection con1;
+SET DEBUG_SYNC="now WAIT_FOR delete_started_waiting";
+DELETE FROM t WHERE sk=100;
+COMMIT;
+disconnect con1;
+connection con2;
+disconnect con2;
+connection con3;
+ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
+disconnect con3;
+connection default;
+SELECT * FROM t;
+pk sk
+5 100
+disconnect pause_purge;
+SET DEBUG_SYNC="RESET";
+DROP TABLE t;
diff --git a/mysql-test/suite/innodb/r/insert_into_empty.result b/mysql-test/suite/innodb/r/insert_into_empty.result
index ece55b7b07e..d1ba0878033 100644
--- a/mysql-test/suite/innodb/r/insert_into_empty.result
+++ b/mysql-test/suite/innodb/r/insert_into_empty.result
@@ -197,8 +197,6 @@ DROP TABLE t1;
#
# MDEV-27214 Import with disabled keys corrupts meta-data like rows, indexes, ...
#
-SET UNIQUE_CHECKS=0;
-SET FOREIGN_KEY_CHECKS=0;
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
diff --git a/mysql-test/suite/innodb/r/monitor.result b/mysql-test/suite/innodb/r/monitor.result
index caa4b33df6c..c874a84d26b 100644
--- a/mysql-test/suite/innodb/r/monitor.result
+++ b/mysql-test/suite/innodb/r/monitor.result
@@ -652,7 +652,7 @@ SET @end = (SELECT COUNT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME
= 'lock_rec_lock_created');
SELECT @end - @start;
@end - @start
-0
+1
# Records must not be S/X-locked if a table is X-locked.
SET @start = @end;
SET autocommit = 0;
diff --git a/mysql-test/suite/innodb/t/cursor-restore-locking.test b/mysql-test/suite/innodb/t/cursor-restore-locking.test
index a398768fc66..3514a7ed5cc 100644
--- a/mysql-test/suite/innodb/t/cursor-restore-locking.test
+++ b/mysql-test/suite/innodb/t/cursor-restore-locking.test
@@ -27,6 +27,10 @@ SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL first_ins_row_inserted WAIT_FOR fir
--send INSERT INTO t VALUES(10, 20)
--connect(con_del_2,localhost,root,,)
+# After MDEV-30225 is fixed, the following DELETE creates next-key lock for
+# unqique search for RR, and the above INSERT kills it as deadlock victim.
+# But it still requests not-gap lock for RC.
+SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET DEBUG_SYNC = 'now WAIT_FOR first_ins_locked';
SET DEBUG_SYNC = 'lock_wait_start SIGNAL second_del_locked';
###############################################################################
diff --git a/mysql-test/suite/innodb/t/information_schema_grants.test b/mysql-test/suite/innodb/t/information_schema_grants.test
index 8960db9aad9..d0b2d2db962 100644
--- a/mysql-test/suite/innodb/t/information_schema_grants.test
+++ b/mysql-test/suite/innodb/t/information_schema_grants.test
@@ -270,6 +270,8 @@ select count(*) > -1 from i_trx;
select count(*) > -1 from d_trx;
connection default;
+# Starting with MariaDB 10.6, ensure that DDL recovery will have completed.
+SET GLOBAL innodb_max_purge_lag_wait=0;
drop database test;
create database test;
drop user select_only@localhost;
diff --git a/mysql-test/suite/innodb/t/innodb-mdev7046.test b/mysql-test/suite/innodb/t/innodb-mdev7046.test
index a8c8b7da2db..cad348b1926 100644
--- a/mysql-test/suite/innodb/t/innodb-mdev7046.test
+++ b/mysql-test/suite/innodb/t/innodb-mdev7046.test
@@ -31,6 +31,8 @@ RENAME TABLE t1 TO `t2_new..............................................end`;
show warnings;
drop table t1;
+# Starting with MariaDB 10.6, ensure that DDL recovery will have completed.
+SET GLOBAL innodb_max_purge_lag_wait=0;
drop database test;
create database test;
use test;
diff --git a/mysql-test/suite/innodb/t/insert-before-delete.test b/mysql-test/suite/innodb/t/insert-before-delete.test
new file mode 100644
index 00000000000..2547b94e5ea
--- /dev/null
+++ b/mysql-test/suite/innodb/t/insert-before-delete.test
@@ -0,0 +1,72 @@
+--source include/have_innodb.inc
+--source include/have_debug.inc
+--source include/have_debug_sync.inc
+--source include/count_sessions.inc
+
+--connect (pause_purge,localhost,root)
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+
+--connection default
+CREATE TABLE t (pk int PRIMARY KEY, sk INT UNIQUE) ENGINE=InnoDB;
+INSERT INTO t VALUES (10, 100);
+
+--connect (con1,localhost,root)
+BEGIN; # trx 0
+SELECT * FROM t WHERE sk = 100 FOR UPDATE;
+
+--connect (con2,localhost,root)
+SET DEBUG_SYNC="lock_wait_start SIGNAL insert_wait_started";
+# trx 1 is locked on try to read the record in secondary index during duplicates
+# check. It's the first in waiting queue, that's why it will be woken up firstly
+# when trx 0 commits.
+--send INSERT INTO t VALUES (5, 100) # trx 1
+
+--connect (con3,localhost,root)
+# MDEV-30225 is fixed only for RR
+SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
+SET DEBUG_SYNC="now WAIT_FOR insert_wait_started";
+SET DEBUG_SYNC="lock_wait_start SIGNAL delete_started_waiting";
+# trx 2 can delete (5, 100) on master, but not on slave, as on slave trx 1
+# can insert (5, 100) after trx 2 positioned it's cursor. Trx 2 lock is placed
+# in waiting queue after trx 1 lock, but its persistent cursor position was
+# stored on (100, 10) record in secondary index before suspending. After trx 1
+# is committed, trx 2 will restore persistent cursor position on (100, 10). As
+# (100, 5) secondary index record was inserted before (100, 10) in logical
+# order, and (100, 10) record is delete-marked, trx 2 just continues scanning.
+#
+# Note. There can be several records with the same key in unique secondary
+# index, but only one of them must be non-delete-marked. That's why when we do
+# point query, cursor position is set in the first record in logical order, and
+# then records are iterated until either non-delete-marked record is found or
+# all records with the same unique fields are iterated.
+--send DELETE FROM t WHERE sk = 100 # trx 2
+
+--connection con1
+SET DEBUG_SYNC="now WAIT_FOR delete_started_waiting";
+DELETE FROM t WHERE sk=100; # trx 0
+COMMIT;
+--disconnect con1
+
+--connection con2
+--reap
+--disconnect con2
+
+--connection con3
+# If the bug is fixed, deadlock error will be there, as trx 2 owns
+# next-key lock waiting for trx 1, and trx 1 requests
+# insert-intention lock, conflicting with trx 2 next-key lock.
+--error ER_LOCK_DEADLOCK
+--reap
+--disconnect con3
+
+--connection default
+# If the bug is not fixed, we will see the row inserted by trx 1 here. This can
+# cause duplicate key error on slave, when some other trx tries in insert row
+# with the same secondary key, as was inserted by trx 1, and not deleted by trx
+# 2.
+SELECT * FROM t;
+
+--disconnect pause_purge
+SET DEBUG_SYNC="RESET";
+DROP TABLE t;
+--source include/wait_until_count_sessions.inc
diff --git a/mysql-test/suite/innodb/t/insert_into_empty.test b/mysql-test/suite/innodb/t/insert_into_empty.test
index 468b150aae0..68ae83626cb 100644
--- a/mysql-test/suite/innodb/t/insert_into_empty.test
+++ b/mysql-test/suite/innodb/t/insert_into_empty.test
@@ -216,8 +216,6 @@ DROP TABLE t1;
--echo # MDEV-27214 Import with disabled keys corrupts meta-data like rows, indexes, ...
--echo #
-SET UNIQUE_CHECKS=0;
-SET FOREIGN_KEY_CHECKS=0;
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`a` int(11) DEFAULT NULL,
@@ -233,7 +231,6 @@ SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test';
DROP TABLE t1;
-
--echo # End of 10.6 tests
--echo #
diff --git a/mysql-test/suite/innodb/t/monitor.test b/mysql-test/suite/innodb/t/monitor.test
index 3a004b22751..d6fa3f2fbc9 100644
--- a/mysql-test/suite/innodb/t/monitor.test
+++ b/mysql-test/suite/innodb/t/monitor.test
@@ -468,6 +468,9 @@ INSERT INTO t1 VALUES(1,1,'a'),(2,9999,'b'),(3,10000,'c'),(4,4,'d');
DELETE FROM t1 WHERE a = 9999 AND b='b';
COMMIT;
+# After MDEV-30225 is fixed, the above DELETE creates next-key lock during
+# secondary index unique search. That's why the result of the following must
+# be 1.
SET @end = (SELECT COUNT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME
= 'lock_rec_lock_created');
SELECT @end - @start;
diff --git a/mysql-test/suite/innodb_fts/r/basic.result b/mysql-test/suite/innodb_fts/r/basic.result
index a98de60674a..a8ab0c043e4 100644
--- a/mysql-test/suite/innodb_fts/r/basic.result
+++ b/mysql-test/suite/innodb_fts/r/basic.result
@@ -5,12 +5,6 @@ body TEXT,
FULLTEXT (title,body)
) ENGINE=InnoDB;
ERROR HY000: Cannot create FULLTEXT index on temporary InnoDB table
-CREATE TABLE articles (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT (title,body)
-) ENGINE=InnoDB;
INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...') ,
('How To Use MySQL Well','After you went through a ...'),
diff --git a/mysql-test/suite/innodb_fts/r/innodb-fts-stopword.result b/mysql-test/suite/innodb_fts/r/innodb-fts-stopword.result
deleted file mode 100644
index ccd2db7425a..00000000000
--- a/mysql-test/suite/innodb_fts/r/innodb-fts-stopword.result
+++ /dev/null
@@ -1,761 +0,0 @@
-select * from information_schema.innodb_ft_default_stopword;
-value
-a
-about
-an
-are
-as
-at
-be
-by
-com
-de
-en
-for
-from
-how
-i
-in
-is
-it
-la
-of
-on
-or
-that
-the
-this
-to
-was
-what
-when
-where
-who
-will
-with
-und
-the
-www
-CREATE TABLE articles (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT (title,body)
-) ENGINE=InnoDB;
-INSERT INTO articles (title,body) VALUES
-('MySQL Tutorial','DBMS stands for DataBase ...') ,
-('How To Use MySQL Well','After you went through a ...'),
-('Optimizing MySQL','In this tutorial we will show ...'),
-('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-('MySQL vs. YourSQL','In the following database comparison ...'),
-('MySQL Security','When configured properly, MySQL ...');
-SELECT * FROM articles WHERE MATCH (title,body)
-AGAINST ('the' IN NATURAL LANGUAGE MODE);
-id title body
-select @@innodb_ft_server_stopword_table;
-@@innodb_ft_server_stopword_table
-NULL
-select @@innodb_ft_enable_stopword;
-@@innodb_ft_enable_stopword
-1
-select @@innodb_ft_user_stopword_table;
-@@innodb_ft_user_stopword_table
-NULL
-set global innodb_ft_server_stopword_table = "not_defined";
-ERROR 42000: Variable 'innodb_ft_server_stopword_table' can't be set to the value of 'not_defined'
-create table user_stopword(value varchar(30)) engine = innodb;
-set global innodb_ft_server_stopword_table = "test/user_stopword";
-drop index title on articles;
-create fulltext index idx on articles(title, body);
-SELECT * FROM articles WHERE MATCH (title,body)
-AGAINST ('the' IN NATURAL LANGUAGE MODE);
-id title body
-5 MySQL vs. YourSQL In the following database comparison ...
-CREATE TABLE articles_2 (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT (title,body)
-) ENGINE=InnoDB;
-INSERT INTO articles_2 (title, body)
-VALUES ('test for stopwords','this is it...');
-SELECT * FROM articles_2 WHERE MATCH (title,body)
-AGAINST ('this' IN NATURAL LANGUAGE MODE);
-id title body
-1 test for stopwords this is it...
-insert into user_stopword values("this");
-CREATE TABLE articles_3 (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT (title,body)
-) ENGINE=InnoDB;
-INSERT INTO articles_3 (title, body)
-VALUES ('test for stopwords','this is it...');
-SELECT * FROM articles_3 WHERE MATCH (title,body)
-AGAINST ('this' IN NATURAL LANGUAGE MODE);
-id title body
-create table user_stopword_session(value varchar(30)) engine = innodb;
-insert into user_stopword_session values("session");
-set session innodb_ft_user_stopword_table="test/user_stopword_session";
-CREATE TABLE articles_4 (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT (title,body)
-) ENGINE=InnoDB;
-INSERT INTO articles_4 (title, body)
-VALUES ('test for session stopwords','this should also be excluded...');
-SELECT * FROM articles_4 WHERE MATCH (title,body)
-AGAINST ('session' IN NATURAL LANGUAGE MODE);
-id title body
-SELECT * FROM articles_4 WHERE MATCH (title,body)
-AGAINST ('this' IN NATURAL LANGUAGE MODE);
-id title body
-1 test for session stopwords this should also be excluded...
-connect con1,localhost,root,,;
-CREATE TABLE articles_5 (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT (title,body)
-) ENGINE=InnoDB;
-INSERT INTO articles_5 (title, body)
-VALUES ('test for session stopwords','this should also be excluded...');
-SELECT * FROM articles_5 WHERE MATCH (title,body)
-AGAINST ('session' IN NATURAL LANGUAGE MODE);
-id title body
-1 test for session stopwords this should also be excluded...
-connection default;
-drop table articles;
-drop table articles_2;
-drop table articles_3;
-drop table articles_4;
-drop table articles_5;
-drop table user_stopword;
-drop table user_stopword_session;
-SET GLOBAL innodb_ft_enable_stopword=1;
-SET GLOBAL innodb_ft_server_stopword_table=default;
-CREATE TABLE articles (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT `idx` (title,body)
-) ENGINE=InnoDB;
-SHOW CREATE TABLE articles;
-Table Create Table
-articles CREATE TABLE `articles` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `title` varchar(200) DEFAULT NULL,
- `body` text DEFAULT NULL,
- PRIMARY KEY (`id`),
- FULLTEXT KEY `idx` (`title`,`body`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-INSERT INTO articles (title,body) VALUES
-('MySQL from Tutorial','DBMS stands for DataBase ...') ,
-('when To Use MySQL Well','After that you went through a ...'),
-('where will Optimizing MySQL','In what tutorial we will show ...'),
-('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-('MySQL vs. YourSQL','In the following database comparison ...'),
-('MySQL Security','When configured properly, MySQL ...');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-id title body
-INSERT INTO articles(title,body) values ('the record will' , 'not index the , will words');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-id title body
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE id = 7;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-DELETE FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE id = 7;
-id title body
-7 update the record to see will is indexed or not
-DELETE FROM articles WHERE id = 7;
-SET SESSION innodb_ft_enable_stopword = 0;
-select @@innodb_ft_enable_stopword;
-@@innodb_ft_enable_stopword
-0
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-id title body
-INSERT INTO articles(title,body) values ('the record will' , 'not index the , will words');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-id title body
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE id = 8;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-SELECT * FROM articles WHERE id = 8;
-id title body
-8 update the record to see will is indexed or not
-DELETE FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE id = 8;
-id title body
-8 update the record to see will is indexed or not
-DELETE FROM articles WHERE id = 8;
-ALTER TABLE articles DROP INDEX idx;
-SHOW CREATE TABLE articles;
-Table Create Table
-articles CREATE TABLE `articles` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `title` varchar(200) DEFAULT NULL,
- `body` text DEFAULT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-ANALYZE TABLE articles;
-Table Op Msg_type Msg_text
-test.articles analyze status Engine-independent statistics collected
-test.articles analyze Warning Engine-independent statistics are not collected for column 'body'
-test.articles analyze status OK
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-id title body
-2 when To Use MySQL Well After that you went through a ...
-6 MySQL Security When configured properly, MySQL ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-1 MySQL from Tutorial DBMS stands for DataBase ...
-6 MySQL Security When configured properly, MySQL ...
-2 when To Use MySQL Well After that you went through a ...
-4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
-5 MySQL vs. YourSQL In the following database comparison ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-id title body
-2 when To Use MySQL Well After that you went through a ...
-3 where will Optimizing MySQL In what tutorial we will show ...
-6 MySQL Security When configured properly, MySQL ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-id title body
-1 MySQL from Tutorial DBMS stands for DataBase ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-INSERT INTO articles(title,body) values ('the record will' , 'not index the , will words');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-id title body
-9 the record will not index the , will words
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-id title body
-9 the record will not index the , will words
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT COUNT(*),max(id) FROM articles;
-COUNT(*) max(id)
-7 9
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-id title body
-9 update the record to see will is indexed or not
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-9 update the record to see will is indexed or not
-DELETE FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE id = 9;
-id title body
-DROP TABLE articles;
-SET SESSION innodb_ft_enable_stopword=1;
-SET GLOBAL innodb_ft_server_stopword_table=default;
-SET SESSION innodb_ft_user_stopword_table=default;
-select @@innodb_ft_server_stopword_table;
-@@innodb_ft_server_stopword_table
-NULL
-select @@innodb_ft_enable_stopword;
-@@innodb_ft_enable_stopword
-1
-select @@innodb_ft_user_stopword_table;
-@@innodb_ft_user_stopword_table
-NULL
-CREATE TABLE articles (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT `idx` (title,body)
-) ENGINE=InnoDB;
-INSERT INTO articles (title,body) VALUES
-('MySQL from Tutorial','DBMS stands for DataBase ...') ,
-('when To Use MySQL Well','After that you went through a ...'),
-('where will Optimizing MySQL','In what tutorial we will show ...'),
-('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-('MySQL vs. YourSQL','In the following database comparison ...'),
-('MySQL Security','When configured properly, MySQL ...');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-create table user_stopword(value varchar(30)) engine = innodb;
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-create table server_stopword(value varchar(30)) engine = innodb;
-set global innodb_ft_server_stopword_table = "test/server_stopword";
-insert into user_stopword values("this"),("will"),("the");
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-insert into server_stopword values("what"),("where");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-DELETE FROM user_stopword;
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-insert into user_stopword values("this"),("will"),("the");
-ALTER TABLE articles DROP INDEX idx;
-SET SESSION innodb_ft_enable_stopword = 0;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SET SESSION innodb_ft_enable_stopword = 1;
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-SET SESSION innodb_ft_enable_stopword = 1;
-SET SESSION innodb_ft_user_stopword_table = default;
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-DROP TABLE articles,user_stopword,server_stopword;
-SET SESSION innodb_ft_enable_stopword=1;
-SET GLOBAL innodb_ft_server_stopword_table=default;
-SET SESSION innodb_ft_user_stopword_table=default;
-select @@innodb_ft_server_stopword_table;
-@@innodb_ft_server_stopword_table
-NULL
-select @@innodb_ft_enable_stopword;
-@@innodb_ft_enable_stopword
-1
-select @@innodb_ft_user_stopword_table;
-@@innodb_ft_user_stopword_table
-NULL
-CREATE TABLE articles (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT `idx` (title,body)
-) ENGINE=InnoDB;
-SHOW CREATE TABLE articles;
-Table Create Table
-articles CREATE TABLE `articles` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `title` varchar(200) DEFAULT NULL,
- `body` text DEFAULT NULL,
- PRIMARY KEY (`id`),
- FULLTEXT KEY `idx` (`title`,`body`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-INSERT INTO articles (title,body) VALUES
-('MySQL from Tutorial','DBMS stands for DataBase ...') ,
-('when To Use MySQL Well','After that you went through a ...'),
-('where will Optimizing MySQL','In what tutorial we will show ...'),
-('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-('MySQL vs. YourSQL','In the following database comparison ...'),
-('MySQL Security','When configured properly, MySQL ...');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-create table user_stopword(value varchar(30)) engine = innodb;
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-insert into user_stopword values("mysqld"),("DBMS");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+DBMS +mysql" IN BOOLEAN MODE);
-id title body
-1 MySQL from Tutorial DBMS stands for DataBase ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysqld');
-id title body
-4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+DBMS +mysql" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysqld');
-id title body
-set session innodb_ft_user_stopword_table = default;
-create table server_stopword(value varchar(30)) engine = innodb;
-set global innodb_ft_server_stopword_table = "test/server_stopword";
-insert into server_stopword values("root"),("properly");
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+root +mysql" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('properly');
-id title body
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-set global innodb_ft_server_stopword_table = "test/server_stopword";
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+root +mysql" IN BOOLEAN MODE);
-id title body
-4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('properly');
-id title body
-6 MySQL Security When configured properly, MySQL ...
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-DELETE FROM user_stopword;
-set global innodb_ft_server_stopword_table = "test/server_stopword";
-DELETE FROM server_stopword;
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+root +mysql" IN BOOLEAN MODE);
-id title body
-4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('properly');
-id title body
-6 MySQL Security When configured properly, MySQL ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+DBMS +mysql" IN BOOLEAN MODE);
-id title body
-1 MySQL from Tutorial DBMS stands for DataBase ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysqld');
-id title body
-4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
-DROP TABLE articles,user_stopword,server_stopword;
-SET SESSION innodb_ft_enable_stopword=1;
-SET GLOBAL innodb_ft_server_stopword_table=default;
-SET SESSION innodb_ft_user_stopword_table=default;
-CREATE TABLE articles (
-id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
-title VARCHAR(200),
-body TEXT,
-FULLTEXT `idx` (title,body)
-) ENGINE=InnoDB;
-SHOW CREATE TABLE articles;
-Table Create Table
-articles CREATE TABLE `articles` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `title` varchar(200) DEFAULT NULL,
- `body` text DEFAULT NULL,
- PRIMARY KEY (`id`),
- FULLTEXT KEY `idx` (`title`,`body`)
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
-INSERT INTO articles (title,body) VALUES
-('MySQL from Tutorial','DBMS stands for DataBase ...') ,
-('when To Use MySQL Well','After that you went through a ...'),
-('where will Optimizing MySQL','In what tutorial we will show ...'),
-('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
-('MySQL vs. YourSQL','In the following database comparison ...'),
-('MySQL Security','When configured properly, MySQL ...');
-SET SESSION innodb_ft_enable_stopword = 0;
-select @@innodb_ft_enable_stopword;
-@@innodb_ft_enable_stopword
-0
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-connection con1;
-select @@innodb_ft_enable_stopword;
-@@innodb_ft_enable_stopword
-1
-ANALYZE TABLE articles;
-Table Op Msg_type Msg_text
-test.articles analyze status Engine-independent statistics collected
-test.articles analyze Warning Engine-independent statistics are not collected for column 'body'
-test.articles analyze status OK
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-id title body
-2 when To Use MySQL Well After that you went through a ...
-6 MySQL Security When configured properly, MySQL ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-1 MySQL from Tutorial DBMS stands for DataBase ...
-6 MySQL Security When configured properly, MySQL ...
-2 when To Use MySQL Well After that you went through a ...
-4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
-5 MySQL vs. YourSQL In the following database comparison ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-id title body
-2 when To Use MySQL Well After that you went through a ...
-3 where will Optimizing MySQL In what tutorial we will show ...
-6 MySQL Security When configured properly, MySQL ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-id title body
-1 MySQL from Tutorial DBMS stands for DataBase ...
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SET SESSION innodb_ft_enable_stopword = 1;
-select @@innodb_ft_enable_stopword;
-@@innodb_ft_enable_stopword
-1
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-id title body
-connection default;
-select @@innodb_ft_enable_stopword;
-@@innodb_ft_enable_stopword
-0
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-id title body
-INSERT INTO articles(title,body) values ('the record will' , 'not index the , will words');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-id title body
-SET SESSION innodb_ft_enable_stopword = 1;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-id title body
-connection con1;
-SET SESSION innodb_ft_enable_stopword = 1;
-create table user_stopword(value varchar(30)) engine = innodb;
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-insert into user_stopword values("this"),("will"),("the");
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-connection default;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-id title body
-select @@innodb_ft_user_stopword_table;
-@@innodb_ft_user_stopword_table
-NULL
-create table user_stopword_1(value varchar(30)) engine = innodb;
-set session innodb_ft_user_stopword_table = "test/user_stopword_1";
-insert into user_stopword_1 values("when");
-SET SESSION innodb_ft_enable_stopword = 1;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+when" IN BOOLEAN MODE);
-id title body
-2 when To Use MySQL Well After that you went through a ...
-6 MySQL Security When configured properly, MySQL ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('when');
-id title body
-2 when To Use MySQL Well After that you went through a ...
-6 MySQL Security When configured properly, MySQL ...
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+when" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('when');
-id title body
-connection con1;
-SET SESSION innodb_ft_enable_stopword = 1;
-SET SESSION innodb_ft_user_stopword_table=default;
-select @@innodb_ft_user_stopword_table;
-@@innodb_ft_user_stopword_table
-NULL
-select @@innodb_ft_server_stopword_table;
-@@innodb_ft_server_stopword_table
-NULL
-create table server_stopword(value varchar(30)) engine = innodb;
-SET GLOBAL innodb_ft_server_stopword_table = "test/server_stopword";
-select @@innodb_ft_server_stopword_table;
-@@innodb_ft_server_stopword_table
-test/server_stopword
-insert into server_stopword values("when"),("the");
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+when" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('the');
-id title body
-disconnect con1;
-connection default;
-SET SESSION innodb_ft_enable_stopword = 1;
-SET SESSION innodb_ft_user_stopword_table=default;
-select @@innodb_ft_server_stopword_table;
-@@innodb_ft_server_stopword_table
-test/server_stopword
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+will +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('where');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-insert into server_stopword values("where"),("will");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+will +where" IN BOOLEAN MODE);
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('where');
-id title body
-3 where will Optimizing MySQL In what tutorial we will show ...
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+when" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('the');
-id title body
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+will +where" IN BOOLEAN MODE);
-id title body
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('where');
-id title body
-DROP TABLE articles,user_stopword,user_stopword_1,server_stopword;
-SET SESSION innodb_ft_enable_stopword=1;
-SET GLOBAL innodb_ft_server_stopword_table=default;
-SET SESSION innodb_ft_user_stopword_table=default;
diff --git a/mysql-test/suite/innodb_fts/r/stopword,vers.rdiff b/mysql-test/suite/innodb_fts/r/stopword,vers.rdiff
new file mode 100644
index 00000000000..7405c47c41d
--- /dev/null
+++ b/mysql-test/suite/innodb_fts/r/stopword,vers.rdiff
@@ -0,0 +1,192 @@
+--- stopword.result
++++ stopword,vers.reject
+@@ -46,7 +46,7 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ INSERT INTO articles (title,body) VALUES
+ ('MySQL Tutorial','DBMS stands for DataBase ...') ,
+ ('How To Use MySQL Well','After you went through a ...'),
+@@ -60,7 +60,7 @@
+ set global innodb_ft_server_stopword_table = "not_defined";
+ ERROR 42000: Variable 'innodb_ft_server_stopword_table' can't be set to the value of 'not_defined'
+ set global innodb_ft_server_stopword_table = NULL;
+-create table user_stopword(value varchar(30)) engine = innodb;
++create table user_stopword(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ set global innodb_ft_server_stopword_table = "test/user_stopword";
+ drop index title on articles;
+ create fulltext index idx on articles(title, body);
+@@ -73,7 +73,7 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ INSERT INTO articles_2 (title, body)
+ VALUES ('test for stopwords','this is it...');
+ SELECT * FROM articles_2 WHERE MATCH (title,body)
+@@ -88,13 +88,13 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ INSERT INTO articles_3 (title, body)
+ VALUES ('test for stopwords','this is it...');
+ SELECT * FROM articles_3 WHERE MATCH (title,body)
+ AGAINST ('this' IN NATURAL LANGUAGE MODE);
+ id title body
+-create table user_stopword_session(value varchar(30)) engine = innodb;
++create table user_stopword_session(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ insert into user_stopword values("this");
+ delete from user_stopword;
+ insert into user_stopword_session values("session");
+@@ -104,7 +104,7 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ INSERT INTO articles_4 (title, body)
+ VALUES ('test for session stopwords','this should also be excluded...');
+ SELECT * FROM articles_4 WHERE MATCH (title,body)
+@@ -120,7 +120,7 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ INSERT INTO articles_5 (title, body)
+ VALUES ('test for session stopwords','this should also be excluded...');
+ SELECT * FROM articles_5 WHERE MATCH (title,body)
+@@ -142,7 +142,7 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT `idx` (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ SHOW CREATE TABLE articles;
+ Table Create Table
+ articles CREATE TABLE `articles` (
+@@ -151,7 +151,7 @@
+ `body` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FULLTEXT KEY `idx` (`title`,`body`)
+-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
++) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ INSERT INTO articles (title,body) VALUES
+ ('MySQL from Tutorial','DBMS stands for DataBase ...') ,
+ ('when To Use MySQL Well','After that you went through a ...'),
+@@ -248,7 +248,7 @@
+ `title` varchar(200) DEFAULT NULL,
+ `body` text DEFAULT NULL,
+ PRIMARY KEY (`id`)
+-) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
++) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
+ ANALYZE TABLE articles;
+ Table Op Msg_type Msg_text
+@@ -320,7 +320,7 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT `idx` (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ INSERT INTO articles (title,body) VALUES
+ ('MySQL from Tutorial','DBMS stands for DataBase ...') ,
+ ('when To Use MySQL Well','After that you went through a ...'),
+@@ -332,9 +332,9 @@
+ id title body
+ SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
+ id title body
+-create table user_stopword(value varchar(30)) engine = innodb;
++create table user_stopword(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ set session innodb_ft_user_stopword_table = "test/user_stopword";
+-create table server_stopword(value varchar(30)) engine = innodb;
++create table server_stopword(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ set global innodb_ft_server_stopword_table = "test/server_stopword";
+ insert into user_stopword values("when"),("where");
+ delete from user_stopword;
+@@ -419,7 +419,7 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT `idx` (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ SHOW CREATE TABLE articles;
+ Table Create Table
+ articles CREATE TABLE `articles` (
+@@ -428,7 +428,7 @@
+ `body` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FULLTEXT KEY `idx` (`title`,`body`)
+-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
++) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ INSERT INTO articles (title,body) VALUES
+ ('MySQL from Tutorial','DBMS stands for DataBase ...') ,
+ ('when To Use MySQL Well','After that you went through a ...'),
+@@ -440,7 +440,7 @@
+ id title body
+ SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
+ id title body
+-create table user_stopword(value varchar(30)) engine = innodb;
++create table user_stopword(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ set session innodb_ft_user_stopword_table = "test/user_stopword";
+ insert into user_stopword values("mysqld"),("DBMS");
+ SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
+@@ -466,7 +466,7 @@
+ SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysqld');
+ id title body
+ set session innodb_ft_user_stopword_table = default;
+-create table server_stopword(value varchar(30)) engine = innodb;
++create table server_stopword(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ set global innodb_ft_server_stopword_table = "test/server_stopword";
+ insert into server_stopword values("root"),("properly");
+ ALTER TABLE articles DROP INDEX idx;
+@@ -530,7 +530,7 @@
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT `idx` (title,body)
+-) ENGINE=InnoDB;
++) WITH SYSTEM VERSIONING ENGINE=InnoDB;
+ SHOW CREATE TABLE articles;
+ Table Create Table
+ articles CREATE TABLE `articles` (
+@@ -539,7 +539,7 @@
+ `body` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FULLTEXT KEY `idx` (`title`,`body`)
+-) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
++) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+ INSERT INTO articles (title,body) VALUES
+ ('MySQL from Tutorial','DBMS stands for DataBase ...') ,
+ ('when To Use MySQL Well','After that you went through a ...'),
+@@ -656,7 +656,7 @@
+ "In connection 1"
+ connection con1;
+ SET SESSION innodb_ft_enable_stopword = 1;
+-create table user_stopword(value varchar(30)) engine = innodb;
++create table user_stopword(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ set session innodb_ft_user_stopword_table = "test/user_stopword";
+ insert into user_stopword values("this"),("will"),("the");
+ ALTER TABLE articles DROP INDEX idx;
+@@ -674,7 +674,7 @@
+ select @@innodb_ft_user_stopword_table;
+ @@innodb_ft_user_stopword_table
+ NULL
+-create table user_stopword_1(value varchar(30)) engine = innodb;
++create table user_stopword_1(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ set session innodb_ft_user_stopword_table = "test/user_stopword_1";
+ insert into user_stopword_1 values("when");
+ SET SESSION innodb_ft_enable_stopword = 1;
+@@ -702,7 +702,7 @@
+ select @@innodb_ft_server_stopword_table;
+ @@innodb_ft_server_stopword_table
+ NULL
+-create table server_stopword(value varchar(30)) engine = innodb;
++create table server_stopword(value varchar(30)) WITH SYSTEM VERSIONING engine = innodb;
+ SET GLOBAL innodb_ft_server_stopword_table = "test/server_stopword";
+ select @@innodb_ft_server_stopword_table;
+ @@innodb_ft_server_stopword_table
diff --git a/mysql-test/suite/innodb_fts/r/stopword.result b/mysql-test/suite/innodb_fts/r/stopword.result
index 06990528b81..aa6f51aac76 100644
--- a/mysql-test/suite/innodb_fts/r/stopword.result
+++ b/mysql-test/suite/innodb_fts/r/stopword.result
@@ -1,3 +1,6 @@
+SET @innodb_ft_server_stopword_table_orig=@@innodb_ft_server_stopword_table;
+SET @innodb_ft_enable_stopword_orig=@@innodb_ft_enable_stopword;
+SET @innodb_ft_user_stopword_table_orig=@@innodb_ft_user_stopword_table;
call mtr.add_suppression("\\[ERROR\\] InnoDB: user stopword table not_defined does not exist.");
call mtr.add_suppression("\\[ERROR\\] InnoDB: user stopword table test/user_stopword_session does not exist.");
select * from information_schema.innodb_ft_default_stopword;
@@ -54,9 +57,6 @@ INSERT INTO articles (title,body) VALUES
SELECT * FROM articles WHERE MATCH (title,body)
AGAINST ('the' IN NATURAL LANGUAGE MODE);
id title body
-SET @innodb_ft_server_stopword_table_orig=@@innodb_ft_server_stopword_table;
-SET @innodb_ft_enable_stopword_orig=@@innodb_ft_enable_stopword;
-SET @innodb_ft_user_stopword_table_orig=@@innodb_ft_user_stopword_table;
set global innodb_ft_server_stopword_table = "not_defined";
ERROR 42000: Variable 'innodb_ft_server_stopword_table' can't be set to the value of 'not_defined'
set global innodb_ft_server_stopword_table = NULL;
@@ -80,6 +80,8 @@ SELECT * FROM articles_2 WHERE MATCH (title,body)
AGAINST ('this' IN NATURAL LANGUAGE MODE);
id title body
1 test for stopwords this is it...
+insert into user_stopword values("the");
+delete from user_stopword;
insert into user_stopword values("this");
CREATE TABLE articles_3 (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
@@ -93,6 +95,8 @@ SELECT * FROM articles_3 WHERE MATCH (title,body)
AGAINST ('this' IN NATURAL LANGUAGE MODE);
id title body
create table user_stopword_session(value varchar(30)) engine = innodb;
+insert into user_stopword values("this");
+delete from user_stopword;
insert into user_stopword_session values("session");
set session innodb_ft_user_stopword_table="test/user_stopword_session";
CREATE TABLE articles_4 (
@@ -334,6 +338,8 @@ create table user_stopword(value varchar(30)) engine = innodb;
set session innodb_ft_user_stopword_table = "test/user_stopword";
create table server_stopword(value varchar(30)) engine = innodb;
set global innodb_ft_server_stopword_table = "test/server_stopword";
+insert into user_stopword values("when"),("where");
+delete from user_stopword;
insert into user_stopword values("this"),("will"),("the");
ALTER TABLE articles DROP INDEX idx;
ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
diff --git a/mysql-test/suite/innodb_fts/r/versioning,prepare.result b/mysql-test/suite/innodb_fts/r/versioning,prepare.result
new file mode 100644
index 00000000000..ada4f30d80c
--- /dev/null
+++ b/mysql-test/suite/innodb_fts/r/versioning,prepare.result
@@ -0,0 +1,695 @@
+# Upgrade test
+CREATE TEMPORARY TABLE articles (
+id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
+title VARCHAR(200),
+body TEXT,
+FULLTEXT (title,body)
+) ENGINE=InnoDB;
+ERROR HY000: Cannot create FULLTEXT index on temporary InnoDB table
+CREATE TABLE articles (
+id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
+title VARCHAR(200),
+body TEXT,
+FULLTEXT (title,body)
+)with system versioning ENGINE=InnoDB;
+INSERT INTO articles (title,body) VALUES
+('MySQL Tutorial','DBMS stands for DataBase ...') ,
+('How To Use MySQL Well','After you went through a ...'),
+('Optimizing MySQL','In this tutorial we will show ...'),
+('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
+('MySQL vs. YourSQL','In the following database comparison ...'),
+('MySQL Security','When configured properly, MySQL ...');
+INSERT INTO articles (title,body) VALUES
+('test query expansion','for database ...');
+INSERT INTO articles (title,body) VALUES
+('test proximity search, test, proximity and phrase',
+'search, with proximity innodb');
+INSERT INTO articles (title,body) VALUES
+('test my proximity fts new search, test, proximity and phrase',
+'search, with proximity innodb');
+INSERT INTO articles (title,body) VALUES
+('test more of proximity fts search, test, more proximity and phrase',
+'search, with proximity innodb');
+call mtr.add_suppression("\\[ERROR\\] InnoDB: user stopword table not_defined does not exist.");
+call mtr.add_suppression("\\[ERROR\\] InnoDB: user stopword table test/user_stopword_session does not exist.");
+select * from information_schema.innodb_ft_default_stopword;
+value
+a
+about
+an
+are
+as
+at
+be
+by
+com
+de
+en
+for
+from
+how
+i
+in
+is
+it
+la
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+who
+will
+with
+und
+the
+www
+CREATE TABLE articles2 (
+id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
+title VARCHAR(200),
+body TEXT,
+FULLTEXT (title,body)
+)with system versioning ENGINE=InnoDB;
+INSERT INTO articles2 (title,body) VALUES
+('MySQL Tutorial','DBMS stands for DataBase ...') ,
+('How To Use MySQL Well','After you went through a ...'),
+('Optimizing MySQL','In this tutorial we will show ...'),
+('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
+('MySQL vs. YourSQL','In the following database comparison ...'),
+('MySQL Security','When configured properly, MySQL ...');
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('the' IN NATURAL LANGUAGE MODE);
+id title body
+set global innodb_ft_server_stopword_table = "not_defined";
+ERROR 42000: Variable 'innodb_ft_server_stopword_table' can't be set to the value of 'not_defined'
+set global innodb_ft_server_stopword_table = NULL;
+create table user_stopword(value varchar(30)) engine = innodb;
+set global innodb_ft_server_stopword_table = "test/user_stopword";
+drop index title on articles2;
+create fulltext index idx on articles2(title, body);
+insert into articles2 (title, body)
+values ('test for stopwords','this is it...');
+insert into user_stopword values("the");
+delete from user_stopword;
+insert into user_stopword values("this");
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE);
+ERROR HY000: Index articles is corrupted
+call mtr.add_suppression("test/articles.? contains 3 indexes inside InnoDB");
+alter table articles force;
+Warnings:
+Warning 1082 InnoDB: Table test/articles contains 3 indexes inside InnoDB, which is different from the number of indexes 2 defined in the MariaDB
+flush tables;
+show create table articles;
+Table Create Table
+articles CREATE TABLE `articles` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `title` varchar(200) DEFAULT NULL,
+ `body` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FULLTEXT KEY `title` (`title`,`body`)
+) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+5 MySQL vs. YourSQL In the following database comparison ...
+7 test query expansion for database ...
+SELECT COUNT(*) FROM articles
+WHERE MATCH (title,body)
+AGAINST ('database' IN NATURAL LANGUAGE MODE);
+COUNT(*)
+3
+SELECT * FROM articles
+WHERE MATCH (title, body)
+AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT COUNT(IF(MATCH (title,body)
+AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))
+AS count FROM articles;
+count
+3
+SELECT id, body, MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE) AS score
+FROM articles;
+id body score
+1 DBMS stands for DataBase ... 0.2734021842479706
+2 After you went through a ... 0
+3 In this tutorial we will show ... 0
+4 1. Never run mysqld as root. 2. ... 0
+5 In the following database comparison ... 0.2734021842479706
+6 When configured properly, MySQL ... 0
+7 for database ... 0.2734021842479706
+8 search, with proximity innodb 0
+9 search, with proximity innodb 0
+10 search, with proximity innodb 0
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('MySQL' IN NATURAL LANGUAGE MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('DBMS Security' IN BOOLEAN MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+6 MySQL Security When configured properly, MySQL ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL +YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL ~YourSQL' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('t*' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+7 test query expansion for database ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('MY*' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('ru*' IN BOOLEAN MODE);
+id title body
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL >Well < stands' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL - (Well stands)' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR HY000: Table handler out of memory
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((vs))))))))))))))))))))))))))))))),(((to)))'
+ IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR 42000: syntax error, unexpected $end
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR 42000: syntax error, unexpected $end
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL + (>Well < stands)' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('YourSQL + (+MySQL - (Tricks Security))' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('(+MySQL - (Tricks Security)) - YourSQL' IN BOOLEAN MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - Security&DBMS' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - (Security DBMS)' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST (' - Security&DBMS + YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+YourSQL - Security&DBMS' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT COUNT(*) FROM articles
+WHERE MATCH (title,body)
+AGAINST ('database' WITH QUERY EXPANSION);
+COUNT(*)
+10
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('test' WITH QUERY EXPANSION);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+7 test query expansion for database ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following comparison"@3' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following comparison"@2' IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following database"' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@3' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@2' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@5' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@5' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@1' IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@4' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@3' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"@4' IN BOOLEAN MODE);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"@3' IN BOOLEAN MODE);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"' IN BOOLEAN MODE);
+id title body
+set global innodb_ft_server_stopword_table= "test/user_stopword";
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('the' IN NATURAL LANGUAGE MODE);
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('this' IN NATURAL LANGUAGE MODE);
+drop index idx on articles2;
+Warnings:
+Warning 1082 InnoDB: Table test/articles2 contains 3 indexes inside InnoDB, which is different from the number of indexes 1 defined in the MariaDB
+create fulltext index idx on articles2(title, body);
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('the' IN NATURAL LANGUAGE MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('this' IN NATURAL LANGUAGE MODE);
+id title body
+# Downgrade test
+alter table articles force;
+Warnings:
+Warning 1082 InnoDB: Table test/articles contains 3 indexes inside InnoDB, which is different from the number of indexes 2 defined in the MariaDB
+Warning 1082 InnoDB: Table test/articles contains 3 indexes inside InnoDB, which is different from the number of indexes 2 defined in the MariaDB
+flush tables;
+show create table articles;
+Table Create Table
+articles CREATE TABLE `articles` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `title` varchar(200) DEFAULT NULL,
+ `body` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FULLTEXT KEY `title` (`title`,`body`)
+) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+5 MySQL vs. YourSQL In the following database comparison ...
+7 test query expansion for database ...
+SELECT COUNT(*) FROM articles
+WHERE MATCH (title,body)
+AGAINST ('database' IN NATURAL LANGUAGE MODE);
+COUNT(*)
+3
+SELECT * FROM articles
+WHERE MATCH (title, body)
+AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT COUNT(IF(MATCH (title,body)
+AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))
+AS count FROM articles;
+count
+3
+SELECT id, body, MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE) AS score
+FROM articles;
+id body score
+1 DBMS stands for DataBase ... 0.2734021842479706
+2 After you went through a ... 0
+3 In this tutorial we will show ... 0
+4 1. Never run mysqld as root. 2. ... 0
+5 In the following database comparison ... 0.2734021842479706
+6 When configured properly, MySQL ... 0
+7 for database ... 0.2734021842479706
+8 search, with proximity innodb 0
+9 search, with proximity innodb 0
+10 search, with proximity innodb 0
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('MySQL' IN NATURAL LANGUAGE MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('DBMS Security' IN BOOLEAN MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+6 MySQL Security When configured properly, MySQL ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL +YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL ~YourSQL' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('t*' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+7 test query expansion for database ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('MY*' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('ru*' IN BOOLEAN MODE);
+id title body
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL >Well < stands' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL - (Well stands)' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR HY000: Table handler out of memory
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((vs))))))))))))))))))))))))))))))),(((to)))'
+ IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR 42000: syntax error, unexpected $end
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR 42000: syntax error, unexpected $end
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL + (>Well < stands)' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('YourSQL + (+MySQL - (Tricks Security))' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('(+MySQL - (Tricks Security)) - YourSQL' IN BOOLEAN MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - Security&DBMS' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - (Security DBMS)' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST (' - Security&DBMS + YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+YourSQL - Security&DBMS' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT COUNT(*) FROM articles
+WHERE MATCH (title,body)
+AGAINST ('database' WITH QUERY EXPANSION);
+COUNT(*)
+10
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('test' WITH QUERY EXPANSION);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+7 test query expansion for database ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following comparison"@3' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following comparison"@2' IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following database"' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@3' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@2' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@5' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@5' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@1' IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@4' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@3' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"@4' IN BOOLEAN MODE);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"@3' IN BOOLEAN MODE);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"' IN BOOLEAN MODE);
+id title body
+set global innodb_ft_server_stopword_table= "test/user_stopword";
+drop index idx on articles2;
+Warnings:
+Warning 1082 InnoDB: Table test/articles2 contains 3 indexes inside InnoDB, which is different from the number of indexes 2 defined in the MariaDB
+Warning 1082 InnoDB: Table test/articles2 contains 3 indexes inside InnoDB, which is different from the number of indexes 1 defined in the MariaDB
+create fulltext index idx on articles2(title, body);
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('the' IN NATURAL LANGUAGE MODE);
+id title body
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('this' IN NATURAL LANGUAGE MODE);
+id title body
+# Cleanup
+drop tables articles, articles2, user_stopword;
+set global innodb_ft_server_stopword_table= default;
diff --git a/mysql-test/suite/innodb_fts/r/versioning.result b/mysql-test/suite/innodb_fts/r/versioning.result
new file mode 100644
index 00000000000..baf25331d0d
--- /dev/null
+++ b/mysql-test/suite/innodb_fts/r/versioning.result
@@ -0,0 +1,304 @@
+# Upgrade test
+DROP TABLE mysql.innodb_table_stats, mysql.innodb_index_stats;
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE);
+ERROR HY000: Index articles is corrupted
+call mtr.add_suppression("test/articles.? contains 3 indexes inside InnoDB");
+alter table articles force;
+Warnings:
+Warning 1082 InnoDB: Table test/articles contains 3 indexes inside InnoDB, which is different from the number of indexes 2 defined in the MariaDB
+flush tables;
+show create table articles;
+Table Create Table
+articles CREATE TABLE `articles` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `title` varchar(200) DEFAULT NULL,
+ `body` text DEFAULT NULL,
+ PRIMARY KEY (`id`),
+ FULLTEXT KEY `title` (`title`,`body`)
+) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+5 MySQL vs. YourSQL In the following database comparison ...
+7 test query expansion for database ...
+SELECT COUNT(*) FROM articles
+WHERE MATCH (title,body)
+AGAINST ('database' IN NATURAL LANGUAGE MODE);
+COUNT(*)
+3
+SELECT * FROM articles
+WHERE MATCH (title, body)
+AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT COUNT(IF(MATCH (title,body)
+AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))
+AS count FROM articles;
+count
+3
+SELECT id, body, MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE) AS score
+FROM articles;
+id body score
+1 DBMS stands for DataBase ... 0.2734021842479706
+2 After you went through a ... 0
+3 In this tutorial we will show ... 0
+4 1. Never run mysqld as root. 2. ... 0
+5 In the following database comparison ... 0.2734021842479706
+6 When configured properly, MySQL ... 0
+7 for database ... 0.2734021842479706
+8 search, with proximity innodb 0
+9 search, with proximity innodb 0
+10 search, with proximity innodb 0
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('MySQL' IN NATURAL LANGUAGE MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('DBMS Security' IN BOOLEAN MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+6 MySQL Security When configured properly, MySQL ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL +YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+MySQL ~YourSQL' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('t*' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+7 test query expansion for database ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('MY*' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('ru*' IN BOOLEAN MODE);
+id title body
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL >Well < stands' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+6 MySQL Security When configured properly, MySQL ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL - (Well stands)' IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR HY000: Table handler out of memory
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+id title body
+6 MySQL Security When configured properly, MySQL ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((vs))))))))))))))))))))))))))))))),(((to)))'
+ IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR 42000: syntax error, unexpected $end
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+ERROR 42000: syntax error, unexpected $end
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('+ MySQL + (>Well < stands)' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('YourSQL + (+MySQL - (Tricks Security))' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('(+MySQL - (Tricks Security)) - YourSQL' IN BOOLEAN MODE);
+id title body
+1 MySQL Tutorial DBMS stands for DataBase ...
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - Security&DBMS' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - (Security DBMS)' IN BOOLEAN MODE);
+id title body
+2 How To Use MySQL Well After you went through a ...
+3 Optimizing MySQL In this tutorial we will show ...
+4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST (' - Security&DBMS + YourSQL' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+YourSQL - Security&DBMS' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT COUNT(*) FROM articles
+WHERE MATCH (title,body)
+AGAINST ('database' WITH QUERY EXPANSION);
+COUNT(*)
+10
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('test' WITH QUERY EXPANSION);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+7 test query expansion for database ...
+1 MySQL Tutorial DBMS stands for DataBase ...
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following comparison"@3' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following comparison"@2' IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"following database"' IN BOOLEAN MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@3' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@2' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"proximity search"@5' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@5' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@1' IN BOOLEAN MODE);
+id title body
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@4' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"test proximity"@3' IN BOOLEAN MODE);
+id title body
+8 test proximity search, test, proximity and phrase search, with proximity innodb
+9 test my proximity fts new search, test, proximity and phrase search, with proximity innodb
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"@4' IN BOOLEAN MODE);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"@3' IN BOOLEAN MODE);
+id title body
+10 test more of proximity fts search, test, more proximity and phrase search, with proximity innodb
+SELECT * FROM articles
+WHERE MATCH (title,body)
+AGAINST ('"more test proximity"' IN BOOLEAN MODE);
+id title body
+set global innodb_ft_server_stopword_table= "test/user_stopword";
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('the' IN NATURAL LANGUAGE MODE);
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('this' IN NATURAL LANGUAGE MODE);
+drop index idx on articles2;
+Warnings:
+Warning 1082 InnoDB: Table test/articles2 contains 3 indexes inside InnoDB, which is different from the number of indexes 1 defined in the MariaDB
+create fulltext index idx on articles2(title, body);
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('the' IN NATURAL LANGUAGE MODE);
+id title body
+5 MySQL vs. YourSQL In the following database comparison ...
+SELECT * FROM articles2 WHERE MATCH (title,body)
+AGAINST ('this' IN NATURAL LANGUAGE MODE);
+id title body
+# Cleanup
+drop tables articles, articles2, user_stopword;
+set global innodb_ft_server_stopword_table= default;
diff --git a/mysql-test/suite/innodb_fts/t/basic.inc b/mysql-test/suite/innodb_fts/t/basic.inc
new file mode 100644
index 00000000000..fd7d09208bc
--- /dev/null
+++ b/mysql-test/suite/innodb_fts/t/basic.inc
@@ -0,0 +1,264 @@
+if ($basic_stage == create_table)
+{
+# Create FTS table
+--error ER_INNODB_NO_FT_TEMP_TABLE
+CREATE TEMPORARY TABLE articles (
+ id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT (title,body)
+ ) ENGINE=InnoDB;
+
+--disable_query_log
+eval CREATE TABLE articles (
+ id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT (title,body)
+ )$create_options ENGINE=InnoDB;
+--enable_query_log
+}
+
+if ($basic_stage == insert_1)
+{
+# Insert six rows
+INSERT INTO articles (title,body) VALUES
+ ('MySQL Tutorial','DBMS stands for DataBase ...') ,
+ ('How To Use MySQL Well','After you went through a ...'),
+ ('Optimizing MySQL','In this tutorial we will show ...'),
+ ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
+ ('MySQL vs. YourSQL','In the following database comparison ...'),
+ ('MySQL Security','When configured properly, MySQL ...');
+}
+
+if ($basic_stage == select_1)
+{
+# Look for 'Database' in table article
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('Database' IN NATURAL LANGUAGE MODE);
+
+SELECT COUNT(*) FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('database' IN NATURAL LANGUAGE MODE);
+
+SELECT * FROM articles
+ WHERE MATCH (title, body)
+ AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE);
+
+
+SELECT COUNT(IF(MATCH (title,body)
+ AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))
+ AS count FROM articles;
+
+# Select Relevance Ranking
+SELECT id, body, MATCH (title,body)
+ AGAINST ('Database' IN NATURAL LANGUAGE MODE) AS score
+ FROM articles;
+
+# 'MySQL' treated as stopword (stopword functionality not yet supported)
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('MySQL' IN NATURAL LANGUAGE MODE);
+
+# Boolean search
+# Select rows contain "MySQL" but not "YourSQL"
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+
+# Select rows contain at least one of the two words
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('DBMS Security' IN BOOLEAN MODE);
+
+# Select rows contain both "MySQL" and "YourSQL"
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('+MySQL +YourSQL' IN BOOLEAN MODE);
+
+# Select rows contain "MySQL" but rank rows with "YourSQL" higher
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('+MySQL YourSQL' IN BOOLEAN MODE);
+
+# Test negation operator. Select rows contain MySQL,
+# if the row contains "YourSQL", rank it lower
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('+MySQL ~YourSQL' IN BOOLEAN MODE);
+
+# Test wild card search operator
+# Notice row with "the" will not get fetched due to
+# stopword filtering
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('t*' IN BOOLEAN MODE);
+
+# Test wild card search, notice row 6 with 2 "MySQL" rank first
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('MY*' IN BOOLEAN MODE);
+
+# Another wild card search
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('ru*' IN BOOLEAN MODE);
+
+# Test ">" and "<" Operator, the ">" operator increases
+# the word relevance rank and the "<" operator decreases it
+# Following test puts rows with "Well" on top and rows
+# with "stands" at the bottom
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('+ MySQL >Well < stands' IN BOOLEAN MODE);
+
+# Test sub-expression boolean search. Find rows contain
+# "MySQL" but not "Well" or "stands".
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('+ MySQL - (Well stands)' IN BOOLEAN MODE);
+
+--error 128
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((vs))))))))))))))))))))))))))))))),(((to)))'
+ IN BOOLEAN MODE);
+
+--error ER_PARSE_ERROR
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+--error ER_PARSE_ERROR
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST
+('(((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
+ IN BOOLEAN MODE);
+
+# Test sub-expression boolean search. Find rows contain
+# "MySQL" and "Well" or "MySQL" and "stands". But rank the
+# doc with "Well" higher, and doc with "stands" lower.
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('+ MySQL + (>Well < stands)' IN BOOLEAN MODE);
+
+# Test nested sub-expression.
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('YourSQL + (+MySQL - (Tricks Security))' IN BOOLEAN MODE);
+
+# Find rows with "MySQL" but not "Tricks", "Security" nor "YourSQL"
+SELECT * FROM articles WHERE MATCH (title,body)
+ AGAINST ('(+MySQL - (Tricks Security)) - YourSQL' IN BOOLEAN MODE);
+
+# Test non-word delimiter combined with negate "-" operator
+# This should return the same result as 'mysql - (Security DBMS)'
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - Security&DBMS' IN BOOLEAN MODE);
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - (Security DBMS)' IN BOOLEAN MODE);
+
+# Again, the operator sequence should not matter
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST (' - Security&DBMS + YourSQL' IN BOOLEAN MODE);
+
+SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+YourSQL - Security&DBMS' IN BOOLEAN MODE);
+
+# Test query expansion
+SELECT COUNT(*) FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('database' WITH QUERY EXPANSION);
+}
+
+if ($basic_stage == insert_2)
+{
+INSERT INTO articles (title,body) VALUES
+ ('test query expansion','for database ...');
+}
+
+if ($basic_stage == select_2)
+{
+# This query will return result containing word "database" as
+# the query expand from "test" to words in document just
+# inserted above
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('test' WITH QUERY EXPANSION);
+
+# This is to test the proximity search, search two word
+# "following" and "comparison" within 19 character space
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"following comparison"@3' IN BOOLEAN MODE);
+
+# This is to test the proximity search, search two word
+# "following" and "comparison" within 19 character space
+# This search should come with no return result
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"following comparison"@2' IN BOOLEAN MODE);
+
+# This is to test the phrase search, searching phrase
+# "following database"
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"following database"' IN BOOLEAN MODE);
+}
+
+if ($basic_stage == insert_3)
+{
+# Insert into table with similar word of different distances
+INSERT INTO articles (title,body) VALUES
+ ('test proximity search, test, proximity and phrase',
+ 'search, with proximity innodb');
+
+INSERT INTO articles (title,body) VALUES
+ ('test my proximity fts new search, test, proximity and phrase',
+ 'search, with proximity innodb');
+
+INSERT INTO articles (title,body) VALUES
+ ('test more of proximity fts search, test, more proximity and phrase',
+ 'search, with proximity innodb');
+}
+
+if ($basic_stage == select_3)
+{
+# This should only return the first document
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"proximity search"@3' IN BOOLEAN MODE);
+
+# This would return no document
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"proximity search"@2' IN BOOLEAN MODE);
+
+# This give you all three documents
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"proximity search"@5' IN BOOLEAN MODE);
+
+# Similar boundary testing for the words
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"test proximity"@5' IN BOOLEAN MODE);
+
+# No document will be returned
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"test proximity"@1' IN BOOLEAN MODE);
+
+# All three documents will be returned
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"test proximity"@4' IN BOOLEAN MODE);
+
+# Only two document will be returned.
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"test proximity"@3' IN BOOLEAN MODE);
+
+# Test with more word The last document will return, please notice there
+# is no ordering requirement for proximity search.
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"more test proximity"@4' IN BOOLEAN MODE);
+
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"more test proximity"@3' IN BOOLEAN MODE);
+
+# The phrase search will not require exact word ordering
+SELECT * FROM articles
+ WHERE MATCH (title,body)
+ AGAINST ('"more test proximity"' IN BOOLEAN MODE);
+}
diff --git a/mysql-test/suite/innodb_fts/t/basic.test b/mysql-test/suite/innodb_fts/t/basic.test
index 53ad978a5b1..df2e24fae8e 100644
--- a/mysql-test/suite/innodb_fts/t/basic.test
+++ b/mysql-test/suite/innodb_fts/t/basic.test
@@ -1,252 +1,33 @@
# This is the basic function tests for innodb FTS
-- source include/have_innodb.inc
+--let $modify_create_table= 1
+-- source include/maybe_versioning.inc
-# Create FTS table
---error ER_INNODB_NO_FT_TEMP_TABLE
-CREATE TEMPORARY TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- ) ENGINE=InnoDB;
+let $basic_stage= create_table;
+--source basic.inc
-CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- ) ENGINE=InnoDB;
-
-# Insert six rows
-INSERT INTO articles (title,body) VALUES
- ('MySQL Tutorial','DBMS stands for DataBase ...') ,
- ('How To Use MySQL Well','After you went through a ...'),
- ('Optimizing MySQL','In this tutorial we will show ...'),
- ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
- ('MySQL vs. YourSQL','In the following database comparison ...'),
- ('MySQL Security','When configured properly, MySQL ...');
+let $basic_stage= insert_1;
+--source basic.inc
-- disable_result_log
ANALYZE TABLE articles;
-- enable_result_log
-# Look for 'Database' in table article
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('Database' IN NATURAL LANGUAGE MODE);
-
-SELECT COUNT(*) FROM articles
- WHERE MATCH (title,body)
- AGAINST ('database' IN NATURAL LANGUAGE MODE);
-
-SELECT * FROM articles
- WHERE MATCH (title, body)
- AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE);
-
-
-SELECT COUNT(IF(MATCH (title,body)
- AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))
- AS count FROM articles;
-
-# Select Relevance Ranking
-SELECT id, body, MATCH (title,body)
- AGAINST ('Database' IN NATURAL LANGUAGE MODE) AS score
- FROM articles;
-
-# 'MySQL' treated as stopword (stopword functionality not yet supported)
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('MySQL' IN NATURAL LANGUAGE MODE);
-
-# Boolean search
-# Select rows contain "MySQL" but not "YourSQL"
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
-
-# Select rows contain at least one of the two words
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('DBMS Security' IN BOOLEAN MODE);
-
-# Select rows contain both "MySQL" and "YourSQL"
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('+MySQL +YourSQL' IN BOOLEAN MODE);
-
-# Select rows contain "MySQL" but rank rows with "YourSQL" higher
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('+MySQL YourSQL' IN BOOLEAN MODE);
-
-# Test negation operator. Select rows contain MySQL,
-# if the row contains "YourSQL", rank it lower
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('+MySQL ~YourSQL' IN BOOLEAN MODE);
-
-# Test wild card search operator
-# Notice row with "the" will not get fetched due to
-# stopword filtering
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('t*' IN BOOLEAN MODE);
-
-# Test wild card search, notice row 6 with 2 "MySQL" rank first
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('MY*' IN BOOLEAN MODE);
-
-# Another wild card search
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('ru*' IN BOOLEAN MODE);
-
-# Test ">" and "<" Operator, the ">" operator increases
-# the word relevance rank and the "<" operator decreases it
-# Following test puts rows with "Well" on top and rows
-# with "stands" at the bottom
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('+ MySQL >Well < stands' IN BOOLEAN MODE);
-
-# Test sub-expression boolean search. Find rows contain
-# "MySQL" but not "Well" or "stands".
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('+ MySQL - (Well stands)' IN BOOLEAN MODE);
-
---error 128
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST
-('(((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))))'
- IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST
-('((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
- IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST
-('(((((((((((((((((((((((((((((((vs))))))))))))))))))))))))))))))),(((to)))'
- IN BOOLEAN MODE);
-
---error ER_PARSE_ERROR
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST
-('((((((((((((((((((((((((((((((((Security)))))))))))))))))))))))))))))))'
- IN BOOLEAN MODE);
---error ER_PARSE_ERROR
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST
-('(((((((((((((((((((((((((((((((((Security))))))))))))))))))))))))))))))))'
- IN BOOLEAN MODE);
-
-# Test sub-expression boolean search. Find rows contain
-# "MySQL" and "Well" or "MySQL" and "stands". But rank the
-# doc with "Well" higher, and doc with "stands" lower.
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('+ MySQL + (>Well < stands)' IN BOOLEAN MODE);
-
-# Test nested sub-expression.
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('YourSQL + (+MySQL - (Tricks Security))' IN BOOLEAN MODE);
-
-# Find rows with "MySQL" but not "Tricks", "Security" nor "YourSQL"
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('(+MySQL - (Tricks Security)) - YourSQL' IN BOOLEAN MODE);
-
-# Test non-word delimiter combined with negate "-" operator
-# This should return the same result as 'mysql - (Security DBMS)'
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - Security&DBMS' IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysql - (Security DBMS)' IN BOOLEAN MODE);
-
-# Again, the operator sequence should not matter
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST (' - Security&DBMS + YourSQL' IN BOOLEAN MODE);
-
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+YourSQL - Security&DBMS' IN BOOLEAN MODE);
-
-# Test query expansion
-SELECT COUNT(*) FROM articles
- WHERE MATCH (title,body)
- AGAINST ('database' WITH QUERY EXPANSION);
-
-INSERT INTO articles (title,body) VALUES
- ('test query expansion','for database ...');
-
-# This query will return result containing word "database" as
-# the query expand from "test" to words in document just
-# inserted above
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('test' WITH QUERY EXPANSION);
-
-# This is to test the proximity search, search two word
-# "following" and "comparison" within 19 character space
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"following comparison"@3' IN BOOLEAN MODE);
-
-# This is to test the proximity search, search two word
-# "following" and "comparison" within 19 character space
-# This search should come with no return result
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"following comparison"@2' IN BOOLEAN MODE);
-
-# This is to test the phrase search, searching phrase
-# "following database"
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"following database"' IN BOOLEAN MODE);
-
-# Insert into table with similar word of different distances
-INSERT INTO articles (title,body) VALUES
- ('test proximity search, test, proximity and phrase',
- 'search, with proximity innodb');
-
-INSERT INTO articles (title,body) VALUES
- ('test my proximity fts new search, test, proximity and phrase',
- 'search, with proximity innodb');
-
-INSERT INTO articles (title,body) VALUES
- ('test more of proximity fts search, test, more proximity and phrase',
- 'search, with proximity innodb');
-
-# This should only return the first document
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"proximity search"@3' IN BOOLEAN MODE);
-
-# This would return no document
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"proximity search"@2' IN BOOLEAN MODE);
-
-# This give you all three documents
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"proximity search"@5' IN BOOLEAN MODE);
-
-# Similar boundary testing for the words
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"test proximity"@5' IN BOOLEAN MODE);
-
-# No document will be returned
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"test proximity"@1' IN BOOLEAN MODE);
-
-# All three documents will be returned
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"test proximity"@4' IN BOOLEAN MODE);
+let $basic_stage= select_1;
+--source basic.inc
-# Only two document will be returned.
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"test proximity"@3' IN BOOLEAN MODE);
+let $basic_stage= insert_2;
+--source basic.inc
-# Test with more word The last document will return, please notice there
-# is no ordering requirement for proximity search.
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"more test proximity"@4' IN BOOLEAN MODE);
+let $basic_stage= select_2;
+--source basic.inc
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"more test proximity"@3' IN BOOLEAN MODE);
+let $basic_stage= insert_3;
+--source basic.inc
-# The phrase search will not require exact word ordering
-SELECT * FROM articles
- WHERE MATCH (title,body)
- AGAINST ('"more test proximity"' IN BOOLEAN MODE);
+let $basic_stage= select_3;
+--source basic.inc
drop table articles;
diff --git a/mysql-test/suite/innodb_fts/t/crash_recovery.test b/mysql-test/suite/innodb_fts/t/crash_recovery.test
index b8da55a8ba6..cb53de4d595 100644
--- a/mysql-test/suite/innodb_fts/t/crash_recovery.test
+++ b/mysql-test/suite/innodb_fts/t/crash_recovery.test
@@ -8,6 +8,7 @@
--source include/not_embedded.inc
--source include/maybe_debug.inc
if ($have_debug) { source include/have_debug_sync.inc; }
+--source include/maybe_versioning.inc
FLUSH TABLES;
# Following are test for crash recovery on FTS index, the first scenario
@@ -23,6 +24,16 @@ CREATE TABLE articles (
FULLTEXT (title,body)
) ENGINE=InnoDB;
+let $vers= $MTR_COMBINATION_VERS + $MTR_COMBINATION_VERS_TRX;
+if ($vers)
+{
+ --disable_query_log
+ INSERT INTO articles (title,body) VALUES
+ ('history','Deleted row ...');
+ DELETE FROM articles;
+ --enable_query_log
+}
+
# Drop the FTS index before more insertion. The FTS_DOC_ID should
# be kept
DROP INDEX title ON articles;
@@ -118,6 +129,13 @@ INSERT INTO articles (title,body) VALUES
# Recreate fulltext index to see if everything is OK
CREATE FULLTEXT INDEX idx ON articles (title,body);
+if ($vers)
+{
+ --disable_query_log
+ UPDATE articles SET id= id - 1;
+ --enable_query_log
+}
+
# Should return 3 rows
SELECT * FROM articles
WHERE MATCH (title,body)
@@ -159,6 +177,13 @@ disconnect dml;
INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','DBMS stands for DataBase ...');
+if ($vers)
+{
+ --disable_query_log
+ UPDATE articles SET id= id - 1 WHERE id > 8;
+ --enable_query_log
+}
+
# Should return 6 rows
SELECT * FROM articles
WHERE MATCH (title,body)
@@ -195,6 +220,15 @@ BEGIN;
INSERT INTO articles VALUES
(100, 200, 'MySQL Tutorial','DBMS stands for DataBase ...');
+if ($vers)
+{
+ --disable_query_log
+ DELETE FROM articles WHERE id = 100;
+ INSERT INTO articles VALUES
+ (100, 200, 'MySQL Tutorial','DBMS stands for DataBase ...');
+ --enable_query_log
+}
+
connect(dml2, localhost, root,,);
--echo #
diff --git a/mysql-test/suite/innodb_fts/t/create.test b/mysql-test/suite/innodb_fts/t/create.test
index 38c93de4982..710fd9cb99b 100644
--- a/mysql-test/suite/innodb_fts/t/create.test
+++ b/mysql-test/suite/innodb_fts/t/create.test
@@ -1,4 +1,5 @@
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
SET NAMES utf8mb4;
--echo #
diff --git a/mysql-test/suite/innodb_fts/t/fulltext2.test b/mysql-test/suite/innodb_fts/t/fulltext2.test
index 25a4d5b24f9..7efd9adeeac 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext2.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext2.test
@@ -7,6 +7,7 @@
#
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
CREATE TABLE t1 (
i int(10) unsigned not null auto_increment primary key,
@@ -212,7 +213,17 @@ delete from t1 limit 1;
#
# BUG#16489: utf8 + fulltext leads to corrupt index file.
#
+if ($MTR_COMBINATION_ORIG)
+{
truncate table t1;
+}
+if (!$MTR_COMBINATION_ORIG)
+{
+--disable_query_log
+delete from t1;
+--enable_query_log
+--echo truncate table t1;
+}
insert into t1 values('ab c d');
update t1 set a='ab c d';
select * from t1 where match a against('ab c' in boolean mode);
diff --git a/mysql-test/suite/innodb_fts/t/fulltext3.test b/mysql-test/suite/innodb_fts/t/fulltext3.test
index 9c7941d7b5c..f28ca2c7d77 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext3.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext3.test
@@ -3,6 +3,7 @@
# test of new fulltext search features
#
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
DROP TABLE IF EXISTS t1;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext_cache.test b/mysql-test/suite/innodb_fts/t/fulltext_cache.test
index fa7ad49e881..37926c1e7f1 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext_cache.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext_cache.test
@@ -2,6 +2,7 @@
# Bugreport due to Roy Nasser <roy@vem.ca>
#
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
drop table if exists t1, t2;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext_distinct.test b/mysql-test/suite/innodb_fts/t/fulltext_distinct.test
index f6232704543..bb390a08384 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext_distinct.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext_distinct.test
@@ -3,6 +3,7 @@
# bug reported by Tibor Simko <tibor.simko@cern.ch>
#
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
DROP TABLE IF EXISTS t1, t2;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext_left_join.test b/mysql-test/suite/innodb_fts/t/fulltext_left_join.test
index 23bbd5ddc10..0a1e1748769 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext_left_join.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext_left_join.test
@@ -2,6 +2,7 @@
# Test for bug from Jean-Cédric COSTA <jean-cedric.costa@ensmp.fr>
#
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
drop table if exists t1, t2;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext_multi.test b/mysql-test/suite/innodb_fts/t/fulltext_multi.test
index 274027ea10b..81ab7e1b071 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext_multi.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext_multi.test
@@ -1,5 +1,6 @@
# several FULLTEXT indexes in one table test
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
DROP TABLE IF EXISTS t1;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext_order_by.test b/mysql-test/suite/innodb_fts/t/fulltext_order_by.test
index d2194f22e2a..f14681b934d 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext_order_by.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext_order_by.test
@@ -1,5 +1,6 @@
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
DROP TABLE IF EXISTS t1,t2,t3;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext_update.test b/mysql-test/suite/innodb_fts/t/fulltext_update.test
index 336e8de1d1b..bda97cd4a21 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext_update.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext_update.test
@@ -2,6 +2,7 @@
# Test for bug by voi@ims.at
#
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
drop table if exists test;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext_var.test b/mysql-test/suite/innodb_fts/t/fulltext_var.test
index 2b94aa58424..e8e4bf93303 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext_var.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext_var.test
@@ -2,6 +2,7 @@
# Fulltext configurable parameters
#
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
# Save ft_boolean_syntax variable
let $saved_ft_boolean_syntax=`select @@global.ft_boolean_syntax`;
diff --git a/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test b/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test
index 1ed164492d5..31f10399bc2 100644
--- a/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test
+++ b/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test
@@ -1,6 +1,7 @@
# This is the DDL function tests for innodb FTS
-- source include/have_innodb.inc
+-- source include/maybe_versioning.inc
# Create FTS table
CREATE TABLE fts_test (
@@ -54,7 +55,21 @@ SELECT * FROM fts_test WHERE MATCH (title,body)
AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
# Truncate table
+let $vers=$MTR_COMBINATION_VERS+$MTR_COMBINATION_VERS_TRX;
+
+if ($vers)
+{
+--disable_query_log
+CREATE TABLE fts_test2 LIKE fts_test;
+DROP TABLE fts_test;
+RENAME TABLE fts_test2 TO fts_test;
+--enable_query_log
+--echo TRUNCATE TABLE fts_test;
+}
+if (!$vers)
+{
TRUNCATE TABLE fts_test;
+}
DROP INDEX idx ON fts_test;
diff --git a/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test b/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test
index 669aa69e835..2d94c21398c 100644
--- a/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test
+++ b/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test
@@ -1,6 +1,7 @@
# This is the basic function tests for innodb FTS
-- source include/have_innodb.inc
+-- source include/maybe_versioning.inc
call mtr.add_suppression("\\[Warning\\] InnoDB: A new Doc ID must be supplied while updating FTS indexed columns.");
call mtr.add_suppression("\\[Warning\\] InnoDB: FTS Doc ID must be larger than [0-9]+ for table `test`.`articles`");
diff --git a/mysql-test/suite/innodb_fts/t/innodb-fts-stopword.opt b/mysql-test/suite/innodb_fts/t/innodb-fts-stopword.opt
deleted file mode 100644
index 2b0652d08c3..00000000000
--- a/mysql-test/suite/innodb_fts/t/innodb-fts-stopword.opt
+++ /dev/null
@@ -1 +0,0 @@
---loose-innodb-ft-default-stopword
diff --git a/mysql-test/suite/innodb_fts/t/innodb-fts-stopword.test b/mysql-test/suite/innodb_fts/t/innodb-fts-stopword.test
deleted file mode 100644
index 0f29d092541..00000000000
--- a/mysql-test/suite/innodb_fts/t/innodb-fts-stopword.test
+++ /dev/null
@@ -1,664 +0,0 @@
-# This is the basic function tests for innodb FTS
-
--- source include/have_innodb.inc
-
-
-select * from information_schema.innodb_ft_default_stopword;
-
-# Create FTS table
-CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- ) ENGINE=InnoDB;
-
-# Insert six rows
-INSERT INTO articles (title,body) VALUES
- ('MySQL Tutorial','DBMS stands for DataBase ...') ,
- ('How To Use MySQL Well','After you went through a ...'),
- ('Optimizing MySQL','In this tutorial we will show ...'),
- ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
- ('MySQL vs. YourSQL','In the following database comparison ...'),
- ('MySQL Security','When configured properly, MySQL ...');
-
-# "the" is in the default stopword, it would not be selected
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('the' IN NATURAL LANGUAGE MODE);
-
-let $innodb_ft_server_stopword_table_orig=`select @@innodb_ft_server_stopword_table`;
-let $innodb_ft_enable_stopword_orig=`select @@innodb_ft_enable_stopword`;
-let $innodb_ft_user_stopword_table_orig=`select @@innodb_ft_user_stopword_table`;
-
-select @@innodb_ft_server_stopword_table;
-select @@innodb_ft_enable_stopword;
-select @@innodb_ft_user_stopword_table;
-
-# Provide user defined stopword table, if not (correctly) defined,
-# it will be rejected
---error 1231
-set global innodb_ft_server_stopword_table = "not_defined";
-
-# Define a correct formated user stopword table
-create table user_stopword(value varchar(30)) engine = innodb;
-
-# The set operation should be successful
-set global innodb_ft_server_stopword_table = "test/user_stopword";
-
-drop index title on articles;
-
-create fulltext index idx on articles(title, body);
-
-# Now we should be able to find "the"
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('the' IN NATURAL LANGUAGE MODE);
-
-# Nothing inserted into the default stopword, so essentially
-# nothing get screened. The new stopword could only be
-# effective for table created thereafter
-CREATE TABLE articles_2 (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- ) ENGINE=InnoDB;
-
-INSERT INTO articles_2 (title, body)
- VALUES ('test for stopwords','this is it...');
-
-# Now we can find record with "this"
-SELECT * FROM articles_2 WHERE MATCH (title,body)
- AGAINST ('this' IN NATURAL LANGUAGE MODE);
-
-# Ok, let's instantiate some value into user supplied stop word
-# table
-insert into user_stopword values("this");
-
-# Ok, let's repeat with the new table again.
-CREATE TABLE articles_3 (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- ) ENGINE=InnoDB;
-
-INSERT INTO articles_3 (title, body)
- VALUES ('test for stopwords','this is it...');
-
-# Now we should NOT find record with "this"
-SELECT * FROM articles_3 WHERE MATCH (title,body)
- AGAINST ('this' IN NATURAL LANGUAGE MODE);
-
-# Test session level stopword control "innodb_user_stopword_table"
-create table user_stopword_session(value varchar(30)) engine = innodb;
-
-insert into user_stopword_session values("session");
-
-set session innodb_ft_user_stopword_table="test/user_stopword_session";
-
-CREATE TABLE articles_4 (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- ) ENGINE=InnoDB;
-
-INSERT INTO articles_4 (title, body)
- VALUES ('test for session stopwords','this should also be excluded...');
-
-# "session" is excluded
-SELECT * FROM articles_4 WHERE MATCH (title,body)
- AGAINST ('session' IN NATURAL LANGUAGE MODE);
-
-# But we can find record with "this"
-SELECT * FROM articles_4 WHERE MATCH (title,body)
- AGAINST ('this' IN NATURAL LANGUAGE MODE);
-
---connect (con1,localhost,root,,)
-CREATE TABLE articles_5 (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- ) ENGINE=InnoDB;
-
-INSERT INTO articles_5 (title, body)
- VALUES ('test for session stopwords','this should also be excluded...');
-
-# "session" should be found since the stopword table is session specific
-SELECT * FROM articles_5 WHERE MATCH (title,body)
- AGAINST ('session' IN NATURAL LANGUAGE MODE);
-
---connection default
-drop table articles;
-drop table articles_2;
-drop table articles_3;
-drop table articles_4;
-drop table articles_5;
-drop table user_stopword;
-drop table user_stopword_session;
-
-eval SET GLOBAL innodb_ft_enable_stopword=$innodb_ft_enable_stopword_orig;
-eval SET GLOBAL innodb_ft_server_stopword_table=default;
-
-#---------------------------------------------------------------------------------------
-# Behavior :
-# The stopword is loaded into memory at
-# 1) create fulltext index time,
-# 2) boot server,
-# 3) first time FTs is used
-# So if you already created a FTS index, and then turn off stopword
-# or change stopword table content it won't affect the FTS
-# that already created since the stopword list are already loaded.
-# It will only affect the new FTS index created after you changed
-# the settings.
-
-# Create FTS table
-CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT `idx` (title,body)
- ) ENGINE=InnoDB;
-
-SHOW CREATE TABLE articles;
-
-# Insert six rows
-INSERT INTO articles (title,body) VALUES
- ('MySQL from Tutorial','DBMS stands for DataBase ...') ,
- ('when To Use MySQL Well','After that you went through a ...'),
- ('where will Optimizing MySQL','In what tutorial we will show ...'),
- ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
- ('MySQL vs. YourSQL','In the following database comparison ...'),
- ('MySQL Security','When configured properly, MySQL ...');
-
-# Case : server_stopword=default
-# Try to Search default stopword from innodb, "where", "will", "what"
-# and "when" are all stopwords
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-# boolean No result expected
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-# no result expected
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-# no result expected
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-
-INSERT INTO articles(title,body) values ('the record will' , 'not index the , will words');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-# Not going to update as where condition can not find record
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-# Update the record
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE id = 7;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-# Delete will not work as where condition do not return
-DELETE FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE id = 7;
-DELETE FROM articles WHERE id = 7;
-
-
-
-# Case : Turn OFF stopword list variable and search stopword on OLD index.
-# disable stopword list
-#SET global innodb_ft_server_stopword_table = "";
-SET SESSION innodb_ft_enable_stopword = 0;
-select @@innodb_ft_enable_stopword;
-#SET global innodb_ft_user_stopword_table = "";
-
-# search default stopword with innodb_ft_enable_stopword is OFF.
-# No records expected even though we turned OFF stopwod filtering
-# (refer Behavior (at the top of the test) for explanation )
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-
-INSERT INTO articles(title,body) values ('the record will' , 'not index the , will words');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-# Not going to update as where condition can not find record
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-# Update the record
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE id = 8;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-SELECT * FROM articles WHERE id = 8;
-# Delete will not work as where condition do not return
-DELETE FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE id = 8;
-DELETE FROM articles WHERE id = 8;
-
-# Case : Turn OFF stopword list variable and search stopword on NEW index.
-# Drop index
-ALTER TABLE articles DROP INDEX idx;
-SHOW CREATE TABLE articles;
-
-# Create the FTS index Using Alter Table.
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-
-ANALYZE TABLE articles;
-
-# search default stopword with innodb_ft_enable_stopword is OFF.
-# All records expected as stopwod filtering is OFF and we created
-# new FTS index.
-# (refer Behavior (at the top of the test) for explanation )
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-
-INSERT INTO articles(title,body) values ('the record will' , 'not index the , will words');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-# Update will succeed.
-UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-
-SELECT COUNT(*),max(id) FROM articles;
-# Update the record - uncommet on fix
-#UPDATE articles SET title = "update the record" , body = 'to see will is indexed or not'
-#WHERE id = 9;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-# Delete will succeed.
-DELETE FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE id = 9;
-
-
-DROP TABLE articles;
-
-eval SET SESSION innodb_ft_enable_stopword=$innodb_ft_enable_stopword_orig;
-#eval SET GLOBAL innodb_ft_server_stopword_table=$innodb_ft_server_stopword_table_orig;
-eval SET GLOBAL innodb_ft_server_stopword_table=default;
-#eval SET GLOBAL innodb_ft_user_stopword_table=$innodb_ft_user_stopword_table_orig;
-eval SET SESSION innodb_ft_user_stopword_table=default;
-
-#---------------------------------------------------------------------------------------
-
-select @@innodb_ft_server_stopword_table;
-select @@innodb_ft_enable_stopword;
-select @@innodb_ft_user_stopword_table;
-
-# Create FTS table
-CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT `idx` (title,body)
- ) ENGINE=InnoDB;
-
-# Insert six rows
-INSERT INTO articles (title,body) VALUES
- ('MySQL from Tutorial','DBMS stands for DataBase ...') ,
- ('when To Use MySQL Well','After that you went through a ...'),
- ('where will Optimizing MySQL','In what tutorial we will show ...'),
- ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
- ('MySQL vs. YourSQL','In the following database comparison ...'),
- ('MySQL Security','When configured properly, MySQL ...');
-
-# No records expeced for select
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-# Define a correct formated user stopword table
-create table user_stopword(value varchar(30)) engine = innodb;
-# The set operation should be successful
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-# Define a correct formated server stopword table
-create table server_stopword(value varchar(30)) engine = innodb;
-# The set operation should be successful
-set global innodb_ft_server_stopword_table = "test/server_stopword";
-# Add values into user supplied stop word table
-insert into user_stopword values("this"),("will"),("the");
-
-# Drop existing index and create the FTS index Using Alter Table.
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-
-# Add values into server supplied stop word table
-insert into server_stopword values("what"),("where");
-# Follwoing should return result as server stopword list was empty at create index time
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-
-# Delete stopword from user list
-DELETE FROM user_stopword;
-# Drop existing index and create the FTS index Using Alter Table.
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-# Follwoing should return result even though to server stopword list
-# conatin these words. Session level stopword list takes priority
-# Here user_stopword is set using innodb_ft_user_stopword_table
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-
-# Follwoing should return result as user stopword list was empty at create index time
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-
-# Add values into user supplied stop word table
-insert into user_stopword values("this"),("will"),("the");
-
-# Drop existing index and create the FTS index Using Alter Table.
-ALTER TABLE articles DROP INDEX idx;
-SET SESSION innodb_ft_enable_stopword = 0;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-
-# Session level stopword list takes priority
-SET SESSION innodb_ft_enable_stopword = 1;
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-
-# Make user stopword list deafult so as to server stopword list takes priority
-SET SESSION innodb_ft_enable_stopword = 1;
-SET SESSION innodb_ft_user_stopword_table = default;
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-
-
-DROP TABLE articles,user_stopword,server_stopword;
-
-# Restore Defaults
-eval SET SESSION innodb_ft_enable_stopword=$innodb_ft_enable_stopword_orig;
-eval SET GLOBAL innodb_ft_server_stopword_table=default;
-eval SET SESSION innodb_ft_user_stopword_table=default;
-select @@innodb_ft_server_stopword_table;
-select @@innodb_ft_enable_stopword;
-select @@innodb_ft_user_stopword_table;
-
-#---------------------------------------------------------------------------------------
-# Create FTS table
-CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT `idx` (title,body)
- ) ENGINE=InnoDB;
-
-SHOW CREATE TABLE articles;
-
-# Insert six rows
-INSERT INTO articles (title,body) VALUES
- ('MySQL from Tutorial','DBMS stands for DataBase ...') ,
- ('when To Use MySQL Well','After that you went through a ...'),
- ('where will Optimizing MySQL','In what tutorial we will show ...'),
- ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
- ('MySQL vs. YourSQL','In the following database comparison ...'),
- ('MySQL Security','When configured properly, MySQL ...');
-
-# No records expeced for select
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-# Define a correct formated user stopword table
-create table user_stopword(value varchar(30)) engine = innodb;
-# The set operation should be successful
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-insert into user_stopword values("mysqld"),("DBMS");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+DBMS +mysql" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysqld');
-
-
-# Drop existing index and create the FTS index Using Alter Table.
-# user stopword list will take effect.
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+DBMS +mysql" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysqld');
-
-# set user stopword list empty
-set session innodb_ft_user_stopword_table = default;
-# Define a correct formated user stopword table
-create table server_stopword(value varchar(30)) engine = innodb;
-# The set operation should be successful
-set global innodb_ft_server_stopword_table = "test/server_stopword";
-insert into server_stopword values("root"),("properly");
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+root +mysql" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('properly');
-
-
-# set user stopword list empty
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-# The set operation should be successful
-set global innodb_ft_server_stopword_table = "test/server_stopword";
-# user stopword list take effect as its session level
-# Result expected for select
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+root +mysql" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('properly');
-
-# set user stopword list
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-DELETE FROM user_stopword;
-# The set operation should be successful
-set global innodb_ft_server_stopword_table = "test/server_stopword";
-DELETE FROM server_stopword;
-# user stopword list take affect as its session level
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+wha* +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('what');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+root +mysql" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('properly');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+DBMS +mysql" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysqld');
-
-DROP TABLE articles,user_stopword,server_stopword;
-
-# Restore Values
-eval SET SESSION innodb_ft_enable_stopword=$innodb_ft_enable_stopword_orig;
-eval SET GLOBAL innodb_ft_server_stopword_table=default;
-eval SET SESSION innodb_ft_user_stopword_table=default;
-
-
-#------------------------------------------------------------------------------
-# FTS stopword list test - check varaibles across sessions
-
-# Create FTS table
-CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT `idx` (title,body)
- ) ENGINE=InnoDB;
-
-SHOW CREATE TABLE articles;
-
-# Insert six rows
-INSERT INTO articles (title,body) VALUES
- ('MySQL from Tutorial','DBMS stands for DataBase ...') ,
- ('when To Use MySQL Well','After that you went through a ...'),
- ('where will Optimizing MySQL','In what tutorial we will show ...'),
- ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
- ('MySQL vs. YourSQL','In the following database comparison ...'),
- ('MySQL Security','When configured properly, MySQL ...');
-
-# session varaible innodb_ft_enable_stopword=0 will take effect for new FTS index
-SET SESSION innodb_ft_enable_stopword = 0;
-select @@innodb_ft_enable_stopword;
-
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-
-
---connection con1
-select @@innodb_ft_enable_stopword;
-
-ANALYZE TABLE articles;
-
-# result expected as index created before setting innodb_ft_enable_stopword varaible off
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-
-SET SESSION innodb_ft_enable_stopword = 1;
-select @@innodb_ft_enable_stopword;
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-# no result expected turned innodb_ft_enable_stopword is ON
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-
-
---connection default
-select @@innodb_ft_enable_stopword;
-# no result expected as word not indexed from connection 1
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("where will");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("when");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST ("what" WITH QUERY EXPANSION);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("whe*" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+what +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+from" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+where +(show what)" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@6' IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"where will"@9' IN BOOLEAN MODE);
-
-INSERT INTO articles(title,body) values ('the record will' , 'not index the , will words');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-
-SET SESSION innodb_ft_enable_stopword = 1;
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+the +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOLEAN MODE);
-
-
---connection con1
-SET SESSION innodb_ft_enable_stopword = 1;
-# Define a correct formated user stopword table
-create table user_stopword(value varchar(30)) engine = innodb;
-# The set operation should be successful
-set session innodb_ft_user_stopword_table = "test/user_stopword";
-# Add values into user supplied stop word table
-insert into user_stopword values("this"),("will"),("the");
-# Drop existing index and create the FTS index Using Alter Table.
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-# no result expected as innodb_ft_user_stopword_table filter it
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-
-
---connection default
-# no result expected as innodb_ft_user_stopword_table filter it from connection1
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-select @@innodb_ft_user_stopword_table;
-# Define a correct formated user stopword table
-create table user_stopword_1(value varchar(30)) engine = innodb;
-# The set operation should be successful
-set session innodb_ft_user_stopword_table = "test/user_stopword_1";
-insert into user_stopword_1 values("when");
-SET SESSION innodb_ft_enable_stopword = 1;
-# result expected
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+when" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('when');
-# Drop existing index and create the FTS index Using Alter Table.
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-# no result expected
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+when" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('when');
-
---connection con1
-SET SESSION innodb_ft_enable_stopword = 1;
-SET SESSION innodb_ft_user_stopword_table=default;
-select @@innodb_ft_user_stopword_table;
-select @@innodb_ft_server_stopword_table;
-# Define a correct formated server stopword table
-create table server_stopword(value varchar(30)) engine = innodb;
-# The set operation should be successful
-SET GLOBAL innodb_ft_server_stopword_table = "test/server_stopword";
-select @@innodb_ft_server_stopword_table;
-insert into server_stopword values("when"),("the");
-# Drop existing index and create the FTS index Using Alter Table.
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-# no result expected
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+when" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('the');
-
-disconnect con1;
---source include/wait_until_disconnected.inc
-
---connection default
-SET SESSION innodb_ft_enable_stopword = 1;
-SET SESSION innodb_ft_user_stopword_table=default;
-select @@innodb_ft_server_stopword_table;
-# result expected
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+will +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('where');
-insert into server_stopword values("where"),("will");
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+will +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('where');
-ALTER TABLE articles DROP INDEX idx;
-ALTER TABLE articles ADD FULLTEXT INDEX idx (title,body);
-# no result expected
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+when" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('the');
-SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+will +where" IN BOOLEAN MODE);
-SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('where');
-
-
-DROP TABLE articles,user_stopword,user_stopword_1,server_stopword;
-
-# Restore Values
-eval SET SESSION innodb_ft_enable_stopword=$innodb_ft_enable_stopword_orig;
-eval SET GLOBAL innodb_ft_server_stopword_table=default;
-eval SET SESSION innodb_ft_user_stopword_table=default;
-
diff --git a/mysql-test/suite/innodb_fts/t/innodb_ft_aux_table.test b/mysql-test/suite/innodb_fts/t/innodb_ft_aux_table.test
index 48964aef4fd..f9447aada60 100644
--- a/mysql-test/suite/innodb_fts/t/innodb_ft_aux_table.test
+++ b/mysql-test/suite/innodb_fts/t/innodb_ft_aux_table.test
@@ -1,4 +1,5 @@
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
CREATE TABLE t1 (v VARCHAR(100), FULLTEXT INDEX (v)) ENGINE=InnoDB;
diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_large_records.test b/mysql-test/suite/innodb_fts/t/innodb_fts_large_records.test
index e200cff6c39..c84cd0685ed 100644
--- a/mysql-test/suite/innodb_fts/t/innodb_fts_large_records.test
+++ b/mysql-test/suite/innodb_fts/t/innodb_fts_large_records.test
@@ -3,6 +3,7 @@
# b) more words across records
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
DROP TABLE IF EXISTS t1;
diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_multiple_index.test b/mysql-test/suite/innodb_fts/t/innodb_fts_multiple_index.test
index c8293655d1b..f9535c729ff 100644
--- a/mysql-test/suite/innodb_fts/t/innodb_fts_multiple_index.test
+++ b/mysql-test/suite/innodb_fts/t/innodb_fts_multiple_index.test
@@ -2,6 +2,7 @@
# Test With two FTS index on same table + alter/create/drop index + tnx
#------------------------------------------------------------------------------
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
drop table if exists t1;
diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test b/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test
index 20eee3fac23..e3d8eb0c13b 100644
--- a/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test
+++ b/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test
@@ -1,4 +1,5 @@
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
# This is the DDL function tests for innodb FTS
# Functional testing with FTS proximity search using '@'
diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_result_cache_limit.test b/mysql-test/suite/innodb_fts/t/innodb_fts_result_cache_limit.test
index 669808edbf6..1ec37532a71 100644
--- a/mysql-test/suite/innodb_fts/t/innodb_fts_result_cache_limit.test
+++ b/mysql-test/suite/innodb_fts/t/innodb_fts_result_cache_limit.test
@@ -4,6 +4,7 @@
# Must have debug code to use SET SESSION debug
--source include/have_debug.inc
+--source include/maybe_versioning.inc
# Create FTS table
CREATE TABLE t1 (
diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_stopword_charset.test b/mysql-test/suite/innodb_fts/t/innodb_fts_stopword_charset.test
index 16ee91c30f4..3fe99dab2c3 100644
--- a/mysql-test/suite/innodb_fts/t/innodb_fts_stopword_charset.test
+++ b/mysql-test/suite/innodb_fts/t/innodb_fts_stopword_charset.test
@@ -4,6 +4,7 @@
# Embedded server tests do not support restarting
--source include/not_embedded.inc
+--source include/maybe_versioning.inc
SELECT @@innodb_ft_server_stopword_table;
SELECT @@innodb_ft_enable_stopword;
diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_transaction.test b/mysql-test/suite/innodb_fts/t/innodb_fts_transaction.test
index 11571f346a2..026aeb635cd 100644
--- a/mysql-test/suite/innodb_fts/t/innodb_fts_transaction.test
+++ b/mysql-test/suite/innodb_fts/t/innodb_fts_transaction.test
@@ -5,6 +5,7 @@
# 3) UNCOMMITTED RECORDS CAN BE SEEN WITH QURIES WHICH DO NOT USE FTS INDEX
# this behavior do not break integratity of tables and "select" which do not use FTS still can view them.
--source include/have_innodb.inc
+--source include/maybe_versioning.inc
--disable_warnings
diff --git a/mysql-test/suite/innodb_fts/t/misc_debug.test b/mysql-test/suite/innodb_fts/t/misc_debug.test
index 9246d27a704..229d468201e 100644
--- a/mysql-test/suite/innodb_fts/t/misc_debug.test
+++ b/mysql-test/suite/innodb_fts/t/misc_debug.test
@@ -7,6 +7,7 @@
--source include/have_debug.inc
--source include/have_debug_sync.inc
--source include/count_sessions.inc
+--source include/maybe_versioning.inc
# Following test is for Bug 14668777 - ASSERT ON IB_VECTOR_SIZE(
# TABLE->FTS->INDEXES, ALTER TABLE
@@ -91,7 +92,14 @@ SET @saved_debug_dbug= @@debug_dbug;
CREATE TABLE t1 (b CHAR(12), FULLTEXT KEY(b)) engine=InnoDB;
SET debug_dbug='+d,ib_create_table_fail_too_many_trx';
+if ($MTR_COMBINATION_ORIG)
+{
TRUNCATE t1;
+}
+if (!$MTR_COMBINATION_ORIG)
+{
+--echo TRUNCATE t1;
+}
SET debug_dbug=@saved_debug_dbug;
DROP TABLE t1;
--echo # End of 10.3 tests
diff --git a/mysql-test/suite/innodb_fts/t/stopword.inc b/mysql-test/suite/innodb_fts/t/stopword.inc
new file mode 100644
index 00000000000..774501ade85
--- /dev/null
+++ b/mysql-test/suite/innodb_fts/t/stopword.inc
@@ -0,0 +1,55 @@
+if ($stopword_stage == create_table)
+{
+call mtr.add_suppression("\\[ERROR\\] InnoDB: user stopword table not_defined does not exist.");
+call mtr.add_suppression("\\[ERROR\\] InnoDB: user stopword table test/user_stopword_session does not exist.");
+
+select * from information_schema.innodb_ft_default_stopword;
+
+# Create FTS table
+eval CREATE TABLE $stopword_table (
+ id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
+ title VARCHAR(200),
+ body TEXT,
+ FULLTEXT (title,body)
+ )$create_options ENGINE=InnoDB;
+
+# Insert six rows
+eval INSERT INTO $stopword_table (title,body) VALUES
+ ('MySQL Tutorial','DBMS stands for DataBase ...') ,
+ ('How To Use MySQL Well','After you went through a ...'),
+ ('Optimizing MySQL','In this tutorial we will show ...'),
+ ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
+ ('MySQL vs. YourSQL','In the following database comparison ...'),
+ ('MySQL Security','When configured properly, MySQL ...');
+
+# "the" is in the default stopword, it would not be selected
+eval SELECT * FROM $stopword_table WHERE MATCH (title,body)
+ AGAINST ('the' IN NATURAL LANGUAGE MODE);
+
+# Provide user defined stopword table, if not (correctly) defined,
+# it will be rejected
+--error ER_WRONG_VALUE_FOR_VAR
+set global innodb_ft_server_stopword_table = "not_defined";
+set global innodb_ft_server_stopword_table = NULL;
+
+# Define a correct formatted user stopword table
+eval create table user_stopword(value varchar(30))$create_options engine = innodb;
+
+# The set operation should be successful
+set global innodb_ft_server_stopword_table = "test/user_stopword";
+
+eval drop index title on $stopword_table;
+
+eval create fulltext index idx on $stopword_table(title, body);
+}
+
+if ($stopword_stage == select_1)
+{
+--error 0, ER_INDEX_CORRUPT
+eval SELECT * FROM $stopword_table WHERE MATCH (title,body)
+ AGAINST ('the' IN NATURAL LANGUAGE MODE);
+--error 0, ER_INDEX_CORRUPT
+eval SELECT * FROM $stopword_table WHERE MATCH (title,body)
+ AGAINST ('this' IN NATURAL LANGUAGE MODE);
+
+}
diff --git a/mysql-test/suite/innodb_fts/t/stopword.test b/mysql-test/suite/innodb_fts/t/stopword.test
index 5105a6d2fec..9f8bd89b816 100644
--- a/mysql-test/suite/innodb_fts/t/stopword.test
+++ b/mysql-test/suite/innodb_fts/t/stopword.test
@@ -1,52 +1,16 @@
# This is the basic function tests for innodb FTS
-- source include/have_innodb.inc
-
-call mtr.add_suppression("\\[ERROR\\] InnoDB: user stopword table not_defined does not exist.");
-call mtr.add_suppression("\\[ERROR\\] InnoDB: user stopword table test/user_stopword_session does not exist.");
-
-select * from information_schema.innodb_ft_default_stopword;
-
-# Create FTS table
-CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
- title VARCHAR(200),
- body TEXT,
- FULLTEXT (title,body)
- ) ENGINE=InnoDB;
-
-# Insert six rows
-INSERT INTO articles (title,body) VALUES
- ('MySQL Tutorial','DBMS stands for DataBase ...') ,
- ('How To Use MySQL Well','After you went through a ...'),
- ('Optimizing MySQL','In this tutorial we will show ...'),
- ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
- ('MySQL vs. YourSQL','In the following database comparison ...'),
- ('MySQL Security','When configured properly, MySQL ...');
-
-# "the" is in the default stopword, it would not be selected
-SELECT * FROM articles WHERE MATCH (title,body)
- AGAINST ('the' IN NATURAL LANGUAGE MODE);
+-- let $modify_create_table= 1
+-- source include/maybe_versioning.inc
SET @innodb_ft_server_stopword_table_orig=@@innodb_ft_server_stopword_table;
SET @innodb_ft_enable_stopword_orig=@@innodb_ft_enable_stopword;
SET @innodb_ft_user_stopword_table_orig=@@innodb_ft_user_stopword_table;
-# Provide user defined stopword table, if not (correctly) defined,
-# it will be rejected
---error ER_WRONG_VALUE_FOR_VAR
-set global innodb_ft_server_stopword_table = "not_defined";
-set global innodb_ft_server_stopword_table = NULL;
-
-# Define a correct formated user stopword table
-create table user_stopword(value varchar(30)) engine = innodb;
-
-# The set operation should be successful
-set global innodb_ft_server_stopword_table = "test/user_stopword";
-
-drop index title on articles;
-
-create fulltext index idx on articles(title, body);
+let $stopword_table= articles;
+let $stopword_stage= create_table;
+--source stopword.inc
# Now we should be able to find "the"
SELECT * FROM articles WHERE MATCH (title,body)
@@ -55,12 +19,12 @@ SELECT * FROM articles WHERE MATCH (title,body)
# Nothing inserted into the default stopword, so essentially
# nothing get screened. The new stopword could only be
# effective for table created thereafter
-CREATE TABLE articles_2 (
+eval CREATE TABLE articles_2 (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
- ) ENGINE=InnoDB;
+ )$create_options ENGINE=InnoDB;
INSERT INTO articles_2 (title, body)
VALUES ('test for stopwords','this is it...');
@@ -71,15 +35,17 @@ SELECT * FROM articles_2 WHERE MATCH (title,body)
# Ok, let's instantiate some value into user supplied stop word
# table
+insert into user_stopword values("the");
+delete from user_stopword;
insert into user_stopword values("this");
# Ok, let's repeat with the new table again.
-CREATE TABLE articles_3 (
+eval CREATE TABLE articles_3 (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
- ) ENGINE=InnoDB;
+ )$create_options ENGINE=InnoDB;
INSERT INTO articles_3 (title, body)
VALUES ('test for stopwords','this is it...');
@@ -89,18 +55,20 @@ SELECT * FROM articles_3 WHERE MATCH (title,body)
AGAINST ('this' IN NATURAL LANGUAGE MODE);
# Test session level stopword control "innodb_user_stopword_table"
-create table user_stopword_session(value varchar(30)) engine = innodb;
+eval create table user_stopword_session(value varchar(30))$create_options engine = innodb;
+insert into user_stopword values("this");
+delete from user_stopword;
insert into user_stopword_session values("session");
set session innodb_ft_user_stopword_table="test/user_stopword_session";
-CREATE TABLE articles_4 (
+eval CREATE TABLE articles_4 (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
- ) ENGINE=InnoDB;
+ )$create_options ENGINE=InnoDB;
INSERT INTO articles_4 (title, body)
VALUES ('test for session stopwords','this should also be excluded...');
@@ -114,12 +82,12 @@ SELECT * FROM articles_4 WHERE MATCH (title,body)
AGAINST ('this' IN NATURAL LANGUAGE MODE);
--connect (con1,localhost,root,,)
-CREATE TABLE articles_5 (
+eval CREATE TABLE articles_5 (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
- ) ENGINE=InnoDB;
+ )$create_options ENGINE=InnoDB;
INSERT INTO articles_5 (title, body)
VALUES ('test for session stopwords','this should also be excluded...');
@@ -153,12 +121,12 @@ SET GLOBAL innodb_ft_server_stopword_table=default;
# the settings.
# Create FTS table
-CREATE TABLE articles (
+eval CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT `idx` (title,body)
- ) ENGINE=InnoDB;
+ )$create_options ENGINE=InnoDB;
SHOW CREATE TABLE articles;
@@ -292,12 +260,12 @@ SET GLOBAL innodb_ft_user_stopword_table=@innodb_ft_user_stopword_table_orig;
SET SESSION innodb_ft_user_stopword_table=default;
# Create FTS table
-CREATE TABLE articles (
+eval CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT `idx` (title,body)
- ) ENGINE=InnoDB;
+ )$create_options ENGINE=InnoDB;
# Insert six rows
INSERT INTO articles (title,body) VALUES
@@ -311,15 +279,17 @@ INSERT INTO articles (title,body) VALUES
# No records expeced for select
SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-# Define a correct formated user stopword table
-create table user_stopword(value varchar(30)) engine = innodb;
+# Define a correct formatted user stopword table
+eval create table user_stopword(value varchar(30))$create_options engine = innodb;
# The set operation should be successful
set session innodb_ft_user_stopword_table = "test/user_stopword";
-# Define a correct formated server stopword table
-create table server_stopword(value varchar(30)) engine = innodb;
+# Define a correct formatted server stopword table
+eval create table server_stopword(value varchar(30))$create_options engine = innodb;
# The set operation should be successful
set global innodb_ft_server_stopword_table = "test/server_stopword";
# Add values into user supplied stop word table
+insert into user_stopword values("when"),("where");
+delete from user_stopword;
insert into user_stopword values("this"),("will"),("the");
# Drop existing index and create the FTS index Using Alter Table.
@@ -390,12 +360,12 @@ SET SESSION innodb_ft_user_stopword_table=default;
#---------------------------------------------------------------------------------------
# Create FTS table
-CREATE TABLE articles (
+eval CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT `idx` (title,body)
- ) ENGINE=InnoDB;
+ )$create_options ENGINE=InnoDB;
SHOW CREATE TABLE articles;
@@ -411,8 +381,8 @@ INSERT INTO articles (title,body) VALUES
# No records expeced for select
SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
-# Define a correct formated user stopword table
-create table user_stopword(value varchar(30)) engine = innodb;
+# Define a correct formatted user stopword table
+eval create table user_stopword(value varchar(30))$create_options engine = innodb;
# The set operation should be successful
set session innodb_ft_user_stopword_table = "test/user_stopword";
insert into user_stopword values("mysqld"),("DBMS");
@@ -433,8 +403,8 @@ SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('mysqld');
# set user stopword list empty
set session innodb_ft_user_stopword_table = default;
-# Define a correct formated user stopword table
-create table server_stopword(value varchar(30)) engine = innodb;
+# Define a correct formatted user stopword table
+eval create table server_stopword(value varchar(30))$create_options engine = innodb;
# The set operation should be successful
set global innodb_ft_server_stopword_table = "test/server_stopword";
insert into server_stopword values("root"),("properly");
@@ -487,12 +457,12 @@ SET SESSION innodb_ft_user_stopword_table=default;
# FTS stopword list test - check varaibles across sessions
# Create FTS table
-CREATE TABLE articles (
+eval CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT `idx` (title,body)
- ) ENGINE=InnoDB;
+ )$create_options ENGINE=InnoDB;
SHOW CREATE TABLE articles;
@@ -572,8 +542,8 @@ SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('"the will"@11' IN BOOL
--echo "In connection 1"
--connection con1
SET SESSION innodb_ft_enable_stopword = 1;
-# Define a correct formated user stopword table
-create table user_stopword(value varchar(30)) engine = innodb;
+# Define a correct formatted user stopword table
+eval create table user_stopword(value varchar(30))$create_options engine = innodb;
# The set operation should be successful
set session innodb_ft_user_stopword_table = "test/user_stopword";
# Add values into user supplied stop word table
@@ -592,8 +562,8 @@ SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
SELECT * FROM articles WHERE MATCH(title,body) AGAINST("+show +will" IN BOOLEAN MODE);
SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('will');
select @@innodb_ft_user_stopword_table;
-# Define a correct formated user stopword table
-create table user_stopword_1(value varchar(30)) engine = innodb;
+# Define a correct formatted user stopword table
+eval create table user_stopword_1(value varchar(30))$create_options engine = innodb;
# The set operation should be successful
set session innodb_ft_user_stopword_table = "test/user_stopword_1";
insert into user_stopword_1 values("when");
@@ -614,8 +584,8 @@ SET SESSION innodb_ft_enable_stopword = 1;
SET SESSION innodb_ft_user_stopword_table=default;
select @@innodb_ft_user_stopword_table;
select @@innodb_ft_server_stopword_table;
-# Define a correct formated server stopword table
-create table server_stopword(value varchar(30)) engine = innodb;
+# Define a correct formatted server stopword table
+eval create table server_stopword(value varchar(30))$create_options engine = innodb;
# The set operation should be successful
SET GLOBAL innodb_ft_server_stopword_table = "test/server_stopword";
select @@innodb_ft_server_stopword_table;
diff --git a/mysql-test/suite/innodb_fts/t/sync.test b/mysql-test/suite/innodb_fts/t/sync.test
index 92c21c9ac83..49663f20b8a 100644
--- a/mysql-test/suite/innodb_fts/t/sync.test
+++ b/mysql-test/suite/innodb_fts/t/sync.test
@@ -7,6 +7,7 @@
--source include/not_valgrind.inc
--source include/not_embedded.inc
--source include/not_crashrep.inc
+--source include/maybe_versioning.inc
connect (con1,localhost,root,,);
connection default;
diff --git a/mysql-test/suite/innodb_fts/t/sync_ddl.test b/mysql-test/suite/innodb_fts/t/sync_ddl.test
index 2950297d5bb..6a16ececa60 100644
--- a/mysql-test/suite/innodb_fts/t/sync_ddl.test
+++ b/mysql-test/suite/innodb_fts/t/sync_ddl.test
@@ -4,6 +4,7 @@
--source include/have_innodb.inc
--source include/have_debug.inc
+--source include/maybe_versioning.inc
#--------------------------------------
# Check FTS_sync vs TRUNCATE (1)
@@ -23,7 +24,16 @@ INSERT INTO t1 (value) VALUES
('By default or with the IN NATURAL LANGUAGE MODE modifier')
;
+let $vers=$MTR_COMBINATION_VERS+$MTR_COMBINATION_VERS_TRX;
+
+if ($vers)
+{
+--echo TRUNCATE TABLE t1;
+}
+if (!$vers)
+{
TRUNCATE TABLE t1;
+}
DROP TABLE t1;
@@ -54,7 +64,14 @@ INSERT INTO t1 (value) VALUES
('collation of latin1_bin to make it case sensitive')
;
+if ($vers)
+{
+--echo TRUNCATE TABLE t1;
+}
+if (!$vers)
+{
TRUNCATE TABLE t1;
+}
DROP TABLE t1;
diff --git a/mysql-test/suite/innodb_fts/t/versioning.combinations b/mysql-test/suite/innodb_fts/t/versioning.combinations
new file mode 100644
index 00000000000..42842ba51a6
--- /dev/null
+++ b/mysql-test/suite/innodb_fts/t/versioning.combinations
@@ -0,0 +1,2 @@
+[prepare]
+[upgrade]
diff --git a/mysql-test/suite/innodb_fts/t/versioning.opt b/mysql-test/suite/innodb_fts/t/versioning.opt
new file mode 100644
index 00000000000..df323743314
--- /dev/null
+++ b/mysql-test/suite/innodb_fts/t/versioning.opt
@@ -0,0 +1,2 @@
+--innodb-file-per-table=0
+--innodb-doublewrite=0
diff --git a/mysql-test/suite/innodb_fts/t/versioning.test b/mysql-test/suite/innodb_fts/t/versioning.test
new file mode 100644
index 00000000000..f615f58e0d2
--- /dev/null
+++ b/mysql-test/suite/innodb_fts/t/versioning.test
@@ -0,0 +1,143 @@
+--source include/have_innodb.inc
+--source include/have_gzip.inc
+--source include/not_embedded.inc
+
+# Combinations
+#
+# upgrade: test upgrade on prepared databases from std_data.
+# prepare: requires $OLD_BINDIR, test upgrade and downgrade with old-version
+# server. Also prepare std_data files during the run in the source
+# directory (you just have to commit or reject them).
+#
+# Examples
+#
+# export OLD_BINDIR="/home/midenok/src/mariadb/10.3b/build"
+# ./mtr innodb_fts.versioning,prepare
+#
+
+if ($MTR_COMBINATION_PREPARE)
+{
+ if (!$OLD_BINDIR)
+ {
+ --skip Requires OLD_BINDIR parameter (see test comment)
+ }
+}
+
+--let $server_id= `select @@server_id`
+--let $datadir= `select @@datadir`
+--let $std_dir= $MYSQL_TEST_DIR/std_data/versioning
+--let $restart_noprint= 3
+
+--echo # Upgrade test
+let $stopword_table= articles2;
+
+if ($MTR_COMBINATION_PREPARE)
+{
+ let $restart_bindir= $OLD_BINDIR;
+ --source include/restart_mysqld.inc
+
+ let $create_options= with system versioning;
+ let $basic_stage= create_table;
+ --source basic.inc
+ let $basic_stage= insert_1;
+ --source basic.inc
+ let $basic_stage= insert_2;
+ --source basic.inc
+ let $basic_stage= insert_3;
+ --source basic.inc
+ let $stopword_stage= create_table;
+ --source stopword.inc
+ eval insert into $stopword_table (title, body)
+ values ('test for stopwords','this is it...');
+ insert into user_stopword values("the");
+ delete from user_stopword;
+ insert into user_stopword values("this");
+ --source include/shutdown_mysqld.inc
+
+ --exec mkdir -p $std_dir
+ --exec cp -af $datadir/ibdata1 $datadir/test/*.frm $std_dir
+ # zero out the doublewrite buffer
+ --exec dd if=/dev/zero of=$std_dir/ibdata1 bs=16k seek=64 count=128 conv=notrunc
+ --exec gzip -9f $std_dir/ibdata1 $std_dir/*.frm
+}
+
+if ($MTR_COMBINATION_UPGRADE)
+{
+--disable_query_log
+call mtr.add_suppression("InnoDB: Table `mysql`.\`innodb_(table|index)_stats`");
+--enable_query_log
+ --source include/shutdown_mysqld.inc
+ --exec rm -f $datadir/test/*.ibd $datadir/ib*
+ --exec cp -af $std_dir/ibdata1.gz $datadir
+ --exec cp -af $std_dir/*.frm.gz $datadir/test
+ --exec gzip -df $datadir/ibdata1.gz $datadir/test/*.frm.gz
+}
+let $restart_bindir=;
+--source include/start_mysqld.inc
+
+if ($MTR_COMBINATION_UPGRADE)
+{
+# The system tablespace was replaced with a 10.3 one that contains
+# the InnoDB statistics tables. These tables are corrupted from our
+# point of view. Drop the tables, but retain the .frm files to keep
+# mtr.check_testcase() happy.
+--move_file $datadir/mysql/innodb_index_stats.frm $datadir/iis.frm
+--move_file $datadir/mysql/innodb_table_stats.frm $datadir/its.frm
+DROP TABLE mysql.innodb_table_stats, mysql.innodb_index_stats;
+--move_file $datadir/its.frm $datadir/mysql/innodb_table_stats.frm
+--move_file $datadir/iis.frm $datadir/mysql/innodb_index_stats.frm
+}
+--error ER_INDEX_CORRUPT
+SELECT * FROM articles WHERE MATCH (title,body)
+AGAINST ('Database' IN NATURAL LANGUAGE MODE);
+
+call mtr.add_suppression("test/articles.? contains 3 indexes inside InnoDB");
+alter table articles force;
+flush tables;
+show create table articles;
+
+let $basic_stage= select_1;
+source basic.inc;
+let $basic_stage= select_2;
+source basic.inc;
+let $basic_stage= select_3;
+source basic.inc;
+
+set global innodb_ft_server_stopword_table= "test/user_stopword";
+let $stopword_stage= select_1;
+--source stopword.inc
+eval drop index idx on $stopword_table;
+eval create fulltext index idx on $stopword_table(title, body);
+--source stopword.inc
+
+if ($MTR_COMBINATION_PREPARE)
+{
+ --echo # Downgrade test
+ let $restart_bindir= $OLD_BINDIR;
+ --source include/restart_mysqld.inc
+
+ alter table articles force;
+ flush tables;
+ show create table articles;
+ let $basic_stage= select_1;
+ source basic.inc;
+ let $basic_stage= select_2;
+ source basic.inc;
+ let $basic_stage= select_3;
+ source basic.inc;
+
+ set global innodb_ft_server_stopword_table= "test/user_stopword";
+ let $stopword_stage= select_1;
+ # Downgrade faults with assertion "dict_index_get_n_unique(index) == 1"
+ # until we rebuilt the index:
+ eval drop index idx on $stopword_table;
+ eval create fulltext index idx on $stopword_table(title, body);
+ source stopword.inc;
+
+ let $restart_bindir=;
+ --source include/restart_mysqld.inc
+}
+
+--echo # Cleanup
+eval drop tables articles, $stopword_table, user_stopword;
+set global innodb_ft_server_stopword_table= default;
diff --git a/mysql-test/suite/mariabackup/incremental_backup.test b/mysql-test/suite/mariabackup/incremental_backup.test
index fed2d5e60a9..62e4f9c6875 100644
--- a/mysql-test/suite/mariabackup/incremental_backup.test
+++ b/mysql-test/suite/mariabackup/incremental_backup.test
@@ -34,7 +34,7 @@ INSERT INTO t VALUES(1);
echo # Create full backup , modify table, then create incremental/differential backup;
--disable_result_log
-exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir;
+exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir --throttle=1000;
--enable_result_log
BEGIN;
INSERT INTO t VALUES(0);
diff --git a/mysql-test/suite/parts/t/partition_repair_myisam.test b/mysql-test/suite/parts/t/partition_repair_myisam.test
index 3f43127a0c8..c4c05cc08d3 100644
--- a/mysql-test/suite/parts/t/partition_repair_myisam.test
+++ b/mysql-test/suite/parts/t/partition_repair_myisam.test
@@ -150,7 +150,7 @@ while ($i)
# 2 - after _mi_mark_file_changed (only marked index as opened)
# 3 - after write_record (updated datafile + not closed/updated index)
# 4 - after flush_cached_blocks (updated index/datafiles, not closed index)
-# 5 - (Not used) after mi_state_info_write (fully uppdated/closed index file)
+# 5 - (Not used) after mi_state_info_write (fully updated/closed index file)
# (this was verified to be a harmless crash, since everything was written)
# 6 - partly updated datafile (insert 6 small records, delete 5,3,1,
# insert one larger record (2.5 X small) and break in gdb before it has
diff --git a/mysql-test/suite/perfschema/t/statement_program_concurrency.test b/mysql-test/suite/perfschema/t/statement_program_concurrency.test
index 75261254c00..8229223caec 100644
--- a/mysql-test/suite/perfschema/t/statement_program_concurrency.test
+++ b/mysql-test/suite/perfschema/t/statement_program_concurrency.test
@@ -91,7 +91,9 @@ connection con3;
--reap;
connection default;
---source include/wait_until_connected_again.inc
+
+--let $wait_condition=select count(*)=3 from information_schema.processlist where command='sleep';
+--source include/wait_condition.inc
SELECT OBJECT_TYPE, OBJECT_SCHEMA, OBJECT_NAME, COUNT_STAR, COUNT_STATEMENTS
FROM performance_schema.events_statements_summary_by_program
diff --git a/mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result b/mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result
index a0f33091297..425aa1b127f 100644
--- a/mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result
+++ b/mysql-test/suite/vcol/r/vcol_blocked_sql_funcs.result
@@ -191,7 +191,7 @@ create or replace table t1 (a int, b int as (stddev_pop(a)));
ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
# STDDEV_SAMP()
create or replace table t1 (a int, b int as (stddev_samp(a)));
-ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
+ERROR HY000: Function or expression 'stddev_samp()' cannot be used in the GENERATED ALWAYS AS clause of `b`
# STDDEV()
create or replace table t1 (a int, b int as (stddev(a)));
ERROR HY000: Function or expression 'std()' cannot be used in the GENERATED ALWAYS AS clause of `b`
diff --git a/mysql-test/suite/versioning/r/alter.result b/mysql-test/suite/versioning/r/alter.result
index f92e530eacf..9751f7c718d 100644
--- a/mysql-test/suite/versioning/r/alter.result
+++ b/mysql-test/suite/versioning/r/alter.result
@@ -377,6 +377,11 @@ a b
2 NULL
3 1
4 2
+alter table t add c int, drop system versioning;
+select * from t;
+a b c
+3 1 NULL
+4 2 NULL
create or replace table t (a int) with system versioning;
insert into t values (1), (2), (3);
delete from t where a<3;
diff --git a/mysql-test/suite/versioning/r/debug.result b/mysql-test/suite/versioning/r/debug.result
index 4ea6c6202bc..3efddd40275 100644
--- a/mysql-test/suite/versioning/r/debug.result
+++ b/mysql-test/suite/versioning/r/debug.result
@@ -19,7 +19,7 @@ show create table tt2;
Table Create Table
tt2 CREATE TEMPORARY TABLE `tt2` (
`a` int(11) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
connect con1, localhost, root;
create table t3 (a int);
show create table t3;
@@ -32,7 +32,7 @@ show create table tt3;
Table Create Table
tt3 CREATE TEMPORARY TABLE `tt3` (
`a` int(11) DEFAULT NULL
-) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
disconnect con1;
connection default;
set debug_dbug='+d,sysvers_show';
diff --git a/mysql-test/suite/versioning/r/delete.result b/mysql-test/suite/versioning/r/delete.result
index 0f9e2c22130..6f8c8921790 100644
--- a/mysql-test/suite/versioning/r/delete.result
+++ b/mysql-test/suite/versioning/r/delete.result
@@ -146,6 +146,5 @@ delete from t1;
select f1, f3, check_row_ts(row_start, row_end) from t1 for system_time all;
f1 f3 check_row_ts(row_start, row_end)
1 1 HISTORICAL ROW
-1 NULL ERROR: row_end == row_start
1 1 HISTORICAL ROW
drop table t1;
diff --git a/mysql-test/suite/versioning/r/delete_history.result b/mysql-test/suite/versioning/r/delete_history.result
index a44342bd4cd..cf68536d4a6 100644
--- a/mysql-test/suite/versioning/r/delete_history.result
+++ b/mysql-test/suite/versioning/r/delete_history.result
@@ -1,3 +1,5 @@
+set @saved_frequency= @@global.innodb_purge_rseg_truncate_frequency;
+set global innodb_purge_rseg_truncate_frequency= 1;
call mtr.add_suppression("need more HISTORY partitions");
create table t (a int);
delete history from t before system_time now();
@@ -188,6 +190,26 @@ x
drop prepare stmt;
drop table t1;
#
+# MDEV-25004 Missing row in FTS_DOC_ID_INDEX during DELETE HISTORY
+#
+create table t1 (a integer, c0 varchar(255), fulltext key (c0))
+with system versioning engine innodb;
+set system_versioning_alter_history= keep;
+alter table t1 drop system versioning;
+alter table t1 add system versioning;
+insert into t1 values (1, 'politician');
+update t1 set c0= 'criminal';
+InnoDB 0 transactions not purged
+delete history from t1;
+drop table t1;
+create table t1 (id int primary key, ftx varchar(255))
+with system versioning engine innodb;
+insert into t1 values (1, 'c');
+delete from t1;
+alter table t1 add fulltext key(ftx);
+drop table t1;
+set global innodb_purge_rseg_truncate_frequency= @saved_frequency;
+#
# MDEV-28201 Server crashes upon SHOW ANALYZE/EXPLAIN FORMAT=JSON
#
CREATE TABLE t1 (a INT) WITH SYSTEM VERSIONING;
@@ -199,3 +221,4 @@ DELETE HISTORY FROM v1;
ERROR HY000: The target table v1 of the DELETE is not updatable
DROP VIEW v1;
DROP TABLE t1;
+# End of 10.4 tests
diff --git a/mysql-test/suite/versioning/r/foreign.result b/mysql-test/suite/versioning/r/foreign.result
index 3c8508507fd..8a779be760a 100644
--- a/mysql-test/suite/versioning/r/foreign.result
+++ b/mysql-test/suite/versioning/r/foreign.result
@@ -445,6 +445,43 @@ pk f1 f2 left(f3, 4) check_row_ts(row_start, row_end)
1 8 8 SHOR HISTORICAL ROW
2 8 8 LONG HISTORICAL ROW
drop table t1;
+# Shorter case for clustered index (MDEV-25004)
+create table t1 (
+y int primary key, r int, f int, key (r),
+foreign key (f) references t1 (r) on delete set null)
+with system versioning engine innodb;
+insert into t1 values (1, 6, 6), (2, 6, 6);
+delete from t1;
+select *, check_row_ts(row_start, row_end) from t1 for system_time all;
+y r f check_row_ts(row_start, row_end)
+1 6 6 HISTORICAL ROW
+2 6 6 HISTORICAL ROW
+drop tables t1;
+# Secondary unique index
+create table t1 (
+y int unique null, r int, f int, key (r),
+foreign key (f) references t1 (r) on delete set null)
+with system versioning engine innodb;
+insert into t1 values (1, 6, 6), (2, 6, 6);
+delete from t1;
+select *, check_row_ts(row_start, row_end) from t1 for system_time all;
+y r f check_row_ts(row_start, row_end)
+1 6 6 HISTORICAL ROW
+2 6 6 HISTORICAL ROW
+drop tables t1;
+# Non-unique index cannot be fixed because it does not trigger duplicate error
+create table t1 (
+y int, r int, f int, key (y), key (r),
+foreign key (f) references t1 (r) on delete set null)
+with system versioning engine innodb;
+insert into t1 values (1, 6, 6), (2, 6, 6);
+delete from t1;
+select *, check_row_ts(row_start, row_end) from t1 for system_time all;
+y r f check_row_ts(row_start, row_end)
+1 6 6 HISTORICAL ROW
+2 6 NULL ERROR: row_end == row_start
+2 6 6 HISTORICAL ROW
+drop tables t1;
#
# MDEV-21555 Assertion secondary index is out of sync on delete from versioned table
#
diff --git a/mysql-test/suite/versioning/t/alter.test b/mysql-test/suite/versioning/t/alter.test
index 76185afd523..61653550389 100644
--- a/mysql-test/suite/versioning/t/alter.test
+++ b/mysql-test/suite/versioning/t/alter.test
@@ -266,6 +266,8 @@ select * from t;
select * from t for system_time all;
insert into t values (4, 0);
select * from t for system_time all;
+alter table t add c int, drop system versioning;
+select * from t;
create or replace table t (a int) with system versioning;
insert into t values (1), (2), (3);
diff --git a/mysql-test/suite/versioning/t/delete_history.test b/mysql-test/suite/versioning/t/delete_history.test
index 535e6a0c3fe..042670bcfec 100644
--- a/mysql-test/suite/versioning/t/delete_history.test
+++ b/mysql-test/suite/versioning/t/delete_history.test
@@ -2,6 +2,9 @@
--source include/have_partition.inc
--source suite/versioning/engines.inc
+set @saved_frequency= @@global.innodb_purge_rseg_truncate_frequency;
+set global innodb_purge_rseg_truncate_frequency= 1;
+
call mtr.add_suppression("need more HISTORY partitions");
create table t (a int);
@@ -192,6 +195,29 @@ drop prepare stmt;
drop table t1;
--echo #
+--echo # MDEV-25004 Missing row in FTS_DOC_ID_INDEX during DELETE HISTORY
+--echo #
+create table t1 (a integer, c0 varchar(255), fulltext key (c0))
+with system versioning engine innodb;
+set system_versioning_alter_history= keep;
+alter table t1 drop system versioning;
+alter table t1 add system versioning;
+insert into t1 values (1, 'politician');
+update t1 set c0= 'criminal';
+--source suite/innodb/include/wait_all_purged.inc
+delete history from t1;
+drop table t1;
+
+create table t1 (id int primary key, ftx varchar(255))
+with system versioning engine innodb;
+insert into t1 values (1, 'c');
+delete from t1;
+alter table t1 add fulltext key(ftx);
+drop table t1;
+
+set global innodb_purge_rseg_truncate_frequency= @saved_frequency;
+
+--echo #
--echo # MDEV-28201 Server crashes upon SHOW ANALYZE/EXPLAIN FORMAT=JSON
--echo #
CREATE TABLE t1 (a INT) WITH SYSTEM VERSIONING;
@@ -204,4 +230,6 @@ DELETE HISTORY FROM v1;
DROP VIEW v1;
DROP TABLE t1;
+--echo # End of 10.4 tests
+
--source suite/versioning/common_finish.inc
diff --git a/mysql-test/suite/versioning/t/foreign.test b/mysql-test/suite/versioning/t/foreign.test
index 934053f83ba..4aa6b21a039 100644
--- a/mysql-test/suite/versioning/t/foreign.test
+++ b/mysql-test/suite/versioning/t/foreign.test
@@ -478,6 +478,39 @@ select pk, f1, f2, left(f3, 4), check_row_ts(row_start, row_end) from t1 for sys
# cleanup
drop table t1;
+--echo # Shorter case for clustered index (MDEV-25004)
+create table t1 (
+ y int primary key, r int, f int, key (r),
+ foreign key (f) references t1 (r) on delete set null)
+with system versioning engine innodb;
+
+insert into t1 values (1, 6, 6), (2, 6, 6);
+delete from t1;
+select *, check_row_ts(row_start, row_end) from t1 for system_time all;
+drop tables t1;
+
+--echo # Secondary unique index
+create table t1 (
+ y int unique null, r int, f int, key (r),
+ foreign key (f) references t1 (r) on delete set null)
+with system versioning engine innodb;
+
+insert into t1 values (1, 6, 6), (2, 6, 6);
+delete from t1;
+select *, check_row_ts(row_start, row_end) from t1 for system_time all;
+drop tables t1;
+
+--echo # Non-unique index cannot be fixed because it does not trigger duplicate error
+create table t1 (
+ y int, r int, f int, key (y), key (r),
+ foreign key (f) references t1 (r) on delete set null)
+with system versioning engine innodb;
+
+insert into t1 values (1, 6, 6), (2, 6, 6);
+delete from t1;
+select *, check_row_ts(row_start, row_end) from t1 for system_time all;
+drop tables t1;
+
--echo #
--echo # MDEV-21555 Assertion secondary index is out of sync on delete from versioned table
--echo #
diff --git a/mysql-test/suite/wsrep/common.pm b/mysql-test/suite/wsrep/common.pm
index 8ac3b3ea94c..54ce8826563 100644
--- a/mysql-test/suite/wsrep/common.pm
+++ b/mysql-test/suite/wsrep/common.pm
@@ -43,10 +43,10 @@ sub check_wsrep_support() {
mtr_error("No SST scripts") unless $spath;
$ENV{PATH}="$spath:$ENV{PATH}";
- # ADD mysql client library path to path so that wsrep_notify_cmd can find mysql
- # client for loading the tables. (Don't assume each machine has mysql install)
- my ($cpath) = grep { -f "$_/mysql"; } "$::bindir/scripts", $::path_client_bindir;
- mtr_error("No scritps") unless $cpath;
+ # ADD mariadb client to path so that wsrep_notify_cmd can find mariadb
+ # client for loading the tables. (Don't assume each machine has mariadb installed)
+ my ($cpath) = grep { -f "$_/mariadb"; } "$::bindir/scripts", $::path_client_bindir;
+ mtr_error("No mariadb client found") unless $cpath;
$ENV{PATH}="$cpath:$ENV{PATH}" unless $cpath eq $spath;
# ADD my_print_defaults script path to path so that SST scripts can find it