Skip to content

Commit f33b075

Browse files
committed
Test LIKE with implicit \ escape
1 parent 1094651 commit f33b075

File tree

6 files changed

+247
-2
lines changed

6 files changed

+247
-2
lines changed

datafusion/sqllogictest/test_files/string/dictionary_utf8.slt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ Raphael datafusionДатаФусион false false false false
5959
under_score un iść core false false false false
6060
percent pan Tadeusz ma iść w kąt false false false false
6161
(empty) (empty) false false false false
62+
% (empty) false false false false
63+
_ (empty) false false false false
6264
NULL NULL NULL NULL NULL NULL
6365
NULL NULL NULL NULL NULL NULL
6466

datafusion/sqllogictest/test_files/string/init_data.slt.part

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ create table test_source as values
2323
('under_score', 'un_____core', 'un iść core', 'chrząszcz na łące w 東京都'),
2424
('percent', 'p%t', 'pan Tadeusz ma iść w kąt', 'Pan Tadeusz ma frunąć stąd w kąt'),
2525
('', '%', '', ''),
26+
('%', '\%', '', ''),
27+
('_', '\_', '', ''),
2628
(NULL, '%', NULL, NULL),
2729
(NULL, 'R', NULL, '🔥');
2830

datafusion/sqllogictest/test_files/string/large_string.slt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ Raphael R datafusionДатаФусион аФус
4444
under_score un_____core un iść core chrząszcz na łące w 東京都
4545
percent p%t pan Tadeusz ma iść w kąt Pan Tadeusz ma frunąć stąd w kąt
4646
(empty) % (empty) (empty)
47+
% \% (empty) (empty)
48+
_ \_ (empty) (empty)
4749
NULL % NULL NULL
4850
NULL R NULL 🔥
4951

@@ -64,6 +66,8 @@ Raphael datafusionДатаФусион false false false false
6466
under_score un iść core false false false false
6567
percent pan Tadeusz ma iść w kąt false false false false
6668
(empty) (empty) false false false false
69+
% (empty) false false false false
70+
_ (empty) false false false false
6771
NULL NULL NULL NULL NULL NULL
6872
NULL NULL NULL NULL NULL NULL
6973

datafusion/sqllogictest/test_files/string/string.slt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ Raphael datafusionДатаФусион false false false false
5151
under_score un iść core false false false false
5252
percent pan Tadeusz ma iść w kąt false false false false
5353
(empty) (empty) false false false false
54+
% (empty) false false false false
55+
_ (empty) false false false false
5456
NULL NULL NULL NULL NULL NULL
5557
NULL NULL NULL NULL NULL NULL
5658

@@ -74,13 +76,19 @@ SELECT unicode_2, 'is LIKE', ascii_2 FROM test_basic_operator WHERE unicode_2 LI
7476
UNION ALL
7577
SELECT unicode_2, 'is NOT LIKE', ascii_2 FROM test_basic_operator WHERE unicode_2 NOT LIKE ascii_2
7678
----
79+
% is LIKE \%
7780
(empty) is LIKE %
7881
(empty) is LIKE %
7982
(empty) is LIKE %
83+
(empty) is NOT LIKE \%
84+
(empty) is NOT LIKE \%
85+
(empty) is NOT LIKE \_
86+
(empty) is NOT LIKE \_
8087
Andrew is NOT LIKE X
8188
Pan Tadeusz ma frunąć stąd w kąt is NOT LIKE p%t
8289
Raphael is NOT LIKE R
8390
Xiangpeng is LIKE Xiangpeng
91+
_ is LIKE \_
8492
chrząszcz na łące w 東京都 is NOT LIKE un_____core
8593
datafusionДатаФусион is NOT LIKE R
8694
datafusion数据融合 is NOT LIKE Xiangpeng
@@ -105,12 +113,14 @@ SELECT
105113
(unicode_2 LIKE ascii_2) AS unicode_2_like_ascii_2
106114
FROM test_basic_operator
107115
----
116+
% \% (empty) (empty) true true false false
108117
(empty) % (empty) (empty) true false true true
109118
Andrew X datafusion📊🔥 🔥 false false false false
110119
NULL % NULL NULL NULL NULL NULL NULL
111120
NULL R NULL 🔥 NULL NULL NULL false
112121
Raphael R datafusionДатаФусион аФус false false false false
113122
Xiangpeng Xiangpeng datafusion数据融合 datafusion数据融合 true true false false
123+
_ \_ (empty) (empty) true false false false
114124
percent p%t pan Tadeusz ma iść w kąt Pan Tadeusz ma frunąć stąd w kąt true false true false
115125
under_score un_____core un iść core chrząszcz na łące w 東京都 true false true false
116126

