OSDN Git Service

Fix overly-enthusiastic Assert in printing of Param reference expressions.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Oct 2010 18:25:10 +0000 (14:25 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Oct 2010 18:25:10 +0000 (14:25 -0400)
A NestLoopParam's value can only be a Var or Aggref, but this isn't the
case in general for SubPlan parameters, so print_parameter_expr had better
be prepared to cope.  Brain fade in my recent patch to print the referenced
expression instead of just printing $N for PARAM_EXEC Params.  Per report
from Pavel Stehule.

src/backend/utils/adt/ruleutils.c

index d4279c0..a5cc48b 100644 (file)
@@ -4368,6 +4368,7 @@ print_parameter_expr(Node *expr, ListCell *ancestor_cell,
 {
        deparse_namespace save_dpns;
        bool            save_varprefix;
+       bool            need_paren;
 
        /* Switch attention to the ancestor plan node */
        push_ancestor_plan(dpns, ancestor_cell, &save_dpns);
@@ -4380,13 +4381,21 @@ print_parameter_expr(Node *expr, ListCell *ancestor_cell,
        context->varprefix = true;
 
        /*
-        * We don't need to add parentheses because a Param's expansion is
-        * (currently) always a Var or Aggref.
+        * A Param's expansion is typically a Var, Aggref, or upper-level Param,
+        * which wouldn't need extra parentheses.  Otherwise, insert parens to
+        * ensure the expression looks atomic.
         */
-       Assert(IsA(expr, Var) || IsA(expr, Aggref));
+       need_paren = !(IsA(expr, Var) ||
+                                  IsA(expr, Aggref) ||
+                                  IsA(expr, Param));
+       if (need_paren)
+               appendStringInfoChar(context->buf, '(');
 
        get_rule_expr(expr, context, false);
 
+       if (need_paren)
+               appendStringInfoChar(context->buf, ')');
+
        context->varprefix = save_varprefix;
 
        pop_ancestor_plan(dpns, &save_dpns);