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

DELETE with EXISTS returns incorrect result after removing EXCEPT clause from INTERSECT subquery

    XMLWordPrintable

Details

    • Bug
    • Status: Confirmed (View Workflow)
    • Major
    • Resolution: Unresolved
    • 10.6, 10.11, 11.4, 11.8, 12.3
    • 10.6, 10.11, 11.4, 11.8, 12.3
    • None
    • None

    Description

      A logical inconsistency was found in the optimizer when handling nested set operations within an EXISTS clause.

      Original Query (Deletes 1 row):
      The subquery effectively computes (A EXCEPT B) INTERSECT (A EXCEPT B).

      Mutated Query (Deletes 0 rows):
      The subquery computes (A EXCEPT B) INTERSECT A.

      mysql> -- ORIGINAL: 删除 1
      mysql> DELETE FROM t3
          -> WHERE EXISTS (
          ->   SELECT x.k, COALESCE(x.k, '2021-01-01 00:00:00')
          ->   FROM (
          ->     SELECT t1.c5 AS k, 1 AS pad FROM t1
          ->     EXCEPT
          ->     SELECT t2.c13 AS k, 2 AS pad FROM t2
          ->   ) AS x
          ->   INTERSECT
          ->   SELECT y.k, y.k
          ->   FROM (
          ->     SELECT t1.c5 AS k, 1 AS pad FROM t1
          ->     EXCEPT
          ->     SELECT t2.c13 AS k, 2 AS pad FROM t2
          ->   ) AS y
          -> );
      Query OK, 1 row affected (0.01 sec)
       
      mysql>
      mysql> ROLLBACK;
      Query OK, 0 rows affected (0.00 sec)
       
      mysql>
      mysql> START TRANSACTION;
      Query OK, 0 rows affected (0.00 sec)
       
      mysql>
      mysql> -- MUTATED: 删除 0
      mysql> DELETE FROM t3
          -> WHERE EXISTS (
          ->   SELECT x.k, COALESCE(x.k, '2021-01-01 00:00:00')
          ->   FROM (
          ->     SELECT t1.c5 AS k, 1 AS pad FROM t1
          ->     EXCEPT
          ->     SELECT t2.c13 AS k, 2 AS pad FROM t2
          ->   ) AS x
          ->   INTERSECT
          ->   SELECT y.k, y.k
          ->   FROM (
          ->     SELECT t1.c5 AS k, 1 AS pad FROM t1
          ->   ) AS y
          -> );
      Query OK, 0 rows affected (0.00 sec)
      

      How to repeat
      ```

      DROP DATABASE IF EXISTS repro_delete;
      CREATE DATABASE repro_delete;
      USE repro_delete;
       
      CREATE TABLE t1 (
        c5 DATE NOT NULL
      );
       
      CREATE TABLE t2 (
        c13 DATETIME NULL
      );
       
      CREATE TABLE t3 (
        id INT PRIMARY KEY
      );
       
      INSERT INTO t1 VALUES ('2024-01-01');
      INSERT INTO t3 VALUES (1);
      -- t2 保持空表
       
      START TRANSACTION;
       
      -- ORIGINAL: 删除 1 行
      DELETE FROM t3
      WHERE EXISTS (
        SELECT x.k, COALESCE(x.k, '2021-01-01 00:00:00')
        FROM (
          SELECT t1.c5 AS k, 1 AS pad FROM t1
          EXCEPT
          SELECT t2.c13 AS k, 2 AS pad FROM t2
        ) AS x
        INTERSECT
        SELECT y.k, y.k
        FROM (
          SELECT t1.c5 AS k, 1 AS pad FROM t1
          EXCEPT
          SELECT t2.c13 AS k, 2 AS pad FROM t2
        ) AS y
      );
       
      ROLLBACK;
       
      START TRANSACTION;
       
      -- MUTATED: 删除 0 行
      DELETE FROM t3
      WHERE EXISTS (
        SELECT x.k, COALESCE(x.k, '2021-01-01 00:00:00')
        FROM (
          SELECT t1.c5 AS k, 1 AS pad FROM t1
          EXCEPT
          SELECT t2.c13 AS k, 2 AS pad FROM t2
        ) AS x
        INTERSECT
        SELECT y.k, y.k
        FROM (
          SELECT t1.c5 AS k, 1 AS pad FROM t1
        ) AS y
      );
       
      ROLLBACK;
      

      ```

      Attachments

        Activity

          People

            psergei Sergei Petrunia
            chen7897 cl hl
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:

              Git Integration

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