Skip to content

Commit 0879983

Browse files
author
Alexander Barkov
committed
MDEV-11880 sql_mode=ORACLE: Make the concatenation operator ignore NULL arguments
Now when sql_mode=ORACLE, the concatenation operator || treats NULLs as empty strings. Based on the contributed patch from Jérôme Brauge.
1 parent 46255b0 commit 0879983

File tree

6 files changed

+483
-98
lines changed

6 files changed

+483
-98
lines changed
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
SET sql_mode=ORACLE;
2+
EXPLAIN EXTENDED SELECT 'a'||'b'||'c';
3+
id select_type table type possible_keys key key_len ref rows filtered Extra
4+
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
5+
Warnings:
6+
Note 1003 select 'a' || 'b' || 'c' AS "'a'||'b'||'c'"
7+
SELECT '' || '';
8+
'' || ''
9+
10+
SELECT '' || 'b';
11+
'' || 'b'
12+
b
13+
SELECT '' || NULL;
14+
'' || NULL
15+
16+
SELECT 'a' || '';
17+
'a' || ''
18+
a
19+
SELECT 'a' || 'b';
20+
'a' || 'b'
21+
ab
22+
SELECT 'a' || NULL;
23+
'a' || NULL
24+
a
25+
SELECT NULL || '';
26+
NULL || ''
27+
28+
SELECT NULL || 'b';
29+
NULL || 'b'
30+
b
31+
SELECT NULL || NULL;
32+
NULL || NULL
33+
NULL
34+
SELECT '' || '' || '';
35+
'' || '' || ''
36+
37+
SELECT '' || '' || 'c';
38+
'' || '' || 'c'
39+
c
40+
SELECT '' || '' || NULL;
41+
'' || '' || NULL
42+
43+
SELECT '' || 'b' || '';
44+
'' || 'b' || ''
45+
b
46+
SELECT '' || 'b' || 'c';
47+
'' || 'b' || 'c'
48+
bc
49+
SELECT '' || 'b' || NULL;
50+
'' || 'b' || NULL
51+
b
52+
SELECT '' || NULL || '';
53+
'' || NULL || ''
54+
55+
SELECT '' || NULL || 'c';
56+
'' || NULL || 'c'
57+
c
58+
SELECT '' || NULL || NULL;
59+
'' || NULL || NULL
60+
61+
SELECT 'a' || '' || '';
62+
'a' || '' || ''
63+
a
64+
SELECT 'a' || '' || 'c';
65+
'a' || '' || 'c'
66+
ac
67+
SELECT 'a' || '' || NULL;
68+
'a' || '' || NULL
69+
a
70+
SELECT 'a' || 'b' || '';
71+
'a' || 'b' || ''
72+
ab
73+
SELECT 'a' || 'b' || 'c';
74+
'a' || 'b' || 'c'
75+
abc
76+
SELECT 'a' || 'b' || NULL;
77+
'a' || 'b' || NULL
78+
ab
79+
SELECT 'a' || NULL || '';
80+
'a' || NULL || ''
81+
a
82+
SELECT 'a' || NULL || 'c';
83+
'a' || NULL || 'c'
84+
ac
85+
SELECT 'a' || NULL || NULL;
86+
'a' || NULL || NULL
87+
a
88+
SELECT NULL || '' || '';
89+
NULL || '' || ''
90+
91+
SELECT NULL || '' || 'c';
92+
NULL || '' || 'c'
93+
c
94+
SELECT NULL || '' || NULL;
95+
NULL || '' || NULL
96+
97+
SELECT NULL || 'b' || '';
98+
NULL || 'b' || ''
99+
b
100+
SELECT NULL || 'b' || 'c';
101+
NULL || 'b' || 'c'
102+
bc
103+
SELECT NULL || 'b' || NULL;
104+
NULL || 'b' || NULL
105+
b
106+
SELECT NULL || NULL || '';
107+
NULL || NULL || ''
108+
109+
SELECT NULL || NULL || 'c';
110+
NULL || NULL || 'c'
111+
c
112+
SELECT NULL || NULL || NULL;
113+
NULL || NULL || NULL
114+
NULL
115+
CREATE TABLE t1 (a VARCHAR(10), b VARCHAR(10), c VARCHAR(10));
116+
INSERT INTO t1 VALUES ('', '', '');
117+
INSERT INTO t1 VALUES ('', '', 'c');
118+
INSERT INTO t1 VALUES ('', '', NULL);
119+
INSERT INTO t1 VALUES ('', 'b', '');
120+
INSERT INTO t1 VALUES ('', 'b', 'c');
121+
INSERT INTO t1 VALUES ('', 'b', NULL);
122+
INSERT INTO t1 VALUES ('', NULL, '');
123+
INSERT INTO t1 VALUES ('', NULL, 'c');
124+
INSERT INTO t1 VALUES ('', NULL, NULL);
125+
INSERT INTO t1 VALUES ('a', '', '');
126+
INSERT INTO t1 VALUES ('a', '', 'c');
127+
INSERT INTO t1 VALUES ('a', '', NULL);
128+
INSERT INTO t1 VALUES ('a', 'b', '');
129+
INSERT INTO t1 VALUES ('a', 'b', 'c');
130+
INSERT INTO t1 VALUES ('a', 'b', NULL);
131+
INSERT INTO t1 VALUES ('a', NULL, '');
132+
INSERT INTO t1 VALUES ('a', NULL, 'c');
133+
INSERT INTO t1 VALUES ('a', NULL, NULL);
134+
INSERT INTO t1 VALUES (NULL, '', '');
135+
INSERT INTO t1 VALUES (NULL, '', 'c');
136+
INSERT INTO t1 VALUES (NULL, '', NULL);
137+
INSERT INTO t1 VALUES (NULL, 'b', '');
138+
INSERT INTO t1 VALUES (NULL, 'b', 'c');
139+
INSERT INTO t1 VALUES (NULL, 'b', NULL);
140+
INSERT INTO t1 VALUES (NULL, NULL, '');
141+
INSERT INTO t1 VALUES (NULL, NULL, 'c');
142+
INSERT INTO t1 VALUES (NULL, NULL, NULL);
143+
SELECT LENGTH(a||b||c), a||b||c FROM t1 ORDER BY a,b,c;
144+
LENGTH(a||b||c) a||b||c
145+
NULL NULL
146+
0
147+
1 c
148+
0
149+
0
150+
1 c
151+
1 b
152+
1 b
153+
2 bc
154+
0
155+
0
156+
1 c
157+
0
158+
0
159+
1 c
160+
1 b
161+
1 b
162+
2 bc
163+
1 a
164+
1 a
165+
2 ac
166+
1 a
167+
1 a
168+
2 ac
169+
2 ab
170+
2 ab
171+
3 abc
172+
DROP TABLE t1;

