Skip to content

Commit 4d19b5b

Browse files
committed
Bug#36720575 - mysql server 8.0.X crashed at mysqlx_generate_document_id
Description =========== Passing "null" values as parameters to "MYSQLX_GENERATE_DOCUMENT_ID" udf function, crashes server. To reproduce the issue the "null" value must returned by a function, for example: JSON_CONTAINS_PATH(@doc, 'one', '$.b') # where @doc is null IF(@expr, 1, NULL) Combining: SELECT MYSQLX_GENERATE_DOCUMENT_ID(IF(1=2,1,null)); Fix === The values can't be verified at "udf_init" calls, because the may be evaluated just before calling the "udf_callback". Because of this limitation, we can't report a wrong usage to the user, instead we must use default values when the value is set to NULL. Change-Id: I27e606ac37088b26527ea14e88e050d4718f1628
1 parent 71940c6 commit 4d19b5b

File tree

4 files changed

+381
-104
lines changed

4 files changed

+381
-104
lines changed
Lines changed: 165 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,28 @@
1+
2+
## 1.a. Verify that basic usage of `mysqlx_generate_document_id`
3+
## works correctly using classic protocol.
4+
## 1.b. Usage of `mysqlx_generate_document_id` with
5+
## invalid arguments using classic protocol.
6+
## 2.a. Handling of NULL values in DO (classic)
7+
## 2.b. Handling of NULL values in SELECT (classic)
8+
## 2.c. Handling of FUNCTION returning NULL values in DO (classic)
9+
## 2.d. Handling of FUNCTION returning NULL values in SELECT (classic)
10+
## 3.a. Verify that basic usage of `mysqlx_generate_document_id`
11+
## works correctly using x protocol.
12+
## 3.b. Usage of `mysqlx_generate_document_id` with
13+
## invalid arguments using X protocol.
14+
## 4.a. Handling of NULL values in DO (x)
15+
## 4.b. Handling of NULL values in SELECT (x)
16+
## 4.c. Handling of FUNCTION returning NULL values in DO (x)
17+
## 4.d. Handling of FUNCTION returning NULL values in SELECT (x)
118
CREATE SCHEMA xtest;
219
USE xtest;
320
CREATE TABLE util(f INT);
421
INSERT INTO util(f) VALUES(1),(2),(3),(4),(5);
22+
23+
#
24+
## Ad 1.a. Verify that basic usage of `mysqlx_generate_document_id`
25+
## works correctly using classic protocol.
526
SELECT mysqlx_generate_document_id() FROM util;
627
mysqlx_generate_document_id()
728
0000XXXXXXXX0000000000000001
@@ -46,71 +67,115 @@ mysqlx_generate_document_id(@@auto_increment_offset, @@auto_increment_increment)
4667
0000XXXXXXXX0000000000000070
4768
0000XXXXXXXX0000000000000078
4869
0000XXXXXXXX0000000000000080
70+
CREATE PROCEDURE my_procedure(IN offset INT, IN increment INT)
71+
BEGIN
72+
SELECT mysqlx_generate_document_id(offset, increment) AS document_id;
73+
END ||
74+
CALL my_procedure(16, 8);
75+
document_id
76+
0000XXXXXXXX0000000000000088
77+
78+
#
79+
## Ad 1.b. Usage of `mysqlx_generate_document_id` with
80+
## invalid arguments using classic protocol.
4981
DO mysqlx_generate_document_id();
5082
CALL mysqlx_generate_document_id();
5183
ERROR 42000: PROCEDURE xtest.mysqlx_generate_document_id does not exist
5284
DO mysqlx_generate_document_id('abc');
53-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect integer argument
85+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects integer argument
5486
DO mysqlx_generate_document_id(NULL);
55-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect integer argument
87+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects integer argument
5688
DO mysqlx_generate_document_id(123.45);
57-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect integer argument
89+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects integer argument
5890
DO mysqlx_generate_document_id(1, 'abc');
59-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect two integer arguments
91+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects two integer arguments
6092
DO mysqlx_generate_document_id(1, NULL);
61-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect two integer arguments
93+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects two integer arguments
6294
DO mysqlx_generate_document_id(1, 123.45);
63-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect two integer arguments
95+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects two integer arguments
6496
DO mysqlx_generate_document_id(1, 1, 'abc');
65-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect three integer arguments
97+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
6698
DO mysqlx_generate_document_id(1, 1, NULL);
67-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect three integer arguments
99+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
68100
DO mysqlx_generate_document_id(1, 1, 123.45);
69-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect three integer arguments
101+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
70102
DO mysqlx_generate_document_id(1, 1, 1, 1);
71-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect up to three integer arguments
103+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects up to three integer arguments
72104
DO mysqlx_generate_document_id(1, 1, 1, 1, 1);
73-
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expect up to three integer arguments
74-
CREATE PROCEDURE my_procedure(IN offset INT, IN increment INT)
75-
BEGIN
76-
SELECT mysqlx_generate_document_id(offset, increment) AS document_id;
77-
END ||
78-
CALL my_procedure(16, 8);
79-
document_id
80-
0000XXXXXXXX0000000000000088
81-
RUN SELECT mysqlx_generate_document_id() FROM xtest.util;
82-
mysqlx_generate_document_id()
83-
0000XXXXXXXX0000000000000089
84-
0000XXXXXXXX000000000000008a
85-
0000XXXXXXXX000000000000008b
86-
0000XXXXXXXX000000000000008c
105+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects up to three integer arguments
106+
107+
#
108+
## Ad 2.a. Handling of NULL values in DO
109+
DO mysqlx_generate_document_id(NULL, 1, 1);
110+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
111+
DO mysqlx_generate_document_id(1, NULL, 1);
112+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
113+
DO mysqlx_generate_document_id(1, 1, NULL);
114+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
115+
116+
#
117+
## Ad 2.b. Handling of NULL values in SELECT
118+
SELECT mysqlx_generate_document_id(NULL,1,1);
119+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
120+
SELECT mysqlx_generate_document_id(1,NULL,1);
121+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
122+
SELECT mysqlx_generate_document_id(1,1,NULL);
123+
ERROR HY000: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments
124+
125+
#
126+
## Ad 2.c. Handling of FUNCTION returning NULL values in DO
127+
DO mysqlx_generate_document_id(IF(1=2,1,NULL), 1, 0);
128+
DO mysqlx_generate_document_id(1, IF(1=2,1,NULL), 0);
129+
DO mysqlx_generate_document_id(1, 1, IF(1=2,1,NULL));
130+
131+
#
132+
## Ad 2.d. Handling of FUNCTION returning NULL values in SELECT
133+
SELECT mysqlx_generate_document_id(IF(1=2,1,NULL),1,0);
134+
mysqlx_generate_document_id(IF(1=2,1,NULL),1,0)
87135
0000XXXXXXXX000000000000008d
88-
0 rows affected
89-
RUN SELECT mysqlx_generate_document_id(16) FROM xtest.util;
90-
mysqlx_generate_document_id(16)
136+
SELECT mysqlx_generate_document_id(1,IF(1=2,1,NULL),0);
137+
mysqlx_generate_document_id(1,IF(1=2,1,NULL),0)
91138
0000XXXXXXXX000000000000008e
139+
SELECT mysqlx_generate_document_id(1,1,IF(1=2,1,NULL));
140+
mysqlx_generate_document_id(1,1,IF(1=2,1,NULL))
92141
0000XXXXXXXX000000000000008f
142+
143+
#
144+
## Ad 3.a. Verify that basic usage of `mysqlx_generate_document_id`
145+
## works correctly using x protocol.
146+
RUN SELECT mysqlx_generate_document_id() FROM xtest.util
147+
mysqlx_generate_document_id()
93148
0000XXXXXXXX0000000000000090
94149
0000XXXXXXXX0000000000000091
95150
0000XXXXXXXX0000000000000092
151+
0000XXXXXXXX0000000000000093
152+
0000XXXXXXXX0000000000000094
96153
0 rows affected
97-
RUN SELECT mysqlx_generate_document_id(16, 8) FROM xtest.util;
98-
mysqlx_generate_document_id(16, 8)
154+
RUN SELECT mysqlx_generate_document_id(16) FROM xtest.util
155+
mysqlx_generate_document_id(16)
156+
0000XXXXXXXX0000000000000095
157+
0000XXXXXXXX0000000000000096
158+
0000XXXXXXXX0000000000000097
99159
0000XXXXXXXX0000000000000098
160+
0000XXXXXXXX0000000000000099
161+
0 rows affected
162+
RUN SELECT mysqlx_generate_document_id(16, 8) FROM xtest.util
163+
mysqlx_generate_document_id(16, 8)
100164
0000XXXXXXXX00000000000000a0
101165
0000XXXXXXXX00000000000000a8
102166
0000XXXXXXXX00000000000000b0
103167
0000XXXXXXXX00000000000000b8
168+
0000XXXXXXXX00000000000000c0
104169
0 rows affected
105-
RUN SELECT mysqlx_generate_document_id(16, 8, 0) FROM xtest.util;
170+
RUN SELECT mysqlx_generate_document_id(16, 8, 0) FROM xtest.util
106171
mysqlx_generate_document_id(16, 8, 0)
107-
0000XXXXXXXX00000000000000c0
108172
0000XXXXXXXX00000000000000c8
109173
0000XXXXXXXX00000000000000d0
110174
0000XXXXXXXX00000000000000d8
111175
0000XXXXXXXX00000000000000e0
176+
0000XXXXXXXX00000000000000e8
112177
0 rows affected
113-
RUN SELECT mysqlx_generate_document_id(16, 8, 1) FROM xtest.util;
178+
RUN SELECT mysqlx_generate_document_id(16, 8, 1) FROM xtest.util
114179
mysqlx_generate_document_id(16, 8, 1)
115180
null
116181
null
@@ -124,51 +189,99 @@ RUN set auto_increment_offset = 16
124189
RUN set auto_increment_increment = 8
125190

