vn-0003-Avoid-to-handle-FORCE_NOT_NULL-FORCE_NULL-options.patch
application/octet-stream
Filename: vn-0003-Avoid-to-handle-FORCE_NOT_NULL-FORCE_NULL-options.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch 0003
Subject: Avoid to handle FORCE_NOT_NULL/FORCE_NULL options when COPY TO.
| File | + | − |
|---|---|---|
| src/backend/commands/copyfrom.c | 5 | 0 |
| src/backend/commands/copyto.c | 3 | 46 |
From 9b4d44b37414e6471b9452c6a33ff7eb565651e5 Mon Sep 17 00:00:00 2001
From: Mingli Zhang <avamingli@gmail.com>
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.
Add assertions.
---
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..086a05ef52 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 == NULL);
+ 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..d7558318a0 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 == NULL);
+ Assert(cstate->opts.force_notnull== NULL);
/* 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