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>