diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile index b75113589..81babaf0b 100644 --- a/src/test/regress/GNUmakefile +++ b/src/test/regress/GNUmakefile @@ -210,7 +210,6 @@ tablespace-setup: ## REGRESS_OPTS = --dlpath=. $(EXTRA_REGRESS_OPTS) -REGRESS_OPTS += --extra-install=contrib/dblink REG_CONF = --regconf=regress.conf check: all tablespace-setup diff --git a/src/test/regress/input/dblink.source b/src/test/regress/input/dblink.source deleted file mode 100755 index 4883deb96..000000000 --- a/src/test/regress/input/dblink.source +++ /dev/null @@ -1,499 +0,0 @@ -CREATE EXTENSION dblink; - -CREATE TABLE foo(f1 int, f2 text, f3 text[], primary key (f1,f2)); -INSERT INTO foo VALUES (0,'a','{"a0","b0","c0"}'); -INSERT INTO foo VALUES (1,'b','{"a1","b1","c1"}'); -INSERT INTO foo VALUES (2,'c','{"a2","b2","c2"}'); -INSERT INTO foo VALUES (3,'d','{"a3","b3","c3"}'); -INSERT INTO foo VALUES (4,'e','{"a4","b4","c4"}'); -INSERT INTO foo VALUES (5,'f','{"a5","b5","c5"}'); -INSERT INTO foo VALUES (6,'g','{"a6","b6","c6"}'); -INSERT INTO foo VALUES (7,'h','{"a7","b7","c7"}'); -INSERT INTO foo VALUES (8,'i','{"a8","b8","c8"}'); -INSERT INTO foo VALUES (9,'j','{"a9","b9","c9"}'); - --- misc utilities - --- list the primary key fields -SELECT * -FROM dblink_get_pkey('foo'); - --- build an insert statement based on a local tuple, --- replacing the primary key values with new ones -SELECT dblink_build_sql_insert('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}'); --- too many pk fields, should fail -SELECT dblink_build_sql_insert('foo','1 2 3 4',4,'{"0", "a", "{a0,b0,c0}"}','{"99", "xyz", "{za0,zb0,zc0}"}'); - --- build an update statement based on a local tuple, --- replacing the primary key values with new ones -SELECT dblink_build_sql_update('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}'); --- too many pk fields, should fail -SELECT dblink_build_sql_update('foo','1 2 3 4',4,'{"0", "a", "{a0,b0,c0}"}','{"99", "xyz", "{za0,zb0,zc0}"}'); - --- build a delete statement based on a local tuple, -SELECT dblink_build_sql_delete('foo','1 2',2,'{"0", "a"}'); --- too many pk fields, should fail -SELECT dblink_build_sql_delete('foo','1 2 3 4',4,'{"0", "a", "{a0,b0,c0}"}'); - --- retest using a quoted and schema qualified table -CREATE SCHEMA "MySchema"; -CREATE TABLE "MySchema"."Foo"(f1 int, f2 text, f3 text[], primary key (f1,f2)); -INSERT INTO "MySchema"."Foo" VALUES (0,'a','{"a0","b0","c0"}'); - --- list the primary key fields -SELECT * -FROM dblink_get_pkey('"MySchema"."Foo"'); - --- build an insert statement based on a local tuple, --- replacing the primary key values with new ones -SELECT dblink_build_sql_insert('"MySchema"."Foo"','1 2',2,'{"0", "a"}','{"99", "xyz"}'); - --- build an update statement based on a local tuple, --- replacing the primary key values with new ones -SELECT dblink_build_sql_update('"MySchema"."Foo"','1 2',2,'{"0", "a"}','{"99", "xyz"}'); - --- build a delete statement based on a local tuple, -SELECT dblink_build_sql_delete('"MySchema"."Foo"','1 2',2,'{"0", "a"}'); - --- regular old dblink -SELECT * -FROM dblink('dbname=regression port=@portstring@','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- should generate "connection not available" error -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- create a persistent connection -SELECT dblink_connect('dbname=regression port=@portstring@'); - --- use the persistent connection -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- open a cursor with bad SQL and fail_on_error set to false -SELECT dblink_open('rmt_foo_cursor','SELECT * FROM foobar',false); - --- reset remote transaction state -SELECT dblink_exec('ABORT'); - --- open a cursor -SELECT dblink_open('rmt_foo_cursor','SELECT * FROM foo'); - --- close the cursor -SELECT dblink_close('rmt_foo_cursor',false); - --- open the cursor again -SELECT dblink_open('rmt_foo_cursor','SELECT * FROM foo'); - --- fetch some data -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]); - -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]); - --- this one only finds two rows left -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]); - --- intentionally botch a fetch -SELECT * -FROM dblink_fetch('rmt_foobar_cursor',4,false) AS t(a int, b text, c text[]); - --- reset remote transaction state -SELECT dblink_exec('ABORT'); - --- close the wrong cursor -SELECT dblink_close('rmt_foobar_cursor',false); - --- should generate 'cursor "rmt_foo_cursor" not found' error -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]); - --- this time, 'cursor "rmt_foo_cursor" not found' as a notice -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4,false) AS t(a int, b text, c text[]); - --- close the persistent connection -SELECT dblink_disconnect(); - --- should generate "connection not available" error -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- put more data into our slave table, first using arbitrary connection syntax --- but truncate the actual return value so we can use diff to check for success -SELECT substr(dblink_exec('dbname=regression port=@portstring@','INSERT INTO foo VALUES(10,''k'',''{"a10","b10","c10"}'')'),1,6); - --- create a persistent connection -SELECT dblink_connect('dbname=regression port=@portstring@'); - --- put more data into our slave table, using persistent connection syntax --- but truncate the actual return value so we can use diff to check for success -SELECT substr(dblink_exec('INSERT INTO foo VALUES(11,''l'',''{"a11","b11","c11"}'')'),1,6); - --- let's see it -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]); - --- bad remote select -SELECT * -FROM dblink('SELECT * FROM foobar',false) AS t(a int, b text, c text[]); - --- change some data -SELECT dblink_exec('UPDATE foo SET f3[2] = ''b99'' WHERE f1 = 11'); - --- let's see it -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE a = 11; - --- botch a change to some other data -SELECT dblink_exec('UPDATE foobar SET f3[2] = ''b99'' WHERE f1 = 11',false); - --- delete some data -SELECT dblink_exec('DELETE FROM foo WHERE f1 = 11'); - --- let's see it -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE a = 11; - --- close the persistent connection -SELECT dblink_disconnect(); - --- --- tests for the new named persistent connection syntax --- - --- should generate "missing "=" after "myconn" in connection info string" error -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- create a named persistent connection -SELECT dblink_connect('myconn','dbname=regression port=@portstring@'); - --- use the named persistent connection -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- use the named persistent connection, but get it wrong -SELECT * -FROM dblink('myconn','SELECT * FROM foobar',false) AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- create a second named persistent connection --- should error with "duplicate connection name" -SELECT dblink_connect('myconn','dbname=regression port=@portstring@'); - --- create a second named persistent connection with a new name -SELECT dblink_connect('myconn2','dbname=regression port=@portstring@'); - --- use the second named persistent connection -SELECT * -FROM dblink('myconn2','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- close the second named persistent connection -SELECT dblink_disconnect('myconn2'); - --- open a cursor incorrectly -SELECT dblink_open('myconn','rmt_foo_cursor','SELECT * FROM foobar',false); - --- reset remote transaction state -SELECT dblink_exec('myconn','ABORT'); - --- test opening cursor in a transaction -SELECT dblink_exec('myconn','BEGIN'); - --- an open transaction will prevent dblink_open() from opening its own -SELECT dblink_open('myconn','rmt_foo_cursor','SELECT * FROM foo'); - --- this should not commit the transaction because the client opened it -SELECT dblink_close('myconn','rmt_foo_cursor'); - --- this should succeed because we have an open transaction -SELECT dblink_exec('myconn','DECLARE xact_test CURSOR FOR SELECT * FROM foo'); - --- commit remote transaction -SELECT dblink_exec('myconn','COMMIT'); - --- test automatic transactions for multiple cursor opens -SELECT dblink_open('myconn','rmt_foo_cursor','SELECT * FROM foo'); - --- the second cursor -SELECT dblink_open('myconn','rmt_foo_cursor2','SELECT * FROM foo'); - --- this should not commit the transaction -SELECT dblink_close('myconn','rmt_foo_cursor2'); - --- this should succeed because we have an open transaction -SELECT dblink_exec('myconn','DECLARE xact_test CURSOR FOR SELECT * FROM foo'); - --- this should commit the transaction -SELECT dblink_close('myconn','rmt_foo_cursor'); - --- this should fail because there is no open transaction -SELECT dblink_exec('myconn','DECLARE xact_test CURSOR FOR SELECT * FROM foo'); - --- reset remote transaction state -SELECT dblink_exec('myconn','ABORT'); - --- open a cursor -SELECT dblink_open('myconn','rmt_foo_cursor','SELECT * FROM foo'); - --- fetch some data -SELECT * -FROM dblink_fetch('myconn','rmt_foo_cursor',4) AS t(a int, b text, c text[]); - -SELECT * -FROM dblink_fetch('myconn','rmt_foo_cursor',4) AS t(a int, b text, c text[]); - --- this one only finds three rows left -SELECT * -FROM dblink_fetch('myconn','rmt_foo_cursor',4) AS t(a int, b text, c text[]); - --- fetch some data incorrectly -SELECT * -FROM dblink_fetch('myconn','rmt_foobar_cursor',4,false) AS t(a int, b text, c text[]); - --- reset remote transaction state -SELECT dblink_exec('myconn','ABORT'); - --- should generate 'cursor "rmt_foo_cursor" not found' error -SELECT * -FROM dblink_fetch('myconn','rmt_foo_cursor',4) AS t(a int, b text, c text[]); - --- close the named persistent connection -SELECT dblink_disconnect('myconn'); - --- should generate "missing "=" after "myconn" in connection info string" error -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - --- create a named persistent connection -SELECT dblink_connect('myconn','dbname=regression port=@portstring@'); - --- put more data into our slave table, using named persistent connection syntax --- but truncate the actual return value so we can use diff to check for success -SELECT substr(dblink_exec('myconn','INSERT INTO foo VALUES(11,''l'',''{"a11","b11","c11"}'')'),1,6); - --- let's see it -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]); - --- change some data -SELECT dblink_exec('myconn','UPDATE foo SET f3[2] = ''b99'' WHERE f1 = 11'); - --- let's see it -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE a = 11; - --- delete some data -SELECT dblink_exec('myconn','DELETE FROM foo WHERE f1 = 11'); - --- let's see it -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE a = 11; - --- close the named persistent connection -SELECT dblink_disconnect('myconn'); - --- close the named persistent connection again --- should get 'connection "myconn" not available' error -SELECT dblink_disconnect('myconn'); - --- test asynchronous queries -SELECT dblink_connect('dtest1', 'dbname=regression port=@portstring@'); -SELECT * from - dblink_send_query('dtest1', 'select * from foo where f1 < 3') as t1; - -SELECT dblink_connect('dtest2', 'dbname=regression port=@portstring@'); -SELECT * from - dblink_send_query('dtest2', 'select * from foo where f1 > 2 and f1 < 7') as t1; - -SELECT dblink_connect('dtest3', 'dbname=regression port=@portstring@'); -SELECT * from - dblink_send_query('dtest3', 'select * from foo where f1 > 6') as t1; - -CREATE TEMPORARY TABLE result AS -(SELECT * from dblink_get_result('dtest1') as t1(f1 int, f2 text, f3 text[])) -UNION -(SELECT * from dblink_get_result('dtest2') as t2(f1 int, f2 text, f3 text[])) -UNION -(SELECT * from dblink_get_result('dtest3') as t3(f1 int, f2 text, f3 text[])) -ORDER by f1; - --- dblink_get_connections returns an array with elements in a machine-dependent --- ordering, so we must resort to unnesting and sorting for a stable result -create function unnest(anyarray) returns setof anyelement -language sql strict immutable as $$ -select $1[i] from generate_series(array_lower($1,1), array_upper($1,1)) as i -$$; - -SELECT * FROM unnest(dblink_get_connections()) ORDER BY 1; - -SELECT dblink_is_busy('dtest1'); - -SELECT dblink_disconnect('dtest1'); -SELECT dblink_disconnect('dtest2'); -SELECT dblink_disconnect('dtest3'); - -SELECT * from result; - -SELECT dblink_connect('dtest1', 'dbname=regression port=@portstring@'); -SELECT * from - dblink_send_query('dtest1', 'select * from foo where f1 < 3') as t1; - -SELECT dblink_cancel_query('dtest1'); -SELECT dblink_error_message('dtest1'); -SELECT dblink_disconnect('dtest1'); - --- test asynchronous notifications -SELECT dblink_connect('dbname=regression port=@portstring@'); - ---should return listen -SELECT dblink_exec('LISTEN regression'); ---should return listen -SELECT dblink_exec('LISTEN foobar'); - -SELECT dblink_exec('NOTIFY regression'); -SELECT dblink_exec('NOTIFY foobar'); - -SELECT notify_name, be_pid = (select t.be_pid from dblink('select pg_backend_pid()') as t(be_pid int)) AS is_self_notify, extra from dblink_get_notify(); - -SELECT * from dblink_get_notify(); - -SELECT dblink_disconnect(); - --- test dropped columns in dblink_build_sql_insert, dblink_build_sql_update -CREATE TABLE test_dropped -( - col1 INT NOT NULL DEFAULT 111, - id SERIAL PRIMARY KEY, - col2 INT NOT NULL DEFAULT 112, - col2b INT NOT NULL DEFAULT 113 -); - -INSERT INTO test_dropped VALUES(default); - -ALTER TABLE test_dropped - DROP COLUMN col1, - DROP COLUMN col2, - ADD COLUMN col3 VARCHAR(10) NOT NULL DEFAULT 'foo', - ADD COLUMN col4 INT NOT NULL DEFAULT 42; - -SELECT dblink_build_sql_insert('test_dropped', '1', 1, - ARRAY['1'::TEXT], ARRAY['2'::TEXT]); - -SELECT dblink_build_sql_update('test_dropped', '1', 1, - ARRAY['1'::TEXT], ARRAY['2'::TEXT]); - -SELECT dblink_build_sql_delete('test_dropped', '1', 1, - ARRAY['2'::TEXT]); - --- test local mimicry of remote GUC values that affect datatype I/O -SET datestyle = ISO, MDY; -SET intervalstyle = postgres; -SET timezone = UTC; -SELECT dblink_connect('myconn','dbname=regression port=@portstring@'); -SELECT dblink_exec('myconn', 'SET datestyle = GERMAN, DMY;'); - --- single row synchronous case -SELECT * -FROM dblink('myconn', - 'SELECT * FROM (VALUES (''12.03.2013 00:00:00+00'')) t') - AS t(a timestamptz); - --- multi-row synchronous case -SELECT * -FROM dblink('myconn', - 'SELECT * FROM - (VALUES (''12.03.2013 00:00:00+00''), - (''12.03.2013 00:00:00+00'')) t') - AS t(a timestamptz); - --- single-row asynchronous case -DROP TABLE result; -SELECT * -FROM dblink_send_query('myconn', - 'SELECT * FROM - (VALUES (''12.03.2013 00:00:00+00'')) t'); -CREATE TEMPORARY TABLE result AS -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)) -UNION ALL -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)); -SELECT * FROM result; -DROP TABLE result; - --- multi-row asynchronous case -SELECT * -FROM dblink_send_query('myconn', - 'SELECT * FROM - (VALUES (''12.03.2013 00:00:00+00''), - (''12.03.2013 00:00:00+00'')) t'); -CREATE TEMPORARY TABLE result AS -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)) -UNION ALL -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)) -UNION ALL -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)); -SELECT * FROM result; -DROP TABLE result; - --- Try an ambiguous interval -SELECT dblink_exec('myconn', 'SET intervalstyle = sql_standard;'); -SELECT * -FROM dblink('myconn', - 'SELECT * FROM (VALUES (''-1 2:03:04'')) i') - AS i(i interval); - --- Try swapping to another format to ensure the GUCs are tracked --- properly through a change. -CREATE TEMPORARY TABLE result (t timestamptz); - -SELECT dblink_exec('myconn', 'SET datestyle = ISO, MDY;'); -INSERT INTO result - SELECT * - FROM dblink('myconn', - 'SELECT * FROM (VALUES (''03.12.2013 00:00:00+00'')) t') - AS t(a timestamptz); - -SELECT dblink_exec('myconn', 'SET datestyle = GERMAN, DMY;'); -INSERT INTO result - SELECT * - FROM dblink('myconn', - 'SELECT * FROM (VALUES (''12.03.2013 00:00:00+00'')) t') - AS t(a timestamptz); - -SELECT * FROM result; - -DROP TABLE result; - --- Check error throwing in dblink_fetch -SELECT dblink_open('myconn','error_cursor', - 'SELECT * FROM (VALUES (''1''), (''not an int'')) AS t(text);'); -SELECT * -FROM dblink_fetch('myconn','error_cursor', 1) AS t(i int); -SELECT * -FROM dblink_fetch('myconn','error_cursor', 1) AS t(i int); - --- Make sure that the local settings have retained their values in spite --- of shenanigans on the connection. -SHOW datestyle; -SHOW intervalstyle; - --- Clean up GUC-setting tests -SELECT dblink_disconnect('myconn'); -RESET datestyle; -RESET intervalstyle; -RESET timezone; diff --git a/src/test/regress/output/dblink.source b/src/test/regress/output/dblink.source deleted file mode 100755 index 8d217c2eb..000000000 --- a/src/test/regress/output/dblink.source +++ /dev/null @@ -1,1050 +0,0 @@ -CREATE EXTENSION dblink; -CREATE TABLE foo(f1 int, f2 text, f3 text[], primary key (f1,f2)); -NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo" -INSERT INTO foo VALUES (0,'a','{"a0","b0","c0"}'); -INSERT INTO foo VALUES (1,'b','{"a1","b1","c1"}'); -INSERT INTO foo VALUES (2,'c','{"a2","b2","c2"}'); -INSERT INTO foo VALUES (3,'d','{"a3","b3","c3"}'); -INSERT INTO foo VALUES (4,'e','{"a4","b4","c4"}'); -INSERT INTO foo VALUES (5,'f','{"a5","b5","c5"}'); -INSERT INTO foo VALUES (6,'g','{"a6","b6","c6"}'); -INSERT INTO foo VALUES (7,'h','{"a7","b7","c7"}'); -INSERT INTO foo VALUES (8,'i','{"a8","b8","c8"}'); -INSERT INTO foo VALUES (9,'j','{"a9","b9","c9"}'); --- misc utilities --- list the primary key fields -SELECT * -FROM dblink_get_pkey('foo'); - position | colname -----------+--------- - 1 | f1 - 2 | f2 -(2 rows) - --- build an insert statement based on a local tuple, --- replacing the primary key values with new ones -SELECT dblink_build_sql_insert('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}'); - dblink_build_sql_insert ------------------------------------------------------------ - INSERT INTO foo(f1,f2,f3) VALUES('99','xyz','{a0,b0,c0}') -(1 row) - --- too many pk fields, should fail -SELECT dblink_build_sql_insert('foo','1 2 3 4',4,'{"0", "a", "{a0,b0,c0}"}','{"99", "xyz", "{za0,zb0,zc0}"}'); -ERROR: invalid attribute number 4 -CONTEXT: referenced column: dblink_build_sql_insert --- build an update statement based on a local tuple, --- replacing the primary key values with new ones -SELECT dblink_build_sql_update('foo','1 2',2,'{"0", "a"}','{"99", "xyz"}'); - dblink_build_sql_update ----------------------------------------------------------------------------------------- - UPDATE foo SET f1 = '99', f2 = 'xyz', f3 = '{a0,b0,c0}' WHERE f1 = '99' AND f2 = 'xyz' -(1 row) - --- too many pk fields, should fail -SELECT dblink_build_sql_update('foo','1 2 3 4',4,'{"0", "a", "{a0,b0,c0}"}','{"99", "xyz", "{za0,zb0,zc0}"}'); -ERROR: invalid attribute number 4 -CONTEXT: referenced column: dblink_build_sql_update --- build a delete statement based on a local tuple, -SELECT dblink_build_sql_delete('foo','1 2',2,'{"0", "a"}'); - dblink_build_sql_delete ---------------------------------------------- - DELETE FROM foo WHERE f1 = '0' AND f2 = 'a' -(1 row) - --- too many pk fields, should fail -SELECT dblink_build_sql_delete('foo','1 2 3 4',4,'{"0", "a", "{a0,b0,c0}"}'); -ERROR: invalid attribute number 4 -CONTEXT: referenced column: dblink_build_sql_delete --- retest using a quoted and schema qualified table -CREATE SCHEMA "MySchema"; -CREATE TABLE "MySchema"."Foo"(f1 int, f2 text, f3 text[], primary key (f1,f2)); -NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "Foo_pkey" for table "Foo" -INSERT INTO "MySchema"."Foo" VALUES (0,'a','{"a0","b0","c0"}'); --- list the primary key fields -SELECT * -FROM dblink_get_pkey('"MySchema"."Foo"'); - position | colname -----------+--------- - 1 | f1 - 2 | f2 -(2 rows) - --- build an insert statement based on a local tuple, --- replacing the primary key values with new ones -SELECT dblink_build_sql_insert('"MySchema"."Foo"','1 2',2,'{"0", "a"}','{"99", "xyz"}'); - dblink_build_sql_insert ------------------------------------------------------------------------- - INSERT INTO "MySchema"."Foo"(f1,f2,f3) VALUES('99','xyz','{a0,b0,c0}') -(1 row) - --- build an update statement based on a local tuple, --- replacing the primary key values with new ones -SELECT dblink_build_sql_update('"MySchema"."Foo"','1 2',2,'{"0", "a"}','{"99", "xyz"}'); - dblink_build_sql_update ------------------------------------------------------------------------------------------------------ - UPDATE "MySchema"."Foo" SET f1 = '99', f2 = 'xyz', f3 = '{a0,b0,c0}' WHERE f1 = '99' AND f2 = 'xyz' -(1 row) - --- build a delete statement based on a local tuple, -SELECT dblink_build_sql_delete('"MySchema"."Foo"','1 2',2,'{"0", "a"}'); - dblink_build_sql_delete ----------------------------------------------------------- - DELETE FROM "MySchema"."Foo" WHERE f1 = '0' AND f2 = 'a' -(1 row) - --- regular old dblink -SELECT * -FROM dblink('dbname=regression port=@portstring@','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - a | b | c ----+---+------------ - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} -(2 rows) - --- should generate "connection not available" error -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; -ERROR: connection not available --- create a persistent connection -SELECT dblink_connect('dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - --- use the persistent connection -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - a | b | c ----+---+------------ - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} -(2 rows) - --- open a cursor with bad SQL and fail_on_error set to false -SELECT dblink_open('rmt_foo_cursor','SELECT * FROM foobar',false); -NOTICE: relation "foobar" does not exist on datanode1 -CONTEXT: Error occurred on dblink connection named "unnamed": could not open cursor. -referenced column: dblink_open - dblink_open -------------- - ERROR -(1 row) - --- reset remote transaction state -SELECT dblink_exec('ABORT'); - dblink_exec -------------- - ROLLBACK -(1 row) - --- open a cursor -SELECT dblink_open('rmt_foo_cursor','SELECT * FROM foo'); - dblink_open -------------- - OK -(1 row) - --- close the cursor -SELECT dblink_close('rmt_foo_cursor',false); - dblink_close --------------- - OK -(1 row) - --- open the cursor again -SELECT dblink_open('rmt_foo_cursor','SELECT * FROM foo'); - dblink_open -------------- - OK -(1 row) - --- fetch some data -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]); - a | b | c ----+---+------------ - 0 | a | {a0,b0,c0} - 1 | b | {a1,b1,c1} - 2 | c | {a2,b2,c2} - 3 | d | {a3,b3,c3} -(4 rows) - -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]); - a | b | c ----+---+------------ - 4 | e | {a4,b4,c4} - 5 | f | {a5,b5,c5} - 6 | g | {a6,b6,c6} - 7 | h | {a7,b7,c7} -(4 rows) - --- this one only finds two rows left -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]); - a | b | c ----+---+------------ - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} -(2 rows) - --- intentionally botch a fetch -SELECT * -FROM dblink_fetch('rmt_foobar_cursor',4,false) AS t(a int, b text, c text[]); -NOTICE: cursor "rmt_foobar_cursor" does not exist -CONTEXT: Error occurred on dblink connection named "unnamed": could not fetch from cursor. - a | b | c ----+---+--- -(0 rows) - --- reset remote transaction state -SELECT dblink_exec('ABORT'); - dblink_exec -------------- - ROLLBACK -(1 row) - --- close the wrong cursor -SELECT dblink_close('rmt_foobar_cursor',false); -NOTICE: cursor "rmt_foobar_cursor" does not exist -CONTEXT: Error occurred on dblink connection named "unnamed": could not close cursor. -referenced column: dblink_close - dblink_close --------------- - ERROR -(1 row) - --- should generate 'cursor "rmt_foo_cursor" not found' error -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4) AS t(a int, b text, c text[]); -ERROR: cursor "rmt_foo_cursor" does not exist -CONTEXT: Error occurred on dblink connection named "unnamed": could not fetch from cursor. --- this time, 'cursor "rmt_foo_cursor" not found' as a notice -SELECT * -FROM dblink_fetch('rmt_foo_cursor',4,false) AS t(a int, b text, c text[]); -NOTICE: cursor "rmt_foo_cursor" does not exist -CONTEXT: Error occurred on dblink connection named "unnamed": could not fetch from cursor. - a | b | c ----+---+--- -(0 rows) - --- close the persistent connection -SELECT dblink_disconnect(); - dblink_disconnect -------------------- - OK -(1 row) - --- should generate "connection not available" error -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; -ERROR: connection not available --- put more data into our slave table, first using arbitrary connection syntax --- but truncate the actual return value so we can use diff to check for success -SELECT substr(dblink_exec('dbname=regression port=@portstring@','INSERT INTO foo VALUES(10,''k'',''{"a10","b10","c10"}'')'),1,6); - substr --------- - INSERT -(1 row) - --- create a persistent connection -SELECT dblink_connect('dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - --- put more data into our slave table, using persistent connection syntax --- but truncate the actual return value so we can use diff to check for success -SELECT substr(dblink_exec('INSERT INTO foo VALUES(11,''l'',''{"a11","b11","c11"}'')'),1,6); - substr --------- - INSERT -(1 row) - --- let's see it -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]); - a | b | c -----+---+--------------- - 0 | a | {a0,b0,c0} - 1 | b | {a1,b1,c1} - 2 | c | {a2,b2,c2} - 3 | d | {a3,b3,c3} - 4 | e | {a4,b4,c4} - 5 | f | {a5,b5,c5} - 6 | g | {a6,b6,c6} - 7 | h | {a7,b7,c7} - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} - 10 | k | {a10,b10,c10} - 11 | l | {a11,b11,c11} -(12 rows) - --- bad remote select -SELECT * -FROM dblink('SELECT * FROM foobar',false) AS t(a int, b text, c text[]); -NOTICE: relation "foobar" does not exist on datanode1 -CONTEXT: Error occurred on dblink connection named "unnamed": could not execute query. - a | b | c ----+---+--- -(0 rows) - --- change some data -SELECT dblink_exec('UPDATE foo SET f3[2] = ''b99'' WHERE f1 = 11'); - dblink_exec -------------- - UPDATE 1 -(1 row) - --- let's see it -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE a = 11; - a | b | c -----+---+--------------- - 11 | l | {a11,b99,c11} -(1 row) - --- botch a change to some other data -SELECT dblink_exec('UPDATE foobar SET f3[2] = ''b99'' WHERE f1 = 11',false); -NOTICE: relation "foobar" does not exist on datanode1 -CONTEXT: Error occurred on dblink connection named "unnamed": could not execute command. -referenced column: dblink_exec - dblink_exec -------------- - ERROR -(1 row) - --- delete some data -SELECT dblink_exec('DELETE FROM foo WHERE f1 = 11'); - dblink_exec -------------- - DELETE 1 -(1 row) - --- let's see it -SELECT * -FROM dblink('SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE a = 11; - a | b | c ----+---+--- -(0 rows) - --- close the persistent connection -SELECT dblink_disconnect(); - dblink_disconnect -------------------- - OK -(1 row) - --- --- tests for the new named persistent connection syntax --- --- should generate "missing "=" after "myconn" in connection info string" error -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; -ERROR: could not establish connection -DETAIL: missing "=" after "myconn" in connection info string - --- create a named persistent connection -SELECT dblink_connect('myconn','dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - --- use the named persistent connection -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - a | b | c -----+---+--------------- - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} - 10 | k | {a10,b10,c10} -(3 rows) - --- use the named persistent connection, but get it wrong -SELECT * -FROM dblink('myconn','SELECT * FROM foobar',false) AS t(a int, b text, c text[]) -WHERE t.a > 7; -NOTICE: relation "foobar" does not exist on datanode1 -CONTEXT: Error occurred on dblink connection named "myconn": could not execute query. - a | b | c ----+---+--- -(0 rows) - --- create a second named persistent connection --- should error with "duplicate connection name" -SELECT dblink_connect('myconn','dbname=regression port=@portstring@'); -ERROR: duplicate connection name -CONTEXT: referenced column: dblink_connect --- create a second named persistent connection with a new name -SELECT dblink_connect('myconn2','dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - --- use the second named persistent connection -SELECT * -FROM dblink('myconn2','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; - a | b | c -----+---+--------------- - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} - 10 | k | {a10,b10,c10} -(3 rows) - --- close the second named persistent connection -SELECT dblink_disconnect('myconn2'); - dblink_disconnect -------------------- - OK -(1 row) - --- open a cursor incorrectly -SELECT dblink_open('myconn','rmt_foo_cursor','SELECT * FROM foobar',false); -NOTICE: relation "foobar" does not exist on datanode1 -CONTEXT: Error occurred on dblink connection named "myconn": could not open cursor. -referenced column: dblink_open - dblink_open -------------- - ERROR -(1 row) - --- reset remote transaction state -SELECT dblink_exec('myconn','ABORT'); - dblink_exec -------------- - ROLLBACK -(1 row) - --- test opening cursor in a transaction -SELECT dblink_exec('myconn','BEGIN'); - dblink_exec -------------- - BEGIN -(1 row) - --- an open transaction will prevent dblink_open() from opening its own -SELECT dblink_open('myconn','rmt_foo_cursor','SELECT * FROM foo'); - dblink_open -------------- - OK -(1 row) - --- this should not commit the transaction because the client opened it -SELECT dblink_close('myconn','rmt_foo_cursor'); - dblink_close --------------- - OK -(1 row) - --- this should succeed because we have an open transaction -SELECT dblink_exec('myconn','DECLARE xact_test CURSOR FOR SELECT * FROM foo'); - dblink_exec ----------------- - DECLARE CURSOR -(1 row) - --- commit remote transaction -SELECT dblink_exec('myconn','COMMIT'); - dblink_exec -------------- - COMMIT -(1 row) - --- test automatic transactions for multiple cursor opens -SELECT dblink_open('myconn','rmt_foo_cursor','SELECT * FROM foo'); - dblink_open -------------- - OK -(1 row) - --- the second cursor -SELECT dblink_open('myconn','rmt_foo_cursor2','SELECT * FROM foo'); - dblink_open -------------- - OK -(1 row) - --- this should not commit the transaction -SELECT dblink_close('myconn','rmt_foo_cursor2'); - dblink_close --------------- - OK -(1 row) - --- this should succeed because we have an open transaction -SELECT dblink_exec('myconn','DECLARE xact_test CURSOR FOR SELECT * FROM foo'); - dblink_exec ----------------- - DECLARE CURSOR -(1 row) - --- this should commit the transaction -SELECT dblink_close('myconn','rmt_foo_cursor'); - dblink_close --------------- - OK -(1 row) - --- this should fail because there is no open transaction -SELECT dblink_exec('myconn','DECLARE xact_test CURSOR FOR SELECT * FROM foo'); -ERROR: DECLARE CURSOR can only be used in transaction blocks -CONTEXT: Error occurred on dblink connection named "myconn": could not execute command. -referenced column: dblink_exec --- reset remote transaction state -SELECT dblink_exec('myconn','ABORT'); - dblink_exec -------------- - ROLLBACK -(1 row) - --- open a cursor -SELECT dblink_open('myconn','rmt_foo_cursor','SELECT * FROM foo'); - dblink_open -------------- - OK -(1 row) - --- fetch some data -SELECT * -FROM dblink_fetch('myconn','rmt_foo_cursor',4) AS t(a int, b text, c text[]); - a | b | c ----+---+------------ - 0 | a | {a0,b0,c0} - 1 | b | {a1,b1,c1} - 2 | c | {a2,b2,c2} - 3 | d | {a3,b3,c3} -(4 rows) - -SELECT * -FROM dblink_fetch('myconn','rmt_foo_cursor',4) AS t(a int, b text, c text[]); - a | b | c ----+---+------------ - 4 | e | {a4,b4,c4} - 5 | f | {a5,b5,c5} - 6 | g | {a6,b6,c6} - 7 | h | {a7,b7,c7} -(4 rows) - --- this one only finds three rows left -SELECT * -FROM dblink_fetch('myconn','rmt_foo_cursor',4) AS t(a int, b text, c text[]); - a | b | c -----+---+--------------- - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} - 10 | k | {a10,b10,c10} -(3 rows) - --- fetch some data incorrectly -SELECT * -FROM dblink_fetch('myconn','rmt_foobar_cursor',4,false) AS t(a int, b text, c text[]); -NOTICE: cursor "rmt_foobar_cursor" does not exist -CONTEXT: Error occurred on dblink connection named "myconn": could not fetch from cursor. - a | b | c ----+---+--- -(0 rows) - --- reset remote transaction state -SELECT dblink_exec('myconn','ABORT'); - dblink_exec -------------- - ROLLBACK -(1 row) - --- should generate 'cursor "rmt_foo_cursor" not found' error -SELECT * -FROM dblink_fetch('myconn','rmt_foo_cursor',4) AS t(a int, b text, c text[]); -ERROR: cursor "rmt_foo_cursor" does not exist -CONTEXT: Error occurred on dblink connection named "myconn": could not fetch from cursor. --- close the named persistent connection -SELECT dblink_disconnect('myconn'); - dblink_disconnect -------------------- - OK -(1 row) - --- should generate "missing "=" after "myconn" in connection info string" error -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE t.a > 7; -ERROR: could not establish connection -DETAIL: missing "=" after "myconn" in connection info string - --- create a named persistent connection -SELECT dblink_connect('myconn','dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - --- put more data into our slave table, using named persistent connection syntax --- but truncate the actual return value so we can use diff to check for success -SELECT substr(dblink_exec('myconn','INSERT INTO foo VALUES(11,''l'',''{"a11","b11","c11"}'')'),1,6); - substr --------- - INSERT -(1 row) - --- let's see it -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]); - a | b | c -----+---+--------------- - 0 | a | {a0,b0,c0} - 1 | b | {a1,b1,c1} - 2 | c | {a2,b2,c2} - 3 | d | {a3,b3,c3} - 4 | e | {a4,b4,c4} - 5 | f | {a5,b5,c5} - 6 | g | {a6,b6,c6} - 7 | h | {a7,b7,c7} - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} - 10 | k | {a10,b10,c10} - 11 | l | {a11,b11,c11} -(12 rows) - --- change some data -SELECT dblink_exec('myconn','UPDATE foo SET f3[2] = ''b99'' WHERE f1 = 11'); - dblink_exec -------------- - UPDATE 1 -(1 row) - --- let's see it -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE a = 11; - a | b | c -----+---+--------------- - 11 | l | {a11,b99,c11} -(1 row) - --- delete some data -SELECT dblink_exec('myconn','DELETE FROM foo WHERE f1 = 11'); - dblink_exec -------------- - DELETE 1 -(1 row) - --- let's see it -SELECT * -FROM dblink('myconn','SELECT * FROM foo') AS t(a int, b text, c text[]) -WHERE a = 11; - a | b | c ----+---+--- -(0 rows) - --- close the named persistent connection -SELECT dblink_disconnect('myconn'); - dblink_disconnect -------------------- - OK -(1 row) - --- close the named persistent connection again --- should get 'connection "myconn" not available' error -SELECT dblink_disconnect('myconn'); -ERROR: connection "myconn" not available -CONTEXT: referenced column: dblink_disconnect --- test asynchronous queries -SELECT dblink_connect('dtest1', 'dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - -SELECT * from - dblink_send_query('dtest1', 'select * from foo where f1 < 3') as t1; - t1 ----- - 1 -(1 row) - -SELECT dblink_connect('dtest2', 'dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - -SELECT * from - dblink_send_query('dtest2', 'select * from foo where f1 > 2 and f1 < 7') as t1; - t1 ----- - 1 -(1 row) - -SELECT dblink_connect('dtest3', 'dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - -SELECT * from - dblink_send_query('dtest3', 'select * from foo where f1 > 6') as t1; - t1 ----- - 1 -(1 row) - -CREATE TEMPORARY TABLE result AS -(SELECT * from dblink_get_result('dtest1') as t1(f1 int, f2 text, f3 text[])) -UNION -(SELECT * from dblink_get_result('dtest2') as t2(f1 int, f2 text, f3 text[])) -UNION -(SELECT * from dblink_get_result('dtest3') as t3(f1 int, f2 text, f3 text[])) -ORDER by f1; --- dblink_get_connections returns an array with elements in a machine-dependent --- ordering, so we must resort to unnesting and sorting for a stable result -create function unnest(anyarray) returns setof anyelement -language sql strict immutable as $$ -select $1[i] from generate_series(array_lower($1,1), array_upper($1,1)) as i -$$; -SELECT * FROM unnest(dblink_get_connections()) ORDER BY 1; - unnest --------- - dtest1 - dtest2 - dtest3 -(3 rows) - -SELECT dblink_is_busy('dtest1'); - dblink_is_busy ----------------- - 0 -(1 row) - -SELECT dblink_disconnect('dtest1'); - dblink_disconnect -------------------- - OK -(1 row) - -SELECT dblink_disconnect('dtest2'); - dblink_disconnect -------------------- - OK -(1 row) - -SELECT dblink_disconnect('dtest3'); - dblink_disconnect -------------------- - OK -(1 row) - -SELECT * from result; - f1 | f2 | f3 -----+----+--------------- - 0 | a | {a0,b0,c0} - 1 | b | {a1,b1,c1} - 2 | c | {a2,b2,c2} - 3 | d | {a3,b3,c3} - 4 | e | {a4,b4,c4} - 5 | f | {a5,b5,c5} - 6 | g | {a6,b6,c6} - 7 | h | {a7,b7,c7} - 8 | i | {a8,b8,c8} - 9 | j | {a9,b9,c9} - 10 | k | {a10,b10,c10} -(11 rows) - -SELECT dblink_connect('dtest1', 'dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - -SELECT * from - dblink_send_query('dtest1', 'select * from foo where f1 < 3') as t1; - t1 ----- - 1 -(1 row) - -SELECT dblink_cancel_query('dtest1'); - dblink_cancel_query ---------------------- - OK -(1 row) - -SELECT dblink_error_message('dtest1'); - dblink_error_message ----------------------- - OK -(1 row) - -SELECT dblink_disconnect('dtest1'); - dblink_disconnect -------------------- - OK -(1 row) - --- test asynchronous notifications -SELECT dblink_connect('dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - ---should return listen -SELECT dblink_exec('LISTEN regression'); -ERROR: LISTEN statement is not yet supported. -CONTEXT: Error occurred on dblink connection named "unnamed": could not execute command. -referenced column: dblink_exec ---should return listen -SELECT dblink_exec('LISTEN foobar'); -ERROR: LISTEN statement is not yet supported. -CONTEXT: Error occurred on dblink connection named "unnamed": could not execute command. -referenced column: dblink_exec -SELECT dblink_exec('NOTIFY regression'); -ERROR: NOFITY statement is not yet supported. -CONTEXT: Error occurred on dblink connection named "unnamed": could not execute command. -referenced column: dblink_exec -SELECT dblink_exec('NOTIFY foobar'); -ERROR: NOFITY statement is not yet supported. -CONTEXT: Error occurred on dblink connection named "unnamed": could not execute command. -referenced column: dblink_exec -SELECT notify_name, be_pid = (select t.be_pid from dblink('select pg_backend_pid()') as t(be_pid int)) AS is_self_notify, extra from dblink_get_notify(); - notify_name | is_self_notify | extra --------------+----------------+------- -(0 rows) - -SELECT * from dblink_get_notify(); - notify_name | be_pid | extra --------------+--------+------- -(0 rows) - -SELECT dblink_disconnect(); - dblink_disconnect -------------------- - OK -(1 row) - --- test dropped columns in dblink_build_sql_insert, dblink_build_sql_update -CREATE TABLE test_dropped -( - col1 INT NOT NULL DEFAULT 111, - id SERIAL PRIMARY KEY, - col2 INT NOT NULL DEFAULT 112, - col2b INT NOT NULL DEFAULT 113 -); -NOTICE: CREATE TABLE will create implicit sequence "test_dropped_id_seq" for serial column "test_dropped.id" -NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_dropped_pkey" for table "test_dropped" -INSERT INTO test_dropped VALUES(default); -ALTER TABLE test_dropped - DROP COLUMN col1, - DROP COLUMN col2, - ADD COLUMN col3 VARCHAR(10) NOT NULL DEFAULT 'foo', - ADD COLUMN col4 INT NOT NULL DEFAULT 42; -SELECT dblink_build_sql_insert('test_dropped', '1', 1, - ARRAY['1'::TEXT], ARRAY['2'::TEXT]); - dblink_build_sql_insert ---------------------------------------------------------------------------- - INSERT INTO test_dropped(id,col2b,col3,col4) VALUES('2','113','foo','42') -(1 row) - -SELECT dblink_build_sql_update('test_dropped', '1', 1, - ARRAY['1'::TEXT], ARRAY['2'::TEXT]); - dblink_build_sql_update -------------------------------------------------------------------------------------------- - UPDATE test_dropped SET id = '2', col2b = '113', col3 = 'foo', col4 = '42' WHERE id = '2' -(1 row) - -SELECT dblink_build_sql_delete('test_dropped', '1', 1, - ARRAY['2'::TEXT]); - dblink_build_sql_delete ------------------------------------------ - DELETE FROM test_dropped WHERE id = '2' -(1 row) - --- test local mimicry of remote GUC values that affect datatype I/O -SET datestyle = ISO, MDY; -SET intervalstyle = postgres; -SET timezone = UTC; -SELECT dblink_connect('myconn','dbname=regression port=@portstring@'); - dblink_connect ----------------- - OK -(1 row) - -SELECT dblink_exec('myconn', 'SET datestyle = GERMAN, DMY;'); - dblink_exec -------------- - SET -(1 row) - --- single row synchronous case -SELECT * -FROM dblink('myconn', - 'SELECT * FROM (VALUES (''12.03.2013 00:00:00+00'')) t') - AS t(a timestamptz); - a ------------------------- - 2013-03-12 00:00:00+00 -(1 row) - --- multi-row synchronous case -SELECT * -FROM dblink('myconn', - 'SELECT * FROM - (VALUES (''12.03.2013 00:00:00+00''), - (''12.03.2013 00:00:00+00'')) t') - AS t(a timestamptz); - a ------------------------- - 2013-03-12 00:00:00+00 - 2013-03-12 00:00:00+00 -(2 rows) - --- single-row asynchronous case -DROP TABLE result; -SELECT * -FROM dblink_send_query('myconn', - 'SELECT * FROM - (VALUES (''12.03.2013 00:00:00+00'')) t'); - dblink_send_query -------------------- - 1 -(1 row) - -CREATE TEMPORARY TABLE result AS -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)) -UNION ALL -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)); -SELECT * FROM result; - t ------------------------- - 2013-03-12 00:00:00+00 -(1 row) - -DROP TABLE result; --- multi-row asynchronous case -SELECT * -FROM dblink_send_query('myconn', - 'SELECT * FROM - (VALUES (''12.03.2013 00:00:00+00''), - (''12.03.2013 00:00:00+00'')) t'); - dblink_send_query -------------------- - 1 -(1 row) - -CREATE TEMPORARY TABLE result AS -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)) -UNION ALL -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)) -UNION ALL -(SELECT * from dblink_get_result('myconn') as t(t timestamptz)); -SELECT * FROM result; - t ------------------------- - 2013-03-12 00:00:00+00 - 2013-03-12 00:00:00+00 -(2 rows) - -DROP TABLE result; --- Try an ambiguous interval -SELECT dblink_exec('myconn', 'SET intervalstyle = sql_standard;'); - dblink_exec -------------- - SET -(1 row) - -SELECT * -FROM dblink('myconn', - 'SELECT * FROM (VALUES (''-1 2:03:04'')) i') - AS i(i interval); - i -------------------- - -1 days -02:03:04 -(1 row) - --- Try swapping to another format to ensure the GUCs are tracked --- properly through a change. -CREATE TEMPORARY TABLE result (t timestamptz); -SELECT dblink_exec('myconn', 'SET datestyle = ISO, MDY;'); - dblink_exec -------------- - SET -(1 row) - -INSERT INTO result - SELECT * - FROM dblink('myconn', - 'SELECT * FROM (VALUES (''03.12.2013 00:00:00+00'')) t') - AS t(a timestamptz); -SELECT dblink_exec('myconn', 'SET datestyle = GERMAN, DMY;'); - dblink_exec -------------- - SET -(1 row) - -INSERT INTO result - SELECT * - FROM dblink('myconn', - 'SELECT * FROM (VALUES (''12.03.2013 00:00:00+00'')) t') - AS t(a timestamptz); -SELECT * FROM result; - t ------------------------- - 2013-03-12 00:00:00+00 - 2013-03-12 00:00:00+00 -(2 rows) - -DROP TABLE result; --- Check error throwing in dblink_fetch -SELECT dblink_open('myconn','error_cursor', - 'SELECT * FROM (VALUES (''1''), (''not an int'')) AS t(text);'); - dblink_open -------------- - OK -(1 row) - -SELECT * -FROM dblink_fetch('myconn','error_cursor', 1) AS t(i int); - i ---- - 1 -(1 row) - -SELECT * -FROM dblink_fetch('myconn','error_cursor', 1) AS t(i int); -ERROR: invalid input syntax for integer: "not an int" --- Make sure that the local settings have retained their values in spite --- of shenanigans on the connection. -SHOW datestyle; - DateStyle ------------ - ISO, MDY -(1 row) - -SHOW intervalstyle; - IntervalStyle ---------------- - postgres -(1 row) - --- Clean up GUC-setting tests -SELECT dblink_disconnect('myconn'); - dblink_disconnect -------------------- - OK -(1 row) - -RESET datestyle; -RESET intervalstyle; -RESET timezone; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index 337ee3af9..dce0e132a 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -760,6 +760,3 @@ test: leaky_function_operator #test: gs_guc test: smp - -# dblink contrib test -test: dblink