xref: /sqlite-3.40.0/test/vtab4.test (revision 1acb539f)
1c69cdfd4Sdanielk1977# 2006 June 10
2c69cdfd4Sdanielk1977#
3c69cdfd4Sdanielk1977# The author disclaims copyright to this source code.  In place of
4c69cdfd4Sdanielk1977# a legal notice, here is a blessing:
5c69cdfd4Sdanielk1977#
6c69cdfd4Sdanielk1977#    May you do good and not evil.
7c69cdfd4Sdanielk1977#    May you find forgiveness for yourself and forgive others.
8c69cdfd4Sdanielk1977#    May you share freely, never taking more than you give.
9c69cdfd4Sdanielk1977#
10c69cdfd4Sdanielk1977#***********************************************************************
11c69cdfd4Sdanielk1977# This file implements regression tests for SQLite library. The
12c69cdfd4Sdanielk1977# focus is on testing the following virtual table methods:
13c69cdfd4Sdanielk1977#
14c69cdfd4Sdanielk1977#     xBegin
15c69cdfd4Sdanielk1977#     xSync
16c69cdfd4Sdanielk1977#     xCommit
17c69cdfd4Sdanielk1977#     xRollback
18c69cdfd4Sdanielk1977#
19e8f52c50Sdrh# $Id: vtab4.test,v 1.3 2008/07/12 14:52:21 drh Exp $
20c69cdfd4Sdanielk1977
21c69cdfd4Sdanielk1977set testdir [file dirname $argv0]
22c69cdfd4Sdanielk1977source $testdir/tester.tcl
23c69cdfd4Sdanielk1977
24f80ad49fSdrhunset -nocomplain echo_module
25f80ad49fSdrhunset -nocomplain echo_module_sync_fail
26f80ad49fSdrh
27c69cdfd4Sdanielk1977ifcapable !vtab {
28c69cdfd4Sdanielk1977  finish_test
29c69cdfd4Sdanielk1977  return
30c69cdfd4Sdanielk1977}
31c69cdfd4Sdanielk1977
32c69cdfd4Sdanielk1977# Register the echo module
33c69cdfd4Sdanielk1977db cache size 0
34c69cdfd4Sdanielk1977register_echo_module [sqlite3_connection_pointer db]
35c69cdfd4Sdanielk1977
36c69cdfd4Sdanielk1977do_test vtab4-1.1 {
37c69cdfd4Sdanielk1977  execsql {
38c69cdfd4Sdanielk1977    CREATE TABLE treal(a PRIMARY KEY, b, c);
39c69cdfd4Sdanielk1977    CREATE VIRTUAL TABLE techo USING echo(treal);
40c69cdfd4Sdanielk1977  }
41c69cdfd4Sdanielk1977} {}
42c69cdfd4Sdanielk1977
43c69cdfd4Sdanielk1977# Test an INSERT, UPDATE and DELETE statement on the virtual table
44c69cdfd4Sdanielk1977# in an implicit transaction. Each should result in a single call
45c69cdfd4Sdanielk1977# to xBegin, xSync and xCommit.
46c69cdfd4Sdanielk1977#
47c69cdfd4Sdanielk1977do_test vtab4-1.2 {
48c69cdfd4Sdanielk1977  set echo_module [list]
49c69cdfd4Sdanielk1977  execsql {
50c69cdfd4Sdanielk1977    INSERT INTO techo VALUES(1, 2, 3);
51c69cdfd4Sdanielk1977  }
52c69cdfd4Sdanielk1977  set echo_module
53c69cdfd4Sdanielk1977} {xBegin echo(treal) xSync echo(treal) xCommit echo(treal)}
54c69cdfd4Sdanielk1977do_test vtab4-1.3 {
55c69cdfd4Sdanielk1977  set echo_module [list]
56c69cdfd4Sdanielk1977  execsql {
57c69cdfd4Sdanielk1977    UPDATE techo SET a = 2;
58c69cdfd4Sdanielk1977  }
59c69cdfd4Sdanielk1977  set echo_module
60*1acb539fSdan} [list xBestIndex {SELECT rowid, a, b, c FROM 'treal'} \
61c69cdfd4Sdanielk1977        xBegin     echo(treal)                    \
62*1acb539fSdan        xFilter    {SELECT rowid, a, b, c FROM 'treal'} \
63c69cdfd4Sdanielk1977        xSync      echo(treal)                    \
64c69cdfd4Sdanielk1977        xCommit    echo(treal)                    \
65c69cdfd4Sdanielk1977]
66c69cdfd4Sdanielk1977do_test vtab4-1.4 {
67c69cdfd4Sdanielk1977  set echo_module [list]
68c69cdfd4Sdanielk1977  execsql {
69c69cdfd4Sdanielk1977    DELETE FROM techo;
70c69cdfd4Sdanielk1977  }
71c69cdfd4Sdanielk1977  set echo_module
72*1acb539fSdan} [list xBestIndex {SELECT rowid, NULL, NULL, NULL FROM 'treal'} \
73c69cdfd4Sdanielk1977        xBegin     echo(treal)                    \
74*1acb539fSdan        xFilter    {SELECT rowid, NULL, NULL, NULL FROM 'treal'} \
75c69cdfd4Sdanielk1977        xSync      echo(treal)                    \
76c69cdfd4Sdanielk1977        xCommit    echo(treal)                    \
77c69cdfd4Sdanielk1977]
78c69cdfd4Sdanielk1977
79c69cdfd4Sdanielk1977# Ensure xBegin is not called more than once in a single transaction.
80c69cdfd4Sdanielk1977#
81c69cdfd4Sdanielk1977do_test vtab4-2.1 {
82c69cdfd4Sdanielk1977  set echo_module [list]
83c69cdfd4Sdanielk1977  execsql {
84c69cdfd4Sdanielk1977    BEGIN;
85c69cdfd4Sdanielk1977    INSERT INTO techo VALUES(1, 2, 3);
86c69cdfd4Sdanielk1977    INSERT INTO techo VALUES(4, 5, 6);
87c69cdfd4Sdanielk1977    INSERT INTO techo VALUES(7, 8, 9);
88c69cdfd4Sdanielk1977    COMMIT;
89c69cdfd4Sdanielk1977  }
90c69cdfd4Sdanielk1977  set echo_module
91c69cdfd4Sdanielk1977} {xBegin echo(treal) xSync echo(treal) xCommit echo(treal)}
92c69cdfd4Sdanielk1977
93c69cdfd4Sdanielk1977# Try a transaction with two virtual tables.
94c69cdfd4Sdanielk1977#
95c69cdfd4Sdanielk1977do_test vtab4-2.2 {
96c69cdfd4Sdanielk1977  execsql {
97c69cdfd4Sdanielk1977    CREATE TABLE sreal(a, b, c UNIQUE);
98c69cdfd4Sdanielk1977    CREATE VIRTUAL TABLE secho USING echo(sreal);
99c69cdfd4Sdanielk1977  }
100c69cdfd4Sdanielk1977  set echo_module [list]
101c69cdfd4Sdanielk1977  execsql {
102c69cdfd4Sdanielk1977    BEGIN;
103c69cdfd4Sdanielk1977    INSERT INTO secho SELECT * FROM techo;
104c69cdfd4Sdanielk1977    DELETE FROM techo;
105c69cdfd4Sdanielk1977    COMMIT;
106c69cdfd4Sdanielk1977  }
107c69cdfd4Sdanielk1977  set echo_module
108*1acb539fSdan} [list xBestIndex {SELECT rowid, a, b, c FROM 'treal'} \
109c69cdfd4Sdanielk1977        xBegin     echo(sreal)                    \
110*1acb539fSdan        xFilter    {SELECT rowid, a, b, c FROM 'treal'} \
111*1acb539fSdan        xBestIndex {SELECT rowid, NULL, NULL, NULL FROM 'treal'} \
112c69cdfd4Sdanielk1977        xBegin     echo(treal)                    \
113*1acb539fSdan        xFilter    {SELECT rowid, NULL, NULL, NULL FROM 'treal'} \
114c69cdfd4Sdanielk1977        xSync   echo(sreal)                       \
115c69cdfd4Sdanielk1977        xSync   echo(treal)                       \
116c69cdfd4Sdanielk1977        xCommit echo(sreal)                       \
117c69cdfd4Sdanielk1977        xCommit echo(treal)                       \
118c69cdfd4Sdanielk1977]
119c69cdfd4Sdanielk1977do_test vtab4-2.3 {
120c69cdfd4Sdanielk1977  execsql {
121c69cdfd4Sdanielk1977    SELECT * FROM secho;
122c69cdfd4Sdanielk1977  }
123c69cdfd4Sdanielk1977} {1 2 3 4 5 6 7 8 9}
124c69cdfd4Sdanielk1977do_test vtab4-2.4 {
125c69cdfd4Sdanielk1977  execsql {
126c69cdfd4Sdanielk1977    SELECT * FROM techo;
127c69cdfd4Sdanielk1977  }
128c69cdfd4Sdanielk1977} {}
129c69cdfd4Sdanielk1977
130c69cdfd4Sdanielk1977# Try an explicit ROLLBACK on a transaction with two open virtual tables.
131c69cdfd4Sdanielk1977do_test vtab4-2.5 {
132c69cdfd4Sdanielk1977  set echo_module [list]
133c69cdfd4Sdanielk1977  execsql {
134c69cdfd4Sdanielk1977    BEGIN;
135c69cdfd4Sdanielk1977    INSERT INTO techo SELECT * FROM secho;
136c69cdfd4Sdanielk1977    DELETE FROM secho;
137c69cdfd4Sdanielk1977    ROLLBACK;
138c69cdfd4Sdanielk1977  }
139c69cdfd4Sdanielk1977  set echo_module
140*1acb539fSdan} [list xBestIndex {SELECT rowid, a, b, c FROM 'sreal'} \
141c69cdfd4Sdanielk1977        xBegin     echo(treal)                    \
142*1acb539fSdan        xFilter    {SELECT rowid, a, b, c FROM 'sreal'} \
143*1acb539fSdan        xBestIndex {SELECT rowid, NULL, NULL, NULL FROM 'sreal'} \
144c69cdfd4Sdanielk1977        xBegin     echo(sreal)                    \
145*1acb539fSdan        xFilter    {SELECT rowid, NULL, NULL, NULL FROM 'sreal'} \
146c69cdfd4Sdanielk1977        xRollback  echo(treal)                    \
147c69cdfd4Sdanielk1977        xRollback  echo(sreal)                    \
148c69cdfd4Sdanielk1977]
149c69cdfd4Sdanielk1977do_test vtab4-2.6 {
150c69cdfd4Sdanielk1977  execsql {
151c69cdfd4Sdanielk1977    SELECT * FROM secho;
152c69cdfd4Sdanielk1977  }
153c69cdfd4Sdanielk1977} {1 2 3 4 5 6 7 8 9}
154c69cdfd4Sdanielk1977do_test vtab4-2.7 {
155c69cdfd4Sdanielk1977  execsql {
156c69cdfd4Sdanielk1977    SELECT * FROM techo;
157c69cdfd4Sdanielk1977  }
158c69cdfd4Sdanielk1977} {}
159c69cdfd4Sdanielk1977
160c69cdfd4Sdanielk1977do_test vtab4-3.1 {
161c69cdfd4Sdanielk1977  set echo_module [list]
162c69cdfd4Sdanielk1977  set echo_module_sync_fail treal
163c69cdfd4Sdanielk1977  catchsql {
164c69cdfd4Sdanielk1977    INSERT INTO techo VALUES(1, 2, 3);
165c69cdfd4Sdanielk1977  }
166c69cdfd4Sdanielk1977} {1 {unknown error}}
167c69cdfd4Sdanielk1977do_test vtab4-3.2 {
168c69cdfd4Sdanielk1977  set echo_module
169c69cdfd4Sdanielk1977} {xBegin echo(treal) xSync echo(treal) xRollback echo(treal)}
170c69cdfd4Sdanielk1977
171c69cdfd4Sdanielk1977do_test vtab4-3.3 {
172c69cdfd4Sdanielk1977  set echo_module [list]
173c69cdfd4Sdanielk1977  set echo_module_sync_fail sreal
174c69cdfd4Sdanielk1977  catchsql {
175c69cdfd4Sdanielk1977    BEGIN;
176c69cdfd4Sdanielk1977    INSERT INTO techo SELECT * FROM secho;
177c69cdfd4Sdanielk1977    DELETE FROM secho;
178c69cdfd4Sdanielk1977    COMMIT;
179c69cdfd4Sdanielk1977  }
180c69cdfd4Sdanielk1977  set echo_module
181*1acb539fSdan} [list xBestIndex {SELECT rowid, a, b, c FROM 'sreal'} \
182c69cdfd4Sdanielk1977        xBegin     echo(treal)                    \
183*1acb539fSdan        xFilter    {SELECT rowid, a, b, c FROM 'sreal'} \
184*1acb539fSdan        xBestIndex {SELECT rowid, NULL, NULL, NULL FROM 'sreal'} \
185c69cdfd4Sdanielk1977        xBegin     echo(sreal)                    \
186*1acb539fSdan        xFilter    {SELECT rowid, NULL, NULL, NULL FROM 'sreal'} \
187c69cdfd4Sdanielk1977        xSync      echo(treal)                    \
188c69cdfd4Sdanielk1977        xSync      echo(sreal)                    \
189c69cdfd4Sdanielk1977        xRollback  echo(treal)                    \
190c69cdfd4Sdanielk1977        xRollback  echo(sreal)                    \
191c69cdfd4Sdanielk1977]
192c69cdfd4Sdanielk1977
193c69cdfd4Sdanielk1977finish_test
194