Description:
Please see the repro below. It seems this query pattern causes inconsistent behavior with strings like o'brien.
How to repeat:
-- ========== FAIL ==========
SET sql_mode = 'NO_BACKSLASH_ESCAPES';
SELECT * FROM (SELECT 'x' AS c UNION ALL SELECT 'y') AS t
WHERE c = 'o''brien';
-- ERROR 1064 near 'brien')'
-- ========== OK: drop NO_BACKSLASH_ESCAPES ==========
SET sql_mode = '';
SELECT * FROM (SELECT 'x' AS c UNION ALL SELECT 'y') AS t
WHERE c = 'o''brien';
-- empty result (correct)
-- ========== OK: drop UNION ==========
SET sql_mode = 'NO_BACKSLASH_ESCAPES';
SELECT * FROM (SELECT 'x' AS c) AS t
WHERE c = 'o''brien';
-- empty result (correct)
-- ========== OK: literal alone under the same mode ==========
SET sql_mode = 'NO_BACKSLASH_ESCAPES';
SELECT 'o''brien' AS v, LENGTH('o''brien') AS n;
-- v = o'brien, n = 7
Suggested fix:
The UNION rewrite under NO_BACKSLASH_ESCAPES corrupts 'o''brien' into something like 'o'brien' (string ends early)?
Description: Please see the repro below. It seems this query pattern causes inconsistent behavior with strings like o'brien. How to repeat: -- ========== FAIL ========== SET sql_mode = 'NO_BACKSLASH_ESCAPES'; SELECT * FROM (SELECT 'x' AS c UNION ALL SELECT 'y') AS t WHERE c = 'o''brien'; -- ERROR 1064 near 'brien')' -- ========== OK: drop NO_BACKSLASH_ESCAPES ========== SET sql_mode = ''; SELECT * FROM (SELECT 'x' AS c UNION ALL SELECT 'y') AS t WHERE c = 'o''brien'; -- empty result (correct) -- ========== OK: drop UNION ========== SET sql_mode = 'NO_BACKSLASH_ESCAPES'; SELECT * FROM (SELECT 'x' AS c) AS t WHERE c = 'o''brien'; -- empty result (correct) -- ========== OK: literal alone under the same mode ========== SET sql_mode = 'NO_BACKSLASH_ESCAPES'; SELECT 'o''brien' AS v, LENGTH('o''brien') AS n; -- v = o'brien, n = 7 Suggested fix: The UNION rewrite under NO_BACKSLASH_ESCAPES corrupts 'o''brien' into something like 'o'brien' (string ends early)?