Skip to content

Commit c99f820

Browse files
committed
Tweak dblink functions to use int4 arguments instead of int2,
to avoid having to write explicit casts. From Joe Conway.
1 parent 245b3d7 commit c99f820

File tree

2 files changed

+30
-12
lines changed

2 files changed

+30
-12
lines changed

contrib/dblink/dblink.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,9 @@ dblink_last_oid(PG_FUNCTION_ARGS)
10021002
}
10031003

10041004

1005+
#ifndef SHRT_MAX
1006+
#define SHRT_MAX (0x7FFF)
1007+
#endif
10051008
/*
10061009
* dblink_build_sql_insert
10071010
*
@@ -1028,7 +1031,8 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS)
10281031
Oid relid;
10291032
text *relname_text;
10301033
int16 *pkattnums;
1031-
int16 pknumatts;
1034+
int pknumatts_tmp;
1035+
int16 pknumatts = 0;
10321036
char **src_pkattvals;
10331037
char **tgt_pkattvals;
10341038
ArrayType *src_pkattvals_arry;
@@ -1057,7 +1061,11 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS)
10571061
elog(ERROR, "dblink_build_sql_insert: relation does not exist");
10581062

10591063
pkattnums = (int16 *) PG_GETARG_POINTER(1);
1060-
pknumatts = PG_GETARG_INT16(2);
1064+
pknumatts_tmp = PG_GETARG_INT32(2);
1065+
if (pknumatts_tmp <= SHRT_MAX)
1066+
pknumatts = pknumatts_tmp;
1067+
else
1068+
elog(ERROR, "Bad input value for pknumatts; too large");
10611069

10621070
/*
10631071
* There should be at least one key attribute
@@ -1167,7 +1175,8 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS)
11671175
Oid relid;
11681176
text *relname_text;
11691177
int16 *pkattnums;
1170-
int16 pknumatts;
1178+
int pknumatts_tmp;
1179+
int16 pknumatts = 0;
11711180
char **tgt_pkattvals;
11721181
ArrayType *tgt_pkattvals_arry;
11731182
int tgt_ndim;
@@ -1191,7 +1200,11 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS)
11911200
elog(ERROR, "dblink_build_sql_delete: relation does not exist");
11921201

11931202
pkattnums = (int16 *) PG_GETARG_POINTER(1);
1194-
pknumatts = PG_GETARG_INT16(2);
1203+
pknumatts_tmp = PG_GETARG_INT32(2);
1204+
if (pknumatts_tmp <= SHRT_MAX)
1205+
pknumatts = pknumatts_tmp;
1206+
else
1207+
elog(ERROR, "Bad input value for pknumatts; too large");
11951208

11961209
/*
11971210
* There should be at least one key attribute
@@ -1274,7 +1287,8 @@ dblink_build_sql_update(PG_FUNCTION_ARGS)
12741287
Oid relid;
12751288
text *relname_text;
12761289
int16 *pkattnums;
1277-
int16 pknumatts;
1290+
int pknumatts_tmp;
1291+
int16 pknumatts = 0;
12781292
char **src_pkattvals;
12791293
char **tgt_pkattvals;
12801294
ArrayType *src_pkattvals_arry;
@@ -1303,7 +1317,11 @@ dblink_build_sql_update(PG_FUNCTION_ARGS)
13031317
elog(ERROR, "dblink_build_sql_update: relation does not exist");
13041318

13051319
pkattnums = (int16 *) PG_GETARG_POINTER(1);
1306-
pknumatts = PG_GETARG_INT16(2);
1320+
pknumatts_tmp = PG_GETARG_INT32(2);
1321+
if (pknumatts_tmp <= SHRT_MAX)
1322+
pknumatts = pknumatts_tmp;
1323+
else
1324+
elog(ERROR, "Bad input value for pknumatts; too large");
13071325

13081326
/*
13091327
* There should be one source array key values for each key attnum

contrib/dblink/dblink.sql.in

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,15 @@ CREATE OR REPLACE FUNCTION dblink_get_pkey (text) RETURNS setof dblink_pkey_resu
5757
AS 'MODULE_PATHNAME','dblink_get_pkey' LANGUAGE 'c'
5858
WITH (isstrict);
5959

60-
CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int2, _text, _text) RETURNS text
60+
CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text) RETURNS text
6161
AS 'MODULE_PATHNAME','dblink_build_sql_insert' LANGUAGE 'c'
6262
WITH (isstrict);
6363

64-
CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int2, _text) RETURNS text
64+
CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text) RETURNS text
6565
AS 'MODULE_PATHNAME','dblink_build_sql_delete' LANGUAGE 'c'
6666
WITH (isstrict);
6767

68-
CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int2, _text, _text) RETURNS text
68+
CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text) RETURNS text
6969
AS 'MODULE_PATHNAME','dblink_build_sql_update' LANGUAGE 'c'
7070
WITH (isstrict);
7171

@@ -82,8 +82,8 @@ GRANT EXECUTE ON FUNCTION dblink (text) TO PUBLIC;
8282
GRANT EXECUTE ON FUNCTION dblink_exec (text,text) TO PUBLIC;
8383
GRANT EXECUTE ON FUNCTION dblink_exec (text) TO PUBLIC;
8484
GRANT EXECUTE ON FUNCTION dblink_get_pkey (text) TO PUBLIC;
85-
GRANT EXECUTE ON FUNCTION dblink_build_sql_insert (text, int2vector, int2, _text, _text) TO PUBLIC;
86-
GRANT EXECUTE ON FUNCTION dblink_build_sql_delete (text, int2vector, int2, _text) TO PUBLIC;
87-
GRANT EXECUTE ON FUNCTION dblink_build_sql_update (text, int2vector, int2, _text, _text) TO PUBLIC;
85+
GRANT EXECUTE ON FUNCTION dblink_build_sql_insert (text, int2vector, int4, _text, _text) TO PUBLIC;
86+
GRANT EXECUTE ON FUNCTION dblink_build_sql_delete (text, int2vector, int4, _text) TO PUBLIC;
87+
GRANT EXECUTE ON FUNCTION dblink_build_sql_update (text, int2vector, int4, _text, _text) TO PUBLIC;
8888
GRANT EXECUTE ON FUNCTION dblink_current_query () TO PUBLIC;
8989

0 commit comments

Comments
 (0)