mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Allows UPDATE, INSERT, and DELETEs to occur while a SELECT is pending on
the same table. (CVS 3355) FossilOrigin-Name: 8c52d2ad468615e50a727adab2977a0bef1bc068
This commit is contained in:
114
test/misc2.test
114
test/misc2.test
@ -13,7 +13,7 @@
|
||||
# This file implements tests for miscellanous features that were
|
||||
# left out of other test files.
|
||||
#
|
||||
# $Id: misc2.test,v 1.24 2006/01/17 09:35:02 danielk1977 Exp $
|
||||
# $Id: misc2.test,v 1.25 2006/08/16 16:42:48 drh Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@ -145,6 +145,9 @@ do_test misc2-6.1 {
|
||||
# update a table from within the callback of a select on that same
|
||||
# table.
|
||||
#
|
||||
# 2006-08-16: This has changed. It is now permitted to update
|
||||
# the table being SELECTed from within the callback of the query.
|
||||
#
|
||||
do_test misc2-7.1 {
|
||||
db close
|
||||
file delete -force test.db
|
||||
@ -152,45 +155,94 @@ do_test misc2-7.1 {
|
||||
execsql {
|
||||
CREATE TABLE t1(x);
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 VALUES(2);
|
||||
INSERT INTO t1 VALUES(3);
|
||||
SELECT * FROM t1;
|
||||
}
|
||||
} {1 2 3}
|
||||
do_test misc2-7.2 {
|
||||
set rc [catch {
|
||||
db eval {SELECT rowid FROM t1} {} {
|
||||
db eval "DELETE FROM t1 WHERE rowid=$rowid"
|
||||
}
|
||||
} msg]
|
||||
lappend rc $msg
|
||||
} {1 {database table is locked}}
|
||||
do_test misc2-7.2 {
|
||||
set rc [catch {
|
||||
db eval {SELECT rowid FROM t1} {} {
|
||||
db eval "INSERT INTO t1 VALUES(3)"
|
||||
} {0 {}}
|
||||
do_test misc2-7.3 {
|
||||
execsql {SELECT * FROM t1}
|
||||
} {}
|
||||
do_test misc2-7.4 {
|
||||
execsql {
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 VALUES(2);
|
||||
INSERT INTO t1 VALUES(3);
|
||||
INSERT INTO t1 VALUES(4);
|
||||
}
|
||||
db eval {SELECT rowid, x FROM t1} {
|
||||
if {$x & 1} {
|
||||
db eval {DELETE FROM t1 WHERE rowid=$rowid}
|
||||
}
|
||||
} msg]
|
||||
lappend rc $msg
|
||||
} {1 {database table is locked}}
|
||||
ifcapable memorydb {
|
||||
do_test misc2-7.3 {
|
||||
sqlite3 db :memory:
|
||||
execsql {
|
||||
CREATE TABLE t1(x);
|
||||
INSERT INTO t1 VALUES(1);
|
||||
}
|
||||
execsql {SELECT * FROM t1}
|
||||
} {2 4}
|
||||
do_test misc2-7.5 {
|
||||
execsql {
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 VALUES(2);
|
||||
INSERT INTO t1 VALUES(3);
|
||||
INSERT INTO t1 VALUES(4);
|
||||
}
|
||||
db eval {SELECT rowid, x FROM t1} {
|
||||
if {$x & 1} {
|
||||
db eval {DELETE FROM t1 WHERE rowid=$rowid+1}
|
||||
}
|
||||
set rc [catch {
|
||||
db eval {SELECT rowid FROM t1} {} {
|
||||
db eval "DELETE FROM t1 WHERE rowid=$rowid"
|
||||
}
|
||||
} msg]
|
||||
lappend rc $msg
|
||||
} {1 {database table is locked}}
|
||||
do_test misc2-7.4 {
|
||||
set rc [catch {
|
||||
db eval {SELECT rowid FROM t1} {} {
|
||||
db eval "INSERT INTO t1 VALUES(3)"
|
||||
}
|
||||
} msg]
|
||||
lappend rc $msg
|
||||
} {1 {database table is locked}}
|
||||
}
|
||||
}
|
||||
execsql {SELECT * FROM t1}
|
||||
} {1 3}
|
||||
do_test misc2-7.6 {
|
||||
execsql {
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 VALUES(2);
|
||||
INSERT INTO t1 VALUES(3);
|
||||
INSERT INTO t1 VALUES(4);
|
||||
}
|
||||
db eval {SELECT rowid, x FROM t1} {
|
||||
if {$x & 1} {
|
||||
db eval {DELETE FROM t1}
|
||||
}
|
||||
}
|
||||
execsql {SELECT * FROM t1}
|
||||
} {}
|
||||
do_test misc2-7.7 {
|
||||
execsql {
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 VALUES(2);
|
||||
INSERT INTO t1 VALUES(3);
|
||||
INSERT INTO t1 VALUES(4);
|
||||
}
|
||||
db eval {SELECT rowid, x FROM t1} {
|
||||
if {$x & 1} {
|
||||
db eval {UPDATE t1 SET x=x+100 WHERE rowid=$rowid}
|
||||
}
|
||||
}
|
||||
execsql {SELECT * FROM t1}
|
||||
} {101 2 103 4}
|
||||
do_test misc2-7.8 {
|
||||
execsql {
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
}
|
||||
db eval {SELECT rowid, x FROM t1} {
|
||||
if {$x<10} {
|
||||
db eval {INSERT INTO t1 VALUES($x+1)}
|
||||
}
|
||||
}
|
||||
execsql {SELECT * FROM t1}
|
||||
} {1 2 3 4 5 6 7 8 9 10}
|
||||
|
||||
db close
|
||||
file delete -force test.db
|
||||
|
Reference in New Issue
Block a user