Annotation of embedaddon/sqlite3/test/select1.test, revision 1.1.1.1

1.1       misho       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

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