summaryrefslogtreecommitdiffstats
path: root/test/fts3malloc.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/fts3malloc.test')
-rw-r--r--test/fts3malloc.test307
1 files changed, 307 insertions, 0 deletions
diff --git a/test/fts3malloc.test b/test/fts3malloc.test
new file mode 100644
index 0000000..ed30fe2
--- /dev/null
+++ b/test/fts3malloc.test
@@ -0,0 +1,307 @@
+# 2009 October 22
+#
+# 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 to verify that malloc() errors that occur
+# within the FTS3 module code are handled correctly.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+ifcapable !fts3 { finish_test ; return }
+source $testdir/malloc_common.tcl
+source $testdir/fts3_common.tcl
+
+# Ensure the lookaside buffer is disabled for these tests.
+#
+sqlite3 db test.db
+sqlite3_db_config_lookaside db 0 0 0
+
+set sqlite_fts3_enable_parentheses 1
+set DO_MALLOC_TEST 1
+
+# Test organization:
+#
+# fts3_malloc-1.*: Test OOM during CREATE and DROP table statements.
+# fts3_malloc-2.*: Test OOM during SELECT operations.
+# fts3_malloc-3.*: Test OOM during SELECT operations with a larger database.
+# fts3_malloc-4.*: Test OOM during database write operations.
+# fts3_malloc-5.*: Test that a couple of memory leaks that could follow
+# OOM in tokenizer code have been fixed.
+#
+
+
+proc normal_list {l} {
+ set ret [list]
+ foreach elem $l {lappend ret $elem}
+ set ret
+}
+
+do_write_test fts3_malloc-1.1 sqlite_master {
+ CREATE VIRTUAL TABLE ft1 USING fts3(a, b)
+}
+do_write_test fts3_malloc-1.2 sqlite_master {
+ CREATE VIRTUAL TABLE ft2 USING fts3([a], [b]);
+}
+do_write_test fts3_malloc-1.3 sqlite_master {
+ CREATE VIRTUAL TABLE ft3 USING fts3('a', "b");
+}
+do_write_test fts3_malloc-1.4 sqlite_master {
+ CREATE VIRTUAL TABLE ft4 USING fts3(`a`, 'fred''s column');
+}
+do_error_test fts3_malloc-1.5 {
+ CREATE VIRTUAL TABLE ft5 USING fts3(a, b, tokenize unknown)
+} {unknown tokenizer: unknown}
+do_write_test fts3_malloc-1.6 sqlite_master {
+ CREATE VIRTUAL TABLE ft6 USING fts3(a, b, tokenize porter)
+}
+do_write_test fts3_malloc-1.7 sqlite_master {
+ CREATE VIRTUAL TABLE ft7 USING fts4(a, b, notindexed=b)
+}
+
+# Test the xConnect/xDisconnect methods:
+#db eval { ATTACH 'test2.db' AS aux }
+#do_write_test fts3_malloc-1.6 aux.sqlite_master {
+# CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
+#}
+#do_write_test fts3_malloc-1.6 aux.sqlite_master {
+# CREATE VIRTUAL TABLE aux.ft7 USING fts3(a, b, c);
+#}
+
+
+
+do_test fts3_malloc-2.0 {
+ execsql {
+ DROP TABLE ft1;
+ DROP TABLE ft2;
+ DROP TABLE ft3;
+ DROP TABLE ft4;
+ DROP TABLE ft6;
+ DROP TABLE ft7;
+ }
+ execsql { CREATE VIRTUAL TABLE ft USING fts3(a, b) }
+ for {set ii 1} {$ii < 32} {incr ii} {
+ set a [list]
+ set b [list]
+ if {$ii & 0x01} {lappend a one ; lappend b neung}
+ if {$ii & 0x02} {lappend a two ; lappend b song }
+ if {$ii & 0x04} {lappend a three ; lappend b sahm }
+ if {$ii & 0x08} {lappend a four ; lappend b see }
+ if {$ii & 0x10} {lappend a five ; lappend b hah }
+ execsql { INSERT INTO ft VALUES($a, $b) }
+ }
+} {}
+
+foreach {tn sql result} {
+ 1 "SELECT count(*) FROM sqlite_master" {5}
+ 2 "SELECT * FROM ft WHERE docid = 1" {one neung}
+ 3 "SELECT * FROM ft WHERE docid = 2" {two song}
+ 4 "SELECT * FROM ft WHERE docid = 3" {{one two} {neung song}}
+
+ 5 "SELECT a FROM ft" {
+ {one} {two} {one two}
+ {three} {one three} {two three}
+ {one two three} {four} {one four}
+ {two four} {one two four} {three four}
+ {one three four} {two three four} {one two three four}
+ {five} {one five} {two five}
+ {one two five} {three five} {one three five}
+ {two three five} {one two three five} {four five}
+ {one four five} {two four five} {one two four five}
+ {three four five} {one three four five} {two three four five}
+ {one two three four five}
+ }
+
+ 6 "SELECT a FROM ft WHERE a MATCH 'one'" {
+ {one} {one two} {one three} {one two three}
+ {one four} {one two four} {one three four} {one two three four}
+ {one five} {one two five} {one three five} {one two three five}
+ {one four five} {one two four five}
+ {one three four five} {one two three four five}
+ }
+
+ 7 "SELECT a FROM ft WHERE a MATCH 'o*'" {
+ {one} {one two} {one three} {one two three}
+ {one four} {one two four} {one three four} {one two three four}
+ {one five} {one two five} {one three five} {one two three five}
+ {one four five} {one two four five}
+ {one three four five} {one two three four five}
+ }
+
+ 8 "SELECT a FROM ft WHERE a MATCH 'o* t*'" {
+ {one two} {one three} {one two three}
+ {one two four} {one three four} {one two three four}
+ {one two five} {one three five} {one two three five}
+ {one two four five} {one three four five} {one two three four five}
+ }
+
+ 9 "SELECT a FROM ft WHERE a MATCH '\"o* t*\"'" {
+ {one two} {one three} {one two three}
+ {one two four} {one three four} {one two three four}
+ {one two five} {one three five} {one two three five}
+ {one two four five} {one three four five} {one two three four five}
+ }
+
+ 10 {SELECT a FROM ft WHERE a MATCH '"o* f*"'} {
+ {one four} {one five} {one four five}
+ }
+
+ 11 {SELECT a FROM ft WHERE a MATCH '"one two three"'} {
+ {one two three}
+ {one two three four}
+ {one two three five}
+ {one two three four five}
+ }
+
+ 12 {SELECT a FROM ft WHERE a MATCH '"two three four"'} {
+ {two three four}
+ {one two three four}
+ {two three four five}
+ {one two three four five}
+ }
+
+ 12 {SELECT a FROM ft WHERE a MATCH '"two three" five'} {
+ {two three five} {one two three five}
+ {two three four five} {one two three four five}
+ }
+
+ 13 {SELECT a FROM ft WHERE ft MATCH '"song sahm" hah'} {
+ {two three five} {one two three five}
+ {two three four five} {one two three four five}
+ }
+
+ 14 {SELECT a FROM ft WHERE b MATCH 'neung'} {
+ {one} {one two}
+ {one three} {one two three}
+ {one four} {one two four}
+ {one three four} {one two three four}
+ {one five} {one two five}
+ {one three five} {one two three five}
+ {one four five} {one two four five}
+ {one three four five} {one two three four five}
+ }
+
+ 15 {SELECT a FROM ft WHERE b MATCH '"neung song sahm"'} {
+ {one two three} {one two three four}
+ {one two three five} {one two three four five}
+ }
+
+ 16 {SELECT a FROM ft WHERE b MATCH 'hah "song sahm"'} {
+ {two three five} {one two three five}
+ {two three four five} {one two three four five}
+ }
+
+ 17 {SELECT a FROM ft WHERE b MATCH 'song OR sahm'} {
+ {two} {one two} {three}
+ {one three} {two three} {one two three}
+ {two four} {one two four} {three four}
+ {one three four} {two three four} {one two three four}
+ {two five} {one two five} {three five}
+ {one three five} {two three five} {one two three five}
+ {two four five} {one two four five} {three four five}
+ {one three four five} {two three four five} {one two three four five}
+ }
+
+ 18 {SELECT a FROM ft WHERE a MATCH 'three NOT two'} {
+ {three} {one three} {three four}
+ {one three four} {three five} {one three five}
+ {three four five} {one three four five}
+ }
+
+ 19 {SELECT a FROM ft WHERE b MATCH 'sahm NOT song'} {
+ {three} {one three} {three four}
+ {one three four} {three five} {one three five}
+ {three four five} {one three four five}
+ }
+
+ 20 {SELECT a FROM ft WHERE ft MATCH 'sahm NOT song'} {
+ {three} {one three} {three four}
+ {one three four} {three five} {one three five}
+ {three four five} {one three four five}
+ }
+
+ 21 {SELECT a FROM ft WHERE b MATCH 'neung NEAR song NEAR sahm'} {
+ {one two three} {one two three four}
+ {one two three five} {one two three four five}
+ }
+
+} {
+ set result [normal_list $result]
+ do_select_test fts3_malloc-2.$tn $sql $result
+}
+
+do_test fts3_malloc-3.0 {
+ execsql BEGIN
+ for {set ii 32} {$ii < 1024} {incr ii} {
+ set a [list]
+ set b [list]
+ if {$ii & 0x0001} {lappend a one ; lappend b neung }
+ if {$ii & 0x0002} {lappend a two ; lappend b song }
+ if {$ii & 0x0004} {lappend a three ; lappend b sahm }
+ if {$ii & 0x0008} {lappend a four ; lappend b see }
+ if {$ii & 0x0010} {lappend a five ; lappend b hah }
+ if {$ii & 0x0020} {lappend a six ; lappend b hok }
+ if {$ii & 0x0040} {lappend a seven ; lappend b jet }
+ if {$ii & 0x0080} {lappend a eight ; lappend b bairt }
+ if {$ii & 0x0100} {lappend a nine ; lappend b gow }
+ if {$ii & 0x0200} {lappend a ten ; lappend b sip }
+ execsql { INSERT INTO ft VALUES($a, $b) }
+ }
+ execsql COMMIT
+} {}
+foreach {tn sql result} {
+ 1 "SELECT count(*) FROM ft" {1023}
+
+ 2 "SELECT a FROM ft WHERE a MATCH 'one two three four five six seven eight'" {
+ {one two three four five six seven eight}
+ {one two three four five six seven eight nine}
+ {one two three four five six seven eight ten}
+ {one two three four five six seven eight nine ten}
+ }
+
+ 3 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH 'o*'} {
+ 512 262144
+ }
+
+ 4 {SELECT count(*), sum(docid) FROM ft WHERE a MATCH '"two three four"'} {
+ 128 66368
+ }
+} {
+ set result [normal_list $result]
+ do_select_test fts3_malloc-3.$tn $sql $result
+}
+
+do_test fts3_malloc-4.0 {
+ execsql { DELETE FROM ft WHERE docid>=32 }
+} {}
+foreach {tn sql} {
+ 1 "DELETE FROM ft WHERE ft MATCH 'one'"
+ 2 "DELETE FROM ft WHERE ft MATCH 'three'"
+ 3 "DELETE FROM ft WHERE ft MATCH 'five'"
+} {
+ do_write_test fts3_malloc-4.1.$tn ft_content $sql
+}
+do_test fts3_malloc-4.2 {
+ execsql { SELECT a FROM ft }
+} {two four {two four}}
+
+do_write_test fts3_malloc-5.1 ft_content {
+ INSERT INTO ft VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken', 'cynics!')
+}
+do_test fts3_malloc-5.2 {
+ execsql { CREATE VIRTUAL TABLE ft8 USING fts3(x, tokenize porter) }
+} {}
+
+do_write_test fts3_malloc-5.3 ft_content {
+ INSERT INTO ft8 VALUES('short alongertoken reallyquitealotlongerimeanit andthistokenisjustsolongthatonemightbeforgivenforimaginingthatitwasmerelyacontrivedexampleandnotarealtoken')
+}
+
+
+finish_test