Annotation of embedaddon/sqlite3/test/misc2.test, revision 1.1
1.1 ! misho 1: # 2003 June 21
! 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.
! 12: #
! 13: # This file implements tests for miscellanous features that were
! 14: # left out of other test files.
! 15: #
! 16: # $Id: misc2.test,v 1.28 2007/09/12 17:01:45 danielk1977 Exp $
! 17:
! 18: set testdir [file dirname $argv0]
! 19: source $testdir/tester.tcl
! 20:
! 21: # The tests in this file were written before SQLite supported recursive
! 22: # trigger invocation, and some tests depend on that to pass. So disable
! 23: # recursive triggers for this file.
! 24: catchsql { pragma recursive_triggers = off }
! 25:
! 26: ifcapable {trigger} {
! 27: # Test for ticket #360
! 28: #
! 29: do_test misc2-1.1 {
! 30: catchsql {
! 31: CREATE TABLE FOO(bar integer);
! 32: CREATE TRIGGER foo_insert BEFORE INSERT ON foo BEGIN
! 33: SELECT CASE WHEN (NOT new.bar BETWEEN 0 AND 20)
! 34: THEN raise(rollback, 'aiieee') END;
! 35: END;
! 36: INSERT INTO foo(bar) VALUES (1);
! 37: }
! 38: } {0 {}}
! 39: do_test misc2-1.2 {
! 40: catchsql {
! 41: INSERT INTO foo(bar) VALUES (111);
! 42: }
! 43: } {1 aiieee}
! 44: } ;# endif trigger
! 45:
! 46: # Make sure ROWID works on a view and a subquery. Ticket #364
! 47: #
! 48: do_test misc2-2.1 {
! 49: execsql {
! 50: CREATE TABLE t1(a,b,c);
! 51: INSERT INTO t1 VALUES(1,2,3);
! 52: CREATE TABLE t2(a,b,c);
! 53: INSERT INTO t2 VALUES(7,8,9);
! 54: }
! 55: } {}
! 56: ifcapable subquery {
! 57: do_test misc2-2.2 {
! 58: execsql {
! 59: SELECT rowid, * FROM (SELECT * FROM t1, t2);
! 60: }
! 61: } {{} 1 2 3 7 8 9}
! 62: }
! 63: ifcapable view {
! 64: do_test misc2-2.3 {
! 65: execsql {
! 66: CREATE VIEW v1 AS SELECT * FROM t1, t2;
! 67: SELECT rowid, * FROM v1;
! 68: }
! 69: } {{} 1 2 3 7 8 9}
! 70: } ;# ifcapable view
! 71:
! 72: # Ticket #2002 and #1952.
! 73: ifcapable subquery {
! 74: do_test misc2-2.4 {
! 75: execsql2 {
! 76: SELECT * FROM (SELECT a, b AS 'a', c AS 'a', 4 AS 'a' FROM t1)
! 77: }
! 78: } {a 1 a:1 2 a:2 3 a:3 4}
! 79: }
! 80:
! 81: # Check name binding precedence. Ticket #387
! 82: #
! 83: do_test misc2-3.1 {
! 84: catchsql {
! 85: SELECT t1.b+t2.b AS a, t1.a, t2.a FROM t1, t2 WHERE a==10
! 86: }
! 87: } {1 {ambiguous column name: a}}
! 88:
! 89: # Make sure 32-bit integer overflow is handled properly in queries.
! 90: # ticket #408
! 91: #
! 92: do_test misc2-4.1 {
! 93: execsql {
! 94: INSERT INTO t1 VALUES(4000000000,'a','b');
! 95: SELECT a FROM t1 WHERE a>1;
! 96: }
! 97: } {4000000000}
! 98: do_test misc2-4.2 {
! 99: execsql {
! 100: INSERT INTO t1 VALUES(2147483648,'b2','c2');
! 101: INSERT INTO t1 VALUES(2147483647,'b3','c3');
! 102: SELECT a FROM t1 WHERE a>2147483647;
! 103: }
! 104: } {4000000000 2147483648}
! 105: do_test misc2-4.3 {
! 106: execsql {
! 107: SELECT a FROM t1 WHERE a<2147483648;
! 108: }
! 109: } {1 2147483647}
! 110: do_test misc2-4.4 {
! 111: execsql {
! 112: SELECT a FROM t1 WHERE a<=2147483648;
! 113: }
! 114: } {1 2147483648 2147483647}
! 115: do_test misc2-4.5 {
! 116: execsql {
! 117: SELECT a FROM t1 WHERE a<10000000000;
! 118: }
! 119: } {1 4000000000 2147483648 2147483647}
! 120: do_test misc2-4.6 {
! 121: execsql {
! 122: SELECT a FROM t1 WHERE a<1000000000000 ORDER BY 1;
! 123: }
! 124: } {1 2147483647 2147483648 4000000000}
! 125:
! 126: # There were some issues with expanding a SrcList object using a call
! 127: # to sqliteSrcListAppend() if the SrcList had previously been duplicated
! 128: # using a call to sqliteSrcListDup(). Ticket #416. The following test
! 129: # makes sure the problem has been fixed.
! 130: #
! 131: ifcapable view {
! 132: do_test misc2-5.1 {
! 133: execsql {
! 134: CREATE TABLE x(a,b);
! 135: CREATE VIEW y AS
! 136: SELECT x1.b AS p, x2.b AS q FROM x AS x1, x AS x2 WHERE x1.a=x2.a;
! 137: CREATE VIEW z AS
! 138: SELECT y1.p, y2.p FROM y AS y1, y AS y2 WHERE y1.q=y2.q;
! 139: SELECT * from z;
! 140: }
! 141: } {}
! 142: }
! 143:
! 144: # Make sure we can open a database with an empty filename. What this
! 145: # does is store the database in a temporary file that is deleted when
! 146: # the database is closed. Ticket #432.
! 147: #
! 148: do_test misc2-6.1 {
! 149: db close
! 150: sqlite3 db {}
! 151: execsql {
! 152: CREATE TABLE t1(a,b);
! 153: INSERT INTO t1 VALUES(1,2);
! 154: SELECT * FROM t1;
! 155: }
! 156: } {1 2}
! 157:
! 158: # Make sure we get an error message (not a segfault) on an attempt to
! 159: # update a table from within the callback of a select on that same
! 160: # table.
! 161: #
! 162: # 2006-08-16: This has changed. It is now permitted to update
! 163: # the table being SELECTed from within the callback of the query.
! 164: #
! 165: ifcapable tclvar {
! 166: do_test misc2-7.1 {
! 167: db close
! 168: forcedelete test.db
! 169: sqlite3 db test.db
! 170: execsql {
! 171: CREATE TABLE t1(x);
! 172: INSERT INTO t1 VALUES(1);
! 173: INSERT INTO t1 VALUES(2);
! 174: INSERT INTO t1 VALUES(3);
! 175: SELECT * FROM t1;
! 176: }
! 177: } {1 2 3}
! 178: do_test misc2-7.2 {
! 179: set rc [catch {
! 180: db eval {SELECT rowid FROM t1} {} {
! 181: db eval "DELETE FROM t1 WHERE rowid=$rowid"
! 182: }
! 183: } msg]
! 184: lappend rc $msg
! 185: } {0 {}}
! 186: do_test misc2-7.3 {
! 187: execsql {SELECT * FROM t1}
! 188: } {}
! 189: do_test misc2-7.4 {
! 190: execsql {
! 191: DELETE FROM t1;
! 192: INSERT INTO t1 VALUES(1);
! 193: INSERT INTO t1 VALUES(2);
! 194: INSERT INTO t1 VALUES(3);
! 195: INSERT INTO t1 VALUES(4);
! 196: }
! 197: db eval {SELECT rowid, x FROM t1} {
! 198: if {$x & 1} {
! 199: db eval {DELETE FROM t1 WHERE rowid=$rowid}
! 200: }
! 201: }
! 202: execsql {SELECT * FROM t1}
! 203: } {2 4}
! 204: do_test misc2-7.5 {
! 205: execsql {
! 206: DELETE FROM t1;
! 207: INSERT INTO t1 VALUES(1);
! 208: INSERT INTO t1 VALUES(2);
! 209: INSERT INTO t1 VALUES(3);
! 210: INSERT INTO t1 VALUES(4);
! 211: }
! 212: db eval {SELECT rowid, x FROM t1} {
! 213: if {$x & 1} {
! 214: db eval {DELETE FROM t1 WHERE rowid=$rowid+1}
! 215: }
! 216: }
! 217: execsql {SELECT * FROM t1}
! 218: } {1 3}
! 219: do_test misc2-7.6 {
! 220: execsql {
! 221: DELETE FROM t1;
! 222: INSERT INTO t1 VALUES(1);
! 223: INSERT INTO t1 VALUES(2);
! 224: INSERT INTO t1 VALUES(3);
! 225: INSERT INTO t1 VALUES(4);
! 226: }
! 227: db eval {SELECT rowid, x FROM t1} {
! 228: if {$x & 1} {
! 229: db eval {DELETE FROM t1}
! 230: }
! 231: }
! 232: execsql {SELECT * FROM t1}
! 233: } {}
! 234: do_test misc2-7.7 {
! 235: execsql {
! 236: DELETE FROM t1;
! 237: INSERT INTO t1 VALUES(1);
! 238: INSERT INTO t1 VALUES(2);
! 239: INSERT INTO t1 VALUES(3);
! 240: INSERT INTO t1 VALUES(4);
! 241: }
! 242: db eval {SELECT rowid, x FROM t1} {
! 243: if {$x & 1} {
! 244: db eval {UPDATE t1 SET x=x+100 WHERE rowid=$rowid}
! 245: }
! 246: }
! 247: execsql {SELECT * FROM t1}
! 248: } {101 2 103 4}
! 249: do_test misc2-7.8 {
! 250: execsql {
! 251: DELETE FROM t1;
! 252: INSERT INTO t1 VALUES(1);
! 253: }
! 254: db eval {SELECT rowid, x FROM t1} {
! 255: if {$x<10} {
! 256: db eval {INSERT INTO t1 VALUES($x+1)}
! 257: }
! 258: }
! 259: execsql {SELECT * FROM t1}
! 260: } {1 2 3 4 5 6 7 8 9 10}
! 261:
! 262: # Repeat the tests 7.1 through 7.8 about but this time do the SELECTs
! 263: # in reverse order so that we exercise the sqlite3BtreePrev() routine
! 264: # instead of sqlite3BtreeNext()
! 265: #
! 266: do_test misc2-7.11 {
! 267: db close
! 268: forcedelete test.db
! 269: sqlite3 db test.db
! 270: execsql {
! 271: CREATE TABLE t1(x);
! 272: INSERT INTO t1 VALUES(1);
! 273: INSERT INTO t1 VALUES(2);
! 274: INSERT INTO t1 VALUES(3);
! 275: SELECT * FROM t1;
! 276: }
! 277: } {1 2 3}
! 278: do_test misc2-7.12 {
! 279: set rc [catch {
! 280: db eval {SELECT rowid FROM t1 ORDER BY rowid DESC} {} {
! 281: db eval "DELETE FROM t1 WHERE rowid=$rowid"
! 282: }
! 283: } msg]
! 284: lappend rc $msg
! 285: } {0 {}}
! 286: do_test misc2-7.13 {
! 287: execsql {SELECT * FROM t1}
! 288: } {}
! 289: do_test misc2-7.14 {
! 290: execsql {
! 291: DELETE FROM t1;
! 292: INSERT INTO t1 VALUES(1);
! 293: INSERT INTO t1 VALUES(2);
! 294: INSERT INTO t1 VALUES(3);
! 295: INSERT INTO t1 VALUES(4);
! 296: }
! 297: db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} {
! 298: if {$x & 1} {
! 299: db eval {DELETE FROM t1 WHERE rowid=$rowid}
! 300: }
! 301: }
! 302: execsql {SELECT * FROM t1}
! 303: } {2 4}
! 304: do_test misc2-7.15 {
! 305: execsql {
! 306: DELETE FROM t1;
! 307: INSERT INTO t1 VALUES(1);
! 308: INSERT INTO t1 VALUES(2);
! 309: INSERT INTO t1 VALUES(3);
! 310: INSERT INTO t1 VALUES(4);
! 311: }
! 312: db eval {SELECT rowid, x FROM t1} {
! 313: if {$x & 1} {
! 314: db eval {DELETE FROM t1 WHERE rowid=$rowid+1}
! 315: }
! 316: }
! 317: execsql {SELECT * FROM t1}
! 318: } {1 3}
! 319: do_test misc2-7.16 {
! 320: execsql {
! 321: DELETE FROM t1;
! 322: INSERT INTO t1 VALUES(1);
! 323: INSERT INTO t1 VALUES(2);
! 324: INSERT INTO t1 VALUES(3);
! 325: INSERT INTO t1 VALUES(4);
! 326: }
! 327: db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} {
! 328: if {$x & 1} {
! 329: db eval {DELETE FROM t1}
! 330: }
! 331: }
! 332: execsql {SELECT * FROM t1}
! 333: } {}
! 334: do_test misc2-7.17 {
! 335: execsql {
! 336: DELETE FROM t1;
! 337: INSERT INTO t1 VALUES(1);
! 338: INSERT INTO t1 VALUES(2);
! 339: INSERT INTO t1 VALUES(3);
! 340: INSERT INTO t1 VALUES(4);
! 341: }
! 342: db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} {
! 343: if {$x & 1} {
! 344: db eval {UPDATE t1 SET x=x+100 WHERE rowid=$rowid}
! 345: }
! 346: }
! 347: execsql {SELECT * FROM t1}
! 348: } {101 2 103 4}
! 349: do_test misc2-7.18 {
! 350: execsql {
! 351: DELETE FROM t1;
! 352: INSERT INTO t1(rowid,x) VALUES(10,10);
! 353: }
! 354: db eval {SELECT rowid, x FROM t1 ORDER BY rowid DESC} {
! 355: if {$x>1} {
! 356: db eval {INSERT INTO t1(rowid,x) VALUES($x-1,$x-1)}
! 357: }
! 358: }
! 359: execsql {SELECT * FROM t1}
! 360: } {1 2 3 4 5 6 7 8 9 10}
! 361: }
! 362:
! 363: db close
! 364: forcedelete test.db
! 365: sqlite3 db test.db
! 366: catchsql { pragma recursive_triggers = off }
! 367:
! 368: # Ticket #453. If the SQL ended with "-", the tokenizer was calling that
! 369: # an incomplete token, which caused problem. The solution was to just call
! 370: # it a minus sign.
! 371: #
! 372: do_test misc2-8.1 {
! 373: catchsql {-}
! 374: } {1 {near "-": syntax error}}
! 375:
! 376: # Ticket #513. Make sure the VDBE stack does not grow on a 3-way join.
! 377: #
! 378: ifcapable tempdb {
! 379: do_test misc2-9.1 {
! 380: execsql {
! 381: BEGIN;
! 382: CREATE TABLE counts(n INTEGER PRIMARY KEY);
! 383: INSERT INTO counts VALUES(0);
! 384: INSERT INTO counts VALUES(1);
! 385: INSERT INTO counts SELECT n+2 FROM counts;
! 386: INSERT INTO counts SELECT n+4 FROM counts;
! 387: INSERT INTO counts SELECT n+8 FROM counts;
! 388: COMMIT;
! 389:
! 390: CREATE TEMP TABLE x AS
! 391: SELECT dim1.n, dim2.n, dim3.n
! 392: FROM counts AS dim1, counts AS dim2, counts AS dim3
! 393: WHERE dim1.n<10 AND dim2.n<10 AND dim3.n<10;
! 394:
! 395: SELECT count(*) FROM x;
! 396: }
! 397: } {1000}
! 398: do_test misc2-9.2 {
! 399: execsql {
! 400: DROP TABLE x;
! 401: CREATE TEMP TABLE x AS
! 402: SELECT dim1.n, dim2.n, dim3.n
! 403: FROM counts AS dim1, counts AS dim2, counts AS dim3
! 404: WHERE dim1.n>=6 AND dim2.n>=6 AND dim3.n>=6;
! 405:
! 406: SELECT count(*) FROM x;
! 407: }
! 408: } {1000}
! 409: do_test misc2-9.3 {
! 410: execsql {
! 411: DROP TABLE x;
! 412: CREATE TEMP TABLE x AS
! 413: SELECT dim1.n, dim2.n, dim3.n, dim4.n
! 414: FROM counts AS dim1, counts AS dim2, counts AS dim3, counts AS dim4
! 415: WHERE dim1.n<5 AND dim2.n<5 AND dim3.n<5 AND dim4.n<5;
! 416:
! 417: SELECT count(*) FROM x;
! 418: }
! 419: } [expr 5*5*5*5]
! 420: }
! 421:
! 422: # Ticket #1229. Sometimes when a "NEW.X" appears in a SELECT without
! 423: # a FROM clause deep within a trigger, the code generator is unable to
! 424: # trace the NEW.X back to an original table and thus figure out its
! 425: # declared datatype.
! 426: #
! 427: # The SQL code below was causing a segfault.
! 428: #
! 429: ifcapable subquery&&trigger {
! 430: do_test misc2-10.1 {
! 431: execsql {
! 432: CREATE TABLE t1229(x);
! 433: CREATE TRIGGER r1229 BEFORE INSERT ON t1229 BEGIN
! 434: INSERT INTO t1229 SELECT y FROM (SELECT new.x y);
! 435: END;
! 436: INSERT INTO t1229 VALUES(1);
! 437: }
! 438: } {}
! 439: }
! 440:
! 441: finish_test
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>