]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with handling "k >= ?" constraints in the zonefile module.
authordan <dan@noemail.net>
Fri, 23 Feb 2018 21:01:15 +0000 (21:01 +0000)
committerdan <dan@noemail.net>
Fri, 23 Feb 2018 21:01:15 +0000 (21:01 +0000)
FossilOrigin-Name: 9a99afafa3fb9ec4823e5030cb04a685d64942ec04a1154b729dc4c0f313dc4a

ext/zonefile/zonefile.c
ext/zonefile/zonefile1.test
ext/zonefile/zonefilefault.test
manifest
manifest.uuid

index 8a2e5e8d64e97a731bffe28c83ee5f6a44e8c72d..bf0e5df2386282739a83f5daf787f00867531df5 100644 (file)
@@ -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; i<argc && rc==SQLITE_OK; i++){
-      zonefileParseOption(p, argv[i], pzErr);
+      rc = zonefileParseOption(p, argv[i], pzErr);
     }
     if( rc==SQLITE_OK && p->nCacheSize<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, 
index 213f8f035cc331f03a8d019c55d7fcd80cb77ab2..1f0d7a6e535c44c5c4b7bfdd08065ead44878b72 100644 (file)
@@ -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
 
index 8c4ca6aef9b4e0dff2a4c358414982113659fa00..30975145bb5fcf96a7e29ab40d94f3c7171d32be 100644 (file)
@@ -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
 
index b3b3356fb6d1f98d6b601262e0698ca0bfca2842..49978784abd185f22ecdf79b2a1bf419aceaa676 100644 (file)
--- 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
index b78c64f6a3bfbe97649e65cc8da89411d1e4a3bc..13b89fcfb2ee81e0ccd5324402d8aee612401e24 100644 (file)
@@ -1 +1 @@
-dbbcbf0066ef82c789981feff78d95861a836e6e23a22ad3bb698dd257062f75
\ No newline at end of file
+9a99afafa3fb9ec4823e5030cb04a685d64942ec04a1154b729dc4c0f313dc4a
\ No newline at end of file