Uploaded image for project: 'MariaDB ColumnStore'
  1. MariaDB ColumnStore
  2. MCOL-4641

IN/NOT IN subquery returns incorrect results for some cases

    XMLWordPrintable

Details

    • Bug
    • Status: Open (View Workflow)
    • Major
    • Resolution: Unresolved
    • 5.5.1
    • Icebox
    • None
    • None

    Description

      Following queries involving IN/NOT IN subqueries are not producing the correct results in ColumnStore:

      create table cs1 (a int)engine=columnstore;
      insert into cs1 values (1), (2), (3), (4), (null);
       
      create table cs2 (b int, c int)engine=columnstore;
      insert into cs2 values (1, 100), (1, 101), (2, 200),
      (3, 300), (3, 301), (3, 302), (null, null);
       
      MariaDB [test]> select * from cs1 where hex(a*10) not in (select hex(b*10) from cs2);
      +------+
      | a    |
      +------+
      |    4 |
      +------+
      1 row in set (0.073 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select b from cs2 where b not in (select a from cs1 where a in (2,3)));
      +------+
      | a    |
      +------+
      |    2 |
      |    3 |
      |    4 |
      | NULL |
      +------+
      4 rows in set (0.029 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select b from cs2 where b not in (select a from cs1 where a not in (2,3)));
      Empty set (0.030 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select b from cs2 where b=3);
      +------+
      | a    |
      +------+
      |    1 |
      |    2 |
      |    4 |
      | NULL |
      +------+
      4 rows in set (0.017 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select count(*) over (partition by b) from cs2 where b is null);
      +------+
      | a    |
      +------+
      |    2 |
      |    3 |
      |    4 |
      | NULL |
      +------+
      4 rows in set (0.017 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select c from cs2 where b is not null);
      +------+
      | a    |
      +------+
      |    1 |
      |    2 |
      |    3 |
      |    4 |
      | NULL |
      +------+
      5 rows in set (0.019 sec)
       
      MariaDB [test]> select * from cs1 where (a+a) not in (select (b+b) from cs2 where b is not null);
      +------+
      | a    |
      +------+
      |    4 |
      | NULL |
      +------+
      2 rows in set (0.024 sec)
       
      MariaDB [test]> select * from cs1 where (a+1) not in (select b from cs2 where b is not null);
      +------+
      | a    |
      +------+
      |    3 |
      |    4 |
      | NULL |
      +------+
      3 rows in set (0.018 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select b from cs2 where b not in (select a from cs1 where a in (2,3) and a is not null) and b is not null);
      +------+
      | a    |
      +------+
      |    2 |
      |    3 |
      |    4 |
      | NULL |
      +------+
      4 rows in set (0.034 sec)
      

      The correct output for these queries should be as follows (note that cs1 and cs2 below are same tables as above, but in InnoDB):

      MariaDB [test]> select * from cs1 where hex(a*10) not in (select hex(b*10) from cs2);
      Empty set (0.001 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select b from cs2 where b not in (select a from cs1 where a in (2,3)));
      +------+
      | a    |
      +------+
      |    2 |
      |    3 |
      |    4 |
      +------+
      3 rows in set (0.001 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select b from cs2 where b not in (select a from cs1 where a not in (2,3)));
      +------+
      | a    |
      +------+
      |    1 |
      |    4 |
      +------+
      2 rows in set (0.001 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select b from cs2 where b=3);
      +------+
      | a    |
      +------+
      |    1 |
      |    2 |
      |    4 |
      +------+
      3 rows in set (0.000 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select count(*) over (partition by b) from cs2 where b is null);
      +------+
      | a    |
      +------+
      |    2 |
      |    3 |
      |    4 |
      +------+
      3 rows in set (0.001 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select c from cs2 where b is not null);
      +------+
      | a    |
      +------+
      |    1 |
      |    2 |
      |    3 |
      |    4 |
      +------+
      4 rows in set (0.000 sec)
       
      MariaDB [test]> select * from cs1 where (a+a) not in (select (b+b) from cs2 where b is not null);
      +------+
      | a    |
      +------+
      |    4 |
      +------+
      1 row in set (0.000 sec)
       
      MariaDB [test]> select * from cs1 where (a+1) not in (select b from cs2 where b is not null);
      +------+
      | a    |
      +------+
      |    3 |
      |    4 |
      +------+
      2 rows in set (0.000 sec)
       
      MariaDB [test]> select * from cs1 where a not in (select b from cs2 where b not in (select a from cs1 where a in (2,3) and a is not null) and b is not null);
      +------+
      | a    |
      +------+
      |    2 |
      |    3 |
      |    4 |
      +------+
      3 rows in set (0.001 sec)
      

      Attachments

        Activity

          People

            drrtuy Roman
            tntnatbry Gagan Goel (Inactive)
            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.