aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/ruleutils.c46
1 files changed, 32 insertions, 14 deletions
diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index b7c3d50767d..1cb8311e878 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -2,7 +2,7 @@
* ruleutils.c - Functions to convert stored expressions/querytrees
* back to source text
*
- * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.235.2.3 2007/10/13 15:55:49 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.235.2.4 2008/01/06 01:03:23 tgl Exp $
**********************************************************************/
#include "postgres.h"
@@ -165,7 +165,8 @@ static void get_oper_expr(OpExpr *expr, deparse_context *context);
static void get_func_expr(FuncExpr *expr, deparse_context *context,
bool showimplicit);
static void get_agg_expr(Aggref *aggref, deparse_context *context);
-static void get_const_expr(Const *constval, deparse_context *context);
+static void get_const_expr(Const *constval, deparse_context *context,
+ int showtype);
static void get_sublink_expr(SubLink *sublink, deparse_context *context);
static void get_from_clause(Query *query, const char *prefix,
deparse_context *context);
@@ -2349,15 +2350,20 @@ get_rule_sortgroupclause(SortClause *srt, List *tlist, bool force_colno,
expr = (Node *) tle->expr;
/*
- * Use column-number form if requested by caller or if expression is a
- * constant --- a constant is ambiguous (and will be misinterpreted by
- * findTargetlistEntry()) if we dump it explicitly.
+ * Use column-number form if requested by caller. Otherwise, if
+ * expression is a constant, force it to be dumped with an explicit
+ * cast as decoration --- this is because a simple integer constant
+ * is ambiguous (and will be misinterpreted by findTargetlistEntry())
+ * if we dump it without any decoration. Otherwise, just dump the
+ * expression normally.
*/
- if (force_colno || (expr && IsA(expr, Const)))
+ if (force_colno)
{
Assert(!tle->resjunk);
appendStringInfo(buf, "%d", tle->resno);
}
+ else if (expr && IsA(expr, Const))
+ get_const_expr((Const *) expr, context, 1);
else
get_rule_expr(expr, context, true);
@@ -3381,7 +3387,7 @@ get_rule_expr(Node *node, deparse_context *context,
break;
case T_Const:
- get_const_expr((Const *) node, context);
+ get_const_expr((Const *) node, context, 0);
break;
case T_Param:
@@ -4162,10 +4168,14 @@ get_agg_expr(Aggref *aggref, deparse_context *context)
* get_const_expr
*
* Make a string representation of a Const
+ *
+ * showtype can be -1 to never show "::typename" decoration, or +1 to always
+ * show it, or 0 to show it only if the constant wouldn't be assumed to be
+ * the right type by default.
* ----------
*/
static void
-get_const_expr(Const *constval, deparse_context *context)
+get_const_expr(Const *constval, deparse_context *context, int showtype)
{
StringInfo buf = context->buf;
Oid typoutput;
@@ -4181,8 +4191,11 @@ get_const_expr(Const *constval, deparse_context *context)
* Always label the type of a NULL constant to prevent misdecisions
* about type when reparsing.
*/
- appendStringInfo(buf, "NULL::%s",
- format_type_with_typemod(constval->consttype, -1));
+ appendStringInfo(buf, "NULL");
+ if (showtype >= 0)
+ appendStringInfo(buf, "::%s",
+ format_type_with_typemod(constval->consttype,
+ -1));
return;
}
@@ -4255,10 +4268,15 @@ get_const_expr(Const *constval, deparse_context *context)
pfree(extval);
+ if (showtype < 0)
+ return;
+
/*
- * Append ::typename unless the constant will be implicitly typed as the
- * right type when it is read in. XXX this code has to be kept in sync
- * with the behavior of the parser, especially make_const.
+ * For showtype == 0, append ::typename unless the constant will be
+ * implicitly typed as the right type when it is read in.
+ *
+ * XXX this code has to be kept in sync with the behavior of the parser,
+ * especially make_const.
*/
switch (constval->consttype)
{
@@ -4276,7 +4294,7 @@ get_const_expr(Const *constval, deparse_context *context)
needlabel = true;
break;
}
- if (needlabel)
+ if (needlabel || showtype > 0)
appendStringInfo(buf, "::%s",
format_type_with_typemod(constval->consttype, -1));
}