diff options
author | Michael Paquier <michael@paquier.xyz> | 2018-12-23 16:43:56 +0900 |
---|---|---|
committer | Michael Paquier <michael@paquier.xyz> | 2018-12-23 16:43:56 +0900 |
commit | 15f69279e0e85bc4b3cf9593ad090515e500613c (patch) | |
tree | 2abe93c31de88f37d4a436ec7e7c2da27b6fa701 /src/backend/commands/copy.c | |
parent | 669d9eae8531c5d84bc2f6d8f8c9b93d50345403 (diff) |
Disable WAL-skipping optimization for COPY on views
COPY can skip writing WAL when loading data on a table which has been
created in the same transaction as the one loading the data, however
this cannot work on views as this would result in trying to flush
relation files which do not exist. So disable the optimization so as
commands are able to work the same way with any configuration of
wal_level.
A test is added to cover this case, which needs to have wal_level set to
minimal to allow the problem to show up, and that is not the default
configuration.
Reported-by: Etsuro Fujita
Author: Michael Paquier
Reviewed-by: Etsuro Fujita
Discussion: https://postgr.es/m/15552-c64aa14c5c22f63c@postgresql.org
Backpatch-through: 10, where support for COPY on views has been added,
while v11 has added support for COPY on foreign tables.
Diffstat (limited to 'src/backend/commands/copy.c')
-rw-r--r-- | src/backend/commands/copy.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index 226d2ef3dac..a5528f8307f 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -2408,10 +2408,15 @@ CopyFrom(CopyState cstate) * possible to improve on this, but it does mean maintaining heap insert * option flags per partition and setting them when we first open the * partition. + * + * This optimization is not supported for relation types which do not + * have any physical storage, with views entering in this category. + * Partitioned tables are not supported as per the description above. *---------- */ /* createSubid is creation check, newRelfilenodeSubid is truncation check */ if (cstate->rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE && + cstate->rel->rd_rel->relkind != RELKIND_VIEW && (cstate->rel->rd_createSubid != InvalidSubTransactionId || cstate->rel->rd_newRelfilenodeSubid != InvalidSubTransactionId)) { |