@ -8,7 +8,7 @@
* Darko Prenosil < Darko . Prenosil @ finteh . hr >
* Darko Prenosil < Darko . Prenosil @ finteh . hr >
* Shridhar Daithankar < shridhar_daithankar @ persistent . co . in >
* Shridhar Daithankar < shridhar_daithankar @ persistent . co . in >
*
*
* $ PostgreSQL : pgsql / contrib / dblink / dblink . c , v 1.82 .2 .7 2010 / 06 / 15 16 : 22 : 26 tgl Exp $
* $ PostgreSQL : pgsql / contrib / dblink / dblink . c , v 1.82 .2 .8 2010 / 06 / 15 19 : 04 : 22 tgl Exp $
* Copyright ( c ) 2001 - 2009 , PostgreSQL Global Development Group
* Copyright ( c ) 2001 - 2009 , PostgreSQL Global Development Group
* ALL RIGHTS RESERVED ;
* ALL RIGHTS RESERVED ;
*
*
@ -1777,7 +1777,7 @@ get_sql_insert(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals
appendStringInfo ( & buf , " ) VALUES( " ) ;
appendStringInfo ( & buf , " ) VALUES( " ) ;
/*
/*
* remember attvals are 1 based
* Note : i is physical column number ( counting from 0 ) .
*/
*/
needComma = false ;
needComma = false ;
for ( i = 0 ; i < natts ; i + + )
for ( i = 0 ; i < natts ; i + + )
@ -1788,12 +1788,9 @@ get_sql_insert(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals
if ( needComma )
if ( needComma )
appendStringInfo ( & buf , " , " ) ;
appendStringInfo ( & buf , " , " ) ;
if ( tgt_pkattvals ! = NULL )
key = get_attnum_pk_pos ( pkattnums , pknumatts , i ) ;
key = get_attnum_pk_pos ( pkattnums , pknumatts , i ) ;
else
key = - 1 ;
if ( key > - 1 )
if ( key > = 0 )
val = tgt_pkattvals [ key ] ? pstrdup ( tgt_pkattvals [ key ] ) : NULL ;
val = tgt_pkattvals [ key ] ? pstrdup ( tgt_pkattvals [ key ] ) : NULL ;
else
else
val = SPI_getvalue ( tuple , tupdesc , i + 1 ) ;
val = SPI_getvalue ( tuple , tupdesc , i + 1 ) ;
@ -1838,10 +1835,6 @@ get_sql_delete(Relation rel, int *pkattnums, int pknumatts, char **tgt_pkattvals
appendStringInfoString ( & buf ,
appendStringInfoString ( & buf ,
quote_ident_cstr ( NameStr ( tupdesc - > attrs [ pkattnum ] - > attname ) ) ) ;
quote_ident_cstr ( NameStr ( tupdesc - > attrs [ pkattnum ] - > attname ) ) ) ;
if ( tgt_pkattvals = = NULL )
/* internal error */
elog ( ERROR , " target key array must not be NULL " ) ;
if ( tgt_pkattvals [ i ] ! = NULL )
if ( tgt_pkattvals [ i ] ! = NULL )
appendStringInfo ( & buf , " = %s " ,
appendStringInfo ( & buf , " = %s " ,
quote_literal_cstr ( tgt_pkattvals [ i ] ) ) ;
quote_literal_cstr ( tgt_pkattvals [ i ] ) ) ;
@ -1881,6 +1874,9 @@ get_sql_update(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals
appendStringInfo ( & buf , " UPDATE %s SET " , relname ) ;
appendStringInfo ( & buf , " UPDATE %s SET " , relname ) ;
/*
* Note : i is physical column number ( counting from 0 ) .
*/
needComma = false ;
needComma = false ;
for ( i = 0 ; i < natts ; i + + )
for ( i = 0 ; i < natts ; i + + )
{
{
@ -1893,12 +1889,9 @@ get_sql_update(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals
appendStringInfo ( & buf , " %s = " ,
appendStringInfo ( & buf , " %s = " ,
quote_ident_cstr ( NameStr ( tupdesc - > attrs [ i ] - > attname ) ) ) ;
quote_ident_cstr ( NameStr ( tupdesc - > attrs [ i ] - > attname ) ) ) ;
if ( tgt_pkattvals ! = NULL )
key = get_attnum_pk_pos ( pkattnums , pknumatts , i ) ;
key = get_attnum_pk_pos ( pkattnums , pknumatts , i ) ;
else
key = - 1 ;
if ( key > - 1 )
if ( key > = 0 )
val = tgt_pkattvals [ key ] ? pstrdup ( tgt_pkattvals [ key ] ) : NULL ;
val = tgt_pkattvals [ key ] ? pstrdup ( tgt_pkattvals [ key ] ) : NULL ;
else
else
val = SPI_getvalue ( tuple , tupdesc , i + 1 ) ;
val = SPI_getvalue ( tuple , tupdesc , i + 1 ) ;
@ -1925,16 +1918,10 @@ get_sql_update(Relation rel, int *pkattnums, int pknumatts, char **src_pkattvals
appendStringInfo ( & buf , " %s " ,
appendStringInfo ( & buf , " %s " ,
quote_ident_cstr ( NameStr ( tupdesc - > attrs [ pkattnum ] - > attname ) ) ) ;
quote_ident_cstr ( NameStr ( tupdesc - > attrs [ pkattnum ] - > attname ) ) ) ;
if ( tgt_pkattvals ! = NULL )
val = tgt_pkattvals [ i ] ;
val = tgt_pkattvals [ i ] ? pstrdup ( tgt_pkattvals [ i ] ) : NULL ;
else
val = SPI_getvalue ( tuple , tupdesc , pkattnum + 1 ) ;
if ( val ! = NULL )
if ( val ! = NULL )
{
appendStringInfo ( & buf , " = %s " , quote_literal_cstr ( val ) ) ;
appendStringInfo ( & buf , " = %s " , quote_literal_cstr ( val ) ) ;
pfree ( val ) ;
}
else
else
appendStringInfo ( & buf , " IS NULL " ) ;
appendStringInfo ( & buf , " IS NULL " ) ;
}
}
@ -2000,30 +1987,49 @@ get_tuple_of_interest(Relation rel, int *pkattnums, int pknumatts, char **src_pk
{
{
char * relname ;
char * relname ;
TupleDesc tupdesc ;
TupleDesc tupdesc ;
int natts ;
StringInfoData buf ;
StringInfoData buf ;
int ret ;
int ret ;
HeapTuple tuple ;
HeapTuple tuple ;
int i ;
int i ;
/*
* Connect to SPI manager
*/
if ( ( ret = SPI_connect ( ) ) < 0 )
/* internal error */
elog ( ERROR , " SPI connect failure - returned %d " , ret ) ;
initStringInfo ( & buf ) ;
initStringInfo ( & buf ) ;
/* get relation name including any needed schema prefix and quoting */
/* get relation name including any needed schema prefix and quoting */
relname = generate_relation_name ( rel ) ;
relname = generate_relation_name ( rel ) ;
tupdesc = rel - > rd_att ;
tupdesc = rel - > rd_att ;
natts = tupdesc - > natts ;
/*
/*
* Connect to SPI manager
* Build sql statement to look up tuple of interest , ie , the one matching
* src_pkattvals . We used to use " SELECT * " here , but it ' s simpler to
* generate a result tuple that matches the table ' s physical structure ,
* with NULLs for any dropped columns . Otherwise we have to deal with
* two different tupdescs and everything ' s very confusing .
*/
*/
if ( ( ret = SPI_connect ( ) ) < 0 )
appendStringInfoString ( & buf , " SELECT " ) ;
/* internal error */
elog ( ERROR , " SPI connect failure - returned %d " , ret ) ;
/*
for ( i = 0 ; i < natts ; i + + )
* Build sql statement to look up tuple of interest Use src_pkattvals as
{
* the criteria .
if ( i > 0 )
*/
appendStringInfoString ( & buf , " , " ) ;
appendStringInfo ( & buf , " SELECT * FROM %s WHERE " , relname ) ;
if ( tupdesc - > attrs [ i ] - > attisdropped )
appendStringInfoString ( & buf , " NULL " ) ;
else
appendStringInfoString ( & buf ,
quote_ident_cstr ( NameStr ( tupdesc - > attrs [ i ] - > attname ) ) ) ;
}
appendStringInfo ( & buf , " FROM %s WHERE " , relname ) ;
for ( i = 0 ; i < pknumatts ; i + + )
for ( i = 0 ; i < pknumatts ; i + + )
{
{