1
2#pragma ident	"%Z%%M%	%I%	%E% SMI"
3
4# 2001 September 15
5#
6# The author disclaims copyright to this source code.  In place of
7# a legal notice, here is a blessing:
8#
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.
12#
13#***********************************************************************
14# This file implements regression tests for SQLite library.  The
15# focus of this file is testing the 'progress callback'.
16#
17# $Id: progress.test,v 1.1 2003/10/18 09:37:27 danielk1977 Exp $
18
19set testdir [file dirname $argv0]
20source $testdir/tester.tcl
21
22# Build some test data
23#
24execsql {
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;
38}
39
40
41# Test that the progress callback is invoked.
42do_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
50
51# Test that the query is abandoned when the progress callback returns non-zero
52do_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
60
61# Test that the query is rolled back when the progress callback returns
62# non-zero.
63do_test progress1.2 {
64
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  }
75
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
88
89# Test that an active transaction remains active and not rolled back after the
90# progress query abandons a query.
91do_test progress1.3 {
92
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
108
109# Check that a value of 0 for N means no progress callback
110do_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
118
119db progress 0 ""
120
121finish_test
122