1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +03:00

Modify the sqlite3SelectDup() routine to avoid recursing on Select.pPrior.

FossilOrigin-Name: a7674ead5be986c66f7d61d598adc7e5728bcd30
This commit is contained in:
dan
2017-02-03 14:44:52 +00:00
parent 1101ae4113
commit a7466205ca
3 changed files with 45 additions and 35 deletions

View File

@@ -1,5 +1,5 @@
C Ensure\sthat\sall\scursors\shave\stheir\spositions\ssaved\sprior\sto\srolling\sback\na\ssavepoint. C Modify\sthe\ssqlite3SelectDup()\sroutine\sto\savoid\srecursing\son\sSelect.pPrior.
D 2017-02-02T20:32:28.731 D 2017-02-03T14:44:52.406
F Makefile.in 5f415e7867296d678fed2e6779aea10c1318b4bc F Makefile.in 5f415e7867296d678fed2e6779aea10c1318b4bc
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc ba953c8921fc7e18333f61898007206de7e23964 F Makefile.msc ba953c8921fc7e18333f61898007206de7e23964
@@ -346,7 +346,7 @@ F src/ctime.c 9f2296a4e5d26ebf0e0d95a0af4628f1ea694e7a
F src/date.c dc3f1391d9297f8c748132813aaffcb117090d6e F src/date.c dc3f1391d9297f8c748132813aaffcb117090d6e
F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d
F src/delete.c 0d9d5549d42e79ce4d82ff1db1e6c81e36d2f67c F src/delete.c 0d9d5549d42e79ce4d82ff1db1e6c81e36d2f67c
F src/expr.c d7ef6fdb70bc18259d7d36b22aa0bc4845c5c5b9 F src/expr.c d29114e9b709eaeaaa18553a5bbe60a19302aeef
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae
F src/func.c c67273e1ec08abbdcc14c189892a3ff6eeece86b F src/func.c c67273e1ec08abbdcc14c189892a3ff6eeece86b
@@ -1552,8 +1552,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 5a0da77c22ebc7db5e63b1520d30f3ad97b9bb3b 01d97e5b6502b1811b52a681f445e1aaae6c0ee6 P 8e03a8e95fada5c24d369672a71f6e02288051da
R f67fbd165c607c8ab8b9fb8cff6e4d0d R c80f7dbbf5f0044354e4b463e716c13e
T +closed 01d97e5b6502b1811b52a681f445e1aaae6c0ee6 T *branch * recursive-selectdup
U drh T *sym-recursive-selectdup *
Z d16d6898d272ff11e9984476ae1d9ef3 T -sym-trunk *
U dan
Z f43da81961eb4c39992192293f7e5a2c

View File

@@ -1 +1 @@
8e03a8e95fada5c24d369672a71f6e02288051da a7674ead5be986c66f7d61d598adc7e5728bcd30

View File

@@ -1418,33 +1418,41 @@ IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){
} }
return pNew; return pNew;
} }
Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){
Select *pNew, *pPrior; Select *pRet = 0;
Select *pNext = 0;
Select **pp = &pRet;
Select *p;
assert( db!=0 ); assert( db!=0 );
if( p==0 ) return 0; for(p=pDup; p; p=p->pPrior){
pNew = sqlite3DbMallocRawNN(db, sizeof(*p) ); Select *pNew = sqlite3DbMallocRawNN(db, sizeof(*p) );
if( pNew==0 ) return 0; if( pNew==0 ) break;
pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags); pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags);
pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags); pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags);
pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags); pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags);
pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags); pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags);
pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags); pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags);
pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags);
pNew->op = p->op; pNew->op = p->op;
pNew->pPrior = pPrior = sqlite3SelectDup(db, p->pPrior, flags); pNew->pNext = pNext;
if( pPrior ) pPrior->pNext = pNew; pNew->pPrior = 0;
pNew->pNext = 0; pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags);
pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags); pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags);
pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags); pNew->iLimit = 0;
pNew->iLimit = 0; pNew->iOffset = 0;
pNew->iOffset = 0; pNew->selFlags = p->selFlags & ~SF_UsesEphemeral;
pNew->selFlags = p->selFlags & ~SF_UsesEphemeral; pNew->addrOpenEphm[0] = -1;
pNew->addrOpenEphm[0] = -1; pNew->addrOpenEphm[1] = -1;
pNew->addrOpenEphm[1] = -1; pNew->nSelectRow = p->nSelectRow;
pNew->nSelectRow = p->nSelectRow; pNew->pWith = withDup(db, p->pWith);
pNew->pWith = withDup(db, p->pWith); sqlite3SelectSetName(pNew, p->zSelName);
sqlite3SelectSetName(pNew, p->zSelName); *pp = pNew;
return pNew; pp = &pNew->pPrior;
pNext = pNew;
}
return pRet;
} }
#else #else
Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){