| # 2023 July 21 |
| # |
| # 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 fts5contentless3 |
| |
| # If SQLITE_ENABLE_FTS5 is not defined, omit this file. |
| ifcapable !fts5 { |
| finish_test |
| return |
| } |
| |
| do_execsql_test 1.0 { |
| CREATE VIRTUAL TABLE ft USING fts5(x, content=, contentless_delete=1); |
| BEGIN; |
| INSERT INTO ft VALUES('one one one'); |
| INSERT INTO ft VALUES('two two two'); |
| INSERT INTO ft VALUES('three three three'); |
| INSERT INTO ft VALUES('four four four'); |
| INSERT INTO ft VALUES('five five five'); |
| INSERT INTO ft VALUES('six six six'); |
| INSERT INTO ft VALUES('seven seven seven'); |
| INSERT INTO ft VALUES('eight eight eight'); |
| INSERT INTO ft VALUES('nine nine nine'); |
| COMMIT; |
| |
| DELETE FROM ft WHERE rowid=3; |
| } |
| |
| proc myhex {hex} { binary decode hex $hex } |
| db func myhex myhex |
| |
| do_execsql_test 1.1 { |
| UPDATE ft_data SET block = |
| myhex('04000000 00000001' || |
| '01020304 01020304 01020304 01020304' || |
| '01020304 01020304 01020304 01020304' |
| ) |
| WHERE id = (SELECT max(id) FROM ft_data); |
| } |
| |
| do_execsql_test 1.2 { |
| DELETE FROM ft WHERE rowid=1 |
| } |
| |
| do_execsql_test 1.3 { |
| SELECT rowid FROM ft('two'); |
| } {2} |
| |
| do_execsql_test 1.3 { |
| UPDATE ft_data SET block = |
| myhex('08000000 00000001' || |
| '0000000001020304 0000000001020304 0000000001020304 0000000001020304' || |
| '0000000001020304 0000000001020304 0000000001020304 0000000001020304' |
| ) |
| WHERE id = (SELECT max(id) FROM ft_data); |
| } |
| |
| do_execsql_test 1.4 { |
| SELECT rowid FROM ft('two'); |
| } {2} |
| |
| do_execsql_test 1.5 { |
| DELETE FROM ft WHERE rowid=4 |
| } |
| |
| do_execsql_test 1.6 { |
| UPDATE ft_data SET block = myhex('04000000 00000000') |
| WHERE id = (SELECT max(id) FROM ft_data); |
| } |
| do_execsql_test 1.7 { |
| SELECT rowid FROM ft('two'); |
| } {2} |
| |
| do_execsql_test 1.8 { |
| UPDATE ft_data SET block = myhex('04000000 00000000') |
| WHERE id = (SELECT max(id) FROM ft_data); |
| } |
| do_execsql_test 1.9 { |
| DELETE FROM ft WHERE rowid=8 |
| } {} |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 2.0 { |
| CREATE VIRTUAL TABLE ft USING fts5(x, content=, contentless_delete=1); |
| INSERT INTO ft VALUES('one one one'); |
| INSERT INTO ft VALUES('two two two'); |
| INSERT INTO ft VALUES('three three three'); |
| INSERT INTO ft VALUES('four four four'); |
| INSERT INTO ft VALUES('five five five'); |
| INSERT INTO ft VALUES('six six six'); |
| INSERT INTO ft VALUES('seven seven seven'); |
| INSERT INTO ft VALUES('eight eight eight'); |
| INSERT INTO ft VALUES('nine nine nine'); |
| } |
| |
| do_execsql_test 2.1 { |
| INSERT INTO ft(ft) VALUES('optimize'); |
| } |
| do_execsql_test 2.2 { |
| SELECT count(*) FROM ft_data |
| } {3} |
| do_execsql_test 2.3 { |
| DELETE FROM ft WHERE rowid=5 |
| } |
| do_execsql_test 2.4 { |
| SELECT count(*) FROM ft_data |
| } {4} |
| |
| # Check that an 'optimize' works (rewrites the index) if there is a single |
| # segment with one or more tombstone hash pages. |
| do_execsql_test 2.5 { |
| INSERT INTO ft(ft) VALUES('optimize'); |
| } |
| do_execsql_test 2.6 { |
| SELECT count(*) FROM ft_data |
| } {3} |
| |
| # Check that an 'optimize' is a no-op if there is a single segment |
| # and no tombstone hash pages. |
| do_execsql_test 2.7 { |
| INSERT INTO ft(ft) VALUES('optimize'); |
| SELECT rowid FROM ft_data; |
| } [db eval {SELECT rowid FROM ft_data}] |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 3.0 { |
| CREATE VIRTUAL TABLE ft USING fts5(x, content=, contentless_delete=1); |
| INSERT INTO ft(ft, rank) VALUES('pgsz', 64); |
| WITH s(i) AS ( |
| SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 |
| ) |
| INSERT INTO ft(rowid, x) SELECT i, i||' '||i||' '||i||' '||i FROM s; |
| INSERT INTO ft(ft) VALUES('optimize'); |
| } |
| |
| do_execsql_test 3.1 { |
| SELECT count(*) FROM ft_data |
| } {200} |
| |
| do_execsql_test 3.2 { |
| DELETE FROM ft WHERE (rowid % 50)==0; |
| SELECT count(*) FROM ft_data; |
| } {203} |
| |
| do_execsql_test 3.3 { |
| INSERT INTO ft(ft, rank) VALUES('merge', 500); |
| SELECT rowid FROM ft_data; |
| } [db eval {SELECT rowid FROM ft_data}] |
| |
| do_execsql_test 3.4 { |
| INSERT INTO ft(ft, rank) VALUES('merge', -1000); |
| SELECT count(*) FROM ft_data; |
| } {197} |
| |
| do_execsql_test 3.5 { |
| DELETE FROM ft WHERE (rowid % 50)==1; |
| SELECT count(*) FROM ft_data; |
| } {200} |
| |
| do_execsql_test 3.6 { |
| SELECT level, segment, npgtombstone FROM fts5_structure( |
| (SELECT block FROM ft_data WHERE id=10) |
| ) |
| } {1 0 3} |
| |
| do_test 3.6 { |
| while 1 { |
| set nChange [db total_changes] |
| execsql { INSERT INTO ft(ft, rank) VALUES('merge', -5) } |
| if {([db total_changes] - $nChange)<2} break |
| } |
| } {} |
| |
| do_execsql_test 3.7 { |
| SELECT level, segment, npgtombstone FROM fts5_structure( |
| (SELECT block FROM ft_data WHERE id=10) |
| ) |
| } {2 0 0} |
| |
| |
| finish_test |