Browse Source

Merge 10.5 into 10.6

bb-10.6-MDEV-24269-galera
Marko Mäkelä 1 year ago
parent
commit
a687cf8661
  1. 10
      appveyor.yml
  2. 13
      include/my_rdtsc.h
  3. 4
      man/myisamchk.1
  4. 4
      man/mysql_upgrade.1
  5. 2
      man/mysqladmin.1
  6. 8
      man/mysqlbinlog.1
  7. 2
      man/mysqlcheck.1
  8. 2
      man/mysqld_safe.1
  9. 2
      man/mysqldump.1
  10. 11
      mysql-test/main/func_json.result
  11. 12
      mysql-test/main/func_json.test
  12. 2
      mysql-test/main/sp-vars.result
  13. 40
      mysql-test/main/type_char.result
  14. 19
      mysql-test/main/type_char.test
  15. 8
      mysql-test/main/type_varchar.result
  16. 174
      mysql-test/main/win.result
  17. 93
      mysql-test/main/win.test
  18. 12
      mysql-test/main/xml.result
  19. 8
      mysql-test/mariadb-test-run.pl
  20. 174
      mysql-test/suite/encryption/r/tempfiles_encrypted.result
  21. 16
      mysql-test/suite/funcs_1/r/innodb_func_view.result
  22. 16
      mysql-test/suite/funcs_1/r/memory_func_view.result
  23. 16
      mysql-test/suite/funcs_1/r/myisam_func_view.result
  24. 1
      mysql-test/suite/galera/disabled.def
  25. 3
      mysql-test/suite/galera/galera_2nodes_as_master.cnf
  26. 3
      mysql-test/suite/galera/galera_2nodes_as_slave.cnf
  27. 6
      mysql-test/suite/galera/galera_2x2nodes.cnf
  28. 3
      mysql-test/suite/galera/galera_3nodes_as_slave.cnf
  29. 3
      mysql-test/suite/galera/galera_4nodes.cnf
  30. 6
      mysql-test/suite/galera/r/MDEV-33523.result
  31. 6
      mysql-test/suite/galera/r/galera_as_slave_gtid_myisam.result
  32. 11
      mysql-test/suite/galera/r/galera_bf_kill.result
  33. 13
      mysql-test/suite/galera/r/galera_create_table_as_select.result
  34. 71
      mysql-test/suite/galera/r/galera_replica_no_gtid.result
  35. 11
      mysql-test/suite/galera/t/MDEV-33523.test
  36. 14
      mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test
  37. 28
      mysql-test/suite/galera/t/galera_bf_kill.test
  38. 22
      mysql-test/suite/galera/t/galera_create_table_as_select.test
  39. 9
      mysql-test/suite/galera/t/galera_replica_no_gtid.cnf
  40. 124
      mysql-test/suite/galera/t/galera_replica_no_gtid.test
  41. 3
      mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf
  42. 3
      mysql-test/suite/galera_3nodes/galera_3nodes.cnf
  43. 166
      mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result
  44. 8
      mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf
  45. 39
      mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test
  46. 63
      mysql-test/suite/innodb_fts/r/fts_sync_commit_resiliency.result
  47. 1
      mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.opt
  48. 47
      mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.test
  49. 6
      mysql-test/suite/maria/range.result
  50. 22
      mysql-test/suite/maria/range.test
  51. 12
      scripts/wsrep_sst_mariabackup.sh
  52. 40
      sql/field.cc
  53. 1
      sql/field.h
  54. 3
      sql/ha_partition.cc
  55. 20
      sql/item_jsonfunc.cc
  56. 4
      sql/item_sum.cc
  57. 14
      sql/log.cc
  58. 5
      sql/log_event_server.cc
  59. 16
      sql/rpl_gtid.cc
  60. 4
      sql/sql_locale.cc
  61. 2
      sql/transaction.cc
  62. 4
      storage/innobase/fil/fil0fil.cc
  63. 165
      storage/innobase/fts/fts0fts.cc
  64. 26
      storage/innobase/include/ut0counter.h
  65. 2
      storage/innobase/log/log0sync.cc
  66. 15
      storage/maria/ma_range.c
  67. 12
      storage/mroonga/vendor/groonga/lib/CMakeLists.txt
  68. 36
      storage/spider/mysql-test/spider/bugfix/r/mdev_27186.result
  69. 4
      storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result
  70. 1
      storage/spider/mysql-test/spider/bugfix/t/mdev_27186.opt
  71. 37
      storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test
  72. 4
      storage/spider/spd_db_mysql.cc
  73. 2
      storage/spider/spd_db_oracle.cc
  74. 8
      storage/spider/spd_err.h
  75. 2
      wsrep-lib

10
appveyor.yml

@ -27,4 +27,14 @@ test_script:
- set /A parallel=4*%NUMBER_OF_PROCESSORS%
- perl mysql-test-run.pl --force --max-test-fail=10 --retry=2 --parallel=%parallel% --testcase-timeout=4 --suite=main --skip-test-list=%APPVEYOR_BUILD_FOLDER%\win\appveyor_skip_tests.txt --mysqld=--loose-innodb-flush-log-at-trx-commit=2
skip_commits:
files:
- debian/
- '**/*.sh'
branches:
only:
- /bb-/
- /\d+\.\d+$/
image: Visual Studio 2022

13
include/my_rdtsc.h

@ -179,10 +179,23 @@ static inline ulonglong my_timer_cycles(void)
/* gethrtime may appear as either cycle or nanosecond counter */
return (ulonglong) gethrtime();
#else
# define MY_TIMER_CYCLES_IS_ZERO
return 0;
#endif
}
#ifdef MY_TIMER_CYCLES_IS_ZERO
static inline size_t my_pseudo_random(void)
{
/* In some platforms, pthread_self() might return a structure
that cannot be converted to a number like this. Possible alternatives
could include gettid() or sched_getcpu(). */
return ((size_t) pthread_self()) / 16;
}
#else
# define my_pseudo_random my_timer_cycles
#endif
/**
A nanosecond timer.
@return the current timer value, in nanoseconds.

4
man/myisamchk.1

@ -38,7 +38,7 @@ with partitioned tables is not supported\&.
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
@ -168,7 +168,7 @@ the section called \(lqMYISAMCHK MEMORY USAGE\(rq\&.
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br

4
man/mysql_upgrade.1

@ -36,7 +36,7 @@ performs a table check\&. If any problems are found, a table repair is attempted
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
@ -54,7 +54,7 @@ with administrator privileges\&. You can do this by running a Command Prompt as
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br

2
man/mysqladmin.1

@ -409,7 +409,7 @@ shell> \fBmysqladmin password "my new password"\fR
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br

8
man/mysqlbinlog.1

@ -167,7 +167,7 @@ option is given\&.
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
@ -424,7 +424,7 @@ USE\&. (In particular, no cross\-database updates should be used\&.)
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
@ -1309,7 +1309,7 @@ capability enabled\&.
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br
@ -1983,7 +1983,7 @@ shell> \fBmysqlbinlog \-v \-\-base64\-output=DECODE\-ROWS \fR\fB\fIlog_file\fR\f
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br

2
man/mysqlcheck.1

@ -101,7 +101,7 @@ with partitioned tables is not supported\&.
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br

2
man/mysqld_safe.1

@ -733,7 +733,7 @@ If none of these options is given, the default is
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br

2
man/mysqldump.1

@ -2347,7 +2347,7 @@ file that contains its data\&. The option value is the directory in which to wri
.sp
.\}
.RS 4
.it 1 an-trap
.it 1
.nr an-no-space-flag 1
.nr an-break-flag 1
.br

11
mysql-test/main/func_json.result

@ -1717,6 +1717,17 @@ SELECT JSON_REMOVE('{"A": { "B": 1 }}', '$.A.B.C.D');
JSON_REMOVE('{"A": { "B": 1 }}', '$.A.B.C.D')
{"A": {"B": 1}}
#
# MDEV-34143: Server crashes when executing JSON_EXTRACT after setting non-default collation_connection
#
SET @save_collation_connection= @@collation_connection;
SET collation_connection='utf16_bin';
SELECT JSON_EXTRACT('{"a": 1,"b": 2}','$.a');
JSON_EXTRACT('{"a": 1,"b": 2}','$.a')
NULL
Warnings:
Warning 4036 Character disallowed in JSON in argument 1 to function 'json_extract' at position 2
SET @@collation_connection= @save_collation_connection;
#
# End of 10.5 tests
#
#

12
mysql-test/main/func_json.test

@ -1150,6 +1150,18 @@ SELECT JSON_TYPE(json_value(JSON_OBJECT("id", 1, "name", 'Monty', "date", Cast('
SELECT JSON_REMOVE('{"A": { "B": 1 }}', '$.A.B.C.D');
--echo #
--echo # MDEV-34143: Server crashes when executing JSON_EXTRACT after setting non-default collation_connection
--echo #
SET @save_collation_connection= @@collation_connection;
SET collation_connection='utf16_bin';
SELECT JSON_EXTRACT('{"a": 1,"b": 2}','$.a');
SET @@collation_connection= @save_collation_connection;
--echo #
--echo # End of 10.5 tests
--echo #

2
mysql-test/main/sp-vars.result

@ -1171,7 +1171,7 @@ SET j= 1 + i;
END|
CALL ctest();
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'string '
Warning 1292 Truncated incorrect DOUBLE value: 'string'
DROP PROCEDURE ctest;
CREATE PROCEDURE vctest()
BEGIN

40
mysql-test/main/type_char.result

@ -0,0 +1,40 @@
#
# Start of 10.5 tests
#
#
# MDEV-34295 CAST(char_col AS DOUBLE) prints redundant spaces in a warning
#
CREATE TABLE t1 (a CHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci);
INSERT INTO t1 VALUES ('1x'), ('x');
SELECT a, CAST(a AS DOUBLE) FROM t1 ORDER BY a;
a CAST(a AS DOUBLE)
1x 1
x 0
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: '1x'
Warning 1292 Truncated incorrect DOUBLE value: 'x'
SELECT a, CAST(a AS DECIMAL(20,2)) FROM t1 ORDER BY a;
a CAST(a AS DECIMAL(20,2))
1x 1.00
x 0.00
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: '1x'
Warning 1292 Truncated incorrect DECIMAL value: 'x'
SELECT a, CAST(a AS SIGNED) FROM t1 ORDER BY a;
a CAST(a AS SIGNED)
1x 1
x 0
Warnings:
Warning 1292 Truncated incorrect INTEGER value: '1x'
Warning 1292 Truncated incorrect INTEGER value: 'x'
SELECT a, CAST(a AS UNSIGNED) FROM t1 ORDER BY a;
a CAST(a AS UNSIGNED)
1x 1
x 0
Warnings:
Warning 1292 Truncated incorrect INTEGER value: '1x'
Warning 1292 Truncated incorrect INTEGER value: 'x'
DROP TABLE t1;
#
# End of 10.5 tests
#

19
mysql-test/main/type_char.test

@ -0,0 +1,19 @@
--echo #
--echo # Start of 10.5 tests
--echo #
--echo #
--echo # MDEV-34295 CAST(char_col AS DOUBLE) prints redundant spaces in a warning
--echo #
CREATE TABLE t1 (a CHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci);
INSERT INTO t1 VALUES ('1x'), ('x');
SELECT a, CAST(a AS DOUBLE) FROM t1 ORDER BY a;
SELECT a, CAST(a AS DECIMAL(20,2)) FROM t1 ORDER BY a;
SELECT a, CAST(a AS SIGNED) FROM t1 ORDER BY a;
SELECT a, CAST(a AS UNSIGNED) FROM t1 ORDER BY a;
DROP TABLE t1;
--echo #
--echo # End of 10.5 tests
--echo #

8
mysql-test/main/type_varchar.result

@ -465,7 +465,7 @@ a (a + 0)
t 0
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: '1a'
Warning 1292 Truncated incorrect DOUBLE value: 't '
Warning 1292 Truncated incorrect DOUBLE value: 't'
SELECT a,(a DIV 2) FROM t1 ORDER BY a;
a (a DIV 2)
10 5
@ -476,7 +476,7 @@ a (a DIV 2)
t 0
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: '1a'
Warning 1292 Truncated incorrect DECIMAL value: 't '
Warning 1292 Truncated incorrect DECIMAL value: 't'
SELECT a,CAST(a AS SIGNED) FROM t1 ORDER BY a;
a CAST(a AS SIGNED)
10 10
@ -508,8 +508,8 @@ SELECT 5 = a FROM t1;
0
0
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: 's '
Warning 1292 Truncated incorrect DECIMAL value: ' '
Warning 1292 Truncated incorrect DECIMAL value: 's'
Warning 1292 Truncated incorrect DECIMAL value: ''
DROP TABLE t1;
#
# MDEV-13530 VARBINARY doesn't convert to to BLOB for sizes 65533, 65534 and 65535

174
mysql-test/main/win.result

@ -4394,6 +4394,180 @@ row_number() OVER (order by a)
3
drop table t1;
#
# MDEV-29307: join of 2 derived tables over the same grouping view such
# that the first of the joined tables contains a window
# function and the view's specification contains a subquery
# with a set function aggregated on the top level
#
CREATE TABLE t1 (
tst int NOT NULL,
flat tinyint unsigned NOT NULL,
type tinyint unsigned NOT NULL,
val int NOT NULL,
PRIMARY KEY (tst,flat,type)
) ENGINE=ARIA;
INSERT INTO t1 VALUES
(5, 20, 2, 100),
(7, 20, 2, 150),
(9, 20, 1, 200);
CREATE VIEW v1 AS (
SELECT
flat,
type,
( SELECT val FROM t1 sw
WHERE sw.tst = MAX(w.tst) AND sw.flat = w.flat AND sw.type = w.type)
AS total
FROM t1 w
GROUP BY flat, type
);
EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived4> ALL NULL NULL NULL NULL 3 100.00 Using where
1 PRIMARY <derived6> ref key0 key0 1 v1.flat 2 100.00 Using where
6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort
7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort
5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
Warnings:
Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4
Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4
Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6
Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6
Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6
Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6
Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`v1`.`total` AS `w1_total` from `test`.`v1` join `test`.`v1` where `v1`.`flat` = `v1`.`flat` and `v1`.`type` = 2 and `v1`.`type` = 1
SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
w2_total w1_total
150 200
EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 100.00 Using where
1 PRIMARY <derived6> ref key0 key0 1 w1.flat 2 100.00 Using where
6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort
7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
2 DERIVED <derived4> ALL NULL NULL NULL NULL 3 100.00 Using where; Using temporary
4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort
5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
Warnings:
Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4
Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4
Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6
Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6
Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6
Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6
Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`w1`.`total` AS `w1_total` from (/* select#2 */ select `v1`.`flat` AS `flat`,`v1`.`type` AS `type`,`v1`.`total` AS `total`,count(`v1`.`total`) over ( partition by `v1`.`type` order by `v1`.`type`) AS `u` from `test`.`v1` where `v1`.`type` = 1) `w1` join `test`.`v1` where `v1`.`flat` = `w1`.`flat` and `v1`.`type` = 2
SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
w2_total w1_total
150 200
EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total, u
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u
FROM v1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
) AS w2;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 3 100.00 Using join buffer (flat, BNL join)
6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using index; Using temporary; Using filesort
7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
2 DERIVED <derived4> ALL NULL NULL NULL NULL 3 100.00 Using temporary
4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using index; Using temporary; Using filesort
5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
Warnings:
Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4
Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4
Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6
Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6
Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6
Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6
Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`w1`.`total` AS `w1_total`,`w1`.`u` AS `u` from (/* select#2 */ select `v1`.`flat` AS `flat`,`v1`.`type` AS `type`,`v1`.`total` AS `total`,count(`v1`.`total`) over ( partition by `v1`.`flat` order by `v1`.`flat`) AS `u` from `test`.`v1`) `w1` join `test`.`v1`
SELECT w2.total AS w2_total, w1.total AS w1_total, u
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u
FROM v1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
) AS w2;
w2_total w1_total u
150 150 2
150 200 2
200 150 2
200 200 2
DROP VIEW v1;
DROP TABLE t1;
# End of 10.5 tests
#
# MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER
#
CREATE TABLE t(c1 INT);

