summaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteManip.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/rewrite/rewriteManip.c')
-rw-r--r--src/backend/rewrite/rewriteManip.c222
1 files changed, 126 insertions, 96 deletions
diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c
index 83b6c9f5c57..14e1c796569 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.16 1998/09/01 03:24:56 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteManip.c,v 1.17 1998/09/01 04:31:35 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -28,8 +28,7 @@
#include "nodes/plannodes.h"
#include "optimizer/clauses.h"
-static void
-ResolveNew(RewriteInfo *info, List *targetlist,
+static void ResolveNew(RewriteInfo *info, List *targetlist,
Node **node, int sublevels_up);
@@ -55,14 +54,18 @@ OffsetVarNodes(Node *node, int offset)
OffsetVarNodes(agg->target, offset);
}
break;
- /* This has to be done to make queries using groupclauses work on views */
- case T_GroupClause:
- {
- GroupClause *group = (GroupClause *) node;
-
- OffsetVarNodes((Node *)(group->entry), offset);
+
+ /*
+ * This has to be done to make queries using groupclauses work
+ * on views
+ */
+ case T_GroupClause:
+ {
+ GroupClause *group = (GroupClause *) node;
+
+ OffsetVarNodes((Node *) (group->entry), offset);
}
- break;
+ break;
case T_Expr:
{
Expr *expr = (Expr *) node;
@@ -90,16 +93,20 @@ OffsetVarNodes(Node *node, int offset)
{
SubLink *sublink = (SubLink *) node;
- /* We also have to adapt the variables used in sublink->lefthand
- * and sublink->oper */
- OffsetVarNodes((Node *)(sublink->lefthand), offset);
-
- /* Make sure the first argument of sublink->oper points to the
- * same var as sublink->lefthand does otherwise we will
- * run into troubles using aggregates (aggno will not be
- * set correctly) */
- lfirst(((Expr *) lfirst(sublink->oper))->args) =
- lfirst(sublink->lefthand);
+ /*
+ * We also have to adapt the variables used in
+ * sublink->lefthand and sublink->oper
+ */
+ OffsetVarNodes((Node *) (sublink->lefthand), offset);
+
+ /*
+ * Make sure the first argument of sublink->oper points to
+ * the same var as sublink->lefthand does otherwise we
+ * will run into troubles using aggregates (aggno will not
+ * be set correctly)
+ */
+ lfirst(((Expr *) lfirst(sublink->oper))->args) =
+ lfirst(sublink->lefthand);
}
break;
default:
@@ -129,15 +136,19 @@ ChangeVarNodes(Node *node, int old_varno, int new_varno, int sublevels_up)
ChangeVarNodes(agg->target, old_varno, new_varno, sublevels_up);
}
break;
- /* This has to be done to make queries using groupclauses work on views */
- case T_GroupClause:
- {
- GroupClause *group = (GroupClause *) node;
-
- ChangeVarNodes((Node *)(group->entry),old_varno, new_varno,
- sublevels_up);
+
+ /*
+ * This has to be done to make queries using groupclauses work
+ * on views
+ */
+ case T_GroupClause:
+ {
+ GroupClause *group = (GroupClause *) node;
+
+ ChangeVarNodes((Node *) (group->entry), old_varno, new_varno,
+ sublevels_up);
}
- break;
+ break;
case T_Expr:
{
@@ -156,8 +167,9 @@ ChangeVarNodes(Node *node, int old_varno, int new_varno, int sublevels_up)
var->varno = new_varno;
var->varnoold = new_varno;
}
- if (var->varlevelsup > 0) OffsetVarNodes((Node *)var,3);
-
+ if (var->varlevelsup > 0)
+ OffsetVarNodes((Node *) var, 3);
+
}
break;
case T_List:
@@ -176,17 +188,24 @@ ChangeVarNodes(Node *node, int old_varno, int new_varno, int sublevels_up)
ChangeVarNodes((Node *) query->qual, old_varno, new_varno,
sublevels_up + 1);
- /* We also have to adapt the variables used in sublink->lefthand
- * and sublink->oper */
+ /*
+ * We also have to adapt the variables used in
+ * sublink->lefthand and sublink->oper
+ */
ChangeVarNodes((Node *) (sublink->lefthand), old_varno, new_varno,
sublevels_up);
-
- /* Make sure the first argument of sublink->oper points to the
- * same var as sublink->lefthand does otherwise we will
- * run into troubles using aggregates (aggno will not be
- * set correctly */
- /* lfirst(((Expr *) lfirst(sublink->oper))->args) =
- lfirst(sublink->lefthand); */
+
+ /*
+ * Make sure the first argument of sublink->oper points to
+ * the same var as sublink->lefthand does otherwise we
+ * will run into troubles using aggregates (aggno will not
+ * be set correctly
+ */
+
+ /*
+ * lfirst(((Expr *) lfirst(sublink->oper))->args) =
+ * lfirst(sublink->lefthand);
+ */
}
break;
default:
@@ -218,7 +237,8 @@ AddQual(Query *parsetree, Node *qual)
void
AddHavingQual(Query *parsetree, Node *havingQual)
{
- Node *copy, *old;
+ Node *copy,
+ *old;
if (havingQual == NULL)
return;
@@ -553,18 +573,22 @@ nodeHandleViewRule(Node **nodePtr,
Aggreg *agg = (Aggreg *) node;
nodeHandleViewRule(&(agg->target), rtable, targetlist,
- rt_index, modified, sublevels_up);
+ rt_index, modified, sublevels_up);
}
break;
- /* This has to be done to make queries using groupclauses work on views */
- case T_GroupClause:
- {
- GroupClause *group = (GroupClause *) node;
-
- nodeHandleViewRule((Node **) (&(group->entry)), rtable, targetlist,
- rt_index, modified, sublevels_up);
+
+ /*
+ * This has to be done to make queries using groupclauses work
+ * on views
+ */
+ case T_GroupClause:
+ {
+ GroupClause *group = (GroupClause *) node;
+
+ nodeHandleViewRule((Node **) (&(group->entry)), rtable, targetlist,
+ rt_index, modified, sublevels_up);
}
- break;
+ break;
case T_Expr:
{
Expr *expr = (Expr *) node;
@@ -580,40 +604,39 @@ nodeHandleViewRule(Node **nodePtr,
int this_varno = var->varno;
int this_varlevelsup = var->varlevelsup;
Node *n;
-
+
if (this_varno == rt_index &&
- this_varlevelsup == sublevels_up)
- {
- n = FindMatchingTLEntry(targetlist,
- get_attname(getrelid(this_varno,
- rtable),
- var->varattno));
- if (n == NULL)
- {
- *nodePtr = make_null(((Var *) node)->vartype);
- }
-
- else
- /* This is a hack: The varlevelsup of the orignal
- * variable and the new one should be the same.
- * Normally we adapt the node by changing a pointer
- * to point to a var contained in 'targetlist'.
- * In the targetlist all varlevelsups are 0
- * so if we want to change it to the original value
- * we have to copy the node before! (Maybe this will
- * cause troubles with some sophisticated queries on
- * views?) */
- {
- if(this_varlevelsup>0){
- *nodePtr = copyObject(n);
- }
- else {
- *nodePtr = n;
+ this_varlevelsup == sublevels_up)
+ {
+ n = FindMatchingTLEntry(targetlist,
+ get_attname(getrelid(this_varno,
+ rtable),
+ var->varattno));
+ if (n == NULL)
+ *nodePtr = make_null(((Var *) node)->vartype);
+
+ else
+
+ /*
+ * This is a hack: The varlevelsup of the orignal
+ * variable and the new one should be the same.
+ * Normally we adapt the node by changing a
+ * pointer to point to a var contained in
+ * 'targetlist'. In the targetlist all
+ * varlevelsups are 0 so if we want to change it
+ * to the original value we have to copy the node
+ * before! (Maybe this will cause troubles with
+ * some sophisticated queries on views?)
+ */
+ {
+ if (this_varlevelsup > 0)
+ *nodePtr = copyObject(n);
+ else
+ *nodePtr = n;
+ ((Var *) *nodePtr)->varlevelsup = this_varlevelsup;
}
- ((Var *)*nodePtr)->varlevelsup = this_varlevelsup;
- }
- *modified = TRUE;
- }
+ *modified = TRUE;
+ }
break;
}
case T_List:
@@ -634,20 +657,24 @@ nodeHandleViewRule(Node **nodePtr,
Query *query = (Query *) sublink->subselect;
nodeHandleViewRule((Node **) &(query->qual), rtable, targetlist,
- rt_index, modified, sublevels_up + 1);
-
- /* We also have to adapt the variables used in sublink->lefthand
- * and sublink->oper */
- nodeHandleViewRule((Node **) &(sublink->lefthand), rtable,
- targetlist, rt_index, modified, sublevels_up);
-
- /* Make sure the first argument of sublink->oper points to the
- * same var as sublink->lefthand does otherwise we will
- * run into troubles using aggregates (aggno will not be
- * set correctly */
+ rt_index, modified, sublevels_up + 1);
+
+ /*
+ * We also have to adapt the variables used in
+ * sublink->lefthand and sublink->oper
+ */
+ nodeHandleViewRule((Node **) &(sublink->lefthand), rtable,
+ targetlist, rt_index, modified, sublevels_up);
+
+ /*
+ * Make sure the first argument of sublink->oper points to
+ * the same var as sublink->lefthand does otherwise we
+ * will run into troubles using aggregates (aggno will not
+ * be set correctly
+ */
pfree(lfirst(((Expr *) lfirst(sublink->oper))->args));
- lfirst(((Expr *) lfirst(sublink->oper))->args) =
- lfirst(sublink->lefthand);
+ lfirst(((Expr *) lfirst(sublink->oper))->args) =
+ lfirst(sublink->lefthand);
}
break;
default:
@@ -667,10 +694,13 @@ HandleViewRule(Query *parsetree,
modified, 0);
nodeHandleViewRule((Node **) (&(parsetree->targetList)), rtable, targetlist,
rt_index, modified, 0);
- /* The variables in the havingQual and groupClause also have to be adapted */
+
+ /*
+ * The variables in the havingQual and groupClause also have to be
+ * adapted
+ */
nodeHandleViewRule(&parsetree->havingQual, rtable, targetlist, rt_index,
modified, 0);
nodeHandleViewRule((Node **) (&(parsetree->groupClause)), rtable, targetlist, rt_index,
modified, 0);
}
-