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