93
mysql-test/main/win.test

@ -2874,6 +2874,99 @@ insert into t1 values (1),(2),(3);
SELECT row_number() OVER (order by a) FROM t1 order by NAME_CONST('myname',NULL);
drop table t1;
--echo #
--echo # MDEV-29307: join of 2 derived tables over the same grouping view such
--echo # that the first of the joined tables contains a window
--echo # function and the view's specification contains a subquery
--echo # with a set function aggregated on the top level
--echo #
CREATE TABLE t1 (
tst int NOT NULL,
flat tinyint unsigned NOT NULL,
type tinyint unsigned NOT NULL,
val int NOT NULL,
PRIMARY KEY (tst,flat,type)
) ENGINE=ARIA;
INSERT INTO t1 VALUES
(5, 20, 2, 100),
(7, 20, 2, 150),
(9, 20, 1, 200);
CREATE VIEW v1 AS (
SELECT
flat,
type,
( SELECT val FROM t1 sw
WHERE sw.tst = MAX(w.tst) AND sw.flat = w.flat AND sw.type = w.type)
AS total
FROM t1 w
GROUP BY flat, type
);
let $q1=
SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
eval EXPLAIN EXTENDED $q1;
eval $q1;
let $q2=
SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
eval EXPLAIN EXTENDED $q2;
eval $q2;
let $q3=
SELECT w2.total AS w2_total, w1.total AS w1_total, u
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u
FROM v1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
) AS w2;
eval EXPLAIN EXTENDED $q3;
--sorted_result
eval $q3;
DROP VIEW v1;
DROP TABLE t1;
--echo # End of 10.5 tests
--echo #
--echo # MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER
--echo #

12
mysql-test/main/xml.result

@ -991,20 +991,20 @@ CALL spxml('<a><b>b1</b><b>b2</b></a>', '1 and string');
ExtractValue(xml,'/a/b[$i]')
b1
Warnings:
Warning 1292 Truncated incorrect INTEGER value: '1 and string '
Warning 1292 Truncated incorrect INTEGER value: '1 and string '
Warning 1292 Truncated incorrect INTEGER value: '1 and string'
Warning 1292 Truncated incorrect INTEGER value: '1 and string'
CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string and 1');
ExtractValue(xml,'/a/b[$i]')
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'string and 1 '
Warning 1292 Truncated incorrect INTEGER value: 'string and 1 '
Warning 1292 Truncated incorrect INTEGER value: 'string and 1'
Warning 1292 Truncated incorrect INTEGER value: 'string and 1'
CALL spxml('<a><b>b1</b><b>b2</b></a>', 'string');
ExtractValue(xml,'/a/b[$i]')
Warnings:
Warning 1292 Truncated incorrect INTEGER value: 'string '
Warning 1292 Truncated incorrect INTEGER value: 'string '
Warning 1292 Truncated incorrect INTEGER value: 'string'
Warning 1292 Truncated incorrect INTEGER value: 'string'
DROP PROCEDURE spxml;
select UpdateXML('<a>a</a>',repeat('a b ',1000),'');
ERROR HY000: XPATH syntax error: 'b a b a b a b a b a b a b a b...'

8
mysql-test/mariadb-test-run.pl

@ -337,7 +337,11 @@ my $opt_max_test_fail= env_or_val(MTR_MAX_TEST_FAIL => 10);
my $opt_core_on_failure= 0;
my $opt_parallel= $ENV{MTR_PARALLEL} || 1;
my $opt_port_group_size = $ENV{MTR_PORT_GROUP_SIZE} || 20;
# Some galera tests starts 6 galera nodes. Each galera node requires
# three ports: 6*3 = 18. Plus 6 ports are needed for 6 mariadbd servers.
# Since the number of ports is rounded up to 10 everywhere, we will
# take 30 as the default value:
my $opt_port_group_size = $ENV{MTR_PORT_GROUP_SIZE} || 30;
# lock file to stop tests
my $opt_stop_file= $ENV{MTR_STOP_FILE};
@ -5578,6 +5582,8 @@ sub start_check_testcase ($$$) {
mtr_add_arg($args, "--record");
}
my $errfile= "$opt_vardir/tmp/$name.err";
My::Debugger::setup_client_args(\$args, \$exe_mysqltest);
my $proc= My::SafeProcess->new
(
name => $name,

174
mysql-test/suite/encryption/r/tempfiles_encrypted.result

@ -4400,6 +4400,180 @@ row_number() OVER (order by a)
3
drop table t1;
#
# MDEV-29307: join of 2 derived tables over the same grouping view such
# that the first of the joined tables contains a window
# function and the view's specification contains a subquery
# with a set function aggregated on the top level
#
CREATE TABLE t1 (
tst int NOT NULL,
flat tinyint unsigned NOT NULL,
type tinyint unsigned NOT NULL,
val int NOT NULL,
PRIMARY KEY (tst,flat,type)
) ENGINE=ARIA;
INSERT INTO t1 VALUES
(5, 20, 2, 100),
(7, 20, 2, 150),
(9, 20, 1, 200);
CREATE VIEW v1 AS (
SELECT
flat,
type,
( SELECT val FROM t1 sw
WHERE sw.tst = MAX(w.tst) AND sw.flat = w.flat AND sw.type = w.type)
AS total
FROM t1 w
GROUP BY flat, type
);
EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived4> ALL NULL NULL NULL NULL 3 100.00 Using where
1 PRIMARY <derived6> ref key0 key0 1 v1.flat 2 100.00 Using where
6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort
7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort
5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
Warnings:
Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4
Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4
Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6
Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6
Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6
Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6
Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`v1`.`total` AS `w1_total` from `test`.`v1` join `test`.`v1` where `v1`.`flat` = `v1`.`flat` and `v1`.`type` = 2 and `v1`.`type` = 1
SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
w2_total w1_total
150 200
EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 100.00 Using where
1 PRIMARY <derived6> ref key0 key0 1 w1.flat 2 100.00 Using where
6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort
7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
2 DERIVED <derived4> ALL NULL NULL NULL NULL 3 100.00 Using where; Using temporary
4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort
5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
Warnings:
Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4
Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4
Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6
Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6
Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6
Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6
Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`w1`.`total` AS `w1_total` from (/* select#2 */ select `v1`.`flat` AS `flat`,`v1`.`type` AS `type`,`v1`.`total` AS `total`,count(`v1`.`total`) over ( partition by `v1`.`type` order by `v1`.`type`) AS `u` from `test`.`v1` where `v1`.`type` = 1) `w1` join `test`.`v1` where `v1`.`flat` = `w1`.`flat` and `v1`.`type` = 2
SELECT w2.total AS w2_total, w1.total AS w1_total
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u
FROM v1
WHERE type = 1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
WHERE type = 2
) AS w2
ON w1.flat = w2.flat;
w2_total w1_total
150 200
EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total, u
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u
FROM v1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
) AS w2;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 100.00
1 PRIMARY <derived6> ALL NULL NULL NULL NULL 3 100.00 Using join buffer (flat, BNL join)
6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using index; Using temporary; Using filesort
7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
2 DERIVED <derived4> ALL NULL NULL NULL NULL 3 100.00 Using temporary
4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using index; Using temporary; Using filesort
5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition
Warnings:
Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4
Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4
Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4
Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6
Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6
Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6
Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6
Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`w1`.`total` AS `w1_total`,`w1`.`u` AS `u` from (/* select#2 */ select `v1`.`flat` AS `flat`,`v1`.`type` AS `type`,`v1`.`total` AS `total`,count(`v1`.`total`) over ( partition by `v1`.`flat` order by `v1`.`flat`) AS `u` from `test`.`v1`) `w1` join `test`.`v1`
SELECT w2.total AS w2_total, w1.total AS w1_total, u
FROM
(
SELECT flat, type, total,
COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u
FROM v1
) AS w1
JOIN
(
SELECT flat, type, total
FROM v1
) AS w2;
w2_total w1_total u
150 150 2
150 200 2
200 150 2
200 200 2
DROP VIEW v1;
DROP TABLE t1;
# End of 10.5 tests
#
# MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER
#
CREATE TABLE t(c1 INT);

