1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
|
#
# Test keywords as fields
#
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1 (time time, date date, timestamp timestamp,
quarter int, week int, year int, timestampadd int, timestampdiff int);
insert into t1 values ("12:22:22","97:02:03","1997-01-02",1,2,3,4,5);
select * from t1;
select t1.time+0,t1.date+0,t1.timestamp+0,concat(date," ",time),
t1.quarter+t1.week, t1.year+timestampadd, timestampdiff from t1;
drop table t1;
create table events(binlog int);
insert into events values(1);
select events.binlog from events;
drop table events;
# End of 4.1 tests
#
# Bug#19939 "AUTHORS is not a keyword"
#
delimiter |;
create procedure p1()
begin
declare n int default 2;
authors: while n > 0 do
set n = n -1;
end while authors;
end|
create procedure p2()
begin
declare n int default 2;
contributors: while n > 0 do
set n = n -1;
end while contributors;
end|
delimiter ;|
drop procedure p1;
drop procedure p2;
# End of 5.1 tests
#
# Bug#12204 - CONNECTION should not be a reserved word
#
create table t1 (connection int, b int);
delimiter |;
create procedure p1()
begin
declare connection int;
select max(t1.connection) into connection from t1;
select concat("max=",connection) 'p1';
end|
delimiter ;|
insert into t1 (connection) values (1);
call p1();
drop procedure p1;
drop table t1;
# End of 5.0 tests
#
# BUG#57899: Certain reserved words should not be reserved
#
#
# We are looking for SYNTAX ERRORS here, so no need to
# log the queries
#
CREATE TABLE slow (slow INT, general INT, master_heartbeat_period INT, ignore_server_ids INT);
INSERT INTO slow(slow, general, master_heartbeat_period, ignore_server_ids) VALUES (1,2,3,4), (5,6,7,8);
INSERT INTO slow(slow, general, master_heartbeat_period) VALUES (1,2,3), (5,6,7);
INSERT INTO slow(slow, general) VALUES (1,2), (5,6);
INSERT INTO slow(slow) VALUES (1), (5);
SELECT slow, general, master_heartbeat_period, ignore_server_ids FROM slow ORDER BY slow;
SELECT slow, general, master_heartbeat_period FROM slow ORDER BY slow;
SELECT slow, master_heartbeat_period FROM slow ORDER BY slow;
SELECT slow FROM slow ORDER BY slow;
DROP TABLE slow;
CREATE TABLE general (slow INT, general INT, master_heartbeat_period INT, ignore_server_ids INT);
INSERT INTO general(slow, general, master_heartbeat_period, ignore_server_ids) VALUES (1,2,3,4), (5,6,7,8);
INSERT INTO general(slow, general, master_heartbeat_period) VALUES (1,2,3), (5,6,7);
INSERT INTO general(slow, general) VALUES (1,2), (5,6);
INSERT INTO general(slow) VALUES (1), (5);
SELECT slow, general, master_heartbeat_period, ignore_server_ids FROM general ORDER BY slow;
SELECT slow, general, master_heartbeat_period FROM general ORDER BY slow;
SELECT slow, master_heartbeat_period FROM general ORDER BY slow;
SELECT slow FROM general ORDER BY slow;
DROP TABLE general;
CREATE TABLE master_heartbeat_period (slow INT, general INT, master_heartbeat_period INT, ignore_server_ids INT);
INSERT INTO master_heartbeat_period(slow, general, master_heartbeat_period, ignore_server_ids) VALUES (1,2,3,4), (5,6,7,8);
INSERT INTO master_heartbeat_period(slow, general, master_heartbeat_period) VALUES (1,2,3), (5,6,7);
INSERT INTO master_heartbeat_period(slow, general) VALUES (1,2), (5,6);
INSERT INTO master_heartbeat_period(slow) VALUES (1), (5);
SELECT slow, general, master_heartbeat_period, ignore_server_ids FROM master_heartbeat_period ORDER BY slow;
SELECT slow, general, master_heartbeat_period FROM master_heartbeat_period ORDER BY slow;
SELECT slow, master_heartbeat_period FROM master_heartbeat_period ORDER BY slow;
SELECT slow FROM master_heartbeat_period ORDER BY slow;
DROP TABLE master_heartbeat_period;
CREATE TABLE ignore_server_ids (slow INT, general INT, master_heartbeat_period INT, ignore_server_ids INT);
INSERT INTO ignore_server_ids(slow, general, master_heartbeat_period, ignore_server_ids) VALUES (1,2,3,4), (5,6,7,8);
INSERT INTO ignore_server_ids(slow, general, master_heartbeat_period) VALUES (1,2,3), (5,6,7);
INSERT INTO ignore_server_ids(slow, general) VALUES (1,2), (5,6);
INSERT INTO ignore_server_ids(slow) VALUES (1), (5);
SELECT slow, general, master_heartbeat_period, ignore_server_ids FROM ignore_server_ids ORDER BY slow;
SELECT slow, general, master_heartbeat_period FROM ignore_server_ids ORDER BY slow;
SELECT slow, master_heartbeat_period FROM ignore_server_ids ORDER BY slow;
SELECT slow FROM ignore_server_ids ORDER BY slow;
DROP TABLE ignore_server_ids;
CREATE TABLE t1 (slow INT, general INT, ignore_server_ids INT, master_heartbeat_period INT);
INSERT INTO t1 VALUES (1,2,3,4);
DELIMITER |;
CREATE PROCEDURE p1()
BEGIN
DECLARE slow INT;
DECLARE general INT;
DECLARE ignore_server_ids INT;
DECLARE master_heartbeat_period INT;
SELECT max(t1.slow) INTO slow FROM t1;
SELECT max(t1.general) INTO general FROM t1;
SELECT max(t1.ignore_server_ids) INTO ignore_server_ids FROM t1;
SELECT max(t1.master_heartbeat_period) INTO master_heartbeat_period FROM t1;
SELECT slow, general, ignore_server_ids, master_heartbeat_period;
END|
CREATE PROCEDURE p2()
BEGIN
DECLARE n INT DEFAULT 2;
general: WHILE n > 0 DO
SET n = n -1;
END WHILE general;
SET n = 2;
slow: WHILE n > 0 DO
SET n = n -1;
END WHILE slow;
SET n = 2;
ignore_server_ids: WHILE n > 0 DO
SET n = n -1;
END WHILE ignore_server_ids;
SET n = 2;
master_heartbeat_period: WHILE n > 0 DO
SET n = n -1;
END WHILE master_heartbeat_period;
END|
DELIMITER ;|
CALL p1();
call p2();
DROP PROCEDURE p1;
DROP PROCEDURE p2;
DROP TABLE t1;
#
# OPTION is not anymore a keyword
#
create table option (option int not null);
drop table option;
--error 1193
set option=1;
--error ER_PARSE_ERROR
set option option=1;
--echo #
--echo # MDEV-9979 Keywords UNBOUNDED, PRECEDING, FOLLOWING, TIES, OTHERS should be non-reserved
--echo #
CREATE TABLE EXCLUDE (EXCLUDE INT);
SELECT EXCLUDE FROM EXCLUDE;
SELECT EXCLUDE EXCLUDE FROM EXCLUDE;
SELECT EXCLUDE AS EXCLUDE FROM EXCLUDE;
DROP TABLE EXCLUDE;
CREATE TABLE UNBOUNDED (UNBOUNDED INT);
SELECT UNBOUNDED FROM UNBOUNDED;
SELECT UNBOUNDED UNBOUNDEX FROM UNBOUNDED;
SELECT UNBOUNDED AS UNBOUNDEX FROM UNBOUNDED;
DROP TABLE UNBOUNDED;
CREATE TABLE PRECEDING (PRECEDING INT);
SELECT PRECEDING FROM PRECEDING;
SELECT PRECEDING PRECEDING FROM PRECEDING;
SELECT PRECEDING AS PRECEDING FROM PRECEDING;
DROP TABLE PRECEDING;
CREATE TABLE FOLLOWING (FOLLOWING INT);
SELECT FOLLOWING FROM FOLLOWING;
SELECT FOLLOWING FOLLOWING FROM FOLLOWING;
SELECT FOLLOWING AS FOLLOWING FROM FOLLOWING;
DROP TABLE FOLLOWING;
CREATE TABLE TIES (TIES INT);
SELECT TIES FROM TIES;
SELECT TIES TIES FROM TIES;
SELECT TIES AS TIES FROM TIES;
DROP TABLE TIES;
CREATE TABLE OTHERS (OTHERS INT);
SELECT OTHERS FROM OTHERS;
SELECT OTHERS OTHERS FROM OTHERS;
SELECT OTHERS AS OTHERS FROM OTHERS;
DROP TABLE OTHERS;
--echo #
--echo # MDEV-10585 EXECUTE IMMEDIATE statement
--echo #
CREATE TABLE immediate (immediate int);
DROP TABLE immediate;
--echo #
--echo # MDEV-10142 Pluggable parser
--echo # Testing keywords that were added into lex.h for Oracle compatibility
--echo # that are not reserved keywords in MariaDB
--echo #
CREATE TABLE clob (clob int);
DROP TABLE clob;
CREATE TABLE elsif (elsif INT);
DROP TABLE elsif;
CREATE TABLE exception (exception INT);
DROP TABLE exception;
CREATE TABLE raw (raw int);
DROP TABLE raw;
CREATE TABLE varchar2 (varchar2 int);
DROP TABLE varchar2;
CREATE TABLE decode (decode int);
DROP TABLE decode;
CREATE TABLE rowcount (rowcount int);
DROP TABLE rowcount;
CREATE TABLE isopen (isopen int);
DROP TABLE isopen;
CREATE TABLE notfound (notfound int);
DROP TABLE notfound;
CREATE TABLE raise (raise int);
DROP TABLE raise;
CREATE TABLE reuse (reuse int);
DROP TABLE reuse;
--echo #
--echo # MDEV-17363 Compressed columns cannot be restored from dump
--echo # COMPRESSED is not valid as an SP label any more
--echo # but is still valid as an SP variable name.
--echo #
DELIMITER $$;
--error ER_PARSE_ERROR
BEGIN NOT ATOMIC
compressed:
BEGIN
SELECT 1 AS a;
END;
END
$$
DELIMITER ;$$
DELIMITER $$;
BEGIN NOT ATOMIC
`compressed`:
BEGIN
SELECT 1 AS a;
END;
END
$$
DELIMITER ;$$
DELIMITER $$;
BEGIN NOT ATOMIC
DECLARE compressed INT DEFAULT 1;
SELECT compressed;
END
$$
DELIMITER ;$$
--echo #
--echo # Testing various keywords in various contexts
--echo #
DELIMITER $$;
CREATE PROCEDURE p1(query TEXT, var TEXT)
BEGIN
DECLARE errmsg TEXT DEFAULT '';
DECLARE CONTINUE HANDLER
FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 errmsg = MESSAGE_TEXT;
SET errmsg= REPLACE(errmsg, 'You have an error in your SQL ', '..');
SET errmsg= REPLACE(errmsg, '; check the manual that corresponds to your MariaDB server version for the right syntax to use', '..');
END;
SET query=REPLACE(query, '$(VAR)', var);
EXECUTE IMMEDIATE query;
SELECT CONCAT(query, '; -- ', LEFT(COALESCE(errmsg,''),40)) AS `--------`;
END;
$$
CREATE PROCEDURE p2(query TEXT)
BEGIN
FOR row IN (SELECT word FROM t1 ORDER BY category, word)
DO
CALL p1(query, row.word);
END FOR;
END;
$$
DELIMITER ;$$
CREATE TABLE t1 (word TEXT, category TEXT);
INSERT INTO t1 VALUES ('non_keyword', '00 Simple identifier');
INSERT INTO t1 VALUES ('lpad', '01 Built-in native function');
INSERT INTO t1 VALUES ('rpad', '01 Built-in native function');
INSERT INTO t1 VALUES ('adddate', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('substr', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('substring', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('trim_oracle', '02 function_call_nonkeyword');
INSERT INTO t1 VALUES ('ascii', '03 function_call_conflict');
INSERT INTO t1 VALUES ('replace', '03 function_call_conflict');
INSERT INTO t1 VALUES ('weight_string', '03 function_call_conflict');
INSERT INTO t1 VALUES ('char', '04 function_call_keyword');
INSERT INTO t1 VALUES ('trim', '04 function_call_keyword');
INSERT INTO t1 VALUES ('year', '04 function_call_keyword');
INSERT INTO t1 VALUES ('create', '05 Reserved keyword');
CALL p2('SELECT @@$(VAR)');
CALL p2('SELECT @@global.$(VAR)');
CALL p2('SELECT @@global.$(VAR)()');
CALL p2('SELECT $(VAR)()');
CALL p2('SELECT test.$(VAR)()');
CALL p2('SELECT $(VAR) FROM t1');
CALL p2('SELECT t1.$(VAR) FROM t1');
CALL p2('DROP TABLE $(VAR)');
CALL p2('DROP TABLE test.$(VAR)');
CALL p2('CREATE FUNCTION $(VAR)() RETURNS OOPS');
CALL p2('CREATE FUNCTION test.$(VAR)() RETURNS OOPS');
CALL p2('DROP FUNCTION $(VAR)');
CALL p2('DROP FUNCTION test.$(VAR)');
DROP TABLE t1;
DROP PROCEDURE p1;
DROP PROCEDURE p2;
|