| OLD | NEW | 
 | (Empty) | 
|     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 |  | 
| OLD | NEW |