This is a multi-part message in MIME format.
--------------040308030500000509010603
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Tom Lane wrote:
> This isn't going to fix the problem --- all the functions are still
> declared to take type NAME, which will not be long enough for
> qualified names. You need to replace the use of NAME with use of
> TEXT.
> I don't particularly care for that answer. Would instead suggest you
> borrow the coding now being used in sequence.c and other places where
> text arguments are interpreted as relation names:
OK - this patch is a bit larger -- followed your advise, and moved
internal declarations from dblink.h to dblink.c while I was at it.
Please apply if there are no more objections.
Thanks,
Joe
--------------040308030500000509010603
Content-Type: text/plain; name="dblink.2002.05.27.1.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="dblink.2002.05.27.1.patch"
Index: contrib/dblink//README.dblink
===================================================================
RCS file: /opt/src/cvs/pgsql/contrib/dblink/README.dblink,v
retrieving revision 1.4
diff -c -r1.4 README.dblink
*** contrib/dblink//README.dblink 24 Apr 2002 02:28:28 -0000 1.4
--- contrib/dblink//README.dblink 27 May 2002 18:56:04 -0000
***************
*** 65,81 ****
- extracts and returns individual field results
dblink_strtok(text,text,int) RETURNS text
- extracts and returns individual token from delimited text
! dblink_get_pkey(name) RETURNS setof text
- returns the field names of a relation's primary key fields
dblink_last_oid(int) RETURNS oid
- returns the last inserted oid
! dblink_build_sql_insert(name,int2vector,int2,_text,_text) RETURNS text
- builds an insert statement using a local tuple, replacing the
selection key field values with alternate supplied values
! dblink_build_sql_delete(name,int2vector,int2,_text) RETURNS text
- builds a delete statement using supplied values for selection
key field values
! dblink_build_sql_update(name,int2vector,int2,_text,_text) RETURNS text
- builds an update statement using a local tuple, replacing the
selection key field values with alternate supplied values
dblink_current_query() RETURNS text
--- 65,81 ----
- extracts and returns individual field results
dblink_strtok(text,text,int) RETURNS text
- extracts and returns individual token from delimited text
! dblink_get_pkey(text) RETURNS setof text
- returns the field names of a relation's primary key fields
dblink_last_oid(int) RETURNS oid
- returns the last inserted oid
! dblink_build_sql_insert(text,int2vector,int2,_text,_text) RETURNS text
- builds an insert statement using a local tuple, replacing the
selection key field values with alternate supplied values
! dblink_build_sql_delete(text,int2vector,int2,_text) RETURNS text
- builds a delete statement using supplied values for selection
key field values
! dblink_build_sql_update(text,int2vector,int2,_text,_text) RETURNS text
- builds an update statement using a local tuple, replacing the
selection key field values with alternate supplied values
dblink_current_query() RETURNS text
***************
*** 206,212 ****
Synopsis
! dblink_get_pkey(name relname) RETURNS setof text
Inputs
--- 206,212 ----
Synopsis
! dblink_get_pkey(text relname) RETURNS setof text
Inputs
***************
*** 278,293 ****
Synopsis
! dblink_build_sql_insert(name relname
,int2vector primary_key_attnums
,int2 num_primary_key_atts
,_text src_pk_att_vals_array
,_text tgt_pk_att_vals_array) RETURNS text
! dblink_build_sql_delete(name relname
,int2vector primary_key_attnums
,int2 num_primary_key_atts
,_text tgt_pk_att_vals_array) RETURNS text
! dblink_build_sql_update(name relname
,int2vector primary_key_attnums
,int2 num_primary_key_atts
,_text src_pk_att_vals_array
--- 278,293 ----
Synopsis
! dblink_build_sql_insert(text relname
,int2vector primary_key_attnums
,int2 num_primary_key_atts
,_text src_pk_att_vals_array
,_text tgt_pk_att_vals_array) RETURNS text
! dblink_build_sql_delete(text relname
,int2vector primary_key_attnums
,int2 num_primary_key_atts
,_text tgt_pk_att_vals_array) RETURNS text
! dblink_build_sql_update(text relname
,int2vector primary_key_attnums
,int2 num_primary_key_atts
,_text src_pk_att_vals_array
Index: contrib/dblink//dblink.c
===================================================================
RCS file: /opt/src/cvs/pgsql/contrib/dblink/dblink.c,v
retrieving revision 1.6
diff -c -r1.6 dblink.c
*** contrib/dblink//dblink.c 20 May 2002 23:51:40 -0000 1.6
--- contrib/dblink//dblink.c 27 May 2002 21:19:44 -0000
***************
*** 27,32 ****
--- 27,52 ----
#include "dblink.h"
+
+ /*
+ * Internal declarations
+ */
+ static dblink_results *init_dblink_results(MemoryContext fn_mcxt);
+ static dblink_array_results *init_dblink_array_results(MemoryContext fn_mcxt);
+ static char **get_pkey_attnames(Oid relid, int16 *numatts);
+ static char *get_strtok(char *fldtext, char *fldsep, int fldnum);
+ static char *get_sql_insert(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals, char **tgt_pkattvals);
+ static char *get_sql_delete(Oid relid, int16 *pkattnums, int16 pknumatts, char **tgt_pkattvals);
+ static char *get_sql_update(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals, char **tgt_pkattvals);
+ static char *quote_literal_cstr(char *rawstr);
+ static char *quote_ident_cstr(char *rawstr);
+ static int16 get_attnum_pk_pos(int16 *pkattnums, int16 pknumatts, int16 key);
+ static HeapTuple get_tuple_of_interest(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals);
+ static Oid get_relid_from_relname(text *relname_text);
+ static dblink_results *get_res_ptr(int32 res_id_index);
+ static void append_res_ptr(dblink_results *results);
+ static void remove_res_ptr(dblink_results *results);
+
/* Global */
List *res_id = NIL;
int res_id_index = 0;
***************
*** 281,287 ****
Datum
dblink_get_pkey(PG_FUNCTION_ARGS)
{
! char *relname;
Oid relid;
char **result;
text *result_text;
--- 301,307 ----
Datum
dblink_get_pkey(PG_FUNCTION_ARGS)
{
! text *relname_text;
Oid relid;
char **result;
text *result_text;
***************
*** 294,308 ****
if (fcinfo->flinfo->fn_extra == NULL)
{
! relname = NameStr(*PG_GETARG_NAME(0));
/*
* Convert relname to rel OID.
*/
! relid = get_relid_from_relname(relname);
if (!OidIsValid(relid))
! elog(ERROR, "dblink_get_pkey: relation \"%s\" does not exist",
! relname);
/*
* get an array of attnums.
--- 314,327 ----
if (fcinfo->flinfo->fn_extra == NULL)
{
! relname_text = PG_GETARG_TEXT_P(0);
/*
* Convert relname to rel OID.
*/
! relid = get_relid_from_relname(relname_text);
if (!OidIsValid(relid))
! elog(ERROR, "dblink_get_pkey: relation does not exist");
/*
* get an array of attnums.
***************
*** 428,434 ****
dblink_build_sql_insert(PG_FUNCTION_ARGS)
{
Oid relid;
! char *relname;
int16 *pkattnums;
int16 pknumatts;
char **src_pkattvals;
--- 447,453 ----
dblink_build_sql_insert(PG_FUNCTION_ARGS)
{
Oid relid;
! text *relname_text;
int16 *pkattnums;
int16 pknumatts;
char **src_pkattvals;
***************
*** 446,460 ****
char *sql;
text *sql_text;
! relname = NameStr(*PG_GETARG_NAME(0));
/*
* Convert relname to rel OID.
*/
! relid = get_relid_from_relname(relname);
if (!OidIsValid(relid))
! elog(ERROR, "dblink_get_pkey: relation \"%s\" does not exist",
! relname);
pkattnums = (int16 *) PG_GETARG_POINTER(1);
pknumatts = PG_GETARG_INT16(2);
--- 465,478 ----
char *sql;
text *sql_text;
! relname_text = PG_GETARG_TEXT_P(0);
/*
* Convert relname to rel OID.
*/
! relid = get_relid_from_relname(relname_text);
if (!OidIsValid(relid))
! elog(ERROR, "dblink_build_sql_insert: relation does not exist");
pkattnums = (int16 *) PG_GETARG_POINTER(1);
pknumatts = PG_GETARG_INT16(2);
***************
*** 554,560 ****
dblink_build_sql_delete(PG_FUNCTION_ARGS)
{
Oid relid;
! char *relname;
int16 *pkattnums;
int16 pknumatts;
char **tgt_pkattvals;
--- 572,578 ----
dblink_build_sql_delete(PG_FUNCTION_ARGS)
{
Oid relid;
! text *relname_text;
int16 *pkattnums;
int16 pknumatts;
char **tgt_pkattvals;
***************
*** 567,581 ****
char *sql;
text *sql_text;
! relname = NameStr(*PG_GETARG_NAME(0));
/*
* Convert relname to rel OID.
*/
! relid = get_relid_from_relname(relname);
if (!OidIsValid(relid))
! elog(ERROR, "dblink_get_pkey: relation \"%s\" does not exist",
! relname);
pkattnums = (int16 *) PG_GETARG_POINTER(1);
pknumatts = PG_GETARG_INT16(2);
--- 585,598 ----
char *sql;
text *sql_text;
! relname_text = PG_GETARG_TEXT_P(0);
/*
* Convert relname to rel OID.
*/
! relid = get_relid_from_relname(relname_text);
if (!OidIsValid(relid))
! elog(ERROR,
...
read more »