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.17 2004/07/15 20:08:39 drh Exp $ 15 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19# Try to delete from a non-existant table. 20# 21do_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# 28do_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# 35do_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} 43do_test delete-3.1.2 { 44 execsql {DELETE FROM table1 WHERE f1=3} 45} {} 46do_test delete-3.1.3 { 47 execsql {SELECT * FROM table1 ORDER BY f1} 48} {1 2 2 4 4 16} 49do_test delete-3.1.4 { 50 execsql {CREATE INDEX index1 ON table1(f1)} 51 execsql {PRAGMA count_changes=on} 52 execsql {DELETE FROM 'table1' WHERE f1=3} 53} {0} 54do_test delete-3.1.5 { 55 execsql {SELECT * FROM table1 ORDER BY f1} 56} {1 2 2 4 4 16} 57do_test delete-3.1.6.1 { 58 execsql {DELETE FROM table1 WHERE f1=2} 59} {1} 60do_test delete-3.1.6.2 { 61 db changes 62} 1 63do_test delete-3.1.7 { 64 execsql {SELECT * FROM table1 ORDER BY f1} 65} {1 2 4 16} 66integrity_check delete-3.2 67 68 69# Semantic errors in the WHERE clause 70# 71do_test delete-4.1 { 72 execsql {CREATE TABLE table2(f1 int, f2 int)} 73 set v [catch {execsql {DELETE FROM table2 WHERE f3=5}} msg] 74 lappend v $msg 75} {1 {no such column: f3}} 76 77do_test delete-4.2 { 78 set v [catch {execsql {DELETE FROM table2 WHERE xyzzy(f1+4)}} msg] 79 lappend v $msg 80} {1 {no such function: xyzzy}} 81integrity_check delete-4.3 82 83# Lots of deletes 84# 85do_test delete-5.1.1 { 86 execsql {DELETE FROM table1} 87} {2} 88do_test delete-5.1.2 { 89 execsql {SELECT count(*) FROM table1} 90} {0} 91do_test delete-5.2.1 { 92 execsql {BEGIN TRANSACTION} 93 for {set i 1} {$i<=200} {incr i} { 94 execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])" 95 } 96 execsql {COMMIT} 97 execsql {SELECT count(*) FROM table1} 98} {200} 99do_test delete-5.2.2 { 100 execsql {DELETE FROM table1} 101} {200} 102do_test delete-5.2.3 { 103 execsql {BEGIN TRANSACTION} 104 for {set i 1} {$i<=200} {incr i} { 105 execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])" 106 } 107 execsql {COMMIT} 108 execsql {SELECT count(*) FROM table1} 109} {200} 110do_test delete-5.2.4 { 111 execsql {PRAGMA count_changes=off} 112 execsql {DELETE FROM table1} 113} {} 114do_test delete-5.2.5 { 115 execsql {SELECT count(*) FROM table1} 116} {0} 117do_test delete-5.2.6 { 118 execsql {BEGIN TRANSACTION} 119 for {set i 1} {$i<=200} {incr i} { 120 execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])" 121 } 122 execsql {COMMIT} 123 execsql {SELECT count(*) FROM table1} 124} {200} 125do_test delete-5.3 { 126 for {set i 1} {$i<=200} {incr i 4} { 127 execsql "DELETE FROM table1 WHERE f1==$i" 128 } 129 execsql {SELECT count(*) FROM table1} 130} {150} 131do_test delete-5.4.1 { 132 execsql "DELETE FROM table1 WHERE f1>50" 133 db changes 134} [db one {SELECT count(*) FROM table1 WHERE f1>50}] 135do_test delete-5.4.2 { 136 execsql {SELECT count(*) FROM table1} 137} {37} 138do_test delete-5.5 { 139 for {set i 1} {$i<=70} {incr i 3} { 140 execsql "DELETE FROM table1 WHERE f1==$i" 141 } 142 execsql {SELECT f1 FROM table1 ORDER BY f1} 143} {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} 144do_test delete-5.6 { 145 for {set i 1} {$i<40} {incr i} { 146 execsql "DELETE FROM table1 WHERE f1==$i" 147 } 148 execsql {SELECT f1 FROM table1 ORDER BY f1} 149} {42 44 47 48 50} 150do_test delete-5.7 { 151 execsql "DELETE FROM table1 WHERE f1!=48" 152 execsql {SELECT f1 FROM table1 ORDER BY f1} 153} {48} 154integrity_check delete-5.8 155 156 157# Delete large quantities of data. We want to test the List overflow 158# mechanism in the vdbe. 159# 160do_test delete-6.1 { 161 execsql {BEGIN; DELETE FROM table1} 162 for {set i 1} {$i<=3000} {incr i} { 163 execsql "INSERT INTO table1 VALUES($i,[expr {$i*$i}])" 164 } 165 execsql {DELETE FROM table2} 166 for {set i 1} {$i<=3000} {incr i} { 167 execsql "INSERT INTO table2 VALUES($i,[expr {$i*$i}])" 168 } 169 execsql {COMMIT} 170 execsql {SELECT count(*) FROM table1} 171} {3000} 172do_test delete-6.2 { 173 execsql {SELECT count(*) FROM table2} 174} {3000} 175do_test delete-6.3 { 176 execsql {SELECT f1 FROM table1 WHERE f1<10 ORDER BY f1} 177} {1 2 3 4 5 6 7 8 9} 178do_test delete-6.4 { 179 execsql {SELECT f1 FROM table2 WHERE f1<10 ORDER BY f1} 180} {1 2 3 4 5 6 7 8 9} 181do_test delete-6.5.1 { 182 execsql {DELETE FROM table1 WHERE f1>7} 183 db changes 184} {2993} 185do_test delete-6.5.2 { 186 execsql {SELECT f1 FROM table1 ORDER BY f1} 187} {1 2 3 4 5 6 7} 188do_test delete-6.6 { 189 execsql {DELETE FROM table2 WHERE f1>7} 190 execsql {SELECT f1 FROM table2 ORDER BY f1} 191} {1 2 3 4 5 6 7} 192do_test delete-6.7 { 193 execsql {DELETE FROM table1} 194 execsql {SELECT f1 FROM table1} 195} {} 196do_test delete-6.8 { 197 execsql {INSERT INTO table1 VALUES(2,3)} 198 execsql {SELECT f1 FROM table1} 199} {2} 200do_test delete-6.9 { 201 execsql {DELETE FROM table2} 202 execsql {SELECT f1 FROM table2} 203} {} 204do_test delete-6.10 { 205 execsql {INSERT INTO table2 VALUES(2,3)} 206 execsql {SELECT f1 FROM table2} 207} {2} 208integrity_check delete-6.11 209 210do_test delete-7.1 { 211 execsql { 212 CREATE TABLE t3(a); 213 INSERT INTO t3 VALUES(1); 214 INSERT INTO t3 SELECT a+1 FROM t3; 215 INSERT INTO t3 SELECT a+2 FROM t3; 216 SELECT * FROM t3; 217 } 218} {1 2 3 4} 219do_test delete-7.2 { 220 execsql { 221 CREATE TABLE cnt(del); 222 INSERT INTO cnt VALUES(0); 223 CREATE TRIGGER r1 AFTER DELETE ON t3 FOR EACH ROW BEGIN 224 UPDATE cnt SET del=del+1; 225 END; 226 DELETE FROM t3 WHERE a<2; 227 SELECT * FROM t3; 228 } 229} {2 3 4} 230do_test delete-7.3 { 231 execsql { 232 SELECT * FROM cnt; 233 } 234} {1} 235do_test delete-7.4 { 236 execsql { 237 DELETE FROM t3; 238 SELECT * FROM t3; 239 } 240} {} 241do_test delete-7.5 { 242 execsql { 243 SELECT * FROM cnt; 244 } 245} {4} 246do_test delete-7.6 { 247 execsql { 248 INSERT INTO t3 VALUES(1); 249 INSERT INTO t3 SELECT a+1 FROM t3; 250 INSERT INTO t3 SELECT a+2 FROM t3; 251 CREATE TABLE t4 AS SELECT * FROM t3; 252 PRAGMA count_changes=ON; 253 DELETE FROM t3; 254 DELETE FROM t4; 255 } 256} {4 4} 257integrity_check delete-7.7 258 259# Make sure error messages are consistent when attempting to delete 260# from a read-only database. Ticket #304. 261# 262do_test delete-8.0 { 263 execsql { 264 PRAGMA count_changes=OFF; 265 INSERT INTO t3 VALUES(123); 266 SELECT * FROM t3; 267 } 268} {123} 269db close 270catch {file attributes test.db -permissions 0444} 271catch {file attributes test.db -readonly 1} 272sqlite3 db test.db 273do_test delete-8.1 { 274 catchsql { 275 DELETE FROM t3; 276 } 277} {1 {attempt to write a readonly database}} 278do_test delete-8.2 { 279 execsql {SELECT * FROM t3} 280} {123} 281do_test delete-8.3 { 282 catchsql { 283 DELETE FROM t3 WHERE 1; 284 } 285} {1 {attempt to write a readonly database}} 286do_test delete-8.4 { 287 execsql {SELECT * FROM t3} 288} {123} 289 290# Update for v3: In v2 the DELETE statement would succeed because no 291# database writes actually occur. Version 3 refuses to open a transaction 292# on a read-only file, so the statement fails. 293do_test delete-8.5 { 294 catchsql { 295 DELETE FROM t3 WHERE a<100; 296 } 297# v2 result: {0 {}} 298} {1 {attempt to write a readonly database}} 299do_test delete-8.6 { 300 execsql {SELECT * FROM t3} 301} {123} 302integrity_check delete-8.7 303 304finish_test 305