16
mysql-test/suite/funcs_1/r/innodb_func_view.result

@ -2202,9 +2202,9 @@ IS NOT TRUE <--------30 characters-------> 3
IS NOT TRUE ---äÖüß@µ*$-- 4
IS TRUE -1 5
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ' '
Warning 1292 Truncated incorrect DOUBLE value: ''
Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--'
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 if(`t1_values`.`my_char_30`,'IS TRUE','IS NOT TRUE') AS `IF(my_char_30, 'IS TRUE', 'IS NOT TRUE')`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
@ -2218,9 +2218,9 @@ IS NOT TRUE <--------30 characters-------> 3
IS NOT TRUE ---äÖüß@µ*$-- 4
IS TRUE -1 5
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ' '
Warning 1292 Truncated incorrect DOUBLE value: ''
Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--'
DROP VIEW v1;
@ -3523,9 +3523,9 @@ NULL NULL 1
-1.00 -1 5
-3333.33 -3333.3333 26
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: ' '
Warning 1292 Truncated incorrect DECIMAL value: ''
Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--'
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 cast(`t1_values`.`my_char_30` as decimal(37,2)) AS `CAST(my_char_30 AS DECIMAL(37,2))`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
@ -3540,9 +3540,9 @@ NULL NULL 1
-1.00 -1 5
-3333.33 -3333.3333 26
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: ' '
Warning 1292 Truncated incorrect DECIMAL value: ''
Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--'
DROP VIEW v1;

16
mysql-test/suite/funcs_1/r/memory_func_view.result

@ -2203,9 +2203,9 @@ IS NOT TRUE <--------30 characters-------> 3
IS NOT TRUE ---äÖüß@µ*$-- 4
IS TRUE -1 5
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ' '
Warning 1292 Truncated incorrect DOUBLE value: ''
Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--'
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 if(`t1_values`.`my_char_30`,'IS TRUE','IS NOT TRUE') AS `IF(my_char_30, 'IS TRUE', 'IS NOT TRUE')`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
@ -2219,9 +2219,9 @@ IS NOT TRUE <--------30 characters-------> 3
IS NOT TRUE ---äÖüß@µ*$-- 4
IS TRUE -1 5
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ' '
Warning 1292 Truncated incorrect DOUBLE value: ''
Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--'
DROP VIEW v1;
@ -3524,9 +3524,9 @@ NULL NULL 1
-1.00 -1 5
-3333.33 -3333.3333 26
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: ' '
Warning 1292 Truncated incorrect DECIMAL value: ''
Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--'
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 cast(`t1_values`.`my_char_30` as decimal(37,2)) AS `CAST(my_char_30 AS DECIMAL(37,2))`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
@ -3541,9 +3541,9 @@ NULL NULL 1
-1.00 -1 5
-3333.33 -3333.3333 26
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: ' '
Warning 1292 Truncated incorrect DECIMAL value: ''
Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--'
DROP VIEW v1;

16
mysql-test/suite/funcs_1/r/myisam_func_view.result

@ -2203,9 +2203,9 @@ IS NOT TRUE <--------30 characters-------> 3
IS NOT TRUE ---äÖüß@µ*$-- 4
IS TRUE -1 5
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ' '
Warning 1292 Truncated incorrect DOUBLE value: ''
Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--'
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 if(`t1_values`.`my_char_30`,'IS TRUE','IS NOT TRUE') AS `IF(my_char_30, 'IS TRUE', 'IS NOT TRUE')`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
@ -2219,9 +2219,9 @@ IS NOT TRUE <--------30 characters-------> 3
IS NOT TRUE ---äÖüß@µ*$-- 4
IS TRUE -1 5
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ' '
Warning 1292 Truncated incorrect DOUBLE value: ''
Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--'
DROP VIEW v1;
@ -3524,9 +3524,9 @@ NULL NULL 1
-1.00 -1 5
-3333.33 -3333.3333 26
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: ' '
Warning 1292 Truncated incorrect DECIMAL value: ''
Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--'
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 cast(`t1_values`.`my_char_30` as decimal(37,2)) AS `CAST(my_char_30 AS DECIMAL(37,2))`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci
@ -3541,9 +3541,9 @@ NULL NULL 1
-1.00 -1 5
-3333.33 -3333.3333 26
Warnings:
Warning 1292 Truncated incorrect DECIMAL value: ' '
Warning 1292 Truncated incorrect DECIMAL value: ''
Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->'
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- '
Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--'
DROP VIEW v1;

1
mysql-test/suite/galera/disabled.def

@ -22,4 +22,3 @@ galera_slave_replay : MDEV-32780 galera_as_slave_replay: assertion in the wsrep:
galera_sst_mysqldump_with_key : MDEV-32782 galera_sst_mysqldump_with_key test failed
galera_var_ignore_apply_errors : MENT-1997 galera_var_ignore_apply_errors test freezes
galera_desync_overlapped : MDEV-21538 galera_desync_overlapped MTR failed: Result content mismatch
galera_create_table_as_select : MDEV-33952 fails sporadically

3
mysql-test/suite/galera/galera_2nodes_as_master.cnf

@ -47,6 +47,9 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port'
wsrep-on=OFF
server-id=3
[sst]
sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log
[ENV]
NODE_MYPORT_1= @mysqld.1.port
NODE_MYSOCK_1= @mysqld.1.socket

3
mysql-test/suite/galera/galera_2nodes_as_slave.cnf

@ -46,6 +46,9 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port'
wsrep-on=OFF
server-id=3
[sst]
sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log
[ENV]
NODE_MYPORT_1= @mysqld.1.port
NODE_MYSOCK_1= @mysqld.1.socket

6
mysql-test/suite/galera/galera_2x2nodes.cnf

@ -11,7 +11,6 @@ default-storage-engine=innodb
wsrep_gtid_mode=1
gtid_ignore_duplicates
auto_increment_increment=3
wsrep-provider=@ENV.WSREP_PROVIDER
# enforce read-committed characteristics across the cluster
# wsrep-causal-reads=ON
@ -61,6 +60,9 @@ wsrep_node_address='127.0.0.1:@mysqld.4.#galera_port'
wsrep_node_incoming_address=127.0.0.1:@mysqld.4.port
wsrep_sst_receive_address='127.0.0.1:@mysqld.4.#sst_port'
[sst]
sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log
[ENV]
NODE_MYPORT_1= @mysqld.1.port
NODE_MYSOCK_1= @mysqld.1.socket
@ -73,5 +75,3 @@ NODE_MYSOCK_3= @mysqld.3.socket
NODE_MYPORT_4= @mysqld.4.port
NODE_MYSOCK_4= @mysqld.4.socket

3
mysql-test/suite/galera/galera_3nodes_as_slave.cnf

@ -59,6 +59,9 @@ wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port'
wsrep-on=OFF
server-id=4
[sst]
sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log
[ENV]
NODE_MYPORT_1= @mysqld.1.port
NODE_MYSOCK_1= @mysqld.1.socket

3
mysql-test/suite/galera/galera_4nodes.cnf

@ -59,6 +59,9 @@ wsrep_node_incoming_address=127.0.0.1:@mysqld.4.port
wsrep_sst_receive_address='127.0.0.1:@mysqld.4.#sst_port'
auto-increment-offset=4
[sst]
sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log
[ENV]
NODE_MYPORT_1= @mysqld.1.port
NODE_MYSOCK_1= @mysqld.1.socket

6
mysql-test/suite/galera/r/MDEV-33523.result

@ -0,0 +1,6 @@
connection node_2;
connection node_1;
SET SESSION wsrep_on=OFF;
BEGIN;
ROLLBACK;
SET SESSION wsrep_on=OFF;

6
mysql-test/suite/galera/r/galera_as_slave_gtid_myisam.result

@ -22,12 +22,6 @@ EXPECT_1
1
gtid_binlog_state_equal
0
connection node_2;
SELECT COUNT(*) AS EXPECT_1 FROM t1;
EXPECT_1
1
gtid_binlog_state_equal
0
#cleanup
connection node_3;
DROP TABLE t1;

11
mysql-test/suite/galera/r/galera_bf_kill.result

@ -49,16 +49,23 @@ a b
disconnect node_2a;
disconnect node_2b;
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2;
connection node_2a;
SET SESSION wsrep_on=OFF;
begin;
update t1 set a =5, b=2;
connection node_2;
ALTER TABLE t1 ADD UNIQUE KEY b3(b);
connection node_2b;
SET SESSION wsrep_sync_wait=0;
connection node_2a;
select * from t1;
a b
2 1
5 2
commit;
connection node_2;
disconnect node_2a;
disconnect node_2b;
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
connection node_2a;
SET SESSION wsrep_on=OFF;
@ -67,7 +74,7 @@ update t1 set a =5, b=2;
connection node_2;
select * from t1;
a b
2 1
5 2
disconnect node_2a;
connection node_1;
drop table t1;

13
mysql-test/suite/galera/r/galera_create_table_as_select.result

