# 2023 April 14 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #************************************************************************* # This file implements regression tests for SQLite library. The # focus of this script is testing the FTS5 module. # source [file join [file dirname [info script]] fts5_common.tcl] source $testdir/malloc_common.tcl set testprefix fts5securefault # If SQLITE_ENABLE_FTS5 is not defined, omit this file. return_if_no_fts5 do_execsql_test 1.0 { CREATE VIRTUAL TABLE t1 USING fts5(ab); INSERT INTO t1(rowid, ab) VALUES (0, 'abc'), (1, 'abc'), (2, 'abc'), (3, 'abc'), (4, 'def'); } faultsim_save_and_close do_faultsim_test 1.1 -faults oom* -prep { faultsim_restore_and_reopen execsql { INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } } -body { execsql { DELETE FROM t1 WHERE rowid=2 } } -test { faultsim_test_result {0 {}} } do_faultsim_test 1.2 -faults oom* -prep { faultsim_restore_and_reopen execsql { INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } } -body { execsql { DELETE FROM t1 WHERE rowid IN(0, 1, 2, 3, 4) } } -test { faultsim_test_result {0 {}} } #------------------------------------------------------------------------- # reset_db set big [string repeat abcdefghij 5] set big2 [string repeat klmnopqrst 5] set doc "$big $big2" do_execsql_test 2.0 { CREATE VIRTUAL TABLE t1 USING fts5(ab); INSERT INTO t1(t1, rank) VALUES('pgsz', 64); WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<4 ) INSERT INTO t1(rowid, ab) SELECT i, $doc FROM s; } faultsim_save_and_close do_faultsim_test 2.1 -faults oom* -prep { faultsim_restore_and_reopen execsql { INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } } -body { execsql { DELETE FROM t1 WHERE rowid = 3 } execsql { DELETE FROM t1 WHERE rowid = 4 } } -test { faultsim_test_result {0 {}} } #------------------------------------------------------------------------- # reset_db set big [string repeat abcdefghij 5] set big2 [string repeat klmnopqrst 5] set doc "$big $big2" do_execsql_test 3.0 { CREATE VIRTUAL TABLE t1 USING fts5(ab); INSERT INTO t1(t1, rank) VALUES('pgsz', 64); WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<25 ) INSERT INTO t1(rowid, ab) SELECT i, $doc FROM s; INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); DELETE FROM t1 WHERE rowid BETWEEN 3 AND 23; } faultsim_save_and_close do_faultsim_test 3.1 -faults oom* -prep { faultsim_restore_and_reopen execsql { INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } } -body { execsql { DELETE FROM t1 WHERE rowid = 24 } execsql { DELETE FROM t1 WHERE rowid = 25 } } -test { faultsim_test_result {0 {}} } #------------------------------------------------------------------------- # reset_db set doc [string repeat "tok " 400] do_execsql_test 4.0 { CREATE VIRTUAL TABLE t1 USING fts5(ab); INSERT INTO t1(t1, rank) VALUES('pgsz', 64); INSERT INTO t1(rowid, ab) VALUES(1, $doc), (2, $doc), (3, $doc); } faultsim_save_and_close do_faultsim_test 4.1 -faults oom* -prep { faultsim_restore_and_reopen execsql { INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } } -body { execsql { DELETE FROM t1 WHERE rowid = 2 } } -test { faultsim_test_result {0 {}} } #------------------------------------------------------------------------- # reset_db set doc1 [string repeat "abc " 10] set doc2 [string repeat "def " 10] do_test 5.0 { execsql { CREATE VIRTUAL TABLE t1 USING fts5(ab); INSERT INTO t1(t1, rank) VALUES('pgsz', 64); BEGIN; } for {set i 0} {$i < 50} {incr i} { execsql { INSERT INTO t1(rowid, ab) VALUES($i, 'abcdefg'); } } execsql { INSERT INTO t1(rowid, ab) VALUES(105, 'def'); COMMIT; } } {} faultsim_save_and_close do_faultsim_test 5.1 -faults oom* -prep { faultsim_restore_and_reopen execsql { INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } } -body { execsql { DELETE FROM t1 WHERE rowid = 105 } } -test { faultsim_test_result {0 {}} } #------------------------------------------------------------------------- # reset_db do_test 6.0 { execsql { CREATE VIRTUAL TABLE t1 USING fts5(ab); INSERT INTO t1(t1, rank) VALUES('pgsz', 64); BEGIN; INSERT INTO t1(rowid, ab) VALUES(1, 'abcdefg'); INSERT INTO t1(rowid, ab) VALUES(2, 'abcdefg'); INSERT INTO t1(rowid, ab) VALUES(3, 'abcdefg'); COMMIT; } } {} faultsim_save_and_close do_faultsim_test 6.1 -faults oom* -prep { faultsim_restore_and_reopen execsql { INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } } -body { execsql { UPDATE t1 SET ab='abcdefg' WHERE rowid=2; } } -test { faultsim_test_result {0 {}} } #------------------------------------------------------------------------- # reset_db do_test 7.0 { execsql { CREATE VIRTUAL TABLE t1 USING fts5(ab); INSERT INTO t1(t1, rank) VALUES('pgsz', 32); INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); } } {} faultsim_save_and_close do_faultsim_test 7.1 -faults oom* -prep { faultsim_restore_and_reopen set big1 "[string repeat x 50] [string repeat y 50] [string repeat z 50]" execsql { BEGIN; INSERT INTO t1 VALUES($big1); } } -body { execsql { COMMIT } } -test { faultsim_test_result {0 {}} } finish_test