File: errors.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (283 lines) | stat: -rw-r--r-- 9,016 bytes parent folder | download
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
--echo #
--echo # Test of various abuses of the plugin.
--echo #

--source suite/query_rewrite_plugins/include/have_plugin_rewriter.inc

SET sql_mode = 'PIPES_AS_CONCAT';
CALL mtr.add_suppression("Plugin rewriter reported: " ||
                         "'Some rules failed to load.'");

CALL mtr.add_suppression("Plugin rewriter reported: " ||
                         "'Wrong column count or names when loading rules.'");


--echo # In theory a user might try to install the UDF without the plugin. In
--echo # this case, we should exit gracefully with an informative error.

--replace_regex /\.so|\.dll/.xxx/
eval CREATE FUNCTION load_rewrite_rules RETURNS STRING SONAME '$REWRITER';

--error ER_CANT_INITIALIZE_UDF
SELECT load_rewrite_rules();
DROP FUNCTION load_rewrite_rules;

CREATE TABLE t1 ( c1 VARCHAR(10), c2 VARCHAR(10) );
INSERT INTO t1 VALUES( 'abc', 'def' ), ( 'ghi', 'klm' ), ( 'nop', 'qrs' );

CREATE TABLE t2( c1 VARCHAR(10) );
INSERT INTO t2 VALUES ( 'tuv' ), ( 'wxy' );

--echo #
--echo # Create a table with insufficient number of columns.
--echo #
CREATE DATABASE query_rewrite;
CREATE TABLE query_rewrite.rewrite_rules ( pattern INT, replacement INT );

--source suite/query_rewrite_plugins/include/install_rewriter.inc

SELECT c1 FROM t1;

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

--source suite/query_rewrite_plugins/include/load_error_log.inc

--echo # Avoid seeing any other error that might be there.
SELECT search_error_log( '[Error]', "%Plugin Rewriter reported: 'Wrong%" );
SHOW STATUS LIKE 'Rewriter_number_reloads';

--source suite/query_rewrite_plugins/include/uninstall_rewriter.inc
--source include/disconnect_connections.inc

--echo # Create another table with insufficient number of columns.
CREATE DATABASE query_rewrite;
CREATE TABLE query_rewrite.rewrite_rules ( enabled CHAR(1) DEFAULT 'Y' );

--source suite/query_rewrite_plugins/include/install_rewriter.inc

--source suite/query_rewrite_plugins/include/load_error_log.inc
--echo # Avoid seeing any other error that might be there.
SELECT search_error_log( '[Error]', "%Plugin Rewriter reported: 'Wrong%" );
SHOW STATUS LIKE 'Rewriter_number_reloads';

SELECT c1 FROM t1;

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

--source suite/query_rewrite_plugins/include/uninstall_rewriter.inc
--source include/disconnect_connections.inc

--source suite/query_rewrite_plugins/include/install_rewriter.inc

--echo #
--echo # We now try 6 rules with various errors in them:
--echo #

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

