Annotation of embedaddon/sqlite3/test/delete.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 DELETE FROM statement.
        !            13: #
        !            14: # $Id: delete.test,v 1.26 2009/06/05 17:09:12 drh Exp $
        !            15: 
        !            16: set testdir [file dirname $argv0]
        !            17: source $testdir/tester.tcl
        !            18: 
        !            19: # Try to delete from a non-existant table.
        !            20: #
        !            21: do_test delete-1.1 {
        !            22:   set v [catch {execsql {DELETE FROM test1}} msg]
        !            23:   lappend v $msg
        !            24: } {1 {no such table: test1}}
        !            25: 
        !            26: # Try to delete from sqlite_master
        !            27: #
        !            28: do_test delete-2.1 {
        !            29:   set v [catch {execsql {DELETE FROM sqlite_master}} msg]
        !            30:   lappend v $msg
        !            31: } {1 {table sqlite_master may not be modified}}
        !            32: 
        !            33: # Delete selected entries from a table with and without an index.
        !            34: #
        !            35: do_test delete-3.1.1 {
        !            36:   execsql {CREATE TABLE table1(f1 int, f2 int)}
        !            37:   execsql {INSERT INTO table1 VALUES(1,2)}
        !            38:   execsql {INSERT INTO table1 VALUES(2,4)}
        !            39:   execsql {INSERT INTO table1 VALUES(3,8)}
        !            40:   execsql {INSERT INTO table1 VALUES(4,16)}
        !            41:   execsql {SELECT * FROM table1 ORDER BY f1}
        !            42: } {1 2 2 4 3 8 4 16}
        !            43: do_test delete-3.1.2 {
        !            44:   execsql {DELETE FROM table1 WHERE f1=3}
        !            45: } {}
        !            46: do_test delete-3.1.3 {
        !            47:   execsql {SELECT * FROM table1 ORDER BY f1}
        !            48: } {1 2 2 4 4 16}
        !            49: do_test delete-3.1.4 {
        !            50:   execsql {CREATE INDEX index1 ON table1(f1)}
        !            51:   execsql {PRAGMA count_changes=on}
        !            52:   ifcapable explain {
        !            53:     execsql {EXPLAIN DELETE FROM table1 WHERE f1=3}
        !            54:   }
        !            55:   execsql {DELETE FROM 'table1' WHERE f1=3}
        !            56: } {0}
        !            57: do_test delete-3.1.5 {
        !            58:   execsql {SELECT * FROM table1 ORDER BY f1}
        !            59: } {1 2 2 4 4 16}
        !            60: do_test delete-3.1.6.1 {
        !            61:   execsql {DELETE FROM table1 WHERE f1=2}
        !            62: } {1}
        !            63: do_test delete-3.1.6.2 {
        !            64:   db changes
        !            65: } 1
        !            66: do_test delete-3.1.7 {
        !            67:   execsql {SELECT * FROM table1 ORDER BY f1}
        !            68: } {1 2 4 16}
        !            69: integrity_check delete-3.2
        !            70: 
        !            71: 
        !            72: # Semantic errors in the WHERE clause
        !            73: #
        !            74: do_test delete-4.1 {
        !            75:   execsql {CREATE TABLE table2(f1 int, f2 int)}
        !            76:   set v [catch {execsql {DELETE FROM table2 WHERE f3=5}} msg]
        !            77:   lappend v $msg
        !            78: } {1 {no such column: f3}}
        !            79: 
        !            80: do_test delete-4.2 {
        !            81:   set v [catch {execsql {DELETE FROM table2 WHERE xyzzy(f1+4)}} msg]
        !            82:   lappend v $msg
        !            83: } {1 {no such function: xyzzy}}
        !            84: integrity_check delete-4.3
        !            85: 
        !            86: # Lots of deletes
        !            87: #
        !            88: do_test delete-5.1.1 {
        !            89:   execsql {DELETE FROM table1}
        !            90: } {2}
        !            91: do_test delete-5.1.2 {
        !            92:   execsql {SELECT count(*) FROM table1}
        !            93: } {0}
        !            94: do_test delete-5.2.1 {
        !            95:   execsql {BEGIN TRANSACTION}
        !            96:   for {set i 1} {$i<=200} {incr i} {
        !            97:      execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])"
        !            98:   }
        !            99:   execsql {COMMIT}
        !           100:   execsql {SELECT count(*) FROM table1}
        !           101: } {200}
        !           102: do_test delete-5.2.2 {
        !           103:   execsql {DELETE FROM table1}
        !           104: } {200}
        !           105: do_test delete-5.2.3 {
        !           106:   execsql {BEGIN TRANSACTION}
        !           107:   for {set i 1} {$i<=200} {incr i} {
        !           108:      execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])"
        !           109:   }
        !           110:   execsql {COMMIT}
        !           111:   execsql {SELECT count(*) FROM table1}
        !           112: } {200}
        !           113: do_test delete-5.2.4 {
        !           114:   execsql {PRAGMA count_changes=off}
        !           115:   execsql {DELETE FROM table1}
        !           116: } {}
        !           117: do_test delete-5.2.5 {
        !           118:   execsql {SELECT count(*) FROM table1}
        !           119: } {0}
        !           120: do_test delete-5.2.6 {
        !           121:   execsql {BEGIN TRANSACTION}
        !           122:   for {set i 1} {$i<=200} {incr i} {
        !           123:      execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])"
        !           124:   }
        !           125:   execsql {COMMIT}
        !           126:   execsql {SELECT count(*) FROM table1}
        !           127: } {200}
        !           128: do_test delete-5.3 {
        !           129:   for {set i 1} {$i<=200} {incr i 4} {
        !           130:      execsql "DELETE FROM table1 WHERE f1==$i"
        !           131:   }
        !           132:   execsql {SELECT count(*) FROM table1}
        !           133: } {150}
        !           134: do_test delete-5.4.1 {
        !           135:   execsql "DELETE FROM table1 WHERE f1>50"
        !           136:   db changes
        !           137: } [db one {SELECT count(*) FROM table1 WHERE f1>50}]
        !           138: do_test delete-5.4.2 {
        !           139:   execsql {SELECT count(*) FROM table1}
        !           140: } {37}
        !           141: do_test delete-5.5 {
        !           142:   for {set i 1} {$i<=70} {incr i 3} {
        !           143:      execsql "DELETE FROM table1 WHERE f1==$i"
        !           144:   }
        !           145:   execsql {SELECT f1 FROM table1 ORDER BY f1}
        !           146: } {2 3 6 8 11 12 14 15 18 20 23 24 26 27 30 32 35 36 38 39 42 44 47 48 50}
        !           147: do_test delete-5.6 {
        !           148:   for {set i 1} {$i<40} {incr i} {
        !           149:      execsql "DELETE FROM table1 WHERE f1==$i"
        !           150:   }
        !           151:   execsql {SELECT f1 FROM table1 ORDER BY f1}
        !           152: } {42 44 47 48 50}
        !           153: do_test delete-5.7 {
        !           154:   execsql "DELETE FROM table1 WHERE f1!=48"
        !           155:   execsql {SELECT f1 FROM table1 ORDER BY f1}
        !           156: } {48}
        !           157: integrity_check delete-5.8
        !           158: 
        !           159: 
        !           160: # Delete large quantities of data.  We want to test the List overflow
        !           161: # mechanism in the vdbe.
        !           162: #
        !           163: do_test delete-6.1 {
        !           164:   execsql {BEGIN; DELETE FROM table1}
        !           165:   for {set i 1} {$i<=3000} {incr i} {
        !           166:     execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])"
        !           167:   }
        !           168:   execsql {DELETE FROM table2}
        !           169:   for {set i 1} {$i<=3000} {incr i} {
        !           170:     execsql "INSERT INTO table2 VALUES($i,[expr {$i*$i}])"
        !           171:   }
        !           172:   execsql {COMMIT}
        !           173:   execsql {SELECT count(*) FROM table1}
        !           174: } {3000}
        !           175: do_test delete-6.2 {
        !           176:   execsql {SELECT count(*) FROM table2}
        !           177: } {3000}
        !           178: do_test delete-6.3 {
        !           179:   execsql {SELECT f1 FROM table1 WHERE f1<10 ORDER BY f1}
        !           180: } {1 2 3 4 5 6 7 8 9}
        !           181: do_test delete-6.4 {
        !           182:   execsql {SELECT f1 FROM table2 WHERE f1<10 ORDER BY f1}
        !           183: } {1 2 3 4 5 6 7 8 9}
        !           184: do_test delete-6.5.1 {
        !           185:   execsql {DELETE FROM table1 WHERE f1>7}
        !           186:   db changes
        !           187: } {2993}
        !           188: do_test delete-6.5.2 {
        !           189:   execsql {SELECT f1 FROM table1 ORDER BY f1}
        !           190: } {1 2 3 4 5 6 7}
        !           191: do_test delete-6.6 {
        !           192:   execsql {DELETE FROM table2 WHERE f1>7}
        !           193:   execsql {SELECT f1 FROM table2 ORDER BY f1}
        !           194: } {1 2 3 4 5 6 7}
        !           195: do_test delete-6.7 {
        !           196:   execsql {DELETE FROM table1}
        !           197:   execsql {SELECT f1 FROM table1}
        !           198: } {}
        !           199: do_test delete-6.8 {
        !           200:   execsql {INSERT INTO table1 VALUES(2,3)}
        !           201:   execsql {SELECT f1 FROM table1}
        !           202: } {2}
        !           203: do_test delete-6.9 {
        !           204:   execsql {DELETE FROM table2}
        !           205:   execsql {SELECT f1 FROM table2}
        !           206: } {}
        !           207: do_test delete-6.10 {
        !           208:   execsql {INSERT INTO table2 VALUES(2,3)}
        !           209:   execsql {SELECT f1 FROM table2}
        !           210: } {2}
        !           211: integrity_check delete-6.11
        !           212: 
        !           213: do_test delete-7.1 {
        !           214:   execsql {
        !           215:     CREATE TABLE t3(a);
        !           216:     INSERT INTO t3 VALUES(1);
        !           217:     INSERT INTO t3 SELECT a+1 FROM t3;
        !           218:     INSERT INTO t3 SELECT a+2 FROM t3;
        !           219:     SELECT * FROM t3;
        !           220:   }
        !           221: } {1 2 3 4}
        !           222: ifcapable {trigger} {
        !           223:   do_test delete-7.2 {
        !           224:     execsql {
        !           225:       CREATE TABLE cnt(del);
        !           226:       INSERT INTO cnt VALUES(0);
        !           227:       CREATE TRIGGER r1 AFTER DELETE ON t3 FOR EACH ROW BEGIN
        !           228:         UPDATE cnt SET del=del+1;
        !           229:       END;
        !           230:       DELETE FROM t3 WHERE a<2;
        !           231:       SELECT * FROM t3;
        !           232:     }
        !           233:   } {2 3 4}
        !           234:   do_test delete-7.3 {
        !           235:     execsql {
        !           236:       SELECT * FROM cnt;
        !           237:     }
        !           238:   } {1}
        !           239:   do_test delete-7.4 {
        !           240:     execsql {
        !           241:       DELETE FROM t3;
        !           242:       SELECT * FROM t3;
        !           243:     }
        !           244:   } {}
        !           245:   do_test delete-7.5 {
        !           246:     execsql {
        !           247:       SELECT * FROM cnt;
        !           248:     }
        !           249:   } {4}
        !           250:   do_test delete-7.6 {
        !           251:     execsql {
        !           252:       INSERT INTO t3 VALUES(1);
        !           253:       INSERT INTO t3 SELECT a+1 FROM t3;
        !           254:       INSERT INTO t3 SELECT a+2 FROM t3;
        !           255:       CREATE TABLE t4 AS SELECT * FROM t3;
        !           256:       PRAGMA count_changes=ON;
        !           257:       DELETE FROM t3;
        !           258:       DELETE FROM t4;
        !           259:     }
        !           260:   } {4 4}
        !           261: } ;# endif trigger
        !           262: ifcapable {!trigger} {
        !           263:   execsql {DELETE FROM t3}
        !           264: }
        !           265: integrity_check delete-7.7
        !           266: 
        !           267: # Make sure error messages are consistent when attempting to delete
        !           268: # from a read-only database.  Ticket #304.
        !           269: #
        !           270: do_test delete-8.0 {
        !           271:   execsql {
        !           272:     PRAGMA count_changes=OFF;
        !           273:     INSERT INTO t3 VALUES(123);
        !           274:     SELECT * FROM t3;
        !           275:   }
        !           276: } {123}
        !           277: db close
        !           278: catch {forcedelete test.db-journal}
        !           279: catch {file attributes test.db -permissions 0444}
        !           280: catch {file attributes test.db -readonly 1}
        !           281: sqlite3 db test.db
        !           282: set ::DB [sqlite3_connection_pointer db]
        !           283: do_test delete-8.1 {
        !           284:   catchsql {
        !           285:     DELETE FROM t3;
        !           286:   }
        !           287: } {1 {attempt to write a readonly database}}
        !           288: do_test delete-8.2 {
        !           289:   execsql {SELECT * FROM t3} 
        !           290: } {123}
        !           291: do_test delete-8.3 {
        !           292:   catchsql {
        !           293:     DELETE FROM t3 WHERE 1;
        !           294:   }
        !           295: } {1 {attempt to write a readonly database}}
        !           296: do_test delete-8.4 {
        !           297:   execsql {SELECT * FROM t3} 
        !           298: } {123}
        !           299: 
        !           300: # Update for v3: In v2 the DELETE statement would succeed because no
        !           301: # database writes actually occur. Version 3 refuses to open a transaction
        !           302: # on a read-only file, so the statement fails.
        !           303: do_test delete-8.5 {
        !           304:   catchsql {
        !           305:     DELETE FROM t3 WHERE a<100;
        !           306:   }
        !           307: # v2 result: {0 {}}
        !           308: } {1 {attempt to write a readonly database}}
        !           309: do_test delete-8.6 {
        !           310:   execsql {SELECT * FROM t3}
        !           311: } {123}
        !           312: integrity_check delete-8.7
        !           313: 
        !           314: # Need to do the following for tcl 8.5 on mac. On that configuration, the
        !           315: # -readonly flag is taken so seriously that a subsequent [forcedelete]
        !           316: # (required before the next test file can be executed) will fail.
        !           317: #
        !           318: catch {file attributes test.db -readonly 0}
        !           319: db close
        !           320: forcedelete test.db test.db-journal
        !           321: 
        !           322: # The following tests verify that SQLite correctly handles the case
        !           323: # where an index B-Tree is being scanned, the rowid column being read
        !           324: # from each index entry and another statement deletes some rows from
        !           325: # the index B-Tree. At one point this (obscure) scenario was causing 
        !           326: # SQLite to return spurious SQLITE_CORRUPT errors and arguably incorrect
        !           327: # query results. 
        !           328: #
        !           329: do_test delete-9.1 {
        !           330:   sqlite3 db test.db
        !           331:   execsql {
        !           332:     CREATE TABLE t5(a, b);
        !           333:     CREATE TABLE t6(c, d);
        !           334:     INSERT INTO t5 VALUES(1, 2);
        !           335:     INSERT INTO t5 VALUES(3, 4);
        !           336:     INSERT INTO t5 VALUES(5, 6);
        !           337:     INSERT INTO t6 VALUES('a', 'b');
        !           338:     INSERT INTO t6 VALUES('c', 'd');
        !           339:     CREATE INDEX i5 ON t5(a);
        !           340:     CREATE INDEX i6 ON t6(c);
        !           341:   }
        !           342: } {}
        !           343: do_test delete-9.2 {
        !           344:   set res [list]
        !           345:   db eval { SELECT t5.rowid AS r, c, d FROM t5, t6 ORDER BY a } {
        !           346:     if {$r==2} { db eval { DELETE FROM t5 } }
        !           347:     lappend res $r $c $d
        !           348:   }
        !           349:   set res
        !           350: } {1 a b 1 c d 2 a b {} c d}
        !           351: do_test delete-9.3 {
        !           352:   execsql {
        !           353:     INSERT INTO t5 VALUES(1, 2);
        !           354:     INSERT INTO t5 VALUES(3, 4);
        !           355:     INSERT INTO t5 VALUES(5, 6);
        !           356:   }
        !           357:   set res [list]
        !           358:   db eval { SELECT t5.rowid AS r, c, d FROM t5, t6 ORDER BY a } {
        !           359:     if {$r==2} { db eval { DELETE FROM t5 WHERE rowid = 2 } }
        !           360:     lappend res $r $c $d
        !           361:   }
        !           362:   set res
        !           363: } {1 a b 1 c d 2 a b {} c d 3 a b 3 c d}
        !           364: do_test delete-9.4 {
        !           365:   execsql {
        !           366:     DELETE FROM t5;
        !           367:     INSERT INTO t5 VALUES(1, 2);
        !           368:     INSERT INTO t5 VALUES(3, 4);
        !           369:     INSERT INTO t5 VALUES(5, 6);
        !           370:   }
        !           371:   set res [list]
        !           372:   db eval { SELECT t5.rowid AS r, c, d FROM t5, t6 ORDER BY a } {
        !           373:     if {$r==2} { db eval { DELETE FROM t5 WHERE rowid = 1 } }
        !           374:     lappend res $r $c $d
        !           375:   }
        !           376:   set res
        !           377: } {1 a b 1 c d 2 a b 2 c d 3 a b 3 c d}
        !           378: do_test delete-9.5 {
        !           379:   execsql {
        !           380:     DELETE FROM t5;
        !           381:     INSERT INTO t5 VALUES(1, 2);
        !           382:     INSERT INTO t5 VALUES(3, 4);
        !           383:     INSERT INTO t5 VALUES(5, 6);
        !           384:   }
        !           385:   set res [list]
        !           386:   db eval { SELECT t5.rowid AS r, c, d FROM t5, t6 ORDER BY a } {
        !           387:     if {$r==2} { db eval { DELETE FROM t5 WHERE rowid = 3 } }
        !           388:     lappend res $r $c $d
        !           389:   }
        !           390:   set res
        !           391: } {1 a b 1 c d 2 a b 2 c d}
        !           392: 
        !           393: 
        !           394: finish_test

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