]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
When generating code for partial indexes, be sure not to modify the
authordrh <drh@noemail.net>
Thu, 11 Jun 2015 13:58:35 +0000 (13:58 +0000)
committerdrh <drh@noemail.net>
Thu, 11 Jun 2015 13:58:35 +0000 (13:58 +0000)
index condition expression in the schema.

FossilOrigin-Name: e63d01c69c3e50f49ee3022a519c4f3e91f00520

manifest
manifest.uuid
src/delete.c
src/expr.c
src/insert.c
src/sqliteInt.h
test/index6.test

index 7b46a7527ca70dd58f34d4511d34a53ae2522b7c..913fd64a6042f7562946ef9f72a3c03763c2f6c1 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sminor\stypo\sin\sthe\squicktest\sMSVC\smakefile\starget.
-D 2015-06-10T22:03:40.913
+C When\sgenerating\scode\sfor\spartial\sindexes,\sbe\ssure\snot\sto\smodify\sthe\nindex\scondition\sexpression\sin\sthe\sschema.
+D 2015-06-11T13:58:35.248
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 1063c58075b7400d93326b0eb332b48a54f53025
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -201,8 +201,8 @@ F src/complete.c a5cf5b4b56390cfb7b8636e8f7ddef90258dd575
 F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b
 F src/date.c e4d50b3283696836ec1036b695ead9a19e37a5ac
 F src/dbstat.c f402e77e25089c6003d0c60b3233b9b3947d599a
-F src/delete.c 37964e6c1d73ff49cbea9ff690c9605fb15f600e
-F src/expr.c 0550baeca8dd7472e298d9e881e5e3484f7666f8
+F src/delete.c 8857a6f27560718f65d43bdbec86c967ae1f8dfa
+F src/expr.c 710c764c1974b15a0e56b004ff9f5e6ceab3a854
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c c9b63a217d86582c22121699a47f22f524608869
 F src/func.c 5b8b8e77a0fb644eaf8947d413804622e32692b6
@@ -210,7 +210,7 @@ F src/global.c 4f77cadbc5427d00139ba43d0f3979804cbb700e
 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
-F src/insert.c d6e1623a97ce33e9af2f1a0c1f0085a2f63327ef
+F src/insert.c b5f8b35a1b7924020e48cade5b2b5017bca7906b
 F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
 F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e
 F src/lempar.c 7274c97d24bb46631e504332ccd3bd1b37841770
@@ -255,7 +255,7 @@ F src/shell.c 07dda7cd692911d2f22269953418d049f2e2c0ee
 F src/sqlite.h.in d165beeceb6b40af60f352a4d4e37e02d9af7df0
 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
 F src/sqlite3ext.h 2ebeb634e751a61a6f0eebfa0f4669f46a42f6cd
-F src/sqliteInt.h 4c6731ce49b90582ea7d77c67b8792a4df8da237
+F src/sqliteInt.h 8f095bfe43ba68c32bac8d5349131ffacc660967
 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46
 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179
 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e
@@ -689,7 +689,7 @@ F test/index2.test ee83c6b5e3173a3d7137140d945d9a5d4fdfb9d6
 F test/index3.test b6ec456cf3b81d9a32123fe7e449bde434db338b
 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6
 F test/index5.test 25b0b451aceed4ac5f7d49f856f6de7257470b3e
-F test/index6.test 3ae54e53c53f2adcacda269237d8e52bdb05a481
+F test/index6.test fbf45ceb39eb8a01b837d22623b93b208e6509ef
 F test/index7.test 9c6765a74fc3fcde7aebc5b3bd40d98df14a527c
 F test/indexedby.test 5f527a78bae74c61b8046ae3037f9dfb0bf0c353
 F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d
@@ -1286,7 +1286,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 6ddef2ad35ceb5822fc14c65bc7c6a2662edb63c
-R c63a194dd469f312ca0f35c47faf1707
-U mistachkin
-Z c108f8ac4d75e13d11936c87d29e2e70
+P 75b65f9d49daaf48e97042cb82ea554e2ec74eec
+R d74aba000e40e2b28c1e25cf1d9fcc49
+U drh
+Z 8cefff923a130826c381270a2faa270d
index d1f247c6bc3ba4f2a5b16a6c42427e0c92021935..4dd90d998264fdbe2fb8797afc5218e1d8b783c6 100644 (file)
@@ -1 +1 @@
-75b65f9d49daaf48e97042cb82ea554e2ec74eec
\ No newline at end of file
+e63d01c69c3e50f49ee3022a519c4f3e91f00520
\ No newline at end of file
index ef6aace1c822b3a890dbb057bf98ff24c50430d6..369cdaf6fe29647e7c6ce07785969e614673f025 100644 (file)
@@ -798,8 +798,8 @@ int sqlite3GenerateIndexKey(
       *piPartIdxLabel = sqlite3VdbeMakeLabel(v);
       pParse->iPartIdxTab = iDataCur;
       sqlite3ExprCachePush(pParse);
-      sqlite3ExprIfFalse(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, 
-                         SQLITE_JUMPIFNULL);
+      sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, 
+                            SQLITE_JUMPIFNULL);
     }else{
       *piPartIdxLabel = 0;
     }
