Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Duplicate
-
13.1
-
None
-
Not for Release Notes
Description
A JSON string value extracted by JSON_EXTRACT() (or the new col->'$.path' syntax), when compared with = / <=> against another JSON_EXTRACT()/-> result, returns FALSE even when both sides are completely identical. The reflexivity law of the equality operator (X = X ≡ TRUE) is broken, which directly causes JOIN ON / IN predicates to silently drop rows.
Only JSON string values trigger it; reflexivity of JSON number/double/bool/null/array/object comparisons is intact.
|
|
-- 1. Reflexivity broken (expected 1, actual 0) |
SELECT JSON_EXTRACT('{"a":"text"}','$.a') = JSON_EXTRACT('{"a":"text"}','$.a'); -- 0 |
SELECT ('{"a":"text"}'->'$.a') = ('{"a":"text"}'->'$.a'); -- 0 |
SELECT ('{"a":"text"}'->'$.a') <=> ('{"a":"text"}'->'$.a'); -- 0 |
|
|
-- Evidence: both sides are byte-identical with identical collations |
SELECT HEX('{"a":"text"}'->'$.a'), HEX(JSON_EXTRACT('{"a":"text"}','$.a')); -- 227465787422 / 227465787422 |
SELECT COLLATION('{"a":"text"}'->'$.a'), COLLATION(JSON_EXTRACT('{"a":"text"}','$.a')); -- identical |
|
|
-- 2. JOIN equality loses data (expected 1 row, actual 0 rows) |
CREATE TABLE tj1(j JSON); CREATE TABLE tj2(j JSON);
|
INSERT INTO tj1 VALUES ('{"a":"text"}'); INSERT INTO tj2 VALUES ('{"a":"text"}'); |
SELECT COUNT(*) FROM tj1 JOIN tj2 ON tj1.j->'$.a' = tj2.j->'$.a'; -- 0 |
|
|
-- 3. IN subquery loses data (expected 1, actual 0) |
SELECT ('{"a":"text"}'->'$.a') IN (SELECT '{"a":"text"}'->'$.a'); -- 0 |
|
|
-- 4. CAST variant (expected 1, actual 0) |
SELECT JSON_EXTRACT('{"a":"text"}','$.a') = CAST(JSON_EXTRACT('{"a":"text"}','$.a') AS CHAR); -- 0 |
|
|
-- 5. Semantic asymmetry (the absurd part) |
SELECT '{"a":"text"}'->'$.a' = 'text'; -- 1 (comparison with a bare string works: unquote semantics) |
SELECT '{"a":"text"}'->'$.a' = '"text"'; -- 0 |
|
|
-- 6. Value-type matrix: only STRING triggers |
SELECT '{"v":"str"}'->'$.v' = '{"v":"str"}'->'$.v' AS str_eq; -- 0 <-- bug |
SELECT '{"v":123}'->'$.v' = '{"v":123}'->'$.v' AS int_eq; -- 1 |
SELECT '{"v":1.5}'->'$.v' = '{"v":1.5}'->'$.v' AS dbl_eq; -- 1 |
SELECT '{"v":true}'->'$.v' = '{"v":true}'->'$.v' AS bool_eq; -- 1 |
SELECT '{"v":null}'->'$.v' = '{"v":null}'->'$.v' AS jnull_eq; -- 1 |
SELECT '{"v":[1,2]}'->'$.v' = '{"v":[1,2]}'->'$.v' AS arr_eq; -- 1 |
SELECT '{"v":{"k":1}}'->'$.v' = '{"v":{"k":1}}'->'$.v' AS obj_eq; -- 1 |
|
Attachments
Issue Links
- duplicates
-
MDEV-29396 Problems in comparisons using JSON_EXTRACT
-
- Confirmed
-