mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Allow CHECK constraints to be placed on foreign tables.
As with NOT NULL constraints, we consider that such constraints are merely reports of constraints that are being enforced by the remote server (or other underlying storage mechanism). Their only real use is to allow planner optimizations, for example in constraint-exclusion checks. Thus, the code changes here amount to little more than removal of the error that was formerly thrown for applying CHECK to a foreign table. (In passing, do a bit of cleanup of the ALTER FOREIGN TABLE reference page, which had accumulated some weird decisions about ordering etc.) Shigeru Hanada and Etsuro Fujita, reviewed by Kyotaro Horiguchi and Ashutosh Bapat.
This commit is contained in:
@ -78,7 +78,7 @@ ERROR: COPY null representation cannot use newline or carriage return
|
||||
CREATE FOREIGN TABLE tbl () SERVER file_server; -- ERROR
|
||||
ERROR: filename is required for file_fdw foreign tables
|
||||
CREATE FOREIGN TABLE agg_text (
|
||||
a int2,
|
||||
a int2 CHECK (a >= 0),
|
||||
b float4
|
||||
) SERVER file_server
|
||||
OPTIONS (format 'text', filename '@abs_srcdir@/data/agg.data', delimiter ' ', null '\N');
|
||||
@ -88,11 +88,13 @@ CREATE FOREIGN TABLE agg_csv (
|
||||
b float4
|
||||
) SERVER file_server
|
||||
OPTIONS (format 'csv', filename '@abs_srcdir@/data/agg.csv', header 'true', delimiter ';', quote '@', escape '"', null '');
|
||||
ALTER FOREIGN TABLE agg_csv ADD CHECK (a >= 0);
|
||||
CREATE FOREIGN TABLE agg_bad (
|
||||
a int2,
|
||||
b float4
|
||||
) SERVER file_server
|
||||
OPTIONS (format 'csv', filename '@abs_srcdir@/data/agg.bad', header 'true', delimiter ';', quote '@', escape '"', null '');
|
||||
ALTER FOREIGN TABLE agg_bad ADD CHECK (a >= 0);
|
||||
-- per-column options tests
|
||||
CREATE FOREIGN TABLE text_csv (
|
||||
word1 text OPTIONS (force_not_null 'true'),
|
||||
@ -219,6 +221,34 @@ SELECT * FROM agg_csv FOR UPDATE;
|
||||
42 | 324.78
|
||||
(3 rows)
|
||||
|
||||
-- constraint exclusion tests
|
||||
\t on
|
||||
EXPLAIN (VERBOSE, COSTS FALSE) SELECT * FROM agg_csv WHERE a < 0;
|
||||
Foreign Scan on public.agg_csv
|
||||
Output: a, b
|
||||
Filter: (agg_csv.a < 0)
|
||||
Foreign File: @abs_srcdir@/data/agg.csv
|
||||
|
||||
\t off
|
||||
SELECT * FROM agg_csv WHERE a < 0;
|
||||
a | b
|
||||
---+---
|
||||
(0 rows)
|
||||
|
||||
SET constraint_exclusion = 'on';
|
||||
\t on
|
||||
EXPLAIN (VERBOSE, COSTS FALSE) SELECT * FROM agg_csv WHERE a < 0;
|
||||
Result
|
||||
Output: a, b
|
||||
One-Time Filter: false
|
||||
|
||||
\t off
|
||||
SELECT * FROM agg_csv WHERE a < 0;
|
||||
a | b
|
||||
---+---
|
||||
(0 rows)
|
||||
|
||||
RESET constraint_exclusion;
|
||||
-- privilege tests
|
||||
SET ROLE file_fdw_superuser;
|
||||
SELECT * FROM agg_text ORDER BY a;
|
||||
|
Reference in New Issue
Block a user