@ -15,6 +15,7 @@
# include "postgres.h"
# include "postgres.h"
# include "nodes/bitmapset.h"
# include "nodes/params.h"
# include "nodes/params.h"
# include "storage/shmem.h"
# include "storage/shmem.h"
# include "utils/datum.h"
# include "utils/datum.h"
@ -50,6 +51,7 @@ copyParamList(ParamListInfo from)
retval - > parserSetup = NULL ;
retval - > parserSetup = NULL ;
retval - > parserSetupArg = NULL ;
retval - > parserSetupArg = NULL ;
retval - > numParams = from - > numParams ;
retval - > numParams = from - > numParams ;
retval - > paramMask = NULL ;
for ( i = 0 ; i < from - > numParams ; i + + )
for ( i = 0 ; i < from - > numParams ; i + + )
{
{
@ -58,6 +60,17 @@ copyParamList(ParamListInfo from)
int16 typLen ;
int16 typLen ;
bool typByVal ;
bool typByVal ;
/* Ignore parameters we don't need, to save cycles and space. */
if ( retval - > paramMask ! = NULL & &
! bms_is_member ( i , retval - > paramMask ) )
{
nprm - > value = ( Datum ) 0 ;
nprm - > isnull = true ;
nprm - > pflags = 0 ;
nprm - > ptype = InvalidOid ;
continue ;
}
/* give hook a chance in case parameter is dynamic */
/* give hook a chance in case parameter is dynamic */
if ( ! OidIsValid ( oprm - > ptype ) & & from - > paramFetch ! = NULL )
if ( ! OidIsValid ( oprm - > ptype ) & & from - > paramFetch ! = NULL )
( * from - > paramFetch ) ( from , i + 1 ) ;
( * from - > paramFetch ) ( from , i + 1 ) ;
@ -90,19 +103,28 @@ EstimateParamListSpace(ParamListInfo paramLI)
for ( i = 0 ; i < paramLI - > numParams ; i + + )
for ( i = 0 ; i < paramLI - > numParams ; i + + )
{
{
ParamExternData * prm = & paramLI - > params [ i ] ;
ParamExternData * prm = & paramLI - > params [ i ] ;
Oid typeOid ;
int16 typLen ;
int16 typLen ;
bool typByVal ;
bool typByVal ;
/* give hook a chance in case parameter is dynamic */
/* Ignore parameters we don't need, to save cycles and space. */
if ( ! OidIsValid ( prm - > ptype ) & & paramLI - > paramFetch ! = NULL )
if ( paramLI - > paramMask ! = NULL & &
( * paramLI - > paramFetch ) ( paramLI , i + 1 ) ;
! bms_is_member ( i , paramLI - > paramMask ) )
typeOid = InvalidOid ;
else
{
/* give hook a chance in case parameter is dynamic */
if ( ! OidIsValid ( prm - > ptype ) & & paramLI - > paramFetch ! = NULL )
( * paramLI - > paramFetch ) ( paramLI , i + 1 ) ;
typeOid = prm - > ptype ;
}
sz = add_size ( sz , sizeof ( Oid ) ) ; /* space for type OID */
sz = add_size ( sz , sizeof ( Oid ) ) ; /* space for type OID */
sz = add_size ( sz , sizeof ( uint16 ) ) ; /* space for pflags */
sz = add_size ( sz , sizeof ( uint16 ) ) ; /* space for pflags */
/* space for datum/isnull */
/* space for datum/isnull */
if ( OidIsValid ( prm - > ptype ) )
if ( OidIsValid ( typeOid ) )
get_typlenbyval ( prm - > ptype , & typLen , & typByVal ) ;
get_typlenbyval ( typeOid , & typLen , & typByVal ) ;
else
else
{
{
/* If no type OID, assume by-value, like copyParamList does. */
/* If no type OID, assume by-value, like copyParamList does. */
@ -150,15 +172,24 @@ SerializeParamList(ParamListInfo paramLI, char **start_address)
for ( i = 0 ; i < nparams ; i + + )
for ( i = 0 ; i < nparams ; i + + )
{
{
ParamExternData * prm = & paramLI - > params [ i ] ;
ParamExternData * prm = & paramLI - > params [ i ] ;
Oid typeOid ;
int16 typLen ;
int16 typLen ;
bool typByVal ;
bool typByVal ;
/* give hook a chance in case parameter is dynamic */
/* Ignore parameters we don't need, to save cycles and space. */
if ( ! OidIsValid ( prm - > ptype ) & & paramLI - > paramFetch ! = NULL )
if ( paramLI - > paramMask ! = NULL & &
( * paramLI - > paramFetch ) ( paramLI , i + 1 ) ;
! bms_is_member ( i , paramLI - > paramMask ) )
typeOid = InvalidOid ;
else
{
/* give hook a chance in case parameter is dynamic */
if ( ! OidIsValid ( prm - > ptype ) & & paramLI - > paramFetch ! = NULL )
( * paramLI - > paramFetch ) ( paramLI , i + 1 ) ;
typeOid = prm - > ptype ;
}
/* Write type OID. */
/* Write type OID. */
memcpy ( * start_address , & prm - > ptype , sizeof ( Oid ) ) ;
memcpy ( * start_address , & typeOid , sizeof ( Oid ) ) ;
* start_address + = sizeof ( Oid ) ;
* start_address + = sizeof ( Oid ) ;
/* Write flags. */
/* Write flags. */
@ -166,8 +197,8 @@ SerializeParamList(ParamListInfo paramLI, char **start_address)
* start_address + = sizeof ( uint16 ) ;
* start_address + = sizeof ( uint16 ) ;
/* Write datum/isnull. */
/* Write datum/isnull. */
if ( OidIsValid ( prm - > p type) )
if ( OidIsValid ( typeOid ) )
get_typlenbyval ( prm - > p type, & typLen , & typByVal ) ;
get_typlenbyval ( typeOid , & typLen , & typByVal ) ;
else
else
{
{
/* If no type OID, assume by-value, like copyParamList does. */
/* If no type OID, assume by-value, like copyParamList does. */
@ -209,6 +240,7 @@ RestoreParamList(char **start_address)
paramLI - > parserSetup = NULL ;
paramLI - > parserSetup = NULL ;
paramLI - > parserSetupArg = NULL ;
paramLI - > parserSetupArg = NULL ;
paramLI - > numParams = nparams ;
paramLI - > numParams = nparams ;
paramLI - > paramMask = NULL ;
for ( i = 0 ; i < nparams ; i + + )
for ( i = 0 ; i < nparams ; i + + )
{
{