@ -76,22 +76,21 @@ EXECUTE stmt;
DEALLOCATE PREPARE stmt;
DROP TABLE t1, t2;
connection node_1;
SET GLOBAL DEBUG_DBUG = 'd,sync.wsrep_apply_cb';
CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB;
INSERT INTO t2 VALUES (1),(2),(3),(4),(5);
connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1;
LOCK TABLE t2 WRITE;
connection node_1;
SET DEBUG_SYNC = 'create_table_select_before_create WAIT_FOR sync.wsrep_apply_cb_reached';
SET DEBUG_SYNC = 'create_table_select_before_lock SIGNAL signal.wsrep_apply_cb WAIT_FOR bf_abort';
CREATE TABLE t1 AS SELECT * FROM t2;;
connection node_1a;
connection node_2;
SELECT COUNT(*) = 5 FROM t2;
COUNT(*) = 5
1
CREATE TABLE t1 AS SELECT * FROM t2;
connection node_1a;
UNLOCK TABLES;
connection node_1;
Got one of the listed errors
ERROR 70100: Query execution was interrupted
SET GLOBAL DEBUG_DBUG = '';
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB;
INSERT INTO t2 VALUES (1),(2),(3),(4),(5);

71
mysql-test/suite/galera/r/galera_replica_no_gtid.result

@ -0,0 +1,71 @@
connection node_2;
connection node_1;
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
create user repl@'%' identified by 'repl';
grant all on *.* to repl@'%';
flush privileges;
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
connection node_1;
connection node_2;
connection node_2;
START SLAVE;
connection node_3;
CREATE TABLE t1 (id bigint primary key, msg varchar(100)) engine=innodb;
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
EXPECT_10000
10000
connection node_2;
SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos;
EXPECT_1
1
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
EXPECT_10000
10000
connection node_1;
SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos;
EXPECT_0
0
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
EXPECT_10000
10000
connection node_2;
# Verify that graceful shutdown succeeds.
# Force SST
connection node_1;
# Waiting until node_2 is not part of cluster anymore
connection node_2;
# Start node_2 again
¤ Wait until node_2 is back on cluster
connection node_2;
call mtr.add_suppression("Slave: Operation CREATE USER failed for .*");
SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos;
EXPECT_0
0
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
EXPECT_10000
10000
connection node_1;
SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos;
EXPECT_0
0
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
EXPECT_10000
10000
connection node_3;
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
EXPECT_10000
10000
connection node_2;
STOP SLAVE;
RESET SLAVE ALL;
connection node_3;
RESET MASTER;
drop table t1;
connection node_2;
DROP TABLE t1;
connection node_1;
connection node_1;
disconnect node_3;
disconnect node_2;
disconnect node_1;
# End of test

11
mysql-test/suite/galera/t/MDEV-33523.test

@ -0,0 +1,11 @@
#
# MDEV-33523: Spurious deadlock error when wsrep_on=OFF
#
--source include/galera_cluster.inc
SET SESSION wsrep_on=OFF;
BEGIN;
# If bug is present, the following rollback
# results in ER_LOCK_DEADLOCK error.
ROLLBACK;
SET SESSION wsrep_on=OFF;

14
mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test

@ -46,18 +46,8 @@ SELECT LENGTH(@@global.gtid_binlog_state) > 1;
SELECT COUNT(*) AS EXPECT_1 FROM t1;
--disable_query_log
--eval SELECT '$gtid_binlog_state_node1' = @@global.gtid_binlog_state AS gtid_binlog_state_equal;
--enable_query_log
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_1 FROM t1;
# Note that MyISAM tables are not replicated by Galera so we do not here
# check node_2
--disable_query_log
--eval SELECT '$gtid_binlog_state_node1' = @@global.gtid_binlog_state AS gtid_binlog_state_equal;

28
mysql-test/suite/galera/t/galera_bf_kill.test

@ -94,27 +94,43 @@ select * from t1;
--disconnect node_2b
#
# Test case 5: Start a transaction on node_2a with wsrep disabled
# and start a DDL on other transaction that will then abort node_2a
# transactions
# Test case 5: Start a transaction on node_2a with wsrep disabled.
# A conflicting DDL on other transaction can't BF abort
# transaction from node_2a (wsrep disabled).
#
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
--connection node_2a
SET SESSION wsrep_on=OFF;
begin;
update t1 set a =5, b=2;
--connection node_2
ALTER TABLE t1 ADD UNIQUE KEY b3(b);
--send ALTER TABLE t1 ADD UNIQUE KEY b3(b)
--connection node_2b
SET SESSION wsrep_sync_wait=0;
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Waiting for table metadata lock';
--source include/wait_condition.inc
--connection node_2a
select * from t1;
# We expect that ALTER should not be able to BF abort
# this transaction, it must wait for it to finish.
# Expect commit to succeed.
commit;
--connection node_2
--reap
--disconnect node_2a
--disconnect node_2b
#
# Test case 6: Start a transaction on node_2a with wsrep disabled
# and kill it from other connection on same node
# Test case 6: Start a transaction on node_2a with wsrep disabled
# and kill it from other connection on same node.
#
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2

22
mysql-test/suite/galera/t/galera_create_table_as_select.test

@ -3,6 +3,8 @@
#
--source include/galera_cluster.inc
--source include/have_debug_sync.inc
--source include/have_debug.inc
--connection node_1
SET SESSION default_storage_engine=InnoDB;
@ -103,31 +105,27 @@ DROP TABLE t1, t2;
#
--connection node_1
# Pause applying CTAS command from the other node
SET GLOBAL DEBUG_DBUG = 'd,sync.wsrep_apply_cb';
CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB;
INSERT INTO t2 VALUES (1),(2),(3),(4),(5);
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
LOCK TABLE t2 WRITE;
--connection node_1
# Wait until local CTAS grabs MDL lock and let applied CTAS BF-abort it
SET DEBUG_SYNC = 'create_table_select_before_create WAIT_FOR sync.wsrep_apply_cb_reached';
SET DEBUG_SYNC = 'create_table_select_before_lock SIGNAL signal.wsrep_apply_cb WAIT_FOR bf_abort';
--send CREATE TABLE t1 AS SELECT * FROM t2;
--connection node_1a
--let $wait_condition = SELECT COUNT(*) = 1 FROM information_schema.processlist WHERE STATE LIKE 'Waiting for table metadata lock%'
--source include/wait_condition.inc
--connection node_2
SELECT COUNT(*) = 5 FROM t2;
CREATE TABLE t1 AS SELECT * FROM t2;
--connection node_1a
UNLOCK TABLES;
--connection node_1
--error ER_TABLE_EXISTS_ERROR,ER_QUERY_INTERRUPTED
--error ER_QUERY_INTERRUPTED
--reap
SET GLOBAL DEBUG_DBUG = '';
SET DEBUG_SYNC = 'RESET';
DROP TABLE t1, t2;
#

9
mysql-test/suite/galera/t/galera_replica_no_gtid.cnf

@ -0,0 +1,9 @@
!include ../galera_2nodes_as_slave.cnf
[mysqld]
wsrep-debug=1
server_id=15
wsrep_gtid_mode=OFF
wsrep_gtid_domain_id=16
gtid_domain_id=11
gtid_strict_mode=OFF

124
mysql-test/suite/galera/t/galera_replica_no_gtid.test

@ -0,0 +1,124 @@
#
# Test Galera as a replica to a MySQL async replication
#
# The galera/galera_2node_slave.cnf describes the setup of the nodes
#
--source include/force_restart.inc
--source include/galera_cluster.inc
--source include/have_innodb.inc
--source include/have_sequence.inc
# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it
# we open the node_3 connection here
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
create user repl@'%' identified by 'repl';
grant all on *.* to repl@'%';
flush privileges;
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
--let $node_1 = node_1
--let $node_2 = node_2
--source include/auto_increment_offset_save.inc
--connection node_2
--disable_query_log
--eval CHANGE MASTER TO master_host='127.0.0.1', master_user='repl', master_password='repl', master_port=$NODE_MYPORT_3, master_use_gtid=slave_pos;
--enable_query_log
START SLAVE;
--connection node_3
CREATE TABLE t1 (id bigint primary key, msg varchar(100)) engine=innodb;
--disable_query_log
INSERT INTO t1 SELECT seq, 'test' from seq_1_to_10000;
--enable_query_log
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 10000 FROM t1;
--source include/wait_condition.inc
#
# Node_2 is slave so mysql.gtid_slave_pos table is also replicated
#
SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos;
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
--connection node_1
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 10000 FROM t1;
--source include/wait_condition.inc
#
# mysql-gtid_slave_pos table should not be replicated by Galera
#
SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos;
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
--connection node_2
--echo # Verify that graceful shutdown succeeds.
--source include/shutdown_mysqld.inc
--echo # Force SST
--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat
--connection node_1
--echo # Waiting until node_2 is not part of cluster anymore
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--source include/wait_condition.inc
--connection node_2
--echo # Start node_2 again
--source include/start_mysqld.inc
--echo ¤ Wait until node_2 is back on cluster
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
--source include/wait_condition.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
--source include/wait_condition.inc
--connection node_2
call mtr.add_suppression("Slave: Operation CREATE USER failed for .*");
SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos;
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
--connection node_1
SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos;
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
--connection node_3
SELECT COUNT(*) AS EXPECT_10000 FROM t1;
#
# Cleanup
#
--connection node_2
STOP SLAVE;
RESET SLAVE ALL;
--connection node_3
RESET MASTER;
drop table t1;
--connection node_2
DROP TABLE t1;
--connection node_1
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
--source include/wait_condition.inc
--connection node_1
--disconnect node_3
--source include/auto_increment_offset_restore.inc
--source include/galera_end.inc
--echo # End of test

3
mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf

@ -83,6 +83,9 @@ wsrep_node_address='127.0.0.1:@mysqld.6.#galera_port'
wsrep_node_incoming_address=127.0.0.1:@mysqld.6.port
wsrep_sst_receive_address='127.0.0.1:@mysqld.6.#sst_port'
[sst]
sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log
[ENV]
NODE_MYPORT_1= @mysqld.1.port
NODE_MYSOCK_1= @mysqld.1.socket

3
mysql-test/suite/galera_3nodes/galera_3nodes.cnf

@ -46,6 +46,9 @@ wsrep_node_address='127.0.0.1:@mysqld.3.#galera_port'
wsrep_node_incoming_address=127.0.0.1:@mysqld.3.port
wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port'
[sst]
sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log
[ENV]
NODE_MYPORT_1= @mysqld.1.port
NODE_MYSOCK_1= @mysqld.1.socket

166
mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result

