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

     1  # 2002 May 24
     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.
    12  #
    13  # This file implements tests for joins, including outer joins.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  set testprefix join2
    19  
    20  do_test join2-1.1 {
    21    execsql {
    22      CREATE TABLE t1(a,b);
    23      INSERT INTO t1 VALUES(1,11);
    24      INSERT INTO t1 VALUES(2,22);
    25      INSERT INTO t1 VALUES(3,33);
    26      SELECT * FROM t1;
    27    }  
    28  } {1 11 2 22 3 33}
    29  do_test join2-1.2 {
    30    execsql {
    31      CREATE TABLE t2(b,c);
    32      INSERT INTO t2 VALUES(11,111);
    33      INSERT INTO t2 VALUES(33,333);
    34      INSERT INTO t2 VALUES(44,444);
    35      SELECT * FROM t2;
    36    }  
    37  } {11 111 33 333 44 444};
    38  do_test join2-1.3 {
    39    execsql {
    40      CREATE TABLE t3(c,d);
    41      INSERT INTO t3 VALUES(111,1111);
    42      INSERT INTO t3 VALUES(444,4444);
    43      INSERT INTO t3 VALUES(555,5555);
    44      SELECT * FROM t3;
    45    }  
    46  } {111 1111 444 4444 555 5555}
    47  
    48  do_test join2-1.4 {
    49    execsql {
    50      SELECT * FROM
    51        t1 NATURAL JOIN t2 NATURAL JOIN t3
    52    }
    53  } {1 11 111 1111}
    54  do_test join2-1.5 {
    55    execsql {
    56      SELECT * FROM
    57        t1 NATURAL JOIN t2 NATURAL LEFT OUTER JOIN t3
    58    }
    59  } {1 11 111 1111 3 33 333 {}}
    60  do_test join2-1.6 {
    61    execsql {
    62      SELECT * FROM
    63        t1 NATURAL LEFT OUTER JOIN t2 NATURAL JOIN t3
    64    }
    65  } {1 11 111 1111}
    66  ifcapable subquery {
    67    do_test join2-1.7 {
    68      execsql {
    69        SELECT * FROM
    70          t1 NATURAL LEFT OUTER JOIN (t2 NATURAL JOIN t3)
    71      }
    72    } {1 11 111 1111 2 22 {} {} 3 33 {} {}}
    73  }
    74  
    75  #-------------------------------------------------------------------------
    76  # Check that ticket [25e335f802ddc] has been resolved. It should be an
    77  # error for the ON clause of a LEFT JOIN to refer to a table to its right.
    78  #
    79  do_execsql_test 2.0 {
    80    CREATE TABLE aa(a);
    81    CREATE TABLE bb(b);
    82    CREATE TABLE cc(c);
    83    INSERT INTO aa VALUES('one');
    84    INSERT INTO bb VALUES('one');
    85    INSERT INTO cc VALUES('one');
    86  }
    87  
    88  do_catchsql_test 2.1 {
    89    SELECT * FROM aa LEFT JOIN cc ON (a=b) JOIN bb ON (b=coalesce(c,1));
    90  } {1 {ON clause references tables to its right}}
    91  do_catchsql_test 2.2 {
    92    SELECT * FROM aa JOIN cc ON (a=b) JOIN bb ON (b=c);
    93  } {0 {one one one}}
    94  
    95  #-------------------------------------------------------------------------
    96  # Test that a problem causing where.c to overlook opportunities to
    97  # omit unnecessary tables from a LEFT JOIN when UNIQUE, NOT NULL column 
    98  # that makes this possible happens to be the leftmost in its table.
    99  #
   100  reset_db
   101  do_execsql_test 3.0 {
   102    CREATE TABLE t1(k1 INTEGER PRIMARY KEY, k2, k3);
   103    CREATE TABLE t2(k2 INTEGER PRIMARY KEY, v2);
   104  
   105    -- Prior to this problem being fixed, table t3_2 would be omitted from
   106    -- the join queries below, but if t3_1 were used in its place it would
   107    -- not.
   108    CREATE TABLE t3_1(k3 PRIMARY KEY, v3) WITHOUT ROWID;
   109    CREATE TABLE t3_2(v3, k3 PRIMARY KEY) WITHOUT ROWID;
   110  }
   111  
   112  do_eqp_test 3.1 {
   113    SELECT v2 FROM t1 LEFT JOIN t2 USING (k2) LEFT JOIN t3_1 USING (k3);
   114  } {
   115    QUERY PLAN
   116    |--SCAN t1
   117    `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?)
   118  }
   119  
   120  do_eqp_test 3.2 {
   121    SELECT v2 FROM t1 LEFT JOIN t2 USING (k2) LEFT JOIN t3_2 USING (k3);
   122  } {
   123    QUERY PLAN
   124    |--SCAN t1
   125    `--SEARCH t2 USING INTEGER PRIMARY KEY (rowid=?)
   126  }
   127  
   128  #-------------------------------------------------------------------------
   129  # Test that tables other than the rightmost can be omitted from a
   130  # LEFT JOIN query.
   131  #
   132  do_execsql_test 4.0 {
   133    CREATE TABLE c1(k INTEGER PRIMARY KEY, v1);
   134    CREATE TABLE c2(k INTEGER PRIMARY KEY, v2);
   135    CREATE TABLE c3(k INTEGER PRIMARY KEY, v3);
   136  
   137    INSERT INTO c1 VALUES(1, 2);
   138    INSERT INTO c2 VALUES(2, 3);
   139    INSERT INTO c3 VALUES(3, 'v3');
   140  
   141    INSERT INTO c1 VALUES(111, 1112);
   142    INSERT INTO c2 VALUES(112, 1113);
   143    INSERT INTO c3 VALUES(113, 'v1113');
   144  }
   145  do_execsql_test 4.1.1 {
   146    SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2);
   147  } {2 v3 1112 {}}
   148  do_execsql_test 4.1.2 {
   149    SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
   150  } {2 v3 1112 {}}
   151  
   152  do_execsql_test 4.1.3 {
   153    SELECT DISTINCT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1);
   154  } {2 v3 1112 {}}
   155  
   156  do_execsql_test 4.1.4 {
   157    SELECT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1);
   158  } {2 v3 2 v3 1112 {} 1112 {}}
   159  
   160  do_eqp_test 4.1.5 {
   161    SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2);
   162  } {
   163    QUERY PLAN
   164    |--SCAN c1
   165    |--SEARCH c2 USING INTEGER PRIMARY KEY (rowid=?)
   166    `--SEARCH c3 USING INTEGER PRIMARY KEY (rowid=?)
   167  }
   168  do_eqp_test 4.1.6 {
   169    SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
   170  } {
   171    QUERY PLAN
   172    |--SCAN c1
   173    `--SEARCH c3 USING INTEGER PRIMARY KEY (rowid=?)
   174  }
   175  
   176  do_execsql_test 4.2.0 {
   177    DROP TABLE c1;
   178    DROP TABLE c2;
   179    DROP TABLE c3;
   180    CREATE TABLE c1(k UNIQUE, v1);
   181    CREATE TABLE c2(k UNIQUE, v2);
   182    CREATE TABLE c3(k UNIQUE, v3);
   183  
   184    INSERT INTO c1 VALUES(1, 2);
   185    INSERT INTO c2 VALUES(2, 3);
   186    INSERT INTO c3 VALUES(3, 'v3');
   187  
   188    INSERT INTO c1 VALUES(111, 1112);
   189    INSERT INTO c2 VALUES(112, 1113);
   190    INSERT INTO c3 VALUES(113, 'v1113');
   191  }
   192  do_execsql_test 4.2.1 {
   193    SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2);
   194  } {2 v3 1112 {}}
   195  do_execsql_test 4.2.2 {
   196    SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
   197  } {2 v3 1112 {}}
   198  
   199  do_execsql_test 4.2.3 {
   200    SELECT DISTINCT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1);
   201  } {2 v3 1112 {}}
   202  
   203  do_execsql_test 4.2.4 {
   204    SELECT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1);
   205  } {2 v3 2 v3 1112 {} 1112 {}}
   206  
   207  do_eqp_test 4.2.5 {
   208    SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2);
   209  } {
   210    QUERY PLAN
   211    |--SCAN c1
   212    |--SEARCH c2 USING INDEX sqlite_autoindex_c2_1 (k=?)
   213    `--SEARCH c3 USING INDEX sqlite_autoindex_c3_1 (k=?)
   214  }
   215  do_eqp_test 4.2.6 {
   216    SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
   217  } {
   218    QUERY PLAN
   219    |--SCAN c1
   220    `--SEARCH c3 USING INDEX sqlite_autoindex_c3_1 (k=?)
   221  }
   222  
   223  # 2017-11-23 (Thanksgiving day)
   224  # OSSFuzz found an assertion fault in the new LEFT JOIN eliminator code.
   225  #
   226  do_execsql_test 4.3.0 {
   227    DROP TABLE IF EXISTS t1;
   228    DROP TABLE IF EXISTS t2;
   229    CREATE TABLE t1(x PRIMARY KEY) WITHOUT ROWID;
   230    CREATE TABLE t2(x);
   231    SELECT a.x
   232      FROM t1 AS a
   233      LEFT JOIN t1 AS b ON (a.x=b.x)
   234      LEFT JOIN t2 AS c ON (a.x=c.x);
   235  } {}
   236  do_execsql_test 4.3.1 {
   237    WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10)
   238      INSERT INTO t1(x) SELECT x FROM c;
   239    INSERT INTO t2(x) SELECT x+9 FROM t1;
   240    SELECT a.x, c.x
   241      FROM t1 AS a
   242      LEFT JOIN t1 AS b ON (a.x=b.x)
   243      LEFT JOIN t2 AS c ON (a.x=c.x);
   244  } {1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {} 8 {} 9 {} 10 10}
   245  
   246  do_execsql_test 5.0 {
   247    CREATE TABLE s1 (a INTEGER PRIMARY KEY);
   248    CREATE TABLE s2 (a INTEGER PRIMARY KEY);
   249    CREATE TABLE s3 (a INTEGER);
   250    CREATE UNIQUE INDEX ndx on s3(a);
   251  }
   252  do_eqp_test 5.1 {
   253    SELECT s1.a FROM s1 left join s2 using (a);
   254  } {SCAN s1}
   255  
   256  do_eqp_test 5.2 {
   257    SELECT s1.a FROM s1 left join s3 using (a);
   258  } {SCAN s1}
   259  
   260  do_execsql_test 6.0 {
   261    CREATE TABLE u1(a INTEGER PRIMARY KEY, b, c);
   262    CREATE TABLE u2(a INTEGER PRIMARY KEY, b, c);
   263    CREATE INDEX u1ab ON u1(b, c);
   264  }
   265  do_eqp_test 6.1 {
   266    SELECT u2.* FROM u2 LEFT JOIN u1 ON( u1.a=u2.a AND u1.b=u2.b AND u1.c=u2.c );
   267  } {SCAN u2}
   268  
   269  db close
   270  sqlite3 db :memory:
   271  do_execsql_test 7.0 {
   272    CREATE TABLE t1(a,b);  INSERT INTO t1 VALUES(1,2),(3,4),(5,6);
   273    CREATE TABLE t2(c,d);  INSERT INTO t2 VALUES(2,4),(3,6);
   274    CREATE TABLE t3(x);    INSERT INTO t3 VALUES(9);
   275    CREATE VIEW test AS
   276      SELECT *, 'x'
   277        FROM t1 LEFT JOIN (SELECT * FROM t2, t3) ON (c=b AND x=9)
   278        WHERE c IS NULL;
   279    SELECT * FROM test;
   280  } {3 4 {} {} {} x 5 6 {} {} {} x}
   281  
   282  #-------------------------------------------------------------------------
   283  # Ticket [dfd66334].
   284  #
   285  reset_db
   286  do_execsql_test 8.0 {
   287    CREATE TABLE t0(c0);
   288    CREATE TABLE t1(c0);
   289  }
   290  
   291  do_execsql_test 8.1 {
   292    SELECT * FROM t0 LEFT JOIN t1 
   293    WHERE (t1.c0 BETWEEN 0 AND 0) > ('' AND t0.c0);
   294  }
   295  
   296  #-------------------------------------------------------------------------
   297  # Ticket [45f4bf4eb] reported by Manuel Rigger (2020-04-25)
   298  #
   299  # Follow up error reported by Eric Speckman on the SQLite forum
   300  # https://sqlite.org/forum/info/c49496d24d35bd7c (2020-08-19)
   301  #
   302  reset_db
   303  do_execsql_test 9.0 {
   304    CREATE TABLE t0(c0 INT);
   305    CREATE VIEW v0(c0) AS SELECT CAST(t0.c0 AS INTEGER) FROM t0;
   306    INSERT INTO t0(c0) VALUES (0);
   307  }
   308  
   309  do_execsql_test 9.1 {
   310    SELECT typeof(c0), c0 FROM v0 WHERE c0>='0'
   311  } {integer 0}
   312  
   313  do_execsql_test 9.2 {
   314    SELECT * FROM t0, v0 WHERE v0.c0 >= '0';
   315  } {0 0}
   316  
   317  do_execsql_test 9.3 {
   318    SELECT * FROM t0 LEFT JOIN v0 WHERE v0.c0 >= '0';
   319  } {0 0}
   320  
   321  do_execsql_test 9.4 {
   322    SELECT * FROM t0 LEFT JOIN v0 ON v0.c0 >= '0';
   323  } {0 0}
   324  
   325  do_execsql_test 9.5 {
   326    SELECT * FROM t0 LEFT JOIN v0 ON v0.c0 >= '0' WHERE TRUE 
   327    UNION SELECT 0,0 WHERE 0; 
   328  } {0 0}
   329  
   330  do_execsql_test 9.10 {
   331    CREATE TABLE t1 (aaa);
   332    INSERT INTO t1 VALUES(23456);
   333    CREATE TABLE t2(bbb);
   334    CREATE VIEW v2(ccc) AS SELECT bbb IS 1234 FROM t2;
   335    SELECT ccc, ccc IS NULL AS ddd FROM t1 LEFT JOIN v2;
   336  } {{} 1}
   337  optimization_control db query-flattener 0
   338  do_execsql_test 9.11 {
   339    SELECT ccc, ccc IS NULL AS ddd FROM t1 LEFT JOIN v2;
   340  } {{} 1}
   341  
   342  
   343  finish_test