mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Fix a problem caused by using an SQL variable in an OVER clause within a trigger program.
FossilOrigin-Name: 4f676466e60ee2a420b7b2deace76f3a733ce1af278347428285715d9c67f022
This commit is contained in:
23
manifest
23
manifest
@ -1,5 +1,5 @@
|
|||||||
C Improvements\sto\sthe\sauxiliary\s"main.mk"\smakefile\sso\sthat\sit\sworks\sbetter\swith\nmulti-threaded\sbuilds.
|
C Fix\sa\sproblem\scaused\sby\susing\san\sSQL\svariable\sin\san\sOVER\sclause\swithin\sa\strigger\sprogram.
|
||||||
D 2021-01-20T23:01:31.158
|
D 2021-01-21T15:40:52.172
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@ -477,7 +477,7 @@ F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
|
|||||||
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
|
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
|
||||||
F src/alter.c 36cae0d6e3e91a1996e1a472f8c7242c31a4e38ba4295e3056da198c04fd2a87
|
F src/alter.c 36cae0d6e3e91a1996e1a472f8c7242c31a4e38ba4295e3056da198c04fd2a87
|
||||||
F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c
|
F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c
|
||||||
F src/attach.c 0f497c15c4cfe3bdcb214f0dbdbbb6c5ed7e8a9308ac445c7959f5e5780437a9
|
F src/attach.c 87102aba5ddac8ef3a8a033ab657e4cae9cc8e846efe93b14029cfffaaf8831e
|
||||||
F src/auth.c 8d1df0e2ef8bafbedd4f1fe4baff03eb27507da4bf6e449df3613d383c4018b2
|
F src/auth.c 8d1df0e2ef8bafbedd4f1fe4baff03eb27507da4bf6e449df3613d383c4018b2
|
||||||
F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d
|
F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d
|
||||||
F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
|
F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
|
||||||
@ -546,7 +546,7 @@ F src/shell.c.in 9ebc74e4f05cfbd0f4a36060fdaeff1da4e9af4458358722bc08c5a1ab9a087
|
|||||||
F src/sqlite.h.in 0af968a1fa3c717261e1df0ed105fa7bddb4d82de7e0adb3eab49e6aa81b4de7
|
F src/sqlite.h.in 0af968a1fa3c717261e1df0ed105fa7bddb4d82de7e0adb3eab49e6aa81b4de7
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e
|
F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e
|
||||||
F src/sqliteInt.h d921214bba203960de10ea7a9183735ec362a5def5910d468282a8f82e8b4c26
|
F src/sqliteInt.h 3e5bc0446611e272b93754265e3265f36249d0458da25e32991fce241d69dbcf
|
||||||
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
|
F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
|
||||||
F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1
|
F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1
|
||||||
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
||||||
@ -652,7 +652,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74
|
|||||||
F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
|
F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
|
||||||
F test/altertab.test 6d7bbac2c4a6ef71b775094a3298fa3a92274d95034ee23157ffba92768e47e6
|
F test/altertab.test 6d7bbac2c4a6ef71b775094a3298fa3a92274d95034ee23157ffba92768e47e6
|
||||||
F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b
|
F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b
|
||||||
F test/altertab3.test 1db384eb85b4a30b0b332842f5c596b0dc0126f7c61959be3f85ae8b1c271d9a
|
F test/altertab3.test 2b82fa2236a3a91553d53ae5555d8e723c7eec174c41f1fa62ff497355398479
|
||||||
F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
|
F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
|
||||||
F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7
|
F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7
|
||||||
F test/analyze3.test fca2a9de0017becfdcc201647f03b1cfd5ba0e7b5b5c852936e4ec62780cde49
|
F test/analyze3.test fca2a9de0017becfdcc201647f03b1cfd5ba0e7b5b5c852936e4ec62780cde49
|
||||||
@ -1617,7 +1617,7 @@ F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d36
|
|||||||
F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe
|
F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe
|
||||||
F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51
|
F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51
|
||||||
F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650
|
F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650
|
||||||
F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d
|
F test/triggerE.test 612969cb57a4ef792059ad6d01af0117e1ae862c283753ffcc9a6428642b22ee
|
||||||
F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad
|
F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad
|
||||||
F test/triggerG.test 2b816093c91ba73c733cfa8aedcc210ad819d72a98b1da30768a3c56505233e9
|
F test/triggerG.test 2b816093c91ba73c733cfa8aedcc210ad819d72a98b1da30768a3c56505233e9
|
||||||
F test/triggerupfrom.test d25961fa70a99b6736193da7b49a36d8c1d28d56188f0be6406d4366315cd6e4
|
F test/triggerupfrom.test d25961fa70a99b6736193da7b49a36d8c1d28d56188f0be6406d4366315cd6e4
|
||||||
@ -1898,7 +1898,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 5596611f96f3401262b9dadc591bf7e3411d2c4a6f5be5cfe524e203d9820fd1
|
P d1873054d8e1006a370ea7891dbb9a62e7d36ce98cb92b58dcb0daf271265de3
|
||||||
R e4325fbe06f6c9247629eb04294fa661
|
R 56f323b51c91a7109bc328027a56f7a2
|
||||||
U drh
|
T *branch * fix-over-trigger
|
||||||
Z 1b9b0d992b3d4f78ff264eba5ac968ed
|
T *sym-fix-over-trigger *
|
||||||
|
T -sym-trunk *
|
||||||
|
U dan
|
||||||
|
Z c7d4efd5b6b0d32bc23a7887ed998edc
|
||||||
|
@ -1 +1 @@
|
|||||||
d1873054d8e1006a370ea7891dbb9a62e7d36ce98cb92b58dcb0daf271265de3
|
4f676466e60ee2a420b7b2deace76f3a733ce1af278347428285715d9c67f022
|
198
src/attach.c
198
src/attach.c
@ -433,6 +433,63 @@ void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *pKey){
|
|||||||
}
|
}
|
||||||
#endif /* SQLITE_OMIT_ATTACH */
|
#endif /* SQLITE_OMIT_ATTACH */
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Expression callback used by sqlite3FixAAAA() routines.
|
||||||
|
*/
|
||||||
|
static int fixExprCb(Walker *p, Expr *pExpr){
|
||||||
|
DbFixer *pFix = p->u.pFix;
|
||||||
|
if( !pFix->bTemp ) ExprSetProperty(pExpr, EP_FromDDL);
|
||||||
|
if( pExpr->op==TK_VARIABLE ){
|
||||||
|
if( pFix->pParse->db->init.busy ){
|
||||||
|
pExpr->op = TK_NULL;
|
||||||
|
}else{
|
||||||
|
sqlite3ErrorMsg(pFix->pParse, "%s cannot use variables", pFix->zType);
|
||||||
|
return WRC_Abort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return WRC_Continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Select callback used by sqlite3FixAAAA() routines.
|
||||||
|
*/
|
||||||
|
static int fixSelectCb(Walker *p, Select *pSelect){
|
||||||
|
DbFixer *pFix = p->u.pFix;
|
||||||
|
int i;
|
||||||
|
struct SrcList_item *pItem;
|
||||||
|
sqlite3 *db = pFix->pParse->db;
|
||||||
|
int iDb = sqlite3FindDbName(db, pFix->zDb);
|
||||||
|
SrcList *pList = pSelect->pSrc;
|
||||||
|
|
||||||
|
if( NEVER(pList==0) ) return WRC_Continue;
|
||||||
|
for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
|
||||||
|
if( pFix->bTemp==0 ){
|
||||||
|
if( pItem->zDatabase && iDb!=sqlite3FindDbName(db, pItem->zDatabase) ){
|
||||||
|
sqlite3ErrorMsg(pFix->pParse,
|
||||||
|
"%s %T cannot reference objects in database %s",
|
||||||
|
pFix->zType, pFix->pName, pItem->zDatabase);
|
||||||
|
return WRC_Abort;
|
||||||
|
}
|
||||||
|
sqlite3DbFree(db, pItem->zDatabase);
|
||||||
|
pItem->zDatabase = 0;
|
||||||
|
pItem->pSchema = pFix->pSchema;
|
||||||
|
pItem->fg.fromDDL = 1;
|
||||||
|
}
|
||||||
|
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)
|
||||||
|
if( sqlite3WalkExpr(&pFix->w, pList->a[i].pOn) ) return WRC_Abort;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if( pSelect->pWith ){
|
||||||
|
int i;
|
||||||
|
for(i=0; i<pSelect->pWith->nCte; i++){
|
||||||
|
if( sqlite3WalkSelect(p, pSelect->pWith->a[i].pSelect) ){
|
||||||
|
return WRC_Abort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return WRC_Continue;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Initialize a DbFixer structure. This routine must be called prior
|
** Initialize a DbFixer structure. This routine must be called prior
|
||||||
** to passing the structure to one of the sqliteFixAAAA() routines below.
|
** to passing the structure to one of the sqliteFixAAAA() routines below.
|
||||||
@ -444,9 +501,7 @@ void sqlite3FixInit(
|
|||||||
const char *zType, /* "view", "trigger", or "index" */
|
const char *zType, /* "view", "trigger", or "index" */
|
||||||
const Token *pName /* Name of the view, trigger, or index */
|
const Token *pName /* Name of the view, trigger, or index */
|
||||||
){
|
){
|
||||||
sqlite3 *db;
|
sqlite3 *db = pParse->db;
|
||||||
|
|
||||||
db = pParse->db;
|
|
||||||
assert( db->nDb>iDb );
|
assert( db->nDb>iDb );
|
||||||
pFix->pParse = pParse;
|
pFix->pParse = pParse;
|
||||||
pFix->zDb = db->aDb[iDb].zDbSName;
|
pFix->zDb = db->aDb[iDb].zDbSName;
|
||||||
@ -454,6 +509,13 @@ void sqlite3FixInit(
|
|||||||
pFix->zType = zType;
|
pFix->zType = zType;
|
||||||
pFix->pName = pName;
|
pFix->pName = pName;
|
||||||
pFix->bTemp = (iDb==1);
|
pFix->bTemp = (iDb==1);
|
||||||
|
pFix->w.pParse = pParse;
|
||||||
|
pFix->w.xExprCallback = fixExprCb;
|
||||||
|
pFix->w.xSelectCallback = fixSelectCb;
|
||||||
|
pFix->w.xSelectCallback2 = 0;
|
||||||
|
pFix->w.walkerDepth = 0;
|
||||||
|
pFix->w.eCode = 0;
|
||||||
|
pFix->w.u.pFix = pFix;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -474,115 +536,27 @@ int sqlite3FixSrcList(
|
|||||||
DbFixer *pFix, /* Context of the fixation */
|
DbFixer *pFix, /* Context of the fixation */
|
||||||
SrcList *pList /* The Source list to check and modify */
|
SrcList *pList /* The Source list to check and modify */
|
||||||
){
|
){
|
||||||
int i;
|
int res = 0;
|
||||||
struct SrcList_item *pItem;
|
if( pList ){
|
||||||
sqlite3 *db = pFix->pParse->db;
|
Select s;
|
||||||
int iDb = sqlite3FindDbName(db, pFix->zDb);
|
memset(&s, 0, sizeof(s));
|
||||||
|
s.pSrc = pList;
|
||||||
if( NEVER(pList==0) ) return 0;
|
res = sqlite3WalkSelect(&pFix->w, &s);
|
||||||
|
|
||||||
for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
|
|
||||||
if( pFix->bTemp==0 ){
|
|
||||||
if( pItem->zDatabase && iDb!=sqlite3FindDbName(db, pItem->zDatabase) ){
|
|
||||||
sqlite3ErrorMsg(pFix->pParse,
|
|
||||||
"%s %T cannot reference objects in database %s",
|
|
||||||
pFix->zType, pFix->pName, pItem->zDatabase);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
sqlite3DbFree(db, pItem->zDatabase);
|
|
||||||
pItem->zDatabase = 0;
|
|
||||||
pItem->pSchema = pFix->pSchema;
|
|
||||||
pItem->fg.fromDDL = 1;
|
|
||||||
}
|
|
||||||
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)
|
|
||||||
if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1;
|
|
||||||
if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1;
|
|
||||||
#endif
|
|
||||||
if( pItem->fg.isTabFunc && sqlite3FixExprList(pFix, pItem->u1.pFuncArg) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return res;
|
||||||
}
|
}
|
||||||
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)
|
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER)
|
||||||
int sqlite3FixSelect(
|
int sqlite3FixSelect(
|
||||||
DbFixer *pFix, /* Context of the fixation */
|
DbFixer *pFix, /* Context of the fixation */
|
||||||
Select *pSelect /* The SELECT statement to be fixed to one database */
|
Select *pSelect /* The SELECT statement to be fixed to one database */
|
||||||
){
|
){
|
||||||
while( pSelect ){
|
return sqlite3WalkSelect(&pFix->w, pSelect);
|
||||||
if( sqlite3FixExprList(pFix, pSelect->pEList) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if( sqlite3FixSrcList(pFix, pSelect->pSrc) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if( sqlite3FixExpr(pFix, pSelect->pWhere) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if( sqlite3FixExprList(pFix, pSelect->pGroupBy) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if( sqlite3FixExpr(pFix, pSelect->pHaving) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if( sqlite3FixExprList(pFix, pSelect->pOrderBy) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if( sqlite3FixExpr(pFix, pSelect->pLimit) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if( pSelect->pWith ){
|
|
||||||
int i;
|
|
||||||
for(i=0; i<pSelect->pWith->nCte; i++){
|
|
||||||
if( sqlite3FixSelect(pFix, pSelect->pWith->a[i].pSelect) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pSelect = pSelect->pPrior;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
int sqlite3FixExpr(
|
int sqlite3FixExpr(
|
||||||
DbFixer *pFix, /* Context of the fixation */
|
DbFixer *pFix, /* Context of the fixation */
|
||||||
Expr *pExpr /* The expression to be fixed to one database */
|
Expr *pExpr /* The expression to be fixed to one database */
|
||||||
){
|
){
|
||||||
while( pExpr ){
|
return sqlite3WalkExpr(&pFix->w, pExpr);
|
||||||
if( !pFix->bTemp ) ExprSetProperty(pExpr, EP_FromDDL);
|
|
||||||
if( pExpr->op==TK_VARIABLE ){
|
|
||||||
if( pFix->pParse->db->init.busy ){
|
|
||||||
pExpr->op = TK_NULL;
|
|
||||||
}else{
|
|
||||||
sqlite3ErrorMsg(pFix->pParse, "%s cannot use variables", pFix->zType);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( ExprHasProperty(pExpr, EP_TokenOnly|EP_Leaf) ) break;
|
|
||||||
if( ExprHasProperty(pExpr, EP_xIsSelect) ){
|
|
||||||
if( sqlite3FixSelect(pFix, pExpr->x.pSelect) ) return 1;
|
|
||||||
}else{
|
|
||||||
if( sqlite3FixExprList(pFix, pExpr->x.pList) ) return 1;
|
|
||||||
}
|
|
||||||
if( sqlite3FixExpr(pFix, pExpr->pRight) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
pExpr = pExpr->pLeft;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int sqlite3FixExprList(
|
|
||||||
DbFixer *pFix, /* Context of the fixation */
|
|
||||||
ExprList *pList /* The expression to be fixed to one database */
|
|
||||||
){
|
|
||||||
int i;
|
|
||||||
struct ExprList_item *pItem;
|
|
||||||
if( pList==0 ) return 0;
|
|
||||||
for(i=0, pItem=pList->a; i<pList->nExpr; i++, pItem++){
|
|
||||||
if( sqlite3FixExpr(pFix, pItem->pExpr) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -592,25 +566,20 @@ int sqlite3FixTriggerStep(
|
|||||||
TriggerStep *pStep /* The trigger step be fixed to one database */
|
TriggerStep *pStep /* The trigger step be fixed to one database */
|
||||||
){
|
){
|
||||||
while( pStep ){
|
while( pStep ){
|
||||||
if( sqlite3FixSelect(pFix, pStep->pSelect) ){
|
if( sqlite3WalkSelect(&pFix->w, pStep->pSelect)
|
||||||
return 1;
|
|| sqlite3WalkExpr(&pFix->w, pStep->pWhere)
|
||||||
}
|
|| sqlite3WalkExprList(&pFix->w, pStep->pExprList)
|
||||||
if( sqlite3FixExpr(pFix, pStep->pWhere) ){
|
|| sqlite3FixSrcList(pFix, pStep->pFrom)
|
||||||
return 1;
|
){
|
||||||
}
|
|
||||||
if( sqlite3FixExprList(pFix, pStep->pExprList) ){
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if( pStep->pFrom && sqlite3FixSrcList(pFix, pStep->pFrom) ){
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
#ifndef SQLITE_OMIT_UPSERT
|
#ifndef SQLITE_OMIT_UPSERT
|
||||||
if( pStep->pUpsert ){
|
if( pStep->pUpsert ){
|
||||||
Upsert *pUp = pStep->pUpsert;
|
Upsert *pUp = pStep->pUpsert;
|
||||||
if( sqlite3FixExprList(pFix, pUp->pUpsertTarget)
|
if( sqlite3WalkExprList(&pFix->w, pUp->pUpsertTarget)
|
||||||
|| sqlite3FixExpr(pFix, pUp->pUpsertTargetWhere)
|
|| sqlite3WalkExpr(&pFix->w, pUp->pUpsertTargetWhere)
|
||||||
|| sqlite3FixExprList(pFix, pUp->pUpsertSet)
|
|| sqlite3WalkExprList(&pFix->w, pUp->pUpsertSet)
|
||||||
|| sqlite3FixExpr(pFix, pUp->pUpsertWhere)
|
|| sqlite3WalkExpr(&pFix->w, pUp->pUpsertWhere)
|
||||||
){
|
){
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -618,6 +587,7 @@ int sqlite3FixTriggerStep(
|
|||||||
#endif
|
#endif
|
||||||
pStep = pStep->pNext;
|
pStep = pStep->pNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1137,6 +1137,7 @@ typedef struct Bitvec Bitvec;
|
|||||||
typedef struct CollSeq CollSeq;
|
typedef struct CollSeq CollSeq;
|
||||||
typedef struct Column Column;
|
typedef struct Column Column;
|
||||||
typedef struct Db Db;
|
typedef struct Db Db;
|
||||||
|
typedef struct DbFixer DbFixer;
|
||||||
typedef struct Schema Schema;
|
typedef struct Schema Schema;
|
||||||
typedef struct Expr Expr;
|
typedef struct Expr Expr;
|
||||||
typedef struct ExprList ExprList;
|
typedef struct ExprList ExprList;
|
||||||
@ -3650,21 +3651,6 @@ struct TriggerStep {
|
|||||||
TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */
|
TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
** The following structure contains information used by the sqliteFix...
|
|
||||||
** routines as they walk the parse tree to make database references
|
|
||||||
** explicit.
|
|
||||||
*/
|
|
||||||
typedef struct DbFixer DbFixer;
|
|
||||||
struct DbFixer {
|
|
||||||
Parse *pParse; /* The parsing context. Error messages written here */
|
|
||||||
Schema *pSchema; /* Fix items to this schema */
|
|
||||||
u8 bTemp; /* True for TEMP schema entries */
|
|
||||||
const char *zDb; /* Make sure all objects are contained in this database */
|
|
||||||
const char *zType; /* Type of the container - used for error messages */
|
|
||||||
const Token *pName; /* Name of the container - used for error messages */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** An objected used to accumulate the text of a string where we
|
** An objected used to accumulate the text of a string where we
|
||||||
** do not necessarily know how big the string will be in the end.
|
** do not necessarily know how big the string will be in the end.
|
||||||
@ -3815,9 +3801,25 @@ struct Walker {
|
|||||||
struct RenameCtx *pRename; /* RENAME COLUMN context */
|
struct RenameCtx *pRename; /* RENAME COLUMN context */
|
||||||
struct Table *pTab; /* Table of generated column */
|
struct Table *pTab; /* Table of generated column */
|
||||||
struct SrcList_item *pSrcItem; /* A single FROM clause item */
|
struct SrcList_item *pSrcItem; /* A single FROM clause item */
|
||||||
|
DbFixer *pFix;
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The following structure contains information used by the sqliteFix...
|
||||||
|
** routines as they walk the parse tree to make database references
|
||||||
|
** explicit.
|
||||||
|
*/
|
||||||
|
struct DbFixer {
|
||||||
|
Parse *pParse; /* The parsing context. Error messages written here */
|
||||||
|
Walker w; /* Walker object */
|
||||||
|
Schema *pSchema; /* Fix items to this schema */
|
||||||
|
u8 bTemp; /* True for TEMP schema entries */
|
||||||
|
const char *zDb; /* Make sure all objects are contained in this database */
|
||||||
|
const char *zType; /* Type of the container - used for error messages */
|
||||||
|
const Token *pName; /* Name of the container - used for error messages */
|
||||||
|
};
|
||||||
|
|
||||||
/* Forward declarations */
|
/* Forward declarations */
|
||||||
int sqlite3WalkExpr(Walker*, Expr*);
|
int sqlite3WalkExpr(Walker*, Expr*);
|
||||||
int sqlite3WalkExprList(Walker*, ExprList*);
|
int sqlite3WalkExprList(Walker*, ExprList*);
|
||||||
@ -4527,7 +4529,6 @@ void sqlite3FixInit(DbFixer*, Parse*, int, const char*, const Token*);
|
|||||||
int sqlite3FixSrcList(DbFixer*, SrcList*);
|
int sqlite3FixSrcList(DbFixer*, SrcList*);
|
||||||
int sqlite3FixSelect(DbFixer*, Select*);
|
int sqlite3FixSelect(DbFixer*, Select*);
|
||||||
int sqlite3FixExpr(DbFixer*, Expr*);
|
int sqlite3FixExpr(DbFixer*, Expr*);
|
||||||
int sqlite3FixExprList(DbFixer*, ExprList*);
|
|
||||||
int sqlite3FixTriggerStep(DbFixer*, TriggerStep*);
|
int sqlite3FixTriggerStep(DbFixer*, TriggerStep*);
|
||||||
int sqlite3RealSameAsInt(double,sqlite3_int64);
|
int sqlite3RealSameAsInt(double,sqlite3_int64);
|
||||||
void sqlite3Int64ToText(i64,char*);
|
void sqlite3Int64ToText(i64,char*);
|
||||||
|
@ -253,7 +253,7 @@ do_execsql_test 11.1 {
|
|||||||
|
|
||||||
do_catchsql_test 11.2 {
|
do_catchsql_test 11.2 {
|
||||||
ALTER TABLE t1 RENAME TO t1x;
|
ALTER TABLE t1 RENAME TO t1x;
|
||||||
} {1 {error in trigger b: no such table: abc}}
|
} {1 {error in trigger b: no such table: main.abc}}
|
||||||
|
|
||||||
do_execsql_test 11.3 {
|
do_execsql_test 11.3 {
|
||||||
DROP TRIGGER b;
|
DROP TRIGGER b;
|
||||||
|
@ -58,6 +58,8 @@ foreach {tn defn} {
|
|||||||
8 { BEFORE UPDATE ON t1 BEGIN UPDATE t2 SET c = ?; END; }
|
8 { BEFORE UPDATE ON t1 BEGIN UPDATE t2 SET c = ?; END; }
|
||||||
9 { BEFORE UPDATE ON t1 BEGIN UPDATE t2 SET c = 1 WHERE d = ?; END; }
|
9 { BEFORE UPDATE ON t1 BEGIN UPDATE t2 SET c = 1 WHERE d = ?; END; }
|
||||||
10 { AFTER INSERT ON t1 BEGIN SELECT * FROM pragma_stats(?); END; }
|
10 { AFTER INSERT ON t1 BEGIN SELECT * FROM pragma_stats(?); END; }
|
||||||
|
11 { BEFORE INSERT ON t1 BEGIN
|
||||||
|
INSERT INTO t1 SELECT max(b) OVER(ORDER BY $1) FROM t1; END }
|
||||||
} {
|
} {
|
||||||
catchsql {drop trigger tr1}
|
catchsql {drop trigger tr1}
|
||||||
do_catchsql_test 1.1.$tn "CREATE TRIGGER tr1 $defn" [list 1 $errmsg]
|
do_catchsql_test 1.1.$tn "CREATE TRIGGER tr1 $defn" [list 1 $errmsg]
|
||||||
|
Reference in New Issue
Block a user