xref: /sqlite-3.40.0/test/vtab_shared.test (revision f2fcd075)
1# 2007 April 16
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 tests interactions between the virtual table and
12# shared-schema functionality.
13#
14# $Id: vtab_shared.test,v 1.3 2009/07/24 17:58:53 danielk1977 Exp $
15
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19ifcapable !vtab||!shared_cache {
20  finish_test
21  return
22}
23
24db close
25sqlite3_enable_shared_cache 1
26sqlite3 db  test.db
27sqlite3 db2 test.db
28
29do_test vtab_shared-1.1 {
30  register_echo_module [sqlite3_connection_pointer db]
31  execsql {
32    CREATE TABLE t0(a, b, c);
33    INSERT INTO t0 VALUES(1, 2, 3);
34    CREATE VIRTUAL TABLE t1 USING echo(t0);
35  }
36} {}
37
38do_test vtab_shared-1.2 {
39  execsql { SELECT * FROM t1 } db
40} {1 2 3}
41
42# Fails because the 'echo' module has not been registered with connection db2
43do_test vtab_shared-1.3 {
44  catchsql { SELECT * FROM t1 } db2
45} {1 {no such module: echo}}
46
47do_test vtab_shared-1.4 {
48  execsql { SELECT * FROM t0 } db2
49} {1 2 3}
50
51do_test vtab_shared-1.5 {
52  register_echo_module [sqlite3_connection_pointer db2]
53  execsql { SELECT * FROM t1 } db
54} {1 2 3}
55
56# Works after the module is registered with db2
57do_test vtab_shared-1.6 {
58  execsql { SELECT * FROM t1 } db2
59} {1 2 3}
60
61# Set a write-lock on table t0 using connection [db]. Then try to read from
62# virtual table t1 using [db2]. That this returns an SQLITE_LOCKED error
63# shows that the correct sqlite3_vtab is being used.
64#
65do_test vtab_shared-1.8.1 {
66  execsql {
67    BEGIN;
68    INSERT INTO t1 VALUES(4, 5, 6);
69    SELECT * FROM t1;
70  }
71} {1 2 3 4 5 6}
72do_test vtab_shared-1.8.2 {
73  catchsql { SELECT * FROM t1 } db2
74} {1 {database table is locked}}
75do_test vtab_shared-1.8.3 {
76  catchsql { SELECT *  FROM t0 } db2
77} {1 {database table is locked: t0}}
78do_test vtab_shared-1.8.4 {
79  execsql { SELECT * FROM t0 } db
80} {1 2 3 4 5 6}
81do_test vtab_shared-1.8.5 {
82  execsql { COMMIT } db
83  execsql { SELECT *  FROM t1 } db2
84} {1 2 3 4 5 6}
85
86# While a SELECT is active on virtual table t1 via connection [db], close
87# [db2]. This causes the schema to be reset internally. Verify that this
88# does not cause a problem.
89#
90foreach {iTest dbSelect dbClose} {
91  1 db  db2
92  2 db  db2
93  3 db2 db
94} {
95  do_test vtab_shared-1.9.$iTest {
96    set res [list]
97    $dbSelect eval { SELECT * FROM t1 } {
98      if {$a == 1} {$dbClose close}
99      lappend res $a $b $c
100    }
101    sqlite3 $dbClose test.db
102    register_echo_module [sqlite3_connection_pointer $dbClose]
103    set res
104  } {1 2 3 4 5 6}
105}
106
107# Ensure that it is not possible for one connection to DROP a virtual
108# table while a second connection is reading from the database.
109#
110do_test vtab_shared-1.10 {
111  db eval { SELECT * FROM t1 } {
112    set error [catchsql { DROP TABLE t1 } db2]
113    break
114  }
115  set error
116} {1 {database table is locked: sqlite_master}}
117
118do_test vtab_shared-1.11 {
119breakpoint
120  execsql {
121    CREATE VIRTUAL TABLE t2 USING echo(t0);
122    CREATE VIRTUAL TABLE t3 USING echo(t0);
123  }
124  execsql { SELECT * FROM t3 } db2
125} {1 2 3 4 5 6}
126
127do_test vtab_shared-1.12.1 {
128  db close
129  execsql {
130    SELECT * FROM t1 UNION ALL
131    SELECT * FROM t2 UNION ALL
132    SELECT * FROM t3
133  } db2
134} {1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6}
135do_test vtab_shared-1.12.2 {
136  sqlite3 db test.db
137  register_echo_module [sqlite3_connection_pointer db]
138  execsql {
139    SELECT * FROM t1 UNION ALL
140    SELECT * FROM t2 UNION ALL
141    SELECT * FROM t3
142  } db
143} {1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6}
144
145# Try a rename or two.
146#
147ifcapable altertable {
148  do_test vtab_shared-1.13.1 {
149    execsql { ALTER TABLE t1 RENAME TO t4 }
150    execsql { SELECT * FROM t4 } db
151  } {1 2 3 4 5 6}
152  do_test vtab_shared-1.13.2 {
153    execsql { SELECT * FROM t4 } db2
154  } {1 2 3 4 5 6}
155  do_test vtab_shared-1.13.3 {
156    execsql { ALTER TABLE t2 RENAME TO t5 }
157    execsql { SELECT * FROM t4 } db2
158  } {1 2 3 4 5 6}
159}
160
161# Try an UPDATE/INSERT/DELETE on a shared vtab as the first statement after a
162# schema is loaded.
163do_test vtab_shared_1.14.1 {
164  db2 close
165  sqlite3 db2 test.db
166  register_echo_module [sqlite3_connection_pointer db2]
167  execsql { SELECT * FROM t3 }
168} {1 2 3 4 5 6}
169do_test vtab_shared_1.14.2 {
170  execsql {
171    UPDATE t3 SET c = 'six' WHERE c = 6;
172    SELECT * FROM t3;
173  } db2
174} {1 2 3 4 5 six}
175do_test vtab_shared_1.14.3 {
176  db2 close
177  sqlite3 db2 test.db
178  register_echo_module [sqlite3_connection_pointer db2]
179  execsql { SELECT * FROM t3 }
180} {1 2 3 4 5 six}
181do_test vtab_shared_1.14.4 {
182  execsql {
183    DELETE FROM t3 WHERE c = 'six';
184    SELECT * FROM t3;
185  } db2
186} {1 2 3}
187do_test vtab_shared_1.14.5 {
188  db2 close
189  sqlite3 db2 test.db
190  register_echo_module [sqlite3_connection_pointer db2]
191  execsql { SELECT * FROM t3 }
192} {1 2 3}
193do_test vtab_shared_1.14.6 {
194  execsql {
195    INSERT INTO t3 VALUES(4, 5, 6);
196    SELECT * FROM t3;
197  } db2
198} {1 2 3 4 5 6}
199
200do_test vtab_shared_1.15.1 {
201  db2 close
202  sqlite3 db2 test.db
203  register_echo_module [sqlite3_connection_pointer db2]
204  execsql {
205    UPDATE t3 SET c = 'six' WHERE c = 6;
206    SELECT * FROM t3;
207  } db2
208} {1 2 3 4 5 six}
209do_test vtab_shared_1.15.2 {
210  db2 close
211  sqlite3 db2 test.db
212  register_echo_module [sqlite3_connection_pointer db2]
213  execsql {
214    DELETE FROM t3 WHERE c = 'six';
215    SELECT * FROM t3;
216  } db2
217} {1 2 3}
218do_test vtab_shared_1.15.3 {
219  db2 close
220  sqlite3 db2 test.db
221  register_echo_module [sqlite3_connection_pointer db2]
222  execsql {
223    INSERT INTO t3 VALUES(4, 5, 6);
224    SELECT * FROM t3;
225  }
226} {1 2 3 4 5 6}
227
228db close
229db2 close
230sqlite3_enable_shared_cache 0
231finish_test
232