diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c
index b19625bb9ef9959088a3895301c1ac28076345d8..67a9d30d64e850a16b84cfc53a32fed4a5a2f4f6 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 9a2e05a20e9b7be7924f99457cef565e933c122a..7f76ffc5018b7734a8a4ce325ba807a9bd4495fa 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;