xref: /sqlite-3.40.0/test/sidedelete.test (revision de3e41e3)
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