mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
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().
This commit is contained in:
parent
20803d7881
commit
060b22a99a
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user