]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a couple of issues in incremental_index_check to do with CREATE INDEX
authordan <dan@noemail.net>
Tue, 31 Oct 2017 12:01:01 +0000 (12:01 +0000)
committerdan <dan@noemail.net>
Tue, 31 Oct 2017 12:01:01 +0000 (12:01 +0000)
statements that contain embedded SQL comments.

FossilOrigin-Name: 2aef41815a9f1786ebdf09d8f6cfa59a8e7d733253eafeae24fa6e2a093bb1d8

ext/repair/checkindex.c
manifest
manifest.uuid
test/checkindex.test

index fc91b74244f9430448cfea3a9311f1be69e2aaf9..16fb3b327e9c02a51e640f621dc87d2142550163 100644 (file)
@@ -274,47 +274,84 @@ static void cidxFreeIndex(CidxIndex *pIdx){
   }
 }
 
+static int cidx_isspace(char c){
+  return c==' ' || c=='\t' || c=='\r' || c=='\n';
+}
+
+static int cidx_isident(char c){
+  return c<0 
+    || (c>='0' && c<='9') || (c>='a' && c<='z') 
+    || (c>='A' && c<='Z') || c=='_';
+}
+
 #define CIDX_PARSE_EOF   0
 #define CIDX_PARSE_COMMA 1      /*  "," */
 #define CIDX_PARSE_OPEN  2      /*  "(" */
 #define CIDX_PARSE_CLOSE 3      /*  ")" */
 
