| Index: third_party/sqlite/src/test/fuzzer1.test
|
| diff --git a/third_party/sqlite/src/test/fuzzer1.test b/third_party/sqlite/src/test/fuzzer1.test
|
| index d0575d2d00cdb27bfeb39d70963bbb66eec41625..4ee573080762edbe2f658c7dd19a6a793ef7ecdf 100644
|
| --- a/third_party/sqlite/src/test/fuzzer1.test
|
| +++ b/third_party/sqlite/src/test/fuzzer1.test
|
| @@ -22,100 +22,228 @@ ifcapable !vtab {
|
| return
|
| }
|
|
|
| -register_fuzzer_module db
|
| -do_test fuzzer1-1.0 {
|
| - catchsql {CREATE VIRTUAL TABLE fault1 USING fuzzer;}
|
| -} {1 {fuzzer virtual tables must be TEMP}}
|
| -do_test fuzzer1-1.1 {
|
| - db eval {CREATE VIRTUAL TABLE temp.f1 USING fuzzer;}
|
| +set ::testprefix fuzzer1
|
| +
|
| +load_static_extension db fuzzer
|
| +
|
| +# Check configuration errors.
|
| +#
|
| +do_catchsql_test fuzzer1-1.1 {
|
| + CREATE VIRTUAL TABLE f USING fuzzer;
|
| +} {1 {fuzzer: wrong number of CREATE VIRTUAL TABLE arguments}}
|
| +
|
| +do_catchsql_test fuzzer1-1.2 {
|
| + CREATE VIRTUAL TABLE f USING fuzzer(one, two);
|
| +} {1 {fuzzer: wrong number of CREATE VIRTUAL TABLE arguments}}
|
| +
|
| +do_catchsql_test fuzzer1-1.3 {
|
| + CREATE VIRTUAL TABLE f USING fuzzer(nosuchtable);
|
| +} {1 {fuzzer: no such table: main.nosuchtable}}
|
| +
|
| +do_catchsql_test fuzzer1-1.4 {
|
| + CREATE TEMP TABLE nosuchtable(a, b, c, d);
|
| + CREATE VIRTUAL TABLE f USING fuzzer(nosuchtable);
|
| +} {1 {fuzzer: no such table: main.nosuchtable}}
|
| +
|
| +do_catchsql_test fuzzer1-1.5 {
|
| + DROP TABLE temp.nosuchtable;
|
| + CREATE TABLE nosuchtable(a, b, c, d);
|
| + CREATE VIRTUAL TABLE temp.f USING fuzzer(nosuchtable);
|
| +} {1 {fuzzer: no such table: temp.nosuchtable}}
|
| +
|
| +do_catchsql_test fuzzer1-1.6 {
|
| + DROP TABLE IF EXISTS f_rules;
|
| + CREATE TABLE f_rules(a, b, c);
|
| + CREATE VIRTUAL TABLE f USING fuzzer(f_rules);
|
| +} {1 {fuzzer: f_rules has 3 columns, expected 4}}
|
| +
|
| +do_catchsql_test fuzzer1-1.7 {
|
| + DROP TABLE IF EXISTS f_rules;
|
| + CREATE TABLE f_rules(a, b, c, d, e);
|
| + CREATE VIRTUAL TABLE f USING fuzzer(f_rules);
|
| +} {1 {fuzzer: f_rules has 5 columns, expected 4}}
|
| +
|
| +
|
| +do_execsql_test fuzzer1-2.1 {
|
| + CREATE TABLE f1_rules(ruleset DEFAULT 0, cfrom, cto, cost);
|
| + INSERT INTO f1_rules(cfrom, cto, cost) VALUES('e','a',1);
|
| + INSERT INTO f1_rules(cfrom, cto, cost) VALUES('a','e',10);
|
| + INSERT INTO f1_rules(cfrom, cto, cost) VALUES('e','o',100);
|
| +
|
| + CREATE VIRTUAL TABLE f1 USING fuzzer(f1_rules);
|
| } {}
|
| -do_test fuzzer1-1.2 {
|
| - db eval {
|
| - INSERT INTO f1(cfrom, cto, cost) VALUES('e','a',1);
|
| - INSERT INTO f1(cfrom, cto, cost) VALUES('a','e',10);
|
| - INSERT INTO f1(cfrom, cto, cost) VALUES('e','o',100);
|
| - }
|
| +
|
| +do_execsql_test fuzzer1-2.1 {
|
| + SELECT word, distance FROM f1 WHERE word MATCH 'abcde'
|
| +} {
|
| + abcde 0 abcda 1 ebcde 10
|
| + ebcda 11 abcdo 100 ebcdo 110
|
| + obcde 110 obcda 111 obcdo 210
|
| +}
|
| +
|
| +do_execsql_test fuzzer1-2.4 {
|
| + INSERT INTO f1_rules(ruleset, cfrom, cto, cost) VALUES(1,'b','x',1);
|
| + INSERT INTO f1_rules(ruleset, cfrom, cto, cost) VALUES(1,'d','y',10);
|
| + INSERT INTO f1_rules(ruleset, cfrom, cto, cost) VALUES(1,'y','z',100);
|
| +
|
| + DROP TABLE f1;
|
| + CREATE VIRTUAL TABLE f1 USING fuzzer(f1_rules);
|
| } {}
|
|
|
| -do_test fuzzer1-1.3 {
|
| +do_execsql_test fuzzer1-2.5 {
|
| + SELECT word, distance FROM f1 WHERE word MATCH 'abcde'
|
| +} {
|
| + abcde 0 abcda 1 ebcde 10
|
| + ebcda 11 abcdo 100 ebcdo 110
|
| + obcde 110 obcda 111 obcdo 210
|
| +}
|
| +
|
| +do_execsql_test fuzzer1-2.6 {
|
| + SELECT word, distance FROM f1 WHERE word MATCH 'abcde' AND ruleset=0
|
| +} {
|
| + abcde 0 abcda 1 ebcde 10
|
| + ebcda 11 abcdo 100 ebcdo 110
|
| + obcde 110 obcda 111 obcdo 210
|
| +}
|
| +
|
| +do_execsql_test fuzzer1-2.7 {
|
| + SELECT word, distance FROM f1 WHERE word MATCH 'abcde' AND ruleset=1
|
| +} {
|
| + abcde 0 axcde 1 abcye 10
|
| + axcye 11 abcze 110 axcze 111
|
| +}
|
| +
|
| +do_test fuzzer1-1.8 {
|
| db eval {
|
| - SELECT word, distance FROM f1 WHERE word MATCH 'abcde'
|
| + SELECT word, distance FROM f1 WHERE word MATCH 'abcde' AND distance<100
|
| + }
|
| +} {abcde 0 abcda 1 ebcde 10 ebcda 11}
|
| +do_test fuzzer1-1.9 {
|
| + db eval {
|
| + SELECT word, distance FROM f1 WHERE word MATCH 'abcde' AND distance<=100
|
| + }
|
| +} {abcde 0 abcda 1 ebcde 10 ebcda 11 abcdo 100}
|
| +do_test fuzzer1-1.10 {
|
| + db eval {
|
| + SELECT word, distance FROM f1
|
| + WHERE word MATCH 'abcde' AND distance<100 AND ruleset=0
|
| + }
|
| +} {abcde 0 abcda 1 ebcde 10 ebcda 11}
|
| +do_test fuzzer1-1.11 {
|
| + db eval {
|
| + SELECT word, distance FROM f1
|
| + WHERE word MATCH 'abcde' AND distance<=100 AND ruleset=0
|
| + }
|
| +} {abcde 0 abcda 1 ebcde 10 ebcda 11 abcdo 100}
|
| +do_test fuzzer1-1.12 {
|
| + db eval {
|
| + SELECT word, distance FROM f1
|
| + WHERE word MATCH 'abcde' AND distance<11 AND ruleset=1
|
| }
|
| -} {abcde 0 abcda 1 ebcde 10 ebcda 11 abcdo 100 ebcdo 110 obcde 110 obcda 111 obcdo 210}
|
| +} {abcde 0 axcde 1 abcye 10}
|
| +do_test fuzzer1-1.13 {
|
| + db eval {
|
| + SELECT word, distance FROM f1
|
| + WHERE word MATCH 'abcde' AND distance<=11 AND ruleset=1
|
| + }
|
| +} {abcde 0 axcde 1 abcye 10 axcye 11}
|
| +do_test fuzzer1-1.14 {
|
| + catchsql {INSERT INTO f1 VALUES(1)}
|
| +} {1 {table f1 may not be modified}}
|
| +do_test fuzzer1-1.15 {
|
| + catchsql {DELETE FROM f1}
|
| +} {1 {table f1 may not be modified}}
|
| +do_test fuzzer1-1.16 {
|
| + catchsql {UPDATE f1 SET rowid=rowid+10000}
|
| +} {1 {table f1 may not be modified}}
|
| +
|
|
|
| do_test fuzzer1-2.0 {
|
| execsql {
|
| - CREATE VIRTUAL TABLE temp.f2 USING fuzzer;
|
| -- costs based on English letter frequencies
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('a','e',24);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('a','o',47);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('a','u',50);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('e','a',23);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('e','i',33);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('e','o',37);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('i','e',33);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('i','y',33);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('o','a',41);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('o','e',46);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('o','u',57);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('u','o',58);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('y','i',33);
|
| -
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('t','th',70);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('th','t',66);
|
| + CREATE TEMP TABLE f2_rules(ruleset DEFAULT 0, cFrom, cTo, cost);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('a','e',24);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('a','o',47);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('a','u',50);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('e','a',23);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('e','i',33);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('e','o',37);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('i','e',33);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('i','y',33);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('o','a',41);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('o','e',46);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('o','u',57);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('u','o',58);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('y','i',33);
|
|
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('t','th',70);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('th','t',66);
|
|
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('a','',84);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','b',106);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('b','',106);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','c',94);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('c','',94);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','d',89);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('d','',89);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','e',83);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('e','',83);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','f',97);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('f','',97);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','g',99);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('g','',99);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','h',86);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('h','',86);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','i',85);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('i','',85);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','j',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('j','',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','k',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('k','',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','l',89);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('l','',89);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','m',96);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('m','',96);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','n',85);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('n','',85);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','o',85);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('o','',85);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','p',100);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('p','',100);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','q',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('q','',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','r',86);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('r','',86);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','s',86);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('s','',86);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','t',84);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('t','',84);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','u',94);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('u','',94);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','v',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('v','',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','w',96);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('w','',96);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','x',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('x','',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','y',100);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('y','',100);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('','z',120);
|
| - INSERT INTO f2(cFrom,cTo,cost) VALUES('z','',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('a','',84);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','b',106);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('b','',106);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','c',94);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('c','',94);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','d',89);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('d','',89);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','e',83);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('e','',83);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','f',97);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('f','',97);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','g',99);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('g','',99);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','h',86);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('h','',86);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','i',85);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('i','',85);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','j',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('j','',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','k',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('k','',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','l',89);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('l','',89);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','m',96);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('m','',96);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','n',85);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('n','',85);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','o',85);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('o','',85);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','p',100);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('p','',100);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','q',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('q','',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','r',86);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('r','',86);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','s',86);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('s','',86);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','t',84);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('t','',84);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','u',94);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('u','',94);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','v',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('v','',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','w',96);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('w','',96);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','x',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('x','',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','y',100);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('y','',100);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('','z',120);
|
| + INSERT INTO f2_rules(cFrom,cTo,cost) VALUES('z','',120);
|
| + INSERT INTO f2_rules(ruleset,cFrom,cTo,cost)
|
| + SELECT 1, cFrom, cTo, 100 FROM f2_rules WHERE ruleset=0;
|
| + INSERT INTO f2_rules(ruleset,cFrom,cTo,cost)
|
| + SELECT 2, cFrom, cTo, 200-cost FROM f2_rules WHERE ruleset=0;
|
| + INSERT INTO f2_rules(ruleset,cFrom,cTo,cost)
|
| + SELECT 3, cFrom, cTo, cost FROM f2_rules WHERE ruleset=0;
|
| + INSERT INTO f2_rules(ruleset,cFrom,cTo,cost)
|
| + VALUES(3, 'mallard','duck',50),
|
| + (3, 'duck', 'mallard', 50),
|
| + (3, 'rock', 'stone', 50),
|
| + (3, 'stone', 'rock', 50);
|
| +
|
| +
|
| + CREATE VIRTUAL TABLE temp.f2 USING fuzzer(f2_rules);
|
|
|
| -- Street names for the 28269 ZIPCODE.
|
| --
|
| @@ -1376,7 +1504,363 @@ do_test fuzzer1-2.3 {
|
| AND f2.distance<=200
|
| AND streetname.n>=f2.word AND streetname.n<=(f2.word || x'F7BFBFBF')
|
| }
|
| -} {steelewood tallia tallu talwyn taymouth thelema trailer {tyler finley}}
|
| +} {{tyler finley} trailer taymouth steelewood tallia tallu talwyn thelema}
|
| +do_test fuzzer1-2.4 {
|
| + execsql {
|
| + SELECT DISTINCT streetname.n
|
| + FROM f2 JOIN streetname
|
| + ON (streetname.n>=f2.word AND streetname.n<=(f2.word || 'zzzzzz'))
|
| + WHERE f2.word MATCH 'duck'
|
| + AND f2.distance<150
|
| + AND f2.ruleset=3
|
| + ORDER BY 1
|
| + }
|
| +} {mallard {mallard cove} {mallard forest} {mallard grove} {mallard hill} {mallard park} {mallard ridge} {mallard view}}
|
| +do_test fuzzer1-2.5 {
|
| + execsql {
|
| + SELECT DISTINCT streetname.n
|
| + FROM f2 JOIN streetname
|
| + ON (streetname.n>=f2.word AND streetname.n<=(f2.word || 'zzzzzz'))
|
| + WHERE f2.word MATCH 'duck'
|
| + AND f2.distance<150
|
| + AND f2.ruleset=2
|
| + ORDER BY 1
|
| + }
|
| +} {}
|
| +
|
| +forcedelete test.db2
|
| +do_execsql_test fuzzer1-4.1 {
|
| + ATTACH 'test.db2' AS aux;
|
| + CREATE TABLE aux.f3_rules(ruleset, cfrom, cto, cost);
|
| + INSERT INTO f3_rules(ruleset, cfrom, cto, cost) VALUES(0, 'x','y', 10);
|
| + INSERT INTO f3_rules(ruleset, cfrom, cto, cost) VALUES(1, 'a','b', 10);
|
| + CREATE VIRTUAL TABLE aux.f3 USING fuzzer(f3_rules);
|
| + SELECT word FROM f3 WHERE word MATCH 'ax'
|
| +} {ax ay}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +#
|
| +# 1.5.1 - Check things work with a fuzzer data table name that requires
|
| +# quoting. Also that NULL entries in the "from" column of the
|
| +# data table are treated as zero length strings ('').
|
| +#
|
| +# 1.5.2 - Check that no-op rules (i.e. C->C) are ignored. Test NULL in
|
| +# the "to" column of a fuzzer data table.
|
| +#
|
| +# 1.5.3 - Test out-of-range values for the cost field of the data table.
|
| +#
|
| +# 1.5.4 - Test out-of-range values for the string fields of the data table.
|
| +#
|
| +# 1.5.5 - Test out-of-range values for the ruleset field of the data table.
|
| +#
|
| +do_execsql_test 5.1 {
|
| + CREATE TABLE "fuzzer [x] rules table"(a, b, c, d);
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(0, NULL, 'abc', 10);
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| + SELECT word, distance FROM x WHERE word MATCH '123' LIMIT 4;
|
| +} {123 0 abc123 10 1abc23 10 12abc3 10}
|
| +
|
| +do_execsql_test 5.2 {
|
| + DELETE FROM "fuzzer [x] rules table";
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(0, 'x', NULL, 20);
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(0, NULL, NULL, 10);
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(0, 'x', 'x', 10);
|
| +
|
| + DROP TABLE x;
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| +
|
| + SELECT word, distance FROM x WHERE word MATCH 'xx';
|
| +} {xx 0 x 20 {} 40}
|
| +
|
| +do_execsql_test 5.3.1 {
|
| + DROP TABLE IF EXISTS x;
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(0, 'c', 'd', 1001);
|
| +}
|
| +do_catchsql_test 5.3.2 {
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| +} {1 {fuzzer: cost must be between 1 and 1000}}
|
| +
|
| +do_execsql_test 5.3.3 {
|
| + DROP TABLE IF EXISTS x;
|
| + DELETE FROM "fuzzer [x] rules table";
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(0, 'd', 'c', 0);
|
| +}
|
| +do_catchsql_test 5.3.4 {
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| +} {1 {fuzzer: cost must be between 1 and 1000}}
|
| +
|
| +do_execsql_test 5.3.5 {
|
| + DROP TABLE IF EXISTS x;
|
| + DELETE FROM "fuzzer [x] rules table";
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(0, 'd', 'c', -20);
|
| +}
|
| +do_catchsql_test 5.3.6 {
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| +} {1 {fuzzer: cost must be between 1 and 1000}}
|
| +
|
| +do_execsql_test 5.4.1 {
|
| + DROP TABLE IF EXISTS x;
|
| + DELETE FROM "fuzzer [x] rules table";
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(
|
| + 0, 'x', '12345678901234567890123456789012345678901234567890', 2
|
| + );
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| + SELECT word FROM x WHERE word MATCH 'x';
|
| +} {x 12345678901234567890123456789012345678901234567890}
|
| +
|
| +do_execsql_test 5.4.2 {
|
| + DROP TABLE IF EXISTS x;
|
| + DELETE FROM "fuzzer [x] rules table";
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(
|
| + 0, 'x', '123456789012345678901234567890123456789012345678901', 2
|
| + );
|
| +}
|
| +do_catchsql_test 5.4.3 {
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| +} {1 {fuzzer: maximum string length is 50}}
|
| +
|
| +do_execsql_test 5.4.4 {
|
| + DROP TABLE IF EXISTS x;
|
| + DELETE FROM "fuzzer [x] rules table";
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(
|
| + 0, '123456789012345678901234567890123456789012345678901', 'x', 2
|
| + );
|
| +}
|
| +do_catchsql_test 5.4.5 {
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| +} {1 {fuzzer: maximum string length is 50}}
|
| +
|
| +do_execsql_test 5.5.1 {
|
| + DROP TABLE IF EXISTS x;
|
| + DELETE FROM "fuzzer [x] rules table";
|
| + INSERT INTO "fuzzer [x] rules table" VALUES(-1, 'x', 'y', 2);
|
| +}
|
| +do_catchsql_test 5.5.2 {
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| +} {1 {fuzzer: ruleset must be between 0 and 2147483647}}
|
| +
|
| +do_execsql_test 5.5.3 {
|
| + DROP TABLE IF EXISTS x;
|
| + DELETE FROM "fuzzer [x] rules table";
|
| + INSERT INTO "fuzzer [x] rules table" VALUES((1<<32)+100, 'x', 'y', 2);
|
| +}
|
| +do_catchsql_test 5.5.4 {
|
| + CREATE VIRTUAL TABLE x USING fuzzer('fuzzer [x] rules table');
|
| +} {1 {fuzzer: ruleset must be between 0 and 2147483647}}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +# This test uses a fuzzer table with many rules. There is one rule to
|
| +# map each possible two character string, where characters are lower-case
|
| +# letters used in the English language, to all other possible two character
|
| +# strings. In total, (26^4)-(26^2) mappings (the subtracted term represents
|
| +# the no-op mappings discarded automatically by the fuzzer).
|
| +#
|
| +#
|
| +do_execsql_test 6.1.1 {
|
| + DROP TABLE IF EXISTS x1;
|
| + DROP TABLE IF EXISTS x1_rules;
|
| + CREATE TABLE x1_rules(ruleset, cFrom, cTo, cost);
|
| +}
|
| +puts "This test is slow - perhaps around 7 seconds on an average pc"
|
| +do_test 6.1.2 {
|
| + set LETTERS {a b c d e f g h i j k l m n o p q r s t u v w x y z}
|
| + set cost 1
|
| + db transaction {
|
| + foreach c1 $LETTERS {
|
| + foreach c2 $LETTERS {
|
| + foreach c3 $LETTERS {
|
| + foreach c4 $LETTERS {
|
| + db eval {INSERT INTO x1_rules VALUES(0, $c1||$c2, $c3||$c4, $cost)}
|
| + set cost [expr ($cost%1000) + 1]
|
| + }
|
| + }
|
| + }
|
| + }
|
| + db eval {UPDATE x1_rules SET cost = 20 WHERE cost<20 AND cFrom!='xx'}
|
| + }
|
| +} {}
|
| +
|
| +do_execsql_test 6.2 {
|
| + SELECT count(*) FROM x1_rules WHERE cTo!=cFrom;
|
| +} [expr 26*26*26*26 - 26*26]
|
| +
|
| +do_execsql_test 6.2.1 {
|
| + CREATE VIRTUAL TABLE x1 USING fuzzer(x1_rules);
|
| + SELECT word FROM x1 WHERE word MATCH 'xx' LIMIT 10;
|
| +} {xx hw hx hy hz ia ib ic id ie}
|
| +do_execsql_test 6.2.2 {
|
| + SELECT cTo FROM x1_rules WHERE cFrom='xx'
|
| + ORDER BY cost asc, rowid asc LIMIT 9;
|
| +} {hw hx hy hz ia ib ic id ie}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +# Test using different types of quotes with CREATE VIRTUAL TABLE
|
| +# arguments.
|
| +#
|
| +do_execsql_test 7.1 {
|
| + CREATE TABLE [x2 "rules] (a, b, c, d);
|
| + INSERT INTO [x2 "rules] VALUES(0, 'a', 'b', 5);
|
| +}
|
| +foreach {tn sql} {
|
| + 1 { CREATE VIRTUAL TABLE x2 USING fuzzer( [x2 "rules] ) }
|
| + 2 { CREATE VIRTUAL TABLE x2 USING fuzzer( "x2 ""rules" ) }
|
| + 3 { CREATE VIRTUAL TABLE x2 USING fuzzer( 'x2 "rules' ) }
|
| + 4 { CREATE VIRTUAL TABLE x2 USING fuzzer( `x2 "rules` ) }
|
| +} {
|
| + do_execsql_test 7.2.$tn.1 { DROP TABLE IF EXISTS x2 }
|
| + do_execsql_test 7.2.$tn.2 $sql
|
| + do_execsql_test 7.2.$tn.3 {
|
| + SELECT word FROM x2 WHERE word MATCH 'aaa'
|
| + } {aaa baa aba aab bab abb bba bbb}
|
| +}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +# Test using a fuzzer table in different contexts.
|
| +#
|
| +do_execsql_test 8.1 {
|
| + CREATE TABLE x3_rules(rule_set, cFrom, cTo, cost);
|
| + INSERT INTO x3_rules VALUES(2, 'a', 'x', 10);
|
| + INSERT INTO x3_rules VALUES(2, 'a', 'y', 9);
|
| + INSERT INTO x3_rules VALUES(2, 'a', 'z', 8);
|
| + CREATE VIRTUAL TABLE x3 USING fuzzer(x3_rules);
|
| +}
|
| +
|
| +do_execsql_test 8.2.1 {
|
| + SELECT cFrom, cTo, word
|
| + FROM x3_rules CROSS JOIN x3
|
| + WHERE word MATCH 'a' AND cost=distance AND ruleset=2
|
| + ORDER BY +cTo;
|
| +} {a x x a y y a z z}
|
| +
|
| +do_execsql_test 8.2.2 {
|
| + SELECT cFrom, cTo, word
|
| + FROM x3 CROSS JOIN x3_rules
|
| + WHERE word MATCH 'a' AND cost=distance AND ruleset=2
|
| + ORDER BY +cTo DESC
|
| +} {a z z a y y a x x}
|
| +
|
| +do_execsql_test 8.2.3 {
|
| + SELECT cFrom, cTo, word
|
| + FROM x3_rules, x3
|
| + WHERE word MATCH 'a' AND cost=distance AND ruleset=2
|
| + ORDER BY +cTo DESC;
|
| +} {a z z a y y a x x}
|
| +
|
| +do_execsql_test 8.2.4 {
|
| + SELECT cFrom, cTo, word
|
| + FROM x3, x3_rules
|
| + WHERE word MATCH 'a' AND cost=distance AND ruleset=2
|
| + ORDER BY +cTo DESC;
|
| +} {a z z a y y a x x}
|
| +
|
| +do_execsql_test 8.2.5 {
|
| + CREATE INDEX i1 ON x3_rules(cost);
|
| + SELECT cFrom, cTo, word
|
| + FROM x3_rules, x3
|
| + WHERE word MATCH 'a' AND cost=distance AND ruleset=2
|
| + ORDER BY +cTo DESC;
|
| +} {a z z a y y a x x}
|
| +
|
| +do_execsql_test 8.2.5 {
|
| + SELECT word FROM x3_rules, x3 WHERE word MATCH x3_rules.cFrom AND ruleset=2
|
| +} {a z y x a z y x a z y x}
|
| +
|
| +do_execsql_test 8.2.6 {
|
| + SELECT word FROM x3_rules, x3
|
| + WHERE word MATCH x3_rules.cFrom
|
| + AND ruleset=2
|
| + AND x3_rules.cost=8;
|
| +} {a z y x}
|
| +
|
| +do_execsql_test 8.2.7 {
|
| + CREATE TABLE t1(a, b);
|
| + CREATE INDEX i2 ON t1(b);
|
| + SELECT word, distance FROM x3, t1
|
| + WHERE x3.word MATCH t1.a AND ruleset=2 AND distance=t1.b;
|
| +} {}
|
| +
|
| +do_execsql_test 8.2.8 {
|
| + INSERT INTO x3_rules VALUES(1, 'a', 't', 5);
|
| + INSERT INTO x3_rules VALUES(1, 'a', 'u', 4);
|
| + INSERT INTO x3_rules VALUES(1, 'a', 'v', 3);
|
| + DROP TABLE x3;
|
| + CREATE VIRTUAL TABLE x3 USING fuzzer(x3_rules);
|
| + SELECT * FROM x3_rules;
|
| +} {
|
| + 2 a x 10
|
| + 2 a y 9
|
| + 2 a z 8
|
| + 1 a t 5
|
| + 1 a u 4
|
| + 1 a v 3
|
| +}
|
| +
|
| +do_catchsql_test 8.2.9 {
|
| + SELECT word FROM x3 WHERE ruleset=2 AND word MATCH 'a' AND WORD MATCH 'b';
|
| +} {1 {unable to use function MATCH in the requested context}}
|
| +
|
| +do_execsql_test 8.2.10 {
|
| + SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a'
|
| +} {a v u t}
|
| +
|
| +# The term "ruleset<=1" is not handled by the fuzzer module. Instead, it
|
| +# is handled by SQLite, which assumes that all rows have a NULL value in
|
| +# the ruleset column. Since NULL<=1 is never true, this query returns
|
| +# no rows.
|
| +do_execsql_test 8.2.11 {
|
| + SELECT word FROM x3 WHERE ruleset<=1 AND word MATCH 'a'
|
| +} {}
|
| +
|
| +do_execsql_test 8.2.12 {
|
| + SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' ORDER BY distance ASC;
|
| +} {a v u t}
|
| +
|
| +do_execsql_test 8.2.13 {
|
| + SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' ORDER BY distance DESC;
|
| +} {t u v a}
|
| +
|
| +do_execsql_test 8.2.13 {
|
| + SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' ORDER BY word ASC;
|
| +} {a t u v}
|
| +
|
| +do_execsql_test 8.2.14 {
|
| + SELECT word FROM x3 WHERE ruleset=1 AND word MATCH 'a' ORDER BY word DESC;
|
| +} {v u t a}
|
| +
|
| +#-------------------------------------------------------------------------
|
| +#
|
| +do_execsql_test 9.1 {
|
| + CREATE TABLE x4_rules(a, b, c, d);
|
| + INSERT INTO x4_rules VALUES(0, 'a', 'b', 10);
|
| + INSERT INTO x4_rules VALUES(0, 'a', 'c', 11);
|
| + INSERT INTO x4_rules VALUES(0, 'bx', 'zz', 20);
|
| + INSERT INTO x4_rules VALUES(0, 'cx', 'yy', 15);
|
| + INSERT INTO x4_rules VALUES(0, 'zz', '!!', 50);
|
| + CREATE VIRTUAL TABLE x4 USING fuzzer(x4_rules);
|
| +}
|
| +
|
| +do_execsql_test 9.2 {
|
| + SELECT word, distance FROM x4 WHERE word MATCH 'ax';
|
| +} {ax 0 bx 10 cx 11 yy 26 zz 30 !! 80}
|
| +
|
| +
|
| +do_execsql_test 10.1 {
|
| + CREATE TABLE x5_rules(a, b, c, d);
|
| + CREATE VIRTUAL TABLE x5 USING fuzzer(x5_rules);
|
| +}
|
| +
|
| +do_execsql_test 10.2 {
|
| + SELECT word, distance FROM x5 WHERE word MATCH
|
| + 'aaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaa' ||
|
| + 'aaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaa' ||
|
| + 'aaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaaXaaaaaaaaa'
|
| +} {}
|
|
|
| +do_execsql_test 10.3 {
|
| + INSERT INTO x5_rules VALUES(0, 'a', '0.1.2.3.4.5.6.7.8.9.a', 1);
|
| + DROP TABLE x5;
|
| + CREATE VIRTUAL TABLE x5 USING fuzzer(x5_rules);
|
| + SELECT length(word) FROM x5 WHERE word MATCH 'a' LIMIT 50;
|
| +} {1 21 41 61 81}
|
|
|
| finish_test
|
|
|