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

     1  # 2018-07-26
     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 the WHERE-clause constant propagation
    13  # optimization.
    14  #
    15  set testdir [file dirname $argv0]
    16  source $testdir/tester.tcl
    17  set ::testprefix whereL
    18  
    19  do_execsql_test 100 {
    20    CREATE TABLE t1(a INT PRIMARY KEY, b, c, d, e);
    21    CREATE TABLE t2(a INT PRIMARY KEY, f, g, h, i);
    22    CREATE TABLE t3(a INT PRIMARY KEY, j, k, l, m);
    23    CREATE VIEW v4 AS SELECT * FROM t2 UNION ALL SELECT * FROM t3;
    24  }
    25  do_eqp_test 110 {
    26    SELECT * FROM t1, v4 WHERE t1.a=?1 AND v4.a=t1.a;
    27  } {
    28    QUERY PLAN
    29    `--COMPOUND QUERY
    30       |--LEFT-MOST SUBQUERY
    31       |  |--SEARCH t1 USING INDEX sqlite_autoindex_t1_1 (a=?)
    32       |  `--SEARCH t2 USING INDEX sqlite_autoindex_t2_1 (a=?)
    33       `--UNION ALL
    34          |--SEARCH t1 USING INDEX sqlite_autoindex_t1_1 (a=?)
    35          `--SEARCH t3 USING INDEX sqlite_autoindex_t3_1 (a=?)
    36  }
    37  
    38  # The scan of the t1 table goes first since that enables the ORDER BY
    39  # sort to be omitted.  This would not be possible without constant
    40  # propagation because without it the t1 table would depend on t3.
    41  #
    42  do_eqp_test 120 {
    43    SELECT * FROM t1, t2, t3
    44     WHERE t1.a=t2.a AND t2.a=t3.j AND t3.j=5
    45    ORDER BY t1.a;
    46  } {
    47    QUERY PLAN
    48    |--SEARCH t1 USING INDEX sqlite_autoindex_t1_1 (a=?)
    49    |--SEARCH t2 USING INDEX sqlite_autoindex_t2_1 (a=?)
    50    `--SCAN t3
    51  }
    52  
    53  # Constant propagation in the face of collating sequences:
    54  #
    55  do_execsql_test 200 {
    56    CREATE TABLE c3(x COLLATE binary, y COLLATE nocase, z COLLATE binary);
    57    CREATE INDEX c3x ON c3(x);
    58    INSERT INTO c3 VALUES('ABC', 'ABC', 'abc');
    59    SELECT * FROM c3 WHERE x=y AND y=z AND z='abc';
    60  } {ABC ABC abc}
    61  
    62  # If the constants are blindly propagated, as shown in the following
    63  # query, the wrong answer results:
    64  #
    65  do_execsql_test 201 {
    66    SELECT * FROM c3 WHERE x='abc' AND y='abc' AND z='abc';
    67  } {}
    68  
    69  # Constant propagation caused an incorrect answer in the following
    70  # query.  (Reported by Bentley system on 2018-08-09.)
    71  #
    72  do_execsql_test 300 {
    73    CREATE TABLE A(id INTEGER PRIMARY KEY, label TEXT);
    74    CREATE TABLE B(id INTEGER PRIMARY KEY, label TEXT, Aid INTEGER);
    75    CREATE TABLE C(
    76      id INTEGER PRIMARY KEY,
    77      xx INTEGER NOT NULL,
    78      yy INTEGER,
    79      zz INTEGER
    80    );
    81    CREATE UNIQUE INDEX x2 ON C(yy);
    82    CREATE UNIQUE INDEX x4 ON C(yy, zz);
    83    INSERT INTO A(id) VALUES(1);
    84    INSERT INTO B(id) VALUES(2);
    85    INSERT INTO C(id,xx,yy,zz) VALUES(99,50,1,2);
    86    SELECT 1
    87      FROM A,
    88           (SELECT id,xx,yy,zz FROM C) subq,
    89           B
    90     WHERE A.id='1'
    91       AND A.id=subq.yy
    92       AND B.id=subq.zz;
    93  } {1}  
    94  do_execsql_test 301 {
    95    SELECT 1
    96      FROM A,
    97           (SELECT id,xx,yy,zz FROM C) subq,
    98           B
    99     WHERE A.id=1
   100       AND A.id=subq.yy
   101       AND B.id=subq.zz;
   102  } {1}  
   103  do_execsql_test 302 {
   104    SELECT 1
   105      FROM A,
   106           (SELECT id,yy,zz FROM C) subq,
   107           B
   108     WHERE A.id='1'
   109       AND A.id=subq.yy
   110       AND B.id=subq.zz;
   111  } {1}  
   112  
   113  # 2018-10-25: Ticket [cf5ed20f]
   114  # Incorrect join result with duplicate WHERE clause constraint.
   115  #
   116  do_execsql_test 400 {
   117    CREATE TABLE x(a, b, c);
   118    CREATE TABLE y(a, b);
   119    INSERT INTO x VALUES (1, 0, 1);
   120    INSERT INTO y VALUES (1, 2);
   121    SELECT x.a FROM x JOIN y ON x.c = y.a WHERE x.b = 1 AND x.b = 1;
   122  } {}
   123  
   124  # 2020-01-07: ticket 82ac75ba0093e5dc
   125  # Incorrect join result due to mishandling of affinity in constant
   126  # propagation.
   127  #
   128  reset_db
   129  do_execsql_test 500 {
   130    PRAGMA automatic_index=OFF;
   131    CREATE TABLE t0(c0);
   132    INSERT INTO t0 VALUES('0');
   133    CREATE VIEW v0(c0) AS SELECT CAST(0 AS INT) FROM t0;
   134    SELECT 200, * FROM t0, v0 WHERE 0 = t0.c0 AND t0.c0 = v0.c0;
   135  } {}
   136  do_execsql_test 510 {
   137    SELECT 200, * FROM t0, v0 WHERE t0.c0 = 0 AND t0.c0 = v0.c0;
   138  } {}
   139  do_execsql_test 520 {
   140    SELECT 200, * FROM t0, v0 WHERE 0 = t0.c0 AND v0.c0 = t0.c0;
   141  } {}
   142  do_execsql_test 530 {
   143    SELECT 200, * FROM t0, v0 WHERE t0.c0 = 0 AND v0.c0 = t0.c0;
   144  } {}
   145  
   146  # 2020-02-13: ticket 1dcb4d44964846ad
   147  # A problem introduced while making optimizations on the fixes above.
   148  #
   149  reset_db
   150  do_execsql_test 600 {
   151    CREATE TABLE t1(x TEXT);
   152    CREATE TABLE t2(y TEXT);
   153    INSERT INTO t1 VALUES('good'),('bad');
   154    INSERT INTO t2 VALUES('good'),('bad');
   155    SELECT * FROM t1 JOIN t2 ON x=y
   156     WHERE x='good' AND y='good';
   157  } {good good}
   158  
   159  # 2020-04-24: Another test case for the previous (1dcb4d44964846ad)
   160  # ticket.  The test case comes from 
   161  # https://stackoverflow.com/questions/61399253/sqlite3-different-result-in-console-compared-to-python-script/
   162  # Output verified against postgresql.
   163  #
   164  do_execsql_test 610 {
   165    CREATE TABLE tableA(
   166      ID           int,
   167      RunYearMonth int
   168    );
   169    INSERT INTO tableA VALUES(1,202003),(2,202003),(3,202003),(4,202004),
   170      (5,202004),(6,202004),(7,202004),(8,202004);
   171    CREATE TABLE tableB (
   172      ID           int,
   173      RunYearMonth int
   174    );
   175    INSERT INTO tableB VALUES(1,202004),(2,202004),(3,202004),(4,202004),
   176    (5,202004);
   177    SELECT *
   178     FROM (
   179          SELECT *
   180          FROM tableA
   181          WHERE RunYearMonth = 202004
   182      ) AS A
   183      INNER JOIN (
   184          SELECT *
   185          FROM tableB
   186          WHERE RunYearMonth = 202004
   187      ) AS B
   188      ON A.ID = B.ID
   189      AND A.RunYearMonth = B.RunYearMonth;
   190  } {4 202004 4 202004 5 202004 5 202004}
   191  
   192  
   193  finish_test