| # 2006 September 9 |
| # |
| # 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 FTS3 module. |
| # |
| # $Id: fts3aa.test,v 1.1 2007/08/20 17:38:42 shess Exp $ |
| # |
| |
| set testdir [file dirname $argv0] |
| source $testdir/tester.tcl |
| set testprefix fts3corrupt4 |
| |
| # If SQLITE_ENABLE_FTS3 is defined, omit this file. |
| ifcapable !fts3 { |
| finish_test |
| return |
| } |
| |
| do_execsql_test 1.0 { |
| BEGIN; |
| CREATE VIRTUAL TABLE ft USING fts3; |
| INSERT INTO ft VALUES('aback'); |
| INSERT INTO ft VALUES('abaft'); |
| INSERT INTO ft VALUES('abandon'); |
| COMMIT; |
| } |
| |
| proc blob {a} { binary decode hex $a } |
| db func blob blob |
| |
| do_execsql_test 1.1 { |
| SELECT quote(root) FROM ft_segdir; |
| } {X'0005616261636B03010200030266740302020003046E646F6E03030200'} |
| |
| sqlite3_db_config db DEFENSIVE 0 |
| do_execsql_test 1.2 { |
| UPDATE ft_segdir SET root = blob( |
| '0005616261636B03010200 FFFFFFFF0702 66740302020003046E646F6E03030200' |
| ); |
| } |
| |
| do_catchsql_test 1.3 { |
| SELECT * FROM ft WHERE ft MATCH 'abandon'; |
| } {1 {database disk image is malformed}} |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 2.0.0 { |
| CREATE VIRTUAL TABLE ft USING fts3; |
| INSERT INTO ft(ft) VALUES('nodesize=32'); |
| } |
| do_test 2.0.1 { |
| for {set i 0} {$i < 12} {incr i} { |
| execsql { |
| BEGIN; |
| INSERT INTO ft VALUES('abc' || $i); |
| INSERT INTO ft VALUES('abc' || $i || 'x' ); |
| INSERT INTO ft VALUES('abc' || $i || 'xx' ); |
| COMMIT |
| } |
| } |
| execsql { |
| SELECT count(*) FROM ft_segdir; |
| SELECT count(*) FROM ft_segments; |
| } |
| } {12 0} |
| |
| do_execsql_test 2.1 { |
| INSERT INTO ft(ft) VALUES('merge=1,4'); |
| SELECT count(*) FROM ft_segdir; |
| SELECT count(*) FROM ft_segments; |
| } {12 3} |
| |
| do_execsql_test 2.2 { |
| SELECT quote(block) FROM ft_segments WHERE blockid=2 |
| } {X'00056162633130031F0200'} |
| |
| db func blob blob |
| sqlite3_db_config db DEFENSIVE 0 |
| do_execsql_test 2.3.1 { |
| UPDATE ft_segments SET block = |
| blob('00056162633130031F0200 FFFFFFFF07FF55 66740302020003046E646F6E03030200') |
| WHERE blockid=2; |
| } {} |
| do_catchsql_test 2.3.2 { |
| INSERT INTO ft(ft) VALUES('merge=1,4'); |
| } {1 {database disk image is malformed}} |
| |
| do_execsql_test 2.4.1 { |
| UPDATE ft_segments SET block = |
| blob('00056162633130031F0200 02FFFFFFFF07 66740302020003046E646F6E03030200') |
| WHERE blockid=2; |
| } {} |
| do_catchsql_test 2.4.2 { |
| INSERT INTO ft(ft) VALUES('merge=1,4'); |
| } {1 {database disk image is malformed}} |
| |
| do_execsql_test 2.5.1 { |
| UPDATE ft_segments SET block = |
| blob('00056162633130031F0200 0202 6674 FFFFFF070302020003046E646F6E030200') |
| WHERE blockid=2; |
| } {} |
| do_catchsql_test 2.5.2 { |
| INSERT INTO ft(ft) VALUES('merge=1,4'); |
| } {1 {database disk image is malformed}} |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 3.0.0 { |
| CREATE VIRTUAL TABLE ft USING fts3; |
| INSERT INTO ft(ft) VALUES('nodesize=32'); |
| } |
| do_test 3.0.1 { |
| execsql BEGIN |
| for {set i 0} {$i < 20} {incr i} { |
| execsql { INSERT INTO ft VALUES('abc' || $i) } |
| } |
| execsql { |
| COMMIT; |
| SELECT count(*) FROM ft_segdir; |
| SELECT count(*) FROM ft_segments; |
| } |
| } {1 5} |
| |
| do_execsql_test 3.1 { |
| SELECT quote(root) FROM ft_segdir |
| } {X'0101056162633132040136030132030136'} |
| |
| db func blob blob |
| sqlite3_db_config db DEFENSIVE 0 |
| do_execsql_test 3.2 { |
| UPDATE ft_segdir |
| SET root = blob('0101056162633132FFFFFFFF070236030132030136'); |
| } |
| |
| do_catchsql_test 3.1 { |
| SELECT * FROM ft WHERE ft MATCH 'abc20' |
| } {1 {database disk image is malformed}} |
| |
| #------------------------------------------------------------------------- |
| reset_db |
| do_execsql_test 4.0 { |
| CREATE VIRTUAL TABLE t1 USING fts3(); |
| INSERT INTO t1 VALUES('one two three'); |
| UPDATE t1_segdir SET start_block = 1; |
| } |
| |
| do_catchsql_test 4.1 { |
| SELECT * FROM t1 WHERE t1 MATCH 'one'; |
| } {1 {database disk image is malformed}} |
| do_catchsql_test 4.2 { |
| SELECT * FROM t1 WHERE t1 MATCH 'two'; |
| } {1 {database disk image is malformed}} |
| do_catchsql_test 4.3 { |
| SELECT * FROM t1 WHERE t1 MATCH 'three'; |
| } {1 {database disk image is malformed}} |
| do_execsql_test 4.4 { |
| INSERT INTO t1(t1) VALUES('optimize'); |
| } |
| |
| |
| finish_test |