File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / select1.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    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.1.1.1 2012/02/21 17:04:16 misho 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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>