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

     1  # 2016 June 17
     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 SELECT statement.
    13  #
    14  
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  set ::testprefix rowvalue
    19  
    20  do_execsql_test 0.0 {
    21    CREATE TABLE one(o);
    22    INSERT INTO one VALUES(1);
    23  }
    24  
    25  foreach {tn v1 v2 eq ne is isnot} {
    26    1 "1, 2, 3"    "1, 2, 3"                   1  0     1 0
    27    2 "1, 0, 3"    "1, 2, 3"                   0  1     0 1
    28    3 "1, 2, NULL" "1, 2, 3"                   {} {}    0 1
    29    4 "1, 2, NULL" "1, 2, NULL"                {} {}    1 0
    30    5 "NULL, NULL, NULL" "NULL, NULL, NULL"    {} {}    1 0
    31  
    32    6 "1, NULL, 1" "1, 1, 1"                   {} {}    0 1
    33    7 "1, NULL, 1" "1, 1, 2"                   0  1     0 1
    34  } {
    35    do_execsql_test 1.$tn.eq "SELECT ($v1) == ($v2)" [list $eq]
    36    do_execsql_test 1.$tn.ne "SELECT ($v1) != ($v2)" [list $ne]
    37  
    38    do_execsql_test 1.$tn.is    "SELECT ($v1) IS ($v2)"     [list $is]
    39    do_execsql_test 1.$tn.isnot "SELECT ($v1) IS NOT ($v2)" [list $isnot]
    40  
    41    do_execsql_test 1.$tn.2.eq "SELECT (SELECT $v1) == (SELECT $v2)" [list $eq]
    42    do_execsql_test 1.$tn.2.ne "SELECT (SELECT $v1) != (SELECT $v2)" [list $ne]
    43  }
    44  
    45  foreach {tn v1 v2 lt gt le ge} {
    46    1 "(1, 1, 3)"    "(1, 2, 3)"                   1 0      1 0
    47    2 "(1, 2, 3)"    "(1, 2, 3)"                   0 0      1 1
    48    3 "(1, 3, 3)"    "(1, 2, 3)"                   0 1      0 1
    49  
    50    4 "(1, NULL, 3)"    "(1, 2, 3)"                {} {}      {} {}
    51    5 "(1, 3, 3)"    "(1, NULL, 3)"                {} {}      {} {}
    52    6 "(1, NULL, 3)"    "(1, NULL, 3)"             {} {}      {} {}
    53  } {
    54    foreach {tn2 expr res} [list \
    55      2.$tn.lt "$v1 < $v2" $lt   \
    56      2.$tn.gt "$v1 > $v2" $gt   \
    57      2.$tn.le "$v1 <= $v2" $le   \
    58      2.$tn.ge "$v1 >= $v2" $ge   \
    59    ] {
    60      do_execsql_test $tn2 "SELECT $expr" [list $res]
    61  
    62      set map(0) [list]
    63      set map() [list]
    64      set map(1) [list 1]
    65      do_execsql_test $tn2.where1 "SELECT * FROM one WHERE $expr" $map($res)
    66  
    67      set map(0) [list 1]
    68      set map() [list]
    69      set map(1) [list]
    70      do_execsql_test $tn2.where2 "SELECT * FROM one WHERE NOT $expr" $map($res)
    71    }
    72  }
    73  
    74  do_execsql_test 3.0 {
    75    CREATE TABLE t1(x, y);
    76    INSERT INTO t1 VALUES(1, 1);
    77    INSERT INTO t1 VALUES(1, 2);
    78    INSERT INTO t1 VALUES(2, 3);
    79    INSERT INTO t1 VALUES(2, 4);
    80    INSERT INTO t1 VALUES(3, 5);
    81    INSERT INTO t1 VALUES(3, 6);
    82  }
    83  
    84  foreach {tn r order} {
    85    1 "(1, 1)"           "ORDER BY y"
    86    2 "(1, 1)"           "ORDER BY x, y"
    87    3 "(1, 2)"           "ORDER BY x, y DESC"
    88    4 "(3, 6)"           "ORDER BY x DESC, y DESC"
    89    5 "((3, 5))"         "ORDER BY x DESC, y"
    90    6 "(SELECT 3, 5)"    "ORDER BY x DESC, y"
    91  } {
    92    do_execsql_test 3.$tn.1 "SELECT $r == (SELECT x,y FROM t1 $order)" 1
    93    do_execsql_test 3.$tn.2 "SELECT $r == (SELECT * FROM t1 $order)" 1
    94  
    95    do_execsql_test 3.$tn.3 "
    96      SELECT (SELECT * FROM t1 $order) == (SELECT * FROM t1 $order)
    97    " 1
    98    do_execsql_test 3.$tn.4 "
    99      SELECT (SELECT 0, 0) == (SELECT * FROM t1 $order)
   100    " 0
   101  }
   102  
   103  foreach {tn expr res} {
   104    1 {(2, 2) BETWEEN (2, 2) AND (3, 3)} 1
   105    2 {(2, 2) BETWEEN (2, NULL) AND (3, 3)} {}
   106    3 {(2, 2) BETWEEN (3, NULL) AND (3, 3)} 0
   107  } {
   108    do_execsql_test 4.$tn "SELECT $expr" [list $res]
   109  }
   110  
   111  foreach {tn expr res} {
   112    1 {(2, 4) IN (SELECT * FROM t1)} 1
   113    2 {(3, 4) IN (SELECT * FROM t1)} 0
   114  
   115    3 {(NULL, 4) IN (SELECT * FROM t1)} {}
   116    4 {(NULL, 0) IN (SELECT * FROM t1)} 0
   117  
   118    5 {(NULL, 4) NOT IN (SELECT * FROM t1)} {}
   119    6 {(NULL, 0) NOT IN (SELECT * FROM t1)} 1
   120  } {
   121    do_execsql_test 5.$tn "SELECT $expr" [list $res]
   122  }
   123  
   124  do_execsql_test 6.0 {
   125    CREATE TABLE hh(a, b, c);
   126    INSERT INTO hh VALUES('abc', 1, 'i');
   127    INSERT INTO hh VALUES('ABC', 1, 'ii');
   128    INSERT INTO hh VALUES('def', 2, 'iii');
   129    INSERT INTO hh VALUES('DEF', 2, 'iv');
   130    INSERT INTO hh VALUES('GHI', 3, 'v');
   131    INSERT INTO hh VALUES('ghi', 3, 'vi');
   132  
   133    CREATE INDEX hh_ab ON hh(a, b); 
   134  }
   135  
   136  do_execsql_test 6.1 {
   137    SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1);
   138  } {i}
   139  do_execsql_test 6.2 {
   140    SELECT c FROM hh WHERE (a, b) = (SELECT 'abc' COLLATE nocase, 1);
   141  } {i}
   142  do_execsql_test 6.3 {
   143    SELECT c FROM hh WHERE a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1);
   144  } {i}
   145  do_execsql_test 6.4 {
   146    SELECT c FROM hh WHERE +a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1);
   147  } {i}
   148  do_execsql_test 6.5 {
   149    SELECT c FROM hh WHERE a = (SELECT 'abc') COLLATE nocase AND b = (SELECT 1);
   150  } {i ii}
   151  do_catchsql_test 6.6 {
   152    SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1) COLLATE nocase;
   153  } {1 {row value misused}}
   154  do_catchsql_test 6.7 {
   155    SELECT c FROM hh WHERE (a, b) = 1;
   156  } {1 {row value misused}}
   157  do_execsql_test 6.8 {
   158    SELECT c FROM hh WHERE (a COLLATE nocase, b) = (SELECT 'def', 2);
   159  } {iii iv}
   160  do_execsql_test 6.9 {
   161    SELECT c FROM hh WHERE (a COLLATE nocase, b) IS NOT (SELECT 'def', 2);
   162  } {i ii v vi}
   163  do_execsql_test 6.10 {
   164    SELECT c FROM hh WHERE (b, a) = (SELECT 2, 'def');
   165  } {iii}
   166  
   167  do_execsql_test 7.0 {
   168    CREATE TABLE xy(i INTEGER PRIMARY KEY, j, k);
   169    INSERT INTO xy VALUES(1, 1, 1);
   170    INSERT INTO xy VALUES(2, 2, 2);
   171    INSERT INTO xy VALUES(3, 3, 3);
   172    INSERT INTO xy VALUES(4, 4, 4);
   173  }
   174  
   175  
   176  foreach {tn sql res eqp} {
   177    1 "SELECT * FROM xy WHERE (i, j) IS (2, 2)" {2 2 2} 
   178      "SEARCH xy USING INTEGER PRIMARY KEY (rowid=?)"
   179  
   180    2 "SELECT * FROM xy WHERE (k, j) < (2, 3)" {1 1 1 2 2 2}
   181      "SCAN xy"
   182  
   183    3 "SELECT * FROM xy WHERE (i, j) < (2, 3)" {1 1 1 2 2 2}
   184      "SEARCH xy USING INTEGER PRIMARY KEY (rowid<?)"
   185  
   186    4 "SELECT * FROM xy WHERE (i, j) > (2, 1)" {2 2 2 3 3 3 4 4 4}
   187      "SEARCH xy USING INTEGER PRIMARY KEY (rowid>?)"
   188  
   189    5 "SELECT * FROM xy WHERE (i, j) > ('2', 1)" {2 2 2 3 3 3 4 4 4}
   190      "SEARCH xy USING INTEGER PRIMARY KEY (rowid>?)"
   191  
   192  } {
   193    do_eqp_test 7.$tn.1 $sql $eqp
   194    do_execsql_test 7.$tn.2 $sql $res
   195  }
   196  
   197  do_execsql_test 8.0 {
   198    CREATE TABLE j1(a);
   199  }
   200  do_execsql_test 8.1 {
   201    SELECT * FROM j1 WHERE (select min(a) FROM j1) IN (?, ?, ?)
   202  }
   203  
   204  do_execsql_test 9.0 {
   205    CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
   206    INSERT INTO t2 VALUES(1, 1, 1);
   207    INSERT INTO t2 VALUES(2, 2, 2);
   208    INSERT INTO t2 VALUES(3, 3, 3);
   209    INSERT INTO t2 VALUES(4, 4, 4);
   210    INSERT INTO t2 VALUES(5, 5, 5);
   211  }
   212  
   213  foreach {tn q res} {
   214    1 "(a, b) > (2, 1)" {2 3 4 5}
   215    2 "(a, b) > (2, 2)" {3 4 5}
   216    3 "(a, b) < (4, 5)" {1 2 3 4}
   217    4 "(a, b) < (4, 3)" {1 2 3}
   218  } {
   219    do_execsql_test 9.$tn "SELECT c FROM t2 WHERE $q" $res
   220  } 
   221  
   222  do_execsql_test 10.0 {
   223    CREATE TABLE dual(dummy); INSERT INTO dual(dummy) VALUES('X');
   224    CREATE TABLE t3(a TEXT,b TEXT,c TEXT,d TEXT,e TEXT,f TEXT);
   225    CREATE INDEX t3x ON t3(b,c,d,e,f);
   226  
   227    SELECT a FROM t3
   228      WHERE (c,d) IN (SELECT 'c','d' FROM dual)
   229      AND (a,b,e) IN (SELECT 'a','b','d' FROM dual);
   230  }
   231  
   232  do_catchsql_test 11.1 {
   233    CREATE TABLE t11(a);
   234    SELECT * FROM t11 WHERE (a,a)<=1;
   235  } {1 {row value misused}}
   236  do_catchsql_test 11.2 {
   237    SELECT * FROM t11 WHERE (a,a)<1;
   238  } {1 {row value misused}}
   239  do_catchsql_test 11.3 {
   240    SELECT * FROM t11 WHERE (a,a)>=1;
   241  } {1 {row value misused}}
   242  do_catchsql_test 11.4 {
   243    SELECT * FROM t11 WHERE (a,a)>1;
   244  } {1 {row value misused}}
   245  do_catchsql_test 11.5 {
   246    SELECT * FROM t11 WHERE (a,a)==1;
   247  } {1 {row value misused}}
   248  do_catchsql_test 11.6 {
   249    SELECT * FROM t11 WHERE (a,a)<>1;
   250  } {1 {row value misused}}
   251  do_catchsql_test 11.7 {
   252    SELECT * FROM t11 WHERE (a,a) IS 1;
   253  } {1 {row value misused}}
   254  do_catchsql_test 11.8 {
   255    SELECT * FROM t11 WHERE (a,a) IS NOT 1;
   256  } {1 {row value misused}}
   257  
   258  # 2016-10-27: https://www.sqlite.org/src/tktview/fef4bb4bd9185ec8f
   259  # Incorrect result from a LEFT JOIN with a row-value constraint
   260  #
   261  do_execsql_test 12.1 {
   262    DROP TABLE IF EXISTS t1;
   263    CREATE TABLE t1(a,b); INSERT INTO t1 VALUES(1,2);
   264    DROP TABLE IF EXISTS t2;
   265    CREATE TABLE t2(x,y); INSERT INTO t2 VALUES(3,4);
   266    SELECT *,'x' FROM t1 LEFT JOIN t2 ON (a,b)=(x,y);
   267  } {1 2 {} {} x}
   268  
   269  
   270  foreach {tn sql} {
   271    0 "SELECT (1,2) AS x WHERE x=3"
   272    1 "SELECT (1,2) BETWEEN 1 AND 2"
   273    2 "SELECT 1 BETWEEN (1,2) AND 2"
   274    3 "SELECT 2 BETWEEN 1 AND (1,2)"
   275    4 "SELECT (1,2) FROM (SELECT 1) ORDER BY 1"
   276    5 "SELECT (1,2) FROM (SELECT 1) GROUP BY 1"
   277  } {
   278    do_catchsql_test 13.$tn $sql {1 {row value misused}}
   279  }
   280  
   281  do_execsql_test 14.0 {
   282    CREATE TABLE t12(x);
   283    INSERT INTO t12 VALUES(2), (4);
   284  }
   285  do_execsql_test 14.1 "SELECT 1 WHERE (2,2) BETWEEN (1,1) AND (3,3)" 1
   286  do_execsql_test 14.2 "SELECT CASE (2,2) WHEN (1, 1) THEN 2 ELSE 1 END" 1
   287  do_execsql_test 14.3 "SELECT CASE (SELECT 2,2) WHEN (1, 1) THEN 2 ELSE 1 END" 1
   288  do_execsql_test 14.4 "SELECT 1 WHERE (SELECT 2,2) BETWEEN (1,1) AND (3,3)" 1
   289  do_execsql_test 14.5 "SELECT 1 FROM t12 WHERE (x,1) BETWEEN (1,1) AND (3,3)" 1
   290  do_execsql_test 14.6 {
   291    SELECT 1 FROM t12 WHERE (1,x) BETWEEN (1,1) AND (3,3)
   292  } {1 1}
   293  
   294  #-------------------------------------------------------------------------
   295  # Test that errors are not concealed by the SELECT flattening or
   296  # WHERE-clause push-down optimizations.
   297  do_execsql_test 14.1 {
   298    CREATE TABLE x1(a PRIMARY KEY, b);
   299    CREATE TABLE x2(a INTEGER PRIMARY KEY, b);
   300  }
   301  
   302  foreach {tn n sql} {
   303    1 0 "SELECT * FROM (SELECT (1, 1) AS c FROM x1) WHERE c=1"
   304    2 2 "SELECT * FROM (SELECT 1 AS x, (SELECT 8,9) AS y) WHERE y<1"
   305    3 3 "SELECT * FROM (SELECT 1 AS x, (SELECT 8,9,10) AS y) WHERE y<1"
   306    4 0 "SELECT * FROM (SELECT (a, b) AS c FROM x1), x2 WHERE c=a"
   307    5 0 "SELECT * FROM (SELECT a AS c, (1, 2, 3) FROM x1), x2 WHERE c=a"
   308    6 0 "SELECT * FROM (SELECT 1 AS c, (1, 2, 3) FROM x1) WHERE c=1"
   309  } {
   310    if {$n==0} {
   311      set err "row value misused"
   312    } else {
   313      set err "sub-select returns $n columns - expected 1"
   314    }
   315    do_catchsql_test 14.2.$tn $sql [list 1 $err]
   316  }
   317  
   318  #--------------------------------------------------------------------------
   319  # Test for vector size mismatches concealed by unexpanded subqueries.
   320  #
   321  do_catchsql_test 15.1 {
   322    DETACH (SELECT * FROM (SELECT 1,2))<3;
   323  } {1 {row value misused}}
   324  do_catchsql_test 15.2 {
   325    UPDATE x1 SET a=(SELECT * FROM (SELECT b,2))<3;
   326  } {1 {row value misused}}
   327  do_catchsql_test 15.3 {
   328    UPDATE x1 SET a=NULL WHERE  a<(SELECT * FROM (SELECT b,2));
   329  } {1 {sub-select returns 2 columns - expected 1}}
   330  do_catchsql_test 15.4 {
   331    DELETE FROM x1 WHERE  a<(SELECT * FROM (SELECT b,2));
   332  } {1 {sub-select returns 2 columns - expected 1}}
   333  do_catchsql_test 15.5 {
   334    INSERT INTO x1(a,b) VALUES(1,(SELECT * FROM (SELECT 1,2))<3);
   335  } {1 {row value misused}}
   336  
   337  #-------------------------------------------------------------------------
   338  # Row-values used in UPDATE statements within TRIGGERs
   339  #
   340  # Ticket https://www.sqlite.org/src/info/8c9458e703666e1a
   341  #
   342  do_execsql_test 16.1 {
   343    CREATE TABLE t16a(a,b,c);
   344    INSERT INTO t16a VALUES(1,2,3);
   345    CREATE TABLE t16b(x);
   346    INSERT INTO t16b(x) VALUES(1);
   347    CREATE TRIGGER t16r AFTER UPDATE ON t16b BEGIN
   348       UPDATE t16a SET (a,b,c)=(SELECT new.x,new.x+1,new.x+2);
   349    END;
   350    UPDATE t16b SET x=7;
   351    SELECT * FROM t16a;
   352  } {7 8 9}
   353  do_execsql_test 16.2 {
   354    UPDATE t16b SET x=97;
   355    SELECT * FROM t16a;
   356  } {97 98 99}
   357  
   358  do_execsql_test 16.3 {
   359    CREATE TABLE t16c(a, b, c, d, e);
   360    INSERT INTO t16c VALUES(1, 'a', 'b', 'c', 'd');
   361    CREATE TRIGGER t16c1 AFTER INSERT ON t16c BEGIN
   362      UPDATE t16c SET (c, d) = (SELECT 'A', 'B'), (e, b) = (SELECT 'C', 'D')
   363        WHERE a = new.a-1;
   364    END;
   365  
   366    SELECT * FROM t16c;
   367  } {1 a b c d}
   368  
   369  do_execsql_test 16.4 {
   370    INSERT INTO t16c VALUES(2, 'w', 'x', 'y', 'z');
   371    SELECT * FROM t16c;
   372  } {
   373    1 D A B C 
   374    2 w x y z
   375  }
   376  
   377  do_execsql_test 16.5 {
   378    DROP TRIGGER t16c1;
   379    PRAGMA recursive_triggers = 1;
   380    INSERT INTO t16c VALUES(3, 'i', 'ii', 'iii', 'iv');
   381    CREATE TRIGGER t16c1 AFTER UPDATE ON t16c WHEN new.a>1 BEGIN
   382      UPDATE t16c SET (e, d) = (
   383        SELECT b, c FROM t16c WHERE a = new.a-1
   384      ), (c, b) = (
   385        SELECT d, e FROM t16c WHERE a = new.a-1
   386      ) WHERE a = new.a-1;
   387    END;
   388  
   389    UPDATE t16c SET a=a WHERE a=3;
   390    SELECT * FROM t16c;
   391  } {
   392    1 C B A D
   393    2 z y x w
   394    3 i ii iii iv
   395  }
   396  
   397  do_execsql_test 17.0 {
   398    CREATE TABLE b1(a, b);
   399    CREATE TABLE b2(x);
   400  }
   401  
   402  do_execsql_test 17.1 {
   403    SELECT * FROM b2 CROSS JOIN b1 
   404    WHERE b2.x=b1.a AND (b1.a, 2) 
   405    IN (VALUES(1, 2));
   406  } {}
   407  
   408  do_execsql_test 18.0 {
   409    CREATE TABLE b3 ( a, b, PRIMARY KEY (a, b) );
   410    CREATE TABLE b4 ( a );
   411    CREATE TABLE b5 ( a, b );
   412    INSERT INTO b3 VALUES (1, 1), (1, 2);
   413    INSERT INTO b4 VALUES (1);
   414    INSERT INTO b5 VALUES (1, 1), (1, 2);
   415  }
   416  
   417  do_execsql_test 18.1 {
   418    SELECT * FROM b3 WHERE (SELECT b3.a, b3.b) IN ( SELECT a, b FROM b5 )
   419  } {1 1 1 2}
   420  do_execsql_test 18.2 {
   421    SELECT * FROM b3 WHERE (VALUES(b3.a, b3.b)) IN ( SELECT a, b FROM b5 );
   422  } {1 1 1 2}
   423  do_execsql_test 18.3 {
   424    SELECT * FROM b3 WHERE (b3.a, b3.b) IN ( SELECT a, b FROM b5 ); 
   425  } {1 1 1 2}
   426  do_execsql_test 18.4 {
   427    SELECT * FROM b3 JOIN b4 ON b4.a = b3.a
   428    WHERE (SELECT b3.a, b3.b) IN ( SELECT a, b FROM b5 ); 
   429  } {1 1 1 1 2 1}
   430  do_execsql_test 18.5 {
   431    SELECT * FROM b3 JOIN b4 ON b4.a = b3.a
   432    WHERE (VALUES(b3.a, b3.b)) IN ( SELECT a, b FROM b5 ); 
   433  } {1 1 1 1 2 1}
   434  do_execsql_test 18.6 {
   435    SELECT * FROM b3 JOIN b4 ON b4.a = b3.a
   436    WHERE (b3.a, b3.b) IN ( SELECT a, b FROM b5 ); 
   437  } {1 1 1 1 2 1}
   438  
   439   
   440  # 2018-02-13 Ticket https://www.sqlite.org/src/tktview/f484b65f3d6230593c3
   441  # Incorrect result from a row-value comparison in the WHERE clause.
   442  #
   443  do_execsql_test 19.1 {
   444    DROP TABLE IF EXISTS t1;
   445    CREATE TABLE t1(a INTEGER PRIMARY KEY,b);
   446    INSERT INTO t1(a,b) VALUES(1,11),(2,22),(3,33),(4,44);
   447    SELECT * FROM t1 WHERE (a,b)>(0,0) ORDER BY a;
   448  } {1 11 2 22 3 33 4 44}
   449  do_execsql_test 19.2 {
   450    SELECT * FROM t1 WHERE (a,b)>=(0,0) ORDER BY a;
   451  } {1 11 2 22 3 33 4 44}
   452  do_execsql_test 19.3 {
   453    SELECT * FROM t1 WHERE (a,b)<(5,0) ORDER BY a DESC;
   454  } {4 44 3 33 2 22 1 11}
   455  do_execsql_test 19.4 {
   456    SELECT * FROM t1 WHERE (a,b)<=(5,0) ORDER BY a DESC;
   457  } {4 44 3 33 2 22 1 11}
   458  do_execsql_test 19.5 {
   459    SELECT * FROM t1 WHERE (a,b)>(3,0) ORDER BY a;
   460  } {3 33 4 44}
   461  do_execsql_test 19.6 {
   462    SELECT * FROM t1 WHERE (a,b)>=(3,0) ORDER BY a;
   463  } {3 33 4 44}
   464  do_execsql_test 19.7 {
   465    SELECT * FROM t1 WHERE (a,b)<(3,0) ORDER BY a DESC;
   466  } {2 22 1 11}
   467  do_execsql_test 19.8 {
   468    SELECT * FROM t1 WHERE (a,b)<=(3,0) ORDER BY a DESC;
   469  } {2 22 1 11}
   470  do_execsql_test 19.9 {
   471    SELECT * FROM t1 WHERE (a,b)>(3,32) ORDER BY a;
   472  } {3 33 4 44}
   473  do_execsql_test 19.10 {
   474    SELECT * FROM t1 WHERE (a,b)>(3,33) ORDER BY a;
   475  } {4 44}
   476  do_execsql_test 19.11 {
   477    SELECT * FROM t1 WHERE (a,b)>=(3,33) ORDER BY a;
   478  } {3 33 4 44}
   479  do_execsql_test 19.12 {
   480    SELECT * FROM t1 WHERE (a,b)>=(3,34) ORDER BY a;
   481  } {4 44}
   482  do_execsql_test 19.13 {
   483    SELECT * FROM t1 WHERE (a,b)<(3,34) ORDER BY a DESC;
   484  } {3 33 2 22 1 11}
   485  do_execsql_test 19.14 {
   486    SELECT * FROM t1 WHERE (a,b)<(3,33) ORDER BY a DESC;
   487  } {2 22 1 11}
   488  do_execsql_test 19.15 {
   489    SELECT * FROM t1 WHERE (a,b)<=(3,33) ORDER BY a DESC;
   490  } {3 33 2 22 1 11}
   491  do_execsql_test 19.16 {
   492    SELECT * FROM t1 WHERE (a,b)<=(3,32) ORDER BY a DESC;
   493  } {2 22 1 11}
   494  do_execsql_test 19.21 {
   495    SELECT * FROM t1 WHERE (0,0)<(a,b) ORDER BY a;
   496  } {1 11 2 22 3 33 4 44}
   497  do_execsql_test 19.22 {
   498    SELECT * FROM t1 WHERE (0,0)<=(a,b) ORDER BY a;
   499  } {1 11 2 22 3 33 4 44}
   500  do_execsql_test 19.23 {
   501    SELECT * FROM t1 WHERE (5,0)>(a,b) ORDER BY a DESC;
   502  } {4 44 3 33 2 22 1 11}
   503  do_execsql_test 19.24 {
   504    SELECT * FROM t1 WHERE (5,0)>=(a,b) ORDER BY a DESC;
   505  } {4 44 3 33 2 22 1 11}
   506  do_execsql_test 19.25 {
   507    SELECT * FROM t1 WHERE (3,0)<(a,b) ORDER BY a;
   508  } {3 33 4 44}
   509  do_execsql_test 19.26 {
   510    SELECT * FROM t1 WHERE (3,0)<=(a,b) ORDER BY a;
   511  } {3 33 4 44}
   512  do_execsql_test 19.27 {
   513    SELECT * FROM t1 WHERE (3,0)>(a,b) ORDER BY a DESC;
   514  } {2 22 1 11}
   515  do_execsql_test 19.28 {
   516    SELECT * FROM t1 WHERE (3,0)>=(a,b) ORDER BY a DESC;
   517  } {2 22 1 11}
   518  do_execsql_test 19.29 {
   519    SELECT * FROM t1 WHERE (3,32)<(a,b) ORDER BY a;
   520  } {3 33 4 44}
   521  do_execsql_test 19.30 {
   522    SELECT * FROM t1 WHERE (3,33)<(a,b) ORDER BY a;
   523  } {4 44}
   524  do_execsql_test 19.31 {
   525    SELECT * FROM t1 WHERE (3,33)<=(a,b) ORDER BY a;
   526  } {3 33 4 44}
   527  do_execsql_test 19.32 {
   528    SELECT * FROM t1 WHERE (3,34)<=(a,b) ORDER BY a;
   529  } {4 44}
   530  do_execsql_test 19.33 {
   531    SELECT * FROM t1 WHERE (3,34)>(a,b) ORDER BY a DESC;
   532  } {3 33 2 22 1 11}
   533  do_execsql_test 19.34 {
   534    SELECT * FROM t1 WHERE (3,33)>(a,b) ORDER BY a DESC;
   535  } {2 22 1 11}
   536  do_execsql_test 19.35 {
   537    SELECT * FROM t1 WHERE (3,33)>=(a,b) ORDER BY a DESC;
   538  } {3 33 2 22 1 11}
   539  do_execsql_test 19.36 {
   540    SELECT * FROM t1 WHERE (3,32)>=(a,b) ORDER BY a DESC;
   541  } {2 22 1 11}
   542  
   543  # 2018-02-18: Memory leak nexted row-value.  Detected by OSSFuzz.
   544  #
   545  do_catchsql_test 20.1 {
   546    SELECT 1 WHERE (2,(2,0)) IS (2,(2,0));
   547  } {0 1}
   548  
   549  # 2018-11-03: Ticket https://www.sqlite.org/src/info/1a84668dcfdebaf1
   550  # Assertion fault when doing row-value operations on a primary key
   551  # containing duplicate columns.
   552  #
   553  do_execsql_test 21.0 {
   554    DROP TABLE IF EXISTS t1;
   555    CREATE TABLE t1(a,b,PRIMARY KEY(b,b));
   556    INSERT INTO t1 VALUES(1,2),(3,4),(5,6);
   557    SELECT * FROM t1 WHERE (a,b) IN (VALUES(1,2));  
   558  } {1 2}
   559  
   560  # 2019-08-09: Multi-column subquery on the RHS of an IN operator.
   561  #
   562  do_execsql_test 22.100 {
   563    SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 3,4);
   564    SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 5,6);
   565    SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 3,4);
   566    SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 5,6);
   567    SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 3,4);
   568    SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 5,6);
   569    SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 3,4);
   570    SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 5,6);
   571  } {1 0 1 0 0 1 0 1}
   572  
   573  # 2019-10-21 Ticket b47e3627ecaadbde
   574  #
   575  do_execsql_test 23.100 {
   576    DROP TABLE IF EXISTS t0;
   577    CREATE TABLE t0(aa COLLATE NOCASE, bb);
   578    INSERT INTO t0 VALUES('a', 'A');
   579    SELECT (+bb,1) >= (aa, 1), (aa,1)<=(+bb,1) FROM t0;
   580    SELECT 2 FROM t0 WHERE (+bb,1) >= (aa,1);
   581    SELECT 3 FROM t0 WHERE (aa,1) <= (+bb,1);
   582  } {0 1 3}
   583  do_execsql_test 23.110 {
   584    SELECT (SELECT +bb,1) >= (aa, 1), (aa,1)<=(SELECT +bb,1) FROM t0;
   585    SELECT 2 FROM t0 WHERE (SELECT +bb,1) >= (aa,1);
   586    SELECT 3 FROM t0 WHERE (aa,1) <= (SELECT +bb,1);
   587  } {0 1 3}
   588  
   589  # 2019-10-22 Ticket 6ef984af8972c2eb
   590  do_execsql_test 24.100 {
   591    DROP TABLE t0;
   592    CREATE TABLE t0(c0 TEXT PRIMARY KEY);
   593    INSERT INTO t0(c0) VALUES ('');
   594    SELECT (t0.c0, TRUE) > (CAST(0 AS REAL), FALSE) FROM t0;
   595    SELECT 2 FROM t0 WHERE (t0.c0, TRUE) > (CAST('' AS REAL), FALSE);
   596  } {1 2}
   597  
   598  # 2019-10-23 Ticket 135c9da7513e5a97
   599  do_execsql_test 25.10 {
   600    DROP TABLE t0;
   601    CREATE TABLE t0(c0 UNIQUE);
   602    INSERT INTO t0(c0) VALUES('a');
   603    SELECT (t0.c0, 0) < ('B' COLLATE NOCASE, 0) FROM t0;
   604    SELECT 2 FROM t0 WHERE (t0.c0, 0) < ('B' COLLATE NOCASE, 0);
   605  } {1 2}
   606  do_execsql_test 25.20 {
   607    SELECT ('B' COLLATE NOCASE, 0)> (t0.c0, 0) FROM t0;
   608    SELECT 2 FROM t0 WHERE ('B' COLLATE NOCASE, 0)> (t0.c0, 0);
   609  } {1 2}
   610  do_execsql_test 25.30 {
   611    SELECT ('B', 0)> (t0.c0 COLLATE nocase, 0) FROM t0;
   612    SELECT 2 FROM t0 WHERE ('B', 0)> (t0.c0 COLLATE nocase, 0);
   613  } {1 2}
   614  do_execsql_test 25.40 {
   615    SELECT (t0.c0 COLLATE nocase, 0) < ('B', 0) FROM t0;
   616    SELECT 2 FROM t0 WHERE (t0.c0 COLLATE nocase, 0) < ('B', 0);
   617  } {1 2}
   618  
   619  # 2019-11-04 Ticket 02aa2bd02f97d0f2
   620  # The TK_VECTOR operator messes up sqlite3ExprImpliesNonNull() which
   621  # causes incorrect LEFT JOIN strength reduction.  TK_VECTOR should be
   622  # treated the same as TK_OR.
   623  #
   624  db close
   625  sqlite3 db :memory:
   626  do_execsql_test 26.10 {
   627    CREATE TABLE t0(c0);
   628    CREATE TABLE t1(c1);
   629    INSERT INTO t1(c1) VALUES (0);
   630    SELECT (c0, x'') != (NULL, 0) FROM t1 LEFT JOIN t0;
   631  } {1}
   632  do_execsql_test 26.20 {
   633    SELECT 2 FROM t1 LEFT JOIN t0 ON (c0, x'') != (NULL, 0);
   634  } {2}
   635  do_execsql_test 26.30 {
   636    SELECT 3 FROM t1 LEFT JOIN t0 WHERE (c0, x'') != (NULL, 0);
   637  } {3}
   638  
   639  # 2019-12-30 ticket 892575cdba4e1e36
   640  #
   641  reset_db
   642  do_catchsql_test 27.10 {
   643    CREATE TABLE t0(c0 CHECK(((0, 0) > (0, c0))));
   644    INSERT INTO t0(c0) VALUES(0) ON CONFLICT(c0) DO UPDATE SET c0 = 3;
   645  } {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
   646  
   647  # 2021-02-03
   648  # https://bugs.chromium.org/p/chromium/issues/detail?id=1173511
   649  # Faulty assert() statement.
   650  #
   651  reset_db
   652  do_catchsql_test 28.10 {
   653    CREATE TABLE t0(c0 PRIMARY KEY, c1);
   654    CREATE TRIGGER trigger0 BEFORE DELETE ON t0 BEGIN
   655     SELECT (SELECT c0,c1  FROM t0)  FROM t0;
   656    END ;
   657    DELETE FROM t0;
   658  } {1 {sub-select returns 2 columns - expected 1}}
   659  
   660  # 2021-03-19
   661  # dbsqlfuzz find of a NEVER().
   662  do_catchsql_test 29.1 {
   663    SELECT (SELECT 1 WHERE ((SELECT 1 WHERE (2,(2,0)) IS (2,(20))),(2,0)) IS (2,(20))) WHERE (2,(2,0)) IS (2 IN(SELECT 1 WHERE (2,(2,2,0)) IS (2,(20))),(20));
   664  } {1 {row value misused}}
   665  
   666  #-------------------------------------------------------------------------
   667  reset_db
   668  do_execsql_test 30.0 {
   669    CREATE TABLE t1(x, y, z);
   670    CREATE TABLE t2(a, b);
   671  
   672    INSERT INTO t1 VALUES(1000, 2000, 3000);
   673    INSERT INTO t2 VALUES(NULL, NULL);
   674  }
   675  
   676  do_execsql_test 30.1 {
   677    UPDATE t2 SET (a,b)=(
   678      SELECT max( t1.x ) OVER( PARTITION BY sum( (SELECT t1.y) ) ), 2
   679    )
   680    FROM t1;
   681  } {}
   682  
   683  do_execsql_test 30.2 {
   684    SELECT * FROM t2
   685  } {1000 2}
   686  
   687  reset_db
   688  do_execsql_test 30.3 {
   689    CREATE TABLE t1(x INT PRIMARY KEY, y, z);
   690    CREATE TABLE t2(a,b,c,d,e,PRIMARY KEY(a,b))WITHOUT ROWID;
   691  
   692    UPDATE t2 SET (d,d,a)=(SELECT EXISTS(SELECT 1 IN(SELECT max( 1 IN(SELECT x ORDER BY 1)) OVER(PARTITION BY sum((SELECT y FROM t1 UNION SELECT x ORDER BY 1)))INTERSECT SELECT EXISTS(SELECT 1 FROM t1 UNION SELECT x ORDER BY 1) ORDER BY 1) ORDERa)|9 AS blob, 2, 3) FROM t1 WHERE x<a;
   693  }
   694  
   695  
   696  
   697  finish_test