diff options
Diffstat (limited to 'src/backend/rewrite/rewriteHandler.c')
-rw-r--r-- | src/backend/rewrite/rewriteHandler.c | 87 |
1 files changed, 74 insertions, 13 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 8eaa8dbb941..89665d88588 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -6,7 +6,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.25 1998/10/21 16:21:24 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.26 1998/12/04 15:34:36 thomas Exp $ * *------------------------------------------------------------------------- */ @@ -39,7 +39,6 @@ #include "catalog/pg_type.h" - static RewriteInfo *gatherRewriteMeta(Query *parsetree, Query *rule_action, Node *rule_qual, @@ -55,17 +54,6 @@ static SubLink *modifyAggregMakeSublink(Expr *origexp, Query *parsetree); static void modifyAggregQual(Node **nodePtr, Query *parsetree); - - - - - - - - - - - static Query *fireRIRrules(Query *parsetree); @@ -293,6 +281,46 @@ rangeTableEntry_used(Node *node, int rt_index, int sublevels_up) } break; + case T_CaseExpr: + { + CaseExpr *exp = (CaseExpr *)node; + + if (rangeTableEntry_used( + (Node *)(exp->args), + rt_index, + sublevels_up)) + return TRUE; + + if (rangeTableEntry_used( + (Node *)(exp->defresult), + rt_index, + sublevels_up)) + return TRUE; + + return FALSE; + } + break; + + case T_CaseWhen: + { + CaseWhen *when = (CaseWhen *)node; + + if (rangeTableEntry_used( + (Node *)(when->expr), + rt_index, + sublevels_up)) + return TRUE; + + if (rangeTableEntry_used( + (Node *)(when->result), + rt_index, + sublevels_up)) + return TRUE; + + return FALSE; + } + break; + case T_Query: { Query *qry = (Query *)node; @@ -1055,10 +1083,12 @@ modifyAggregMakeSublink(Expr *origexp, Query *parsetree) Expr *exp = copyObject(origexp); if (nodeTag(nth(0, exp->args)) == T_Aggreg) + { if (nodeTag(nth(1, exp->args)) == T_Aggreg) elog(ERROR, "rewrite: comparision of 2 aggregate columns not supported"); else elog(ERROR, "rewrite: aggregate column of view must be at rigth side in qual"); + } aggreg = (Aggreg *)nth(1, exp->args); target = (Var *)(aggreg->target); @@ -1189,6 +1219,33 @@ modifyAggregQual(Node **nodePtr, Query *parsetree) } break; + case T_CaseExpr: + { + /* We're calling recursively, + * and this routine knows how to handle lists + * so let it do the work to handle the WHEN clauses... */ + modifyAggregQual( + (Node **)(&(((CaseExpr *)node)->args)), + parsetree); + + modifyAggregQual( + (Node **)(&(((CaseExpr *)node)->defresult)), + parsetree); + } + break; + + case T_CaseWhen: + { + modifyAggregQual( + (Node **)(&(((CaseWhen *)node)->expr)), + parsetree); + + modifyAggregQual( + (Node **)(&(((CaseWhen *)node)->result)), + parsetree); + } + break; + case T_Iter: { Iter *iter = (Iter *)node; @@ -1827,6 +1884,10 @@ fireRIRonSubselect(Node *node) } break; + case T_CaseExpr: + case T_CaseWhen: + break; + case T_Query: { Query *qry = (Query *)node; |