Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-40966

JSON Extracted Values Break Equality-Comparison Reflexivity (X = X is FALSE, JOIN/IN Drop Rows)

    XMLWordPrintable

Details

    • Bug
    • Status: Closed (View Workflow)
    • Major
    • Resolution: Duplicate
    • 13.1
    • N/A
    • JSON
    • 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

          Activity

            People

              Unassigned Unassigned
              chunlingqin chunlingqin
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.