From 64ac072f02f4b9772c3454db68975b8c896c42fb Mon Sep 17 00:00:00 2001 From: naisila Date: Thu, 24 Aug 2023 10:47:26 +0300 Subject: [PATCH] Add COPY FROM default tests Relevant PG commit: https://github.com/postgres/postgres/commit/9f8377f Already supported in Citus, adding the same tests as in PG --- src/test/regress/expected/pg16.out | 106 +++++++++++++++++++++++++++++ src/test/regress/sql/pg16.sql | 91 +++++++++++++++++++++++++ 2 files changed, 197 insertions(+) diff --git a/src/test/regress/expected/pg16.out b/src/test/regress/expected/pg16.out index 829f91eafa8..e1c681a1916 100644 --- a/src/test/regress/expected/pg16.out +++ b/src/test/regress/expected/pg16.out @@ -202,6 +202,112 @@ SELECT create_distributed_table('test_storage', 'a'); ALTER TABLE test_storage ALTER a SET STORAGE default; ERROR: alter table command is currently unsupported DETAIL: Only ADD|DROP COLUMN, SET|DROP NOT NULL, SET|DROP DEFAULT, ADD|DROP|VALIDATE CONSTRAINT, SET (), RESET (), ENABLE|DISABLE|NO FORCE|FORCE ROW LEVEL SECURITY, ATTACH|DETACH PARTITION and TYPE subcommands are supported. +-- +-- COPY FROM ... DEFAULT +-- Already supported in Citus, adding all PG tests with a distributed table +-- Relevant PG commit: +-- https://github.com/postgres/postgres/commit/9f8377f +CREATE TABLE copy_default ( + id integer PRIMARY KEY, + text_value text NOT NULL DEFAULT 'test', + ts_value timestamp without time zone NOT NULL DEFAULT '2022-07-05' +); +SELECT create_distributed_table('copy_default', 'id'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +-- if DEFAULT is not specified, then the marker will be regular data +COPY copy_default FROM stdin; +SELECT * FROM copy_default ORDER BY id; + id | text_value | ts_value +--------------------------------------------------------------------- + 1 | value | Mon Jul 04 00:00:00 2022 + 2 | D | Tue Jul 05 00:00:00 2022 +(2 rows) + +TRUNCATE copy_default; +COPY copy_default FROM stdin WITH (format csv); +SELECT * FROM copy_default ORDER BY id; + id | text_value | ts_value +--------------------------------------------------------------------- + 1 | value | Mon Jul 04 00:00:00 2022 + 2 | \D | Tue Jul 05 00:00:00 2022 +(2 rows) + +TRUNCATE copy_default; +-- DEFAULT cannot be used in binary mode +COPY copy_default FROM stdin WITH (format binary, default '\D'); +ERROR: cannot specify DEFAULT in BINARY mode +-- DEFAULT cannot be new line nor carriage return +COPY copy_default FROM stdin WITH (default E'\n'); +ERROR: COPY default representation cannot use newline or carriage return +COPY copy_default FROM stdin WITH (default E'\r'); +ERROR: COPY default representation cannot use newline or carriage return +-- DELIMITER cannot appear in DEFAULT spec +COPY copy_default FROM stdin WITH (delimiter ';', default 'test;test'); +ERROR: COPY delimiter must not appear in the DEFAULT specification +-- CSV quote cannot appear in DEFAULT spec +COPY copy_default FROM stdin WITH (format csv, quote '"', default 'test"test'); +ERROR: CSV quote character must not appear in the DEFAULT specification +-- NULL and DEFAULT spec must be different +COPY copy_default FROM stdin WITH (default '\N'); +ERROR: NULL specification and DEFAULT specification cannot be the same +-- cannot use DEFAULT marker in column that has no DEFAULT value +COPY copy_default FROM stdin WITH (default '\D'); +ERROR: unexpected default marker in COPY data +DETAIL: Column "id" has no default value. +CONTEXT: COPY copy_default, line 1: "\D value '2022-07-04'" +COPY copy_default FROM stdin WITH (format csv, default '\D'); +ERROR: unexpected default marker in COPY data +DETAIL: Column "id" has no default value. +CONTEXT: COPY copy_default, line 1: "\D,value,2022-07-04" +-- The DEFAULT marker must be unquoted and unescaped or it's not recognized +COPY copy_default FROM stdin WITH (default '\D'); +SELECT * FROM copy_default ORDER BY id; + id | text_value | ts_value +--------------------------------------------------------------------- + 1 | test | Mon Jul 04 00:00:00 2022 + 2 | \D | Mon Jul 04 00:00:00 2022 + 3 | "D" | Mon Jul 04 00:00:00 2022 +(3 rows) + +TRUNCATE copy_default; +COPY copy_default FROM stdin WITH (format csv, default '\D'); +SELECT * FROM copy_default ORDER BY id; + id | text_value | ts_value +--------------------------------------------------------------------- + 1 | test | Mon Jul 04 00:00:00 2022 + 2 | \\D | Mon Jul 04 00:00:00 2022 + 3 | \D | Mon Jul 04 00:00:00 2022 +(3 rows) + +TRUNCATE copy_default; +-- successful usage of DEFAULT option in COPY +COPY copy_default FROM stdin WITH (default '\D'); +SELECT * FROM copy_default ORDER BY id; + id | text_value | ts_value +--------------------------------------------------------------------- + 1 | value | Mon Jul 04 00:00:00 2022 + 2 | test | Sun Jul 03 00:00:00 2022 + 3 | test | Tue Jul 05 00:00:00 2022 +(3 rows) + +TRUNCATE copy_default; +COPY copy_default FROM stdin WITH (format csv, default '\D'); +SELECT * FROM copy_default ORDER BY id; + id | text_value | ts_value +--------------------------------------------------------------------- + 1 | value | Mon Jul 04 00:00:00 2022 + 2 | test | Sun Jul 03 00:00:00 2022 + 3 | test | Tue Jul 05 00:00:00 2022 +(3 rows) + +TRUNCATE copy_default; +-- DEFAULT cannot be used in COPY TO +COPY (select 1 as test) TO stdout WITH (default '\D'); +ERROR: COPY DEFAULT only available using COPY FROM -- Tests for SQL/JSON: support the IS JSON predicate -- Relevant PG commit: -- https://github.com/postgres/postgres/commit/6ee30209 diff --git a/src/test/regress/sql/pg16.sql b/src/test/regress/sql/pg16.sql index f60f5a6ad0d..5b4db1c89f6 100644 --- a/src/test/regress/sql/pg16.sql +++ b/src/test/regress/sql/pg16.sql @@ -104,6 +104,97 @@ SELECT result FROM run_command_on_all_nodes SELECT create_distributed_table('test_storage', 'a'); ALTER TABLE test_storage ALTER a SET STORAGE default; +-- +-- COPY FROM ... DEFAULT +-- Already supported in Citus, adding all PG tests with a distributed table +-- Relevant PG commit: +-- https://github.com/postgres/postgres/commit/9f8377f +CREATE TABLE copy_default ( + id integer PRIMARY KEY, + text_value text NOT NULL DEFAULT 'test', + ts_value timestamp without time zone NOT NULL DEFAULT '2022-07-05' +); +SELECT create_distributed_table('copy_default', 'id'); + +-- if DEFAULT is not specified, then the marker will be regular data +COPY copy_default FROM stdin; +1 value '2022-07-04' +2 \D '2022-07-05' +\. +SELECT * FROM copy_default ORDER BY id; +TRUNCATE copy_default; + +COPY copy_default FROM stdin WITH (format csv); +1,value,2022-07-04 +2,\D,2022-07-05 +\. +SELECT * FROM copy_default ORDER BY id; +TRUNCATE copy_default; + +-- DEFAULT cannot be used in binary mode +COPY copy_default FROM stdin WITH (format binary, default '\D'); + +-- DEFAULT cannot be new line nor carriage return +COPY copy_default FROM stdin WITH (default E'\n'); +COPY copy_default FROM stdin WITH (default E'\r'); + +-- DELIMITER cannot appear in DEFAULT spec +COPY copy_default FROM stdin WITH (delimiter ';', default 'test;test'); + +-- CSV quote cannot appear in DEFAULT spec +COPY copy_default FROM stdin WITH (format csv, quote '"', default 'test"test'); + +-- NULL and DEFAULT spec must be different +COPY copy_default FROM stdin WITH (default '\N'); + +-- cannot use DEFAULT marker in column that has no DEFAULT value +COPY copy_default FROM stdin WITH (default '\D'); +\D value '2022-07-04' +2 \D '2022-07-05' +\. + +COPY copy_default FROM stdin WITH (format csv, default '\D'); +\D,value,2022-07-04 +2,\D,2022-07-05 +\. + +-- The DEFAULT marker must be unquoted and unescaped or it's not recognized +COPY copy_default FROM stdin WITH (default '\D'); +1 \D '2022-07-04' +2 \\D '2022-07-04' +3 "\D" '2022-07-04' +\. +SELECT * FROM copy_default ORDER BY id; +TRUNCATE copy_default; + +COPY copy_default FROM stdin WITH (format csv, default '\D'); +1,\D,2022-07-04 +2,\\D,2022-07-04 +3,"\D",2022-07-04 +\. +SELECT * FROM copy_default ORDER BY id; +TRUNCATE copy_default; + +-- successful usage of DEFAULT option in COPY +COPY copy_default FROM stdin WITH (default '\D'); +1 value '2022-07-04' +2 \D '2022-07-03' +3 \D \D +\. +SELECT * FROM copy_default ORDER BY id; +TRUNCATE copy_default; + +COPY copy_default FROM stdin WITH (format csv, default '\D'); +1,value,2022-07-04 +2,\D,2022-07-03 +3,\D,\D +\. +SELECT * FROM copy_default ORDER BY id; +TRUNCATE copy_default; + +-- DEFAULT cannot be used in COPY TO +COPY (select 1 as test) TO stdout WITH (default '\D'); + -- Tests for SQL/JSON: support the IS JSON predicate -- Relevant PG commit: -- https://github.com/postgres/postgres/commit/6ee30209