-static int cidxFindNext(const char *zIn, const char **pzOut){
+static int cidxFindNext(
+  const char *zIn, 
+  const char **pzOut,
+  int *pbDoNotTrim                /* OUT: True if prev is -- comment */
+){
   const char *z = zIn;
 
   while( 1 ){
-    *pzOut = z;
-    switch( *z ){
-      case '\0':
-        return CIDX_PARSE_EOF;
-      case '(':
-        return CIDX_PARSE_OPEN;
-      case ')':
-        return CIDX_PARSE_CLOSE;
-      case ',':
-        return CIDX_PARSE_COMMA;
-
-      case '"': 
-      case '\'': 
-      case '`': {
-        char q = *z;
+    if( z[0]=='-' && z[1]=='-' ){
+      z += 2;
+      while( z[0]!='\n' ){
+        if( z[0]=='\0' ) return CIDX_PARSE_EOF;
         z++;
-        while( *z ){
-          if( *z==q ){
+      }
+      while( cidx_isspace(*z) ) z++;
+      *pbDoNotTrim = 1;
+    }else{
+      *pzOut = z;
+      switch( *z ){
+        case '\0':
+          return CIDX_PARSE_EOF;
+        case '(':
+          return CIDX_PARSE_OPEN;
+        case ')':
+          return CIDX_PARSE_CLOSE;
+        case ',':
+          return CIDX_PARSE_COMMA;
+  
+        case '"': 
+        case '\'': 
+        case '`': {
+          char q = *z;
+          z++;
+          while( *z ){
+            if( *z==q ){
+              z++;
+              if( *z!=q ) break;
+            }
             z++;
-            if( *z!=q ) break;
           }
-          z++;
+          break;
         }
-        break;
+  
+        case '[':
+          while( *z++!=']' );
+          break;
+  
+        case '/':
+          if( z[1]=='*' ){
+            z += 2;
+            while( z[0]!='*' || z[1]!='/' ){
+              if( z[1]=='\0' ) return CIDX_PARSE_EOF;
+              z++;
+            }
+            z += 2;
+            break;
+          }
+  
+        default:
+          z++;
+          break;
       }
-
-      case '[':
-        while( *z++!=']' );
-        break;
-
-      default:
-        z++;
+      *pbDoNotTrim = 0;
     }
   }
 
@@ -322,46 +359,39 @@ static int cidxFindNext(const char *zIn, const char **pzOut){
   return -1;
 }
 
-static int cidx_isspace(char c){
-  return c==' ' || c=='\t' || c=='\r' || c=='\n';
-}
-
-static int cidx_isident(char c){
-  return c<0 
-    || (c>='0' && c<='9') || (c>='a' && c<='z') 
-    || (c>='A' && c<='Z') || c=='_';
-}
-
 static int cidxParseSQL(CidxCursor *pCsr, CidxIndex *pIdx, const char *zSql){
   const char *z = zSql;
   const char *z1;
   int e;
   int rc = SQLITE_OK;
   int nParen = 1;
+  int bDoNotTrim = 0;
   CidxColumn *pCol = pIdx->aCol;
 
-  e = cidxFindNext(z, &z);
+  e = cidxFindNext(z, &z, &bDoNotTrim);
   if( e!=CIDX_PARSE_OPEN ) goto parse_error;
   z1 = z+1;
   z++;
   while( nParen>0 ){
-    e = cidxFindNext(z, &z);
+    e = cidxFindNext(z, &z, &bDoNotTrim);
     if( e==CIDX_PARSE_EOF ) goto parse_error;
     if( (e==CIDX_PARSE_COMMA || e==CIDX_PARSE_CLOSE) && nParen==1 ){
       const char *z2 = z;
       if( pCol->zExpr ) goto parse_error;
 
-      while( cidx_isspace(z[-1]) ) z--;
-      if( 0==sqlite3_strnicmp(&z[-3], "asc", 3) && 0==cidx_isident(z[-4]) ){
-        z -= 3;
-        while( cidx_isspace(z[-1]) ) z--;
-      }else
-      if( 0==sqlite3_strnicmp(&z[-4], "desc", 4) && 0==cidx_isident(z[-5]) ){
-        z -= 4;
+      if( bDoNotTrim==0 ){
         while( cidx_isspace(z[-1]) ) z--;
+        if( !sqlite3_strnicmp(&z[-3], "asc", 3) && 0==cidx_isident(z[-4]) ){
+          z -= 3;
+          while( cidx_isspace(z[-1]) ) z--;
+        }else
+          if( !sqlite3_strnicmp(&z[-4], "desc", 4) && 0==cidx_isident(z[-5]) ){
+            z -= 4;
+            while( cidx_isspace(z[-1]) ) z--;
+          }
+        while( cidx_isspace(z1[0]) ) z1++;
       }
 
-      while( cidx_isspace(z1[0]) ) z1++;
       pCol->zExpr = cidxMprintf(&rc, "%.*s", z-z1, z1);
       pCol++;
       z = z1 = z2+1;
index 59ee792f38a1aaff401352cdd9cbc772252cdd19..974a630385164fd6a8f8091309dee025befee755 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\ssupport\sfor\sindexes\son\sexpressions\sto\sincremental_index_check.
-D 2017-10-30T19:38:41.046
+C Fix\sa\scouple\sof\sissues\sin\sincremental_index_check\sto\sdo\swith\sCREATE\sINDEX\nstatements\sthat\scontain\sembedded\sSQL\scomments.
+D 2017-10-31T12:01:01.861
 F Makefile.in e016061b23e60ac9ec27c65cb577292b6bde0307ca55abd874ab3487b3b1beb2
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 37740aba9c4bb359c627eadccf1cfd7be4f5f847078723777ea7763969e533b1
@@ -328,7 +328,7 @@ F ext/rbu/sqlite3rbu.h b42bcd4d8357268c6c39ab2a60b29c091e89328fa8cc49c8fac5ab8d0
 F ext/rbu/test_rbu.c 7073979b9cc80912bb03599ac8d85ab5d3bf03cfacd3463f2dcdd7822997533a
 F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15
 F ext/repair/checkfreelist.c 0abb84b4545016d57ba1a2aa8884c72c73ed838968909858c03bc1f38fb6b054
-F ext/repair/checkindex.c 9feaee9a393e11198aced072e81dfd4c38bda8b914a2a20aba126efbef445185
+F ext/repair/checkindex.c f33d90ed6a556ad03511f7932891c2fd47ad93ddc998a4ab8bb56f4adf6fb206
 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
 F ext/rtree/rtree.c cc91b6905bf55512c6ebc7dfdd37ac81c86f1753db8cfa6d62f0ee864464044f
 F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e
@@ -654,7 +654,7 @@ F test/cast.test 4c275cbdc8202d6f9c54a3596701719868ac7dc3
 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef
 F test/check.test 33a698e8c63613449d85d624a38ef669bf20331daabebe3891c9405dd6df463a
 F test/checkfreelist.test 100283a3e6b8a3018c7fab7cfdaf03d1d6540fc66453114e248cf82b25784d3b
-F test/checkindex.test f0a611472ac09f294766c8ece1f85b0545aa82207f516437416ef3390b00b8a3
+F test/checkindex.test 77153b3d92492a186c947031ee0eb2e9b879c07192c0066f6152539b670dd237
 F test/close.test 799ea4599d2f5704b0a30f477d17c2c760d8523fa5d0c8be4a7df2a8cad787d8
 F test/closure01.test b1703ba40639cfc9b295cf478d70739415eec6a4
 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91
@@ -1668,7 +1668,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 940606b3af059eb3f79d71fec871ea88df8bce0349f5b33b79c147a85610e269
-R 32cef05dfb77ed0c73cb51913be9d3e3
+P 8c1c701fdbe0d56ee7f6f7d7b583aafde9fa14acc93ee8ecaddc8bb311e2bf52
+R 4a5b38f6ae42388faee270886368a889
 U dan
-Z 4d91b1f15edf1ab6cd873cde5a983874
+Z ee7435bc6b4be93625562670a465a6a7
index f363d67abb9b3fdc82d263058f07993247a58297..be302e7d98c2822b6ae5b5adf692b01056dd59ae 100644 (file)
@@ -1 +1 @@
-8c1c701fdbe0d56ee7f6f7d7b583aafde9fa14acc93ee8ecaddc8bb311e2bf52
\ No newline at end of file
+2aef41815a9f1786ebdf09d8f6cfa59a8e7d733253eafeae24fa6e2a093bb1d8
\ No newline at end of file
index a91455558fbd39f1c08edf86e746ad5db527d7a8..22463d3ffebe539086e3c6f3e5a7bd91939b94c9 100644 (file)
@@ -318,6 +318,33 @@ do_index_check_test 5.3.2 sqlite_autoindex_t5_1 {
   {} {'{"x":5, "y":5}',5}
 }
 
+#-------------------------------------------------------------------------
+#
+do_execsql_test 6.0 {
+  CREATE TABLE t6(x INTEGER PRIMARY KEY, y, z);
+  CREATE INDEX t6x1 ON t6(y, /* one,two,three */ z);
+  CREATE INDEX t6x2 ON t6(z, -- hello,world,
+  y);
+
+  CREATE INDEX t6x3 ON t6(z -- hello,world
+  , y);
+
+  INSERT INTO t6 VALUES(1, 2, 3);
+  INSERT INTO t6 VALUES(4, 5, 6);
+}
+
+do_index_check_test 6.1 t6x1 {
+  {} 2,3,1 
+  {} 5,6,4
+}
+do_index_check_test 6.2 t6x2 {
+  {} 3,2,1 
+  {} 6,5,4
+}
+do_index_check_test 6.2 t6x3 {
+  {} 3,2,1 
+  {} 6,5,4
+}
 
 finish_test