@ -75,15 +75,15 @@ insert into t1 values (2, 21, 1);
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-2,2-21-1
select * from t1;
cluster_domain_id node_server_id seq_no
1 11 2
2 21 1
#wait for sync cluster 1 and 2
connection node_1;
include/save_master_gtid.inc
connection node_4;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
2 21 1
cluster 1 node 2
connection node_2;
select @@gtid_binlog_state;
@ -98,6 +98,11 @@ connection node_1;
include/save_master_gtid.inc
connection node_4;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
2 21 1
cluster 1 node 3
connection node_3;
select @@gtid_binlog_state;
@ -112,6 +117,12 @@ connection node_1;
include/save_master_gtid.inc
connection node_4;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
cluster 2 node 2
connection node_5;
select @@gtid_binlog_state;
@ -126,6 +137,13 @@ connection node_4;
include/save_master_gtid.inc
connection node_1;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
cluster 2 node 3
connection node_6;
select @@gtid_binlog_state;
@ -140,6 +158,63 @@ connection node_4;
include/save_master_gtid.inc
connection node_1;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
# check other nodes are consistent
connection node_2;
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-4,2-21-3
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
connection node_3;
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-4,2-21-3
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
connection node_5;
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-4,2-21-3
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
connection node_6;
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-4,2-21-3
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
cluster 1 node 1
connection node_1;
select @@gtid_binlog_state;
@ -220,15 +295,15 @@ insert into t1 values (2, 21, 1);
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-7,2-21-4
select * from t1;
cluster_domain_id node_server_id seq_no
1 11 2
2 21 1
#wait for sync cluster 1 and 2
connection node_1;
include/save_master_gtid.inc
connection node_4;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
2 21 1
cluster 1 node 2
connection node_2;
select @@gtid_binlog_state;
@ -243,6 +318,11 @@ connection node_1;
include/save_master_gtid.inc
connection node_4;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
2 21 1
cluster 1 node 3
connection node_3;
select @@gtid_binlog_state;
@ -257,6 +337,12 @@ connection node_1;
include/save_master_gtid.inc
connection node_4;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
cluster 2 node 2
connection node_5;
select @@gtid_binlog_state;
@ -271,6 +357,13 @@ connection node_4;
include/save_master_gtid.inc
connection node_1;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
cluster 2 node 3
connection node_6;
select @@gtid_binlog_state;
@ -285,6 +378,63 @@ connection node_4;
include/save_master_gtid.inc
connection node_1;
include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
# check other nodes are consistent
connection node_2;
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-9,2-21-6
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
connection node_3;
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-9,2-21-6
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
connection node_5;
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-9,2-21-6
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
connection node_6;
select @@gtid_binlog_state;
@@gtid_binlog_state
1-11-9,2-21-6
select * from t1 order by 1, 2, 3;
cluster_domain_id node_server_id seq_no
1 11 2
1 12 3
1 13 4
2 21 1
2 22 2
2 23 3
cluster 1 node 1
connection node_1;
select @@gtid_binlog_state;

8
mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf

@ -9,11 +9,11 @@ server-id=11
[mysqld.2]
wsrep_gtid_domain_id=1
server-id=12
server-id=11
[mysqld.3]
wsrep_gtid_domain_id=1
server-id=13
server-id=11
[mysqld.4]
wsrep_gtid_domain_id=2
@ -21,8 +21,8 @@ server-id=21
[mysqld.5]
wsrep_gtid_domain_id=2
server-id=22
server-id=21
[mysqld.6]
wsrep_gtid_domain_id=2
server-id=23
server-id=21

39
mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test

@ -11,6 +11,7 @@
--source include/big_test.inc
--source include/galera_cluster.inc
--source include/have_innodb.inc
--source include/force_restart.inc
--connection node_1
--echo cluster 1 node 1
@ -75,12 +76,12 @@ select @@gtid_binlog_state;
select @@gtid_binlog_state;
insert into t1 values (2, 21, 1);
select @@gtid_binlog_state;
select * from t1;
--echo #wait for sync cluster 1 and 2
--connection node_1
--source include/save_master_gtid.inc
--connection node_4
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo cluster 1 node 2
@ -94,6 +95,7 @@ select @@gtid_binlog_state;
--source include/save_master_gtid.inc
--connection node_4
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo cluster 1 node 3
--connection node_3
@ -106,6 +108,7 @@ select @@gtid_binlog_state;
--source include/save_master_gtid.inc
--connection node_4
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo cluster 2 node 2
--connection node_5
@ -118,6 +121,7 @@ select @@gtid_binlog_state;
--source include/save_master_gtid.inc
--connection node_1
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo cluster 2 node 3
--connection node_6
@ -130,7 +134,21 @@ select @@gtid_binlog_state;
--source include/save_master_gtid.inc
--connection node_1
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo # check other nodes are consistent
--connection node_2
select @@gtid_binlog_state;
select * from t1 order by 1, 2, 3;
--connection node_3
select @@gtid_binlog_state;
select * from t1 order by 1, 2, 3;
--connection node_5
select @@gtid_binlog_state;
select * from t1 order by 1, 2, 3;
--connection node_6
select @@gtid_binlog_state;
select * from t1 order by 1, 2, 3;
--echo cluster 1 node 1
--connection node_1
@ -226,13 +244,13 @@ select @@gtid_binlog_state;
--connection node_4
insert into t1 values (2, 21, 1);
select @@gtid_binlog_state;
select * from t1;
--echo #wait for sync cluster 1 and 2
--connection node_1
--source include/save_master_gtid.inc
--connection node_4
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo cluster 1 node 2
@ -246,6 +264,7 @@ select @@gtid_binlog_state;
--source include/save_master_gtid.inc
--connection node_4
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo cluster 1 node 3
--connection node_3
@ -258,6 +277,7 @@ select @@gtid_binlog_state;
--source include/save_master_gtid.inc
--connection node_4
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo cluster 2 node 2
--connection node_5
@ -270,6 +290,7 @@ select @@gtid_binlog_state;
--source include/save_master_gtid.inc
--connection node_1
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo cluster 2 node 3
--connection node_6
@ -282,7 +303,21 @@ select @@gtid_binlog_state;
--source include/save_master_gtid.inc
--connection node_1
--source include/sync_with_master_gtid.inc
select * from t1 order by 1, 2, 3;
--echo # check other nodes are consistent
--connection node_2
select @@gtid_binlog_state;
select * from t1 order by 1, 2, 3;
--connection node_3
select @@gtid_binlog_state;
select * from t1 order by 1, 2, 3;
--connection node_5
select @@gtid_binlog_state;
select * from t1 order by 1, 2, 3;
--connection node_6
select @@gtid_binlog_state;
select * from t1 order by 1, 2, 3;
--echo cluster 1 node 1
--connection node_1

63
mysql-test/suite/innodb_fts/r/fts_sync_commit_resiliency.result

@ -0,0 +1,63 @@
CREATE TABLE opening_lines (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
opening_line TEXT(500),
author VARCHAR(200),
title VARCHAR(200)
) ENGINE=InnoDB;
CREATE FULLTEXT INDEX idx ON opening_lines(opening_line);
CREATE FULLTEXT INDEX ft_idx1 ON opening_lines(title);
INSERT INTO opening_lines(opening_line,author,title) VALUES
('Call me Ishmael.','Herman Melville','Moby Dick'),
('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'),
('I am an invisible man.','Ralph Ellison','Invisible Man'),
('Where now? Who now? When now?','Samuel Beckett','The Unnamable'),
('It was love at first sight.','Joseph Heller','Catch-22'),
('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'),
('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'),
('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451');
SET GLOBAL innodb_ft_aux_table='test/opening_lines';
SELECT * FROM information_schema.innodb_ft_config;
KEY VALUE
optimize_checkpoint_limit 180
synced_doc_id 0
stopword_table_name
use_stopword 1
SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');
id opening_line author title
1 Call me Ishmael. Herman Melville Moby Dick
SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('invisible');
id opening_line author title
3 I am an invisible man. Ralph Ellison Invisible Man
SELECT * FROM opening_lines;
id opening_line author title
1 Call me Ishmael. Herman Melville Moby Dick
2 A screaming comes across the sky. Thomas Pynchon Gravity's Rainbow
3 I am an invisible man. Ralph Ellison Invisible Man
4 Where now? Who now? When now? Samuel Beckett The Unnamable
5 It was love at first sight. Joseph Heller Catch-22
6 All this happened, more or less. Kurt Vonnegut Slaughterhouse-Five
7 Mrs. Dalloway said she would buy the flowers herself. Virginia Woolf Mrs. Dalloway
8 It was a pleasure to burn. Ray Bradbury Fahrenheit 451
SET GLOBAL innodb_optimize_fulltext_only=ON;
SET DEBUG_SYNC='fts_crash_before_commit_sync SIGNAL hung WAIT_FOR ever';
OPTIMIZE TABLE opening_lines;
connect con1,localhost,root,,;
SET DEBUG_SYNC='now WAIT_FOR hung';
# restart
SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');
id opening_line author title
1 Call me Ishmael. Herman Melville Moby Dick
SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('invisible');
id opening_line author title
3 I am an invisible man. Ralph Ellison Invisible Man
SELECT * FROM opening_lines;
id opening_line author title
1 Call me Ishmael. Herman Melville Moby Dick
2 A screaming comes across the sky. Thomas Pynchon Gravity's Rainbow
3 I am an invisible man. Ralph Ellison Invisible Man
4 Where now? Who now? When now? Samuel Beckett The Unnamable
5 It was love at first sight. Joseph Heller Catch-22
6 All this happened, more or less. Kurt Vonnegut Slaughterhouse-Five
7 Mrs. Dalloway said she would buy the flowers herself. Virginia Woolf Mrs. Dalloway
8 It was a pleasure to burn. Ray Bradbury Fahrenheit 451
DROP TABLE opening_lines;

1
mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.opt

@ -0,0 +1 @@
--innodb_ft_config

47
mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.test

@ -0,0 +1,47 @@
# Test database resiliency against scenario where the server crashes
# right before fts_sync_commit commits its transaction
source include/have_innodb.inc;
source include/have_debug.inc;
source include/not_embedded.inc;
source include/have_debug_sync.inc;
CREATE TABLE opening_lines (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
opening_line TEXT(500),
author VARCHAR(200),
title VARCHAR(200)
) ENGINE=InnoDB;
CREATE FULLTEXT INDEX idx ON opening_lines(opening_line);
CREATE FULLTEXT INDEX ft_idx1 ON opening_lines(title);
INSERT INTO opening_lines(opening_line,author,title) VALUES
('Call me Ishmael.','Herman Melville','Moby Dick'),
('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'),
('I am an invisible man.','Ralph Ellison','Invisible Man'),
('Where now? Who now? When now?','Samuel Beckett','The Unnamable'),
('It was love at first sight.','Joseph Heller','Catch-22'),
('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'),
('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'),
('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451');
SET GLOBAL innodb_ft_aux_table='test/opening_lines';
SELECT * FROM information_schema.innodb_ft_config;
SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');
SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('invisible');
SELECT * FROM opening_lines;
SET GLOBAL innodb_optimize_fulltext_only=ON;
SET DEBUG_SYNC='fts_crash_before_commit_sync SIGNAL hung WAIT_FOR ever';
send OPTIMIZE TABLE opening_lines;
connect(con1,localhost,root,,);
SET DEBUG_SYNC='now WAIT_FOR hung';
let $shutdown_timeout=0;
--source include/restart_mysqld.inc
SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael');
SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('invisible');
SELECT * FROM opening_lines;
DROP TABLE opening_lines;

6
mysql-test/suite/maria/range.result

