mirror of https://github.com/sqlite/sqlite
The one-pass optimization is now working for DELETE on WITHOUT ROWID tables.
FossilOrigin-Name: e4d220a381388f900a95d1b656a82f14c837f92e
This commit is contained in:
parent
6a53499a20
commit
156c7919d9
15
manifest
15
manifest
|
@ -1,5 +1,5 @@
|
||||||
C Enhance\sthe\sDELETE\slogic\sso\sthat\sit\scan\smake\suse\sof\sWHERE_ONEPASS_DESIRED\nfor\srowid\stables.
|
C The\sone-pass\soptimization\sis\snow\sworking\sfor\sDELETE\son\sWITHOUT\sROWID\stables.
|
||||||
D 2013-11-16T20:13:39.579
|
D 2013-11-16T20:45:01.087
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 8a07bebafbfda0eb67728f4bd15a36201662d1a1
|
F Makefile.in 8a07bebafbfda0eb67728f4bd15a36201662d1a1
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
|
@ -174,7 +174,7 @@ F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2
|
||||||
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
|
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
|
||||||
F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c
|
F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c
|
||||||
F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
|
F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
|
||||||
F src/delete.c 765215277172cd66123516b92c99804bfab490f1
|
F src/delete.c 35750d35fe9f174ccb98bae0d6627dcf83a7965a
|
||||||
F src/expr.c 1a295d8b0a2ba08919ad9300ebf7b67988ff4030
|
F src/expr.c 1a295d8b0a2ba08919ad9300ebf7b67988ff4030
|
||||||
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
||||||
F src/fkey.c 78364daed38e26269c53ddb94c515bceac1063c6
|
F src/fkey.c 78364daed38e26269c53ddb94c515bceac1063c6
|
||||||
|
@ -1140,10 +1140,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
|
||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
|
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
|
||||||
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
|
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
|
||||||
P 7edf39eb93a8f9059a788f5fccf41c2be40afd4d
|
P 8f479a72758ab6fedb171ada612b1963143c32fa
|
||||||
R a6d07ee396f35147cc60e236a37bb900
|
R b6e41a6a6d551dfa6da0e7b0e42124eb
|
||||||
T *branch * optimize-delete
|
|
||||||
T *sym-optimize-delete *
|
|
||||||
T -sym-trunk *
|
|
||||||
U drh
|
U drh
|
||||||
Z fab6ca68390544d72160beaeac98129b
|
Z f0edfafd89abfe9d193a6a7758aa54ff
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
8f479a72758ab6fedb171ada612b1963143c32fa
|
e4d220a381388f900a95d1b656a82f14c837f92e
|
33
src/delete.c
33
src/delete.c
|
@ -386,20 +386,37 @@ void sqlite3DeleteFrom(
|
||||||
iKey = ++pParse->nMem;
|
iKey = ++pParse->nMem;
|
||||||
iEph = pParse->nTab++;
|
iEph = pParse->nTab++;
|
||||||
|
|
||||||
sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk);
|
addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk);
|
||||||
sqlite3VdbeSetP4KeyInfo(pParse, pPk);
|
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;
|
if( pWInfo==0 ) goto delete_from_cleanup;
|
||||||
|
okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass);
|
||||||
for(i=0; i<nPk; i++){
|
for(i=0; i<nPk; i++){
|
||||||
sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, pPk->aiColumn[i],iPk+i);
|
sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, pPk->aiColumn[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 ){
|
if( db->flags & SQLITE_CountRows ){
|
||||||
sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1);
|
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);
|
sqlite3WhereEnd(pWInfo);
|
||||||
|
if( okOnePass ){
|
||||||
|
sqlite3VdbeAddOp0(v, OP_Halt);
|
||||||
|
sqlite3VdbeJumpHere(v, addr);
|
||||||
|
}
|
||||||
|
|
||||||
/* Open cursors for all indices of the table.
|
/* Open cursors for all indices of the table.
|
||||||
*/
|
*/
|
||||||
|
@ -407,16 +424,20 @@ void sqlite3DeleteFrom(
|
||||||
&iDataCur, &iIdxCur);
|
&iDataCur, &iIdxCur);
|
||||||
|
|
||||||
/* Loop over the primary keys to be deleted. */
|
/* Loop over the primary keys to be deleted. */
|
||||||
|
if( !okOnePass ){
|
||||||
addr = sqlite3VdbeAddOp1(v, OP_Rewind, iEph);
|
addr = sqlite3VdbeAddOp1(v, OP_Rewind, iEph);
|
||||||
sqlite3VdbeAddOp2(v, OP_RowKey, iEph, iPk);
|
sqlite3VdbeAddOp2(v, OP_RowKey, iEph, iPk);
|
||||||
|
}
|
||||||
|
|
||||||
/* Delete the row */
|
/* Delete the row */
|
||||||
sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur,
|
sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur,
|
||||||
iPk, 0, 1, OE_Default, 0);
|
iPk, nPk*okOnePass, 1, OE_Default, okOnePass);
|
||||||
|
|
||||||
/* End of the delete loop */
|
/* End of the delete loop */
|
||||||
|
if( !okOnePass ){
|
||||||
sqlite3VdbeAddOp2(v, OP_Next, iEph, addr+1);
|
sqlite3VdbeAddOp2(v, OP_Next, iEph, addr+1);
|
||||||
sqlite3VdbeJumpHere(v, addr);
|
sqlite3VdbeJumpHere(v, addr);
|
||||||
|
}
|
||||||
|
|
||||||
/* Close the cursors open on the table and its indexes. */
|
/* Close the cursors open on the table and its indexes. */
|
||||||
assert( iDataCur>=iIdxCur );
|
assert( iDataCur>=iIdxCur );
|
||||||
|
|
Loading…
Reference in New Issue