Skip to content

Commit c924e39

Browse files
committed
MDEV-18153 Assertion 0' or Assertion btr_validate_index(index, 0)' failed in row_upd_sec_index_entry or error code 126: Index is corrupted upon UPDATE with TIME_ROUND_FRACTIONAL
Conversion to a temporal data type resulting into a lower precision depends on TIME_ROUND_FRACTIONAL. Taking into account this dependency in: - indexed generated virtual column expressions - persistent virtual column expressions A warning is now issued if conversion from the generation expression to the column data type depends on TIME_ROUND_FRACTIONAL. The warning will be changed to error in 10.5
1 parent 368e64a commit c924e39

13 files changed

+690
-3
lines changed

mysql-test/suite/gcol/r/gcol_ins_upd_myisam.result

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,8 +549,13 @@ a BLOB GENERATED ALWAYS AS ('') VIRTUAL,
549549
b TIMESTAMP(4) GENERATED ALWAYS AS ('') VIRTUAL,
550550
KEY (a(183),b)
551551
);
552+
Warnings:
553+
Warning 1901 Function or expression '''' cannot be used in the GENERATED ALWAYS AS clause of `b`
554+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
552555
INSERT IGNORE INTO t VALUES(), (), ();
553556
Warnings:
557+
Warning 1901 Function or expression '''' cannot be used in the GENERATED ALWAYS AS clause of `b`
558+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
554559
Warning 1265 Data truncated for column 'b' at row 1
555560
Warning 1265 Data truncated for column 'b' at row 2
556561
Warning 1265 Data truncated for column 'b' at row 3

