diff options
author | drh <> | 2021-01-30 01:30:26 +0000 |
---|---|---|
committer | drh <> | 2021-01-30 01:30:26 +0000 |
commit | ba71a8a01bf2559eefe526e3b44f07e9ff2da5b8 (patch) | |
tree | c851e999a8db9727ddc4bac9f927dece81125094 /src | |
parent | 8f4e2e25c4b5bff5e43bca2f9f166ff48311d6a3 (diff) | |
download | sqlite-ba71a8a01bf2559eefe526e3b44f07e9ff2da5b8.tar.gz sqlite-ba71a8a01bf2559eefe526e3b44f07e9ff2da5b8.zip |
Test cases added. RETURNING works with UPSERT as does PG.
FossilOrigin-Name: f5698f96e27c9b8669ec6016bb9920ef7580c4146eb61d628a0f62be5135ce94
Diffstat (limited to 'src')
-rw-r--r-- | src/trigger.c | 8 | ||||
-rw-r--r-- | src/vdbeaux.c | 5 |
2 files changed, 9 insertions, 4 deletions
diff --git a/src/trigger.c b/src/trigger.c index 452005944..baf78eb8c 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -567,7 +567,8 @@ TriggerStep *sqlite3TriggerDeleteStep( ** Recursively delete a Trigger structure */ void sqlite3DeleteTrigger(sqlite3 *db, Trigger *pTrigger){ - if( pTrigger==0 || pTrigger->bReturning ) return; + if( pTrigger==0 ) return; + assert( !pTrigger->bReturning ); sqlite3DeleteTriggerStep(db, pTrigger->step_list); sqlite3DbFree(db, pTrigger->zName); sqlite3DbFree(db, pTrigger->table); @@ -739,7 +740,7 @@ Trigger *sqlite3TriggersExist( for(p=pList; p; p=p->pNext){ if( p->op==op && checkColumnOverlap(p->pColumns, pChanges) ){ mask |= p->tr_tm; - }else if( p->op==TK_RETURNING ){ + }else if( p->bReturning ){ p->op = op; mask |= TRIGGER_AFTER; } @@ -912,6 +913,7 @@ static int codeTriggerProgram( pSelect->pEList = sqlite3ExpandReturning(pParse, pList, pParse->pTriggerTab); sqlite3SelectDestInit(&sDest, SRT_Output, 0); + pSelect->selFlags = 0; sqlite3Select(pParse, pSelect, &sDest); sqlite3ExprListDelete(db, pSelect->pEList); pSelect->pEList = pList; @@ -1215,7 +1217,7 @@ void sqlite3CodeRowTrigger( || p->pSchema==pParse->db->aDb[1].pSchema ); /* Determine whether we should code this trigger */ - if( p->op==op + if( (p->op==op || p->bReturning) && p->tr_tm==tr_tm && checkColumnOverlap(p->pColumns, pChanges) ){ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9ea20628f..c7c212575 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2602,7 +2602,10 @@ void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ void sqlite3VdbeColumnInfoXfer(Vdbe *pTo, Vdbe *pFrom){ sqlite3 *db = pTo->db; assert( db==pFrom->db ); - sqlite3DbFree(db, pTo->aColName); + if( pTo->nResColumn ){ + releaseMemArray(pTo->aColName, pTo->nResColumn*COLNAME_N); + sqlite3DbFree(db, pTo->aColName); + } pTo->aColName = pFrom->aColName; pFrom->aColName = 0; pTo->nResColumn = pFrom->nResColumn; |