github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/overlay/exists2.test (about)

     1  # 2021 January 15
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  # This file implements regression tests for SQLite library.  The
    12  # focus of this file is testing cases where EXISTS expressions are
    13  # transformed to IN() expressions by where.c
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  set testprefix exists2
    19  
    20  do_execsql_test 1.0 {
    21    CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
    22    INSERT INTO t1 VALUES(1, 'one');
    23    INSERT INTO t1 VALUES(2, 'two');
    24    INSERT INTO t1 VALUES(3, 'three');
    25    INSERT INTO t1 VALUES(4, 'four');
    26    INSERT INTO t1 VALUES(5, 'five');
    27    INSERT INTO t1 VALUES(6, 'six');
    28    INSERT INTO t1 VALUES(7, 'seven');
    29  
    30    CREATE TABLE t2(c INTEGER, d INTEGER);
    31    INSERT INTO t2 VALUES(1, 1);
    32    INSERT INTO t2 VALUES(3, 2);
    33    INSERT INTO t2 VALUES(5, 3);
    34    INSERT INTO t2 VALUES(7, 4);
    35  }
    36  
    37  proc do_execsql_eqp_test {tn sql eqp res} {
    38    # cf.: https://sqlite.org/forum/info/a9f6bb5c78248929
    39    # uplevel [list do_eqp_test $tn.1 $sql [string trim $eqp]]
    40    uplevel [list do_execsql_test $tn.2 $sql $res]
    41  }
    42  
    43  do_execsql_eqp_test 1.1 {
    44    SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t1.a=t2.c);
    45  } {
    46    USING INTEGER PRIMARY KEY
    47  } {
    48    1 one 3 three 5 five 7 seven
    49  }
    50  
    51  do_execsql_eqp_test 1.2 {
    52    SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c=t1.a);
    53  } {
    54    SEARCH TABLE t1 USING INTEGER PRIMARY KEY
    55  } {
    56    1 one 3 three 5 five 7 seven
    57  }
    58  
    59  do_execsql_eqp_test 1.3 {
    60    SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c+1=t1.a);
    61  } {
    62    SEARCH TABLE t1 USING INTEGER PRIMARY KEY
    63  } {
    64    2 two 4 four 6 six
    65  }
    66  
    67  do_execsql_eqp_test 1.4 {
    68    SELECT t1.* FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t2.c+1=t1.a+1);
    69  } {
    70    SCAN TABLE t1
    71  } {
    72    1 one 3 three 5 five 7 seven
    73  }
    74  
    75  do_execsql_eqp_test 1.5 {
    76    SELECT t1.* FROM t1 WHERE EXISTS(
    77      SELECT * FROM t2 WHERE t1.a=t2.c AND d IN (1, 2, 3)
    78    );
    79  } {
    80    SEARCH TABLE t1 USING INTEGER PRIMARY KEY
    81  } {
    82    1 one 3 three 5 five
    83  }
    84  
    85  do_execsql_eqp_test 1.6 {
    86    SELECT t1.* FROM t1 WHERE EXISTS(
    87      SELECT * FROM t2 WHERE d IN (1, 2, 3)AND t1.a=t2.c 
    88    );
    89  } {
    90    SEARCH TABLE t1 USING INTEGER PRIMARY KEY
    91  } {
    92    1 one 3 three 5 five
    93  }
    94  
    95  do_execsql_eqp_test 1.7 {
    96    SELECT t1.* FROM t1 WHERE EXISTS(
    97      SELECT * FROM t2 WHERE d IN (1, 2, 3)AND t1.a=t2.c 
    98    );
    99  } {
   100    SEARCH TABLE t1 USING INTEGER PRIMARY KEY
   101  } {
   102    1 one 3 three 5 five
   103  }
   104  
   105  #-------------------------------------------------------------------------
   106  #
   107  reset_db
   108  do_execsql_test 2.0 {
   109    CREATE TABLE t3(a TEXT PRIMARY KEY, b TEXT, x INT) WITHOUT ROWID;
   110    CREATE TABLE t4(c TEXT COLLATE nocase, y INT);
   111  
   112    INSERT INTO t3 VALUES('one', 'i', 1);
   113    INSERT INTO t3 VALUES('two', 'ii', 2);
   114    INSERT INTO t3 VALUES('three', 'iii', 3);
   115    INSERT INTO t3 VALUES('four', 'iv', 4);
   116    INSERT INTO t3 VALUES('five', 'v', 5);
   117  
   118    INSERT INTO t4 VALUES('FIVE',5), ('four',4), ('TWO',2), ('one',1);
   119  }
   120  
   121  do_execsql_test 2.1 { SELECT a FROM t3, t4 WHERE a=c } {four one}
   122  do_execsql_test 2.2 { SELECT a FROM t3, t4 WHERE c=a } {five four one two}
   123  
   124  do_execsql_eqp_test 2.3 {
   125    SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE a=c)
   126  } {
   127    SEARCH TABLE t3 USING PRIMARY KEY
   128  } {
   129    four one
   130  }
   131  
   132  do_execsql_eqp_test 2.4 {
   133    SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE c=a)
   134  } {
   135    SCAN TABLE t3
   136  } {
   137    five four one two
   138  }
   139  
   140  do_execsql_test 2.5 {
   141    CREATE INDEX t3anc ON t3(a COLLATE nocase, x);
   142  }
   143  
   144  do_execsql_eqp_test 2.6 {
   145    SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE c=a)
   146  } {
   147    SEARCH TABLE t3 USING COVERING INDEX t3anc
   148  } {
   149    five four one two
   150  }
   151  do_execsql_test 2.6a {
   152    SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE (c,y)=(a,x))
   153  } {five four one two}
   154  
   155  do_execsql_eqp_test 2.7 {
   156    SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE a=c)
   157  } {
   158    SEARCH TABLE t3 USING PRIMARY KEY
   159  } {
   160    four one
   161  }
   162  do_execsql_test 2.7a {
   163    SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE (a,x)=(c,y))
   164  } {
   165    four one
   166  }
   167  
   168  do_execsql_test 2.7b {
   169    SELECT a FROM t3 WHERE EXISTS (SELECT 1 FROM t4 WHERE (a,x)=(c,y) LIMIT 1)
   170  } {
   171    four one
   172  }
   173  
   174  # EXISTS clauses using vector expressions in the WHERE clause.
   175  #
   176  reset_db
   177  do_execsql_test 3.0 {
   178    CREATE TABLE t1(a,b);
   179    INSERT INTO t1(a,b) VALUES(1,111),(2,222),(8,888);
   180    CREATE TABLE t2(x INTEGER PRIMARY KEY, y);
   181    INSERT INTO t2(x,y) VALUES(2,222),(3,333),(7,333);
   182    SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (x,y)=(a,b));
   183  } {222}
   184  do_execsql_test 3.1 {
   185    SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (a,b)=(x,y));
   186  } {222}
   187  do_execsql_test 3.2 {
   188    SELECT y FROM t2 WHERE EXISTS(SELECT 1 FROM t1 WHERE (x,b)=(a,y));
   189  } {222}
   190  
   191  
   192  
   193  
   194  
   195  finish_test