Fix a case where a corrupt stat4 record could go unrecognized due to integer overflow.
[sqlite.git] / test / vtabdrop.test
blob1f9309e465b28cfa3b93b88dc1a0b50f8797ace9
1 # 2018 December 28
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.
7 #***********************************************************************
9 # The tests in this file test edge cases surrounding DROP TABLE on 
10 # virtual tables.
13 set testdir [file dirname $argv0]
14 source $testdir/tester.tcl
16 ifcapable !vtab { finish_test ; return }
17 source $testdir/fts3_common.tcl
18 source $testdir/malloc_common.tcl
20 set testprefix vtabdrop
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
27 ifcapable 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}
59 #-------------------------------------------------------------------------
60 # Same as tests 1.*, except with fts5 instead of rtree.
61
62 ifcapable 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}
93 #-------------------------------------------------------------------------
94 # Same as tests 1.*, except with fts3 instead of rtree.
95
96 ifcapable 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}
127 finish_test