1# 2005 july 8
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 test the busy handler
12#
13
14
15set testdir [file dirname $argv0]
16source $testdir/tester.tcl
17set testprefix busy
18
19do_test busy-1.1 {
20  sqlite3 db2 test.db
21  execsql {
22    CREATE TABLE t1(x);
23    INSERT INTO t1 VALUES(1);
24    SELECT * FROM t1
25  }
26} 1
27proc busy x {
28  lappend ::busyargs $x
29  if {$x>2} {return 1}
30  return 0
31}
32set busyargs {}
33do_test busy-1.2 {
34  db busy busy
35  db2 eval {BEGIN EXCLUSIVE}
36  catchsql {BEGIN IMMEDIATE}
37} {1 {database is locked}}
38do_test busy-1.3 {
39  set busyargs
40} {0 1 2 3}
41do_test busy-1.4 {
42  set busyargs {}
43  catchsql {BEGIN IMMEDIATE}
44  set busyargs
45} {0 1 2 3}
46
47do_test busy-2.1 {
48  db2 eval {COMMIT}
49  db eval {BEGIN; INSERT INTO t1 VALUES(5)}
50  db2 eval {BEGIN; SELECT * FROM t1}
51  set busyargs {}
52  catchsql COMMIT
53} {1 {database is locked}}
54do_test busy-2.2 {
55  set busyargs
56} {0 1 2 3}
57
58db2 close
59
60#-------------------------------------------------------------------------
61# Test that the busy-handler is invoked correctly for "PRAGMA optimize"
62# and ANALYZE commnds.
63ifcapable pragma&&analyze&&!stat4 {
64
65reset_db
66
67do_execsql_test 3.1 {
68  CREATE TABLE t1(x);
69  CREATE TABLE t2(y);
70  CREATE TABLE t3(z);
71
72  CREATE INDEX i1 ON t1(x);
73  CREATE INDEX i2 ON t2(y);
74
75  INSERT INTO t1 VALUES(1);
76  INSERT INTO t2 VALUES(1);
77  ANALYZE;
78
79  SELECT * FROM t1 WHERE x=1;
80  SELECT * FROM t2 WHERE y=1;
81} {1 1}
82
83do_test 3.2 {
84  sqlite3 db2 test.db
85  execsql { BEGIN EXCLUSIVE } db2
86  catchsql { PRAGMA optimize }
87} {1 {database is locked}}
88
89proc busy_handler {n} {
90  if {$n>1000} { execsql { COMMIT } db2 }
91  return 0
92}
93db busy busy_handler
94
95do_test 3.3 {
96  catchsql { PRAGMA optimize }
97} {0 {}}
98
99do_test 3.4 {
100  execsql {
101    BEGIN;
102    SELECT count(*) FROM sqlite_master;
103  } db2
104} {6}
105
106proc busy_handler {n} { return 1 }
107do_test 3.5 {
108  catchsql { PRAGMA optimize }
109} {0 {}}
110
111do_test 3.6 {
112  execsql { COMMIT } db2
113  execsql {
114    WITH s(i) AS (
115      SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000
116    )
117    INSERT INTO t1 SELECT i FROM s;
118  }
119  execsql {
120    BEGIN;
121    SELECT count(*) FROM sqlite_master;
122  } db2
123} {6}
124
125do_test 3.7 {
126  catchsql { PRAGMA optimize }
127} {1 {database is locked}}
128
129proc busy_handler {n} {
130  if {$n>1000} { execsql { COMMIT } db2 }
131  return 0
132}
133do_test 3.8 {
134  catchsql { PRAGMA optimize }
135} {0 {}}
136
137}
138
139finish_test
140