persistentstorage/sqlite3api/TEST/TclScript/select1.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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.65 2008/08/04 03:51:24 danielk1977 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(f1)}}
       
   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 db close
       
  1026 file delete -force test.db
       
  1027 sqlite3 db test.db
       
  1028 do_test select1-14.1 {
       
  1029   execsql { 
       
  1030     SELECT * FROM sqlite_master WHERE rowid>10; 
       
  1031     SELECT * FROM sqlite_master WHERE rowid=10;
       
  1032     SELECT * FROM sqlite_master WHERE rowid<10;
       
  1033     SELECT * FROM sqlite_master WHERE rowid<=10;
       
  1034     SELECT * FROM sqlite_master WHERE rowid>=10;
       
  1035     SELECT * FROM sqlite_master;
       
  1036   }
       
  1037 } {}
       
  1038 do_test select1-14.2 {
       
  1039   execsql { 
       
  1040     SELECT 10 IN (SELECT rowid FROM sqlite_master);
       
  1041   }
       
  1042 } {0}
       
  1043 
       
  1044 finish_test