From 060b22a99a67e01aa097f1a21d2123f166ccdb15 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 8 Nov 2013 08:59:39 -0500 Subject: [PATCH] Fix subtly-wrong volatility checking in BeginCopyFrom(). 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 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 6b20144a48..0fa83a6e2f 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -2506,18 +2506,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); } } }