126191
0 rows affected
127-
RUN SELECT mysqlx_generate_document_id(@@auto_increment_offset, @@auto_increment_increment) FROM xtest.util;
128-
mysqlx_generate_document_id(@@auto_increment_offset, @@auto_increment_increment)
129-
0000XXXXXXXX00000000000000e8
192+
RUN CALL xtest.my_procedure(16, 8)
193+
document_id
130194
0000XXXXXXXX00000000000000f0
195+
196+
0 rows affected
197+
RUN SELECT mysqlx_generate_document_id(@@auto_increment_offset, @@auto_increment_increment) FROM xtest.util
198+
mysqlx_generate_document_id(@@auto_increment_offset, @@auto_increment_increment)
131199
0000XXXXXXXX00000000000000f8
132200
0000XXXXXXXX0000000000000100
133201
0000XXXXXXXX0000000000000108
202+
0000XXXXXXXX0000000000000110
203+
0000XXXXXXXX0000000000000118
134204
0 rows affected
135-
RUN DO mysqlx_generate_document_id();
205+
RUN DO mysqlx_generate_document_id()
136206

137207
0 rows affected
208+
209+
#
210+
## Ad 3.b. Usage of `mysqlx_generate_document_id` with
211+
## invalid arguments using X protocol.
138212
RUN CALL mysqlx_generate_document_id();
139213
Got expected error: No database selected (code 1046)
140-
RUN USE xtest;
214+
RUN use xtest
141215

