xref: /sqlite-3.40.0/test/vtabdrop.test (revision 1d4b1640)
1*1d4b1640Sdan# 2018 December 28
2*1d4b1640Sdan#
3*1d4b1640Sdan#    May you do good and not evil.
4*1d4b1640Sdan#    May you find forgiveness for yourself and forgive others.
5*1d4b1640Sdan#    May you share freely, never taking more than you give.
6*1d4b1640Sdan#
7*1d4b1640Sdan#***********************************************************************
8*1d4b1640Sdan#
9*1d4b1640Sdan# The tests in this file test edge cases surrounding DROP TABLE on
10*1d4b1640Sdan# virtual tables.
11*1d4b1640Sdan#
12*1d4b1640Sdan
13*1d4b1640Sdanset testdir [file dirname $argv0]
14*1d4b1640Sdansource $testdir/tester.tcl
15*1d4b1640Sdan
16*1d4b1640Sdanifcapable !vtab { finish_test ; return }
17*1d4b1640Sdansource $testdir/fts3_common.tcl
18*1d4b1640Sdansource $testdir/malloc_common.tcl
19*1d4b1640Sdan
20*1d4b1640Sdanset testprefix vtabdrop
21*1d4b1640Sdan
22*1d4b1640Sdan#-------------------------------------------------------------------------
23*1d4b1640Sdan# Test that if a DROP TABLE is executed against an rtree table, but the
24*1d4b1640Sdan# xDestroy() call fails, the rtree table is not dropped, the sqlite_master
25*1d4b1640Sdan# table is not modified and the internal schema remains intact.
26*1d4b1640Sdan#
27*1d4b1640Sdanifcapable rtree {
28*1d4b1640Sdan  do_execsql_test 1.0 {
29*1d4b1640Sdan    CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2);
30*1d4b1640Sdan    CREATE TABLE t1(x, y);
31*1d4b1640Sdan    INSERT INTO t1 VALUES(1, 2);
32*1d4b1640Sdan  }
33*1d4b1640Sdan
34*1d4b1640Sdan  do_test 1.1 {
35*1d4b1640Sdan    execsql {
36*1d4b1640Sdan      BEGIN;
37*1d4b1640Sdan        INSERT INTO t1 VALUES(3, 4);
38*1d4b1640Sdan    }
39*1d4b1640Sdan    db eval { SELECT * FROM t1 } {
40*1d4b1640Sdan      catchsql { DROP TABLE rt }
41*1d4b1640Sdan    }
42*1d4b1640Sdan    execsql COMMIT
43*1d4b1640Sdan  } {}
44*1d4b1640Sdan
45*1d4b1640Sdan  do_execsql_test 1.2 {
46*1d4b1640Sdan    SELECT name FROM sqlite_master ORDER BY 1;
47*1d4b1640Sdan    SELECT * FROM t1;
48*1d4b1640Sdan    SELECT * FROM rt;
49*1d4b1640Sdan  } {rt rt_node rt_parent rt_rowid t1 1 2 3 4}
50*1d4b1640Sdan
51*1d4b1640Sdan  db close
52*1d4b1640Sdan  sqlite3 db test.db
53*1d4b1640Sdan
54*1d4b1640Sdan  do_execsql_test 1.3 {
55*1d4b1640Sdan    SELECT name FROM sqlite_master ORDER BY 1;
56*1d4b1640Sdan  } {rt rt_node rt_parent rt_rowid t1}
57*1d4b1640Sdan}
58*1d4b1640Sdan
59*1d4b1640Sdan#-------------------------------------------------------------------------
60*1d4b1640Sdan# Same as tests 1.*, except with fts5 instead of rtree.
61*1d4b1640Sdan#
62*1d4b1640Sdanifcapable fts5 {
63*1d4b1640Sdan  reset_db
64*1d4b1640Sdan  do_execsql_test 2.0 {
65*1d4b1640Sdan    CREATE VIRTUAL TABLE ft USING fts5(x);
66*1d4b1640Sdan    CREATE TABLE t1(x, y);
67*1d4b1640Sdan    INSERT INTO t1 VALUES(1, 2);
68*1d4b1640Sdan  }
69*1d4b1640Sdan
70*1d4b1640Sdan  do_test 2.1 {
71*1d4b1640Sdan    execsql {
72*1d4b1640Sdan      BEGIN;
73*1d4b1640Sdan        INSERT INTO t1 VALUES(3, 4);
74*1d4b1640Sdan    }
75*1d4b1640Sdan    db eval { SELECT * FROM t1 } {
76*1d4b1640Sdan      catchsql { DROP TABLE ft }
77*1d4b1640Sdan    }
78*1d4b1640Sdan    execsql COMMIT
79*1d4b1640Sdan  } {}
80*1d4b1640Sdan
81*1d4b1640Sdan  do_execsql_test 2.2 {
82*1d4b1640Sdan    SELECT name FROM sqlite_master ORDER BY 1;
83*1d4b1640Sdan  } {ft ft_config ft_content ft_data ft_docsize ft_idx t1}
84*1d4b1640Sdan
85*1d4b1640Sdan  db close
86*1d4b1640Sdan  sqlite3 db test.db
87*1d4b1640Sdan
88*1d4b1640Sdan  do_execsql_test 2.3 {
89*1d4b1640Sdan    SELECT name FROM sqlite_master ORDER BY 1;
90*1d4b1640Sdan  } {ft ft_config ft_content ft_data ft_docsize ft_idx t1}
91*1d4b1640Sdan}
92*1d4b1640Sdan
93*1d4b1640Sdan#-------------------------------------------------------------------------
94*1d4b1640Sdan# Same as tests 1.*, except with fts3 instead of rtree.
95*1d4b1640Sdan#
96*1d4b1640Sdanifcapable fts3 {
97*1d4b1640Sdan  reset_db
98*1d4b1640Sdan  do_execsql_test 2.0 {
99*1d4b1640Sdan    CREATE VIRTUAL TABLE ft USING fts3(x);
100*1d4b1640Sdan    CREATE TABLE t1(x, y);
101*1d4b1640Sdan    INSERT INTO t1 VALUES(1, 2);
102*1d4b1640Sdan  }
103*1d4b1640Sdan
104*1d4b1640Sdan  do_test 2.1 {
105*1d4b1640Sdan    execsql {
106*1d4b1640Sdan      BEGIN;
107*1d4b1640Sdan        INSERT INTO t1 VALUES(3, 4);
108*1d4b1640Sdan    }
109*1d4b1640Sdan    db eval { SELECT * FROM t1 } {
110*1d4b1640Sdan      catchsql { DROP TABLE ft }
111*1d4b1640Sdan    }
112*1d4b1640Sdan    execsql COMMIT
113*1d4b1640Sdan  } {}
114*1d4b1640Sdan
115*1d4b1640Sdan  do_execsql_test 2.2 {
116*1d4b1640Sdan    SELECT name FROM sqlite_master ORDER BY 1;
117*1d4b1640Sdan  } {ft ft_content ft_segdir ft_segments sqlite_autoindex_ft_segdir_1 t1}
118*1d4b1640Sdan
119*1d4b1640Sdan  db close
120*1d4b1640Sdan  sqlite3 db test.db
121*1d4b1640Sdan
122*1d4b1640Sdan  do_execsql_test 2.3 {
123*1d4b1640Sdan    SELECT name FROM sqlite_master ORDER BY 1;
124*1d4b1640Sdan  } {ft ft_content ft_segdir ft_segments sqlite_autoindex_ft_segdir_1 t1}
125*1d4b1640Sdan}
126*1d4b1640Sdan
127*1d4b1640Sdanfinish_test
128