This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 316e64af4d Test LIKE with implicit `\` escape (#13288)
316e64af4d is described below

commit 316e64af4d5520e3ffabc519e69e7f6632c134b6
Author: Piotr Findeisen <[email protected]>
AuthorDate: Thu Nov 7 18:57:00 2024 +0100

    Test LIKE with implicit `\` escape (#13288)
---
 .../test_files/string/dictionary_utf8.slt          |   2 +
 .../test_files/string/init_data.slt.part           |   2 +
 .../test_files/string/large_string.slt             |   4 +
 .../sqllogictest/test_files/string/string.slt      |  18 +
 .../test_files/string/string_literal.slt           | 794 +++++++++++++++++++++
 .../test_files/string/string_query.slt.part        | 122 +++-
 6 files changed, 940 insertions(+), 2 deletions(-)

diff --git a/datafusion/sqllogictest/test_files/string/dictionary_utf8.slt 
b/datafusion/sqllogictest/test_files/string/dictionary_utf8.slt
index c43f3a4cc1..d0039f8dcd 100644
--- a/datafusion/sqllogictest/test_files/string/dictionary_utf8.slt
+++ b/datafusion/sqllogictest/test_files/string/dictionary_utf8.slt
@@ -59,6 +59,8 @@ Raphael datafusionДатаФусион false false false false
 under_score un iść core false false false false
 percent pan Tadeusz ma iść w kąt false false false false
 (empty) (empty) false false false false
+% (empty) false false false false
+_ (empty) false false false false
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
diff --git a/datafusion/sqllogictest/test_files/string/init_data.slt.part 
b/datafusion/sqllogictest/test_files/string/init_data.slt.part
index e3914ea498..e1248c73da 100644
--- a/datafusion/sqllogictest/test_files/string/init_data.slt.part
+++ b/datafusion/sqllogictest/test_files/string/init_data.slt.part
@@ -23,6 +23,8 @@ create table test_source as values
   ('under_score', 'un_____core', 'un iść core', 'chrząszcz na łące w 東京都'),
   ('percent', 'p%t', 'pan Tadeusz ma iść w kąt', 'Pan Tadeusz ma frunąć stąd w 
kąt'),
   ('', '%', '', ''),
+  ('%', '\%', '', ''),
+  ('_', '\_', '', ''),
   (NULL, '%', NULL, NULL),
   (NULL, 'R', NULL, '🔥');
 
diff --git a/datafusion/sqllogictest/test_files/string/large_string.slt 
b/datafusion/sqllogictest/test_files/string/large_string.slt
index 1cf906d7dc..5b738d0041 100644
--- a/datafusion/sqllogictest/test_files/string/large_string.slt
+++ b/datafusion/sqllogictest/test_files/string/large_string.slt
@@ -44,6 +44,8 @@ Raphael R datafusionДатаФусион аФус
 under_score un_____core un iść core chrząszcz na łące w 東京都
 percent p%t pan Tadeusz ma iść w kąt Pan Tadeusz ma frunąć stąd w kąt
 (empty) % (empty) (empty)
+% \% (empty) (empty)
+_ \_ (empty) (empty)
 NULL % NULL NULL
 NULL R NULL 🔥
 
@@ -64,6 +66,8 @@ Raphael datafusionДатаФусион false false false false
 under_score un iść core false false false false
 percent pan Tadeusz ma iść w kąt false false false false
 (empty) (empty) false false false false
+% (empty) false false false false
+_ (empty) false false false false
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
diff --git a/datafusion/sqllogictest/test_files/string/string.slt 
b/datafusion/sqllogictest/test_files/string/string.slt
index 9e97712b68..4e173de84f 100644
--- a/datafusion/sqllogictest/test_files/string/string.slt
+++ b/datafusion/sqllogictest/test_files/string/string.slt
@@ -51,6 +51,8 @@ Raphael datafusionДатаФусион false false false false
 under_score un iść core false false false false
 percent pan Tadeusz ma iść w kąt false false false false
 (empty) (empty) false false false false
+% (empty) false false false false
+_ (empty) false false false false
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -74,13 +76,19 @@ SELECT unicode_2, 'is LIKE', ascii_2 FROM 
test_basic_operator WHERE unicode_2 LI
 UNION ALL
 SELECT unicode_2, 'is NOT LIKE', ascii_2 FROM test_basic_operator WHERE 
unicode_2 NOT LIKE ascii_2
 ----
+% is LIKE \%
 (empty) is LIKE %
 (empty) is LIKE %
 (empty) is LIKE %
+(empty) is NOT LIKE \%
+(empty) is NOT LIKE \%
+(empty) is NOT LIKE \_
+(empty) is NOT LIKE \_
 Andrew is NOT LIKE X
 Pan Tadeusz ma frunąć stąd w kąt is NOT LIKE p%t
 Raphael is NOT LIKE R
 Xiangpeng is LIKE Xiangpeng
+_ is LIKE \_
 chrząszcz na łące w 東京都 is NOT LIKE un_____core
 datafusionДатаФусион is NOT LIKE R
 datafusion数据融合 is NOT LIKE Xiangpeng
@@ -105,12 +113,14 @@ SELECT
     (unicode_2 LIKE ascii_2) AS unicode_2_like_ascii_2
 FROM test_basic_operator
 ----
+% \% (empty) (empty) true true false false
 (empty) % (empty) (empty) true false true true
 Andrew X datafusion📊🔥 🔥 false false false false
 NULL % NULL NULL NULL NULL NULL NULL
 NULL R NULL 🔥 NULL NULL NULL false
 Raphael R datafusionДатаФусион аФус false false false false
 Xiangpeng Xiangpeng datafusion数据融合 datafusion数据融合 true true false false
+_ \_ (empty) (empty) true false false false
 percent p%t pan Tadeusz ma iść w kąt Pan Tadeusz ma frunąć stąd w kąt true 
false true false
 under_score un_____core un iść core chrząszcz na łące w 東京都 true false true 
false
 
@@ -129,13 +139,19 @@ SELECT unicode_2, 'is ILIKE', ascii_2 FROM 
test_basic_operator WHERE unicode_2 I
 UNION ALL
 SELECT unicode_2, 'is NOT ILIKE', ascii_2 FROM test_basic_operator WHERE 
unicode_2 NOT ILIKE ascii_2
 ----
+% is ILIKE \%
 (empty) is ILIKE %
 (empty) is ILIKE %
 (empty) is ILIKE %
+(empty) is NOT ILIKE \%
+(empty) is NOT ILIKE \%
+(empty) is NOT ILIKE \_
+(empty) is NOT ILIKE \_
 Andrew is NOT ILIKE X
 Pan Tadeusz ma frunąć stąd w kąt is ILIKE p%t
 Raphael is NOT ILIKE R
 Xiangpeng is ILIKE Xiangpeng
+_ is ILIKE \_
 chrząszcz na łące w 東京都 is NOT ILIKE un_____core
 datafusionДатаФусион is NOT ILIKE R
 datafusion数据融合 is NOT ILIKE Xiangpeng
@@ -160,12 +176,14 @@ SELECT
     (unicode_2 ILIKE ascii_2) AS unicode_2_ilike_ascii_2
 FROM test_basic_operator
 ----
+% \% (empty) (empty) true true false false
 (empty) % (empty) (empty) true false true true
 Andrew X datafusion📊🔥 🔥 false false false false
 NULL % NULL NULL NULL NULL NULL NULL
 NULL R NULL 🔥 NULL NULL NULL false
 Raphael R datafusionДатаФусион аФус false false false false
 Xiangpeng Xiangpeng datafusion数据融合 datafusion数据融合 true true false false
+_ \_ (empty) (empty) true false false false
 percent p%t pan Tadeusz ma iść w kąt Pan Tadeusz ma frunąć stąd w kąt true 
false true true
 under_score un_____core un iść core chrząszcz na łące w 東京都 true false true 
false
 
diff --git a/datafusion/sqllogictest/test_files/string/string_literal.slt 
b/datafusion/sqllogictest/test_files/string/string_literal.slt
index 6d12d83773..57261470f6 100644
--- a/datafusion/sqllogictest/test_files/string/string_literal.slt
+++ b/datafusion/sqllogictest/test_files/string/string_literal.slt
@@ -15,6 +15,15 @@
 # specific language governing permissions and limitations
 # under the License.
 
+# a backslash in a string literal is not a special character
+query T
+VALUES ('\'), ('\\'), ('\\\'), ('\\\\')
+----
+\
+\\
+\\\
+\\\\
+
 query T
 SELECT substr('alphabet', -3)
 ----
@@ -829,3 +838,788 @@ SELECT
     'a' LIKE '%'
 ----
 NULL true true
+
+# \ is an implicit escape character
+query BBBB
+SELECT
+    'a' LIKE '\%',
+    '\a' LIKE '\%',
+    '%' LIKE '\%',
+    '\%' LIKE '\%'
+----
+false false true false
+
+# \ is an implicit escape character
+query BBBBBB
+SELECT
+    'a' LIKE '\_',
+    '\a' LIKE '\_',
+    '_' LIKE '\_',
+    '\_' LIKE '\_',
+    'abc' LIKE 'a_c',
+    'abc' LIKE 'a\_c'
+----
+false false true false true false
+
+# \ as an explicit escape character is currently not supported
+query error DataFusion error: Execution error: LIKE does not support 
escape_char
+SELECT
+    'a' LIKE '\%' ESCAPE '\',
+    '\a' LIKE '\%' ESCAPE '\',
+    '%' LIKE '\%' ESCAPE '\',
+    '\%' LIKE '\%' ESCAPE '\'
+
+# \ as an explicit escape character is currently not supported
+query error DataFusion error: Execution error: LIKE does not support 
escape_char
+SELECT
+    'a' LIKE '\_' ESCAPE '\',
+    '\a' LIKE '\_' ESCAPE '\',
+    '_' LIKE '\_' ESCAPE '\',
+    '\_' LIKE '\_' ESCAPE '\',
+    'abc' LIKE 'a_c' ESCAPE '\',
+    'abc' LIKE 'a\_c' ESCAPE '\'
+
+# a LIKE pattern containing escape can never match an empty string
+query BBBBB
+SELECT
+    '' LIKE '\',
+    '' LIKE '\\',
+    '' LIKE '\_',
+    '' LIKE '\%',
+    '' LIKE '\a'
+----
+false false false false false
+
+# escape before non-wildcard matches the escape itself
+query BBBBBBB
+SELECT
+    'a' LIKE '\a',
+    '\a' LIKE '\a',
+    '\a' LIKE '\b',
+    '\' LIKE '\',
+    '\\' LIKE '\',
+    '\' LIKE '\\',
+    '\\' LIKE '\\'
+----
+false true false true false false true
+
+# if "%%" in the pattern was simplified to "%", the pattern semantics would 
change
+query BBBBB
+SELECT
+    '%' LIKE '\%%',
+    '%%' LIKE '\%%',
+    '\%%' LIKE '\%%',
+    '%abc' LIKE '\%%',
+    '\%abc' LIKE '\%%'
+----
+true true false true false
+
+statement ok
+create table inputs AS SELECT * FROM (VALUES ('%'), ('%%'), ('\%%'), ('%abc'), 
('\%abc')) t(a);
+
+# if "%%" in the pattern was simplified to "%", the pattern semantics would 
change
+# same as above query, but with data coming from a table, so that constant 
folding cannot kick in, but expression simplification can
+query TB
+SELECT a, a LIKE '\%%' FROM inputs
+----
+% true
+%% true
+\%% false
+%abc true
+\%abc false
+
+statement ok
+drop table inputs;
+
+# constant folding and expression simplification cannot kick in
+query TTB
+WITH data(a) AS (VALUES
+    (NULL), (''),
+    ('\'), ('\\'), ('\\\'), ('\\\\'),
+    ('a'), ('\a'), ('\\a'),
+    ('%'), ('\%'), ('\\%'),
+    ('%%'), ('\%%'), ('\\%%'),
+    ('_'), ('\_'), ('\\_'),
+    ('__'), ('\__'), ('\\__'),
+    ('abc'), ('a_c'), ('a\_c'),
+    ('%abc'), ('\%abc')
+)
+SELECT l.a, r.a, l.a LIKE r.a
+FROM data l CROSS JOIN data r
+----
+NULL NULL NULL
+NULL (empty) NULL
+NULL \ NULL
+NULL \\ NULL
+NULL \\\ NULL
+NULL \\\\ NULL
+NULL a NULL
+NULL \a NULL
+NULL \\a NULL
+NULL % NULL
+NULL \% NULL
+NULL \\% NULL
+NULL %% NULL
+NULL \%% NULL
+NULL \\%% NULL
+NULL _ NULL
+NULL \_ NULL
+NULL \\_ NULL
+NULL __ NULL
+NULL \__ NULL
+NULL \\__ NULL
+NULL abc NULL
+NULL a_c NULL
+NULL a\_c NULL
+NULL %abc NULL
+NULL \%abc NULL
+(empty) NULL NULL
+(empty) (empty) true
+(empty) \ false
+(empty) \\ false
+(empty) \\\ false
+(empty) \\\\ false
+(empty) a false
+(empty) \a false
+(empty) \\a false
+(empty) % true
+(empty) \% false
+(empty) \\% false
+(empty) %% true
+(empty) \%% false
+(empty) \\%% false
+(empty) _ false
+(empty) \_ false
+(empty) \\_ false
+(empty) __ false
+(empty) \__ false
+(empty) \\__ false
+(empty) abc false
+(empty) a_c false
+(empty) a\_c false
+(empty) %abc false
+(empty) \%abc false
+\ NULL NULL
+\ (empty) false
+\ \ true
+\ \\ false
+\ \\\ false
+\ \\\\ false
+\ a false
+\ \a false
+\ \\a false
+\ % true
+\ \% false
+\ \\% false
+\ %% true
+\ \%% false
+\ \\%% false
+\ _ true
+\ \_ false
+\ \\_ false
+\ __ false
+\ \__ false
+\ \\__ false
+\ abc false
+\ a_c false
+\ a\_c false
+\ %abc false
+\ \%abc false
+\\ NULL NULL
+\\ (empty) false
+\\ \ false
+\\ \\ true
+\\ \\\ false
+\\ \\\\ false
+\\ a false
+\\ \a false
+\\ \\a false
+\\ % true
+\\ \% false
+\\ \\% false
+\\ %% true
+\\ \%% false
+\\ \\%% false
+\\ _ false
+\\ \_ false
+\\ \\_ false
+\\ __ true
+\\ \__ false
+\\ \\__ false
+\\ abc false
+\\ a_c false
+\\ a\_c false
+\\ %abc false
+\\ \%abc false
+\\\ NULL NULL
+\\\ (empty) false
+\\\ \ false
+\\\ \\ false
+\\\ \\\ true
+\\\ \\\\ false
+\\\ a false
+\\\ \a false
+\\\ \\a false
+\\\ % true
+\\\ \% false
+\\\ \\% false
+\\\ %% true
+\\\ \%% false
+\\\ \\%% false
+\\\ _ false
+\\\ \_ false
+\\\ \\_ false
+\\\ __ false
+\\\ \__ false
+\\\ \\__ false
+\\\ abc false
+\\\ a_c false
+\\\ a\_c false
+\\\ %abc false
+\\\ \%abc false
+\\\\ NULL NULL
+\\\\ (empty) false
+\\\\ \ false
+\\\\ \\ false
+\\\\ \\\ false
+\\\\ \\\\ true
+\\\\ a false
+\\\\ \a false
+\\\\ \\a false
+\\\\ % true
+\\\\ \% false
+\\\\ \\% false
+\\\\ %% true
+\\\\ \%% false
+\\\\ \\%% false
+\\\\ _ false
+\\\\ \_ false
+\\\\ \\_ false
+\\\\ __ false
+\\\\ \__ false
+\\\\ \\__ false
+\\\\ abc false
+\\\\ a_c false
+\\\\ a\_c false
+\\\\ %abc false
+\\\\ \%abc false
+a NULL NULL
+a (empty) false
+a \ false
+a \\ false
+a \\\ false
+a \\\\ false
+a a true
+a \a false
+a \\a false
+a % true
+a \% false
+a \\% false
+a %% true
+a \%% false
+a \\%% false
+a _ true
+a \_ false
+a \\_ false
+a __ false
+a \__ false
+a \\__ false
+a abc false
+a a_c false
+a a\_c false
+a %abc false
+a \%abc false
+\a NULL NULL
+\a (empty) false
+\a \ false
+\a \\ false
+\a \\\ false
+\a \\\\ false
+\a a false
+\a \a true
+\a \\a false
+\a % true
+\a \% false
+\a \\% false
+\a %% true
+\a \%% false
+\a \\%% false
+\a _ false
+\a \_ false
+\a \\_ false
+\a __ true
+\a \__ false
+\a \\__ false
+\a abc false
+\a a_c false
+\a a\_c false
+\a %abc false
+\a \%abc false
+\\a NULL NULL
+\\a (empty) false
+\\a \ false
+\\a \\ false
+\\a \\\ false
+\\a \\\\ false
+\\a a false
+\\a \a false
+\\a \\a true
+\\a % true
+\\a \% false
+\\a \\% false
+\\a %% true
+\\a \%% false
+\\a \\%% false
+\\a _ false
+\\a \_ false
+\\a \\_ false
+\\a __ false
+\\a \__ false
+\\a \\__ false
+\\a abc false
+\\a a_c false
+\\a a\_c false
+\\a %abc false
+\\a \%abc false
+% NULL NULL
+% (empty) false
+% \ false
+% \\ false
+% \\\ false
+% \\\\ false
+% a false
+% \a false
+% \\a false
+% % true
+% \% true
+% \\% false
+% %% true
+% \%% true
+% \\%% false
+% _ true
+% \_ false
+% \\_ false
+% __ false
+% \__ false
+% \\__ false
+% abc false
+% a_c false
+% a\_c false
+% %abc false
+% \%abc false
+\% NULL NULL
+\% (empty) false
+\% \ false
+\% \\ false
+\% \\\ false
+\% \\\\ false
+\% a false
+\% \a false
+\% \\a false
+\% % true
+\% \% false
+\% \\% true
+\% %% true
+\% \%% false
+\% \\%% true
+\% _ false
+\% \_ false
+\% \\_ false
+\% __ true
+\% \__ false
+\% \\__ false
+\% abc false
+\% a_c false
+\% a\_c false
+\% %abc false
+\% \%abc false
+\\% NULL NULL
+\\% (empty) false
+\\% \ false
+\\% \\ false
+\\% \\\ false
+\\% \\\\ false
+\\% a false
+\\% \a false
+\\% \\a false
+\\% % true
+\\% \% false
+\\% \\% false
+\\% %% true
+\\% \%% false
+\\% \\%% false
+\\% _ false
+\\% \_ false
+\\% \\_ false
+\\% __ false
+\\% \__ false
+\\% \\__ false
+\\% abc false
+\\% a_c false
+\\% a\_c false
+\\% %abc false
+\\% \%abc false
+%% NULL NULL
+%% (empty) false
+%% \ false
+%% \\ false
+%% \\\ false
+%% \\\\ false
+%% a false
+%% \a false
+%% \\a false
+%% % true
+%% \% false
+%% \\% false
+%% %% true
+%% \%% true
+%% \\%% false
+%% _ false
+%% \_ false
+%% \\_ false
+%% __ true
+%% \__ false
+%% \\__ false
+%% abc false
+%% a_c false
+%% a\_c false
+%% %abc false
+%% \%abc false
+\%% NULL NULL
+\%% (empty) false
+\%% \ false
+\%% \\ false
+\%% \\\ false
+\%% \\\\ false
+\%% a false
+\%% \a false
+\%% \\a false
+\%% % true
+\%% \% false
+\%% \\% false
+\%% %% true
+\%% \%% false
+\%% \\%% true
+\%% _ false
+\%% \_ false
+\%% \\_ false
+\%% __ false
+\%% \__ false
+\%% \\__ false
+\%% abc false
+\%% a_c false
+\%% a\_c false
+\%% %abc false
+\%% \%abc false
+\\%% NULL NULL
+\\%% (empty) false
+\\%% \ false
+\\%% \\ false
+\\%% \\\ false
+\\%% \\\\ false
+\\%% a false
+\\%% \a false
+\\%% \\a false
+\\%% % true
+\\%% \% false
+\\%% \\% false
+\\%% %% true
+\\%% \%% false
+\\%% \\%% false
+\\%% _ false
+\\%% \_ false
+\\%% \\_ false
+\\%% __ false
+\\%% \__ false
+\\%% \\__ false
+\\%% abc false
+\\%% a_c false
+\\%% a\_c false
+\\%% %abc false
+\\%% \%abc false
+_ NULL NULL
+_ (empty) false
+_ \ false
+_ \\ false
+_ \\\ false
+_ \\\\ false
+_ a false
+_ \a false
+_ \\a false
+_ % true
+_ \% false
+_ \\% false
+_ %% true
+_ \%% false
+_ \\%% false
+_ _ true
+_ \_ true
+_ \\_ false
+_ __ false
+_ \__ false
+_ \\__ false
+_ abc false
+_ a_c false
+_ a\_c false
+_ %abc false
+_ \%abc false
+\_ NULL NULL
+\_ (empty) false
+\_ \ false
+\_ \\ false
+\_ \\\ false
+\_ \\\\ false
+\_ a false
+\_ \a false
+\_ \\a false
+\_ % true
+\_ \% false
+\_ \\% false
+\_ %% true
+\_ \%% false
+\_ \\%% false
+\_ _ false
+\_ \_ false
+\_ \\_ true
+\_ __ true
+\_ \__ false
+\_ \\__ false
+\_ abc false
+\_ a_c false
+\_ a\_c false
+\_ %abc false
+\_ \%abc false
+\\_ NULL NULL
+\\_ (empty) false
+\\_ \ false
+\\_ \\ false
+\\_ \\\ false
+\\_ \\\\ false
+\\_ a false
+\\_ \a false
+\\_ \\a false
+\\_ % true
+\\_ \% false
+\\_ \\% false
+\\_ %% true
+\\_ \%% false
+\\_ \\%% false
+\\_ _ false
+\\_ \_ false
+\\_ \\_ false
+\\_ __ false
+\\_ \__ false
+\\_ \\__ false
+\\_ abc false
+\\_ a_c false
+\\_ a\_c false
+\\_ %abc false
+\\_ \%abc false
+__ NULL NULL
+__ (empty) false
+__ \ false
+__ \\ false
+__ \\\ false
+__ \\\\ false
+__ a false
+__ \a false
+__ \\a false
+__ % true
+__ \% false
+__ \\% false
+__ %% true
+__ \%% false
+__ \\%% false
+__ _ false
+__ \_ false
+__ \\_ false
+__ __ true
+__ \__ true
+__ \\__ false
+__ abc false
+__ a_c false
+__ a\_c false
+__ %abc false
+__ \%abc false
+\__ NULL NULL
+\__ (empty) false
+\__ \ false
+\__ \\ false
+\__ \\\ false
+\__ \\\\ false
+\__ a false
+\__ \a false
+\__ \\a false
+\__ % true
+\__ \% false
+\__ \\% false
+\__ %% true
+\__ \%% false
+\__ \\%% false
+\__ _ false
+\__ \_ false
+\__ \\_ false
+\__ __ false
+\__ \__ false
+\__ \\__ true
+\__ abc false
+\__ a_c false
+\__ a\_c false
+\__ %abc false
+\__ \%abc false
+\\__ NULL NULL
+\\__ (empty) false
+\\__ \ false
+\\__ \\ false
+\\__ \\\ false
+\\__ \\\\ false
+\\__ a false
+\\__ \a false
+\\__ \\a false
+\\__ % true
+\\__ \% false
+\\__ \\% false
+\\__ %% true
+\\__ \%% false
+\\__ \\%% false
+\\__ _ false
+\\__ \_ false
+\\__ \\_ false
+\\__ __ false
+\\__ \__ false
+\\__ \\__ false
+\\__ abc false
+\\__ a_c false
+\\__ a\_c false
+\\__ %abc false
+\\__ \%abc false
+abc NULL NULL
+abc (empty) false
+abc \ false
+abc \\ false
+abc \\\ false
+abc \\\\ false
+abc a false
+abc \a false
+abc \\a false
+abc % true
+abc \% false
+abc \\% false
+abc %% true
+abc \%% false
+abc \\%% false
+abc _ false
+abc \_ false
+abc \\_ false
+abc __ false
+abc \__ false
+abc \\__ false
+abc abc true
+abc a_c true
+abc a\_c false
+abc %abc true
+abc \%abc false
+a_c NULL NULL
+a_c (empty) false
+a_c \ false
+a_c \\ false
+a_c \\\ false
+a_c \\\\ false
+a_c a false
+a_c \a false
+a_c \\a false
+a_c % true
+a_c \% false
+a_c \\% false
+a_c %% true
+a_c \%% false
+a_c \\%% false
+a_c _ false
+a_c \_ false
+a_c \\_ false
+a_c __ false
+a_c \__ false
+a_c \\__ false
+a_c abc false
+a_c a_c true
+a_c a\_c true
+a_c %abc false
+a_c \%abc false
+a\_c NULL NULL
+a\_c (empty) false
+a\_c \ false
+a\_c \\ false
+a\_c \\\ false
+a\_c \\\\ false
+a\_c a false
+a\_c \a false
+a\_c \\a false
+a\_c % true
+a\_c \% false
+a\_c \\% false
+a\_c %% true
+a\_c \%% false
+a\_c \\%% false
+a\_c _ false
+a\_c \_ false
+a\_c \\_ false
+a\_c __ false
+a\_c \__ false
+a\_c \\__ false
+a\_c abc false
+a\_c a_c false
+a\_c a\_c false
+a\_c %abc false
+a\_c \%abc false
+%abc NULL NULL
+%abc (empty) false
+%abc \ false
+%abc \\ false
+%abc \\\ false
+%abc \\\\ false
+%abc a false
+%abc \a false
+%abc \\a false
+%abc % true
+%abc \% false
+%abc \\% false
+%abc %% true
+%abc \%% true
+%abc \\%% false
+%abc _ false
+%abc \_ false
+%abc \\_ false
+%abc __ false
+%abc \__ false
+%abc \\__ false
+%abc abc false
+%abc a_c false
+%abc a\_c false
+%abc %abc true
+%abc \%abc true
+\%abc NULL NULL
+\%abc (empty) false
+\%abc \ false
+\%abc \\ false
+\%abc \\\ false
+\%abc \\\\ false
+\%abc a false
+\%abc \a false
+\%abc \\a false
+\%abc % true
+\%abc \% false
+\%abc \\% false
+\%abc %% true
+\%abc \%% false
+\%abc \\%% true
+\%abc _ false
+\%abc \_ false
+\%abc \\_ false
+\%abc __ false
+\%abc \__ false
+\%abc \\__ false
+\%abc abc false
+\%abc a_c false
+\%abc a\_c false
+\%abc %abc true
+\%abc \%abc false
diff --git a/datafusion/sqllogictest/test_files/string/string_query.slt.part 
b/datafusion/sqllogictest/test_files/string/string_query.slt.part
index 4960a02540..9536cfee93 100644
--- a/datafusion/sqllogictest/test_files/string/string_query.slt.part
+++ b/datafusion/sqllogictest/test_files/string/string_query.slt.part
@@ -29,6 +29,8 @@ Raphael R datafusionДатаФусион аФус
 under_score un_____core un iść core chrząszcz na łące w 東京都
 percent p%t pan Tadeusz ma iść w kąt Pan Tadeusz ma frunąć stąd w kąt
 (empty) % (empty) (empty)
+% \% (empty) (empty)
+_ \_ (empty) (empty)
 NULL % NULL NULL
 NULL R NULL 🔥
 
@@ -49,12 +51,16 @@ Raphael R
 under_score un_____core
 percent p%t
 (empty) %
+% \%
+_ \_
 
 query TT
 select unicode_1, unicode_2 from test_basic_operator where unicode_1 = 
unicode_2
 ----
 datafusion数据融合 datafusion数据融合
 (empty) (empty)
+(empty) (empty)
+(empty) (empty)
 
 query TT
 select unicode_1, unicode_2 from test_basic_operator where unicode_1 <> 
unicode_2
@@ -77,6 +83,8 @@ Xiangpeng datafusion数据融合
 Raphael datafusionДатаФусион
 under_score un iść core
 percent pan Tadeusz ma iść w kąt
+% (empty)
+_ (empty)
 
 # --------------------------------------
 # column comparison
@@ -98,6 +106,8 @@ Raphael R datafusionДатаФусион аФус false true false true 
false tr
 under_score un_____core un iść core chrząszcz na łące w 東京都 false true false 
true false true
 percent p%t pan Tadeusz ma iść w kąt Pan Tadeusz ma frunąć stąd w kąt false 
true false true false true
 (empty) % (empty) (empty) false true true false true false
+% \% (empty) (empty) false true true false false true
+_ \_ (empty) (empty) false true true false false true
 NULL % NULL NULL NULL NULL NULL NULL NULL NULL
 NULL R NULL 🔥 NULL NULL NULL NULL NULL NULL
 
@@ -119,6 +129,8 @@ Raphael datafusionДатаФусион false true false true
 under_score un iść core false true false true
 percent pan Tadeusz ma iść w kąt false true false true
 (empty) (empty) false true false true
+% (empty) false true false true
+_ (empty) false true false true
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -140,6 +152,8 @@ Raphael datafusionДатаФусион false true false true
 under_score un iść core false true false true
 percent pan Tadeusz ma iść w kąt false true false true
 (empty) (empty) false true false true
+% (empty) false true false true
+_ (empty) false true false true
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -161,6 +175,8 @@ Raphael datafusionДатаФусион false true false true
 under_score un iść core false true false true
 percent pan Tadeusz ma iść w kąt false true false true
 (empty) (empty) false true false true
+% (empty) false true false true
+_ (empty) false true false true
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -207,6 +223,8 @@ Rap R dat аФу
 und un_ un  chr
 per p%t pan Pan
 (empty) % (empty) (empty)
+% \% (empty) (empty)
+_ \_ (empty) (empty)
 NULL % NULL NULL
 NULL R NULL 🔥
 
@@ -220,7 +238,7 @@ SELECT
 FROM
     test_basic_operator
 ----
-6 6
+8 6
 
 query II
 SELECT
@@ -236,6 +254,8 @@ GROUP BY ascii_2;
 1 1
 1 1
 1 1
+1 1
+1 1
 
 query II rowsort
 SELECT
@@ -251,7 +271,7 @@ GROUP BY unicode_2;
 1 1
 1 1
 1 1
-1 1
+3 1
 
 # --------------------------------------
 # STARTS_WITH function
@@ -271,6 +291,8 @@ true false false false
 false false false false
 false false false false
 false true true false
+false true true false
+false true true false
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -288,6 +310,8 @@ false false true false
 false false false false
 false false false false
 false false false false
+false false false false
+false false false false
 NULL false NULL NULL
 NULL false NULL false
 
@@ -306,6 +330,8 @@ Raphael
 under_scrre
 percent
 (empty)
+%
+_
 NULL
 NULL
 
@@ -320,6 +346,8 @@ databusirnДатаФусион
 un iść crre
 pan Tadeusz ma iść w kąt
 (empty)
+(empty)
+(empty)
 NULL
 NULL
 
@@ -339,6 +367,8 @@ Raphafl
 undfr_score
 pfrcent
 (empty)
+%
+_
 NULL
 NULL
 
@@ -354,6 +384,8 @@ Raphafl
 undfr_score
 pfrcent
 (empty)
+%
+_
 NULL
 NULL
 
@@ -369,6 +401,8 @@ Raphael
 bar
 bar
 bar
+bar
+bar
 NULL
 NULL
 
@@ -384,6 +418,8 @@ Raphael
 bar
 bar
 bar
+bar
+bar
 NULL
 NULL
 
@@ -408,6 +444,8 @@ Raphael Datafusionдатафусион
 Under_Score Un Iść Core
 Percent Pan Tadeusz Ma Iść W KąT
 (empty) (empty)
+% (empty)
+_ (empty)
 NULL NULL
 NULL NULL
 
@@ -432,6 +470,8 @@ FROM test_basic_operator;
 117 117 117 99
 112 112 112 80
 0 37 0 0
+37 92 0 0
+95 92 0 0
 NULL 37 NULL NULL
 NULL 82 NULL 128293
 
@@ -456,6 +496,8 @@ Raphael Raphael NULL datafusionДатаФусион 
datafusionДатаФусио
 under_score under_score NULL un iść core un iść core NULL
 percent percent NULL pan Tadeusz ma iść w kąt pan Tadeusz ma iść w kąt NULL
 (empty) (empty) NULL (empty) (empty) NULL
+% % NULL (empty) (empty) NULL
+_ _ NULL (empty) (empty) NULL
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -480,6 +522,8 @@ Raphael aphael NULL datafusionДатаФусион NULL 
datafusionДатаФус
 under_score der_score NULL un iść core NULL un iść core
 percent ercent NULL pan Tadeusz ma iść w kąt NULL pan Tadeusz ma iść w kąt
 (empty) (empty) NULL (empty) NULL (empty)
+% (empty) NULL (empty) NULL (empty)
+_ (empty) NULL (empty) NULL (empty)
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -503,6 +547,8 @@ Raphael Raphael Raphael NULL datafusionДатаФусион
 under_sco under_s under_score NULL un iść core
 percent percen percent NULL pan Tadeusz ma iść w kąt
 (empty) (empty) (empty) NULL (empty)
+% (empty) % NULL (empty)
+_ (empty) _ NULL (empty)
 NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL
 
@@ -526,6 +572,8 @@ false true NULL true NULL false
 false false NULL false NULL false
 false false NULL false NULL false
 false false NULL true NULL false
+false false NULL true NULL false
+false false NULL true NULL false
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -542,6 +590,8 @@ raphael datafusionдатафусион
 under_score un iść core
 percent pan tadeusz ma iść w kąt
 (empty) (empty)
+% (empty)
+_ (empty)
 NULL NULL
 NULL NULL
 
@@ -558,6 +608,8 @@ RAPHAEL DATAFUSIONДАТАФУСИОН
 UNDER_SCORE UN IŚĆ CORE
 PERCENT PAN TADEUSZ MA IŚĆ W KĄT
 (empty) (empty)
+% (empty)
+_ (empty)
 NULL NULL
 NULL NULL
 
@@ -587,6 +639,8 @@ Raphael:Data RaphaelR Raphael RaphaeldatafusionДатаФусион 
RaphaelаФ
 under_score:Data under_scoreun_____core under_score under_scoreun iść core 
under_scorechrząszcz na łące w 東京都 un iść coreunder_score un iść corechrząszcz 
na łące w 東京都 un iść core un iść core🔥 🔥 (empty) under_score,un iść core
 percent:Data percentp%t percent percentpan Tadeusz ma iść w kąt percentPan 
Tadeusz ma frunąć stąd w kąt pan Tadeusz ma iść w kątpercent pan Tadeusz ma iść 
w kątPan Tadeusz ma frunąć stąd w kąt pan Tadeusz ma iść w kąt pan Tadeusz ma 
iść w kąt🔥 🔥 (empty) percent,pan Tadeusz ma iść w kąt
 :Data % (empty) (empty) (empty) (empty) (empty) (empty) 🔥 🔥 (empty) ,
+%:Data %\% % % % % (empty) (empty) 🔥 🔥 (empty) %,
+_:Data _\_ _ _ _ _ (empty) (empty) 🔥 🔥 (empty) _,
 :Data % (empty) (empty) (empty) (empty) (empty) (empty) 🔥 🔥 (empty) ,
 :Data R (empty) (empty) 🔥 (empty) 🔥 (empty) 🔥 🔥 (empty) ,
 
@@ -610,6 +664,8 @@ Rfooael dfoofusionДатаФусион R🔥phael d🔥tafusionДатаФуси
 ufoor_score ufoość core u🔥der_score u🔥 iść core NULL NULL
 pfooent pfooTadeusz ma iść w kąt p🔥rcent p🔥n Tadeusz ma iść w kąt NULL NULL
 foo foo 🔥 🔥 NULL NULL
+foo foo 🔥 🔥 NULL NULL
+foo foo 🔥 🔥 NULL NULL
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -633,6 +689,8 @@ Raphael baraphael NULL datafusionДатbarион NULL 
datafusionДатаФуси
 under_score under_score NULL un iść core NULL un iść core
 percent percent NULL pan Tadeusz ma iść w kąt NULL pan Tadeusz ma iść w kąt
 (empty) (empty) NULL bar NULL (empty)
+% % NULL bar NULL (empty)
+_ _ NULL bar NULL (empty)
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -656,6 +714,8 @@ ael (empty) hael ион (empty) afusionДатаФусион
 ore (empty) er_score ore (empty) iść core
 ent (empty) cent kąt (empty)  Tadeusz ma iść w kąt
 (empty) (empty) (empty) (empty) (empty) (empty)
+% (empty) (empty) (empty) (empty) (empty)
+_ (empty) (empty) (empty) (empty) (empty)
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -680,6 +740,8 @@ Rap (empty) Raph dat (empty) datafusionДатаФус
 und (empty) under_sc un  (empty) un iść c
 per (empty) perc pan (empty) pan Tadeusz ma iść w 
 (empty) (empty) (empty) (empty) (empty) (empty)
+% (empty) (empty) (empty) (empty) (empty)
+_ (empty) (empty) (empty) (empty) (empty)
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -701,6 +763,8 @@ R Raph datafusionД datafusionДат
 under_score under_score un iść core un iść core
 percent percent pan Tadeusz ma iść w kąt pan Tadeusz ma iść w kąt
 (empty) (empty) (empty) (empty)
+% % (empty) (empty)
+_ _ (empty) (empty)
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -722,6 +786,8 @@ FROM test_basic_operator;
 0 0 0 0
 0 0 0 0
 0 0 0 0
+0 0 0 0
+0 0 0 0
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -745,6 +811,8 @@ Raphaelfoo Raphael🔥 datafusionДатаФусионfoo datafusionДатаФу
 under_scorefoo under_score🔥 un iść corefoo un iść core🔥
 percentfoo percent🔥 pan Tadeusz ma iść w kątfoo pan Tadeusz ma iść w kąt🔥
 foo 🔥 foo 🔥
+%foo %🔥 foo 🔥
+_foo _🔥 foo 🔥
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -764,6 +832,8 @@ RaphaelR RaphaelаФус datafusionДатаФусионR datafusionДатаФу
 under_scoreun_____core under_scorechrząszcz na łące w 東京都 un iść 
coreun_____core un iść corechrząszcz na łące w 東京都
 percentp%t percentPan Tadeusz ma frunąć stąd w kąt pan Tadeusz ma iść w kątp%t 
pan Tadeusz ma iść w kątPan Tadeusz ma frunąć stąd w kąt
 % (empty) % (empty)
+%\% % \% (empty)
+_\_ _ \_ (empty)
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -783,6 +853,8 @@ false true
 false false
 false false
 false false
+false false
+false false
 NULL NULL
 NULL NULL
 
@@ -798,6 +870,8 @@ false true
 false false
 false false
 false false
+false false
+false false
 NULL NULL
 NULL NULL
 
@@ -813,6 +887,8 @@ true true
 true true
 true true
 true true
+true true
+true true
 NULL NULL
 NULL NULL
 
@@ -828,6 +904,8 @@ true true
 true true
 true true
 true true
+true true
+true true
 NULL NULL
 NULL NULL
 
@@ -850,6 +928,8 @@ Raphael nice Raphael and R datafusionДатаФусион cool 
datafusionДат
 under_score nice under_score and un_____core un iść core cool un iść core and 
chrząszcz na łące w 東京都 under_score 🔥 un iść core
 percent nice percent and p%t pan Tadeusz ma iść w kąt cool pan Tadeusz ma iść 
w kąt and Pan Tadeusz ma frunąć stąd w kąt percent 🔥 pan Tadeusz ma iść w kąt
  nice  and %  cool  and   🔥 
+% nice % and \%  cool  and  % 🔥 
+_ nice _ and \_  cool  and  _ 🔥 
 NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL
 
@@ -888,6 +968,8 @@ Raphael datafusionДатаФусион true true
 under_score un iść core true true
 percent pan Tadeusz ma iść w kąt true true
 (empty) (empty) true true
+% (empty) true true
+_ (empty) true true
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -906,6 +988,8 @@ Raphael datafusionДатаФусион false false
 under_score un iść core false false
 percent pan Tadeusz ma iść w kąt false false
 (empty) (empty) false false
+% (empty) false false
+_ (empty) false false
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -918,6 +1002,8 @@ Raphael
 under_score
 percent
 (empty)
+%
+_
 
 query T
 SELECT ascii_1 FROM test_basic_operator WHERE ascii_1 NOT LIKE '%'
@@ -938,6 +1024,8 @@ Raphael datafusionДатаФусион false false false false
 under_score un iść core false false false false
 percent pan Tadeusz ma iść w kąt false false false false
 (empty) (empty) false false false false
+% (empty) false false false false
+_ (empty) false false false false
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -958,6 +1046,8 @@ FROM
 11 11
 7 24
 0 0
+1 0
+1 0
 NULL NULL
 NULL NULL
 
@@ -979,6 +1069,8 @@ false true NULL NULL
 false false NULL NULL
 false false NULL NULL
 false false NULL NULL
+false false NULL NULL
+false false NULL NULL
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -1000,6 +1092,8 @@ false true NULL NULL
 false false NULL NULL
 false false NULL NULL
 false false NULL NULL
+false false NULL NULL
+false false NULL NULL
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -1021,6 +1115,8 @@ FROM test_basic_operator;
 8 13 NULL NULL
 6 19 NULL NULL
 6 14 NULL NULL
+6 14 NULL NULL
+6 14 NULL NULL
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -1042,6 +1138,8 @@ xxxxxxxxxxxxxRaphael NULL datafusionДатаФусион NULL
 xxxxxxxxxunder_score NULL 🔥🔥🔥🔥🔥🔥🔥🔥🔥un iść core NULL
 xxxxxxxxxxxxxpercent NULL pan Tadeusz ma iść w NULL
 xxxxxxxxxxxxxxxxxxxx NULL 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥 NULL
+xxxxxxxxxxxxxxxxxxx% NULL 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥 NULL
+xxxxxxxxxxxxxxxxxxx_ NULL 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥 NULL
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -1058,6 +1156,8 @@ FROM test_basic_operator;
          under_score          un iść core |
              percent pan Tadeusz ma iść w |
                                           |
+                   %                      |
+                   _                      |
 NULL NULL |
 NULL NULL |
 
@@ -1079,6 +1179,8 @@ Raphaelxxxxxxxxxxxxx NULL datafusionДатаФусион NULL
 under_scorexxxxxxxxx NULL un iść core🔥🔥🔥🔥🔥🔥🔥🔥🔥 NULL
 percentxxxxxxxxxxxxx NULL pan Tadeusz ma iść w NULL
 xxxxxxxxxxxxxxxxxxxx NULL 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥 NULL
+%xxxxxxxxxxxxxxxxxxx NULL 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥 NULL
+_xxxxxxxxxxxxxxxxxxx NULL 🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥 NULL
 NULL NULL NULL NULL
 NULL NULL NULL NULL
 
@@ -1094,6 +1196,8 @@ Raphael              datafusionДатаФусион
 under_score          un iść core         
 percent              pan Tadeusz ma iść w
                                          
+%                                        
+_                                        
 NULL NULL
 NULL NULL
 
@@ -1121,6 +1225,8 @@ false true NULL NULL false true NULL NULL
 false false NULL NULL false false NULL NULL
 false false NULL NULL false false NULL NULL
 false false NULL NULL false false NULL NULL
+false false NULL NULL false false NULL NULL
+false false NULL NULL false false NULL NULL
 NULL NULL NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL NULL NULL
 
@@ -1150,6 +1256,8 @@ NULL NULL NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL NULL NULL
+NULL NULL NULL NULL NULL NULL NULL NULL
+NULL NULL NULL NULL NULL NULL NULL NULL
 
 # --------------------------------------
 # Test REPEAT
@@ -1167,6 +1275,8 @@ RaphaelRaphaelRaphael 
datafusionДатаФусионdatafusionДатаФусио
 under_scoreunder_scoreunder_score un iść coreun iść coreun iść core
 percentpercentpercent pan Tadeusz ma iść w kątpan Tadeusz ma iść w kątpan 
Tadeusz ma iść w kąt
 (empty) (empty)
+%%% (empty)
+___ (empty)
 NULL NULL
 NULL NULL
 
@@ -1190,6 +1300,8 @@ Rapha l NULL datafusionДатаФус он NULL
 und r_scor NULL un iść core (empty) NULL
 p rc NULL pan Tadeusz ma iść w kąt (empty) NULL
 (empty) (empty) NULL (empty) (empty) NULL
+% (empty) NULL (empty) (empty) NULL
+_ (empty) NULL (empty) (empty) NULL
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -1209,6 +1321,8 @@ leahpaR ноисуФатаДnoisufatad
 erocs_rednu eroc ćśi nu
 tnecrep tąk w ćśi am zsuedaT nap
 (empty) (empty)
+% (empty)
+_ (empty)
 NULL NULL
 NULL NULL
 
@@ -1232,6 +1346,8 @@ FROM test_basic_operator;
 4 0 NULL 0 0 NULL
 2 0 NULL 0 0 NULL
 0 0 NULL 0 0 NULL
+0 0 NULL 0 0 NULL
+0 0 NULL 0 0 NULL
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL
 
@@ -1255,5 +1371,7 @@ Rapha Raphael NULL datafusionДатаФус datafusionДатаФусион 
NULL
 und under_score NULL un iść core un iść core NULL
 p percent NULL pan Tadeusz ma iść w kąt pan Tadeusz ma iść w kąt NULL
 (empty) (empty) NULL (empty) (empty) NULL
+% % NULL (empty) (empty) NULL
+_ _ NULL (empty) (empty) NULL
 NULL NULL NULL NULL NULL NULL
 NULL NULL NULL NULL NULL NULL


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to