Annotation of embedaddon/sqlite3/test/select1.test, revision 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>