# 2023 August 7 # # 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 contains tests for the content= and content_rowid= options. # source [file join [file dirname [info script]] fts5_common.tcl] set testprefix fts5contentless5 # If SQLITE_ENABLE_FTS5 is not defined, omit this file. ifcapable !fts5 { finish_test return } unset -nocomplain res do_execsql_test 1.0 { CREATE VIRTUAL TABLE t1 USING fts5(a, b, c, content='', contentless_delete=1); INSERT INTO t1 VALUES('A', 'B', 'C'); INSERT INTO t1 VALUES('D', 'E', 'F'); INSERT INTO t1 VALUES('G', 'H', 'I'); } do_execsql_test 1.01 { CREATE TABLE t2(x, y); INSERT INTO t2 VALUES('x', 'y'); } # explain_i "UPDATE t1 SET a='a' WHERE t1.rowid=1" #breakpoint #explain_i "UPDATE t1 SET a='a' FROM t2 WHERE t1.rowid=1 AND b IS NULL" #breakpoint #explain_i "UPDATE t1 SET a='a' WHERE b IS NULL AND rowid=?" foreach {tn up err} { 1 "UPDATE t1 SET a='a', b='b', c='c' WHERE rowid=1" 0 2 "UPDATE t1 SET a='a', b='b' WHERE rowid=1" 1 3 "UPDATE t1 SET b='b', c='c' WHERE rowid=1" 1 4 "UPDATE t1 SET a='a', c='c' WHERE rowid=1" 1 5 "UPDATE t1 SET a='a', c='c' WHERE t1.rowid=1 AND b IS NULL" 1 6 "UPDATE t1 SET a='a' FROM t2 WHERE t1.rowid=1" 1 7 "UPDATE t1 SET a='a', b='b', c='c' FROM t2 WHERE t1.rowid=1" 0 } { set res(0) {0 {}} set res(1) {1 {cannot UPDATE a subset of columns on fts5 contentless-delete table: t1}} do_catchsql_test 1.$tn $up $res($err) } #------------------------------------------------------------------------- reset_db proc random {n} { expr {abs(int(rand()*$n))} } proc select_one {list} { set n [llength $list] lindex $list [random $n] } proc vocab {} { list abc def ghi jkl mno pqr stu vwx yza } proc term {} { select_one [vocab] } proc document {} { set nTerm [expr [random 3] + 7] set doc "" for {set ii 0} {$ii < $nTerm} {incr ii} { lappend doc [term] } set doc } db func document document do_execsql_test 2.0 { CREATE VIRTUAL TABLE ft USING fts5(a, contentless_delete=1, content=''); INSERT INTO ft(ft, rank) VALUES('pgsz', 64); } do_test 2.1 { for {set ii 1} {$ii < 12} {incr ii} { db transaction { for {set jj 0} {$jj < 10} {incr jj} { set doc [document] execsql { INSERT INTO ft VALUES($doc); } } } } } {} do_test 2.2 { foreach r [db eval {SELECT rowid FROM ft}] { execsql { DELETE FROM ft WHERE rowid=$r } } } {} set doc [document] do_execsql_test 2.3 { INSERT INTO ft VALUES($doc) } finish_test