提交 51f62ea4 编写于 作者: T Tom Lane

Rule deparser didn't handle unary operators correctly.

上级 68c32348
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* out of it's tuple * out of it's tuple
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.24 1999/08/28 03:59:05 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/ruleutils.c,v 1.25 1999/09/02 03:04:04 tgl Exp $
* *
* This software is copyrighted by Jan Wieck - Hamburg. * This software is copyrighted by Jan Wieck - Hamburg.
* *
...@@ -43,8 +43,9 @@ ...@@ -43,8 +43,9 @@
#include "optimizer/clauses.h" #include "optimizer/clauses.h"
#include "optimizer/tlist.h" #include "optimizer/tlist.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "catalog/pg_shadow.h"
#include "catalog/pg_index.h" #include "catalog/pg_index.h"
#include "catalog/pg_operator.h"
#include "catalog/pg_shadow.h"
#define BUFSIZE 8192 #define BUFSIZE 8192
...@@ -1270,6 +1271,7 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix) ...@@ -1270,6 +1271,7 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
case T_Expr: case T_Expr:
{ {
Expr *expr = (Expr *) node; Expr *expr = (Expr *) node;
List *args = expr->args;
/* ---------- /* ----------
* Expr nodes have to be handled a bit detailed * Expr nodes have to be handled a bit detailed
...@@ -1279,15 +1281,56 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix) ...@@ -1279,15 +1281,56 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
{ {
case OP_EXPR: case OP_EXPR:
strcat(buf, "("); strcat(buf, "(");
strcat(buf, get_rule_expr(qh, rt_index, if (length(args) == 2)
(Node *) get_leftop(expr), {
varprefix)); /* binary operator */
strcat(buf, " "); strcat(buf,
strcat(buf, get_opname(((Oper *) expr->oper)->opno)); get_rule_expr(qh, rt_index,
strcat(buf, " "); (Node *) lfirst(args),
strcat(buf, get_rule_expr(qh, rt_index, varprefix));
(Node *) get_rightop(expr), strcat(buf, " ");
varprefix)); strcat(buf,
get_opname(((Oper *) expr->oper)->opno));
strcat(buf, " ");
strcat(buf,
get_rule_expr(qh, rt_index,
(Node *) lsecond(args),
varprefix));
}
else
{
/* unary operator --- but which side? */
Oid opno = ((Oper *) expr->oper)->opno;
HeapTuple tp;
Form_pg_operator optup;
tp = SearchSysCacheTuple(OPROID,
ObjectIdGetDatum(opno),
0, 0, 0);
Assert(HeapTupleIsValid(tp));
optup = (Form_pg_operator) GETSTRUCT(tp);
switch (optup->oprkind)
{
case 'l':
strcat(buf, get_opname(opno));
strcat(buf, " ");
strcat(buf,
get_rule_expr(qh, rt_index,
(Node *) lfirst(args),
varprefix));
break;
case 'r':
strcat(buf,
get_rule_expr(qh, rt_index,
(Node *) lfirst(args),
varprefix));
strcat(buf, " ");
strcat(buf, get_opname(opno));
break;
default:
elog(ERROR, "get_rule_expr: bogus oprkind");
}
}
strcat(buf, ")"); strcat(buf, ")");
return pstrdup(buf); return pstrdup(buf);
break; break;
...@@ -1295,12 +1338,18 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix) ...@@ -1295,12 +1338,18 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
case OR_EXPR: case OR_EXPR:
strcat(buf, "("); strcat(buf, "(");
strcat(buf, get_rule_expr(qh, rt_index, strcat(buf, get_rule_expr(qh, rt_index,
(Node *) get_leftop(expr), (Node *) lfirst(args),
varprefix));
strcat(buf, " OR ");
strcat(buf, get_rule_expr(qh, rt_index,
(Node *) get_rightop(expr),
varprefix)); varprefix));
/* It's not clear that we can ever see N-argument
* OR/AND clauses here, but might as well cope...
*/
while ((args = lnext(args)) != NIL)
{
strcat(buf, " OR ");
strcat(buf, get_rule_expr(qh, rt_index,
(Node *) lfirst(args),
varprefix));
}
strcat(buf, ")"); strcat(buf, ")");
return pstrdup(buf); return pstrdup(buf);
break; break;
...@@ -1308,12 +1357,15 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix) ...@@ -1308,12 +1357,15 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
case AND_EXPR: case AND_EXPR:
strcat(buf, "("); strcat(buf, "(");
strcat(buf, get_rule_expr(qh, rt_index, strcat(buf, get_rule_expr(qh, rt_index,
(Node *) get_leftop(expr), (Node *) lfirst(args),
varprefix));
strcat(buf, " AND ");
strcat(buf, get_rule_expr(qh, rt_index,
(Node *) get_rightop(expr),
varprefix)); varprefix));
while ((args = lnext(args)) != NIL)
{
strcat(buf, " AND ");
strcat(buf, get_rule_expr(qh, rt_index,
(Node *) lfirst(args),
varprefix));
}
strcat(buf, ")"); strcat(buf, ")");
return pstrdup(buf); return pstrdup(buf);
break; break;
...@@ -1335,7 +1387,7 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix) ...@@ -1335,7 +1387,7 @@ get_rule_expr(QryHier *qh, int rt_index, Node *node, bool varprefix)
default: default:
printf("\n%s\n", nodeToString(node)); printf("\n%s\n", nodeToString(node));
elog(ERROR, "Expr type not supported"); elog(ERROR, "get_rule_expr: expr type not supported");
} }
} }
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册