Home | History | Annotate | Download | only in test
      1 # 2001 September 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 the SELECT statement.
     13 #
     14 # $Id: select1.test,v 1.70 2009/05/28 01:00:56 drh Exp $
     15 
     16 set testdir [file dirname $argv0]
     17 source $testdir/tester.tcl
     18 
     19 # Try to select on a non-existant table.
     20 #
     21 do_test select1-1.1 {
     22   set v [catch {execsql {SELECT * FROM test1}} msg]
     23   lappend v $msg
     24 } {1 {no such table: test1}}
     25 
     26 
     27 execsql {CREATE TABLE test1(f1 int, f2 int)}
     28 
     29 do_test select1-1.2 {
     30   set v [catch {execsql {SELECT * FROM test1, test2}} msg]
     31   lappend v $msg
     32 } {1 {no such table: test2}}
     33 do_test select1-1.3 {
     34   set v [catch {execsql {SELECT * FROM test2, test1}} msg]
     35   lappend v $msg
     36 } {1 {no such table: test2}}
     37 
     38 execsql {INSERT INTO test1(f1,f2) VALUES(11,22)}
     39 
     40 
     41 # Make sure the columns are extracted correctly.
     42 #
     43 do_test select1-1.4 {
     44   execsql {SELECT f1 FROM test1}
     45 } {11}
     46 do_test select1-1.5 {
     47   execsql {SELECT f2 FROM test1}
     48 } {22}
     49 do_test select1-1.6 {
     50   execsql {SELECT f2, f1 FROM test1}
     51 } {22 11}
     52 do_test select1-1.7 {
     53   execsql {SELECT f1, f2 FROM test1}
     54 } {11 22}
     55 do_test select1-1.8 {
     56   execsql {SELECT * FROM test1}
     57 } {11 22}
     58 do_test select1-1.8.1 {
     59   execsql {SELECT *, * FROM test1}
     60 } {11 22 11 22}
     61 do_test select1-1.8.2 {
     62   execsql {SELECT *, min(f1,f2), max(f1,f2) FROM test1}
     63 } {11 22 11 22}
     64 do_test select1-1.8.3 {
     65   execsql {SELECT 'one', *, 'two', * FROM test1}
     66 } {one 11 22 two 11 22}
     67 
     68 execsql {CREATE TABLE test2(r1 real, r2 real)}
     69 execsql {INSERT INTO test2(r1,r2) VALUES(1.1,2.2)}
     70 
     71 do_test select1-1.9 {
     72   execsql {SELECT * FROM test1, test2}
     73 } {11 22 1.1 2.2}
     74 do_test select1-1.9.1 {
     75   execsql {SELECT *, 'hi' FROM test1, test2}
     76 } {11 22 1.1 2.2 hi}
     77 do_test select1-1.9.2 {
     78   execsql {SELECT 'one', *, 'two', * FROM test1, test2}
     79 } {one 11 22 1.1 2.2 two 11 22 1.1 2.2}
     80 do_test select1-1.10 {
     81   execsql {SELECT test1.f1, test2.r1 FROM test1, test2}
     82 } {11 1.1}
     83 do_test select1-1.11 {
     84   execsql {SELECT test1.f1, test2.r1 FROM test2, test1}
     85 } {11 1.1}
     86 do_test select1-1.11.1 {
     87   execsql {SELECT * FROM test2, test1}
     88 } {1.1 2.2 11 22}
     89 do_test select1-1.11.2 {
     90   execsql {SELECT * FROM test1 AS a, test1 AS b}
     91 } {11 22 11 22}
     92 do_test select1-1.12 {
     93   execsql {SELECT max(test1.f1,test2.r1), min(test1.f2,test2.r2)
     94            FROM test2, test1}
     95 } {11 2.2}
     96 do_test select1-1.13 {
     97   execsql {SELECT min(test1.f1,test2.r1), max(test1.f2,test2.r2)
     98            FROM test1, test2}
     99 } {1.1 22}
    100 
    101 set long {This is a string that is too big to fit inside a NBFS buffer}
    102 do_test select1-2.0 {
    103   execsql "
    104     DROP TABLE test2;
    105     DELETE FROM test1;
    106     INSERT INTO test1 VALUES(11,22);
    107     INSERT INTO test1 VALUES(33,44);
    108     CREATE TABLE t3(a,b);
    109     INSERT INTO t3 VALUES('abc',NULL);
    110     INSERT INTO t3 VALUES(NULL,'xyz');
    111     INSERT INTO t3 SELECT * FROM test1;
    112     CREATE TABLE t4(a,b);
    113     INSERT INTO t4 VALUES(NULL,'$long');
    114     SELECT * FROM t3;
    115   "
    116 } {abc {} {} xyz 11 22 33 44}
    117 
    118 # Error messges from sqliteExprCheck
    119 #
    120 do_test select1-2.1 {
    121   set v [catch {execsql {SELECT count(f1,f2) FROM test1}} msg]
    122   lappend v $msg
    123 } {1 {wrong number of arguments to function count()}}
    124 do_test select1-2.2 {
    125   set v [catch {execsql {SELECT count(f1) FROM test1}} msg]
    126   lappend v $msg
    127 } {0 2}
    128 do_test select1-2.3 {
    129   set v [catch {execsql {SELECT Count() FROM test1}} msg]
    130   lappend v $msg
    131 } {0 2}
    132 do_test select1-2.4 {
    133   set v [catch {execsql {SELECT COUNT(*) FROM test1}} msg]
    134   lappend v $msg
    135 } {0 2}
    136 do_test select1-2.5 {
    137   set v [catch {execsql {SELECT COUNT(*)+1 FROM test1}} msg]
    138   lappend v $msg
    139 } {0 3}
    140 do_test select1-2.5.1 {
    141   execsql {SELECT count(*),count(a),count(b) FROM t3}
    142 } {4 3 3}
    143 do_test select1-2.5.2 {
    144   execsql {SELECT count(*),count(a),count(b) FROM t4}
    145 } {1 0 1}
    146 do_test select1-2.5.3 {
    147   execsql {SELECT count(*),count(a),count(b) FROM t4 WHERE b=5}
    148 } {0 0 0}
    149 do_test select1-2.6 {
    150   set v [catch {execsql {SELECT min(*) FROM test1}} msg]
    151   lappend v $msg
    152 } {1 {wrong number of arguments to function min()}}
    153 do_test select1-2.7 {
    154   set v [catch {execsql {SELECT Min(f1) FROM test1}} msg]
    155   lappend v $msg
    156 } {0 11}
    157 do_test select1-2.8 {
    158   set v [catch {execsql {SELECT MIN(f1,f2) FROM test1}} msg]
    159   lappend v [lsort $msg]
    160 } {0 {11 33}}
    161 do_test select1-2.8.1 {
    162   execsql {SELECT coalesce(min(a),'xyzzy') FROM t3}
    163 } {11}
    164 do_test select1-2.8.2 {
    165   execsql {SELECT min(coalesce(a,'xyzzy')) FROM t3}
    166 } {11}
    167 do_test select1-2.8.3 {
    168   execsql {SELECT min(b), min(b) FROM t4}
    169 } [list $long $long]
    170 do_test select1-2.9 {
    171   set v [catch {execsql {SELECT MAX(*) FROM test1}} msg]
    172   lappend v $msg
    173 } {1 {wrong number of arguments to function MAX()}}
    174 do_test select1-2.10 {
    175   set v [catch {execsql {SELECT Max(f1) FROM test1}} msg]
    176   lappend v $msg
    177 } {0 33}
    178 do_test select1-2.11 {
    179   set v [catch {execsql {SELECT max(f1,f2) FROM test1}} msg]
    180   lappend v [lsort $msg]
    181 } {0 {22 44}}
    182 do_test select1-2.12 {
    183   set v [catch {execsql {SELECT MAX(f1,f2)+1 FROM test1}} msg]
    184   lappend v [lsort $msg]
    185 } {0 {23 45}}
    186 do_test select1-2.13 {
    187   set v [catch {execsql {SELECT MAX(f1)+1 FROM test1}} msg]
    188   lappend v $msg
    189 } {0 34}
    190 do_test select1-2.13.1 {
    191   execsql {SELECT coalesce(max(a),'xyzzy') FROM t3}
    192 } {abc}
    193 do_test select1-2.13.2 {
    194   execsql {SELECT max(coalesce(a,'xyzzy')) FROM t3}
    195 } {xyzzy}
    196 do_test select1-2.14 {
    197   set v [catch {execsql {SELECT SUM(*) FROM test1}} msg]
    198   lappend v $msg
    199 } {1 {wrong number of arguments to function SUM()}}
    200 do_test select1-2.15 {
    201   set v [catch {execsql {SELECT Sum(f1) FROM test1}} msg]
    202   lappend v $msg
    203 } {0 44}
    204 do_test select1-2.16 {
    205   set v [catch {execsql {SELECT sum(f1,f2) FROM test1}} msg]
    206   lappend v $msg
    207 } {1 {wrong number of arguments to function sum()}}
    208 do_test select1-2.17 {
    209   set v [catch {execsql {SELECT SUM(f1)+1 FROM test1}} msg]
    210   lappend v $msg
    211 } {0 45}
    212 do_test select1-2.17.1 {
    213   execsql {SELECT sum(a) FROM t3}
    214 } {44.0}
    215 do_test select1-2.18 {
    216   set v [catch {execsql {SELECT XYZZY(f1) FROM test1}} msg]
    217   lappend v $msg
    218 } {1 {no such function: XYZZY}}
    219 do_test select1-2.19 {
    220   set v [catch {execsql {SELECT SUM(min(f1,f2)) FROM test1}} msg]
    221   lappend v $msg
    222 } {0 44}
    223 do_test select1-2.20 {
    224   set v [catch {execsql {SELECT SUM(min(f1)) FROM test1}} msg]
    225   lappend v $msg
    226 } {1 {misuse of aggregate function min()}}
    227 
    228 # Ticket #2526
    229 #
    230 do_test select1-2.21 {
    231   catchsql {
    232      SELECT min(f1) AS m FROM test1 GROUP BY f1 HAVING max(m+5)<10
    233   }
    234 } {1 {misuse of aliased aggregate m}}
    235 do_test select1-2.22 {
    236   catchsql {
    237      SELECT coalesce(min(f1)+5,11) AS m FROM test1
    238       GROUP BY f1
    239      HAVING max(m+5)<10
    240   }
    241 } {1 {misuse of aliased aggregate m}}
    242 do_test select1-2.23 {
    243   execsql {
    244     CREATE TABLE tkt2526(a,b,c PRIMARY KEY);
    245     INSERT INTO tkt2526 VALUES('x','y',NULL);
    246     INSERT INTO tkt2526 VALUES('x','z',NULL);
    247   }
    248   catchsql {
    249     SELECT count(a) AS cn FROM tkt2526 GROUP BY a HAVING cn<max(cn)
    250   }
    251 } {1 {misuse of aliased aggregate cn}}
    252 
    253 # WHERE clause expressions
    254 #
    255 do_test select1-3.1 {
    256   set v [catch {execsql {SELECT f1 FROM test1 WHERE f1<11}} msg]
    257   lappend v $msg
    258 } {0 {}}
    259 do_test select1-3.2 {
    260   set v [catch {execsql {SELECT f1 FROM test1 WHERE f1<=11}} msg]
    261   lappend v $msg
    262 } {0 11}
    263 do_test select1-3.3 {
    264   set v [catch {execsql {SELECT f1 FROM test1 WHERE f1=11}} msg]
    265   lappend v $msg
    266 } {0 11}
    267 do_test select1-3.4 {
    268   set v [catch {execsql {SELECT f1 FROM test1 WHERE f1>=11}} msg]
    269   lappend v [lsort $msg]
    270 } {0 {11 33}}
    271 do_test select1-3.5 {
    272   set v [catch {execsql {SELECT f1 FROM test1 WHERE f1>11}} msg]
    273   lappend v [lsort $msg]
    274 } {0 33}
    275 do_test select1-3.6 {
    276   set v [catch {execsql {SELECT f1 FROM test1 WHERE f1!=11}} msg]
    277   lappend v [lsort $msg]
    278 } {0 33}
    279 do_test select1-3.7 {
    280   set v [catch {execsql {SELECT f1 FROM test1 WHERE min(f1,f2)!=11}} msg]
    281   lappend v [lsort $msg]
    282 } {0 33}
    283 do_test select1-3.8 {
    284   set v [catch {execsql {SELECT f1 FROM test1 WHERE max(f1,f2)!=11}} msg]
    285   lappend v [lsort $msg]
    286 } {0 {11 33}}
    287 do_test select1-3.9 {
    288   set v [catch {execsql {SELECT f1 FROM test1 WHERE count(f1,f2)!=11}} msg]
    289   lappend v $msg
    290 } {1 {wrong number of arguments to function count()}}
    291 
    292 # ORDER BY expressions
    293 #
    294 do_test select1-4.1 {
    295   set v [catch {execsql {SELECT f1 FROM test1 ORDER BY f1}} msg]
    296   lappend v $msg
    297 } {0 {11 33}}
    298 do_test select1-4.2 {
    299   set v [catch {execsql {SELECT f1 FROM test1 ORDER BY -f1}} msg]
    300   lappend v $msg
    301 } {0 {33 11}}
    302 do_test select1-4.3 {
    303   set v [catch {execsql {SELECT f1 FROM test1 ORDER BY min(f1,f2)}} msg]
    304   lappend v $msg
    305 } {0 {11 33}}
    306 do_test select1-4.4 {
    307   set v [catch {execsql {SELECT f1 FROM test1 ORDER BY min(f1)}} msg]
    308   lappend v $msg
    309 } {1 {misuse of aggregate: min()}}
    310 
    311 # The restriction not allowing constants in the ORDER BY clause
    312 # has been removed.  See ticket #1768
    313 #do_test select1-4.5 {
    314 #  catchsql {
    315 #    SELECT f1 FROM test1 ORDER BY 8.4;
    316 #  }
    317 #} {1 {ORDER BY terms must not be non-integer constants}}
    318 #do_test select1-4.6 {
    319 #  catchsql {
    320 #    SELECT f1 FROM test1 ORDER BY '8.4';
    321 #  }
    322 #} {1 {ORDER BY terms must not be non-integer constants}}
    323 #do_test select1-4.7.1 {
    324 #  catchsql {
    325 #    SELECT f1 FROM test1 ORDER BY 'xyz';
    326 #  }
    327 #} {1 {ORDER BY terms must not be non-integer constants}}
    328 #do_test select1-4.7.2 {
    329 #  catchsql {
    330 #    SELECT f1 FROM test1 ORDER BY -8.4;
    331 #  }
    332 #} {1 {ORDER BY terms must not be non-integer constants}}
    333 #do_test select1-4.7.3 {
    334 #  catchsql {
    335 #    SELECT f1 FROM test1 ORDER BY +8.4;
    336 #  }
    337 #} {1 {ORDER BY terms must not be non-integer constants}}
    338 #do_test select1-4.7.4 {
    339 #  catchsql {
    340 #    SELECT f1 FROM test1 ORDER BY 4294967296; -- constant larger than 32 bits
    341 #  }
    342 #} {1 {ORDER BY terms must not be non-integer constants}}
    343 
    344 do_test select1-4.5 {
    345   execsql {
    346     SELECT f1 FROM test1 ORDER BY 8.4
    347   }
    348 } {11 33}
    349 do_test select1-4.6 {
    350   execsql {
    351     SELECT f1 FROM test1 ORDER BY '8.4'
    352   }
    353 } {11 33}
    354 
    355 do_test select1-4.8 {
    356   execsql {
    357     CREATE TABLE t5(a,b);
    358     INSERT INTO t5 VALUES(1,10);
    359     INSERT INTO t5 VALUES(2,9);
    360     SELECT * FROM t5 ORDER BY 1;
    361   }
    362 } {1 10 2 9}
    363 do_test select1-4.9.1 {
    364   execsql {
    365     SELECT * FROM t5 ORDER BY 2;
    366   }
    367 } {2 9 1 10}
    368 do_test select1-4.9.2 {
    369   execsql {
    370     SELECT * FROM t5 ORDER BY +2;
    371   }
    372 } {2 9 1 10}
    373 do_test select1-4.10.1 {
    374   catchsql {
    375     SELECT * FROM t5 ORDER BY 3;
    376   }
    377 } {1 {1st ORDER BY term out of range - should be between 1 and 2}}
    378 do_test select1-4.10.2 {
    379   catchsql {
    380     SELECT * FROM t5 ORDER BY -1;
    381   }
    382 } {1 {1st ORDER BY term out of range - should be between 1 and 2}}
    383 do_test select1-4.11 {
    384   execsql {
    385     INSERT INTO t5 VALUES(3,10);
    386     SELECT * FROM t5 ORDER BY 2, 1 DESC;
    387   }
    388 } {2 9 3 10 1 10}
    389 do_test select1-4.12 {
    390   execsql {
    391     SELECT * FROM t5 ORDER BY 1 DESC, b;
    392   }
    393 } {3 10 2 9 1 10}
    394 do_test select1-4.13 {
    395   execsql {
    396     SELECT * FROM t5 ORDER BY b DESC, 1;
    397   }
    398 } {1 10 3 10 2 9}
    399 
    400 
    401 # ORDER BY ignored on an aggregate query
    402 #
    403 do_test select1-5.1 {
    404   set v [catch {execsql {SELECT max(f1) FROM test1 ORDER BY f2}} msg]
    405   lappend v $msg
    406 } {0 33}
    407 
    408 execsql {CREATE TABLE test2(t1 text, t2 text)}
    409 execsql {INSERT INTO test2 VALUES('abc','xyz')}
    410 
    411 # Check for column naming
    412 #
    413 do_test select1-6.1 {
    414   set v [catch {execsql2 {SELECT f1 FROM test1 ORDER BY f2}} msg]
    415   lappend v $msg
    416 } {0 {f1 11 f1 33}}
    417 do_test select1-6.1.1 {
    418   db eval {PRAGMA full_column_names=on}
    419   set v [catch {execsql2 {SELECT f1 FROM test1 ORDER BY f2}} msg]
    420   lappend v $msg
    421 } {0 {test1.f1 11 test1.f1 33}}
    422 do_test select1-6.1.2 {
    423   set v [catch {execsql2 {SELECT f1 as 'f1' FROM test1 ORDER BY f2}} msg]
    424   lappend v $msg
    425 } {0 {f1 11 f1 33}}
    426 do_test select1-6.1.3 {
    427   set v [catch {execsql2 {SELECT * FROM test1 WHERE f1==11}} msg]
    428   lappend v $msg
    429 } {0 {f1 11 f2 22}}
    430 do_test select1-6.1.4 {
    431   set v [catch {execsql2 {SELECT DISTINCT * FROM test1 WHERE f1==11}} msg]
    432   db eval {PRAGMA full_column_names=off}
    433   lappend v $msg
    434 } {0 {f1 11 f2 22}}
    435 do_test select1-6.1.5 {
    436   set v [catch {execsql2 {SELECT * FROM test1 WHERE f1==11}} msg]
    437   lappend v $msg
    438 } {0 {f1 11 f2 22}}
    439 do_test select1-6.1.6 {
    440   set v [catch {execsql2 {SELECT DISTINCT * FROM test1 WHERE f1==11}} msg]
    441   lappend v $msg
    442 } {0 {f1 11 f2 22}}
    443 do_test select1-6.2 {
    444   set v [catch {execsql2 {SELECT f1 as xyzzy FROM test1 ORDER BY f2}} msg]
    445   lappend v $msg
    446 } {0 {xyzzy 11 xyzzy 33}}
    447 do_test select1-6.3 {
    448   set v [catch {execsql2 {SELECT f1 as "xyzzy" FROM test1 ORDER BY f2}} msg]
    449   lappend v $msg
    450 } {0 {xyzzy 11 xyzzy 33}}
    451 do_test select1-6.3.1 {
    452   set v [catch {execsql2 {SELECT f1 as 'xyzzy ' FROM test1 ORDER BY f2}} msg]
    453   lappend v $msg
    454 } {0 {{xyzzy } 11 {xyzzy } 33}}
    455 do_test select1-6.4 {
    456   set v [catch {execsql2 {SELECT f1+F2 as xyzzy FROM test1 ORDER BY f2}} msg]
    457   lappend v $msg
    458 } {0 {xyzzy 33 xyzzy 77}}
    459 do_test select1-6.4a {
    460   set v [catch {execsql2 {SELECT f1+F2 FROM test1 ORDER BY f2}} msg]
    461   lappend v $msg
    462 } {0 {f1+F2 33 f1+F2 77}}
    463 do_test select1-6.5 {
    464   set v [catch {execsql2 {SELECT test1.f1+F2 FROM test1 ORDER BY f2}} msg]
    465   lappend v $msg
    466 } {0 {test1.f1+F2 33 test1.f1+F2 77}}
    467 do_test select1-6.5.1 {
    468   execsql2 {PRAGMA full_column_names=on}
    469   set v [catch {execsql2 {SELECT test1.f1+F2 FROM test1 ORDER BY f2}} msg]
    470   execsql2 {PRAGMA full_column_names=off}
    471   lappend v $msg
    472 } {0 {test1.f1+F2 33 test1.f1+F2 77}}
    473 do_test select1-6.6 {
    474   set v [catch {execsql2 {SELECT test1.f1+F2, t1 FROM test1, test2 
    475          ORDER BY f2}} msg]
    476   lappend v $msg
    477 } {0 {test1.f1+F2 33 t1 abc test1.f1+F2 77 t1 abc}}
    478 do_test select1-6.7 {
    479   set v [catch {execsql2 {SELECT A.f1, t1 FROM test1 as A, test2 
    480          ORDER BY f2}} msg]
    481   lappend v $msg
    482 } {0 {f1 11 t1 abc f1 33 t1 abc}}
    483 do_test select1-6.8 {
    484   set v [catch {execsql2 {SELECT A.f1, f1 FROM test1 as A, test1 as B 
    485          ORDER BY f2}} msg]
    486   lappend v $msg
    487 } {1 {ambiguous column name: f1}}
    488 do_test select1-6.8b {
    489   set v [catch {execsql2 {SELECT A.f1, B.f1 FROM test1 as A, test1 as B 
    490          ORDER BY f2}} msg]
    491   lappend v $msg
    492 } {1 {ambiguous column name: f2}}
    493 do_test select1-6.8c {
    494   set v [catch {execsql2 {SELECT A.f1, f1 FROM test1 as A, test1 as A 
    495          ORDER BY f2}} msg]
    496   lappend v $msg
    497 } {1 {ambiguous column name: A.f1}}
    498 do_test select1-6.9.1 {
    499   set v [catch {execsql {SELECT A.f1, B.f1 FROM test1 as A, test1 as B 
    500          ORDER BY A.f1, B.f1}} msg]
    501   lappend v $msg
    502 } {0 {11 11 11 33 33 11 33 33}}
    503 do_test select1-6.9.2 {
    504   set v [catch {execsql2 {SELECT A.f1, B.f1 FROM test1 as A, test1 as B 
    505          ORDER BY A.f1, B.f1}} msg]
    506   lappend v $msg
    507 } {0 {f1 11 f1 11 f1 33 f1 33 f1 11 f1 11 f1 33 f1 33}}
    508 
    509 do_test select1-6.9.3 {
    510   db eval {
    511      PRAGMA short_column_names=OFF;
    512      PRAGMA full_column_names=OFF;
    513   }
    514   execsql2 {
    515      SELECT test1 . f1, test1 . f2 FROM test1 LIMIT 1
    516   }
    517 } {{test1 . f1} 11 {test1 . f2} 22}
    518 do_test select1-6.9.4 {
    519   db eval {
    520      PRAGMA short_column_names=OFF;
    521      PRAGMA full_column_names=ON;
    522   }
    523   execsql2 {
    524      SELECT test1 . f1, test1 . f2 FROM test1 LIMIT 1
    525   }
    526 } {test1.f1 11 test1.f2 22}
    527 do_test select1-6.9.5 {
    528   db eval {
    529      PRAGMA short_column_names=OFF;
    530      PRAGMA full_column_names=ON;
    531   }
    532   execsql2 {
    533      SELECT 123.45;
    534   }
    535 } {123.45 123.45}
    536 do_test select1-6.9.6 {
    537   execsql2 {
    538      SELECT * FROM test1 a, test1 b LIMIT 1
    539   }
    540 } {a.f1 11 a.f2 22 b.f1 11 b.f2 22}
    541 do_test select1-6.9.7 {
    542   set x [execsql2 {
    543      SELECT * FROM test1 a, (select 5, 6) LIMIT 1
    544   }]
    545   regsub -all {subquery_[0-9a-fA-F]+_} $x {subquery} x
    546   set x
    547 } {a.f1 11 a.f2 22 sqlite_subquery.5 5 sqlite_subquery.6 6}
    548 do_test select1-6.9.8 {
    549   set x [execsql2 {
    550      SELECT * FROM test1 a, (select 5 AS x, 6 AS y) AS b LIMIT 1
    551   }]
    552   regsub -all {subquery_[0-9a-fA-F]+_} $x {subquery} x
    553   set x
    554 } {a.f1 11 a.f2 22 b.x 5 b.y 6}
    555 do_test select1-6.9.9 {
    556   execsql2 {
    557      SELECT a.f1, b.f2 FROM test1 a, test1 b LIMIT 1
    558   }
    559 } {test1.f1 11 test1.f2 22}
    560 do_test select1-6.9.10 {
    561   execsql2 {
    562      SELECT f1, t1 FROM test1, test2 LIMIT 1
    563   }
    564 } {test1.f1 11 test2.t1 abc}
    565 do_test select1-6.9.11 {
    566   db eval {
    567      PRAGMA short_column_names=ON;
    568      PRAGMA full_column_names=ON;
    569   }
    570   execsql2 {
    571      SELECT a.f1, b.f2 FROM test1 a, test1 b LIMIT 1
    572   }
    573 } {test1.f1 11 test1.f2 22}
    574 do_test select1-6.9.12 {
    575   execsql2 {
    576      SELECT f1, t1 FROM test1, test2 LIMIT 1
    577   }
    578 } {test1.f1 11 test2.t1 abc}
    579 do_test select1-6.9.13 {
    580   db eval {
    581      PRAGMA short_column_names=ON;
    582      PRAGMA full_column_names=OFF;
    583   }
    584   execsql2 {
    585      SELECT a.f1, b.f1 FROM test1 a, test1 b LIMIT 1
    586   }
    587 } {f1 11 f1 11}
    588 do_test select1-6.9.14 {
    589   execsql2 {
    590      SELECT f1, t1 FROM test1, test2 LIMIT 1
    591   }
    592 } {f1 11 t1 abc}
    593 do_test select1-6.9.15 {
    594   db eval {
    595      PRAGMA short_column_names=OFF;
    596      PRAGMA full_column_names=ON;
    597   }
    598   execsql2 {
    599      SELECT a.f1, b.f1 FROM test1 a, test1 b LIMIT 1
    600   }
    601 } {test1.f1 11 test1.f1 11}
    602 do_test select1-6.9.16 {
    603   execsql2 {
    604      SELECT f1, t1 FROM test1, test2 LIMIT 1
    605   }
    606 } {test1.f1 11 test2.t1 abc}
    607 
    608 
    609 db eval {
    610   PRAGMA short_column_names=ON;
    611   PRAGMA full_column_names=OFF;
    612 }
    613 
    614 ifcapable compound {
    615 do_test select1-6.10 {
    616   set v [catch {execsql2 {
    617     SELECT f1 FROM test1 UNION SELECT f2 FROM test1
    618     ORDER BY f2;
    619   }} msg]
    620   lappend v $msg
    621 } {0 {f1 11 f1 22 f1 33 f1 44}}
    622 do_test select1-6.11 {
    623   set v [catch {execsql2 {
    624     SELECT f1 FROM test1 UNION SELECT f2+100 FROM test1
    625     ORDER BY f2+101;
    626   }} msg]
    627   lappend v $msg
    628 } {1 {1st ORDER BY term does not match any column in the result set}}
    629 
    630 # Ticket #2296
    631 ifcapable subquery&&compound {
    632 do_test select1-6.20 {
    633    execsql {
    634      CREATE TABLE t6(a TEXT, b TEXT);
    635      INSERT INTO t6 VALUES('a','0');
    636      INSERT INTO t6 VALUES('b','1');
    637      INSERT INTO t6 VALUES('c','2');
    638      INSERT INTO t6 VALUES('d','3');
    639      SELECT a FROM t6 WHERE b IN 
    640         (SELECT b FROM t6 WHERE a<='b' UNION SELECT '3' AS x
    641                  ORDER BY 1 LIMIT 1)
    642    }
    643 } {a}
    644 do_test select1-6.21 {
    645    execsql {
    646      SELECT a FROM t6 WHERE b IN 
    647         (SELECT b FROM t6 WHERE a<='b' UNION SELECT '3' AS x
    648                  ORDER BY 1 DESC LIMIT 1)
    649    }
    650 } {d}
    651 do_test select1-6.22 {
    652    execsql {
    653      SELECT a FROM t6 WHERE b IN 
    654         (SELECT b FROM t6 WHERE a<='b' UNION SELECT '3' AS x
    655                  ORDER BY b LIMIT 2)
    656      ORDER BY a;
    657    }
    658 } {a b}
    659 do_test select1-6.23 {
    660    execsql {
    661      SELECT a FROM t6 WHERE b IN 
    662         (SELECT b FROM t6 WHERE a<='b' UNION SELECT '3' AS x
    663                  ORDER BY x DESC LIMIT 2)
    664      ORDER BY a;
    665    }
    666 } {b d}
    667 }
    668 
    669 } ;#ifcapable compound
    670 
    671 do_test select1-7.1 {
    672   set v [catch {execsql {
    673      SELECT f1 FROM test1 WHERE f2=;
    674   }} msg]
    675   lappend v $msg
    676 } {1 {near ";": syntax error}}
    677 ifcapable compound {
    678 do_test select1-7.2 {
    679   set v [catch {execsql {
    680      SELECT f1 FROM test1 UNION SELECT WHERE;
    681   }} msg]
    682   lappend v $msg
    683 } {1 {near "WHERE": syntax error}}
    684 } ;# ifcapable compound
    685 do_test select1-7.3 {
    686   set v [catch {execsql {SELECT f1 FROM test1 as 'hi', test2 as}} msg]
    687   lappend v $msg
    688 } {1 {near "as": syntax error}}
    689 do_test select1-7.4 {
    690   set v [catch {execsql {
    691      SELECT f1 FROM test1 ORDER BY;
    692   }} msg]
    693   lappend v $msg
    694 } {1 {near ";": syntax error}}
    695 do_test select1-7.5 {
    696   set v [catch {execsql {
    697      SELECT f1 FROM test1 ORDER BY f1 desc, f2 where;
    698   }} msg]
    699   lappend v $msg
    700 } {1 {near "where": syntax error}}
    701 do_test select1-7.6 {
    702   set v [catch {execsql {
    703      SELECT count(f1,f2 FROM test1;
    704   }} msg]
    705   lappend v $msg
    706 } {1 {near "FROM": syntax error}}
    707 do_test select1-7.7 {
    708   set v [catch {execsql {
    709      SELECT count(f1,f2+) FROM test1;
    710   }} msg]
    711   lappend v $msg
    712 } {1 {near ")": syntax error}}
    713 do_test select1-7.8 {
    714   set v [catch {execsql {
    715      SELECT f1 FROM test1 ORDER BY f2, f1+;
    716   }} msg]
    717   lappend v $msg
    718 } {1 {near ";": syntax error}}
    719 do_test select1-7.9 {
    720   catchsql {
    721      SELECT f1 FROM test1 LIMIT 5+3 OFFSET 11 ORDER BY f2;
    722   }
    723 } {1 {near "ORDER": syntax error}}
    724 
    725 do_test select1-8.1 {
    726   execsql {SELECT f1 FROM test1 WHERE 4.3+2.4 OR 1 ORDER BY f1}
    727 } {11 33}
    728 do_test select1-8.2 {
    729   execsql {
    730     SELECT f1 FROM test1 WHERE ('x' || f1) BETWEEN 'x10' AND 'x20'
    731     ORDER BY f1
    732   }
    733 } {11}
    734 do_test select1-8.3 {
    735   execsql {
    736     SELECT f1 FROM test1 WHERE 5-3==2
    737     ORDER BY f1
    738   }
    739 } {11 33}
    740 
    741 # TODO: This test is failing because f1 is now being loaded off the
    742 # disk as a vdbe integer, not a string. Hence the value of f1/(f1-11)
    743 # changes because of rounding. Disable the test for now.
    744 if 0 {
    745 do_test select1-8.4 {
    746   execsql {
    747     SELECT coalesce(f1/(f1-11),'x'),
    748            coalesce(min(f1/(f1-11),5),'y'),
    749            coalesce(max(f1/(f1-33),6),'z')
    750     FROM test1 ORDER BY f1
    751   }
    752 } {x y 6 1.5 1.5 z}
    753 }
    754 do_test select1-8.5 {
    755   execsql {
    756     SELECT min(1,2,3), -max(1,2,3)
    757     FROM test1 ORDER BY f1
    758   }
    759 } {1 -3 1 -3}
    760 
    761 
    762 # Check the behavior when the result set is empty
    763 #
    764 # SQLite v3 always sets r(*).
    765 #
    766 # do_test select1-9.1 {
    767 #   catch {unset r}
    768 #   set r(*) {}
    769 #   db eval {SELECT * FROM test1 WHERE f1<0} r {}
    770 #   set r(*)
    771 # } {}
    772 do_test select1-9.2 {
    773   execsql {PRAGMA empty_result_callbacks=on}
    774   catch {unset r}
    775   set r(*) {}
    776   db eval {SELECT * FROM test1 WHERE f1<0} r {}
    777   set r(*)
    778 } {f1 f2}
    779 ifcapable subquery {
    780   do_test select1-9.3 {
    781     set r(*) {}
    782     db eval {SELECT * FROM test1 WHERE f1<(select count(*) from test2)} r {}
    783     set r(*)
    784   } {f1 f2}
    785 }
    786 do_test select1-9.4 {
    787   set r(*) {}
    788   db eval {SELECT * FROM test1 ORDER BY f1} r {}
    789   set r(*)
    790 } {f1 f2}
    791 do_test select1-9.5 {
    792   set r(*) {}
    793   db eval {SELECT * FROM test1 WHERE f1<0 ORDER BY f1} r {}
    794   set r(*)
    795 } {f1 f2}
    796 unset r
    797 
    798 # Check for ORDER BY clauses that refer to an AS name in the column list
    799 #
    800 do_test select1-10.1 {
    801   execsql {
    802     SELECT f1 AS x FROM test1 ORDER BY x
    803   }
    804 } {11 33}
    805 do_test select1-10.2 {
    806   execsql {
    807     SELECT f1 AS x FROM test1 ORDER BY -x
    808   }
    809 } {33 11}
    810 do_test select1-10.3 {
    811   execsql {
    812     SELECT f1-23 AS x FROM test1 ORDER BY abs(x)
    813   }
    814 } {10 -12}
    815 do_test select1-10.4 {
    816   execsql {
    817     SELECT f1-23 AS x FROM test1 ORDER BY -abs(x)
    818   }
    819 } {-12 10}
    820 do_test select1-10.5 {
    821   execsql {
    822     SELECT f1-22 AS x, f2-22 as y FROM test1
    823   }
    824 } {-11 0 11 22}
    825 do_test select1-10.6 {
    826   execsql {
    827     SELECT f1-22 AS x, f2-22 as y FROM test1 WHERE x>0 AND y<50
    828   }
    829 } {11 22}
    830 do_test select1-10.7 {
    831   execsql {
    832     SELECT f1 COLLATE nocase AS x FROM test1 ORDER BY x
    833   }
    834 } {11 33}
    835 
    836 # Check the ability to specify "TABLE.*" in the result set of a SELECT
    837 #
    838 do_test select1-11.1 {
    839   execsql {
    840     DELETE FROM t3;
    841     DELETE FROM t4;
    842     INSERT INTO t3 VALUES(1,2);
    843     INSERT INTO t4 VALUES(3,4);
    844     SELECT * FROM t3, t4;
    845   }
    846 } {1 2 3 4}
    847 do_test select1-11.2.1 {
    848   execsql {
    849     SELECT * FROM t3, t4;
    850   }
    851 } {1 2 3 4}
    852 do_test select1-11.2.2 {
    853   execsql2 {
    854     SELECT * FROM t3, t4;
    855   }
    856 } {a 3 b 4 a 3 b 4}
    857 do_test select1-11.4.1 {
    858   execsql {
    859     SELECT t3.*, t4.b FROM t3, t4;
    860   }
    861 } {1 2 4}
    862 do_test select1-11.4.2 {
    863   execsql {
    864     SELECT "t3".*, t4.b FROM t3, t4;
    865   }
    866 } {1 2 4}
    867 do_test select1-11.5.1 {
    868   execsql2 {
    869     SELECT t3.*, t4.b FROM t3, t4;
    870   }
    871 } {a 1 b 4 b 4}
    872 do_test select1-11.6 {
    873   execsql2 {
    874     SELECT x.*, y.b FROM t3 AS x, t4 AS y;
    875   }
    876 } {a 1 b 4 b 4}
    877 do_test select1-11.7 {
    878   execsql {
    879     SELECT t3.b, t4.* FROM t3, t4;
    880   }
    881 } {2 3 4}
    882 do_test select1-11.8 {
    883   execsql2 {
    884     SELECT t3.b, t4.* FROM t3, t4;
    885   }
    886 } {b 4 a 3 b 4}
    887 do_test select1-11.9 {
    888   execsql2 {
    889     SELECT x.b, y.* FROM t3 AS x, t4 AS y;
    890   }
    891 } {b 4 a 3 b 4}
    892 do_test select1-11.10 {
    893   catchsql {
    894     SELECT t5.* FROM t3, t4;
    895   }
    896 } {1 {no such table: t5}}
    897 do_test select1-11.11 {
    898   catchsql {
    899     SELECT t3.* FROM t3 AS x, t4;
    900   }
    901 } {1 {no such table: t3}}
    902 ifcapable subquery {
    903   do_test select1-11.12 {
    904     execsql2 {
    905       SELECT t3.* FROM t3, (SELECT max(a), max(b) FROM t4)
    906     }
    907   } {a 1 b 2}
    908   do_test select1-11.13 {
    909     execsql2 {
    910       SELECT t3.* FROM (SELECT max(a), max(b) FROM t4), t3
    911     }
    912   } {a 1 b 2}
    913   do_test select1-11.14 {
    914     execsql2 {
    915       SELECT * FROM t3, (SELECT max(a), max(b) FROM t4) AS 'tx'
    916     }
    917   } {a 1 b 2 max(a) 3 max(b) 4}
    918   do_test select1-11.15 {
    919     execsql2 {
    920       SELECT y.*, t3.* FROM t3, (SELECT max(a), max(b) FROM t4) AS y
    921     }
    922   } {max(a) 3 max(b) 4 a 1 b 2}
    923 }
    924 do_test select1-11.16 {
    925   execsql2 {
    926     SELECT y.* FROM t3 as y, t4 as z
    927   }
    928 } {a 1 b 2}
    929 
    930 # Tests of SELECT statements without a FROM clause.
    931 #
    932 do_test select1-12.1 {
    933   execsql2 {
    934     SELECT 1+2+3
    935   }
    936 } {1+2+3 6}
    937 do_test select1-12.2 {
    938   execsql2 {
    939     SELECT 1,'hello',2
    940   }
    941 } {1 1 'hello' hello 2 2}
    942 do_test select1-12.3 {
    943   execsql2 {
    944     SELECT 1 AS 'a','hello' AS 'b',2 AS 'c'
    945   }
    946 } {a 1 b hello c 2}
    947 do_test select1-12.4 {
    948   execsql {
    949     DELETE FROM t3;
    950     INSERT INTO t3 VALUES(1,2);
    951   }
    952 } {}
    953 
    954 ifcapable compound {
    955 do_test select1-12.5 {
    956   execsql {
    957     SELECT * FROM t3 UNION SELECT 3 AS 'a', 4 ORDER BY a;
    958   }
    959 } {1 2 3 4}
    960 
    961 do_test select1-12.6 {
    962   execsql {
    963     SELECT 3, 4 UNION SELECT * FROM t3;
    964   }
    965 } {1 2 3 4}
    966 } ;# ifcapable compound
    967 
    968 ifcapable subquery {
    969   do_test select1-12.7 {
    970     execsql {
    971       SELECT * FROM t3 WHERE a=(SELECT 1);
    972     }
    973   } {1 2}
    974   do_test select1-12.8 {
    975     execsql {
    976       SELECT * FROM t3 WHERE a=(SELECT 2);
    977     }
    978   } {}
    979 }
    980 
    981 ifcapable {compound && subquery} {
    982   do_test select1-12.9 {
    983     execsql2 {
    984       SELECT x FROM (
    985         SELECT a AS x, b AS y FROM t3 UNION SELECT a,b FROM t4 ORDER BY a,b
    986       ) ORDER BY x;
    987     }
    988   } {x 1 x 3}
    989   do_test select1-12.10 {
    990     execsql2 {
    991       SELECT z.x FROM (
    992         SELECT a AS x,b AS y FROM t3 UNION SELECT a, b FROM t4 ORDER BY a,b
    993       ) AS 'z' ORDER BY x;
    994     }
    995   } {x 1 x 3}
    996 } ;# ifcapable compound
    997 
    998 
    999 # Check for a VDBE stack growth problem that existed at one point.
   1000 #
   1001 ifcapable subquery {
   1002   do_test select1-13.1 {
   1003     execsql {
   1004       BEGIN;
   1005       create TABLE abc(a, b, c, PRIMARY KEY(a, b));
   1006       INSERT INTO abc VALUES(1, 1, 1);
   1007     }
   1008     for {set i 0} {$i<10} {incr i} {
   1009       execsql {
   1010         INSERT INTO abc SELECT a+(select max(a) FROM abc), 
   1011             b+(select max(a) FROM abc), c+(select max(a) FROM abc) FROM abc;
   1012       }
   1013     }
   1014     execsql {COMMIT}
   1015   
   1016     # This used to seg-fault when the problem existed.
   1017     execsql {
   1018       SELECT count(
   1019         (SELECT a FROM abc WHERE a = NULL AND b >= upper.c) 
   1020       ) FROM abc AS upper;
   1021     }
   1022   } {0}
   1023 }
   1024 
   1025 foreach tab [db eval {SELECT name FROM sqlite_master WHERE type = 'table'}] {
   1026   db eval "DROP TABLE $tab"
   1027 }
   1028 db close
   1029 sqlite3 db test.db
   1030 
   1031 do_test select1-14.1 {
   1032   execsql { 
   1033     SELECT * FROM sqlite_master WHERE rowid>10; 
   1034     SELECT * FROM sqlite_master WHERE rowid=10;
   1035     SELECT * FROM sqlite_master WHERE rowid<10;
   1036     SELECT * FROM sqlite_master WHERE rowid<=10;
   1037     SELECT * FROM sqlite_master WHERE rowid>=10;
   1038     SELECT * FROM sqlite_master;
   1039   }
   1040 } {}
   1041 do_test select1-14.2 {
   1042   execsql { 
   1043     SELECT 10 IN (SELECT rowid FROM sqlite_master);
   1044   }
   1045 } {0}
   1046 
   1047 if {[db one {PRAGMA locking_mode}]=="normal"} {
   1048   # Check that ticket #3771 has been fixed.  This test does not
   1049   # work with locking_mode=EXCLUSIVE so disable in that case.
   1050   #
   1051   do_test select1-15.1 {
   1052     execsql {
   1053       CREATE TABLE t1(a);
   1054       CREATE INDEX i1 ON t1(a);
   1055       INSERT INTO t1 VALUES(1);
   1056       INSERT INTO t1 VALUES(2);
   1057       INSERT INTO t1 VALUES(3);
   1058     }
   1059   } {}
   1060   do_test select1-15.2 {
   1061     sqlite3 db2 test.db
   1062     execsql { DROP INDEX i1 } db2
   1063     db2 close
   1064   } {}
   1065   do_test select1-15.3 {
   1066     execsql { SELECT 2 IN (SELECT a FROM t1) }
   1067   } {1}
   1068 }
   1069   
   1070 finish_test
   1071