]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure the required VerifyCookie/Transaction/TableLock opcodes are added for "x
authordanielk1977 <danielk1977@noemail.net>
Thu, 2 Apr 2009 17:23:32 +0000 (17:23 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Thu, 2 Apr 2009 17:23:32 +0000 (17:23 +0000)
IN (SELECT c FROM t)" expressions. Ticket #3771. (CVS 6439)

FossilOrigin-Name: 058a2f20930d7707c03c3c27db8e761d5657ee46

manifest
manifest.uuid
src/expr.c
test/select1.test

index 6c66bfeaca0ea6d86acd50a7a934cb96c21fbbb0..f77497653915fa551b82c41f4f102b219f3162e3 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\scouple\sof\sharmless\snuisance\swarnings.\s(CVS\s6438)
-D 2009-04-02T17:22:42
+C Ensure\sthe\srequired\sVerifyCookie/Transaction/TableLock\sopcodes\sare\sadded\sfor\s"x\nIN\s(SELECT\sc\sFROM\st)"\sexpressions.\sTicket\s#3771.\s(CVS\s6439)
+D 2009-04-02T17:23:33
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 583e87706abc3026960ed759aff6371faf84c211
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -111,7 +111,7 @@ F src/callback.c 73016376d6848ba987709e8c9048d4f0e0776036
 F src/complete.c cb14e06dbe79dee031031f0d9e686ff306afe07c
 F src/date.c e6263ed8950642f593cb1a2cc8a73dd726cc7888
 F src/delete.c eb1066b2f35489fee46ad765d2b66386fc7d8adf
-F src/expr.c 14853cd56107292de6af664a24c6255111a4257d
+F src/expr.c b7ce173d17b80e937473147604bfde4bb339a8a0
 F src/fault.c dc88c821842157460750d2d61a8a8b4197d047ff
 F src/func.c 99ae90d46154952e08282fcdfe72d08e9601e174
 F src/global.c 448419c44ce0701104c2121b0e06919b44514c0c
@@ -515,7 +515,7 @@ F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd
 F test/savepoint6.test e28f7d8ab8a389d4e5bd1dc08bf2c3312754cc67
 F test/schema.test deafe5472099ab5bc65748059dc5182fc8ebad74
 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5
-F test/select1.test d0a4cad954fd41c030ec16ffbd2d08a4c0548742
+F test/select1.test fff339661707c5bfa0f2bd4974ceabe9b5d7f774
 F test/select2.test 9735da20ccd41e42bf2b4c19fd939141b591adae
 F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054
 F test/select4.test b64d5d248d008e1dc365f451c76090bde907e665
@@ -715,7 +715,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P 23f90d50737a36ebd17152dd4667948ce7049967
-R a1a1a4239b62dbb22521cfb4e8b651fc
-U drh
-Z fa40ccceb3f1316325395133ac351b79
+P 53dac0a455b9a822f710c257711e8d319060cf84
+R 4a174564884f326a4622b10ba400e069
+U danielk1977
+Z 805670f748f6b920a00761168c563c97
index 9b6201c25ae29fcacde45cada1b353da6db0643e..fe292cdb1cbc9adaf2e42caca0233125258caf83 100644 (file)
@@ -1 +1 @@
-53dac0a455b9a822f710c257711e8d319060cf84
\ No newline at end of file
+058a2f20930d7707c03c3c27db8e761d5657ee46
\ No newline at end of file
index 7b3db105d32530cacedbebdba08e61f484d0ad8b..663af1b12a89558c1017d79d6bf7a3c1813f4b63 100644 (file)
@@ -12,7 +12,7 @@
 ** This file contains routines used for analyzing expressions and
 ** for generating VDBE code that evaluates expressions in SQLite.
 **
-** $Id: expr.c,v 1.424 2009/03/25 16:51:43 drh Exp $
+** $Id: expr.c,v 1.425 2009/04/02 17:23:33 danielk1977 Exp $
 */
 #include "sqliteInt.h"
 
@@ -1345,11 +1345,17 @@ int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){
   */
   p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0);
   if( isCandidateForInOpt(p) ){
-    sqlite3 *db = pParse->db;
-    Index *pIdx;
-    Expr *pExpr = p->pEList->a[0].pExpr;
-    int iCol = pExpr->iColumn;
-    Vdbe *v = sqlite3GetVdbe(pParse);
+    sqlite3 *db = pParse->db;              /* Database connection */
+    Expr *pExpr = p->pEList->a[0].pExpr;   /* Expression <column> */
+    int iCol = pExpr->iColumn;             /* Index of column <column> */
+    Vdbe *v = sqlite3GetVdbe(pParse);      /* Virtual machine being coded */
+    Table *pTab = p->pSrc->a[0].pTab;      /* Table <table>. */
+    int iDb;                               /* Database idx for pTab */
+   
+    /* Code an OP_VerifyCookie and OP_TableLock for <table>. */
+    iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+    sqlite3CodeVerifySchema(pParse, iDb);
+    sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
 
     /* This function is only called from two places. In both cases the vdbe
     ** has already been allocated. So assume sqlite3GetVdbe() is always
@@ -1359,8 +1365,6 @@ int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){
     if( iCol<0 ){
       int iMem = ++pParse->nMem;
       int iAddr;
-      Table *pTab = p->pSrc->a[0].pTab;
-      int iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
       sqlite3VdbeUsesBtree(v, iDb);
 
       iAddr = sqlite3VdbeAddOp1(v, OP_If, iMem);
@@ -1371,17 +1375,17 @@ int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){
 
       sqlite3VdbeJumpHere(v, iAddr);
     }else{
+      Index *pIdx;                         /* Iterator variable */
+
       /* The collation sequence used by the comparison. If an index is to 
       ** be used in place of a temp-table, it must be ordered according
-      ** to this collation sequence.
-      */
+      ** to this collation sequence.  */
       CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pExpr);
 
       /* Check that the affinity that will be used to perform the 
       ** comparison is the same as the affinity of the column. If
       ** it is not, it is not possible to use any index.
       */
