]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Only disable the one-pass DELETE optimization if the WHERE clause contains
authordrh <drh@noemail.net>
Wed, 4 May 2016 14:45:30 +0000 (14:45 +0000)
committerdrh <drh@noemail.net>
Wed, 4 May 2016 14:45:30 +0000 (14:45 +0000)
a correlated subquery.  Uncorrelated subqueries are allowed.  This is a
refinement of check-in [3f221f592a9a1] that is the fix for
ticket [dc6ebeda9396087].

FossilOrigin-Name: aae389692a2ed2cc92151d51fb2cd5a16921c469

manifest
manifest.uuid
src/delete.c
src/resolve.c
src/sqliteInt.h

index fc948d48f2bc7f6b77fa9af5c584f92b95ea25dc..a7d16f5cd67eb01c8f43e4cbe0db209a2fab3680 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Portability\senhancements\sto\sthe\sconfigure\sscript\son\sthe\samalgamation\starball.
-D 2016-05-04T14:20:15.883
+C Only\sdisable\sthe\sone-pass\sDELETE\soptimization\sif\sthe\sWHERE\sclause\scontains\na\scorrelated\ssubquery.\s\sUncorrelated\ssubqueries\sare\sallowed.\s\sThis\sis\sa\nrefinement\sof\scheck-in\s[3f221f592a9a1]\sthat\sis\sthe\sfix\sfor\nticket\s[dc6ebeda9396087].
+D 2016-05-04T14:45:30.802
 F Makefile.in 9eda6e1c90d05c199c3ec8a7069b0682ad307657
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc db82b35aef27f412fef14d8534afc022138bcdfd
@@ -330,7 +330,7 @@ F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 60e135af364d777a9ab41c97e5e89cd224da6198
 F src/date.c 1cc9fb516ec9932c6fd4d2a0d2f8bc4480145c39
 F src/dbstat.c c845548d4346e606e2f2b7d2e714ace2b8a7dd1b
-F src/delete.c 362f89f8e6783e672c4ab06b90fca0177f9a576d
+F src/delete.c 3f16e7ceb9e5084b127e0a4e10a9b06ca66c0b2e
 F src/expr.c 8796c0739b2ad091e6779253f62aad6e767e2be1
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c 4c0bd09e602b8ae8d36d81e31e4872d0b53c87bb
@@ -375,14 +375,14 @@ F src/pragma.h 64c78a648751b9f4f297276c4eb7507b14b4628c
 F src/prepare.c 22df6171aec1d86904ed2ad30c2348a5748aa04e
 F src/printf.c 63e6fb12bbe702dd664dc3703776c090383a5a26
 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
-F src/resolve.c b8f7174e5f8c33c44ded3a25a973d0bb89228c20
+F src/resolve.c cca3aa77b95706df5d635a2141a4d1de60ae6598
 F src/rowset.c 49eb91c588a2bab36647368e031dc5b66928149d
 F src/select.c fd4a7ce2937497181063cfedb92058ac89491a5d
 F src/shell.c 14ff7f660530a52b117d110ba3390b7b2eb719b6
 F src/sqlite.h.in 9984129d86243424b765fcb3f147c697bd20bb54
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 98f72cbfe00169c39089115427d06ea05fe4b4a2
-F src/sqliteInt.h f4a53f3547dab80dc7db975fa1192d9bad1f38e8
+F src/sqliteInt.h c8483dd77894a72d38a76b6251a4ac949a37d6e8
 F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247
 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba
 F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9
@@ -1487,7 +1487,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 6341ab2ffef298ca16b323358afbea4a4c1fb0e1
-R a3cd249f5ae281a2f2bd8ab97d7cb0bc
+P 7184c4b8869ffc00944abdd8d2c521cb11ea5824
+R 0a6e5fa4a5a2f4a10bd60c5e077cbc66
 U drh
-Z 6738ef2f38ef30f9c397b3159a787329
+Z 06351e9e2a2d525f9337b5a6815ea254
index 341201e6176efb081c7556d071a9418253614d63..f6fcd613aea9c1908c8940af527f21c44f85d2b3 100644 (file)
@@ -1 +1 @@
-7184c4b8869ffc00944abdd8d2c521cb11ea5824
\ No newline at end of file
+aae389692a2ed2cc92151d51fb2cd5a16921c469
\ No newline at end of file
index 258b39cc3efb98f2b8dd0eb19030438cae5c63a5..06a016438c87a8eeb30473ea497cfcbc2ec760a8 100644 (file)
@@ -374,7 +374,7 @@ void sqlite3DeleteFrom(
 #endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */
   {
     u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK;
-    if( pWhere && ExprHasProperty(pWhere, EP_Subquery) ) bComplex = 1;
+    if( sNC.ncFlags & NC_VarSelect ) bComplex = 1;
     wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW);
     if( HasRowid(pTab) ){
       /* For a rowid table, initialize the RowSet to an empty set */
index 8e290af123b53fd31c00d5c3703c87a90ff06c0e..77ce37f6d7893b5454565f7930e95bf5261c58e7 100644 (file)
@@ -763,6 +763,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
         assert( pNC->nRef>=nRef );
         if( nRef!=pNC->nRef ){
           ExprSetProperty(pExpr, EP_VarSelect);
+          pNC->ncFlags |= NC_VarSelect;
         }
       }
       break;
index 76bf8096245f6f379b1f9b516365a6ab41f82e22..783f0f56c3edd0000ce6e39136ff1b47fb7d1eb9 100644 (file)
@@ -2597,6 +2597,7 @@ struct NameContext {
 #define NC_InAggFunc 0x0008  /* True if analyzing arguments to an agg func */
 #define NC_HasAgg    0x0010  /* One or more aggregate functions seen */
 #define NC_IdxExpr   0x0020  /* True if resolving columns of CREATE INDEX */
+#define NC_VarSelect 0x0040  /* A correlated subquery has been seen */
 #define NC_MinMaxAgg 0x1000  /* min/max aggregates seen.  See note above */
 
 /*