From c99f82005320baffd5d0a976f247090a94873986 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 23 Sep 2002 18:03:32 +0000
Subject: [PATCH] Tweak dblink functions to use int4 arguments instead of int2,
 to avoid having to write explicit casts.  From Joe Conway.

---
 contrib/dblink/dblink.c      | 30 ++++++++++++++++++++++++------
 contrib/dblink/dblink.sql.in | 12 ++++++------
 2 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c
index b19625bb9ef..67a9d30d64e 100644
--- a/contrib/dblink/dblink.c
+++ b/contrib/dblink/dblink.c
@@ -1002,6 +1002,9 @@ dblink_last_oid(PG_FUNCTION_ARGS)
 }
 
 
+#ifndef SHRT_MAX
+#define SHRT_MAX (0x7FFF)
+#endif
 /*
  * dblink_build_sql_insert
  *
@@ -1028,7 +1031,8 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS)
 	Oid			relid;
 	text	   *relname_text;
 	int16	   *pkattnums;
-	int16		pknumatts;
+	int			pknumatts_tmp;
+	int16		pknumatts = 0;
 	char	  **src_pkattvals;
 	char	  **tgt_pkattvals;
 	ArrayType  *src_pkattvals_arry;
@@ -1057,7 +1061,11 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS)
 		elog(ERROR, "dblink_build_sql_insert: relation does not exist");
 
 	pkattnums = (int16 *) PG_GETARG_POINTER(1);
-	pknumatts = PG_GETARG_INT16(2);
+	pknumatts_tmp = PG_GETARG_INT32(2);
+	if (pknumatts_tmp <= SHRT_MAX)
+		pknumatts = pknumatts_tmp;
+	else
+		elog(ERROR, "Bad input value for pknumatts; too large");
 
 	/*
 	 * There should be at least one key attribute
@@ -1167,7 +1175,8 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS)
 	Oid			relid;
 	text	   *relname_text;
 	int16	   *pkattnums;
-	int16		pknumatts;
+	int			pknumatts_tmp;
+	int16		pknumatts = 0;
 	char	  **tgt_pkattvals;
 	ArrayType  *tgt_pkattvals_arry;
 	int			tgt_ndim;
@@ -1191,7 +1200,11 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS)
 		elog(ERROR, "dblink_build_sql_delete: relation does not exist");
 
 	pkattnums = (int16 *) PG_GETARG_POINTER(1);
-	pknumatts = PG_GETARG_INT16(2);
+	pknumatts_tmp = PG_GETARG_INT32(2);
+	if (pknumatts_tmp <= SHRT_MAX)
+		pknumatts = pknumatts_tmp;
+	else
+		elog(ERROR, "Bad input value for pknumatts; too large");
 
 	/*
 	 * There should be at least one key attribute
@@ -1274,7 +1287,8 @@ dblink_build_sql_update(PG_FUNCTION_ARGS)
 	Oid			relid;
 	text	   *relname_text;
 	int16	   *pkattnums;
-	int16		pknumatts;
+	int			pknumatts_tmp;
+	int16		pknumatts = 0;
 	char	  **src_pkattvals;
 	char	  **tgt_pkattvals;
 	ArrayType  *src_pkattvals_arry;
@@ -1303,7 +1317,11 @@ dblink_build_sql_update(PG_FUNCTION_ARGS)
 		elog(ERROR, "dblink_build_sql_update: relation does not exist");
 
 	pkattnums = (int16 *) PG_GETARG_POINTER(1);
-	pknumatts = PG_GETARG_INT16(2);
+	pknumatts_tmp = PG_GETARG_INT32(2);
+	if (pknumatts_tmp <= SHRT_MAX)
+		pknumatts = pknumatts_tmp;
+	else
+		elog(ERROR, "Bad input value for pknumatts; too large");
 
 	/*
 	 * There should be one source array key values for each key attnum
diff --git a/contrib/dblink/dblink.sql.in b/contrib/dblink/dblink.sql.in
index 9a2e05a20e9..7f76ffc5018 100644
--- a/contrib/dblink/dblink.sql.in
+++ b/contrib/dblink/dblink.sql.in
@@ -57,15 +57,15 @@ CREATE OR REPLACE FUNCTION dblink_get_pkey (text) RETURNS setof dblink_pkey_resu
   AS 'MODULE_PATHNAME','dblink_get_pkey' LANGUAGE 'c'
   WITH (isstrict);
 
-CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int2, _text, _text) RETURNS text
+CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text) RETURNS text
   AS 'MODULE_PATHNAME','dblink_build_sql_insert' LANGUAGE 'c'
   WITH (isstrict);
 
-CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int2, _text) RETURNS text
+CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text) RETURNS text
   AS 'MODULE_PATHNAME','dblink_build_sql_delete' LANGUAGE 'c'
   WITH (isstrict);
 
-CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int2, _text, _text) RETURNS text
+CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text) RETURNS text
   AS 'MODULE_PATHNAME','dblink_build_sql_update' LANGUAGE 'c'
   WITH (isstrict);
 
@@ -82,8 +82,8 @@ GRANT EXECUTE ON FUNCTION dblink (text) TO PUBLIC;
 GRANT EXECUTE ON FUNCTION dblink_exec (text,text) TO PUBLIC;
 GRANT EXECUTE ON FUNCTION dblink_exec (text) TO PUBLIC;
 GRANT EXECUTE ON FUNCTION dblink_get_pkey (text) TO PUBLIC;
-GRANT EXECUTE ON FUNCTION dblink_build_sql_insert (text, int2vector, int2, _text, _text) TO PUBLIC;
-GRANT EXECUTE ON FUNCTION dblink_build_sql_delete (text, int2vector, int2, _text) TO PUBLIC;
-GRANT EXECUTE ON FUNCTION dblink_build_sql_update (text, int2vector, int2, _text, _text) TO PUBLIC;
+GRANT EXECUTE ON FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text) TO PUBLIC;
+GRANT EXECUTE ON FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text) TO PUBLIC;
+GRANT EXECUTE ON FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text) TO PUBLIC;
 GRANT EXECUTE ON FUNCTION dblink_current_query () TO PUBLIC;
 
-- 
GitLab