diff options
author | Thomas G. Lockhart <lockhart@fourpalms.org> | 1998-12-04 15:34:49 +0000 |
---|---|---|
committer | Thomas G. Lockhart <lockhart@fourpalms.org> | 1998-12-04 15:34:49 +0000 |
commit | bedd04a551c30350ebb8da2aa2596d16053b5d15 (patch) | |
tree | e682a8c3fa0a7d849793a7cc0abb101256e6cec5 /src/backend/rewrite/rewriteHandler.c | |
parent | 19740e2fff22e07244183ac0e888794e63016c89 (diff) | |
download | postgresql-bedd04a551c30350ebb8da2aa2596d16053b5d15.tar.gz postgresql-bedd04a551c30350ebb8da2aa2596d16053b5d15.zip |
Implement CASE expression.
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; |