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