142216
0 rows affected
143217
RUN CALL mysqlx_generate_document_id();
144218
Got expected error: PROCEDURE xtest.mysqlx_generate_document_id does not exist (code 1305)
145219
RUN DO mysqlx_generate_document_id('abc');
146-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect integer argument (code 1123)
220+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects integer argument (code 1123)
147221
RUN DO mysqlx_generate_document_id(NULL);
148-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect integer argument (code 1123)
222+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects integer argument (code 1123)
149223
RUN DO mysqlx_generate_document_id(123.45);
150-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect integer argument (code 1123)
224+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects integer argument (code 1123)
151225
RUN DO mysqlx_generate_document_id(1, 'abc');
152-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect two integer arguments (code 1123)
226+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects two integer arguments (code 1123)
153227
RUN DO mysqlx_generate_document_id(1, NULL);
154-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect two integer arguments (code 1123)
228+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects two integer arguments (code 1123)
155229
RUN DO mysqlx_generate_document_id(1, 123.45);
156-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect two integer arguments (code 1123)
230+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects two integer arguments (code 1123)
157231
RUN DO mysqlx_generate_document_id(1, 1, 'abc');
158-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect three integer arguments (code 1123)
232+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
159233
RUN DO mysqlx_generate_document_id(1, 1, NULL);
160-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect three integer arguments (code 1123)
234+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
161235
RUN DO mysqlx_generate_document_id(1, 1, 123.45);
162-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect three integer arguments (code 1123)
236+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
163237
RUN DO mysqlx_generate_document_id(1, 1, 1, 1);
164-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect up to three integer arguments (code 1123)
238+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects up to three integer arguments (code 1123)
165239
RUN DO mysqlx_generate_document_id(1, 1, 1, 1, 1);
166-
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expect up to three integer arguments (code 1123)
167-
RUN CALL my_procedure(16, 8);
240+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects up to three integer arguments (code 1123)
168241