@ -0,0 +1,6 @@
#
# MDEV-22935 Erroneous Aria Index / Optimizer behaviour
#
create table t1 (a char(255), b datetime, primary key(a,b)) engine=aria transactional=0 pack_keys=0;
insert into t1 select concat("hello world hello world", truncate(seq/100,0)),from_unixtime(seq+1) from seq_1_to_20000;
drop table t1;

22
mysql-test/suite/maria/range.test

@ -0,0 +1,22 @@
--source include/have_sequence.inc
--echo #
--echo # MDEV-22935 Erroneous Aria Index / Optimizer behaviour
--echo #
create table t1 (a char(255), b datetime, primary key(a,b)) engine=aria transactional=0 pack_keys=0;
insert into t1 select concat("hello world hello world", truncate(seq/100,0)),from_unixtime(seq+1) from seq_1_to_20000;
let $i= 200;
--disable_query_log
while ($i)
{
let $tmp= `select count(*) from t1 where a="hello world hello world$i" and b <= from_unixtime($i*100+1)`;
if (`SELECT $tmp != 1`)
{
--echo "Found $tmp rows, expected 1, for value $i"
}
dec $i;
}
--enable_query_log
drop table t1;

12
scripts/wsrep_sst_mariabackup.sh

@ -714,7 +714,7 @@ cleanup_at_exit()
fi
# Final cleanup
pgid=$(ps -o pgid= $$ 2>/dev/null | grep -o -E '[0-9]+' || :)
pgid=$(ps -o 'pgid=' $$ 2>/dev/null | grep -o -E '[0-9]+' || :)
# This means no setsid done in mysqld.
# We don't want to kill mysqld here otherwise.
@ -1086,17 +1086,19 @@ if [ "$WSREP_SST_OPT_ROLE" = 'donor' ]; then
tmpdir=$(parse_cnf "$encgroups" 'tmpdir')
if [ -z "$tmpdir" ]; then
xtmpdir="$(mktemp -d)"
itmpdir="$(mktemp -d)"
elif [ "$OS" = 'Linux' ]; then
xtmpdir=$(mktemp '-d' "--tmpdir=$tmpdir")
xtmpdir=$(mktemp -d "--tmpdir=$tmpdir")
itmpdir=$(mktemp -d "--tmpdir=$tmpdir")
else
xtmpdir=$(TMPDIR="$tmpdir"; mktemp '-d')
xtmpdir=$(TMPDIR="$tmpdir"; mktemp -d)
itmpdir=$(TMPDIR="$tmpdir"; mktemp -d)
fi
wsrep_log_info "Using '$xtmpdir' as mariadb-backup temporary directory"
tmpopts=" --tmpdir='$xtmpdir'"
itmpdir="$(mktemp -d)"
wsrep_log_info "Using '$itmpdir' as mariadb-abackup working directory"
wsrep_log_info "Using '$itmpdir' as mariadb-backup working directory"
usrst=0
if [ -n "$WSREP_SST_OPT_USER" ]; then

40
sql/field.cc

@ -7556,11 +7556,11 @@ double Field_string::val_real(void)
{
DBUG_ASSERT(marked_for_read());
THD *thd= get_thd();
return Converter_strntod_with_warn(get_thd(),
const LEX_CSTRING str= to_lex_cstring();
return Converter_strntod_with_warn(thd,
Warn_filter_string(thd, this),
Field_string::charset(),
(const char *) ptr,
field_length).result();
str.str, str.length).result();
}
@ -7568,10 +7568,10 @@ longlong Field_string::val_int(void)
{
DBUG_ASSERT(marked_for_read());
THD *thd= get_thd();
const LEX_CSTRING str= to_lex_cstring();
return Converter_strntoll_with_warn(thd, Warn_filter_string(thd, this),
Field_string::charset(),
(const char *) ptr,
field_length).result();
str.str, str.length).result();
}
@ -7587,20 +7587,26 @@ sql_mode_t Field_string::can_handle_sql_mode_dependency_on_store() const
}
String *Field_string::val_str(String *val_buffer __attribute__((unused)),
String *val_ptr)
LEX_CSTRING Field_string::to_lex_cstring() const
{
DBUG_ASSERT(marked_for_read());
/* See the comment for Field_long::store(long long) */
DBUG_ASSERT(!table || table->in_use == current_thd);
size_t length;
if (get_thd()->variables.sql_mode &
MODE_PAD_CHAR_TO_FULL_LENGTH)
length= field_charset()->charpos(ptr, ptr + field_length,
Field_string::char_length());
else
length= field_charset()->lengthsp((const char*) ptr, field_length);
val_ptr->set((const char*) ptr, length, field_charset());
if (get_thd()->variables.sql_mode & MODE_PAD_CHAR_TO_FULL_LENGTH)
return Lex_cstring((const char*) ptr,
field_charset()->charpos(ptr, ptr + field_length,
Field_string::char_length()));
return Lex_cstring((const char *) ptr,
field_charset()->lengthsp((const char*) ptr, field_length));
}
String *Field_string::val_str(String *val_buffer __attribute__((unused)),
String *val_ptr)
{
DBUG_ASSERT(marked_for_read());
const LEX_CSTRING str= to_lex_cstring();
val_ptr->set(str.str, str.length, field_charset());
return val_ptr;
}
@ -7609,12 +7615,12 @@ my_decimal *Field_string::val_decimal(my_decimal *decimal_value)
{
DBUG_ASSERT(marked_for_read());
THD *thd= get_thd();
const LEX_CSTRING str= to_lex_cstring();
Converter_str2my_decimal_with_warn(thd,
Warn_filter_string(thd, this),
E_DEC_FATAL_ERROR & ~E_DEC_BAD_NUM,
Field_string::charset(),
(const char *) ptr,
field_length, decimal_value);
str.str, str.length, decimal_value);
return decimal_value;
}

1
sql/field.h