mysql-test/suite/vcol/r/vcol_keys_innodb.result

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,11 @@ insert into t1 (col_varchar,col_int,col_datetime,col_time,col_blob,col_bit,col_y
257257
('foo',1,'2010-05-08 13:08:12.034783','18:32:14','foo',b'0111110101001001',1992,'f',0.2,'','1994-12-26','2019-01-11 00:00:00'),
258258
('bar',6,'1900-01-01 00:00:00','00:00:00','bar',b'10011000001101011000101',1985,'b',0.7,'','2028-04-06','1971-01-01 00:00:00');
259259
alter table t1 add index(vcol_datetime);
260+
Warnings:
261+
Warning 1901 Function or expression '`col_datetime`' cannot be used in the GENERATED ALWAYS AS clause of `vcol_datetime`
262+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
263+
Warning 1901 Function or expression '`col_datetime`' cannot be used in the GENERATED ALWAYS AS clause of `vcol_datetime`
264+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
260265
drop table t1;
261266
create table t1 (
262267
pk int,

mysql-test/suite/vcol/r/vcol_sql_mode.result

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ t1 CREATE TABLE `t1` (
2626
) ENGINE=MyISAM DEFAULT CHARSET=latin1
2727
DROP TABLE t1;
2828
CREATE TABLE t1 (a CHAR(5), v TIME AS (a) VIRTUAL, KEY(v));
29+
Warnings:
30+
Warning 1901 Function or expression '`a`' cannot be used in the GENERATED ALWAYS AS clause of `v`
31+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
2932
DROP TABLE t1;
3033
CREATE TABLE t1 (c CHAR(8), v BINARY(8) AS (c), KEY(v));
3134
Warnings:
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#
2+
# Start of 10.4 tests
3+
#
4+
#
5+
# MDEV-18153 Assertion `0' or Assertion `btr_validate_index(index, 0)' failed in row_upd_sec_index_entry or error code 126: Index is corrupted upon UPDATE with TIME_ROUND_FRACTIONAL
6+
#
7+
SET sql_mode=DEFAULT;
8+
# OK: same FSP + virtual index
9+
CREATE TABLE t1 (
10+
t DATETIME(4),
11+
d DATETIME,
12+
v DATETIME(4) AS (t) VIRTUAL,
13+
KEY(v,d)
14+
);
15+
DROP TABLE t1;
16+
CREATE TABLE t1 (
17+
t DATETIME(4),
18+
d DATETIME,
19+
v DATETIME(4) AS ('2001-01-01 10:20:30.1234') VIRTUAL,
20+
KEY(v,d)
21+
);
22+
DROP TABLE t1;
23+
# OK: lower FSP + no virtual index
24+
CREATE TABLE t1 (
25+
t DATETIME(4),
26+
d DATETIME,
27+
v DATETIME(3) AS (t) VIRTUAL
28+
);
29+
DROP TABLE t1;
30+
CREATE TABLE t1 (
31+
t DATETIME(4),
32+
d DATETIME,
33+
v DATETIME(3) AS ('2001-01-01 10:20:30.1234') VIRTUAL
34+
);
35+
DROP TABLE t1;
36+
# NOT OK: lower FSP + virtual index
37+
CREATE TABLE t1 (
38+
t DATETIME(4),
39+
d DATETIME,
40+
v DATETIME(3) AS (t) VIRTUAL,
41+
KEY(v,d)
42+
);
43+
Warnings:
44+
Warning 1901 Function or expression '`t`' cannot be used in the GENERATED ALWAYS AS clause of `v`
45+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
46+
DROP TABLE t1;
47+
CREATE TABLE t1 (
48+
t DATETIME(4),
49+
d DATETIME,
50+
v DATETIME(3) AS (COALESCE(t)) VIRTUAL,
51+
KEY(v,d)
52+
);
53+
Warnings:
54+
Warning 1901 Function or expression 'coalesce(`t`)' cannot be used in the GENERATED ALWAYS AS clause of `v`
55+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
56+
DROP TABLE t1;
57+
CREATE TABLE t1 (
58+
t DATETIME(4),
59+
d DATETIME,
60+
v DATETIME(3) AS ('2001-01-01 10:20:30.1234') VIRTUAL,
61+
KEY(v,d)
62+
);
63+
Warnings:
64+
Warning 1901 Function or expression ''2001-01-01 10:20:30.1234'' cannot be used in the GENERATED ALWAYS AS clause of `v`
65+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
66+
DROP TABLE t1;
67+
# OK: lower FSP + ROUND + virtual index
68+
SET sql_mode=DEFAULT;
69+
CREATE TABLE t1 (
70+
t DATETIME(4),
71+
d DATETIME,
72+
v DATETIME(3) AS (ROUND(t,3)) VIRTUAL,
73+
KEY(v,d)
74+
);
75+
INSERT IGNORE INTO t1 (t,d) VALUES ('2006-03-01 12:44:34.0496','2029-10-10 21:27:53');
76+
SELECT * FROM t1;
77+
t d v
78+
2006-03-01 12:44:34.0496 2029-10-10 21:27:53 2006-03-01 12:44:34.050
79+
SET SQL_MODE= 'TIME_ROUND_FRACTIONAL';
80+
UPDATE IGNORE t1 SET d = NOW();
81+
DROP TABLE t1;
82+
SET sql_mode=DEFAULT;
83+
# OK: lower FSP + TRUNCATE + virtual index
84+
SET sql_mode=DEFAULT;
85+
CREATE TABLE t1 (
86+
t DATETIME(4),
87+
d DATETIME,
88+
v DATETIME(3) AS (TRUNCATE(t,3)) VIRTUAL,
89+
KEY(v,d)
90+
);
91+
INSERT IGNORE INTO t1 (t,d) VALUES ('2006-03-01 12:44:34.0496','2029-10-10 21:27:53');
92+
SELECT * FROM t1;
93+
t d v
94+
2006-03-01 12:44:34.0496 2029-10-10 21:27:53 2006-03-01 12:44:34.049
95+
SET SQL_MODE= 'TIME_ROUND_FRACTIONAL';
96+
UPDATE IGNORE t1 SET d = NOW();
97+
DROP TABLE t1;
98+
SET sql_mode=DEFAULT;
99+
#
100+
# End of 10.4 tests
101+
#
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#
2+
# Start of 10.4 tests
3+
#
4+
#
5+
# MDEV-18153 Assertion `0' or Assertion `btr_validate_index(index, 0)' failed in row_upd_sec_index_entry or error code 126: Index is corrupted upon UPDATE with TIME_ROUND_FRACTIONAL
6+
#
7+
SET sql_mode=DEFAULT;
8+
# OK: same FSP + virtual index
9+
CREATE TABLE t1 (
10+
t TIME(4),
11+
d TIME,
12+
v TIME(4) AS (t) VIRTUAL,
13+
KEY(v,d)
14+
);
15+
DROP TABLE t1;
16+
CREATE TABLE t1 (
17+
t TIME(4),
18+
d TIME,
19+
v TIME(4) AS ('10:20:30.1234') VIRTUAL,
20+
KEY(v,d)
21+
);
22+
DROP TABLE t1;
23+
# OK: lower FSP + no virtual index
24+
CREATE TABLE t1 (
25+
t TIME(4),
26+
d TIME,
27+
v TIME(3) AS (t) VIRTUAL
28+
);
29+
DROP TABLE t1;
30+
CREATE TABLE t1 (
31+
t TIME(4),
32+
d TIME,
33+
v TIME(3) AS ('2001-01-01 10:20:30.1234') VIRTUAL
34+
);
35+
DROP TABLE t1;
36+
# NOT OK: lower FSP + virtual index
37+
CREATE TABLE t1 (
38+
t TIME(4),
39+
d TIME,
40+
v TIME(3) AS (t) VIRTUAL,
41+
KEY(v,d)
42+
);
43+
Warnings:
44+
Warning 1901 Function or expression '`t`' cannot be used in the GENERATED ALWAYS AS clause of `v`
45+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
46+
DROP TABLE t1;
47+
CREATE TABLE t1 (
48+
t TIME(4),
49+
d TIME,
50+
v TIME(3) AS (COALESCE(t)) VIRTUAL,
51+
KEY(v,d)
52+
);
53+
Warnings:
54+
Warning 1901 Function or expression 'coalesce(`t`)' cannot be used in the GENERATED ALWAYS AS clause of `v`
55+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
56+
DROP TABLE t1;
57+
CREATE TABLE t1 (
58+
t TIME(4),
59+
d TIME,
60+
v TIME(3) AS ('2001-01-01 10:20:30.1234') VIRTUAL,
61+
KEY(v,d)
62+
);
63+
Warnings:
64+
Warning 1901 Function or expression ''2001-01-01 10:20:30.1234'' cannot be used in the GENERATED ALWAYS AS clause of `v`
65+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
66+
DROP TABLE t1;
67+
# OK: lower FSP + ROUND + virtual index
68+
SET sql_mode=DEFAULT;
69+
CREATE TABLE t1 (
70+
t TIME(4),
71+
d TIME,
72+
v TIME(3) AS (ROUND(t,3)) VIRTUAL,
73+
KEY(v,d)
74+
);
75+
INSERT IGNORE INTO t1 (t,d) VALUES ('12:44:34.0496','21:27:53');
76+
SELECT * FROM t1;
77+
t d v
78+
12:44:34.0496 21:27:53 12:44:34.050
79+
SET SQL_MODE= 'TIME_ROUND_FRACTIONAL';
80+
UPDATE IGNORE t1 SET d = CURRENT_TIME;
81+
DROP TABLE t1;
82+
SET sql_mode=DEFAULT;
83+
# OK: lower FSP + TRUNCATE + virtual index
84+
SET sql_mode=DEFAULT;
85+
CREATE TABLE t1 (
86+
t TIME(4),
87+
d TIME,
88+
v TIME(3) AS (TRUNCATE(t,3)) VIRTUAL,
89+
KEY(v,d)
90+
);
91+
INSERT IGNORE INTO t1 (t,d) VALUES ('12:44:34.0496','21:27:53');
92+
SELECT * FROM t1;
93+
t d v
94+
12:44:34.0496 21:27:53 12:44:34.049
95+
SET SQL_MODE= 'TIME_ROUND_FRACTIONAL';
96+
UPDATE IGNORE t1 SET d = CURRENT_TIME;
97+
DROP TABLE t1;
98+
SET sql_mode=DEFAULT;
99+
#
100+
# End of 10.4 tests
101+
#
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#
2+
# Start of 10.4 tests
3+
#
4+
#
5+
# MDEV-18153 Assertion `0' or Assertion `btr_validate_index(index, 0)' failed in row_upd_sec_index_entry or error code 126: Index is corrupted upon UPDATE with TIME_ROUND_FRACTIONAL
6+
#
7+
SET sql_mode=DEFAULT;
8+
# OK: same FSP + virtual index
9+
CREATE TABLE t1 (
10+
t TIMESTAMP(4),
11+
d DATETIME,
12+
v TIMESTAMP(4) AS (t) VIRTUAL,
13+
KEY(v,d)
14+
);
15+
DROP TABLE t1;
16+
CREATE TABLE t1 (
17+
t TIMESTAMP(4),
18+
d DATETIME,
19+
v TIMESTAMP(4) AS ('2001-01-01 10:20:30.1234') VIRTUAL,
20+
KEY(v,d)
21+
);
22+
DROP TABLE t1;
23+
# OK: lower FSP + no virtual index
24+
CREATE TABLE t1 (
25+
t TIMESTAMP(4),
26+
d DATETIME,
27+
v TIMESTAMP(3) AS (t) VIRTUAL
28+
);
29+
DROP TABLE t1;
30+
CREATE TABLE t1 (
31+
t TIMESTAMP(4),
32+
d DATETIME,
33+
v TIMESTAMP(3) AS ('2001-01-01 10:20:30.1234') VIRTUAL
34+
);
35+
DROP TABLE t1;
36+
# NOT OK: lower FSP + virtual index
37+
CREATE TABLE t1 (
38+
t TIMESTAMP(4),
39+
d DATETIME,
40+
v TIMESTAMP(3) AS (t) VIRTUAL,
41+
KEY(v,d)
42+
);
43+
Warnings:
44+
Warning 1901 Function or expression '`t`' cannot be used in the GENERATED ALWAYS AS clause of `v`
45+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
46+
DROP TABLE t1;
47+
CREATE TABLE t1 (
48+
t TIMESTAMP(4),
49+
d DATETIME,
50+
v TIMESTAMP(3) AS (COALESCE(t)) VIRTUAL,
51+
KEY(v,d)
52+
);
53+
Warnings:
54+
Warning 1901 Function or expression 'coalesce(`t`)' cannot be used in the GENERATED ALWAYS AS clause of `v`
55+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
56+
DROP TABLE t1;
57+
CREATE TABLE t1 (
58+
t TIMESTAMP(4),
59+
d DATETIME,
60+
v TIMESTAMP(3) AS ('2001-01-01 10:20:30.1234') VIRTUAL,
61+
KEY(v,d)
62+
);
63+
Warnings:
64+
Warning 1901 Function or expression ''2001-01-01 10:20:30.1234'' cannot be used in the GENERATED ALWAYS AS clause of `v`
65+
Warning 1105 Expression depends on the @@sql_mode value TIME_ROUND_FRACTIONAL
66+
DROP TABLE t1;
67+
# OK: lower FSP + ROUND + virtual index
68+
SET sql_mode=DEFAULT;
69+
CREATE TABLE t1 (
70+
t TIMESTAMP(4),
71+
d DATETIME,
72+
v TIMESTAMP(3) AS (ROUND(t,3)) VIRTUAL,
73+
KEY(v,d)
74+
);
75+
INSERT IGNORE INTO t1 (t,d) VALUES ('2006-03-01 12:44:34.0496','2029-10-10 21:27:53');
76+
SELECT * FROM t1;
77+
t d v
78+
2006-03-01 12:44:34.0496 2029-10-10 21:27:53 2006-03-01 12:44:34.050
79+
SET SQL_MODE= 'TIME_ROUND_FRACTIONAL';
80+
UPDATE IGNORE t1 SET d = NOW();
81+
DROP TABLE t1;
82+
SET sql_mode=DEFAULT;
83+
# OK: lower FSP + TRUNCATE + virtual index
84+
SET sql_mode=DEFAULT;
85+
CREATE TABLE t1 (
86+
t TIMESTAMP(4),
87+
d DATETIME,
88+
v TIMESTAMP(3) AS (TRUNCATE(t,3)) VIRTUAL,
89+
KEY(v,d)
90+
);
91+
INSERT IGNORE INTO t1 (t,d) VALUES ('2006-03-01 12:44:34.0496','2029-10-10 21:27:53');
92+
SELECT * FROM t1;
93+
t d v
94+
2006-03-01 12:44:34.0496 2029-10-10 21:27:53 2006-03-01 12:44:34.049
95+
SET SQL_MODE= 'TIME_ROUND_FRACTIONAL';
96+
UPDATE IGNORE t1 SET d = NOW();
97+
DROP TABLE t1;
98+
SET sql_mode=DEFAULT;
99+
#
100+
# End of 10.4 tests
101+
#

0 commit comments

Comments
 (0)