From e68ffadbf43619993d94825491ca9498edb55932 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 23 Feb 2018 21:01:15 +0000 Subject: [PATCH] Fix a problem with handling "k >= ?" constraints in the zonefile module. FossilOrigin-Name: 9a99afafa3fb9ec4823e5030cb04a685d64942ec04a1154b729dc4c0f313dc4a --- ext/zonefile/zonefile.c | 11 +-- ext/zonefile/zonefile1.test | 149 ++++++++++++++++++++++++++++++++ ext/zonefile/zonefilefault.test | 21 +++++ manifest | 16 ++-- manifest.uuid | 2 +- 5 files changed, 183 insertions(+), 16 deletions(-) diff --git a/ext/zonefile/zonefile.c b/ext/zonefile/zonefile.c index 8a2e5e8d64..bf0e5df238 100644 --- a/ext/zonefile/zonefile.c +++ b/ext/zonefile/zonefile.c @@ -1987,16 +1987,13 @@ static int zonefileParseOption( char **pzErr /* OUT: Error message */ ){ const char *z = zOption; - const char *zOpt; + const char *zOpt = z; int nOpt; const char *zVal; int rc = SQLITE_OK; - /* Skip leading whitespace */ - while( zonefile_isspace(*z) ) z++; - zOpt = z; - /* Skip until EOF, whitespace or "=" */ + assert( 0==zonefile_isspace(*z) ); while( *z && !zonefile_isspace(*z) && *z!='=' ) z++; nOpt = z-zOpt; @@ -2087,7 +2084,7 @@ static int zonefileCreateConnect( } for(i=3; inCacheSize<1 ) p->nCacheSize = 1; } @@ -2270,7 +2267,7 @@ static int zonefileFilter( if( idxNum & 0x02 ) { z1 = "k < ?"; } if( idxNum & 0x04 ) { z1 = "k <= ?"; } if( idxNum & 0x08 ) { if( z1 ) z2 = "k > ?"; else z1 = "k > ?"; } - if( idxNum & 0x10 ) { if( z1 ) z2 = "k <= ?"; else z1 = "k <= ?"; } + if( idxNum & 0x10 ) { if( z1 ) z2 = "k >= ?"; else z1 = "k >= ?"; } } rc = zonefilePrepare(pTab->db, &pCsr->pSelect, &pTab->base.zErrMsg, diff --git a/ext/zonefile/zonefile1.test b/ext/zonefile/zonefile1.test index 213f8f035c..1f0d7a6e53 100644 --- a/ext/zonefile/zonefile1.test +++ b/ext/zonefile/zonefile1.test @@ -419,6 +419,155 @@ do_catchsql_test 8.2 { CREATE VIRTUAL TABLE onetwothree USING zonefile_files; } {1 {do not create zonefile_files tables directly!}} +#------------------------------------------------------------------------- +# A zone file containing zero keys. +# +reset_db +load_static_extension db zonefile +do_execsql_test 9.0 { + CREATE TABLE s(k INTEGER PRIMARY KEY,frame INTEGER,idx INTEGER,v BLOB); + SELECT zonefile_write('test.zonefile', 's'); +} {{}} +do_execsql_test 9.1 { + CREATE VIRTUAL TABLE ss USING zonefile; + INSERT INTO ss_files(filename) VALUES('test.zonefile'); + SELECT * FROM ss; +} {} + +#------------------------------------------------------------------------- +# Test UPDATE and DELETE statements on the %_files virtual table. +# +reset_db +load_static_extension db zonefile +do_execsql_test 10.0 { + CREATE TABLE data(k INTEGER PRIMARY KEY, v BLOB); + INSERT INTO data(k, v) VALUES(1, randomblob(100)); + INSERT INTO data(k, v) VALUES(2, randomblob(100)); + INSERT INTO data(k, v) VALUES(3, randomblob(100)); + INSERT INTO data(k, v) VALUES(4, randomblob(100)); + INSERT INTO data(k, v) VALUES(5, randomblob(100)); + INSERT INTO data(k, v) VALUES(6, randomblob(100)); + INSERT INTO data(k, v) VALUES(7, randomblob(100)); + INSERT INTO data(k, v) VALUES(8, randomblob(100)); + INSERT INTO data(k, v) VALUES(9, randomblob(100)); + + CREATE VIEW v1 AS + SELECT k, -1 AS frame, -1 AS idx, v + FROM data WHERE k IN (1,2,3); + SELECT zonefile_write('test1.zonefile', 'v1'); + + CREATE VIEW v2 AS + SELECT k, -1 AS frame, -1 AS idx, v + FROM data WHERE k IN (4,5,6); + SELECT zonefile_write('test2.zonefile', 'v2'); + + CREATE VIEW v3 AS + SELECT k, -1 AS frame, -1 AS idx, v + FROM data WHERE k IN (7,8,9); + SELECT zonefile_write('test3.zonefile', 'v3'); +} {{} {} {}} + +do_execsql_test 10.1 { + CREATE VIRTUAL TABLE "a b" USING zonefile; + INSERT INTO "a b_files"(filename) VALUES('test1.zonefile'); + SELECT k FROM "a b" +} {1 2 3} + +do_execsql_test 10.2 { + UPDATE "a b_files" SET filename = 'test2.zonefile'; + SELECT k FROM "a b" +} {4 5 6} + +do_execsql_test 10.3 { + INSERT INTO "a b_files"(filename) VALUES('test1.zonefile'); + INSERT INTO "a b_files"(filename) VALUES('test3.zonefile'); + SELECT k FROM "a b" +} {1 2 3 4 5 6 7 8 9} + +do_execsql_test 10.4 { + DELETE FROM "a b_files" WHERE filename = 'test2.zonefile'; + SELECT k FROM "a b" +} {1 2 3 7 8 9} + +do_execsql_test 10.5 { + DELETE FROM "a b_files" WHERE filename = 'test1.zonefile'; + SELECT k FROM "a b" +} {7 8 9} + +#------------------------------------------------------------------------- +# +reset_db +load_static_extension db zonefile +do_execsql_test 11.0 { + CREATE TABLE data(k INTEGER PRIMARY KEY, v BLOB); + INSERT INTO data(k, v) VALUES(-1, randomblob(100)); + INSERT INTO data(k, v) VALUES(1000, randomblob(100)); + INSERT INTO data(k, v) VALUES(-1000, randomblob(100)); + INSERT INTO data(k, v) VALUES(9223372036854775807, randomblob(100)); + INSERT INTO data(k, v) VALUES(-9223372036854775807, randomblob(100)); + INSERT INTO data(k, v) VALUES(-9223372036854775808, randomblob(100)); + + CREATE VIEW v1 AS SELECT k, -1 AS frame, -1 AS idx, v FROM data; + SELECT zonefile_write('test1.zonefile', 'v1'); +} {{}} + +do_execsql_test 11.1 { + CREATE VIRTUAL TABLE one USING zonefile; + INSERT INTO "one_files"(filename) VALUES('test1.zonefile'); + SELECT k FROM one +} {-9223372036854775808 -9223372036854775807 -1000 -1 1000 9223372036854775807} + +do_execsql_test 11.2 { + SELECT count(*) FROM data JOIN one USING (k) WHERE one.v==data.v +} 6 + +#------------------------------------------------------------------------- +# +do_catchsql_test 12.1 { + CREATE VIRTUAL TABLE nm USING zonefile(abcd) +} {1 {parse error in option: abcd}} +do_catchsql_test 12.2 { + CREATE VIRTUAL TABLE nm USING zonefile(a=b) +} {1 {parse error in option: a=b}} +do_catchsql_test 12.3 { + CREATE VIRTUAL TABLE nm USING zonefile(cachesiza=b) +} {1 {parse error in option: cachesiza=b}} + +#------------------------------------------------------------------------- +# +reset_db +load_static_extension db zonefile +do_execsql_test 11.0 { + CREATE TABLE data(k INTEGER PRIMARY KEY, v BLOB); + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<250 + ) + INSERT INTO data SELECT i, randomblob(100) FROM s; + CREATE VIEW v1 AS SELECT k, -1 AS frame, -1 AS idx, v FROM data; + SELECT zonefile_write('test1.zonefile', 'v1'); + + CREATE VIRTUAL TABLE nm USING zonefile; + INSERT INTO nm_files(filename) VALUES('test1.zonefile'); +} {{}} + +foreach {tn cond} { + 1 "k > 30" + 2 "k >= 100" + 3 "k <= 100" + 4 "k < 55" + 5 "k LIKE '1%'" + 6 "k BETWEEN 10 AND 20" + 7 "k > 100 AND k < 200" +} { + do_execsql_test 11.$tn.1 [subst { + SELECT count(*) FROM nm WHERE $cond + }] [db one "SELECT count(*) FROM data WHERE $cond"] + + do_execsql_test 11.$tn.2 [subst { + SELECT count(*) FROM nm WHERE $cond AND + v!=(SELECT v FROM data WHERE k=nm.k); + }] 0 +} finish_test diff --git a/ext/zonefile/zonefilefault.test b/ext/zonefile/zonefilefault.test index 8c4ca6aef9..30975145bb 100644 --- a/ext/zonefile/zonefilefault.test +++ b/ext/zonefile/zonefilefault.test @@ -141,5 +141,26 @@ do_faultsim_test 2.2 -faults oom* -prep { faultsim_test_result {0 1179332920} } +do_faultsim_test 2.3 -faults oom* -prep { + faultsim_restore_and_reopen + load_static_extension db zonefile +} -body { + execsql { DELETE FROM zz_files } +} -test { + faultsim_test_result {0 {}} +} + +#------------------------------------------------------------------------- +reset_db +faultsim_save_and_close +do_faultsim_test 3 -faults oom* -prep { + faultsim_restore_and_reopen + load_static_extension db zonefile +} -body { + execsql { CREATE VIRTUAL TABLE t1 USING zonefile(cachesize=5) } +} -test { + faultsim_test_result {0 {}} +} + finish_test diff --git a/manifest b/manifest index b3b3356fb6..49978784ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sand\sminor\sfixes\sfor\sthe\szonefile\smodule. -D 2018-02-23T19:21:19.664 +C Fix\sa\sproblem\swith\shandling\s"k\s>=\s?"\sconstraints\sin\sthe\szonefile\smodule. +D 2018-02-23T21:01:15.048 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in a2d2fb8d17c39ab5ec52beb27850b903949080848236923f436156b72a958737 @@ -409,10 +409,10 @@ F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 F ext/userauth/userauth.c 3410be31283abba70255d71fd24734e017a4497f F ext/zonefile/README.md df86ef5b4f9aa8b07e1c8124b3f2dcea616927385aad59d525b784f0a06d446c -F ext/zonefile/zonefile.c d14151c34fd9e5c73a4f345a1a2065d80dbf1596d06bf8a6547a12d18c44395d -F ext/zonefile/zonefile1.test d1b2dcb7c0b8bba1f1fcb735fe1e6335670a23ee78e5ff0cc850e68b5540eb86 +F ext/zonefile/zonefile.c 886dc98b402cbfce902327725bcdb7e209e4ac4d41270be312f966023ca77b9b +F ext/zonefile/zonefile1.test f9d80a9138b34953d25387b094b886a3c66ddfb3ce07cd6e11bae20ef0bc5b02 F ext/zonefile/zonefileenc.test 10e770105edeff6a05df6be8db5481eaa8fcda2422ec5446ad21b34ed70d02d7 -F ext/zonefile/zonefilefault.test 4a454959db6568053a6ecfa3c523661476a922d417391f788e9ff2f5987dbfa8 +F ext/zonefile/zonefilefault.test 319dc0df65ee9dd89da5c7a9b72b88decfafbe627ab29ca11d93678732cca35e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 @@ -1712,7 +1712,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 994aa77d7826ab220727595a6a21f1f95a8f7590798879706016665ca1934dd1 -R da6c768beabe7f2a81e16e844ff466e6 +P dbbcbf0066ef82c789981feff78d95861a836e6e23a22ad3bb698dd257062f75 +R a381dedf59b4651a47fa5bb736b93522 U dan -Z de8917d47be58461bbb77ef08b41c047 +Z e0cceed6c3e6fbf110dfbc3e5d5a0f09 diff --git a/manifest.uuid b/manifest.uuid index b78c64f6a3..13b89fcfb2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dbbcbf0066ef82c789981feff78d95861a836e6e23a22ad3bb698dd257062f75 \ No newline at end of file +9a99afafa3fb9ec4823e5030cb04a685d64942ec04a1154b729dc4c0f313dc4a \ No newline at end of file -- 2.47.2