diff --git a/expected/server_options_1.out b/expected/server_options_1.out new file mode 100644 index 0000000..645a224 --- /dev/null +++ b/expected/server_options_1.out @@ -0,0 +1,274 @@ +\set MYSQL_HOST `echo \'"$MYSQL_HOST"\'` +\set MYSQL_PORT `echo \'"$MYSQL_PORT"\'` +\set MYSQL_USER_NAME `echo \'"$MYSQL_USER_NAME"\'` +\set MYSQL_PASS `echo \'"$MYSQL_PWD"\'` +-- Before running this file User must create database mysql_fdw_regress on +-- MySQL with all permission for MYSQL_USER_NAME user with MYSQL_PWD password +-- and ran mysql_init.sh file to create tables. +\c contrib_regression +CREATE EXTENSION IF NOT EXISTS mysql_fdw; +CREATE SERVER mysql_svr FOREIGN DATA WRAPPER mysql_fdw + OPTIONS (host :MYSQL_HOST, port :MYSQL_PORT); +CREATE USER MAPPING FOR public SERVER mysql_svr + OPTIONS (username :MYSQL_USER_NAME, password :MYSQL_PASS); +-- Validate extension, server and mapping details +CREATE OR REPLACE FUNCTION show_details(host TEXT, port TEXT, uid TEXT, pwd TEXT) RETURNS int AS $$ +DECLARE + ext TEXT; + srv TEXT; + sopts TEXT; + uopts TEXT; +BEGIN + SELECT e.fdwname, srvname, array_to_string(s.srvoptions, ','), array_to_string(u.umoptions, ',') + INTO ext, srv, sopts, uopts + FROM pg_foreign_data_wrapper e LEFT JOIN pg_foreign_server s ON e.oid = s.srvfdw LEFT JOIN pg_user_mapping u ON s.oid = u.umserver + WHERE e.fdwname = 'mysql_fdw' + ORDER BY 1, 2, 3, 4; + + raise notice 'Extension : %', ext; + raise notice 'Server : %', srv; + + IF strpos(sopts, host) <> 0 AND strpos(sopts, port) <> 0 THEN + raise notice 'Server_Options : matched'; + END IF; + + IF strpos(uopts, uid) <> 0 AND strpos(uopts, pwd) <> 0 THEN + raise notice 'User_Mapping_Options : matched'; + END IF; + + return 1; +END; +$$ language plpgsql; +SELECT show_details(:MYSQL_HOST, :MYSQL_PORT, :MYSQL_USER_NAME, :MYSQL_PASS); +NOTICE: Extension : mysql_fdw +NOTICE: Server : mysql_svr +NOTICE: Server_Options : matched +NOTICE: User_Mapping_Options : matched + show_details +-------------- + 1 +(1 row) + +-- Create foreign table and perform basic SQL operations +CREATE FOREIGN TABLE f_mysql_test(a int, b int) + SERVER mysql_svr OPTIONS (dbname 'mysql_fdw_regress', table_name 'mysql_test'); +SELECT a, b FROM f_mysql_test ORDER BY 1, 2; + a | b +---+--- + 1 | 1 +(1 row) + +INSERT INTO f_mysql_test (a, b) VALUES (2, 2); +SELECT a, b FROM f_mysql_test ORDER BY 1, 2; + a | b +---+--- + 1 | 1 + 2 | 2 +(2 rows) + +UPDATE f_mysql_test SET b = 3 WHERE a = 2; +SELECT a, b FROM f_mysql_test ORDER BY 1, 2; + a | b +---+--- + 1 | 1 + 2 | 3 +(2 rows) + +DELETE FROM f_mysql_test WHERE a = 2; +SELECT a, b FROM f_mysql_test ORDER BY 1, 2; + a | b +---+--- + 1 | 1 +(1 row) + +DROP FOREIGN TABLE f_mysql_test; +DROP USER MAPPING FOR public SERVER mysql_svr; +DROP SERVER mysql_svr; +-- Server with init_command. +CREATE SERVER mysql_svr1 FOREIGN DATA WRAPPER mysql_fdw + OPTIONS (host :MYSQL_HOST, port :MYSQL_PORT, init_command 'create table init_command_check(a int)'); +CREATE USER MAPPING FOR public SERVER mysql_svr1 + OPTIONS (username :MYSQL_USER_NAME, password :MYSQL_PASS); +CREATE FOREIGN TABLE f_mysql_test (a int, b int) + SERVER mysql_svr1 OPTIONS (dbname 'mysql_fdw_regress', table_name 'mysql_test'); +-- This will create init_command_check table in mysql_fdw_regress database. +SELECT a, b FROM f_mysql_test ORDER BY 1, 2; + a | b +---+--- + 1 | 1 +(1 row) + +-- init_command_check table created mysql_fdw_regress database can be verified +-- by creating corresponding foreign table here. +CREATE FOREIGN TABLE f_init_command_check(a int) + SERVER mysql_svr1 OPTIONS (dbname 'mysql_fdw_regress', table_name 'init_command_check'); +SELECT a FROM f_init_command_check ORDER BY 1; + a +--- +(0 rows) + +-- Changing init_command to drop init_command_check table from +-- mysql_fdw_regress database +ALTER SERVER mysql_svr1 OPTIONS (SET init_command 'drop table init_command_check'); +SELECT a, b FROM f_mysql_test; + a | b +---+--- + 1 | 1 +(1 row) + +DROP FOREIGN TABLE f_init_command_check; +DROP FOREIGN TABLE f_mysql_test; +DROP USER MAPPING FOR public SERVER mysql_svr1; +DROP SERVER mysql_svr1; +-- Server with use_remote_estimate. +CREATE SERVER mysql_svr1 FOREIGN DATA WRAPPER mysql_fdw + OPTIONS(host :MYSQL_HOST, port :MYSQL_PORT, use_remote_estimate 'TRUE'); +CREATE USER MAPPING FOR public SERVER mysql_svr1 + OPTIONS(username :MYSQL_USER_NAME, password :MYSQL_PASS); +CREATE FOREIGN TABLE f_mysql_test(a int, b int) + SERVER mysql_svr1 OPTIONS(dbname 'mysql_fdw_regress', table_name 'mysql_test'); +-- Below explain will return actual rows from MySQL, but keeping costs off +-- here for consistent regression result. +EXPLAIN (VERBOSE, COSTS OFF) SELECT a FROM f_mysql_test WHERE a < 2 ORDER BY 1; + QUERY PLAN +------------------------------------------------------------------------------------------ + Sort + Output: a + Sort Key: f_mysql_test.a + -> Foreign Scan on public.f_mysql_test + Output: a + Remote query: SELECT `a` FROM `mysql_fdw_regress`.`mysql_test` WHERE ((`a` < 2)) +(6 rows) + +DROP FOREIGN TABLE f_mysql_test; +DROP USER MAPPING FOR public SERVER mysql_svr1; +DROP SERVER mysql_svr1; +-- Create server with secure_auth. +CREATE SERVER mysql_svr1 FOREIGN DATA WRAPPER mysql_fdw + OPTIONS(host :MYSQL_HOST, port :MYSQL_PORT, secure_auth 'FALSE'); +CREATE USER MAPPING FOR public SERVER mysql_svr1 + OPTIONS(username :MYSQL_USER_NAME, password :MYSQL_PASS); +CREATE FOREIGN TABLE f_mysql_test(a int, b int) + SERVER mysql_svr1 OPTIONS(dbname 'mysql_fdw_regress', table_name 'mysql_test'); +-- Below should fail with Warning of secure_auth is false. +SELECT a, b FROM f_mysql_test ORDER BY 1, 2; +WARNING: MySQL secure authentication is off + a | b +---+--- + 1 | 1 +(1 row) + +DROP FOREIGN TABLE f_mysql_test; +DROP USER MAPPING FOR public SERVER mysql_svr1; +DROP SERVER mysql_svr1; +-- FDW-335: Support for fetch_size option at server level and table level. +CREATE SERVER fetch101 FOREIGN DATA WRAPPER mysql_fdw + OPTIONS( fetch_size '101' ); +SELECT count(*) + FROM pg_foreign_server + WHERE srvname = 'fetch101' + AND srvoptions @> array['fetch_size=101']; + count +------- + 1 +(1 row) + +ALTER SERVER fetch101 OPTIONS( SET fetch_size '202' ); +SELECT count(*) + FROM pg_foreign_server + WHERE srvname = 'fetch101' + AND srvoptions @> array['fetch_size=101']; + count +------- + 0 +(1 row) + +SELECT count(*) + FROM pg_foreign_server + WHERE srvname = 'fetch101' + AND srvoptions @> array['fetch_size=202']; + count +------- + 1 +(1 row) + +CREATE FOREIGN TABLE table30000 ( x int ) SERVER fetch101 + OPTIONS ( fetch_size '30000' ); +SELECT COUNT(*) + FROM pg_foreign_table + WHERE ftrelid = 'table30000'::regclass + AND ftoptions @> array['fetch_size=30000']; + count +------- + 1 +(1 row) + +ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '60000'); +SELECT COUNT(*) + FROM pg_foreign_table + WHERE ftrelid = 'table30000'::regclass + AND ftoptions @> array['fetch_size=30000']; + count +------- + 0 +(1 row) + +SELECT COUNT(*) + FROM pg_foreign_table + WHERE ftrelid = 'table30000'::regclass + AND ftoptions @> array['fetch_size=60000']; + count +------- + 1 +(1 row) + +-- Make sure that changing the table level fetch-size value did not change the +-- server level value. +SELECT count(*) + FROM pg_foreign_server + WHERE srvname = 'fetch101' + AND srvoptions @> array['fetch_size=202']; + count +------- + 1 +(1 row) + +-- Negative test cases for fetch_size option, should error out. +ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '-60000'); +ERROR: "fetch_size" requires an integer value between 1 to 4294967295 +ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '123abc'); +ERROR: "fetch_size" requires an integer value between 1 to 4294967295 +ALTER FOREIGN TABLE table30000 OPTIONS ( SET fetch_size '999999999999999999999'); +ERROR: "fetch_size" requires an integer value between 1 to 4294967295 +-- Cleanup fetch_size test objects. +DROP FOREIGN TABLE table30000; +DROP SERVER fetch101; +-- FDW-350: Support for reconnect option at server level. +CREATE SERVER reconnect1 FOREIGN DATA WRAPPER mysql_fdw + OPTIONS( reconnect 'true' ); +SELECT count(*) + FROM pg_foreign_server + WHERE srvname = 'reconnect1' + AND srvoptions @> array['reconnect=true']; + count +------- + 1 +(1 row) + +ALTER SERVER reconnect1 OPTIONS( SET reconnect 'false' ); +SELECT count(*) + FROM pg_foreign_server + WHERE srvname = 'reconnect1' + AND srvoptions @> array['reconnect=false']; + count +------- + 1 +(1 row) + +-- Negative test case for reconnect option, should error out. +ALTER SERVER reconnect1 OPTIONS ( SET reconnect 'abc1' ); +ERROR: reconnect requires a Boolean value +-- Cleanup reconnect option test objects. +DROP SERVER reconnect1; +-- Cleanup +DROP EXTENSION mysql_fdw;