From 63dce7b514f9da0a53554a83160adb0fad7a3f2a Mon Sep 17 00:00:00 2001 From: Shigeru Hanada Date: Thu, 18 Nov 2010 21:53:49 +0900 Subject: [PATCH] Fix file_fdw to treat oid system attribute correctly. Regression tests are also revised. --- src/backend/foreign/file_fdw.c | 12 +++++++++++- src/test/regress/data/agg.csv | 8 ++++---- src/test/regress/input/file_fdw.source | 8 +++----- src/test/regress/output/file_fdw.source | 18 ++++++++---------- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/backend/foreign/file_fdw.c b/src/backend/foreign/file_fdw.c index 0c6f65eb17..e66e89dfec 100644 --- a/src/backend/foreign/file_fdw.c +++ b/src/backend/foreign/file_fdw.c @@ -20,6 +20,7 @@ #include "foreign/foreign.h" #include "funcapi.h" #include "miscadmin.h" +#include "nodes/makefuncs.h" #include "optimizer/cost.h" #include "parser/parsetree.h" #include "storage/fd.h" @@ -48,7 +49,7 @@ static struct FileFdwOption valid_options[] = { { "filename", ForeignTableRelationId }, /* Format options */ - { "oids", ForeignTableRelationId }, + /* Note: 'oids' option comes from the definition of the foreign table. */ { "format", ForeignTableRelationId }, { "header", ForeignTableRelationId }, { "delimiter", ForeignTableRelationId }, @@ -292,6 +293,15 @@ fileBeginScan(ForeignScanState *scanstate) options = list_concat(options, server->options); options = list_concat(options, table->options); + /* oid is the only option which is not from FDW object. */ + if (scanstate->ss.ss_currentRelation->rd_rel->relhasoids) + { + DefElem *oid_option; + oid_option = makeDefElem(pstrdup("oids"), + (Node *) makeString(pstrdup("true"))); + options = lappend(options, oid_option); + } + /* create FileState and set default settings */ fstate = MakeFileState(scanstate->ss.ss_currentRelation, options); diff --git a/src/test/regress/data/agg.csv b/src/test/regress/data/agg.csv index 3ee6bf24db..632d6717fd 100644 --- a/src/test/regress/data/agg.csv +++ b/src/test/regress/data/agg.csv @@ -1,4 +1,4 @@ -56;@7.8@ -100;@99.097@ -0;@0.09561@ -42;@324.78@ +344907;56;@7.8@ +344908;100;@99.097@ +344909;0;@0.09561@ +344910;42;@324.78@ diff --git a/src/test/regress/input/file_fdw.source b/src/test/regress/input/file_fdw.source index 5f560a3849..c886d925a7 100644 --- a/src/test/regress/input/file_fdw.source +++ b/src/test/regress/input/file_fdw.source @@ -24,7 +24,7 @@ CREATE SERVER file_server FOREIGN DATA WRAPPER file_fdw; -- privilege tests SET ROLE file_fdw_user; CREATE FOREIGN DATA WRAPPER file_fdw2 VALIDATOR file_fdw_validator HANDLER file_fdw_handler; -- ERROR -CREATE SERVER file_server2 FOREIGN DATA WRAPPER file_fdw; -- ERROR +CREATE SERVER file_server2 FOREIGN DATA WRAPPER file_fdw; -- ERROR CREATE USER MAPPING FOR file_fdw_user SERVER file_server; -- ERROR SET ROLE file_fdw_superuser; @@ -53,17 +53,15 @@ CREATE FOREIGN TABLE agg_text ( OPTIONS (format 'text', filename '@abs_srcdir@/data/agg.data', delimiter ' ', null '\N'); GRANT SELECT ON agg_text TO file_fdw_user; GRANT SELECT ON agg_text TO no_mapping_user; --- create csv data file and foreign table for the file -COPY (SELECT * FROM agg_text) TO '@abs_srcdir@/data/agg.csv' WITH (format CSV, delimiter ';', quote '@', force_quote (b)); CREATE FOREIGN TABLE agg_csv ( a int2, b float4 -) SERVER file_server +) SERVER file_server WITH OIDS OPTIONS (format 'csv', filename '@abs_srcdir@/data/agg.csv', header 'true', delimiter ';', quote '@', escape '"', null ''); -- basic query tests SELECT * FROM agg_text WHERE b > 10.0 ORDER BY a; -SELECT * FROM agg_csv ORDER BY a; +SELECT oid, * FROM agg_csv ORDER BY a; -- privilege tests SET ROLE file_fdw_superuser; diff --git a/src/test/regress/output/file_fdw.source b/src/test/regress/output/file_fdw.source index 0bc3497593..055c42a118 100644 --- a/src/test/regress/output/file_fdw.source +++ b/src/test/regress/output/file_fdw.source @@ -19,7 +19,7 @@ SET ROLE file_fdw_user; CREATE FOREIGN DATA WRAPPER file_fdw2 VALIDATOR file_fdw_validator HANDLER file_fdw_handler; -- ERROR ERROR: permission denied to create foreign-data wrapper "file_fdw2" HINT: Must be superuser to create a foreign-data wrapper. -CREATE SERVER file_server2 FOREIGN DATA WRAPPER file_fdw; -- ERROR +CREATE SERVER file_server2 FOREIGN DATA WRAPPER file_fdw; -- ERROR ERROR: permission denied for foreign-data wrapper file_fdw CREATE USER MAPPING FOR file_fdw_user SERVER file_server; -- ERROR ERROR: permission denied for foreign server file_server @@ -52,12 +52,10 @@ CREATE FOREIGN TABLE agg_text ( OPTIONS (format 'text', filename '@abs_srcdir@/data/agg.data', delimiter ' ', null '\N'); GRANT SELECT ON agg_text TO file_fdw_user; GRANT SELECT ON agg_text TO no_mapping_user; --- create csv data file and foreign table for the file -COPY (SELECT * FROM agg_text) TO '@abs_srcdir@/data/agg.csv' WITH (format CSV, delimiter ';', quote '@', force_quote (b)); CREATE FOREIGN TABLE agg_csv ( a int2, b float4 -) SERVER file_server +) SERVER file_server WITH OIDS OPTIONS (format 'csv', filename '@abs_srcdir@/data/agg.csv', header 'true', delimiter ';', quote '@', escape '"', null ''); -- basic query tests SELECT * FROM agg_text WHERE b > 10.0 ORDER BY a; @@ -67,12 +65,12 @@ SELECT * FROM agg_text WHERE b > 10.0 ORDER BY a; 100 | 99.097 (2 rows) -SELECT * FROM agg_csv ORDER BY a; - a | b ------+--------- - 0 | 0.09561 - 42 | 324.78 - 100 | 99.097 +SELECT oid, * FROM agg_csv ORDER BY a; + oid | a | b +--------+-----+--------- + 344909 | 0 | 0.09561 + 344910 | 42 | 324.78 + 344908 | 100 | 99.097 (3 rows) -- privilege tests -- 2.39.5