diff options
Diffstat (limited to 'src/backend/nodes/params.c')
-rw-r--r-- | src/backend/nodes/params.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/backend/nodes/params.c b/src/backend/nodes/params.c new file mode 100644 index 00000000000..43bc40b9e1c --- /dev/null +++ b/src/backend/nodes/params.c @@ -0,0 +1,122 @@ +/*------------------------------------------------------------------------- + * + * params.c + * Support functions for plan parameter lists. + * + * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * $PostgreSQL: pgsql/src/backend/nodes/params.c,v 1.1 2004/08/02 01:30:42 tgl Exp $ + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "nodes/params.h" +#include "utils/datum.h" +#include "utils/lsyscache.h" + + +/* + * Copy a ParamList. + * + * The result is allocated in CurrentMemoryContext. + */ +ParamListInfo +copyParamList(ParamListInfo from) +{ + ParamListInfo retval; + int i, size; + + if (from == NULL) + return NULL; + + size = 0; + while (from[size].kind != PARAM_INVALID) + size++; + + retval = (ParamListInfo) palloc0((size + 1) * sizeof(ParamListInfoData)); + + for (i = 0; i < size; i++) { + /* copy metadata */ + retval[i].kind = from[i].kind; + if (from[i].kind == PARAM_NAMED) + retval[i].name = pstrdup(from[i].name); + retval[i].id = from[i].id; + retval[i].ptype = from[i].ptype; + + /* copy value */ + retval[i].isnull = from[i].isnull; + if (from[i].isnull) + { + retval[i].value = from[i].value; /* nulls just copy */ + } + else + { + int16 typLen; + bool typByVal; + + get_typlenbyval(from[i].ptype, &typLen, &typByVal); + retval[i].value = datumCopy(from[i].value, typByVal, typLen); + } + } + + retval[size].kind = PARAM_INVALID; + + return retval; +} + +/* + * Search a ParamList for a given parameter. + * + * On success, returns a pointer to the parameter's entry. + * On failure, returns NULL if noError is true, else ereports the error. + */ +ParamListInfo +lookupParam(ParamListInfo paramList, int thisParamKind, + const char *thisParamName, AttrNumber thisParamId, + bool noError) +{ + if (paramList != NULL) + { + while (paramList->kind != PARAM_INVALID) + { + if (thisParamKind == paramList->kind) + { + switch (thisParamKind) + { + case PARAM_NAMED: + if (strcmp(paramList->name, thisParamName) == 0) + return paramList; + break; + case PARAM_NUM: + if (paramList->id == thisParamId) + return paramList; + break; + default: + elog(ERROR, "unrecognized paramkind: %d", + thisParamKind); + } + } + paramList++; + } + } + + if (!noError) + { + if (thisParamKind == PARAM_NAMED) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("no value found for parameter \"%s\"", + thisParamName))); + else + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("no value found for parameter %d", + thisParamId))); + } + + return NULL; +} |