mirror of
https://github.com/postgres/postgres.git
synced 2025-07-26 01:22:12 +03:00
copy: update docs for FORCE_NULL and FORCE_NOT_NULL combination
Also update regression tests Patch by Michael Paquier
This commit is contained in:
@ -264,11 +264,6 @@ file_fdw_validator(PG_FUNCTION_ARGS)
|
|||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||||
errmsg("conflicting or redundant options"),
|
errmsg("conflicting or redundant options"),
|
||||||
errhint("option \"force_not_null\" supplied more than once for a column")));
|
errhint("option \"force_not_null\" supplied more than once for a column")));
|
||||||
if(force_null)
|
|
||||||
ereport(ERROR,
|
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
|
||||||
errmsg("conflicting or redundant options"),
|
|
||||||
errhint("option \"force_not_null\" cannot be used together with \"force_null\"")));
|
|
||||||
force_not_null = def;
|
force_not_null = def;
|
||||||
/* Don't care what the value is, as long as it's a legal boolean */
|
/* Don't care what the value is, as long as it's a legal boolean */
|
||||||
(void) defGetBoolean(def);
|
(void) defGetBoolean(def);
|
||||||
@ -281,11 +276,6 @@ file_fdw_validator(PG_FUNCTION_ARGS)
|
|||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||||
errmsg("conflicting or redundant options"),
|
errmsg("conflicting or redundant options"),
|
||||||
errhint("option \"force_null\" supplied more than once for a column")));
|
errhint("option \"force_null\" supplied more than once for a column")));
|
||||||
if(force_not_null)
|
|
||||||
ereport(ERROR,
|
|
||||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
|
||||||
errmsg("conflicting or redundant options"),
|
|
||||||
errhint("option \"force_null\" cannot be used together with \"force_not_null\"")));
|
|
||||||
force_null = def;
|
force_null = def;
|
||||||
(void) defGetBoolean(def);
|
(void) defGetBoolean(def);
|
||||||
}
|
}
|
||||||
|
@ -91,24 +91,22 @@ ALTER FOREIGN TABLE text_csv OPTIONS (SET format 'csv');
|
|||||||
\pset null _null_
|
\pset null _null_
|
||||||
SELECT * FROM text_csv;
|
SELECT * FROM text_csv;
|
||||||
|
|
||||||
|
-- force_not_null and force_null can be used together on the same column
|
||||||
|
ALTER FOREIGN TABLE text_csv ALTER COLUMN word1 OPTIONS (force_null 'true');
|
||||||
|
ALTER FOREIGN TABLE text_csv ALTER COLUMN word3 OPTIONS (force_not_null 'true');
|
||||||
|
|
||||||
-- force_not_null is not allowed to be specified at any foreign object level:
|
-- force_not_null is not allowed to be specified at any foreign object level:
|
||||||
ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_not_null '*'); -- ERROR
|
ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_not_null '*'); -- ERROR
|
||||||
ALTER SERVER file_server OPTIONS (ADD force_not_null '*'); -- ERROR
|
ALTER SERVER file_server OPTIONS (ADD force_not_null '*'); -- ERROR
|
||||||
CREATE USER MAPPING FOR public SERVER file_server OPTIONS (force_not_null '*'); -- ERROR
|
CREATE USER MAPPING FOR public SERVER file_server OPTIONS (force_not_null '*'); -- ERROR
|
||||||
CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_not_null '*'); -- ERROR
|
CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_not_null '*'); -- ERROR
|
||||||
|
|
||||||
-- force_not_null cannot be specified together with force_null
|
|
||||||
ALTER FOREIGN TABLE text_csv ALTER COLUMN word1 OPTIONS (force_null 'true'); --ERROR
|
|
||||||
|
|
||||||
-- force_null is not allowed to be specified at any foreign object level:
|
-- force_null is not allowed to be specified at any foreign object level:
|
||||||
ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_null '*'); -- ERROR
|
ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_null '*'); -- ERROR
|
||||||
ALTER SERVER file_server OPTIONS (ADD force_null '*'); -- ERROR
|
ALTER SERVER file_server OPTIONS (ADD force_null '*'); -- ERROR
|
||||||
CREATE USER MAPPING FOR public SERVER file_server OPTIONS (force_null '*'); -- ERROR
|
CREATE USER MAPPING FOR public SERVER file_server OPTIONS (force_null '*'); -- ERROR
|
||||||
CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_null '*'); -- ERROR
|
CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_null '*'); -- ERROR
|
||||||
|
|
||||||
-- force_null cannot be specified together with force_not_null
|
|
||||||
ALTER FOREIGN TABLE text_csv ALTER COLUMN word3 OPTIONS (force_not_null 'true'); --ERROR
|
|
||||||
|
|
||||||
-- basic query tests
|
-- basic query tests
|
||||||
SELECT * FROM agg_text WHERE b > 10.0 ORDER BY a;
|
SELECT * FROM agg_text WHERE b > 10.0 ORDER BY a;
|
||||||
SELECT * FROM agg_csv ORDER BY a;
|
SELECT * FROM agg_csv ORDER BY a;
|
||||||
|
@ -115,6 +115,9 @@ SELECT * FROM text_csv;
|
|||||||
ABC | abc | |
|
ABC | abc | |
|
||||||
(5 rows)
|
(5 rows)
|
||||||
|
|
||||||
|
-- force_not_null and force_null can be used together on the same column
|
||||||
|
ALTER FOREIGN TABLE text_csv ALTER COLUMN word1 OPTIONS (force_null 'true');
|
||||||
|
ALTER FOREIGN TABLE text_csv ALTER COLUMN word3 OPTIONS (force_not_null 'true');
|
||||||
-- force_not_null is not allowed to be specified at any foreign object level:
|
-- force_not_null is not allowed to be specified at any foreign object level:
|
||||||
ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_not_null '*'); -- ERROR
|
ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_not_null '*'); -- ERROR
|
||||||
ERROR: invalid option "force_not_null"
|
ERROR: invalid option "force_not_null"
|
||||||
@ -128,10 +131,6 @@ HINT: There are no valid options in this context.
|
|||||||
CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_not_null '*'); -- ERROR
|
CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_not_null '*'); -- ERROR
|
||||||
ERROR: invalid option "force_not_null"
|
ERROR: invalid option "force_not_null"
|
||||||
HINT: Valid options in this context are: filename, format, header, delimiter, quote, escape, null, encoding
|
HINT: Valid options in this context are: filename, format, header, delimiter, quote, escape, null, encoding
|
||||||
-- force_not_null cannot be specified together with force_null
|
|
||||||
ALTER FOREIGN TABLE text_csv ALTER COLUMN word1 OPTIONS (force_null 'true'); --ERROR
|
|
||||||
ERROR: conflicting or redundant options
|
|
||||||
HINT: option "force_null" cannot be used together with "force_not_null"
|
|
||||||
-- force_null is not allowed to be specified at any foreign object level:
|
-- force_null is not allowed to be specified at any foreign object level:
|
||||||
ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_null '*'); -- ERROR
|
ALTER FOREIGN DATA WRAPPER file_fdw OPTIONS (ADD force_null '*'); -- ERROR
|
||||||
ERROR: invalid option "force_null"
|
ERROR: invalid option "force_null"
|
||||||
@ -145,10 +144,6 @@ HINT: There are no valid options in this context.
|
|||||||
CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_null '*'); -- ERROR
|
CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (force_null '*'); -- ERROR
|
||||||
ERROR: invalid option "force_null"
|
ERROR: invalid option "force_null"
|
||||||
HINT: Valid options in this context are: filename, format, header, delimiter, quote, escape, null, encoding
|
HINT: Valid options in this context are: filename, format, header, delimiter, quote, escape, null, encoding
|
||||||
-- force_null cannot be specified together with force_not_null
|
|
||||||
ALTER FOREIGN TABLE text_csv ALTER COLUMN word3 OPTIONS (force_not_null 'true'); --ERROR
|
|
||||||
ERROR: conflicting or redundant options
|
|
||||||
HINT: option "force_not_null" cannot be used together with "force_null"
|
|
||||||
-- basic query tests
|
-- basic query tests
|
||||||
SELECT * FROM agg_text WHERE b > 10.0 ORDER BY a;
|
SELECT * FROM agg_text WHERE b > 10.0 ORDER BY a;
|
||||||
a | b
|
a | b
|
||||||
|
@ -487,6 +487,13 @@ COPY <replaceable class="parameter">count</replaceable>
|
|||||||
<command>VACUUM</command> to recover the wasted space.
|
<command>VACUUM</command> to recover the wasted space.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<literal>FORCE_NULL</> and <literal>FORCE_NOT_NULL</> can be used
|
||||||
|
simultaneously on the same column. This has as result to convert quoted
|
||||||
|
null strings to null values and to convert unquoted null strings to
|
||||||
|
empty strings.
|
||||||
|
</para>
|
||||||
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
@ -383,7 +383,6 @@ SELECT * FROM vistest;
|
|||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
-- Test FORCE_NOT_NULL and FORCE_NULL options
|
-- Test FORCE_NOT_NULL and FORCE_NULL options
|
||||||
-- should succeed with "b" set to an empty string and "c" set to NULL
|
|
||||||
CREATE TEMP TABLE forcetest (
|
CREATE TEMP TABLE forcetest (
|
||||||
a INT NOT NULL,
|
a INT NOT NULL,
|
||||||
b TEXT NOT NULL,
|
b TEXT NOT NULL,
|
||||||
@ -392,6 +391,7 @@ CREATE TEMP TABLE forcetest (
|
|||||||
e TEXT
|
e TEXT
|
||||||
);
|
);
|
||||||
\pset null NULL
|
\pset null NULL
|
||||||
|
-- should succeed with no effect ("b" remains an empty string, "c" remains NULL)
|
||||||
BEGIN;
|
BEGIN;
|
||||||
COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b), FORCE_NULL(c));
|
COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b), FORCE_NULL(c));
|
||||||
COMMIT;
|
COMMIT;
|
||||||
@ -401,12 +401,12 @@ SELECT b, c FROM forcetest WHERE a = 1;
|
|||||||
| NULL
|
| NULL
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
-- should succeed with no effect ("b" remains an empty string, "c" remains NULL)
|
-- should succeed, FORCE_NULL and FORCE_NOT_NULL can be both specified
|
||||||
BEGIN;
|
BEGIN;
|
||||||
COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b), FORCE_NULL(c));
|
COPY forcetest (a, b, c, d) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(c,d), FORCE_NULL(c,d));
|
||||||
COMMIT;
|
COMMIT;
|
||||||
SELECT b, c FROM forcetest WHERE a = 2;
|
SELECT c, d FROM forcetest WHERE a = 2;
|
||||||
b | c
|
c | d
|
||||||
---+------
|
---+------
|
||||||
| NULL
|
| NULL
|
||||||
(1 row)
|
(1 row)
|
||||||
|
@ -271,7 +271,6 @@ SELECT * FROM vistest;
|
|||||||
COMMIT;
|
COMMIT;
|
||||||
SELECT * FROM vistest;
|
SELECT * FROM vistest;
|
||||||
-- Test FORCE_NOT_NULL and FORCE_NULL options
|
-- Test FORCE_NOT_NULL and FORCE_NULL options
|
||||||
-- should succeed with "b" set to an empty string and "c" set to NULL
|
|
||||||
CREATE TEMP TABLE forcetest (
|
CREATE TEMP TABLE forcetest (
|
||||||
a INT NOT NULL,
|
a INT NOT NULL,
|
||||||
b TEXT NOT NULL,
|
b TEXT NOT NULL,
|
||||||
@ -280,19 +279,20 @@ CREATE TEMP TABLE forcetest (
|
|||||||
e TEXT
|
e TEXT
|
||||||
);
|
);
|
||||||
\pset null NULL
|
\pset null NULL
|
||||||
|
-- should succeed with no effect ("b" remains an empty string, "c" remains NULL)
|
||||||
BEGIN;
|
BEGIN;
|
||||||
COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b), FORCE_NULL(c));
|
COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b), FORCE_NULL(c));
|
||||||
1,,""
|
1,,""
|
||||||
\.
|
\.
|
||||||
COMMIT;
|
COMMIT;
|
||||||
SELECT b, c FROM forcetest WHERE a = 1;
|
SELECT b, c FROM forcetest WHERE a = 1;
|
||||||
-- should succeed with no effect ("b" remains an empty string, "c" remains NULL)
|
-- should succeed, FORCE_NULL and FORCE_NOT_NULL can be both specified
|
||||||
BEGIN;
|
BEGIN;
|
||||||
COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(b), FORCE_NULL(c));
|
COPY forcetest (a, b, c, d) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL(c,d), FORCE_NULL(c,d));
|
||||||
2,,""
|
2,'a',,""
|
||||||
\.
|
\.
|
||||||
COMMIT;
|
COMMIT;
|
||||||
SELECT b, c FROM forcetest WHERE a = 2;
|
SELECT c, d FROM forcetest WHERE a = 2;
|
||||||
-- should fail with not-null constraint violation
|
-- should fail with not-null constraint violation
|
||||||
BEGIN;
|
BEGIN;
|
||||||
COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b), FORCE_NOT_NULL(c));
|
COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b), FORCE_NOT_NULL(c));
|
||||||
|
Reference in New Issue
Block a user