-      Table *pTab = p->pSrc->a[0].pTab;
       char aff = comparisonAffinity(pX);
       int affinity_ok = (pTab->aCol[iCol].affinity==aff||aff==SQLITE_AFF_NONE);
 
@@ -1390,7 +1394,6 @@ int sqlite3FindInIndex(Parse *pParse, Expr *pX, int *prNotFound){
          && (pReq==sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], -1, 0))
          && (!mustBeUnique || (pIdx->nColumn==1 && pIdx->onError!=OE_None))
         ){
-          int iDb;
           int iMem = ++pParse->nMem;
           int iAddr;
           char *pKey;
index 59c3b58784e5b24fc61005f8f915a91171dc1711..145a982d6360389c91df90edc65258528c431a29 100644 (file)
@@ -11,7 +11,7 @@
 # This file implements regression tests for SQLite library.  The
 # focus of this file is testing the SELECT statement.
 #
-# $Id: select1.test,v 1.65 2008/08/04 03:51:24 danielk1977 Exp $
+# $Id: select1.test,v 1.66 2009/04/02 17:23:33 danielk1977 Exp $
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
@@ -1041,4 +1041,24 @@ do_test select1-14.2 {
   }
 } {0}
 
+# Check that ticket #3771 has been fixed.
+#
+do_test select1-15.1 {
+  execsql {
+    CREATE TABLE t1(a);
+    CREATE INDEX i1 ON t1(a);
+    INSERT INTO t1 VALUES(1);
+    INSERT INTO t1 VALUES(2);
+    INSERT INTO t1 VALUES(3);
+  }
+} {}
+do_test select1-15.2 {
+  sqlite3 db2 test.db
+  execsql { DROP INDEX i1 } db2
+  db2 close
+} {}
+do_test select1-15.3 {
+  execsql { SELECT 2 IN (SELECT a FROM t1) }
+} {1}
+
 finish_test