From 156c7919d9f0895266d1b34eccd39bf893a1e8b4 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 16 Nov 2013 20:45:01 +0000 Subject: [PATCH] The one-pass optimization is now working for DELETE on WITHOUT ROWID tables. FossilOrigin-Name: e4d220a381388f900a95d1b656a82f14c837f92e --- manifest | 15 ++++++--------- manifest.uuid | 2 +- src/delete.c | 41 +++++++++++++++++++++++++++++++---------- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 31f36d8ac7..6c93f9afcb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sDELETE\slogic\sso\sthat\sit\scan\smake\suse\sof\sWHERE_ONEPASS_DESIRED\nfor\srowid\stables. -D 2013-11-16T20:13:39.579 +C The\sone-pass\soptimization\sis\snow\sworking\sfor\sDELETE\son\sWITHOUT\sROWID\stables. +D 2013-11-16T20:45:01.087 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 8a07bebafbfda0eb67728f4bd15a36201662d1a1 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -174,7 +174,7 @@ F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c F src/date.c 593c744b2623971e45affd0bde347631bdfa4625 -F src/delete.c 765215277172cd66123516b92c99804bfab490f1 +F src/delete.c 35750d35fe9f174ccb98bae0d6627dcf83a7965a F src/expr.c 1a295d8b0a2ba08919ad9300ebf7b67988ff4030 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 78364daed38e26269c53ddb94c515bceac1063c6 @@ -1140,10 +1140,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 7edf39eb93a8f9059a788f5fccf41c2be40afd4d -R a6d07ee396f35147cc60e236a37bb900 -T *branch * optimize-delete -T *sym-optimize-delete * -T -sym-trunk * +P 8f479a72758ab6fedb171ada612b1963143c32fa +R b6e41a6a6d551dfa6da0e7b0e42124eb U drh -Z fab6ca68390544d72160beaeac98129b +Z f0edfafd89abfe9d193a6a7758aa54ff diff --git a/manifest.uuid b/manifest.uuid index 0a6d9a3628..1a4b2e1489 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8f479a72758ab6fedb171ada612b1963143c32fa \ No newline at end of file +e4d220a381388f900a95d1b656a82f14c837f92e \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index c36c9447f7..30b415aa35 100644 --- a/src/delete.c +++ b/src/delete.c @@ -386,20 +386,37 @@ void sqlite3DeleteFrom( iKey = ++pParse->nMem; iEph = pParse->nTab++; - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk); sqlite3VdbeSetP4KeyInfo(pParse, pPk); - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, 0, 0); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, + WHERE_ONEPASS_DESIRED, iTabCur+1); if( pWInfo==0 ) goto delete_from_cleanup; + okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); for(i=0; iaiColumn[i],iPk+i); } - sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, - sqlite3IndexAffinityStr(v, pPk), P4_TRANSIENT); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iEph, iKey); if( db->flags & SQLITE_CountRows ){ sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); } + if( okOnePass ){ + aToOpen = sqlite3DbMallocRaw(db, nIdx+2); + if( aToOpen==0 ) goto delete_from_cleanup; + memset(aToOpen, 1, nIdx+1); + aToOpen[nIdx+1] = 0; + if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iTabCur] = 0; + if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iTabCur] = 0; + sqlite3VdbeChangeToNoop(v, addr); + addr = sqlite3VdbeAddOp0(v, OP_Goto); + }else{ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, + sqlite3IndexAffinityStr(v, pPk), P4_TRANSIENT); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iEph, iKey); + } sqlite3WhereEnd(pWInfo); + if( okOnePass ){ + sqlite3VdbeAddOp0(v, OP_Halt); + sqlite3VdbeJumpHere(v, addr); + } /* Open cursors for all indices of the table. */ @@ -407,16 +424,20 @@ void sqlite3DeleteFrom( &iDataCur, &iIdxCur); /* Loop over the primary keys to be deleted. */ - addr = sqlite3VdbeAddOp1(v, OP_Rewind, iEph); - sqlite3VdbeAddOp2(v, OP_RowKey, iEph, iPk); + if( !okOnePass ){ + addr = sqlite3VdbeAddOp1(v, OP_Rewind, iEph); + sqlite3VdbeAddOp2(v, OP_RowKey, iEph, iPk); + } /* Delete the row */ sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, - iPk, 0, 1, OE_Default, 0); + iPk, nPk*okOnePass, 1, OE_Default, okOnePass); /* End of the delete loop */ - sqlite3VdbeAddOp2(v, OP_Next, iEph, addr+1); - sqlite3VdbeJumpHere(v, addr); + if( !okOnePass ){ + sqlite3VdbeAddOp2(v, OP_Next, iEph, addr+1); + sqlite3VdbeJumpHere(v, addr); + } /* Close the cursors open on the table and its indexes. */ assert( iDataCur>=iIdxCur ); -- 2.47.2