diff --git a/contrib/dblink/dblink--1.1.sql b/contrib/dblink/dblink--1.1.sql index 8733553..bf5ddaa 100644 --- a/contrib/dblink/dblink--1.1.sql +++ b/contrib/dblink/dblink--1.1.sql @@ -121,6 +121,26 @@ RETURNS setof record AS 'MODULE_PATHNAME','dblink_record' LANGUAGE C STRICT; +CREATE FUNCTION dblink (text, text, anyelement) +RETURNS setof anyelement +AS 'MODULE_PATHNAME','dblink_record' +LANGUAGE C; + +CREATE FUNCTION dblink (text, text, boolean, anyelement) +RETURNS setof anyelement +AS 'MODULE_PATHNAME','dblink_record' +LANGUAGE C; + +CREATE FUNCTION dblink (text, anyelement) +RETURNS setof anyelement +AS 'MODULE_PATHNAME','dblink_record' +LANGUAGE C; + +CREATE FUNCTION dblink (text, boolean, anyelement) +RETURNS setof anyelement +AS 'MODULE_PATHNAME','dblink_record' +LANGUAGE C; + CREATE FUNCTION dblink_exec (text, text) RETURNS text AS 'MODULE_PATHNAME','dblink_exec' @@ -188,6 +208,16 @@ RETURNS SETOF record AS 'MODULE_PATHNAME', 'dblink_get_result' LANGUAGE C STRICT; +CREATE FUNCTION dblink_get_result(text, anyelement) +RETURNS SETOF anyelement +AS 'MODULE_PATHNAME', 'dblink_get_result' +LANGUAGE C; + +CREATE FUNCTION dblink_get_result(text, bool, anyelement) +RETURNS SETOF anyelement +AS 'MODULE_PATHNAME', 'dblink_get_result' +LANGUAGE C; + CREATE FUNCTION dblink_get_connections() RETURNS text[] AS 'MODULE_PATHNAME', 'dblink_get_connections' diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 9fe750e..eb7f5f9 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -680,27 +680,68 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async) if (!is_async) { - if (PG_NARGS() == 3) + if (PG_NARGS() == 4) { - /* text,text,bool */ + /* text,text,bool,anyelement */ + if (PG_ARGISNULL(0) || PG_ARGISNULL(1) || PG_ARGISNULL(2)) + PG_RETURN_NULL(); + DBLINK_GET_CONN; sql = text_to_cstring(PG_GETARG_TEXT_PP(1)); fail = PG_GETARG_BOOL(2); + /* ignore fourth arg as it just provides a return rowtype */ + } + else if (PG_NARGS() == 3) + { + /* text,text,bool or text,text,anyelement or text,bool,anyelement */ + if (get_fn_expr_argtype(fcinfo->flinfo, 2) == BOOLOID) + { + DBLINK_GET_CONN; + sql = text_to_cstring(PG_GETARG_TEXT_PP(1)); + fail = PG_GETARG_BOOL(2); + } + else + { + if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) + PG_RETURN_NULL(); + + if (get_fn_expr_argtype(fcinfo->flinfo, 1) == BOOLOID) + { + conn = pconn->conn; + sql = text_to_cstring(PG_GETARG_TEXT_PP(0)); + fail = PG_GETARG_BOOL(1); + } + else + { + DBLINK_GET_CONN; + sql = text_to_cstring(PG_GETARG_TEXT_PP(1)); + } + /* ignore third arg as it just provides a return rowtype */ + } } else if (PG_NARGS() == 2) { - /* text,text or text,bool */ + /* text,text or text,bool or text,anyelement */ if (get_fn_expr_argtype(fcinfo->flinfo, 1) == BOOLOID) { conn = pconn->conn; sql = text_to_cstring(PG_GETARG_TEXT_PP(0)); fail = PG_GETARG_BOOL(1); } - else + else if (get_fn_expr_argtype(fcinfo->flinfo, 1) == TEXTOID) { DBLINK_GET_CONN; sql = text_to_cstring(PG_GETARG_TEXT_PP(1)); } + else + { + if (PG_ARGISNULL(0)) + PG_RETURN_NULL(); + + conn = pconn->conn; + sql = text_to_cstring(PG_GETARG_TEXT_PP(0)); + /* ignore second arg as it just provides a return rowtype */ + } } else if (PG_NARGS() == 1) { @@ -715,11 +756,32 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async) else /* is_async */ { /* get async result */ - if (PG_NARGS() == 2) + if (PG_NARGS() == 3) { - /* text,bool */ + /* text,bool,anyelement */ + if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) + PG_RETURN_NULL(); + DBLINK_GET_NAMED_CONN; fail = PG_GETARG_BOOL(1); + /* ignore third arg as it just provides a return rowtype */ + } + else if (PG_NARGS() == 2) + { + /* text,bool or text,anyelement */ + if (get_fn_expr_argtype(fcinfo->flinfo, 1) == BOOLOID) + { + DBLINK_GET_NAMED_CONN; + fail = PG_GETARG_BOOL(1); + } + else + { + if (PG_ARGISNULL(0)) + PG_RETURN_NULL(); + + DBLINK_GET_NAMED_CONN; + /* ignore second arg as it just provides a return rowtype */ + } } else if (PG_NARGS() == 1) {