Hello
this patch carry support for named and mixed notation - more detailed
described at http://archive.adaic.com/standards/83rat/html/ratl-08-03.html.
This use ADA syntax - name => value, that is conntroversal and
problematic - so I expect change of syntax.
Regards
Pavel Stehule
*** ./src/backend/catalog/namespace.c.orig 2008-12-10 12:36:42.000000000 +0100
--- ./src/backend/catalog/namespace.c 2008-12-11 23:33:04.000000000 +0100
***************
*** 38,43 ****
--- 38,44 ----
#include "commands/dbcommands.h"
#include "miscadmin.h"
#include "nodes/makefuncs.h"
+ #include "nodes/parsenodes.h"
#include "parser/parse_func.h"
#include "storage/backendid.h"
#include "storage/ipc.h"
***************
*** 49,54 ****
--- 50,56 ----
#include "utils/memutils.h"
#include "utils/rel.h"
#include "utils/syscache.h"
+ #include "funcapi.h"
/*
***************
*** 584,590 ****
* functions to mask variadic ones if the expanded argument list is the same.
*/
FuncCandidateList
! FuncnameGetCandidates(List *names, int nargs, bool expand_variadic)
{
FuncCandidateList resultList = NULL;
bool any_variadic = false;
--- 586,593 ----
* functions to mask variadic ones if the expanded argument list is the same.
*/
FuncCandidateList
! FuncnameGetCandidates(List *names, int nargs, bool expand_variadic,
! Notation notation, List *argnames)
{
FuncCandidateList resultList = NULL;
bool any_variadic = false;
***************
*** 628,643 ****
Oid va_elem_type;
List *defaults = NIL;
FuncCandidateList newResult;
/*
* Check if function has some parameter defaults if some
* parameters are missing.
*/
! if (pronargs > nargs && expand_variadic)
{
bool isnull;
Datum proargdefaults;
char *str;
/* skip when not enough default expressions */
if (nargs + procform->pronargdefaults < pronargs)
--- 631,795 ----
Oid va_elem_type;
List *defaults = NIL;
FuncCandidateList newResult;
+ char *rparam_type = NULL;
+ short int *map_args = NULL;
+ short int *map_defaults = NULL;
+
+ /*
+ * Check named params if are used.
+ */
+ if (notation != POSITIONAL_NOTATION)
+ {
+ ListCell *lc;
+ int i;
+ Oid *p_argtypes;
+ char **p_argnames;
+ char *p_argmodes;
+ int pronallargs;
+ bool found_all;
+ bool any_default;
+ Notation actual_notation;
+ int j;
+
+ Assert(argnames != NIL);
+
+ pronallargs = get_func_arg_info(proctup, &p_argtypes, &p_argnames, &p_argmodes);
+ if (!p_argnames)
+ continue;
+
+ rparam_type = palloc(pronargs * sizeof(char));
+ map_args = palloc(pronargs * sizeof(short int));
+ map_defaults = palloc(pronargs * sizeof(short int));
+
+ /* now we know nothing about params */
+ for (j = 0; j < pronargs; j++)
+ {
+ rparam_type[j] = 'u';
+ map_args[j] = map_defaults[j] = -1;
+ }
+
+ defaults = NIL;
+ any_default = false;
+
+ /* if MIXED notation is used, then I have to copy positional arguments */
+ i = 0;
+ actual_notation = POSITIONAL_NOTATION;
+ found_all = true;
+
+ foreach(lc, argnames)
+ {
+ Node *strnode = lfirst(lc);
+
+ if (strnode == NULL && actual_notation == POSITIONAL_NOTATION)
+ {
+ rparam_type[i] = 'p';
+ map_args[i] = i;
+ }
+ /* found end of positional notation */
+ if (strnode != NULL && actual_notation == POSITIONAL_NOTATION)
+ actual_notation = NAMED_NOTATION;
+
+ Assert(actual_notation == POSITIONAL_NOTATION || strnode != NULL);
+
+ if (actual_notation == NAMED_NOTATION)
+ {
+ char *cargname = strVal(strnode);
+ int j;
+ bool found = false;
+ int k = 0;
+
+ for (j = 0; j < pronallargs; j++)
+ {
+ /* skip all OUT arguments */
+ if (p_argmodes && (p_argmodes[j] != FUNC_PARAM_IN && p_argmodes[j] != FUNC_PARAM_INOUT))
+ continue;
+
+ if (p_argnames[j] && strcmp(cargname, p_argnames[j]) == 0)
+ {
+ found = true;
+ break;
+ }
+
+ k += 1;
+ }
+
+ if (!found)
+ {
+ found_all = false;
+ break;
+ }
+ else
+ {
+ rparam_type[k] = 'n';
+ map_args[k] = i;
+ }
+ }
+
+ i += 1;
+ }
+
+ if (!found_all)
+ continue;
+
+ /* try to fill unknown params with defaults */
+ if (procform->pronargdefaults > 0)
+ {
+ bool isnull;
+ Datum proargdefaults;
+ char *str;
+ int pronargdefaults = procform->pronargdefaults;
+
+ proargdefaults = SysCacheGetAttr(PROCOID, proctup,
+ Anum_pg_proc_proargdefaults, &isnull);
+ Assert(!isnull);
+ str = TextDatumGetCString(proargdefaults);
+ defaults = (List *) stringToNode(str);
+
+ for (i = 0; i < pronargdefaults; i++)
+ {
+
+
+ if (rparam_type[pronargs - pronargdefaults + i] == 'u')
+ {
+ rparam_type[pronargs - pronargdefaults + i] = 'd';
+ map_defaults[pronargs - pronargdefaults + i] = i;
+ any_default = true;
+ }
+ }
+ /*
+ * When we don't use defaults, then don't carry defaults/
+ */
+ if (!any_default)
+ defaults = NIL;
+ }
+
+
+
+ /* check if we know all params */
+ for (i = 0; i < pronargs; i++)
+ if (rparam_type[i] == 'u')
+ {
+ found_all = false;
+ break;
+ }
+
+ if (!found_all)
+ break;
+
+ }
+
/*
* Check if function has some parameter defaults if some
* parameters are missing.
*/
! if (pronargs > nargs && expand_variadic && notation == POSITIONAL_NOTATION)
{
bool isnull;
Datum proargdefaults;
char *str;
+ ListCell *lc;
+ bool dirty_defaults = false;
/* skip when not enough default expressions */
if (nargs + procform->pronargdefaults < pronargs)
***************
*** 657,662 ****
--- 809,827 ----
*/
defaults = list_copy_tail(defaults, procform->pronargdefaults - pronargs + nargs);
+ /* For POSITIONAL_NOTATION all defaults have to not null */
+ foreach(lc, (List *) defaults)
+ if (lfirst(lc) == NULL)
+ {
+ dirty_defaults = true;
+ break;
+ }
+ if (dirty_defaults)
+ {
+ /* pfree ToDo */
+ continue;
+ }
+
pfree(str);
}
***************
*** 664,670 ****
* Check if function is variadic, and get variadic element type if so.
* If expand_variadic is false, we should just ignore variadic-ness.
*/
! if (pronargs <= nargs && expand_variadic)
{
va_elem_type = procform->provariadic;
variadic = OidIsValid(va_elem_type);
--- 829,835 ----
* Check if function is variadic, and get variadic element type if so.
* If expand_variadic is false, we should just ignore variadic-ness.
*/
! if (pronargs <= nargs && expand_variadic && notation == POSITIONAL_NOTATION)
{
va_elem_type = procform->provariadic;
variadic = OidIsValid(va_elem_type);
***************
*** 724,729 ****
--- 889,896 ----
newResult->oid = HeapTupleGetOid(proctup);
newResult->nargs = effective_nargs;
newResult->argdefaults = defaults;
+ newResult->map_args = map_args;
+ newResult->map_defaults = map_defaults;
memcpy(newResult->args, procform->proargtypes.values,
pronargs * sizeof(Oid));
if (variadic)
***************
*** 857,862 ****
--- 1024,1031 ----
prevResult->oid = newResult->oid;
prevResult->nvargs = newResult->nvargs;
prevResult->argdefaults = newResult->argdefaults;
+ prevResult->map_args = newResult->map_args;
+ prevResult->map_defaults = newResult->map_defaults;
pfree(newResult);
continue; /* args are same, of course */
}
***************
*** 922,928 ****
visible = false;
clist = FuncnameGetCandidates(list_make1(makeString(proname)),
! nargs, false);
for (; clist; clist = clist->next)
{
--- 1091,1097 ----
visible = false;
clist = FuncnameGetCandidates(list_make1(makeString(proname)),
! nargs, false, POSITIONAL_NOTATION, NIL);
for (; clist; clist = clist->next)
{
*** ./src/backend/catalog/pg_aggregate.c.orig 2008-12-10 12:17:49.000000000 +0100
--- ./src/backend/catalog/pg_aggregate.c 2008-12-11 13:47:20.000000000 +0100
***************
*** 320,328 ****
* function's return value. it also returns the true argument types to
* the function.
*/
! fdresult = func_get_detail(fnName, NIL, nargs, input_types, false,
&fnOid, rettype, &retset, &nvargs,
! &true_oid_array, NULL);
/* only valid case is a normal function not returning a set */
if (fdresult != FUNCDETAIL_NORMAL || !OidIsValid(fnOid))
--- 320,328 ----
* function's return value. it also returns the true argument types to
* the function.
*/
! fdresult = func_get_detail(fnName, NIL, nargs, input_types, false, POSITIONAL_NOTATION, NIL,
&fnOid, rettype, &retset, &nvargs,
! &true_oid_array, NULL, NULL, NULL, NULL);
/* only valid case is a normal function not returning a set */
if (fdresult != FUNCDETAIL_NORMAL || !OidIsValid(fnOid))
*** ./src/backend/commands/functioncmds.c.orig 2008-12-08 23:46:06.000000000 +0100
--- ./src/backend/commands/functioncmds.c 2008-12-11 15:44:45.000000000 +0100
***************
*** 301,312 ****
have_defaults = true;
}
else
! {
! if (have_defaults)
! ereport(ERROR,
! (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION),
! errmsg("parameter without default value specified after parameter with default value")));
! }
i++;
}
--- 301,309 ----
have_defaults = true;
}
else
! /* add default only when some default exists, defaults list doesn't start with nulls */
! if (have_defaults && (fp->mode == FUNC_PARAM_IN && fp->mode == FUNC_PARAM_INOUT))
! *parameterDefaults = lappend(*parameterDefaults, NIL);
i++;
}
*** ./src/backend/parser/parse_expr.c.orig 2008-12-08 23:07:12.000000000 +0100
--- ./src/backend/parser/parse_expr.c 2008-12-11 23:32:17.000000000 +0100
***************
*** 361,367 ****
list_make1(n),
list_make1(result),
false, false, false,
! true, -1);
}
}
/* process trailing subscripts, if any */
--- 361,368 ----
list_make1(n),
list_make1(result),
false, false, false,
! true, -1,
! POSITIONAL_NOTATION, NIL);
}
}
/* process trailing subscripts, if any */
***************
*** 505,511 ****
list_make1(makeString(name2)),
list_make1(node),
false, false, false,
! true, cref->location);
}
break;
}
--- 506,513 ----
list_make1(makeString(name2)),
list_make1(node),
false, false, false,
! true, cref->location,
! POSITIONAL_NOTATION, NIL);
}
break;
}
***************
*** 546,552 ****
list_make1(makeString(name3)),
list_make1(node),
false, false, false,
! true, cref->location);
}
break;
}
--- 548,555 ----
list_make1(makeString(name3)),
list_make1(node),
false, false, false,
! true, cref->location,
! POSITIONAL_NOTATION, NIL);
}
break;
}
***************
*** 601,607 ****
list_make1(makeString(name4)),
list_make1(node),
false, false, false,
! true, cref->location);
}
break;
}
--- 604,611 ----
list_make1(makeString(name4)),
list_make1(node),
false, false, false,
! true, cref->location,
! POSITIONAL_NOTATION, NIL);
}
break;
}
***************
*** 1092,1105 ****
--- 1096,1178 ----
{
List *targs;
ListCell *args;
+ List *names;
+ int i;
+ Notation notation;
/* Transform the list of arguments ... */
targs = NIL;
+ names = NIL;
+ i = 0;
+
+ notation = POSITIONAL_NOTATION;
foreach(args, fn->args)
{
+ i = i + 1;
+
+ /*
+ * this feature will be prohibited until hstorage will be supported, or
+ * be controlled by GUC. There is one problem - supported operator
+ * text => text, should colidate wit named notation syntax.
+ */
+ if (IsA((Node *) lfirst(args), A_Expr) && true)
+ {
+ A_Expr *expr = (A_Expr *) lfirst(args);
+
+ if (expr->kind == AEXPR_OP)
+ {
+ Node *name = linitial(expr->name);
+
+ if (IsA(name, String) && strcmp(strVal(name), "=>") == 0)
+ {
+ Node *lexpr = expr->lexpr;
+ Node *param_name;
+
+ if (!IsA(lexpr, ColumnRef))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("expected parameter name"),
+ parser_errposition(pstate, exprLocation(lexpr))));
+
+ param_name = linitial(((ColumnRef *) lexpr)->fields);
+ if (!IsA(param_name, String))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("expected parameter name"),
+ parser_errposition(pstate, exprLocation(lexpr))));
+
+ if (notation == POSITIONAL_NOTATION)
+ notation = (i == 1) ? NAMED_NOTATION : MIXED_NOTATION;
+
+ Assert(list_length(expr->name) == 1);
+ targs = lappend(targs, transformExpr(pstate,
+ expr->rexpr));
+
+ if (list_member(names, param_name))
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("ambiguous parameter value"),
+ errhint("You specify some parameter more time."),
+ parser_errposition(pstate, exprLocation(lexpr))));
+
+ names = lappend(names, param_name);
+ continue;
+ }
+ }
+ }
+
+ if (notation != POSITIONAL_NOTATION)
+ ereport(ERROR,
+ (errcode(ERRCODE_SYNTAX_ERROR),
+ errmsg("expected named notation"),
+ errhint("You can't put positionals arguments behind the named arguments."),
+ parser_errposition(pstate, exprLocation(lfirst(args)))));
+
+
targs = lappend(targs, transformExpr(pstate,
(Node *) lfirst(args)));
+ names = lappend(names, NULL);
}
/* ... and hand off to ParseFuncOrColumn */
***************
*** 1110,1116 ****
fn->agg_distinct,
fn->func_variadic,
false,
! fn->location);
}
static Node *
--- 1183,1191 ----
fn->agg_distinct,
fn->func_variadic,
false,
! fn->location,
! notation,
! notation == POSITIONAL_NOTATION ? NULL : names);
}
static Node *
*** ./src/backend/parser/parse_func.c.orig 2008-12-10 11:51:49.000000000 +0100
--- ./src/backend/parser/parse_func.c 2008-12-11 23:31:29.000000000 +0100
***************
*** 63,69 ****
Node *
ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
bool agg_star, bool agg_distinct, bool func_variadic,
! bool is_column, int location)
{
Oid rettype;
Oid funcid;
--- 63,70 ----
Node *
ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,
bool agg_star, bool agg_distinct, bool func_variadic,
! bool is_column, int location,
! Notation notation, List *names)
{
Oid rettype;
Oid funcid;
***************
*** 78,83 ****
--- 79,87 ----
int nvargs;
FuncDetailCode fdresult;
List *argdefaults;
+ int pronargs;
+ short int *map_args;
+ short int *map_defaults;
/*
* Most of the rest of the parser just assumes that functions do not have
***************
*** 131,137 ****
* wasn't any aggregate or variadic decoration.
*/
if (nargs == 1 && !agg_star && !agg_distinct && !func_variadic &&
! list_length(funcname) == 1)
{
Oid argtype = actual_arg_types[0];
--- 135,141 ----
* wasn't any aggregate or variadic decoration.
*/
if (nargs == 1 && !agg_star && !agg_distinct && !func_variadic &&
! list_length(funcname) == 1 && notation == POSITIONAL_NOTATION)
{
Oid argtype = actual_arg_types[0];
***************
*** 164,171 ****
*/
fdresult = func_get_detail(funcname, fargs, nargs, actual_arg_types,
!func_variadic,
&funcid, &rettype, &retset, &nvargs,
! &declared_arg_types, &argdefaults);
if (fdresult == FUNCDETAIL_COERCION)
{
/*
--- 168,177 ----
*/
fdresult = func_get_detail(funcname, fargs, nargs, actual_arg_types,
!func_variadic,
+ notation, names,
&funcid, &rettype, &retset, &nvargs,
! &declared_arg_types, &argdefaults,
! &pronargs, &map_args, &map_defaults);
if (fdresult == FUNCDETAIL_COERCION)
{
/*
***************
*** 235,242 ****
parser_errposition(pstate, location)));
}
/* add stored expressions as called values for arguments with defaults */
! if (argdefaults)
{
ListCell *lc;
--- 241,275 ----
parser_errposition(pstate, location)));
}
+ /* do some magii with mapping arguments (when named or mixed notation is used */
+ if (map_args != NULL)
+ {
+ List *reordered_fargs = NIL;
+ int i;
+
+ nargs = 0;
+ for (i = 0; i < pronargs; i++)
+ {
+ Node *expr;
+
+ if (map_args[i] != -1)
+ expr = list_nth(fargs, map_args[i]);
+ else
+ {
+ Assert(map_defaults != NULL);
+ Assert(map_defaults[i] != -1);
+
+ expr = list_nth(argdefaults, map_defaults[i]);
+ }
+ reordered_fargs = lappend(reordered_fargs, expr);
+ actual_arg_types[nargs++] = exprType(expr);
+ }
+
+ fargs = reordered_fargs;
+ }
+
/* add stored expressions as called values for arguments with defaults */
! if (argdefaults && (map_args == NULL && map_defaults == NULL))
{
ListCell *lc;
***************
*** 741,758 ****
int nargs,
Oid *argtypes,
bool expand_variadic,
Oid *funcid, /* return value */
Oid *rettype, /* return value */
bool *retset, /* return value */
int *nvargs, /* return value */
Oid **true_typeids, /* return value */
! List **argdefaults) /* return value */
{
FuncCandidateList raw_candidates;
FuncCandidateList best_candidate;
/* Get list of possible candidates from namespace search */
! raw_candidates = FuncnameGetCandidates(funcname, nargs, expand_variadic);
/*
* Quickly check if there is an exact match to the input datatypes (there
--- 774,797 ----
int nargs,
Oid *argtypes,
bool expand_variadic,
+ Notation notation,
+ List *names,
Oid *funcid, /* return value */
Oid *rettype, /* return value */
bool *retset, /* return value */
int *nvargs, /* return value */
Oid **true_typeids, /* return value */
! List **argdefaults, /* return value */
! int *pronargs, /* return value */
! short int **map_args, /* return value */
! short int **map_defaults) /* return value */
{
FuncCandidateList raw_candidates;
FuncCandidateList best_candidate;
/* Get list of possible candidates from namespace search */
! raw_candidates = FuncnameGetCandidates(funcname, nargs, expand_variadic,
! notation, names);
/*
* Quickly check if there is an exact match to the input datatypes (there
***************
*** 889,895 ****
*true_typeids = best_candidate->args;
if (argdefaults)
*argdefaults = best_candidate->argdefaults;
!
ftup = SearchSysCache(PROCOID,
ObjectIdGetDatum(best_candidate->oid),
0, 0, 0);
--- 928,941 ----
*true_typeids = best_candidate->args;
if (argdefaults)
*argdefaults = best_candidate->argdefaults;
! if (map_args)
! {
! Assert(pronargs != NULL);
! *map_args = best_candidate->map_args;
! *pronargs = best_candidate->nargs;
! }
! if (map_defaults)
! *map_defaults = best_candidate->map_defaults;
ftup = SearchSysCache(PROCOID,
ObjectIdGetDatum(best_candidate->oid),
0, 0, 0);
***************
*** 1243,1249 ****
{
FuncCandidateList clist;
! clist = FuncnameGetCandidates(funcname, nargs, false);
while (clist)
{
--- 1289,1295 ----
{
FuncCandidateList clist;
! clist = FuncnameGetCandidates(funcname, nargs, false, POSITIONAL_NOTATION, NIL);
while (clist)
{
*** ./src/backend/utils/adt/regproc.c.orig 2008-12-10 12:40:55.000000000 +0100
--- ./src/backend/utils/adt/regproc.c 2008-12-10 12:42:20.000000000 +0100
***************
*** 131,137 ****
* pg_proc entries in the current search path.
*/
names = stringToQualifiedNameList(pro_name_or_oid);
! clist = FuncnameGetCandidates(names, -1, false);
if (clist == NULL)
ereport(ERROR,
--- 131,137 ----
* pg_proc entries in the current search path.
*/
names = stringToQualifiedNameList(pro_name_or_oid);
! clist = FuncnameGetCandidates(names, -1, false, POSITIONAL_NOTATION, NIL);
if (clist == NULL)
ereport(ERROR,
***************
*** 190,196 ****
* qualify it.
*/
clist = FuncnameGetCandidates(list_make1(makeString(proname)),
! -1, false);
if (clist != NULL && clist->next == NULL &&
clist->oid == proid)
nspname = NULL;
--- 190,196 ----
* qualify it.
*/
clist = FuncnameGetCandidates(list_make1(makeString(proname)),
! -1, false, POSITIONAL_NOTATION, NIL);
if (clist != NULL && clist->next == NULL &&
clist->oid == proid)
nspname = NULL;
***************
*** 277,283 ****
*/
parseNameAndArgTypes(pro_name_or_oid, false, &names, &nargs, argtypes);
! clist = FuncnameGetCandidates(names, nargs, false);
for (; clist; clist = clist->next)
{
--- 277,283 ----
*/
parseNameAndArgTypes(pro_name_or_oid, false, &names, &nargs, argtypes);
! clist = FuncnameGetCandidates(names, nargs, false, POSITIONAL_NOTATION, NIL);
for (; clist; clist = clist->next)
{
*** ./src/backend/utils/adt/ruleutils.c.orig 2008-12-08 23:52:45.000000000 +0100
--- ./src/backend/utils/adt/ruleutils.c 2008-12-11 13:47:41.000000000 +0100
***************
*** 1793,1799 ****
Node *expr;
expr = (Node *) list_nth(argdefaults, i - (numargs - nargdefaults));
! appendStringInfo(buf, " DEFAULT %s", deparse_expression(expr, dcontext, false, false));
}
argsprinted++;
--- 1793,1800 ----
Node *expr;
expr = (Node *) list_nth(argdefaults, i - (numargs - nargdefaults));
! if (expr != NULL)
! appendStringInfo(buf, " DEFAULT %s", deparse_expression(expr, dcontext, false, false));
}
argsprinted++;
***************
*** 6071,6078 ****
*/
p_result = func_get_detail(list_make1(makeString(proname)),
NIL, nargs, argtypes, false,
&p_funcid, &p_rettype,
! &p_retset, &p_nvargs, &p_true_typeids, NULL);
if ((p_result == FUNCDETAIL_NORMAL || p_result == FUNCDETAIL_AGGREGATE) &&
p_funcid == funcid)
nspname = NULL;
--- 6072,6081 ----
*/
p_result = func_get_detail(list_make1(makeString(proname)),
NIL, nargs, argtypes, false,
+ POSITIONAL_NOTATION, NIL,
&p_funcid, &p_rettype,
! &p_retset, &p_nvargs, &p_true_typeids,
! NULL, NULL, NULL, NULL);
if ((p_result == FUNCDETAIL_NORMAL || p_result == FUNCDETAIL_AGGREGATE) &&
p_funcid == funcid)
nspname = NULL;
*** ./src/include/catalog/namespace.h.orig 2008-12-10 12:32:58.000000000 +0100
--- ./src/include/catalog/namespace.h 2008-12-11 12:16:45.000000000 +0100
***************
*** 14,19 ****
--- 14,20 ----
#ifndef NAMESPACE_H
#define NAMESPACE_H
+ #include "nodes/parsenodes.h"
#include "nodes/primnodes.h"
***************
*** 31,36 ****
--- 32,39 ----
int nargs; /* number of arg types returned */
int nvargs; /* number of args to become variadic array */
List *argdefaults; /* list of parameter defaults */
+ short int *map_args;
+ short int *map_defaults;
Oid args[1]; /* arg types --- VARIABLE LENGTH ARRAY */
} *FuncCandidateList; /* VARIABLE LENGTH STRUCT */
***************
*** 54,60 ****
extern bool TypeIsVisible(Oid typid);
extern FuncCandidateList FuncnameGetCandidates(List *names, int nargs,
! bool expand_variadic);
extern bool FunctionIsVisible(Oid funcid);
extern Oid OpernameGetOprid(List *names, Oid oprleft, Oid oprright);
--- 57,63 ----
extern bool TypeIsVisible(Oid typid);
extern FuncCandidateList FuncnameGetCandidates(List *names, int nargs,
! bool expand_variadic, Notation notation, List *argnames);
extern bool FunctionIsVisible(Oid funcid);
extern Oid OpernameGetOprid(List *names, Oid oprleft, Oid oprright);
*** ./src/include/nodes/parsenodes.h.orig 2008-12-10 11:06:16.000000000 +0100
--- ./src/include/nodes/parsenodes.h 2008-12-10 11:12:07.000000000 +0100
***************
*** 49,54 ****
--- 49,64 ----
SORTBY_NULLS_LAST
} SortByNulls;
+ /* notation used for Func call params */
+ typedef enum Notation
+ {
+ POSITIONAL_NOTATION,
+ MIXED_NOTATION,
+ NAMED_NOTATION
+ } Notation;
+
+
+
/*
* Grantable rights are encoded so that we can OR them together in a bitmask.
*** ./src/include/parser/parse_func.h.orig 2008-12-10 11:27:33.000000000 +0100
--- ./src/include/parser/parse_func.h 2008-12-11 13:44:27.000000000 +0100
***************
*** 44,56 ****
extern Node *ParseFuncOrColumn(ParseState *pstate,
List *funcname, List *fargs,
bool agg_star, bool agg_distinct, bool func_variadic,
! bool is_column, int location);
extern FuncDetailCode func_get_detail(List *funcname, List *fargs,
int nargs, Oid *argtypes, bool expand_variadic,
Oid *funcid, Oid *rettype,
bool *retset, int *nvargs, Oid **true_typeids,
! List **argdefaults);
extern int func_match_argtypes(int nargs,
Oid *input_typeids,
--- 44,59 ----
extern Node *ParseFuncOrColumn(ParseState *pstate,
List *funcname, List *fargs,
bool agg_star, bool agg_distinct, bool func_variadic,
! bool is_column, int location,
! Notation notation, List *names);
extern FuncDetailCode func_get_detail(List *funcname, List *fargs,
int nargs, Oid *argtypes, bool expand_variadic,
+ Notation notation, List *names,
Oid *funcid, Oid *rettype,
bool *retset, int *nvargs, Oid **true_typeids,
! List **argdefaults,
! int *pronargs, short int **map_args, short int **map_defaults);
extern int func_match_argtypes(int nargs,
Oid *input_typeids,
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers