sepuri sai krishna created SPARK-60250:
------------------------------------------

             Summary: LikeSimplification changes LIKE results under UTF8_LCASE
                 Key: SPARK-60250
                 URL: https://issues.apache.org/jira/browse/SPARK-60250
             Project: Spark
          Issue Type: Bug
          Components: SQL
    Affects Versions: 4.2.0, 4.0.0, 4.1.0, 4.3.0, 4.4.0
            Reporter: sepuri sai krishna


Under UTF8_LCASE, LIKE is a Java regex match with {{UNICODE_CASE | 
CASE_INSENSITIVE}} ({{CollationSupport.collationAwareRegexFlags}}). Since 
SPARK-48621, {{LikeSimplification}} rewrites a LIKE with a literal pattern into 
{{StartsWith}}, {{EndsWith}}, {{Contains}} or {{EqualTo}} of the same 
collation, which compare the lowercase strings 
({{CollationAwareUTF8String.lowerCaseCodePoints}}). The two disagree on some 
characters:
* U+017F (long s) and 's': the regex matches them, as both uppercase to 'S', 
the lowercase strings differ. Same for U+0131 (dotless i) and 'i'.
* U+0130 (I with dot above) and 'i' followed by U+0307: UTF8_LCASE lowercases 
U+0130 to these two code points, the regex does not match them.

So a LIKE result depends on whether the optimizer can rewrite the pattern:

{code:sql}
CREATE OR REPLACE TEMP VIEW t AS SELECT * FROM VALUES ('ſ'), ('ſx'), ('xſ'), 
('İx') AS t(c);
SELECT c, c COLLATE UTF8_LCASE LIKE 's'   AS a,
          c COLLATE UTF8_LCASE LIKE 's%'  AS b,
          c COLLATE UTF8_LCASE LIKE '%s'  AS c2,
          c COLLATE UTF8_LCASE LIKE 's_%' AS d,
          c COLLATE UTF8_LCASE LIKE 'i̇%'  AS e
FROM t;
{code}

||c||a||b||c2||d||e||
|ſ|false|false|false|false|false|
|ſx|false|false|false|true|false|
|xſ|false|false|false|false|false|
|İx|false|false|false|false|true|

With 
{{spark.sql.optimizer.excludedRules=org.apache.spark.sql.catalyst.optimizer.LikeSimplification}},
 a, b and c2 are true for the long s rows and e is false for İx. With the rule 
on, 'ſx' matches LIKE 's_%' but not LIKE 's%', which no string can do.

{{LikeSimplificationSuite}} already asserts that the rewrite keeps the LIKE 
result under UTF8_LCASE (SPARK-59063, for the Kelvin sign). This case cannot be 
fixed by a length guard, as the difference depends on the characters of the 
input.

Two ways to fix it:
# Do not rewrite LIKE when the collation does not have binary equality, so that 
LIKE under UTF8_LCASE is always the regex match.
# Make LIKE under UTF8_LCASE match the lowercase strings, which keeps the 
rewrite but changes LIKE results for these characters.




--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to