-- -- Test foreign-data wrapper multicdr_fdw. -- -- Clean up in case a prior regression run failed SET client_min_messages TO 'error'; DROP ROLE IF EXISTS file_fdw_superuser, file_fdw_user, no_priv_user; SET client_min_messages TO 'warning'; CREATE ROLE file_fdw_superuser LOGIN SUPERUSER; -- is a superuser CREATE ROLE file_fdw_user LOGIN; -- has priv and user mapping CREATE ROLE no_priv_user LOGIN; -- has priv but no user mapping -- Install multicdr_fdw CREATE EXTENSION multicdr_fdw; -- file_fdw_superuser owns fdw-related objects SET ROLE file_fdw_superuser; CREATE SERVER file_server FOREIGN DATA WRAPPER multicdr_fdw; -- privilege tests SET ROLE file_fdw_user; CREATE FOREIGN DATA WRAPPER multicdr_fdw2 HANDLER file_fdw_handler VALIDATOR file_fdw_validator; -- ERROR ERROR: permission denied to create foreign-data wrapper "multicdr_fdw2" HINT: Must be superuser to create a foreign-data wrapper. CREATE SERVER file_server2 FOREIGN DATA WRAPPER multicdr_fdw; -- ERROR ERROR: permission denied for foreign-data wrapper multicdr_fdw CREATE USER MAPPING FOR file_fdw_user SERVER file_server; -- ERROR ERROR: permission denied for foreign server file_server SET ROLE file_fdw_superuser; GRANT USAGE ON FOREIGN SERVER file_server TO file_fdw_user; SET ROLE file_fdw_user; CREATE USER MAPPING FOR file_fdw_user SERVER file_server; -- create user mappings and grant privilege to test users SET ROLE file_fdw_superuser; CREATE USER MAPPING FOR file_fdw_superuser SERVER file_server; CREATE USER MAPPING FOR no_priv_user SERVER file_server; -- validator tests CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (directory 'foo'); DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (directory ''); -- ERROR ERROR: directory is required for foreign table CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (directory 'foo', pattern ''); DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (directory 'foo', pattern '', mapfields ''); DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (directory 'foo', pattern '', mapfields '', posfields ''); DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (posfields '1,foo,2'); -- ERROR ERROR: cannot parse array CREATE FOREIGN TABLE tbl () SERVER file_server; -- ERROR ERROR: directory is required for foreign table -- test date restrictions CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (directory 'foo', dateformat '$1=YYYY'); -- ERROR ERROR: date format references a missing pattern DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (directory 'foo', pattern '(.*).cdr', dateformat '$1=YYYY', dateminfield 'datemin'); SELECT * FROM tbl LIMIT 1; -- ERROR ERROR: referenced column datemin does not exist DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl ( datemin TIMESTAMP ) SERVER file_server OPTIONS (directory 'foo', pattern '(.*).cdr', dateformat '$1=YYYY', dateminfield 'datemin'); SELECT * FROM tbl LIMIT 1; -- ERROR ERROR: cannot open directory "foo": No such file or directory DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl ( datemin text ) SERVER file_server OPTIONS (directory 'foo', pattern '(.*).cdr', dateformat '$1=YYYY', dateminfield 'datemin'); SELECT * FROM tbl LIMIT 1; -- ERROR ERROR: invalid column type for date constraint, should be timestamp DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl ( datemin text ) SERVER file_server OPTIONS (directory 'foo', pattern '(.*).cdr', dateformat '$1=YYYY', dateminfield 'datemin_none'); SELECT * FROM tbl LIMIT 1; -- ERROR ERROR: referenced column datemin_none does not exist DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl ( datemin TIMESTAMP ) SERVER file_server OPTIONS (directory 'foo', dateformat '$1=YYYY', dateminfield 'datemin'); -- ERROR ERROR: date format references a missing pattern DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl ( datemin TIMESTAMP ) SERVER file_server OPTIONS (directory 'foo', pattern '(.*).cdr', dateformat '$2=YYYY', dateminfield 'datemin'); -- ERROR ERROR: date format references group 2 in a pattern which has only 1 groups DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl ( datemin TIMESTAMP ) SERVER file_server OPTIONS (directory 'foo', pattern '(.*).cdr', dateformat '$1=YYYY', dateminfield 'datemin'); DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl ( datemin TIMESTAMP ) SERVER file_server OPTIONS (directory 'foo', pattern '(.*).cdr', dateformat 'YYYY', dateminfield 'datemin'); -- ERROR ERROR: dateformat parse: invalid regular expression: failed to match DROP FOREIGN TABLE IF EXISTS tbl; CREATE FOREIGN TABLE tbl ( datemin TIMESTAMP ) SERVER file_server OPTIONS (directory 'foo', pattern '(.*).cdr', dateformat '$1', dateminfield 'datemin'); -- ERROR ERROR: dateformat parse: invalid regular expression: failed to match DROP FOREIGN TABLE IF EXISTS tbl; -- various selects CREATE FOREIGN TABLE tbl_alpha ( f1 text, f2 int4, f3 text, f4 int4, f5 text ) SERVER file_server OPTIONS (directory '@abs_srcdir@/data/regression1', pattern '.*\.cdr$', posfields '0,6,15,40,50,71,92,113,175,212,217,227,232,319,329', rowminlen '339', rowmaxlen '340'); CREATE FOREIGN TABLE tbl_beta ( f1 text, f2 int4, f3 text, f4 int4, f5 text ) SERVER file_server OPTIONS (directory '@abs_srcdir@/data/regression2', pattern '.*\.cdr$', posfields '0,6,15,40,50,71,92,113,175,212,217,227,232,319,329', rowminlen '339', rowmaxlen '340'); GRANT SELECT ON tbl_beta TO file_fdw_user; CREATE FOREIGN TABLE tbl_bad ( f1 text, f2 text ) SERVER file_server OPTIONS (directory '@abs_srcdir@/data/regression9000', pattern '.*\.cdr$', posfields '0,6,15,40,50,71,92,113,175,212,217,227,232,319,329', rowminlen '339', rowmaxlen '340'); -- basic query tests SELECT * FROM tbl_alpha ORDER BY f4; f1 | f2 | f3 | f4 | f5 ----+----+---------------------+--------+----------------- -5 | 10 | I501059845516040 | 24 | 296487514560383 -1 | 10 | O520280597676258 | 51 | 027386199028423 -7 | 20 | O4395503825302498 | 53 | 211569653648233 -2 | 20 | I13108447853599932 | 59 | 153088598461700 -2 | 10 | I7240320923723539 | 69 | 193161641481202 -6 | 10 | I799089765591618 | 78 | 292644197998720 -6 | 20 | I449710280586504 | 538 | 442922748137325 -5 | 20 | I9303960726186915 | 933 | 800775266536367 -9 | 20 | I377079950605549 | 939 | 858544817146251 -5 | 10 | I764064272987391 | 948 | 446617839477149 -5 | 10 | O6593028239174455 | 1816 | 248939183449443 -9 | 10 | O80187718991624685 | 2872 | 881057258184107 -8 | 10 | I2675777049722644 | 2939 | 712080444068539 -6 | 20 | O0219224905512521 | 3887 | 843965136261098 -0 | 20 | I864379806422008746 | 6435 | 667701477760382 -1 | 10 | I7156011726657294 | 8956 | 351246619922996 -3 | 20 | I92805833598100674 | 91812 | 297709284174310 -1 | 10 | I42570425600513503 | 552723 | 855192482600769 -7 | 20 | O81416279888891729 | 896989 | 926710766239136 (19 rows) SELECT * FROM tbl_beta WHERE f4 < 5 AND f2 < 7 ORDER BY f5; f1 | f2 | f3 | f4 | f5 ----+----+-------------------+----+----------------- -3 | 6 | O4112194628591126 | 0 | 330277926389080 (1 row) SELECT * FROM tbl_alpha c JOIN tbl_beta t ON (t.f2 = c.f2) WHERE c.f4 < 100 AND t.f4 < 50; f1 | f2 | f3 | f4 | f5 | f1 | f2 | f3 | f4 | f5 ----+----+----+----+----+----+----+----+----+---- (0 rows) -- rows count \t on SELECT SUM(f4) FROM tbl_alpha; -- 1572121 1572121 SELECT count(*) FROM tbl_alpha; -- 19 19 SELECT count(*) FROM tbl_beta; -- 490 490 \t off -- error context report tests SELECT * FROM tbl_bad; -- ERROR ERROR: cannot open directory "@abs_srcdir@/data/regression9000": No such file or directory -- misc query tests \t on EXPLAIN (VERBOSE, COSTS FALSE) SELECT * FROM tbl_alpha; Foreign Scan on public.tbl_alpha Output: f1, f2, f3, f4, f5 \t off PREPARE st(int) AS SELECT * FROM tbl_alpha WHERE f2 = $1; EXECUTE st(10); f1 | f2 | f3 | f4 | f5 ----+----+--------------------+--------+----------------- -5 | 10 | I764064272987391 | 948 | 446617839477149 -5 | 10 | I501059845516040 | 24 | 296487514560383 -2 | 10 | I7240320923723539 | 69 | 193161641481202 -1 | 10 | I7156011726657294 | 8956 | 351246619922996 -6 | 10 | I799089765591618 | 78 | 292644197998720 -1 | 10 | O520280597676258 | 51 | 027386199028423 -8 | 10 | I2675777049722644 | 2939 | 712080444068539 -5 | 10 | O6593028239174455 | 1816 | 248939183449443 -1 | 10 | I42570425600513503 | 552723 | 855192482600769 -9 | 10 | O80187718991624685 | 2872 | 881057258184107 (10 rows) EXECUTE st(20); f1 | f2 | f3 | f4 | f5 ----+----+---------------------+--------+----------------- -5 | 20 | I9303960726186915 | 933 | 800775266536367 -2 | 20 | I13108447853599932 | 59 | 153088598461700 -6 | 20 | O0219224905512521 | 3887 | 843965136261098 -7 | 20 | O4395503825302498 | 53 | 211569653648233 -9 | 20 | I377079950605549 | 939 | 858544817146251 -6 | 20 | I449710280586504 | 538 | 442922748137325 -3 | 20 | I92805833598100674 | 91812 | 297709284174310 -7 | 20 | O81416279888891729 | 896989 | 926710766239136 -0 | 20 | I864379806422008746 | 6435 | 667701477760382 (9 rows) DEALLOCATE st; -- date restrictions tests CREATE FOREIGN TABLE tbl_date ( f1 text, f2 text, filename text, datemin TIMESTAMP, datemax TIMESTAMP ) SERVER file_server OPTIONS (directory '@abs_srcdir@/data/regression3', pattern 'MSC_(.*)-([[:digit:]]+)\.cdr$', dateformat '$1=YYYYMMDDHHMISS', posfields '0,6,15,40,50,71,92,113,175,212,217,227,232,319,329', mapfields '0,1, 0,0,0', dateminfield 'datemin', datemaxfield 'datemax', filefield 'filename', rowminlen '339', rowmaxlen '340' ); \t on SELECT filename, COUNT(filename) FROM tbl_date GROUP BY filename ORDER BY filename; @abs_srcdir@/data/regression3/MSC_20121201074000-1.cdr | 6 @abs_srcdir@/data/regression3/MSC_20121209074000-2.cdr | 12 @abs_srcdir@/data/regression3/MSC_20130102074000-3.cdr | 13 @abs_srcdir@/data/regression3/MSC_20130102084000-4.cdr | 69 SELECT filename, COUNT(filename) FROM tbl_date WHERE datemin = CAST('2001-12-01 01:23:45' AS TIMESTAMP) AND datemax = CAST('2015-12-01 01:23:45' AS TIMESTAMP) GROUP BY filename ORDER BY filename; @abs_srcdir@/data/regression3/MSC_20121201074000-1.cdr | 6 @abs_srcdir@/data/regression3/MSC_20121209074000-2.cdr | 12 @abs_srcdir@/data/regression3/MSC_20130102074000-3.cdr | 13 @abs_srcdir@/data/regression3/MSC_20130102084000-4.cdr | 69 SELECT filename, COUNT(filename) FROM tbl_date WHERE datemin = CAST('2012-12-01 01:23:45' AS TIMESTAMP) AND datemax = CAST('2012-12-31 01:23:45' AS TIMESTAMP) GROUP BY filename ORDER BY filename; @abs_srcdir@/data/regression3/MSC_20121201074000-1.cdr | 6 @abs_srcdir@/data/regression3/MSC_20121209074000-2.cdr | 12 SELECT filename, COUNT(filename) FROM tbl_date WHERE datemax = CAST('2012-12-31 01:23:45' AS TIMESTAMP) GROUP BY filename ORDER BY filename; @abs_srcdir@/data/regression3/MSC_20121201074000-1.cdr | 6 @abs_srcdir@/data/regression3/MSC_20121209074000-2.cdr | 12 SELECT filename, COUNT(filename) FROM tbl_date WHERE datemin = CAST('2013-01-01 01:23:45' AS TIMESTAMP) GROUP BY filename ORDER BY filename; @abs_srcdir@/data/regression3/MSC_20130102074000-3.cdr | 13 @abs_srcdir@/data/regression3/MSC_20130102084000-4.cdr | 69 SELECT filename, COUNT(filename) FROM tbl_date WHERE filename = '@abs_srcdir@/data/regression3/MSC_20121201074000-1.cdr' AND datemin = CAST('2012-12-01 07:39:00' AS TIMESTAMP) AND datemax = CAST('2012-12-01 07:41:00' AS TIMESTAMP) GROUP BY filename ORDER BY filename; @abs_srcdir@/data/regression3/MSC_20121201074000-1.cdr | 6 \t off DROP FOREIGN TABLE IF EXISTS tbl_date; -- tableoid SELECT tableoid::regclass, f2 FROM tbl_alpha; tableoid | f2 -----------+---- tbl_alpha | 10 tbl_alpha | 20 tbl_alpha | 10 tbl_alpha | 20 tbl_alpha | 10 tbl_alpha | 10 tbl_alpha | 20 tbl_alpha | 20 tbl_alpha | 10 tbl_alpha | 10 tbl_alpha | 20 tbl_alpha | 20 tbl_alpha | 10 tbl_alpha | 10 tbl_alpha | 10 tbl_alpha | 10 tbl_alpha | 20 tbl_alpha | 20 tbl_alpha | 20 (19 rows) -- updates aren't supported INSERT INTO tbl_alpha VALUES(1,2); -- ERROR ERROR: cannot change foreign table "tbl_alpha" UPDATE tbl_alpha SET f2 = 1; -- ERROR ERROR: cannot change foreign table "tbl_alpha" DELETE FROM tbl_alpha WHERE f2 = 100; -- ERROR ERROR: cannot change foreign table "tbl_alpha" SELECT * FROM tbl_alpha FOR UPDATE OF tbl_alpha; -- ERROR ERROR: SELECT FOR UPDATE/SHARE cannot be used with foreign table "tbl_alpha" LINE 1: SELECT * FROM tbl_alpha FOR UPDATE OF tbl_alpha; ^ -- but this should be ignored SELECT * FROM tbl_alpha FOR UPDATE; f1 | f2 | f3 | f4 | f5 ----+----+---------------------+--------+----------------- -5 | 10 | I764064272987391 | 948 | 446617839477149 -5 | 20 | I9303960726186915 | 933 | 800775266536367 -5 | 10 | I501059845516040 | 24 | 296487514560383 -2 | 20 | I13108447853599932 | 59 | 153088598461700 -2 | 10 | I7240320923723539 | 69 | 193161641481202 -1 | 10 | I7156011726657294 | 8956 | 351246619922996 -6 | 20 | O0219224905512521 | 3887 | 843965136261098 -7 | 20 | O4395503825302498 | 53 | 211569653648233 -6 | 10 | I799089765591618 | 78 | 292644197998720 -1 | 10 | O520280597676258 | 51 | 027386199028423 -9 | 20 | I377079950605549 | 939 | 858544817146251 -6 | 20 | I449710280586504 | 538 | 442922748137325 -8 | 10 | I2675777049722644 | 2939 | 712080444068539 -5 | 10 | O6593028239174455 | 1816 | 248939183449443 -1 | 10 | I42570425600513503 | 552723 | 855192482600769 -9 | 10 | O80187718991624685 | 2872 | 881057258184107 -3 | 20 | I92805833598100674 | 91812 | 297709284174310 -7 | 20 | O81416279888891729 | 896989 | 926710766239136 -0 | 20 | I864379806422008746 | 6435 | 667701477760382 (19 rows) -- privilege tests SET ROLE file_fdw_superuser; SELECT * FROM tbl_beta WHERE f4 < 32 ORDER BY f2 LIMIT 5; f1 | f2 | f3 | f4 | f5 ----+----+-------------------+----+----------------- -2 | 0 | I640522572650487 | 7 | 522498161257599 -5 | 5 | I783533949149677 | 9 | 387154799154243 -3 | 6 | O4112194628591126 | 0 | 330277926389080 -9 | 7 | I530995735057699 | 2 | 550282281027389 -0 | 12 | O4105353663433775 | 12 | 812468067963018 (5 rows) SET ROLE file_fdw_user; SELECT * FROM tbl_beta WHERE f4 < 32 ORDER BY f2 LIMIT 5; f1 | f2 | f3 | f4 | f5 ----+----+-------------------+----+----------------- -2 | 0 | I640522572650487 | 7 | 522498161257599 -5 | 5 | I783533949149677 | 9 | 387154799154243 -3 | 6 | O4112194628591126 | 0 | 330277926389080 -9 | 7 | I530995735057699 | 2 | 550282281027389 -0 | 12 | O4105353663433775 | 12 | 812468067963018 (5 rows) SET ROLE no_priv_user; SELECT * FROM tbl_beta WHERE f4 < 32 ORDER BY f2; -- ERROR ERROR: permission denied for relation tbl_beta SET ROLE file_fdw_user; \t on EXPLAIN (VERBOSE, COSTS FALSE) SELECT * FROM tbl_beta WHERE f2 > 0; Foreign Scan on public.tbl_beta Output: f1, f2, f3, f4, f5 Filter: (tbl_beta.f2 > 0) \t off -- privilege tests for object SET ROLE file_fdw_superuser; ALTER FOREIGN TABLE tbl_beta OWNER TO file_fdw_user; ALTER FOREIGN TABLE tbl_beta OPTIONS (SET directory 'foobar'); SET ROLE file_fdw_user; ALTER FOREIGN TABLE tbl_beta OPTIONS (SET directory 'foobar'); -- ERROR ERROR: only superuser can change options of a multicdr_fdw foreign table SET ROLE file_fdw_superuser; -- mapping tests CREATE FOREIGN TABLE tbl_gamma ( f1 text, f2 int4, f3 text, f4 int4, f5 text ) SERVER file_server OPTIONS (directory '@abs_srcdir@/data/regression1', pattern '.*\.cdr$', posfields '0,6,15,40,50,71,92,113,175,212,217,227,232,319,329', mapfields '4,3,2,1,0'); SELECT * FROM tbl_gamma ORDER BY f2; f1 | f2 | f3 | f4 | f5 -----------------+--------+---------------------+----+---- 296487514560383 | 24 | I501059845516040 | 10 | -5 027386199028423 | 51 | O520280597676258 | 10 | -1 211569653648233 | 53 | O4395503825302498 | 20 | -7 153088598461700 | 59 | I13108447853599932 | 20 | -2 193161641481202 | 69 | I7240320923723539 | 10 | -2 292644197998720 | 78 | I799089765591618 | 10 | -6 442922748137325 | 538 | I449710280586504 | 20 | -6 800775266536367 | 933 | I9303960726186915 | 20 | -5 858544817146251 | 939 | I377079950605549 | 20 | -9 446617839477149 | 948 | I764064272987391 | 10 | -5 248939183449443 | 1816 | O6593028239174455 | 10 | -5 881057258184107 | 2872 | O80187718991624685 | 10 | -9 712080444068539 | 2939 | I2675777049722644 | 10 | -8 843965136261098 | 3887 | O0219224905512521 | 20 | -6 667701477760382 | 6435 | I864379806422008746 | 20 | -0 351246619922996 | 8956 | I7156011726657294 | 10 | -1 297709284174310 | 91812 | I92805833598100674 | 20 | -3 855192482600769 | 552723 | I42570425600513503 | 10 | -1 926710766239136 | 896989 | O81416279888891729 | 20 | -7 (19 rows) \t on SELECT SUM(f2) FROM tbl_gamma; -- 1572121 1572121 \t off -- filefield test one DROP FOREIGN TABLE tbl_gamma; CREATE FOREIGN TABLE tbl_gamma ( f1 text, f2 int4, f3 text, f4 int4, filename text ) SERVER file_server OPTIONS (directory '@abs_srcdir@/data/regression1', pattern '.*\.cdr$', posfields '0,6,15,40,50,71,92,113,175,212,217,227,232,319,329', mapfields '4,3,2,1,0', filefield 'filename', rowminlen '339', rowmaxlen '340'); \t on SELECT distinct filename FROM tbl_gamma; @abs_srcdir@/data/regression1/data1.cdr \t off -- filefield test two DROP FOREIGN TABLE tbl_gamma; CREATE FOREIGN TABLE tbl_gamma ( f1 text, f2 int4, filename text, f3 text, f4 int4 ) SERVER file_server OPTIONS (directory '@abs_srcdir@/data/regression2', pattern '.*\.cdr$', posfields '0,6,15,40,50,71,92,113,175,212,217,227,232,319,329', mapfields '4,3,-1,1,0', filefield 'filename', rowminlen '339', rowmaxlen '340'); \t on SELECT count(DISTINCT Filename) FROM tbl_gamma; -- 4 4 \t off -- empty fields test CREATE FOREIGN TABLE tbl_emptyspaces ( f1 text, f2 int4, f3 text, f4 int4, f5 text ) SERVER file_server OPTIONS (directory '@abs_srcdir@/data/regression4', pattern '.*\.cdr$', posfields '0,6,15,40,50,71,92,113,175,212,217,227,232,319,329', mapfields '4,3,2,1,0'); \t on SELECT count(*) FROM tbl_emptyspaces; -- 19 19 SELECT count(*) FROM tbl_emptyspaces WHERE f1 is NULL; -- 2 2 \t off -- cleanup RESET ROLE; DROP EXTENSION multicdr_fdw CASCADE; DROP ROLE file_fdw_superuser, file_fdw_user, no_priv_user; RESET client_min_messages; -- vim: ft=sql