@ -4045,6 +4045,7 @@ class Field_string final :public Field_longstr {
field_length >= 4 &&
orig_table->s->frm_version < FRM_VER_TRUE_VARCHAR;
}
LEX_CSTRING to_lex_cstring() const;
public:
bool can_alter_field_type;
Field_string(uchar *ptr_arg, uint32 len_arg,uchar *null_ptr_arg,

3
sql/ha_partition.cc

@ -3961,7 +3961,8 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
m_part_info->part_expr->get_monotonicity_info();
else if (m_part_info->list_of_part_fields)
m_part_func_monotonicity_info= MONOTONIC_STRICT_INCREASING;
info(HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_OPEN);
if ((error= info(HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_OPEN)))
goto err_handler;
DBUG_RETURN(0);
err_handler:

20
sql/item_jsonfunc.cc

@ -1013,11 +1013,18 @@ String *Item_func_json_extract::read_json(String *str,
je= sav_je;
}
for (int count= 0; count < count_path; count++)
if ((not_first_value && str->append(", ", 2)))
goto error;
while(count_path)
{
if (str->append((const char *) value, v_len) ||
str->append(", ", 2))
goto error; /* Out of memory. */
if (str->append((const char *) value, v_len))
goto error;
count_path--;
if (count_path)
{
if (str->append(", ", 2))
goto error;
}
}
not_first_value= 1;
@ -1039,11 +1046,6 @@ String *Item_func_json_extract::read_json(String *str,
goto return_null;
}
if (str->length()>2)
{
str->chop();
str->chop();
}
if (possible_multiple_values && str->append(']'))
goto error; /* Out of memory. */

4
sql/item_sum.cc

@ -196,7 +196,11 @@ bool Item_sum::check_sum_func(THD *thd, Item **ref)
}
if (window_func_sum_expr_flag)
{
thd->lex->in_sum_func= in_sum_func;
return false;
}
/*
The value of max_arg_level is updated if an argument of the set function
contains a column reference resolved against a subquery whose level is

14
sql/log.cc

@ -5284,6 +5284,15 @@ MYSQL_BIN_LOG::is_xidlist_idle_nolock()
return true;
}
#ifdef WITH_WSREP
static bool is_gtid_written_on_trans_start(const THD *thd)
{
return wsrep_on(thd) &&
(thd->variables.gtid_seq_no || thd->variables.wsrep_gtid_seq_no) &&
(thd->wsrep_cs().mode() == wsrep::client_state::m_local);
}
#endif
/**
Create a new log file name.
@ -5921,10 +5930,7 @@ THD::binlog_start_trans_and_stmt()
Ha_trx_info *ha_info;
ha_info= this->ha_data[binlog_hton->slot].ha_info + (mstmt_mode ? 1 : 0);
if (!ha_info->is_started() &&
(this->variables.gtid_seq_no || this->variables.wsrep_gtid_seq_no) &&
wsrep_on(this) &&
(this->wsrep_cs().mode() == wsrep::client_state::m_local))
if (!ha_info->is_started() && is_gtid_written_on_trans_start(this))
{
uchar *buf= 0;
size_t len= 0;

5
sql/log_event_server.cc

@ -1736,6 +1736,11 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
thd->variables.pseudo_thread_id= thread_id; // for temp tables
DBUG_PRINT("query",("%s", thd->query()));
#ifdef WITH_WSREP
WSREP_DEBUG("Query_log_event thread=%llu for query=%s",
thd_get_thread_id(thd), wsrep_thd_query(thd));
#endif
if (unlikely(!(expected_error= error_code)) ||
ignored_error_code(expected_error) ||
!unexpected_error_code(expected_error))

16
sql/rpl_gtid.cc

@ -697,13 +697,16 @@ rpl_slave_state::record_gtid(THD *thd, const rpl_gtid *gtid, uint64 sub_id,
#ifdef WITH_WSREP
/*
We should replicate local gtid_slave_pos updates to other nodes.
We should replicate local gtid_slave_pos updates to other nodes if
wsrep gtid mode is set.
In applier we should not append them to galera writeset.
*/
if (WSREP_ON_ && wsrep_thd_is_local(thd))
if (WSREP_ON_ && wsrep_gtid_mode && wsrep_thd_is_local(thd))
{
thd->wsrep_ignore_table= false;
table->file->row_logging= 1; // replication requires binary logging
if (thd->wsrep_next_trx_id() == WSREP_UNDEFINED_TRX_ID)
thd->set_query_id(next_query_id());
wsrep_start_trx_if_not_started(thd);
}
else
@ -875,10 +878,12 @@ rpl_slave_state::gtid_delete_pending(THD *thd,
#ifdef WITH_WSREP
/*
We should replicate local gtid_slave_pos updates to other nodes.
We should replicate local gtid_slave_pos updates to other nodes if
wsrep gtid mode is set.
In applier we should not append them to galera writeset.
*/
if (WSREP_ON_ && wsrep_thd_is_local(thd) &&
if (WSREP_ON_ && wsrep_gtid_mode &&
wsrep_thd_is_local(thd) &&
thd->wsrep_cs().state() != wsrep::client_state::s_none)
{
if (thd->wsrep_trx().active() == false)
@ -889,7 +894,8 @@ rpl_slave_state::gtid_delete_pending(THD *thd,
}
thd->wsrep_ignore_table= false;
}
thd->wsrep_ignore_table= true;
else
thd->wsrep_ignore_table= true;
#endif
thd_saved_option= thd->variables.option_bits;

4
sql/sql_locale.cc

@ -968,9 +968,9 @@ MY_LOCALE my_locale_hu_HU
/***** LOCALE BEGIN id_ID: Indonesian - Indonesia *****/
static const char *my_locale_month_names_id_ID[13] =
{"Januari","Pebruari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember", NullS };
{"Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember", NullS };
static const char *my_locale_ab_month_names_id_ID[13] =
{"Jan","Peb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des", NullS };
{"Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des", NullS };
static const char *my_locale_day_names_id_ID[8] =
{"Senin","Selasa","Rabu","Kamis","Jumat","Sabtu","Minggu", NullS };
static const char *my_locale_ab_day_names_id_ID[8] =

2
sql/transaction.cc

@ -191,7 +191,7 @@ bool trans_begin(THD *thd, uint flags)
}
#ifdef WITH_WSREP
if (wsrep_thd_is_local(thd))
if (WSREP(thd) && wsrep_thd_is_local(thd))
{
if (wsrep_sync_wait(thd))
DBUG_RETURN(TRUE);

4
storage/innobase/fil/fil0fil.cc

@ -2814,12 +2814,12 @@ fil_io_t fil_space_t::io(const IORequest &type, os_offset_t offset, size_t len,
}
DBUG_EXECUTE_IF("intermittent_recovery_failure",
if (type.is_read() && !(~get_rnd_value() & 0x3ff0))
if (type.is_read() && !(~my_timer_cycles() & 0x3ff0))
goto io_error;);
DBUG_EXECUTE_IF("intermittent_read_failure",
if (srv_was_started && type.is_read() &&
!(~get_rnd_value() & 0x3ff0)) goto io_error;);
!(~my_timer_cycles() & 0x3ff0)) goto io_error;);
if (UNIV_LIKELY_NULL(UT_LIST_GET_NEXT(chain, node))) {
ut_ad(this == fil_system.sys_space

165
storage/innobase/fts/fts0fts.cc

@ -2582,89 +2582,88 @@ fts_get_next_doc_id(
return(DB_SUCCESS);
}
/*********************************************************************//**
This function fetch the Doc ID from CONFIG table, and compare with
/** Read the synced document id from the fts configuration table
@param table fts table
@param doc_id document id to be read
@param trx transaction to read from config table
@return DB_SUCCESS in case of success */
static
dberr_t fts_read_synced_doc_id(const dict_table_t *table,
doc_id_t *doc_id,
trx_t *trx)
{
dberr_t error;
char table_name[MAX_FULL_NAME_LEN];
fts_table_t fts_table;
fts_table.suffix= "CONFIG";
fts_table.table_id= table->id;
fts_table.type= FTS_COMMON_TABLE;
fts_table.table= table;
ut_a(table->fts->doc_col != ULINT_UNDEFINED);
trx->op_info = "update the next FTS document id";
pars_info_t *info= pars_info_create();
pars_info_bind_function(info, "my_func", fts_fetch_store_doc_id,
doc_id);
fts_get_table_name(&fts_table, table_name);
pars_info_bind_id(info, "config_table", table_name);
que_t *graph= fts_parse_sql(
&fts_table, info,
"DECLARE FUNCTION my_func;\n"
"DECLARE CURSOR c IS SELECT value FROM $config_table"
" WHERE key = 'synced_doc_id' FOR UPDATE;\n"
"BEGIN\n"
""
"OPEN c;\n"
"WHILE 1 = 1 LOOP\n"
" FETCH c INTO my_func();\n"
" IF c % NOTFOUND THEN\n"
" EXIT;\n"
" END IF;\n"
"END LOOP;\n"
"CLOSE c;");
*doc_id= 0;
error = fts_eval_sql(trx, graph);
que_graph_free(graph);
return error;
}
/** This function fetch the Doc ID from CONFIG table, and compare with
the Doc ID supplied. And store the larger one to the CONFIG table.
@param table fts table
@param cmp_doc_id Doc ID to compare
@param doc_id larger document id after comparing "cmp_doc_id" to
the one stored in CONFIG table
@param trx transaction
@return DB_SUCCESS if OK */
static MY_ATTRIBUTE((nonnull))
static
dberr_t
fts_cmp_set_sync_doc_id(
/*====================*/
const dict_table_t* table, /*!< in: table */
doc_id_t cmp_doc_id, /*!< in: Doc ID to compare */
ibool read_only, /*!< in: TRUE if read the
synced_doc_id only */
doc_id_t* doc_id) /*!< out: larger document id
after comparing "cmp_doc_id"
to the one stored in CONFIG
table */
const dict_table_t *table,
doc_id_t cmp_doc_id,
doc_id_t *doc_id,
trx_t *trx=nullptr)
{
if (srv_read_only_mode) {
return DB_READ_ONLY;
}
trx_t* trx;
pars_info_t* info;
dberr_t error;
fts_table_t fts_table;
que_t* graph = NULL;
fts_cache_t* cache = table->fts->cache;
char table_name[MAX_FULL_NAME_LEN];
ut_a(table->fts->doc_col != ULINT_UNDEFINED);
fts_table.suffix = "CONFIG";
fts_table.table_id = table->id;
fts_table.type = FTS_COMMON_TABLE;
fts_table.table = table;
trx= trx_create();
retry:
trx_start_internal(trx);
trx->op_info = "update the next FTS document id";
info = pars_info_create();
pars_info_bind_function(
info, "my_func", fts_fetch_store_doc_id, doc_id);
fts_get_table_name(&fts_table, table_name);
pars_info_bind_id(info, "config_table", table_name);
graph = fts_parse_sql(
&fts_table, info,
"DECLARE FUNCTION my_func;\n"
"DECLARE CURSOR c IS SELECT value FROM $config_table"
" WHERE key = 'synced_doc_id' FOR UPDATE;\n"
"BEGIN\n"
""
"OPEN c;\n"
"WHILE 1 = 1 LOOP\n"
" FETCH c INTO my_func();\n"
" IF c % NOTFOUND THEN\n"
" EXIT;\n"
" END IF;\n"
"END LOOP;\n"
"CLOSE c;");
fts_cache_t* cache= table->fts->cache;
dberr_t error = DB_SUCCESS;
const trx_t* const caller_trx = trx;
*doc_id = 0;
error = fts_eval_sql(trx, graph);
que_graph_free(graph);
// FIXME: We need to retry deadlock errors
if (error != DB_SUCCESS) {
goto func_exit;
if (trx == nullptr) {
trx = trx_create();
trx_start_internal_read_only(trx);
}
retry:
error = fts_read_synced_doc_id(table, doc_id, trx);
if (read_only) {
/* InnoDB stores actual synced_doc_id value + 1 in
FTS_CONFIG table. Reduce the value by 1 while reading
after startup. */
if (*doc_id) *doc_id -= 1;
goto func_exit;
}
if (error != DB_SUCCESS) goto func_exit;
if (cmp_doc_id == 0 && *doc_id) {
cache->synced_doc_id = *doc_id - 1;
@ -2689,6 +2688,10 @@ retry:
func_exit:
if (caller_trx) {
return error;
}
if (UNIV_LIKELY(error == DB_SUCCESS)) {
fts_sql_commit(trx);
} else {
@ -2696,6 +2699,7 @@ func_exit:
ib::error() << "(" << error << ") while getting next doc id "
"for table " << table->name;
fts_sql_rollback(trx);
if (error == DB_DEADLOCK || error == DB_LOCK_WAIT_TIMEOUT) {
@ -4174,8 +4178,8 @@ fts_sync_commit(
/* After each Sync, update the CONFIG table about the max doc id
we just sync-ed to index table */
error = fts_cmp_set_sync_doc_id(sync->table, sync->max_doc_id, FALSE,
&last_doc_id);
error = fts_cmp_set_sync_doc_id(sync->table, sync->max_doc_id,
&last_doc_id, trx);
/* Get the list of deleted documents that are either in the
cache or were headed there but were deleted before the add
@ -4195,6 +4199,7 @@ fts_sync_commit(
mysql_mutex_unlock(&cache->lock);
if (UNIV_LIKELY(error == DB_SUCCESS)) {
DEBUG_SYNC_C("fts_crash_before_commit_sync");
fts_sql_commit(trx);
} else {
fts_sql_rollback(trx);
@ -4856,7 +4861,7 @@ fts_init_doc_id(
/* Then compare this value with the ID value stored in the CONFIG
table. The larger one will be our new initial Doc ID */
fts_cmp_set_sync_doc_id(table, 0, FALSE, &max_doc_id);
fts_cmp_set_sync_doc_id(table, 0, &max_doc_id);
/* If DICT_TF2_FTS_ADD_DOC_ID is set, we are in the process of
creating index (and add doc id column. No need to recovery
@ -6165,7 +6170,17 @@ fts_init_index(
start_doc = cache->synced_doc_id;
if (!start_doc) {
fts_cmp_set_sync_doc_id(table, 0, TRUE, &start_doc);
trx_t *trx = trx_create();
trx_start_internal_read_only(trx);
dberr_t err= fts_read_synced_doc_id(table, &start_doc, trx);
fts_sql_commit(trx);
trx->free();
if (err != DB_SUCCESS) {
goto func_exit;
}
if (start_doc) {
start_doc--;
}
cache->synced_doc_id = start_doc;
}

26
storage/innobase/include/ut0counter.h

@ -31,30 +31,6 @@ Created 2012/04/12 by Sunny Bains
#include "univ.i"
#include "my_rdtsc.h"
/** Use the result of my_timer_cycles(), which mainly uses RDTSC for cycles
as a random value. See the comments for my_timer_cycles() */
/** @return result from RDTSC or similar functions. */
static inline size_t
get_rnd_value()
{
size_t c = static_cast<size_t>(my_timer_cycles());
if (c != 0) {
return c;
}
/* We may go here if my_timer_cycles() returns 0,
so we have to have the plan B for the counter. */
#if !defined(_WIN32)
return (size_t)pthread_self();
#else
LARGE_INTEGER cnt;
QueryPerformanceCounter(&cnt);
return static_cast<size_t>(cnt.QuadPart);
#endif /* !_WIN32 */
}
/** Atomic which occupies whole CPU cache line.
Note: We rely on the default constructor of std::atomic and
do not explicitly initialize the contents. This works for us,
@ -90,7 +66,7 @@ struct ib_counter_t {
/** Add to the counter.
@param[in] n amount to be added */
void add(Type n) { add(get_rnd_value(), n); }
void add(Type n) { add(my_pseudo_random(), n); }
/** Add to the counter.
@param[in] index a reasonably thread-unique identifier

2
storage/innobase/log/log0sync.cc

@ -187,7 +187,7 @@ void group_commit_lock::set_pending(group_commit_lock::value_type num)
}
const unsigned int MAX_SPINS = 1; /** max spins in acquire */
thread_local group_commit_waiter_t thread_local_waiter;
static thread_local group_commit_waiter_t thread_local_waiter;
static inline void do_completion_callback(const completion_callback* cb)
{

15
storage/maria/ma_range.c

@ -191,8 +191,8 @@ static ha_rows _ma_record_pos(MARIA_HA *info, const uchar *key_data,
info->s->state.key_root[inx], final_page);
if (pos >= 0.0)
{
DBUG_PRINT("exit",("pos: %ld",(ulong) (pos*info->state->records)));
DBUG_RETURN((ulong) (pos*info->state->records+0.5));
DBUG_PRINT("exit",("pos: %lld",(longlong) (pos*info->state->records)));
DBUG_RETURN((ha_rows) (pos*info->state->records+0.5));
}
DBUG_RETURN(HA_POS_ERROR);
}
@ -214,7 +214,7 @@ static double _ma_search_pos(MARIA_HA *info, MARIA_KEY *key,
{
int flag;
uint keynr, UNINIT_VAR(max_keynr);
my_bool after_key;
my_bool last_key_on_page;
uchar *keypos;
double offset;
MARIA_KEYDEF *keyinfo= key->keyinfo;
@ -230,7 +230,7 @@ static double _ma_search_pos(MARIA_HA *info, MARIA_KEY *key,
goto err;
*final_page= pos;
flag= (*keyinfo->bin_search)(key, &page, nextflag, &keypos,
info->lastkey_buff, &after_key);
info->lastkey_buff, &last_key_on_page);
keynr= _ma_keynr(&page, keypos, &max_keynr);
if (flag)
@ -274,7 +274,7 @@ static double _ma_search_pos(MARIA_HA *info, MARIA_KEY *key,
There may be identical keys in the tree. Try to match on of those.
Matches keynr + [0-1]
*/
if ((offset= _ma_search_pos(info, key, SEARCH_FIND,
if ((offset= _ma_search_pos(info, key, nextflag,
_ma_kpos(page.node,keypos),
final_page)) < 0)
DBUG_RETURN(offset); /* Read error */
@ -290,9 +290,10 @@ err:
/*
Get keynummer of current key and max number of keys in nod
Get keynumber of current key and max number of keys in nod
keynr >= 0 && key_nr <= max_key
@return key position on page (0 - (ret_max_key - 1))
ret_max_key contains how many keys there was on the page
*/
static uint _ma_keynr(MARIA_PAGE *page, uchar *keypos, uint *ret_max_key)

12
storage/mroonga/vendor/groonga/lib/CMakeLists.txt

@ -188,3 +188,15 @@ IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" AND
CMAKE_C_COMPILER_VERSION VERSION_GREATER "5")
ADD_COMPILE_FLAGS(ts/ts_expr_node.c COMPILE_FLAGS "-fno-tree-loop-vectorize")
ENDIF()
# Workaround long compile times with GCC and sanitizers
IF(CMAKE_C_COMPILER_ID STREQUAL "GNU"
AND CMAKE_C_COMPILER_VERSION VERSION_GREATER "11.99")
IF(WITH_UBSAN)
ADD_COMPILE_FLAGS(expr.c COMPILE_FLAGS "-fno-sanitize=undefined")
ENDIF()
IF(WITH_ASAN)
ADD_COMPILE_FLAGS(expr.c COMPILE_FLAGS "-fno-sanitize=address")
ENDIF()
ENDIF()

36
storage/spider/mysql-test/spider/bugfix/r/mdev_27186.result

@ -0,0 +1,36 @@
INSTALL SONAME 'ha_spider';
Warnings:
Warning 1105 Cannot enable tc-log at run-time. XA features of SPIDER are disabled
CREATE TABLE t (s INT) ENGINE=SPIDER PARTITION BY HASH (s);
LOAD INDEX INTO CACHE t PARTITION (p,p1);
Table Op Msg_type Msg_text
test.t preload_keys Error Unable to connect to foreign data source: localhost
test.t preload_keys Error Unable to connect to foreign data source: localhost
test.t preload_keys Error Unable to connect to foreign data source: localhost
test.t preload_keys Error Unable to connect to foreign data source: localhost
test.t preload_keys Error Unable to connect to foreign data source: localhost
test.t preload_keys Error Unable to connect to foreign data source: localhost
test.t preload_keys error Corrupt
DROP TABLE t;
CREATE TABLE t (c INT PRIMARY KEY) ENGINE=SPIDER PARTITION BY KEY() PARTITIONS 2;
HANDLER t OPEN AS h;
ERROR HY000: Unable to connect to foreign data source: localhost
DROP TABLE t;
CREATE TABLE t (c INT PRIMARY KEY) ENGINE=SPIDER PARTITION BY HASH (c) PARTITIONS 2;
CREATE TRIGGER t AFTER INSERT ON t FOR EACH ROW INSERT INTO t VALUES(0);
ERROR HY000: Unable to connect to foreign data source: localhost
DROP TABLE t;
CREATE TABLE t (b INT) ENGINE=InnoDB;
PREPARE s FROM 'SELECT * FROM t LIMIT 2';
DROP TABLE t;
CREATE TABLE t (a INT) ENGINE=Spider PARTITION BY LIST (a) PARTITIONS 2 (PARTITION p1 VALUES IN (0,1),PARTITION p2 VALUES IN (2,3));
EXECUTE s;
ERROR HY000: Unable to connect to foreign data source: localhost
DROP TABLE t;
CREATE TABLE t (c INT) ENGINE=InnoDB;
LOCK TABLES t WRITE;
CREATE OR REPLACE TABLE t (d INT) ENGINE=Spider PARTITION BY LIST COLUMNS (d) (PARTITION p VALUES IN (0));
ERROR HY000: Unable to connect to foreign data source: localhost
drop table t;
Warnings:
Warning 1620 Plugin is busy and will be uninstalled on shutdown

4
storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result

@ -8,5 +8,5 @@ SELECT * FROM information_schema.SPIDER_ALLOC_MEM;
ID FUNC_NAME FILE_NAME LINE_NO TOTAL_ALLOC_MEM CURRENT_ALLOC_MEM ALLOC_MEM_COUNT FREE_MEM_COUNT
SELECT * FROM information_schema.SPIDER_WRAPPER_PROTOCOLS;
WRAPPER_NAME WRAPPER_VERSION WRAPPER_DESCRIPTION WRAPPER_MATURITY
mysql 3.4.0 For communicating to MySQL using native protocol Stable
mariadb 3.4.0 For communicating to MariaDB using native protocol Stable
mysql 3.4.0 For communication with MySQL using the native protocol Stable
mariadb 3.4.0 For communication with MariaDB using the native protocol Stable

1
storage/spider/mysql-test/spider/bugfix/t/mdev_27186.opt

@ -0,0 +1 @@
--skip-log-bin

37
storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test

@ -0,0 +1,37 @@
INSTALL SONAME 'ha_spider';
# MDEV-27186
CREATE TABLE t (s INT) ENGINE=SPIDER PARTITION BY HASH (s);
LOAD INDEX INTO CACHE t PARTITION (p,p1);
DROP TABLE t;
# MDEV-27237
CREATE TABLE t (c INT PRIMARY KEY) ENGINE=SPIDER PARTITION BY KEY() PARTITIONS 2;
--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
HANDLER t OPEN AS h;
DROP TABLE t;
# MDEV-27334
CREATE TABLE t (c INT PRIMARY KEY) ENGINE=SPIDER PARTITION BY HASH (c) PARTITIONS 2;
--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
CREATE TRIGGER t AFTER INSERT ON t FOR EACH ROW INSERT INTO t VALUES(0);
DROP TABLE t;
# MDEV-28241
CREATE TABLE t (b INT) ENGINE=InnoDB;
PREPARE s FROM 'SELECT * FROM t LIMIT 2';
DROP TABLE t;
CREATE TABLE t (a INT) ENGINE=Spider PARTITION BY LIST (a) PARTITIONS 2 (PARTITION p1 VALUES IN (0,1),PARTITION p2 VALUES IN (2,3));
--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
EXECUTE s;
DROP TABLE t;
# MDEV-34101
CREATE TABLE t (c INT) ENGINE=InnoDB;
LOCK TABLES t WRITE;
--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
CREATE OR REPLACE TABLE t (d INT) ENGINE=Spider PARTITION BY LIST COLUMNS (d) (PARTITION p VALUES IN (0));
drop table t;
--disable_query_log
--source ../../include/clean_up_spider.inc

4
storage/spider/spd_db_mysql.cc

@ -325,7 +325,7 @@ SPIDER_DBTON spider_dbton_mysql = {
spider_mysql_create_conn,
spider_mysql_support_direct_join,
&spider_db_mysql_utility,
"For communicating to MySQL using native protocol",
"For communication with MySQL using the native protocol",
"3.4.0",
SPIDER_MATURITY_STABLE
};
@ -342,7 +342,7 @@ SPIDER_DBTON spider_dbton_mariadb = {
spider_mariadb_create_conn,
spider_mariadb_support_direct_join,
&spider_db_mariadb_utility,
"For communicating to MariaDB using native protocol",
"For communication with MariaDB using the native protocol",
"3.4.0",
SPIDER_MATURITY_STABLE
};

2
storage/spider/spd_db_oracle.cc

@ -332,7 +332,7 @@ SPIDER_DBTON spider_dbton_oracle = {
spider_oracle_create_conn,
spider_oracle_support_direct_join,
&spider_db_oracle_utility,
"For communicating Oracle using native protocol",
"For communication with Oracle using the native protocol",
"1.0.0",
SPIDER_MATURITY_BETA
};

8
storage/spider/spd_err.h

@ -80,13 +80,13 @@
#define ER_SPIDER_XA_PREPARED_NUM 12604
#define ER_SPIDER_XA_PREPARED_STR "This xid is prepared"
#define ER_SPIDER_XA_EXISTS_NUM 12605
#define ER_SPIDER_XA_EXISTS_STR "This xid is already exist"
#define ER_SPIDER_XA_EXISTS_STR "This xid already exists"
#define ER_SPIDER_XA_MEMBER_EXISTS_NUM 12606
#define ER_SPIDER_XA_MEMBER_EXISTS_STR "This xid member is already exist"
#define ER_SPIDER_XA_MEMBER_EXISTS_STR "This xid member already exists"
#define ER_SPIDER_XA_NOT_EXISTS_NUM 12607
#define ER_SPIDER_XA_NOT_EXISTS_STR "This xid is not exist"
#define ER_SPIDER_XA_NOT_EXISTS_STR "This xid does not exist"
#define ER_SPIDER_XA_MEMBER_NOT_EXISTS_NUM 12608
#define ER_SPIDER_XA_MEMBER_NOT_EXISTS_STR "This xid member is not exist"
#define ER_SPIDER_XA_MEMBER_NOT_EXISTS_STR "This xid member does not exist"
#define ER_SPIDER_SYS_TABLE_VERSION_NUM 12609
#define ER_SPIDER_SYS_TABLE_VERSION_STR "System table %s is different version"
#define ER_SPIDER_WRONG_CHARACTER_IN_NAME_NUM 12611

2
wsrep-lib

@ -1 +1 @@
Subproject commit dfc4bdb8a5dcbd6fbea007ad3beff899a6b5b7bd
Subproject commit 31db8476768ba68296ad91b6785bb06a6a9abf71
Loading…
Cancel
Save