summaryrefslogtreecommitdiff
path: root/src/backend/rewrite
diff options
context:
space:
mode:
authorThomas G. Lockhart <lockhart@fourpalms.org>1998-12-14 00:02:17 +0000
committerThomas G. Lockhart <lockhart@fourpalms.org>1998-12-14 00:02:17 +0000
commit4140c2f30e2814527f0975876956f446e326ae70 (patch)
tree9a51562edb521b1742f80a2ed68a04598c5ae52e /src/backend/rewrite
parent2b189aa9537f7b4a518c63a79555ce8bf644294c (diff)
downloadpostgresql-4140c2f30e2814527f0975876956f446e326ae70.tar.gz
Add support for the CASE statement in the rewrite handling.
Allows (at least some) rules and views. Still some trouble (crashes) with target CASE columns spanning tables, but lots now works.
Diffstat (limited to 'src/backend/rewrite')
-rw-r--r--src/backend/rewrite/rewriteHandler.c94
-rw-r--r--src/backend/rewrite/rewriteManip.c70
-rw-r--r--src/backend/rewrite/rewriteRemove.c14
3 files changed, 170 insertions, 8 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index 89665d8858..a8997d5a8a 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.26 1998/12/04 15:34:36 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.27 1998/12/14 00:02:16 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1457,6 +1457,34 @@ apply_RIR_adjust_sublevel(Node *node, int sublevels_up)
}
break;
+ case T_CaseExpr:
+ {
+ CaseExpr *exp = (CaseExpr *)node;
+
+ apply_RIR_adjust_sublevel(
+ (Node *)(exp->args),
+ sublevels_up);
+
+ apply_RIR_adjust_sublevel(
+ (Node *)(exp->defresult),
+ sublevels_up);
+ }
+ break;
+
+ case T_CaseWhen:
+ {
+ CaseWhen *exp = (CaseWhen *)node;
+
+ apply_RIR_adjust_sublevel(
+ (Node *)(exp->expr),
+ sublevels_up);
+
+ apply_RIR_adjust_sublevel(
+ (Node *)(exp->result),
+ sublevels_up);
+ }
+ break;
+
default:
elog(NOTICE, "unknown node tag %d in attribute_used()", nodeTag(node));
elog(NOTICE, "Node is: %s", nodeToString(node));
@@ -1691,6 +1719,50 @@ apply_RIR_view(Node **nodePtr, int rt_index, RangeTblEntry *rte, List *tlist, in
}
break;
+ case T_CaseExpr:
+ {
+ CaseExpr *exp = (CaseExpr *)node;
+
+ apply_RIR_view(
+ (Node **)(&(exp->args)),
+ rt_index,
+ rte,
+ tlist,
+ modified,
+ sublevels_up);
+
+ apply_RIR_view(
+ (Node **)(&(exp->defresult)),
+ rt_index,
+ rte,
+ tlist,
+ modified,
+ sublevels_up);
+ }
+ break;
+
+ case T_CaseWhen:
+ {
+ CaseWhen *exp = (CaseWhen *)node;
+
+ apply_RIR_view(
+ (Node **)(&(exp->expr)),
+ rt_index,
+ rte,
+ tlist,
+ modified,
+ sublevels_up);
+
+ apply_RIR_view(
+ (Node **)(&(exp->result)),
+ rt_index,
+ rte,
+ tlist,
+ modified,
+ sublevels_up);
+ }
+ break;
+
default:
elog(NOTICE, "unknown node tag %d in apply_RIR_view()", nodeTag(node));
elog(NOTICE, "Node is: %s", nodeToString(node));
@@ -1885,7 +1957,27 @@ fireRIRonSubselect(Node *node)
break;
case T_CaseExpr:
+ {
+ CaseExpr *exp = (CaseExpr *)node;
+
+ fireRIRonSubselect(
+ (Node *)(exp->args));
+
+ fireRIRonSubselect(
+ (Node *)(exp->defresult));
+ }
+ break;
+
case T_CaseWhen:
+ {
+ CaseWhen *exp = (CaseWhen *)node;
+
+ fireRIRonSubselect(
+ (Node *)(exp->expr));
+
+ fireRIRonSubselect(
+ (Node *)(exp->result));
+ }
break;
case T_Query:
diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c
index 64da8479d1..9d6d5e7d64 100644
--- a/src/backend/rewrite/rewriteManip.c
+++ b/src/backend/rewrite/rewriteManip.c
@@ -6,7 +6,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.22 1998/10/21 16:21:26 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.23 1998/12/14 00:02:17 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -191,6 +191,38 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up)
}
break;
+ case T_CaseExpr:
+ {
+ CaseExpr *exp = (CaseExpr *)node;
+
+ OffsetVarNodes(
+ (Node *)(exp->args),
+ offset,
+ sublevels_up);
+
+ OffsetVarNodes(
+ (Node *)(exp->defresult),
+ offset,
+ sublevels_up);
+ }
+ break;
+
+ case T_CaseWhen:
+ {
+ CaseWhen *exp = (CaseWhen *)node;
+
+ OffsetVarNodes(
+ (Node *)(exp->expr),
+ offset,
+ sublevels_up);
+
+ OffsetVarNodes(
+ (Node *)(exp->result),
+ offset,
+ sublevels_up);
+ }
+ break;
+
default:
elog(NOTICE, "unknown node tag %d in OffsetVarNodes()", nodeTag(node));
elog(NOTICE, "Node is: %s", nodeToString(node));
@@ -377,6 +409,42 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up)
}
break;
+ case T_CaseExpr:
+ {
+ CaseExpr *exp = (CaseExpr *)node;
+
+ ChangeVarNodes(
+ (Node *)(exp->args),
+ rt_index,
+ new_index,
+ sublevels_up);
+
+ ChangeVarNodes(
+ (Node *)(exp->defresult),
+ rt_index,
+ new_index,
+ sublevels_up);
+ }
+ break;
+
+ case T_CaseWhen:
+ {
+ CaseWhen *exp = (CaseWhen *)node;
+
+ ChangeVarNodes(
+ (Node *)(exp->expr),
+ rt_index,
+ new_index,
+ sublevels_up);
+
+ ChangeVarNodes(
+ (Node *)(exp->result),
+ rt_index,
+ new_index,
+ sublevels_up);
+ }
+ break;
+
default:
elog(NOTICE, "unknown node tag %d in ChangeVarNodes()", nodeTag(node));
elog(NOTICE, "Node is: %s", nodeToString(node));
diff --git a/src/backend/rewrite/rewriteRemove.c b/src/backend/rewrite/rewriteRemove.c
index 17aa34be07..fd1472a93c 100644
--- a/src/backend/rewrite/rewriteRemove.c
+++ b/src/backend/rewrite/rewriteRemove.c
@@ -7,11 +7,13 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.19 1998/11/27 19:52:17 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.20 1998/12/14 00:02:17 thomas Exp $
*
*-------------------------------------------------------------------------
*/
+#include <string.h>
+
#include "postgres.h"
#include "fmgr.h" /* for F_NAMEEQ */
@@ -39,14 +41,14 @@ RewriteGetRuleEventRel(char *rulename)
PointerGetDatum(rulename),
0, 0, 0);
if (!HeapTupleIsValid(htup))
- elog(ERROR, "RewriteGetRuleEventRel: rule \"%s\" not found",
- rulename);
+ elog(ERROR, "Rule or view '%s' not found",
+ ((!strncmp(rulename, "_RET", 4))? (rulename+4): rulename));
eventrel = ((Form_pg_rewrite) GETSTRUCT(htup))->ev_class;
htup = SearchSysCacheTuple(RELOID,
PointerGetDatum(eventrel),
0, 0, 0);
if (!HeapTupleIsValid(htup))
- elog(ERROR, "RewriteGetRuleEventRel: class %d not found",
+ elog(ERROR, "Class '%d' not found",
eventrel);
return ((Form_pg_class) GETSTRUCT(htup))->relname.data;
}
@@ -94,7 +96,7 @@ RemoveRewriteRule(char *ruleName)
if (!HeapTupleIsValid(tuple))
{
heap_close(RewriteRelation);
- elog(ERROR, "No rule with name = '%s' was found.\n", ruleName);
+ elog(ERROR, "Rule '%s' not found\n", ruleName);
}
/*
@@ -110,7 +112,7 @@ RemoveRewriteRule(char *ruleName)
{
/* XXX strange!!! */
pfree(tuple);
- elog(ERROR, "RemoveRewriteRule: null event target relation!");
+ elog(ERROR, "RemoveRewriteRule: internal error; null event target relation!");
}
eventRelationOid = DatumGetObjectId(eventRelationOidDatum);