mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Support use of function argument names to identify which actual arguments
match which function parameters. The syntax uses AS, for example funcname(value AS arg1, anothervalue AS arg2) Pavel Stehule
This commit is contained in:
@ -15,7 +15,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.441 2009/10/07 22:14:20 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.442 2009/10/08 02:39:20 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -1019,6 +1019,22 @@ _copyFuncExpr(FuncExpr *from)
|
||||
return newnode;
|
||||
}
|
||||
|
||||
/*
|
||||
* _copyNamedArgExpr *
|
||||
*/
|
||||
static NamedArgExpr *
|
||||
_copyNamedArgExpr(NamedArgExpr *from)
|
||||
{
|
||||
NamedArgExpr *newnode = makeNode(NamedArgExpr);
|
||||
|
||||
COPY_NODE_FIELD(arg);
|
||||
COPY_STRING_FIELD(name);
|
||||
COPY_SCALAR_FIELD(argnumber);
|
||||
COPY_LOCATION_FIELD(location);
|
||||
|
||||
return newnode;
|
||||
}
|
||||
|
||||
/*
|
||||
* _copyOpExpr
|
||||
*/
|
||||
@ -3587,6 +3603,9 @@ copyObject(void *from)
|
||||
case T_FuncExpr:
|
||||
retval = _copyFuncExpr(from);
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
retval = _copyNamedArgExpr(from);
|
||||
break;
|
||||
case T_OpExpr:
|
||||
retval = _copyOpExpr(from);
|
||||
break;
|
||||
|
@ -22,7 +22,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.364 2009/10/07 22:14:20 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.365 2009/10/08 02:39:20 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -241,6 +241,17 @@ _equalFuncExpr(FuncExpr *a, FuncExpr *b)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalNamedArgExpr(NamedArgExpr *a, NamedArgExpr *b)
|
||||
{
|
||||
COMPARE_NODE_FIELD(arg);
|
||||
COMPARE_STRING_FIELD(name);
|
||||
COMPARE_SCALAR_FIELD(argnumber);
|
||||
COMPARE_LOCATION_FIELD(location);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
_equalOpExpr(OpExpr *a, OpExpr *b)
|
||||
{
|
||||
@ -2375,6 +2386,9 @@ equal(void *a, void *b)
|
||||
case T_FuncExpr:
|
||||
retval = _equalFuncExpr(a, b);
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
retval = _equalNamedArgExpr(a, b);
|
||||
break;
|
||||
case T_OpExpr:
|
||||
retval = _equalOpExpr(a, b);
|
||||
break;
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/nodeFuncs.c,v 1.42 2009/07/30 02:45:37 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/nodeFuncs.c,v 1.43 2009/10/08 02:39:21 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -69,6 +69,9 @@ exprType(Node *expr)
|
||||
case T_FuncExpr:
|
||||
type = ((FuncExpr *) expr)->funcresulttype;
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
type = exprType((Node *) ((NamedArgExpr *) expr)->arg);
|
||||
break;
|
||||
case T_OpExpr:
|
||||
type = ((OpExpr *) expr)->opresulttype;
|
||||
break;
|
||||
@ -259,6 +262,8 @@ exprTypmod(Node *expr)
|
||||
return coercedTypmod;
|
||||
}
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
return exprTypmod((Node *) ((NamedArgExpr *) expr)->arg);
|
||||
case T_SubLink:
|
||||
{
|
||||
SubLink *sublink = (SubLink *) expr;
|
||||
@ -676,6 +681,15 @@ exprLocation(Node *expr)
|
||||
exprLocation((Node *) fexpr->args));
|
||||
}
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
{
|
||||
NamedArgExpr *na = (NamedArgExpr *) expr;
|
||||
|
||||
/* consider both argument name and value */
|
||||
loc = leftmostLoc(na->location,
|
||||
exprLocation((Node *) na->arg));
|
||||
}
|
||||
break;
|
||||
case T_OpExpr:
|
||||
case T_DistinctExpr: /* struct-equivalent to OpExpr */
|
||||
case T_NullIfExpr: /* struct-equivalent to OpExpr */
|
||||
@ -1117,6 +1131,8 @@ expression_tree_walker(Node *node,
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
return walker(((NamedArgExpr *) node)->arg, context);
|
||||
case T_OpExpr:
|
||||
{
|
||||
OpExpr *expr = (OpExpr *) node;
|
||||
@ -1623,6 +1639,16 @@ expression_tree_mutator(Node *node,
|
||||
return (Node *) newnode;
|
||||
}
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
{
|
||||
NamedArgExpr *nexpr = (NamedArgExpr *) node;
|
||||
NamedArgExpr *newnode;
|
||||
|
||||
FLATCOPY(newnode, nexpr, NamedArgExpr);
|
||||
MUTATE(newnode->arg, nexpr->arg, Expr *);
|
||||
return (Node *) newnode;
|
||||
}
|
||||
break;
|
||||
case T_OpExpr:
|
||||
{
|
||||
OpExpr *expr = (OpExpr *) node;
|
||||
@ -2382,6 +2408,8 @@ bool
|
||||
/* function name is deemed uninteresting */
|
||||
}
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
return walker(((NamedArgExpr *) node)->arg, context);
|
||||
case T_A_Indices:
|
||||
{
|
||||
A_Indices *indices = (A_Indices *) node;
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.365 2009/10/06 00:55:26 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.366 2009/10/08 02:39:21 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Every node type that can appear in stored rules' parsetrees *must*
|
||||
@ -875,6 +875,17 @@ _outFuncExpr(StringInfo str, FuncExpr *node)
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
static void
|
||||
_outNamedArgExpr(StringInfo str, NamedArgExpr *node)
|
||||
{
|
||||
WRITE_NODE_TYPE("NAMEDARGEXPR");
|
||||
|
||||
WRITE_NODE_FIELD(arg);
|
||||
WRITE_STRING_FIELD(name);
|
||||
WRITE_INT_FIELD(argnumber);
|
||||
WRITE_LOCATION_FIELD(location);
|
||||
}
|
||||
|
||||
static void
|
||||
_outOpExpr(StringInfo str, OpExpr *node)
|
||||
{
|
||||
@ -2514,6 +2525,9 @@ _outNode(StringInfo str, void *obj)
|
||||
case T_FuncExpr:
|
||||
_outFuncExpr(str, obj);
|
||||
break;
|
||||
case T_NamedArgExpr:
|
||||
_outNamedArgExpr(str, obj);
|
||||
break;
|
||||
case T_OpExpr:
|
||||
_outOpExpr(str, obj);
|
||||
break;
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/readfuncs.c,v 1.223 2009/07/16 06:33:42 petere Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/nodes/readfuncs.c,v 1.224 2009/10/08 02:39:21 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Path and Plan nodes do not have any readfuncs support, because we
|
||||
@ -525,6 +525,22 @@ _readFuncExpr(void)
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
/*
|
||||
* _readNamedArgExpr
|
||||
*/
|
||||
static NamedArgExpr *
|
||||
_readNamedArgExpr(void)
|
||||
{
|
||||
READ_LOCALS(NamedArgExpr);
|
||||
|
||||
READ_NODE_FIELD(arg);
|
||||
READ_STRING_FIELD(name);
|
||||
READ_INT_FIELD(argnumber);
|
||||
READ_LOCATION_FIELD(location);
|
||||
|
||||
READ_DONE();
|
||||
}
|
||||
|
||||
/*
|
||||
* _readOpExpr
|
||||
*/
|
||||
@ -1207,6 +1223,8 @@ parseNodeString(void)
|
||||
return_value = _readArrayRef();
|
||||
else if (MATCH("FUNCEXPR", 8))
|
||||
return_value = _readFuncExpr();
|
||||
else if (MATCH("NAMEDARGEXPR", 12))
|
||||
return_value = _readNamedArgExpr();
|
||||
else if (MATCH("OPEXPR", 6))
|
||||
return_value = _readOpExpr();
|
||||
else if (MATCH("DISTINCTEXPR", 12))
|
||||
|
Reference in New Issue
Block a user