aboutsummaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteHandler.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/rewrite/rewriteHandler.c')
-rw-r--r--src/backend/rewrite/rewriteHandler.c87
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;