if (from == NULL || from->numParams <= 0) return NULL;
retval = makeParamList(from->numParams);
for (int i = 0; i < from->numParams; i++)
{
ParamExternData *oprm;
ParamExternData *nprm = &retval->params[i];
ParamExternData prmdata;
int16 typLen; bool typByVal;
/* give hook a chance in case parameter is dynamic */ if (from->paramFetch != NULL)
oprm = from->paramFetch(from, i + 1, false, &prmdata); else
oprm = &from->params[i];
/* flat-copy the parameter info */
*nprm = *oprm;
/* need datumCopy in case it's a pass-by-reference datatype */ if (nprm->isnull || !OidIsValid(nprm->ptype)) continue;
get_typlenbyval(nprm->ptype, &typLen, &typByVal);
nprm->value = datumCopy(nprm->value, typByVal, typLen);
}
return retval;
}
/* *Setuptoparseaquerycontainingreferencestoparameters *sourcedfromaParamListInfo.
*/ staticvoid
paramlist_parser_setup(ParseState *pstate, void *arg)
{
pstate->p_paramref_hook = paramlist_param_ref; /* no need to use p_coerce_param_hook */
pstate->p_ref_hook_state = arg;
}
/* check parameter number is valid */ if (paramno <= 0 || paramno > paramLI->numParams) return NULL;
/* give hook a chance in case parameter is dynamic */ if (paramLI->paramFetch != NULL)
prm = paramLI->paramFetch(paramLI, paramno, false, &prmdata); else
prm = ¶mLI->params[paramno - 1];
if (paramLI == NULL || paramLI->numParams <= 0) return sz;
for (i = 0; i < paramLI->numParams; i++)
{
ParamExternData *prm;
ParamExternData prmdata;
Oid typeOid;
int16 typLen; bool typByVal;
/* give hook a chance in case parameter is dynamic */ if (paramLI->paramFetch != NULL)
prm = paramLI->paramFetch(paramLI, i + 1, false, &prmdata); else
prm = ¶mLI->params[i];
typeOid = prm->ptype;
sz = add_size(sz, sizeof(Oid)); /* space for type OID */
sz = add_size(sz, sizeof(uint16)); /* space for pflags */
/* space for datum/isnull */ if (OidIsValid(typeOid))
get_typlenbyval(typeOid, &typLen, &typByVal); else
{ /* If no type OID, assume by-value, like copyParamList does. */
typLen = sizeof(Datum);
typByVal = true;
}
sz = add_size(sz,
datumEstimateSpace(prm->value, prm->isnull, typByVal, typLen));
}
/* Write number of parameters. */ if (paramLI == NULL || paramLI->numParams <= 0)
nparams = 0; else
nparams = paramLI->numParams;
memcpy(*start_address, &nparams, sizeof(int));
*start_address += sizeof(int);
/* Write each parameter in turn. */ for (i = 0; i < nparams; i++)
{
ParamExternData *prm;
ParamExternData prmdata;
Oid typeOid;
int16 typLen; bool typByVal;
/* give hook a chance in case parameter is dynamic */ if (paramLI->paramFetch != NULL)
prm = paramLI->paramFetch(paramLI, i + 1, false, &prmdata); else
prm = ¶mLI->params[i];
/* Initialize the output stringinfo, in caller's memory context */
initStringInfo(&buf);
/* Use a temporary context to call output functions, just in case */
tmpCxt = AllocSetContextCreate(CurrentMemoryContext, "BuildParamLogString",
ALLOCSET_DEFAULT_SIZES);
oldCxt = MemoryContextSwitchTo(tmpCxt);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.