aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2017-01-02 22:36:32 +0000
committerdrh <drh@noemail.net>2017-01-02 22:36:32 +0000
commit47073f62bf607208b00d19cd9059f2acb275778e (patch)
treed5320ba097f4ed4d4f6d6090bf19f550464559ae /src/expr.c
parent63a49ce0b21debee5743168266e85de487c50dae (diff)
downloadsqlite-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.c17
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;