mirror of
https://github.com/MariaDB/server.git
synced 2026-10-23 18:49:29 +03:00
Merge 10.5 into 10.6
This commit is contained in:
10
appveyor.yml
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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
#
|
||||
#
|
||||
|
||||
@@ -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 #
|
||||
|
||||
@@ -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
Normal file
40
mysql-test/main/type_char.result
Normal file
@@ -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
Normal file
19
mysql-test/main/type_char.test
Normal file
@@ -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 #
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 #
|
||||
|
||||
@@ -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...'
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Normal file
6
mysql-test/suite/galera/r/MDEV-33523.result
Normal file
@@ -0,0 +1,6 @@
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
SET SESSION wsrep_on=OFF;
|
||||
BEGIN;
|
||||
ROLLBACK;
|
||||
SET SESSION wsrep_on=OFF;
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
Normal file
71
mysql-test/suite/galera/r/galera_replica_no_gtid.result
Normal file
@@ -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
Normal file
11
mysql-test/suite/galera/t/MDEV-33523.test
Normal file
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Normal file
9
mysql-test/suite/galera/t/galera_replica_no_gtid.cnf
Normal file
@@ -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
Normal file
124
mysql-test/suite/galera/t/galera_replica_no_gtid.test
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
@@ -0,0 +1 @@
|
||||
--innodb_ft_config
|
||||
@@ -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
Normal file
6
mysql-test/suite/maria/range.result
Normal file
@@ -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
Normal file
22
mysql-test/suite/maria/range.test
Normal file
@@ -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;
|
||||
@@ -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
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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. */
|
||||
|
||||
|
||||
@@ -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
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;
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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] =
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_cache_t* cache= table->fts->cache;
|
||||
dberr_t error = DB_SUCCESS;
|
||||
const trx_t* const caller_trx = trx;
|
||||
|
||||
fts_table.suffix = "CONFIG";
|
||||
fts_table.table_id = table->id;
|
||||
fts_table.type = FTS_COMMON_TABLE;
|
||||
fts_table.table = table;
|
||||
|
||||
trx= trx_create();
|
||||
if (trx == nullptr) {
|
||||
trx = trx_create();
|
||||
trx_start_internal_read_only(trx);
|
||||
}
|
||||
retry:
|
||||
trx_start_internal(trx);
|
||||
error = fts_read_synced_doc_id(table, doc_id, 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;");
|
||||
|
||||
*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 (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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Normal file
36
storage/spider/mysql-test/spider/bugfix/r/mdev_27186.result
Normal file
@@ -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
|
||||
@@ -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
Normal file
1
storage/spider/mysql-test/spider/bugfix/t/mdev_27186.opt
Normal file
@@ -0,0 +1 @@
|
||||
--skip-log-bin
|
||||
37
storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test
Normal file
37
storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test
Normal file
@@ -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
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
Submodule wsrep-lib updated: dfc4bdb8a5...31db847676
Reference in New Issue
Block a user