]> granicus.if.org Git - postgresql/commitdiff
Fix subtly-wrong volatility checking in BeginCopyFrom().
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Nov 2013 13:59:43 +0000 (08:59 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 8 Nov 2013 13:59:43 +0000 (08:59 -0500)
contain_volatile_functions() is best applied to the output of
expression_planner(), not its input, so that insertion of function
default arguments and constant-folding have been done.  (See comments
at CheckMutability, for instance.)  It's perhaps unlikely that anyone
will notice a difference in practice, but still we should do it properly.

In passing, change variable type from Node* to Expr* to reduce the net
number of casts needed.

Noted while perusing uses of contain_volatile_functions().

src/backend/commands/copy.c

index 31819cce1d8660411f8a44e8d6e3ae6af8bc8d15..082f70fdc38e23486a50801a5e1d5c8c526e27f2 100644 (file)
@@ -2500,18 +2500,22 @@ BeginCopyFrom(Relation rel,
                {
                        /* attribute is NOT to be copied from input */
                        /* use default value if one exists */
-                       Node       *defexpr = build_column_default(cstate->rel, attnum);
+                       Expr       *defexpr = (Expr *) build_column_default(cstate->rel,
+                                                                                                                               attnum);
 
                        if (defexpr != NULL)
                        {
-                               /* Initialize expressions in copycontext. */
-                               defexprs[num_defaults] = ExecInitExpr(
-                                                                expression_planner((Expr *) defexpr), NULL);
+                               /* Run the expression through planner */
+                               defexpr = expression_planner(defexpr);
+
+                               /* Initialize executable expression in copycontext */
+                               defexprs[num_defaults] = ExecInitExpr(defexpr, NULL);
                                defmap[num_defaults] = attnum - 1;
                                num_defaults++;
 
+                               /* Check to see if we have any volatile expressions */
                                if (!volatile_defexprs)
-                                       volatile_defexprs = contain_volatile_functions(defexpr);
+                                       volatile_defexprs = contain_volatile_functions((Node *) defexpr);
                        }
                }
        }