index 89eee29ecdeb19d2ceaeebfe0ed818c54b3e36ab..06993e7371a5331aa0c55bffdfb7b799115c9fda 100644 (file)
@@ -3702,6 +3702,21 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){
   sqlite3ReleaseTempReg(pParse, regFree2);
 }
 
+/*
+** Like sqlite3ExprIfFalse() except that a copy is made of pExpr before
+** code generation, and that copy is deleted after code generation. This
+** ensures that the original pExpr is unchanged.
+*/
+void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){
+  sqlite3 *db = pParse->db;
+  Expr *pCopy = sqlite3ExprDup(db, pExpr, 0);
+  if( db->mallocFailed==0 ){
+    sqlite3ExprIfFalse(pParse, pCopy, dest, jumpIfNull);
+  }
+  sqlite3ExprDelete(db, pCopy);
+}
+
+
 /*
 ** Do a deep comparison of two expression trees.  Return 0 if the two
 ** expressions are completely identical.  Return 1 if they differ only
index 7e8741a9a2ecb49ce32880138e7ad37af31e36fa..16bf07cdfd6140f946baaa181b901b6b386eae6f 100644 (file)
@@ -1381,8 +1381,8 @@ void sqlite3GenerateConstraintChecks(
     if( pIdx->pPartIdxWhere ){
       sqlite3VdbeAddOp2(v, OP_Null, 0, aRegIdx[ix]);
       pParse->ckBase = regNewData+1;
-      sqlite3ExprIfFalse(pParse, pIdx->pPartIdxWhere, addrUniqueOk,
-                         SQLITE_JUMPIFNULL);
+      sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, addrUniqueOk,
+                            SQLITE_JUMPIFNULL);
       pParse->ckBase = 0;
     }
 
index 43e4b0be9b03799a18dcdaf8d070d634ca2b7eb6..2378376c28b4aaf69ecac03e2a88f542704a634a 100644 (file)
@@ -3326,6 +3326,7 @@ int sqlite3ExprCodeExprList(Parse*, ExprList*, int, u8);
 #define SQLITE_ECEL_FACTOR   0x02  /* Factor out constant terms */
 void sqlite3ExprIfTrue(Parse*, Expr*, int, int);
 void sqlite3ExprIfFalse(Parse*, Expr*, int, int);
+void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int);
 Table *sqlite3FindTable(sqlite3*,const char*, const char*);
 Table *sqlite3LocateTable(Parse*,int isView,const char*, const char*);
 Table *sqlite3LocateTableItem(Parse*,int isView,struct SrcList_item *);
index 69fae49feb5aa46c3f63bfa3aaeea3ca6a990724..e15820290eaea88d78ad89a2cf0a50d364c4e53a 100644 (file)
@@ -327,4 +327,23 @@ do_execsql_test index6-8.2 {
   3 three value 3
 }
 
+# 2015-06-11.  Assertion fault found by AFL
+#
+do_execsql_test index6-9.1 {
+  CREATE TABLE t9(a int, b int, c int);
+  CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20);
+  INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5),(NULL,7,3);
+  UPDATE t9 SET b=c WHERE a in (10,12,20);
+  SELECT a,b,c,'|' FROM t9 ORDER BY a;
+} {{} 7 3 | 1 1 9 | 10 35 35 | 11 15 82 | 20 5 5 |}
+do_execsql_test index6-9.2 {
+  DROP TABLE t9;
+  CREATE TABLE t9(a int, b int, c int, PRIMARY KEY(a)) WITHOUT ROWID;
+  CREATE INDEX t9ca ON t9(c,a) WHERE a in (10,12,20);
+  INSERT INTO t9 VALUES(1,1,9),(10,2,35),(11,15,82),(20,19,5);
+  UPDATE t9 SET b=c WHERE a in (10,12,20);
+  SELECT a,b,c,'|' FROM t9 ORDER BY a;
+} {1 1 9 | 10 35 35 | 11 15 82 | 20 5 5 |}
+
+
 finish_test