19019f4a6Sdrh# 2007 Dec 12 29019f4a6Sdrh# 39019f4a6Sdrh# The author disclaims copyright to this source code. In place of 49019f4a6Sdrh# a legal notice, here is a blessing: 59019f4a6Sdrh# 69019f4a6Sdrh# May you do good and not evil. 79019f4a6Sdrh# May you find forgiveness for yourself and forgive others. 89019f4a6Sdrh# May you share freely, never taking more than you give. 99019f4a6Sdrh# 109019f4a6Sdrh#*********************************************************************** 119019f4a6Sdrh# 129019f4a6Sdrh# This file contains test cases for stressing database 139019f4a6Sdrh# changes that involve side effects that delete rows from 149019f4a6Sdrh# the table being changed. Ticket #2832 shows that in 159019f4a6Sdrh# older versions of SQLite that behavior was implemented 169019f4a6Sdrh# incorrectly and resulted in corrupt database files. 179019f4a6Sdrh# 18*de3e41e3Sdanielk1977# $Id: sidedelete.test,v 1.2 2008/08/04 03:51:24 danielk1977 Exp $ 199019f4a6Sdrh# 209019f4a6Sdrh 219019f4a6Sdrhset testdir [file dirname $argv0] 229019f4a6Sdrhsource $testdir/tester.tcl 239019f4a6Sdrh 249019f4a6Sdrh# The sequence table is created to store a sequence of integers 259019f4a6Sdrh# starting with 1. This is used to reinitialize other tables 269019f4a6Sdrh# as part of other tests. 279019f4a6Sdrh# 289019f4a6Sdrhdo_test sidedelete-1.1 { 299019f4a6Sdrh execsql { 309019f4a6Sdrh CREATE TABLE sequence(a INTEGER PRIMARY KEY); 319019f4a6Sdrh INSERT INTO sequence VALUES(1); 329019f4a6Sdrh INSERT INTO sequence VALUES(2); 339019f4a6Sdrh } 349019f4a6Sdrh for {set i 0} {$i<8} {incr i} { 359019f4a6Sdrh execsql { 369019f4a6Sdrh INSERT INTO sequence SELECT a+(SELECT max(a) FROM sequence) FROM sequence; 379019f4a6Sdrh } 389019f4a6Sdrh } 399019f4a6Sdrh execsql {SELECT count(*) FROM sequence} 409019f4a6Sdrh} {512} 419019f4a6Sdrh 429019f4a6Sdrh# Make a series of changes using an UPDATE OR REPLACE and a 439019f4a6Sdrh# correlated subquery. This would cause database corruption 449019f4a6Sdrh# prior to the fix for ticket #2832. 459019f4a6Sdrh# 469019f4a6Sdrhdo_test sidedelete-2.0 { 479019f4a6Sdrh execsql { 489019f4a6Sdrh CREATE TABLE t1(a PRIMARY KEY, b); 499019f4a6Sdrh CREATE TABLE chng(a PRIMARY KEY, b); 50*de3e41e3Sdanielk1977 SELECT count(*) FROM t1; 51*de3e41e3Sdanielk1977 SELECT count(*) FROM chng; 529019f4a6Sdrh } 539019f4a6Sdrh} {0 0} 549019f4a6Sdrhfor {set i 2} {$i<=100} {incr i} { 559019f4a6Sdrh set n [expr {($i+2)/2}] 569019f4a6Sdrh do_test sidedelete-2.$i.1 { 579019f4a6Sdrh execsql { 589019f4a6Sdrh DELETE FROM t1; 599019f4a6Sdrh INSERT INTO t1 SELECT a, a FROM sequence WHERE a<=$i; 609019f4a6Sdrh DELETE FROM chng; 619019f4a6Sdrh INSERT INTO chng SELECT a*2, a*2+1 FROM sequence WHERE a<=$i/2; 629019f4a6Sdrh UPDATE OR REPLACE t1 SET a=(SELECT b FROM chng WHERE a=t1.a); 639019f4a6Sdrh SELECT count(*), sum(a) FROM t1; 649019f4a6Sdrh } 659019f4a6Sdrh } [list $n [expr {$n*$n-1}]] 669019f4a6Sdrh integrity_check sidedelete-2.$i.2 679019f4a6Sdrh} 689019f4a6Sdrh 699019f4a6Sdrh# This will cause stacks leaks but not database corruption prior 709019f4a6Sdrh# to the #2832 fix. 719019f4a6Sdrh# 729019f4a6Sdrhdo_test sidedelete-3.0 { 739019f4a6Sdrh execsql { 749019f4a6Sdrh DROP TABLE t1; 759019f4a6Sdrh CREATE TABLE t1(a PRIMARY KEY); 769019f4a6Sdrh SELECT * FROM t1; 779019f4a6Sdrh } 789019f4a6Sdrh} {} 799019f4a6Sdrhfor {set i 1} {$i<=100} {incr i} { 809019f4a6Sdrh set n [expr {($i+1)/2}] 819019f4a6Sdrh do_test sidedelete-3.$i.1 { 829019f4a6Sdrh execsql { 839019f4a6Sdrh DELETE FROM t1; 849019f4a6Sdrh INSERT INTO t1 SELECT a FROM sequence WHERE a<=$i; 859019f4a6Sdrh UPDATE OR REPLACE t1 SET a=a+1; 869019f4a6Sdrh SELECT count(*), sum(a) FROM t1; 879019f4a6Sdrh } 889019f4a6Sdrh } [list $n [expr {$n*($n+1)}]] 899019f4a6Sdrh integrity_check sidedelete-3.$i.2 909019f4a6Sdrh} 919019f4a6Sdrh 929019f4a6Sdrhfinish_test 93