xref: /sqlite-3.40.0/test/wherelfault.test (revision dc32b448)
1*dc32b448Sdan# 2008 October 6
2*dc32b448Sdan#
3*dc32b448Sdan# The author disclaims copyright to this source code.  In place of
4*dc32b448Sdan# a legal notice, here is a blessing:
5*dc32b448Sdan#
6*dc32b448Sdan#    May you do good and not evil.
7*dc32b448Sdan#    May you find forgiveness for yourself and forgive others.
8*dc32b448Sdan#    May you share freely, never taking more than you give.
9*dc32b448Sdan#
10*dc32b448Sdan#***********************************************************************
11*dc32b448Sdan# This file implements regression tests for SQLite library.  The
12*dc32b448Sdan# focus of this file is testing fault-injection with the
13*dc32b448Sdan# LIMIT ... OFFSET ... clause of UPDATE and DELETE statements.
14*dc32b448Sdan#
15*dc32b448Sdan
16*dc32b448Sdanset testdir [file dirname $argv0]
17*dc32b448Sdansource $testdir/tester.tcl
18*dc32b448Sdansource $testdir/malloc_common.tcl
19*dc32b448Sdanset testprefix wherelfault
20*dc32b448Sdan
21*dc32b448Sdanifcapable !update_delete_limit {
22*dc32b448Sdan  finish_test
23*dc32b448Sdan  return
24*dc32b448Sdan}
25*dc32b448Sdan
26*dc32b448Sdando_execsql_test 1.0 {
27*dc32b448Sdan  CREATE TABLE t1(a, b);
28*dc32b448Sdan  INSERT INTO t1 VALUES(1, 'f');
29*dc32b448Sdan  INSERT INTO t1 VALUES(2, 'e');
30*dc32b448Sdan  INSERT INTO t1 VALUES(3, 'd');
31*dc32b448Sdan  INSERT INTO t1 VALUES(4, 'c');
32*dc32b448Sdan  INSERT INTO t1 VALUES(5, 'b');
33*dc32b448Sdan  INSERT INTO t1 VALUES(6, 'a');
34*dc32b448Sdan
35*dc32b448Sdan  CREATE VIEW v1 AS SELECT a,b FROM t1;
36*dc32b448Sdan  CREATE TABLE log(op, a);
37*dc32b448Sdan
38*dc32b448Sdan  CREATE TRIGGER v1del INSTEAD OF DELETE ON v1 BEGIN
39*dc32b448Sdan    INSERT INTO log VALUES('delete', old.a);
40*dc32b448Sdan  END;
41*dc32b448Sdan
42*dc32b448Sdan  CREATE TRIGGER v1upd INSTEAD OF UPDATE ON v1 BEGIN
43*dc32b448Sdan    INSERT INTO log VALUES('update', old.a);
44*dc32b448Sdan  END;
45*dc32b448Sdan}
46*dc32b448Sdan
47*dc32b448Sdanfaultsim_save_and_close
48*dc32b448Sdando_faultsim_test 1.1 -prep {
49*dc32b448Sdan  faultsim_restore_and_reopen
50*dc32b448Sdan  db eval {SELECT * FROM sqlite_master}
51*dc32b448Sdan} -body {
52*dc32b448Sdan  execsql { DELETE FROM v1 ORDER BY a LIMIT 3; }
53*dc32b448Sdan} -test {
54*dc32b448Sdan  faultsim_test_result {0 {}}
55*dc32b448Sdan}
56*dc32b448Sdan
57*dc32b448Sdando_faultsim_test 1.2 -prep {
58*dc32b448Sdan  faultsim_restore_and_reopen
59*dc32b448Sdan  db eval {SELECT * FROM sqlite_master}
60*dc32b448Sdan} -body {
61*dc32b448Sdan  execsql { UPDATE v1 SET b = 555 ORDER BY a LIMIT 3 }
62*dc32b448Sdan} -test {
63*dc32b448Sdan  faultsim_test_result {0 {}}
64*dc32b448Sdan}
65*dc32b448Sdan
66*dc32b448Sdan#-------------------------------------------------------------------------
67*dc32b448Sdansqlite3 db test.db
68*dc32b448Sdando_execsql_test 2.1.0 {
69*dc32b448Sdan  CREATE TABLE t2(a, b, c, PRIMARY KEY(a, b)) WITHOUT ROWID;
70*dc32b448Sdan}
71*dc32b448Sdanfaultsim_save_and_close
72*dc32b448Sdan
73*dc32b448Sdando_faultsim_test 2.1 -prep {
74*dc32b448Sdan  faultsim_restore_and_reopen
75*dc32b448Sdan  db eval {SELECT * FROM sqlite_master}
76*dc32b448Sdan} -body {
77*dc32b448Sdan  execsql { DELETE FROM t2 WHERE c=? ORDER BY a DESC LIMIT 10 }
78*dc32b448Sdan} -test {
79*dc32b448Sdan  faultsim_test_result {0 {}}
80*dc32b448Sdan}
81*dc32b448Sdan
82*dc32b448Sdanfinish_test
83