diff options
author | drh <drh@noemail.net> | 2017-01-02 22:36:32 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2017-01-02 22:36:32 +0000 |
commit | 47073f62bf607208b00d19cd9059f2acb275778e (patch) | |
tree | d5320ba097f4ed4d4f6d6090bf19f550464559ae /src/expr.c | |
parent | 63a49ce0b21debee5743168266e85de487c50dae (diff) | |
download | sqlite-47073f62bf607208b00d19cd9059f2acb275778e.tar.gz sqlite-47073f62bf607208b00d19cd9059f2acb275778e.zip |
Proposed fix for the row-value TRIGGER UPDATE problem described in
ticket [8c9458e7].
FossilOrigin-Name: 61a442ea2ceec2cbd327dae0ff5214e1f3c69ec0
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/expr.c b/src/expr.c index b23f17983..ebc9ca6b0 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1088,7 +1088,7 @@ static int dupedExprStructSize(Expr *p, int flags){ assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ assert( EXPR_FULLSIZE<=0xfff ); assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); - if( 0==flags ){ + if( 0==flags || p->op==TK_SELECT_COLUMN ){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); @@ -1231,6 +1231,8 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ if( pNew->op==TK_SELECT_COLUMN ){ pNew->pLeft = p->pLeft; + assert( p->iColumn==0 || p->pRight==0 ); + assert( p->pRight==0 || p->pRight==p->pLeft ); }else{ pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); } @@ -1307,7 +1309,20 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ pOldItem = p->a; for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){ Expr *pOldExpr = pOldItem->pExpr; + Expr *pNewExpr; pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags); + if( pOldExpr + && pOldExpr->op==TK_SELECT_COLUMN + && (pNewExpr = pItem->pExpr)!=0 + ){ + assert( pNewExpr->iColumn==0 || i>0 ); + if( pNewExpr->iColumn==0 ){ + assert( pOldExpr->pLeft==pOldExpr->pRight ); + pNewExpr->pLeft = pNewExpr->pRight; + }else if( pItem[-1].pExpr!=0 ){ + pNewExpr->pLeft = pItem[-1].pExpr->pLeft; + } + } pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); pItem->sortOrder = pOldItem->sortOrder; |