From 05a689bb19c03eb50ec40e764d9d7843e0df819e Mon Sep 17 00:00:00 2001 From: Mingli Zhang Date: Tue, 26 Jul 2022 23:38:56 +0800 Subject: [PATCH vn] Avoid to handle FORCE_NOT_NULL/FORCE_NULL options when COPY TO. FORCE_NOT_NULL and FORCE_NULL are only used when COPY FROM. Remove unnecessary codes when COPY TO. --- src/backend/commands/copyfrom.c | 5 ++++ src/backend/commands/copyto.c | 49 ++------------------------------- 2 files changed, 8 insertions(+), 46 deletions(-) diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index a976008b3d..add6e54f24 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -1234,6 +1234,11 @@ BeginCopyFrom(ParseState *pstate, /* Extract options from the statement node tree */ ProcessCopyOptions(pstate, &cstate->opts, true /* is_from */ , options); + /* force_null, force_notnull avaliable only in CSV mode */ + Assert((cstate->opts.force_null != NIL || cstate->opts.force_notnull != NIL) ? cstate->opts.csv_mode : true); + /* force_quote can't be used in COPY FROM */ + Assert(cstate->opts.force_quote == NIL); + Assert(!cstate->opts.force_quote_all); /* Process the target relation */ cstate->rel = rel; diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index fca29a9a10..1bae279292 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -415,6 +415,9 @@ BeginCopyTo(ParseState *pstate, /* Extract options from the statement node tree */ ProcessCopyOptions(pstate, &cstate->opts, false /* is_from */ , options); + /* force_null and force_notnull can't be used in COPY TO */ + Assert(cstate->opts.force_null == NIL); + Assert(cstate->opts.force_notnull== NIL); /* Process the source/target relation or query */ if (rel) @@ -591,52 +594,6 @@ BeginCopyTo(ParseState *pstate, } } - /* Convert FORCE_NOT_NULL name list to per-column flags, check validity */ - cstate->opts.force_notnull_flags = (bool *) palloc0(num_phys_attrs * sizeof(bool)); - if (cstate->opts.force_notnull) - { - List *attnums; - ListCell *cur; - - attnums = CopyGetAttnums(tupDesc, cstate->rel, cstate->opts.force_notnull); - - foreach(cur, attnums) - { - int attnum = lfirst_int(cur); - Form_pg_attribute attr = TupleDescAttr(tupDesc, attnum - 1); - - if (!list_member_int(cstate->attnumlist, attnum)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), - errmsg("FORCE_NOT_NULL column \"%s\" not referenced by COPY", - NameStr(attr->attname)))); - cstate->opts.force_notnull_flags[attnum - 1] = true; - } - } - - /* Convert FORCE_NULL name list to per-column flags, check validity */ - cstate->opts.force_null_flags = (bool *) palloc0(num_phys_attrs * sizeof(bool)); - if (cstate->opts.force_null) - { - List *attnums; - ListCell *cur; - - attnums = CopyGetAttnums(tupDesc, cstate->rel, cstate->opts.force_null); - - foreach(cur, attnums) - { - int attnum = lfirst_int(cur); - Form_pg_attribute attr = TupleDescAttr(tupDesc, attnum - 1); - - if (!list_member_int(cstate->attnumlist, attnum)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), - errmsg("FORCE_NULL column \"%s\" not referenced by COPY", - NameStr(attr->attname)))); - cstate->opts.force_null_flags[attnum - 1] = true; - } - } - /* Use client encoding when ENCODING option is not specified. */ if (cstate->opts.file_encoding < 0) cstate->file_encoding = pg_get_client_encoding(); -- 2.34.1