import less(1)
[unleashed/tickless.git] / usr / src / lib / libsqlite / test / progress.test
blob4d94239a04dc759c02808a3aa8ff23be78b38b35
2 #pragma ident   "%Z%%M% %I%     %E% SMI"
4 # 2001 September 15
6 # The author disclaims copyright to this source code.  In place of
7 # a legal notice, here is a blessing:
9 #    May you do good and not evil.
10 #    May you find forgiveness for yourself and forgive others.
11 #    May you share freely, never taking more than you give.
13 #***********************************************************************
14 # This file implements regression tests for SQLite library.  The
15 # focus of this file is testing the 'progress callback'.
17 # $Id: progress.test,v 1.1 2003/10/18 09:37:27 danielk1977 Exp $
19 set testdir [file dirname $argv0]
20 source $testdir/tester.tcl
22 # Build some test data
24 execsql {
25   BEGIN;
26   CREATE TABLE t1(a);
27   INSERT INTO t1 VALUES(1);
28   INSERT INTO t1 VALUES(2);
29   INSERT INTO t1 VALUES(3);
30   INSERT INTO t1 VALUES(4);
31   INSERT INTO t1 VALUES(5);
32   INSERT INTO t1 VALUES(6);
33   INSERT INTO t1 VALUES(7);
34   INSERT INTO t1 VALUES(8);
35   INSERT INTO t1 VALUES(9);
36   INSERT INTO t1 VALUES(10);
37   COMMIT;
41 # Test that the progress callback is invoked.
42 do_test progress-1.0 {
43   set counter 0
44   db progress 1 "[namespace code {incr counter}] ; expr 0"
45   execsql {
46     SELECT * FROM t1
47   }
48   expr $counter > 1
49 } 1
51 # Test that the query is abandoned when the progress callback returns non-zero
52 do_test progress1.1 {
53   set counter 0
54   db progress 1 "[namespace code {incr counter}] ; expr 1"
55   execsql {
56     SELECT * FROM t1
57   }
58   set counter 
59 } 1
61 # Test that the query is rolled back when the progress callback returns
62 # non-zero.
63 do_test progress1.2 {
65   # This figures out how many opcodes it takes to copy 5 extra rows into t1.
66   db progress 1 "[namespace code {incr five_rows}] ; expr 0"
67   set five_rows 0
68   execsql {
69     INSERT INTO t1 SELECT a+10 FROM t1 WHERE a < 6
70   }
71   db progress 0 ""
72   execsql {
73     DELETE FROM t1 WHERE a > 10
74   }
76   # Now set up the progress callback to abandon the query after the number of
77   # opcodes to copy 5 rows. That way, when we try to copy 6 rows, we know
78   # some data will have been inserted into the table by the time the progress
79   # callback abandons the query.
80   db progress $five_rows "expr 1"
81   execsql {
82     INSERT INTO t1 SELECT a+10 FROM t1 WHERE a < 7
83   }
84   execsql {
85     SELECT count(*) FROM t1
86   }
87 } 10
89 # Test that an active transaction remains active and not rolled back after the
90 # progress query abandons a query. 
91 do_test progress1.3 {
93   db progress 0 ""
94   execsql BEGIN
95   execsql {
96     INSERT INTO t1 VALUES(11)
97   }
98   db progress 1 "expr 1"
99   execsql {
100     INSERT INTO t1 VALUES(12)
101   }
102   db progress 0 ""
103   execsql COMMIT
104   execsql {
105     SELECT count(*) FROM t1
106   }
107 } 11
109 # Check that a value of 0 for N means no progress callback
110 do_test progress1.4 {
111   set counter 0
112   db progress 0 "[namespace code {incr counter}] ; expr 0"
113   execsql {
114     SELECT * FROM t1;
115   }
116   set counter
117 } 0
119 db progress 0 ""
121 finish_test