169-
document_id
170-
0000XXXXXXXX0000000000000110
242+
#
243+
## Ad 4.a. Handling of NULL values in DO
244+
RUN DO mysqlx_generate_document_id(NULL, 1, 1);
245+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
246+
RUN DO mysqlx_generate_document_id(1, NULL, 1);
247+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
248+
RUN DO mysqlx_generate_document_id(1, 1, NULL);
249+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
250+
251+
#
252+
## Ad 4.b. Handling of NULL values in SELECT
253+
RUN SELECT mysqlx_generate_document_id(NULL,1,1);
254+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
255+
RUN SELECT mysqlx_generate_document_id(1,NULL,1);
256+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
257+
RUN SELECT mysqlx_generate_document_id(1,1,NULL);
258+
Got expected error: Can't initialize function 'mysqlx_generate_document_id'; Function expects three integer arguments (code 1123)
259+
260+
#
261+
## Ad 4.c. Handling of FUNCTION returning NULL values in DO
262+
RUN DO mysqlx_generate_document_id(IF(1=2,1,NULL), 1, 0);
263+
264+
0 rows affected
265+
RUN DO mysqlx_generate_document_id(1, IF(1=2,1,NULL), 0);
171266

267+
0 rows affected
268+
RUN DO mysqlx_generate_document_id(1, 1, IF(1=2,1,NULL));
269+
270+
0 rows affected
271+
272+
#
273+
## Ad 4.d. Handling of FUNCTION returning NULL values in SELECT
274+
RUN SELECT mysqlx_generate_document_id(IF(1=2,1,NULL),1,0);
275+
mysqlx_generate_document_id(IF(1=2,1,NULL),1,0)
276+
0000XXXXXXXX000000000000011d
277+
0 rows affected
278+
RUN SELECT mysqlx_generate_document_id(1,IF(1=2,1,NULL),0);
279+
mysqlx_generate_document_id(1,IF(1=2,1,NULL),0)
280+
0000XXXXXXXX000000000000011e
281+
0 rows affected
282+
RUN SELECT mysqlx_generate_document_id(1,1,IF(1=2,1,NULL));
283+
mysqlx_generate_document_id(1,1,IF(1=2,1,NULL))
284+
0000XXXXXXXX000000000000011f
172285
0 rows affected
173286
Mysqlx.Ok {
174287
msg: "bye!"
@@ -180,6 +293,6 @@ doc
180293
{"a": 1}
181294
SELECT JSON_INSERT(@doc, '$.b', CONVERT(mysqlx_generate_document_id(1,1,JSON_CONTAINS_PATH(@doc, 'one', '$.b')) USING utf8mb4)) as doc;
182295
doc
183-
{"a": 1, "b": "0000XXXXXXXX0000000000000111"}
296+
{"a": 1, "b": "0000XXXXXXXX0000000000000120"}
184297
set auto_increment_increment = DEFAULT;
185298
set auto_increment_offset = DEFAULT;

0 commit comments

Comments
 (0)