| # 2023 Feb 17 |
| # |
| # 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. |
| # |
| #************************************************************************* |
| # |
| # TESTRUNNER: slow |
| # |
| |
| source [file join [file dirname [info script]] fts5_common.tcl] |
| ifcapable !fts5 { finish_test ; return } |
| set ::testprefix fts5secure3 |
| |
| do_execsql_test 1.0 { |
| CREATE VIRTUAL TABLE ft USING fts5(col); |
| INSERT INTO ft VALUES('data for the table'); |
| INSERT INTO ft VALUES('more of the same'); |
| INSERT INTO ft VALUES('and extra data'); |
| |
| INSERT INTO ft(ft, rank) VALUES('secure-delete', 1); |
| } |
| |
| do_execsql_test 1.1 { |
| BEGIN; |
| INSERT INTO ft(rowid, col) VALUES(0, 'the next data'); |
| DELETE FROM ft WHERE rowid=1; |
| DELETE FROM ft WHERE rowid=2; |
| INSERT INTO ft(rowid, col) VALUES(6, 'with some more of the same data'); |
| COMMIT; |
| } |
| |
| do_execsql_test 1.2 { |
| INSERT INTO ft(ft) VALUES('integrity-check'); |
| } |
| |
| #------------------------------------------------------------------------- |
| |
| reset_db |
| do_execsql_test 2.0 { |
| CREATE VIRTUAL TABLE t1 USING fts5(x); |
| INSERT INTO t1(t1, rank) VALUES('pgsz', 64); |
| INSERT INTO t1(t1, rank) VALUES('secure-delete', 1); |
| BEGIN; |
| INSERT INTO t1 VALUES('the start'); |
| } |
| do_test 2.1 { |
| for {set i 0} {$i < 1000} {incr i} { |
| execsql { INSERT INTO t1 VALUES('the ' || hex(randomblob(3))) } |
| } |
| execsql { |
| INSERT INTO t1 VALUES('the end'); |
| COMMIT; |
| } |
| } {} |
| |
| do_execsql_test 2.2 { |
| DELETE FROM t1 WHERE rowid BETWEEN 2 AND 1000; |
| } |
| |
| do_execsql_test 2.3 { |
| INSERT INTO t1(t1) VALUES('integrity-check'); |
| } |
| |
| do_execsql_test 2.6 { |
| INSERT INTO t1(rowid, x) VALUES(500, 'middle'); |
| INSERT INTO t1(rowid, x) VALUES(501, 'value'); |
| SELECT * FROM t1('the middle'); |
| } |
| |
| do_execsql_test 2.7 { |
| INSERT INTO t1(t1) VALUES('optimize'); |
| } |
| |
| do_execsql_test 2.8 { |
| SELECT count(*) FROM t1_data |
| } 4 |
| |
| #execsql_pp { SELECT id, quote(block), fts5_decode(id, block) FROM t1_data; } |
| |
| #------------------------------------------------------------------------- |
| # Tests with large/small rowid values. |
| # |
| |
| foreach {tn cfg} { |
| 1 "" |
| 2 "INSERT INTO fff(fff, rank) VALUES('secure-delete', 1)" |
| } { |
| reset_db |
| |
| expr srand(0) |
| |
| set vocab { |
| Popper Poppins Popsicle Porfirio Porrima Porsche |
| Porter Portia Portland Portsmouth Portugal Portuguese |
| Poseidon Post PostgreSQL Potemkin Potomac Potsdam |
| Pottawatomie Potter Potts Pound Poussin Powell |
| PowerPC PowerPoint Powers Powhatan Poznan Prada |
| Prado Praetorian Prague Praia Prakrit Pratchett |
| Pratt Pravda Praxiteles Preakness Precambrian Preminger |
| Premyslid Prensa Prentice Pres Presbyterian Presbyterianism |
| } |
| proc newdoc {} { |
| for {set i 0} {$i<8} {incr i} { |
| lappend ret [lindex $::vocab [expr int(abs(rand()) * [llength $::vocab])]] |
| } |
| set ret |
| } |
| db func newdoc newdoc |
| |
| do_execsql_test 3.$tn.0 { |
| CREATE VIRTUAL TABLE fff USING fts5(y); |
| INSERT INTO fff(fff, rank) VALUES('pgsz', 64); |
| |
| WITH s(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM s WHERE x<1000 ) |
| INSERT INTO fff(rowid, y) SELECT random() , newdoc() FROM s; |
| |
| WITH s(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM s WHERE x<1000 ) |
| INSERT INTO fff(rowid, y) SELECT random() , newdoc() FROM s; |
| |
| WITH s(x) AS ( VALUES(1) UNION ALL SELECT x+1 FROM s WHERE x<1000 ) |
| INSERT INTO fff(rowid, y) SELECT random() , newdoc() FROM s; |
| } |
| |
| execsql $cfg |
| |
| proc lshuffle {in} { |
| set out [list] |
| while {[llength $in]>0} { |
| set idx [expr int(abs(rand()) * [llength $in])] |
| lappend out [lindex $in $idx] |
| set in [lreplace $in $idx $idx] |
| } |
| set out |
| } |
| |
| #dump fff |
| |
| set iTest 1 |
| foreach ii [lshuffle [db eval {SELECT rowid FROM fff}]] { |
| #if {$iTest==1} { dump fff } |
| #if {$iTest==1} { breakpoint } |
| do_execsql_test 3.$tn.1.$iTest.$ii { |
| DELETE FROM fff WHERE rowid=$ii; |
| } |
| #if {$iTest==1} { dump fff } |
| if {($iTest % 20)==0} { |
| do_execsql_test 3.$tn.1.$iTest.$ii.ic { |
| INSERT INTO fff(fff) VALUES('integrity-check'); |
| } |
| } |
| #if {$iTest==1} { break } |
| incr iTest |
| } |
| } |
| |
| #execsql_pp { SELECT rowid FROM fff('post') ORDER BY rowid ASC } |
| #breakpoint |
| #execsql_pp { |
| # SELECT rowid FROM fff('post') ORDER BY rowid DESC |
| #} |
| # |
| #dump fff |
| |
| |
| finish_test |
| |