diff options
Diffstat (limited to 'src/backend/optimizer/util/tlist.c')
-rw-r--r-- | src/backend/optimizer/util/tlist.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/src/backend/optimizer/util/tlist.c b/src/backend/optimizer/util/tlist.c index dba994423fa..66c52404ec5 100644 --- a/src/backend/optimizer/util/tlist.c +++ b/src/backend/optimizer/util/tlist.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.20 1998/09/22 21:48:27 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/tlist.c,v 1.21 1998/12/04 15:34:15 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -482,7 +482,6 @@ flatten_tlistentry(Node *tlistentry, List *flat_tlist) flatten_tlistentry(lfirst(elt), flat_tlist)); return ((Node *) make_funcclause((Func *) expr->oper, temp_result)); - } else if (IsA(tlistentry, Aggreg)) { @@ -509,19 +508,36 @@ flatten_tlistentry(Node *tlistentry, List *flat_tlist) return tlistentry; } + else if (case_clause(tlistentry)) + { + CaseExpr *cexpr = (CaseExpr *) tlistentry; + CaseWhen *cwhen; + List *elt = NIL; + + foreach(elt, cexpr->args) + cwhen = (CaseWhen *)lfirst(elt); + cwhen->result = flatten_tlistentry(cwhen->result, flat_tlist); + cexpr->defresult = flatten_tlistentry(cexpr->defresult, flat_tlist); + + return ((Node *) cexpr); + } else { - Expr *expr = (Expr *) tlistentry; + Expr *expr, *final; + Var *left, *right; + + Assert(IsA(tlistentry, Expr)); - Var *left = (Var *) flatten_tlistentry((Node *) get_leftop(expr), + expr = (Expr *) tlistentry; + left = (Var *) flatten_tlistentry((Node *) get_leftop(expr), flat_tlist); - Var *right = (Var *) flatten_tlistentry((Node *) get_rightop(expr), + right = (Var *) flatten_tlistentry((Node *) get_rightop(expr), flat_tlist); - Expr *final = make_opclause((Oper *) expr->oper, left, right); - Assert(IsA(tlistentry, Expr)); + final = make_opclause((Oper *) expr->oper, left, right); final->opType = expr->opType; final->typeOid = expr->typeOid; + return (Node *)final; } } |