--echo # 1. Syntax error in the replacement.
INSERT INTO query_rewrite.rewrite_rules ( pattern, replacement )
VALUES ( 'SELECT c1 FROM test.t1 WHERE c1 = ?', 'SELECT c1 FROM test.t2 WHERE q c1 = ?' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SELECT c1 FROM test.t1 WHERE c1 = 'abc';

SELECT * FROM query_rewrite.rewrite_rules;

--echo # 2. No error.
INSERT INTO query_rewrite.rewrite_rules ( pattern, replacement )
VALUES ( 'SELECT c1 FROM test.t1', 'SELECT * FROM test.t1' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SELECT * FROM query_rewrite.rewrite_rules;

--echo # 3. Syntax error in the pattern.
INSERT INTO query_rewrite.rewrite_rules ( pattern, replacement )
VALUES ( 'SELECT c1 FROM test.t1 WHERE dqdq c1 = ? OR c2 = ?',
         'SELECT * FROM test.t1 WHERE c2 = ? OR c1 = ?' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SELECT * FROM query_rewrite.rewrite_rules;

--echo # 4 Empty/NULL replacement/pattern
INSERT INTO query_rewrite.rewrite_rules ( pattern, replacement )
VALUES ( 'SELECT c1 FROM test.t1 WHERE c2 = ?', '' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SELECT * FROM query_rewrite.rewrite_rules;

DELETE FROM query_rewrite.rewrite_rules
WHERE pattern = 'SELECT c1 FROM test.t1 WHERE c2 = ?';

ALTER TABLE query_rewrite.rewrite_rules
MODIFY COLUMN replacement VARCHAR(10000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

INSERT INTO query_rewrite.rewrite_rules ( pattern )
VALUES ( 'SELECT c1 FROM test.t1 WHERE c2 = ?' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SELECT * FROM query_rewrite.rewrite_rules;

DELETE FROM query_rewrite.rewrite_rules
WHERE pattern = 'SELECT c1 FROM test.t1 WHERE c2 = ?';

ALTER TABLE query_rewrite.rewrite_rules
MODIFY COLUMN pattern VARCHAR(5000) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

INSERT INTO query_rewrite.rewrite_rules ( replacement )
VALUES ( 'SELECT c1 FROM test.t1 WHERE c2 = ?' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SELECT * FROM query_rewrite.rewrite_rules;

--echo # 5 More parameters in the replacement than the pattern
INSERT INTO query_rewrite.rewrite_rules ( pattern, replacement )
VALUES
( 'SELECT * FROM test.t1 WHERE c1 = ?', 'SELECT * FROM test.t2 WHERE c2 = ? AND c1 = ?' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SELECT * FROM test.t1 WHERE c1 = 'abc';

SELECT * FROM query_rewrite.rewrite_rules;

--echo # 6 A replacement that does not have syntax errors in itself, but the
--echo # rewritten query does.
INSERT INTO query_rewrite.rewrite_rules ( pattern, replacement )
VALUES ( 'SELECT "Fail, please", ?', 'SELECT 1 LIMIT ?' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SELECT * FROM query_rewrite.rewrite_rules;

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SET @@global.rewriter_verbose = 2;

--error ER_PARSE_ERROR
SELECT 'Fail, please', 'a';

--echo # Check that the one rule without errors is still rewritten and executed.
SELECT c1 FROM test.t1;

--echo # Fix rule 1 (error in the replacement.)
UPDATE query_rewrite.rewrite_rules
SET replacement = 'SELECT c1 FROM test.t2 WHERE c1 = ?', enabled = 'YES'
WHERE pattern = 'SELECT c1 FROM test.t1 WHERE c1 = ?';

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SHOW STATUS LIKE 'Rewriter_number_loaded_rules';

SELECT c1 FROM test.t1 WHERE c1 = 'abc';
SELECT c1 FROM test.t2 WHERE c1 = 'tuv';

SELECT * FROM query_rewrite.rewrite_rules;

--echo # Check that the rule without error is still executed and rewritten.
SELECT c1 FROM test.t1;

--echo # Remove all the rules that cause errors.
DELETE FROM query_rewrite.rewrite_rules WHERE pattern <> 'SELECT c1 FROM test.t1';
DELETE FROM query_rewrite.rewrite_rules WHERE pattern IS NULL;
DELETE FROM query_rewrite.rewrite_rules WHERE replacement IS NULL;

SHOW STATUS LIKE 'Rewriter_reload_error';
SHOW STATUS LIKE 'Rewriter_number_loaded_rules';
SHOW STATUS LIKE 'Rewriter_number_reloads';

--echo # Check that a rule that used to have syntax error now works fine.
SELECT c1 FROM t1 WHERE c1 = 'abc';

--echo # Check that the rule without error is still executed and rewritten.
SELECT c1 FROM test.t1;

--echo # A rule with parse error followed by a correct rule should still turn
--echo # Rewriter_reload_error to true.
DELETE FROM query_rewrite.rewrite_rules;

INSERT INTO query_rewrite.rewrite_rules ( pattern, replacement )
VALUES ( 'error', 'error' ),
       ( 'select 1', 'select 2' );

--error ER_SIGNAL_EXCEPTION
CALL query_rewrite.flush_rewrite_rules();

SELECT * FROM query_rewrite.rewrite_rules;

SHOW STATUS LIKE 'Rewriter_reload_error';

--echo #
--echo # Test of what happens if pfs digests are turned off.
--echo #

UPDATE performance_schema.setup_consumers
SET enabled = 'NO'
WHERE NAME = 'statements_digest';

--echo # Rewrites should still work.
SELECT 1;

PREPARE stmt1 FROM 'SELECT 1';
EXECUTE stmt1;

--echo # Restore the setting.
UPDATE performance_schema.setup_consumers
SET enabled = 'YES'
WHERE NAME = 'statements_digest';

--echo # Let's try to uninstall the plugin the wrong way, that is, not using the
--echo # script. The library will not be unloaded so we can still call the UDF
--echo # but it should return an error.
UNINSTALL PLUGIN rewriter;
--source include/disconnect_connections.inc

--error ER_CANT_INITIALIZE_UDF
CALL query_rewrite.flush_rewrite_rules();
--error ER_CANT_INITIALIZE_UDF
SELECT load_rewrite_rules();

--source suite/query_rewrite_plugins/include/uninstall_rewriter.inc
--source suite/query_rewrite_plugins/include/drop_error_log.inc

DROP TABLE t1, t2;