@@ -129,13 +139,19 @@ SELECT unicode_2, 'is ILIKE', ascii_2 FROM test_basic_operator WHERE unicode_2 I
129139
UNION ALL
130140
SELECT unicode_2, 'is NOT ILIKE', ascii_2 FROM test_basic_operator WHERE unicode_2 NOT ILIKE ascii_2
131141
----
142+
% is ILIKE \%
132143
(empty) is ILIKE %
133144
(empty) is ILIKE %
134145
(empty) is ILIKE %
146+
(empty) is NOT ILIKE \%
147+
(empty) is NOT ILIKE \%
148+
(empty) is NOT ILIKE \_
149+
(empty) is NOT ILIKE \_
135150
Andrew is NOT ILIKE X
136151
Pan Tadeusz ma frunąć stąd w kąt is ILIKE p%t
137152
Raphael is NOT ILIKE R
138153
Xiangpeng is ILIKE Xiangpeng
154+
_ is ILIKE \_
139155
chrząszcz na łące w 東京都 is NOT ILIKE un_____core
140156
datafusionДатаФусион is NOT ILIKE R
141157
datafusion数据融合 is NOT ILIKE Xiangpeng
@@ -160,12 +176,14 @@ SELECT
160176
(unicode_2 ILIKE ascii_2) AS unicode_2_ilike_ascii_2
161177
FROM test_basic_operator
162178
----
179+
% \% (empty) (empty) true true false false
163180
(empty) % (empty) (empty) true false true true
164181
Andrew X datafusion📊🔥 🔥 false false false false
165182
NULL % NULL NULL NULL NULL NULL NULL
166183
NULL R NULL 🔥 NULL NULL NULL false
167184
Raphael R datafusionДатаФусион аФус false false false false
168185
Xiangpeng Xiangpeng datafusion数据融合 datafusion数据融合 true true false false
186+
_ \_ (empty) (empty) true false false false
169187
percent p%t pan Tadeusz ma iść w kąt Pan Tadeusz ma frunąć stąd w kąt true false true true
170188
under_score un_____core un iść core chrząszcz na łące w 東京都 true false true false
171189

datafusion/sqllogictest/test_files/string/string_literal.slt

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,15 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717

18+
# a backslash in a string literal is not a special character
19+
query T
20+
VALUES ('\'), ('\\'), ('\\\'), ('\\\\')
21+
----
22+
\
23+
\\
24+
\\\
25+
\\\\
26+
1827
query T
1928
SELECT substr('alphabet', -3)
2029
----
@@ -829,3 +838,95 @@ SELECT
829838
'a' LIKE '%'
830839
----
831840
NULL true true
841+
842+
# \ is an implicit escape character
843+
query BBBB
844+
SELECT
845+
'a' LIKE '\%',
846+
'\a' LIKE '\%',
847+
'%' LIKE '\%',
848+
'\%' LIKE '\%'
849+
----
850+
false false true false
851+
852+
# \ is an implicit escape character
853+
query BBBBBB
854+
SELECT
855+
'a' LIKE '\_',
856+
'\a' LIKE '\_',
857+
'_' LIKE '\_',
858+
'\_' LIKE '\_',
859+
'abc' LIKE 'a_c',
860+
'abc' LIKE 'a\_c'
861+
----
862+
false false true false true false
863+
864+
# \ as an explicit escape character is currently not supported
865+
query error DataFusion error: SQL error: ParserError\("Expected end of statement, found: \\\\"\)
866+
SELECT
867+
'a' LIKE '\%' ESCAPE '\',
868+
'\a' LIKE '\%' ESCAPE '\',
869+
'%' LIKE '\%' ESCAPE '\',
870+
'\%' LIKE '\% ESCAPE '\''
871+
872+
# \ as an explicit escape character is currently not supported
873+
query error DataFusion error: Execution error: LIKE does not support escape_char
874+
SELECT
875+
'a' LIKE '\_' ESCAPE '\',
876+
'\a' LIKE '\_' ESCAPE '\',
877+
'_' LIKE '\_' ESCAPE '\',
878+
'\_' LIKE '\_' ESCAPE '\',
879+
'abc' LIKE 'a_c' ESCAPE '\',
880+
'abc' LIKE 'a\_c' ESCAPE '\'
881+
882+
# a LIKE pattern containing escape can never match an empty string
883+
query BBBBB
884+
SELECT
885+
'' LIKE '\',
886+
'' LIKE '\\',
887+
'' LIKE '\_',
888+
'' LIKE '\%',
889+
'' LIKE '\a'
890+
----
891+
false false false false false
892+
893+
# escape before non-wildcard matches the escape itself
894+
query BBBBBBB
895+
SELECT
896+
'a' LIKE '\a',
897+
'\a' LIKE '\a',
898+
'\a' LIKE '\b',
899+
'\' LIKE '\',
900+
'\\' LIKE '\',
901+
'\' LIKE '\\',
902+
'\\' LIKE '\\'
903+
----
904+
false true false true false false true
905+
906+
# if "%%" in the pattern was simplified to "%", the pattern semantics would change
907+
query BBBBB
908+
SELECT
909+
'%' LIKE '\%%',
910+
'%%' LIKE '\%%',
911+
'\%%' LIKE '\%%',
912+
'%abc' LIKE '\%%',
913+
'\%abc' LIKE '\%%'
914+
----
915+
true true false true false
916+
917+
statement ok
918+
create table inputs AS SELECT * FROM (VALUES ('%'), ('%%'), ('\%%'), ('%abc'), ('\%abc')) t(a);
919+
920+
# if "%%" in the pattern was simplified to "%", the pattern semantics would change
921+
# same as above query, but with data coming from a table, so that constant folding cannot kick in, but expression simplification can
922+
query TB
923+
SELECT a, a LIKE '\%%' FROM inputs
924+
----
925+
% true
926+
%% true
927+
\%% false
928+
%abc true
929+
\%abc false
930+
931+
statement ok
932+
drop table inputs;

0 commit comments

Comments
 (0)