mysql-test/suite/compat/oracle/r/ps.result

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,9 @@ EXECUTE IMMEDIATE 'SELECT :1 FROM DUAL' USING 10;
178178
# Testing erroneous and diallowed prepare source
179179
#
180180
EXECUTE IMMEDIATE _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL';
181-
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat'
181+
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation '||'
182182
PREPARE stmt FROM _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL';
183-
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat'
183+
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation '||'
184184
EXECUTE IMMEDIATE (SELECT 'SELECT 1');
185185
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 'SELECT 1')' at line 1
186186
PREPARE stmt FROM (SELECT 'SELECT 1');
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#
2+
# Testing CONCAT with null values
3+
#
4+
5+
SET sql_mode=ORACLE;
6+
7+
EXPLAIN EXTENDED SELECT 'a'||'b'||'c';
8+
9+
SELECT '' || '';
10+
SELECT '' || 'b';
11+
SELECT '' || NULL;
12+
SELECT 'a' || '';
13+
SELECT 'a' || 'b';
14+
SELECT 'a' || NULL;
15+
SELECT NULL || '';
16+
SELECT NULL || 'b';
17+
SELECT NULL || NULL;
18+
19+
SELECT '' || '' || '';
20+
SELECT '' || '' || 'c';
21+
SELECT '' || '' || NULL;
22+
SELECT '' || 'b' || '';
23+
SELECT '' || 'b' || 'c';
24+
SELECT '' || 'b' || NULL;
25+
SELECT '' || NULL || '';
26+
SELECT '' || NULL || 'c';
27+
SELECT '' || NULL || NULL;
28+
29+
SELECT 'a' || '' || '';
30+
SELECT 'a' || '' || 'c';
31+
SELECT 'a' || '' || NULL;
32+
SELECT 'a' || 'b' || '';
33+
SELECT 'a' || 'b' || 'c';
34+
SELECT 'a' || 'b' || NULL;
35+
SELECT 'a' || NULL || '';
36+
SELECT 'a' || NULL || 'c';
37+
SELECT 'a' || NULL || NULL;
38+
39+
SELECT NULL || '' || '';
40+
SELECT NULL || '' || 'c';
41+
SELECT NULL || '' || NULL;
42+
SELECT NULL || 'b' || '';
43+
SELECT NULL || 'b' || 'c';
44+
SELECT NULL || 'b' || NULL;
45+
SELECT NULL || NULL || '';
46+
SELECT NULL || NULL || 'c';
47+
SELECT NULL || NULL || NULL;
48+
49+
CREATE TABLE t1 (a VARCHAR(10), b VARCHAR(10), c VARCHAR(10));
50+
51+
INSERT INTO t1 VALUES ('', '', '');
52+
INSERT INTO t1 VALUES ('', '', 'c');
53+
INSERT INTO t1 VALUES ('', '', NULL);
54+
INSERT INTO t1 VALUES ('', 'b', '');
55+
INSERT INTO t1 VALUES ('', 'b', 'c');
56+
INSERT INTO t1 VALUES ('', 'b', NULL);
57+
INSERT INTO t1 VALUES ('', NULL, '');
58+
INSERT INTO t1 VALUES ('', NULL, 'c');
59+
INSERT INTO t1 VALUES ('', NULL, NULL);
60+
61+
INSERT INTO t1 VALUES ('a', '', '');
62+
INSERT INTO t1 VALUES ('a', '', 'c');
63+
INSERT INTO t1 VALUES ('a', '', NULL);
64+
INSERT INTO t1 VALUES ('a', 'b', '');
65+
INSERT INTO t1 VALUES ('a', 'b', 'c');
66+
INSERT INTO t1 VALUES ('a', 'b', NULL);
67+
INSERT INTO t1 VALUES ('a', NULL, '');
68+
INSERT INTO t1 VALUES ('a', NULL, 'c');
69+
INSERT INTO t1 VALUES ('a', NULL, NULL);
70+
71+
INSERT INTO t1 VALUES (NULL, '', '');
72+
INSERT INTO t1 VALUES (NULL, '', 'c');
73+
INSERT INTO t1 VALUES (NULL, '', NULL);
74+
INSERT INTO t1 VALUES (NULL, 'b', '');
75+
INSERT INTO t1 VALUES (NULL, 'b', 'c');
76+
INSERT INTO t1 VALUES (NULL, 'b', NULL);
77+
INSERT INTO t1 VALUES (NULL, NULL, '');
78+
INSERT INTO t1 VALUES (NULL, NULL, 'c');
79+
INSERT INTO t1 VALUES (NULL, NULL, NULL);
80+
81+
SELECT LENGTH(a||b||c), a||b||c FROM t1 ORDER BY a,b,c;
82+
83+
DROP TABLE t1;

0 commit comments

Comments
 (0)