diff options
Diffstat (limited to 'src/backend/optimizer/util')
-rw-r--r-- | src/backend/optimizer/util/clauses.c | 41 | ||||
-rw-r--r-- | src/backend/optimizer/util/tlist.c | 30 | ||||
-rw-r--r-- | src/backend/optimizer/util/var.c | 29 |
3 files changed, 88 insertions, 12 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 892a2d45c35..dfacc55518f 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.25 1998/11/27 19:52:07 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.26 1998/12/04 15:34:14 thomas Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -306,6 +306,26 @@ make_andclause(List *andclauses) return expr; } + +/***************************************************************************** + * CASE clause functions + *****************************************************************************/ + + +/* + * case_clause-- + * + * Returns t iff its argument is a 'case' clause: (CASE { expr }). + * + */ +bool +case_clause(Node *clause) +{ + return + (clause != NULL && + nodeTag(clause) == T_CaseExpr); +} + /***************************************************************************** * * * * @@ -540,6 +560,19 @@ fix_opid(Node *clause) fix_opid((Node *) get_leftop((Expr *) lfirst(lst))); } } + else if (case_clause(clause)) + { + List *lst; + + fix_opid(((CaseExpr *) clause)->defresult); + + /* Run through the WHEN clauses... */ + foreach(lst, ((CaseExpr *) clause)->args) + { + fix_opid(((CaseWhen *) lfirst(lst))->expr); + fix_opid(((CaseWhen *) lfirst(lst))->result); + } + } } @@ -577,13 +610,12 @@ fix_opids(List *clauses) * returned for the value if it is unknown or null. * END OF OLD OBSOLETE COMMENT. * NEW COMMENT: - * when defining rules one of the attibutes of the operator can + * when defining rules one of the attributes of the operator can * be a Param node (which is supposed to be treated as a constant). * However as there is no value specified for a parameter until run time - * this routine used to return "" as value, which made 'compute_selec' + * this routine used to return "" as value, which caused 'compute_selec' * to bomb (because it was expecting a lisp integer and got back a lisp * string). Now the code returns a plain old good "lispInteger(0)". - * */ void get_relattval(Node *clause, @@ -787,3 +819,4 @@ CommuteClause(Node *clause) lfirst(((Expr *) clause)->args) = lsecond(((Expr *) clause)->args); lsecond(((Expr *) clause)->args) = temp; } + 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; } } diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index 4f7b0b41b4d..3dade59a5ca 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.13 1998/09/01 03:24:00 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.14 1998/12/04 15:34:15 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -137,6 +137,21 @@ contain_var_clause(Node *clause) else if (is_opclause(clause)) return (contain_var_clause((Node *) get_leftop((Expr *) clause)) || contain_var_clause((Node *) get_rightop((Expr *) clause))); + else if (case_clause(clause)) + { + List *args; + CaseWhen *when; + + foreach(args, ((CaseExpr *) clause)->args) + { + when = lfirst(args); + if (contain_var_clause(when->expr)) + return TRUE; + if (contain_var_clause(when->result)) + return TRUE; + } + return (contain_var_clause(((CaseExpr *) clause)->defresult)); + } return FALSE; } @@ -199,6 +214,18 @@ pull_var_clause(Node *clause) else if (is_opclause(clause)) retval = nconc(pull_var_clause((Node *) get_leftop((Expr *) clause)), pull_var_clause((Node *) get_rightop((Expr *) clause))); + else if (case_clause(clause)) + { + List *temp; + + foreach(temp, ((CaseExpr *) clause)->args) + { + retval = nconc(retval, pull_var_clause(((CaseWhen *) lfirst(temp))->expr)); + retval = nconc(retval, pull_var_clause(((CaseWhen *) lfirst(temp))->result)); + } + + retval = nconc(retval, pull_var_clause(((CaseExpr *) clause)->defresult)); + } else retval = NIL; |