Commit b12b7a90 authored by Tom Lane's avatar Tom Lane

Change the notation for calling functions with named parameters from

"val AS name" to "name := val", as per recent discussion.

This patch catches everything in the original named-parameters patch,
but I'm not certain that no other dependencies snuck in later (grepping
the source tree for all uses of AS soon proved unworkable).

In passing I note that we've dropped the ball at least once on keeping
ecpg's lexer (as opposed to parser) in sync with the backend.  It would
be a good idea to go through all of pgc.l and see if it's in sync now.
I didn't attempt that at the moment.
parent 2bde07c1
<!-- $PostgreSQL: pgsql/doc/src/sgml/syntax.sgml,v 1.144 2010/05/27 18:23:47 petere Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/syntax.sgml,v 1.145 2010/05/30 18:10:40 tgl Exp $ -->
<chapter id="sql-syntax"> <chapter id="sql-syntax">
<title>SQL Syntax</title> <title>SQL Syntax</title>
...@@ -2285,10 +2285,11 @@ SELECT concat_lower_or_upper('Hello', 'World'); ...@@ -2285,10 +2285,11 @@ SELECT concat_lower_or_upper('Hello', 'World');
</indexterm> </indexterm>
<para> <para>
In named notation, each argument's name is specified using the In named notation, each argument's name is specified using
<literal>AS</literal> keyword. For example: <literal>:=</literal> to separate it from the argument expression.
For example:
<screen> <screen>
SELECT concat_lower_or_upper('Hello' AS a, 'World' AS b); SELECT concat_lower_or_upper(a := 'Hello', b := 'World');
concat_lower_or_upper concat_lower_or_upper
----------------------- -----------------------
hello world hello world
...@@ -2299,13 +2300,13 @@ SELECT concat_lower_or_upper('Hello' AS a, 'World' AS b); ...@@ -2299,13 +2300,13 @@ SELECT concat_lower_or_upper('Hello' AS a, 'World' AS b);
using named notation is that the arguments may be specified in any using named notation is that the arguments may be specified in any
order, for example: order, for example:
<screen> <screen>
SELECT concat_lower_or_upper('Hello' AS a, 'World' AS b, true AS uppercase); SELECT concat_lower_or_upper(a := 'Hello', b := 'World', uppercase := true);
concat_lower_or_upper concat_lower_or_upper
----------------------- -----------------------
HELLO WORLD HELLO WORLD
(1 row) (1 row)
SELECT concat_lower_or_upper('Hello' AS a, true AS uppercase, 'World' AS b); SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
concat_lower_or_upper concat_lower_or_upper
----------------------- -----------------------
HELLO WORLD HELLO WORLD
...@@ -2327,7 +2328,7 @@ SELECT concat_lower_or_upper('Hello' AS a, true AS uppercase, 'World' AS b); ...@@ -2327,7 +2328,7 @@ SELECT concat_lower_or_upper('Hello' AS a, true AS uppercase, 'World' AS b);
already mentioned, named arguments cannot precede positional arguments. already mentioned, named arguments cannot precede positional arguments.
For example: For example:
<screen> <screen>
SELECT concat_lower_or_upper('Hello', 'World', true AS uppercase); SELECT concat_lower_or_upper('Hello', 'World', uppercase := true);
concat_lower_or_upper concat_lower_or_upper
----------------------- -----------------------
HELLO WORLD HELLO WORLD
......
<!-- $PostgreSQL: pgsql/doc/src/sgml/xfunc.sgml,v 1.148 2010/05/16 04:35:04 rhaas Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/xfunc.sgml,v 1.149 2010/05/30 18:10:40 tgl Exp $ -->
<sect1 id="xfunc"> <sect1 id="xfunc">
<title>User-Defined Functions</title> <title>User-Defined Functions</title>
...@@ -705,14 +705,14 @@ SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]); ...@@ -705,14 +705,14 @@ SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);
<literal>VARIADIC</>. For example, this will work: <literal>VARIADIC</>. For example, this will work:
<screen> <screen>
SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4] AS arr); SELECT mleast(VARIADIC arr := ARRAY[10, -1, 5, 4.4]);
</screen> </screen>
but not these: but not these:
<screen> <screen>
SELECT mleast(10 AS arr); SELECT mleast(arr := 10);
SELECT mleast(ARRAY[10, -1, 5, 4.4] AS arr); SELECT mleast(arr := ARRAY[10, -1, 5, 4.4]);
</screen> </screen>
</para> </para>
</sect2> </sect2>
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.711 2010/02/23 22:51:42 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.712 2010/05/30 18:10:40 tgl Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -444,8 +444,8 @@ static TypeName *TableFuncTypeName(List *columns); ...@@ -444,8 +444,8 @@ static TypeName *TableFuncTypeName(List *columns);
* the set of keywords. PL/pgsql depends on this so that it can share the * the set of keywords. PL/pgsql depends on this so that it can share the
* same lexer. If you add/change tokens here, fix PL/pgsql to match! * same lexer. If you add/change tokens here, fix PL/pgsql to match!
* *
* DOT_DOT and COLON_EQUALS are unused in the core SQL grammar, and so will * DOT_DOT is unused in the core SQL grammar, and so will always provoke
* always provoke parse errors. They are needed by PL/pgsql. * parse errors. It is needed by PL/pgsql.
*/ */
%token <str> IDENT FCONST SCONST BCONST XCONST Op %token <str> IDENT FCONST SCONST BCONST XCONST Op
%token <ival> ICONST PARAM %token <ival> ICONST PARAM
...@@ -10212,13 +10212,13 @@ func_arg_expr: a_expr ...@@ -10212,13 +10212,13 @@ func_arg_expr: a_expr
{ {
$$ = $1; $$ = $1;
} }
| a_expr AS param_name | param_name COLON_EQUALS a_expr
{ {
NamedArgExpr *na = makeNode(NamedArgExpr); NamedArgExpr *na = makeNode(NamedArgExpr);
na->arg = (Expr *) $1; na->name = $1;
na->name = $3; na->arg = (Expr *) $3;
na->argnumber = -1; /* until determined */ na->argnumber = -1; /* until determined */
na->location = @3; na->location = @1;
$$ = (Node *) na; $$ = (Node *) na;
} }
; ;
...@@ -10698,7 +10698,7 @@ AexprConst: Iconst ...@@ -10698,7 +10698,7 @@ AexprConst: Iconst
if (IsA(arg, NamedArgExpr)) if (IsA(arg, NamedArgExpr))
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_SYNTAX_ERROR),
errmsg("type modifier cannot have AS name"), errmsg("type modifier cannot have parameter name"),
parser_errposition(arg->location))); parser_errposition(arg->location)));
} }
t->typmods = $3; t->typmods = $3;
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.223 2010/03/17 16:52:38 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/parse_func.c,v 1.224 2010/05/30 18:10:40 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1386,12 +1386,12 @@ funcname_signature_string(const char *funcname, int nargs, ...@@ -1386,12 +1386,12 @@ funcname_signature_string(const char *funcname, int nargs,
{ {
if (i) if (i)
appendStringInfoString(&argbuf, ", "); appendStringInfoString(&argbuf, ", ");
appendStringInfoString(&argbuf, format_type_be(argtypes[i]));
if (i >= numposargs) if (i >= numposargs)
{ {
appendStringInfo(&argbuf, " AS %s", (char *) lfirst(lc)); appendStringInfo(&argbuf, "%s := ", (char *) lfirst(lc));
lc = lnext(lc); lc = lnext(lc);
} }
appendStringInfoString(&argbuf, format_type_be(argtypes[i]));
} }
appendStringInfoChar(&argbuf, ')'); appendStringInfoChar(&argbuf, ')');
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/scan.l,v 1.166 2010/01/16 17:39:55 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/scan.l,v 1.167 2010/05/30 18:10:41 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -317,8 +317,6 @@ ident_cont [A-Za-z\200-\377_0-9\$] ...@@ -317,8 +317,6 @@ ident_cont [A-Za-z\200-\377_0-9\$]
identifier {ident_start}{ident_cont}* identifier {ident_start}{ident_cont}*
typecast "::" typecast "::"
/* these two token types are used by PL/pgsql, though not in core SQL */
dot_dot \.\. dot_dot \.\.
colon_equals ":=" colon_equals ":="
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.325 2010/02/26 02:01:09 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.326 2010/05/30 18:10:41 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -4537,8 +4537,8 @@ get_rule_expr(Node *node, deparse_context *context, ...@@ -4537,8 +4537,8 @@ get_rule_expr(Node *node, deparse_context *context,
{ {
NamedArgExpr *na = (NamedArgExpr *) node; NamedArgExpr *na = (NamedArgExpr *) node;
appendStringInfo(buf, "%s := ", quote_identifier(na->name));
get_rule_expr((Node *) na->arg, context, showimplicit); get_rule_expr((Node *) na->arg, context, showimplicit);
appendStringInfo(buf, " AS %s", quote_identifier(na->name));
} }
break; break;
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/psql/psqlscan.l,v 1.33 2010/05/05 22:18:56 tgl Exp $ * $PostgreSQL: pgsql/src/bin/psql/psqlscan.l,v 1.34 2010/05/30 18:10:41 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -345,8 +345,6 @@ ident_cont [A-Za-z\200-\377_0-9\$] ...@@ -345,8 +345,6 @@ ident_cont [A-Za-z\200-\377_0-9\$]
identifier {ident_start}{ident_cont}* identifier {ident_start}{ident_cont}*
typecast "::" typecast "::"
/* these two token types are used by PL/pgsql, though not in core SQL */
dot_dot \.\. dot_dot \.\.
colon_equals ":=" colon_equals ":="
......
#!/usr/bin/perl #!/usr/bin/perl
# $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/parse.pl,v 1.7 2010/01/02 16:58:11 momjian Exp $ # $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/parse.pl,v 1.8 2010/05/30 18:10:41 tgl Exp $
# parser generater for ecpg # parser generater for ecpg
# call with backend parser as stdin # call with backend parser as stdin
# #
...@@ -41,6 +41,8 @@ $replace_string{'WITH_TIME'} = 'with time'; ...@@ -41,6 +41,8 @@ $replace_string{'WITH_TIME'} = 'with time';
$replace_string{'NULLS_FIRST'} = 'nulls first'; $replace_string{'NULLS_FIRST'} = 'nulls first';
$replace_string{'NULLS_LAST'} = 'nulls last'; $replace_string{'NULLS_LAST'} = 'nulls last';
$replace_string{'TYPECAST'} = '::'; $replace_string{'TYPECAST'} = '::';
$replace_string{'DOT_DOT'} = '..';
$replace_string{'COLON_EQUALS'} = ':=';
# specific replace_types for specific non-terminals - never include the ':' # specific replace_types for specific non-terminals - never include the ':'
# ECPG-only replace_types are defined in ecpg-replace_types # ECPG-only replace_types are defined in ecpg-replace_types
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.173 2010/03/21 10:49:51 meskes Exp $ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.174 2010/05/30 18:10:41 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -230,6 +230,8 @@ identifier {ident_start}{ident_cont}* ...@@ -230,6 +230,8 @@ identifier {ident_start}{ident_cont}*
array ({ident_cont}|{whitespace}|[\[\]\+\-\*\%\/\(\)\>\.])* array ({ident_cont}|{whitespace}|[\[\]\+\-\*\%\/\(\)\>\.])*
typecast "::" typecast "::"
dot_dot \.\.
colon_equals ":="
/* /*
* "self" is the set of chars that should be returned as single-character * "self" is the set of chars that should be returned as single-character
...@@ -595,6 +597,8 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*. ...@@ -595,6 +597,8 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
} }
<xdc>{xdcinside} { addlit(yytext, yyleng); } <xdc>{xdcinside} { addlit(yytext, yyleng); }
<SQL>{typecast} { return TYPECAST; } <SQL>{typecast} { return TYPECAST; }
<SQL>{dot_dot} { return DOT_DOT; }
<SQL>{colon_equals} { return COLON_EQUALS; }
<SQL>{informix_special} { <SQL>{informix_special} {
/* are we simulating Informix? */ /* are we simulating Informix? */
if (INFORMIX_MODE) if (INFORMIX_MODE)
......
...@@ -1052,19 +1052,19 @@ select (dfunc(10,20,30)).*; ...@@ -1052,19 +1052,19 @@ select (dfunc(10,20,30)).*;
10 | 20 | 30 | 0 10 | 20 | 30 | 0
(1 row) (1 row)
select (dfunc(10 as a, 20 as b, 30 as c)).*; select (dfunc(a := 10, b := 20, c := 30)).*;
a | b | c | d a | b | c | d
----+----+----+--- ----+----+----+---
10 | 20 | 30 | 0 10 | 20 | 30 | 0
(1 row) (1 row)
select * from dfunc(10 as a, 20 as b); select * from dfunc(a := 10, b := 20);
a | b | c | d a | b | c | d
----+----+---+--- ----+----+---+---
10 | 20 | 0 | 0 10 | 20 | 0 | 0
(1 row) (1 row)
select * from dfunc(10 as b, 20 as a); select * from dfunc(b := 10, a := 20);
a | b | c | d a | b | c | d
----+----+---+--- ----+----+---+---
20 | 10 | 0 | 0 20 | 10 | 0 | 0
...@@ -1081,39 +1081,39 @@ select * from dfunc(1,2); ...@@ -1081,39 +1081,39 @@ select * from dfunc(1,2);
1 | 2 | 0 | 0 1 | 2 | 0 | 0
(1 row) (1 row)
select * from dfunc(1,2,3 as c); select * from dfunc(1,2,c := 3);
a | b | c | d a | b | c | d
---+---+---+--- ---+---+---+---
1 | 2 | 3 | 0 1 | 2 | 3 | 0
(1 row) (1 row)
select * from dfunc(1,2,3 as d); select * from dfunc(1,2,d := 3);
a | b | c | d a | b | c | d
---+---+---+--- ---+---+---+---
1 | 2 | 0 | 3 1 | 2 | 0 | 3
(1 row) (1 row)
select * from dfunc(10 as x, 20 as b, 30 as x); -- fail, duplicate name select * from dfunc(x := 20, b := 10, x := 30); -- fail, duplicate name
ERROR: argument name "x" used more than once ERROR: argument name "x" used more than once
LINE 1: select * from dfunc(10 as x, 20 as b, 30 as x); LINE 1: select * from dfunc(x := 20, b := 10, x := 30);
^ ^
select * from dfunc(10, 20 as b, 30); -- fail, named args must be last select * from dfunc(10, b := 20, 30); -- fail, named args must be last
ERROR: positional argument cannot follow named argument ERROR: positional argument cannot follow named argument
LINE 1: select * from dfunc(10, 20 as b, 30); LINE 1: select * from dfunc(10, b := 20, 30);
^ ^
select * from dfunc(10 as x, 20 as b, 30 as c); -- fail, unknown param select * from dfunc(x := 10, b := 20, c := 30); -- fail, unknown param
ERROR: function dfunc(integer AS x, integer AS b, integer AS c) does not exist ERROR: function dfunc(x := integer, b := integer, c := integer) does not exist
LINE 1: select * from dfunc(10 as x, 20 as b, 30 as c); LINE 1: select * from dfunc(x := 10, b := 20, c := 30);
^ ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. HINT: No function matches the given name and argument types. You might need to add explicit type casts.
select * from dfunc(10, 10, 20 as a); -- fail, a overlaps positional parameter select * from dfunc(10, 10, a := 20); -- fail, a overlaps positional parameter
ERROR: function dfunc(integer, integer, integer AS a) does not exist ERROR: function dfunc(integer, integer, a := integer) does not exist
LINE 1: select * from dfunc(10, 10, 20 as a); LINE 1: select * from dfunc(10, 10, a := 20);
^ ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. HINT: No function matches the given name and argument types. You might need to add explicit type casts.
select * from dfunc(1,2 as c,3 as d); -- fail, no value for b select * from dfunc(1,c := 2,d := 3); -- fail, no value for b
ERROR: function dfunc(integer, integer AS c, integer AS d) does not exist ERROR: function dfunc(integer, c := integer, d := integer) does not exist
LINE 1: select * from dfunc(1,2 as c,3 as d); LINE 1: select * from dfunc(1,c := 2,d := 3);
^ ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. HINT: No function matches the given name and argument types. You might need to add explicit type casts.
drop function dfunc(int, int, int, int); drop function dfunc(int, int, int, int);
...@@ -1134,27 +1134,27 @@ select * from dfunc('Hello World', 20, '2009-07-25'::date); ...@@ -1134,27 +1134,27 @@ select * from dfunc('Hello World', 20, '2009-07-25'::date);
Hello World | 20 | 07-25-2009 Hello World | 20 | 07-25-2009
(1 row) (1 row)
select * from dfunc('2009-07-25'::date as c, 'Hello World' as a, 20 as b); select * from dfunc(c := '2009-07-25'::date, a := 'Hello World', b := 20);
a | b | c a | b | c
-------------+----+------------ -------------+----+------------
Hello World | 20 | 07-25-2009 Hello World | 20 | 07-25-2009
(1 row) (1 row)
select * from dfunc('Hello World', 20 as b, '2009-07-25'::date as c); select * from dfunc('Hello World', b := 20, c := '2009-07-25'::date);
a | b | c a | b | c
-------------+----+------------ -------------+----+------------
Hello World | 20 | 07-25-2009 Hello World | 20 | 07-25-2009
(1 row) (1 row)
select * from dfunc('Hello World', '2009-07-25'::date as c, 20 as b); select * from dfunc('Hello World', c := '2009-07-25'::date, b := 20);
a | b | c a | b | c
-------------+----+------------ -------------+----+------------
Hello World | 20 | 07-25-2009 Hello World | 20 | 07-25-2009
(1 row) (1 row)
select * from dfunc('Hello World', 20 as c, '2009-07-25'::date as b); -- fail select * from dfunc('Hello World', c := 20, b := '2009-07-25'::date); -- fail
ERROR: function dfunc(unknown, integer AS c, date AS b) does not exist ERROR: function dfunc(unknown, c := integer, b := date) does not exist
LINE 1: select * from dfunc('Hello World', 20 as c, '2009-07-25'::da... LINE 1: select * from dfunc('Hello World', c := 20, b := '2009-07-25...
^ ^
HINT: No function matches the given name and argument types. You might need to add explicit type casts. HINT: No function matches the given name and argument types. You might need to add explicit type casts.
drop function dfunc(varchar, numeric, date); drop function dfunc(varchar, numeric, date);
...@@ -1181,13 +1181,13 @@ select * from dfunc('Hello', 100); ...@@ -1181,13 +1181,13 @@ select * from dfunc('Hello', 100);
Hello | 100 Hello | 100
(1 row) (1 row)
select * from dfunc('Hello' as a, 100 as c); select * from dfunc(a := 'Hello', c := 100);
_a | _c _a | _c
-------+----- -------+-----
Hello | 100 Hello | 100
(1 row) (1 row)
select * from dfunc(100 as c, 'Hello' as a); select * from dfunc(c := 100, a := 'Hello');
_a | _c _a | _c
-------+----- -------+-----
Hello | 100 Hello | 100
...@@ -1199,13 +1199,13 @@ select * from dfunc('Hello'); ...@@ -1199,13 +1199,13 @@ select * from dfunc('Hello');
Hello | Hello |
(1 row) (1 row)
select * from dfunc('Hello', 100 as c); select * from dfunc('Hello', c := 100);
_a | _c _a | _c
-------+----- -------+-----
Hello | 100 Hello | 100
(1 row) (1 row)
select * from dfunc(100 as c); select * from dfunc(c := 100);
_a | _c _a | _c
-------+----- -------+-----
def a | 100 def a | 100
...@@ -1268,43 +1268,43 @@ select dfunc('a'::text, 'b'); -- positional notation with default ...@@ -1268,43 +1268,43 @@ select dfunc('a'::text, 'b'); -- positional notation with default
a a
(1 row) (1 row)
select dfunc(1 as a, 2 as b); select dfunc(a := 1, b := 2);
dfunc dfunc
------- -------
1 1
(1 row) (1 row)
select dfunc('a'::text as a, 'b' as b); select dfunc(a := 'a'::text, b := 'b');
dfunc dfunc
------- -------
a a
(1 row) (1 row)
select dfunc('a'::text as a, 'b' as b, false as flag); -- named notation select dfunc(a := 'a'::text, b := 'b', flag := false); -- named notation
dfunc dfunc
------- -------
b b
(1 row) (1 row)
select dfunc('b'::text as b, 'a' as a); -- named notation with default select dfunc(b := 'b'::text, a := 'a'); -- named notation with default
dfunc dfunc
------- -------
a a
(1 row) (1 row)
select dfunc('a'::text as a, true as flag); -- named notation with default select dfunc(a := 'a'::text, flag := true); -- named notation with default
dfunc dfunc
------- -------
a a
(1 row) (1 row)
select dfunc('a'::text as a, false as flag); -- named notation with default select dfunc(a := 'a'::text, flag := false); -- named notation with default
dfunc dfunc
------- -------
(1 row) (1 row)
select dfunc('b'::text as b, 'a' as a, true as flag); -- named notation select dfunc(b := 'b'::text, a := 'a', flag := true); -- named notation
dfunc dfunc
------- -------
a a
...@@ -1316,7 +1316,7 @@ select dfunc('a'::text, 'b', false); -- full positional notation ...@@ -1316,7 +1316,7 @@ select dfunc('a'::text, 'b', false); -- full positional notation
b b
(1 row) (1 row)
select dfunc('a'::text, 'b', false as flag); -- mixed notation select dfunc('a'::text, 'b', flag := false); -- mixed notation
dfunc dfunc
------- -------
b b
...@@ -1328,7 +1328,7 @@ select dfunc('a'::text, 'b', true); -- full positional notation ...@@ -1328,7 +1328,7 @@ select dfunc('a'::text, 'b', true); -- full positional notation
a a
(1 row) (1 row)
select dfunc('a'::text, 'b', true as flag); -- mixed notation select dfunc('a'::text, 'b', flag := true); -- mixed notation
dfunc dfunc
------- -------
a a
...@@ -1337,8 +1337,8 @@ select dfunc('a'::text, 'b', true as flag); -- mixed notation ...@@ -1337,8 +1337,8 @@ select dfunc('a'::text, 'b', true as flag); -- mixed notation
-- check reverse-listing of named-arg calls -- check reverse-listing of named-arg calls
CREATE VIEW dfview AS CREATE VIEW dfview AS
SELECT q1, q2, SELECT q1, q2,
dfunc(q1,q2, q1>q2 as flag) as c3, dfunc(q1,q2, flag := q1>q2) as c3,
dfunc(q1, q1<q2 as flag, q2 AS b) as c4 dfunc(q1, flag := q1<q2, b := q2) as c4
FROM int8_tbl; FROM int8_tbl;
select * from dfview; select * from dfview;
q1 | q2 | c3 | c4 q1 | q2 | c3 | c4
...@@ -1359,7 +1359,7 @@ select * from dfview; ...@@ -1359,7 +1359,7 @@ select * from dfview;
c3 | bigint | | plain | c3 | bigint | | plain |
c4 | bigint | | plain | c4 | bigint | | plain |
View definition: View definition:
SELECT int8_tbl.q1, int8_tbl.q2, dfunc(int8_tbl.q1, int8_tbl.q2, int8_tbl.q1 > int8_tbl.q2 AS flag) AS c3, dfunc(int8_tbl.q1, int8_tbl.q1 < int8_tbl.q2 AS flag, int8_tbl.q2 AS b) AS c4 SELECT int8_tbl.q1, int8_tbl.q2, dfunc(int8_tbl.q1, int8_tbl.q2, flag := int8_tbl.q1 > int8_tbl.q2) AS c3, dfunc(int8_tbl.q1, flag := int8_tbl.q1 < int8_tbl.q2, b := int8_tbl.q2) AS c4
FROM int8_tbl; FROM int8_tbl;
drop view dfview; drop view dfview;
......
...@@ -636,19 +636,19 @@ create function dfunc(a int, b int, c int = 0, d int = 0) ...@@ -636,19 +636,19 @@ create function dfunc(a int, b int, c int = 0, d int = 0)
$$ language sql; $$ language sql;
select (dfunc(10,20,30)).*; select (dfunc(10,20,30)).*;
select (dfunc(10 as a, 20 as b, 30 as c)).*; select (dfunc(a := 10, b := 20, c := 30)).*;
select * from dfunc(10 as a, 20 as b); select * from dfunc(a := 10, b := 20);
select * from dfunc(10 as b, 20 as a); select * from dfunc(b := 10, a := 20);
select * from dfunc(0); -- fail select * from dfunc(0); -- fail
select * from dfunc(1,2); select * from dfunc(1,2);
select * from dfunc(1,2,3 as c); select * from dfunc(1,2,c := 3);
select * from dfunc(1,2,3 as d); select * from dfunc(1,2,d := 3);
select * from dfunc(10 as x, 20 as b, 30 as x); -- fail, duplicate name select * from dfunc(x := 20, b := 10, x := 30); -- fail, duplicate name
select * from dfunc(10, 20 as b, 30); -- fail, named args must be last select * from dfunc(10, b := 20, 30); -- fail, named args must be last
select * from dfunc(10 as x, 20 as b, 30 as c); -- fail, unknown param select * from dfunc(x := 10, b := 20, c := 30); -- fail, unknown param
select * from dfunc(10, 10, 20 as a); -- fail, a overlaps positional parameter select * from dfunc(10, 10, a := 20); -- fail, a overlaps positional parameter
select * from dfunc(1,2 as c,3 as d); -- fail, no value for b select * from dfunc(1,c := 2,d := 3); -- fail, no value for b
drop function dfunc(int, int, int, int); drop function dfunc(int, int, int, int);
...@@ -660,10 +660,10 @@ $$ language sql; ...@@ -660,10 +660,10 @@ $$ language sql;
select (dfunc('Hello World', 20, '2009-07-25'::date)).*; select (dfunc('Hello World', 20, '2009-07-25'::date)).*;
select * from dfunc('Hello World', 20, '2009-07-25'::date); select * from dfunc('Hello World', 20, '2009-07-25'::date);
select * from dfunc('2009-07-25'::date as c, 'Hello World' as a, 20 as b); select * from dfunc(c := '2009-07-25'::date, a := 'Hello World', b := 20);
select * from dfunc('Hello World', 20 as b, '2009-07-25'::date as c); select * from dfunc('Hello World', b := 20, c := '2009-07-25'::date);
select * from dfunc('Hello World', '2009-07-25'::date as c, 20 as b); select * from dfunc('Hello World', c := '2009-07-25'::date, b := 20);
select * from dfunc('Hello World', 20 as c, '2009-07-25'::date as b); -- fail select * from dfunc('Hello World', c := 20, b := '2009-07-25'::date); -- fail
drop function dfunc(varchar, numeric, date); drop function dfunc(varchar, numeric, date);
...@@ -676,11 +676,11 @@ $$ language sql; ...@@ -676,11 +676,11 @@ $$ language sql;
select (dfunc()).*; select (dfunc()).*;
select * from dfunc(); select * from dfunc();
select * from dfunc('Hello', 100); select * from dfunc('Hello', 100);
select * from dfunc('Hello' as a, 100 as c); select * from dfunc(a := 'Hello', c := 100);
select * from dfunc(100 as c, 'Hello' as a); select * from dfunc(c := 100, a := 'Hello');
select * from dfunc('Hello'); select * from dfunc('Hello');
select * from dfunc('Hello', 100 as c); select * from dfunc('Hello', c := 100);
select * from dfunc(100 as c); select * from dfunc(c := 100);
-- fail, can no longer change an input parameter's name -- fail, can no longer change an input parameter's name
create or replace function dfunc(a varchar = 'def a', out _a varchar, x numeric = NULL, out _c numeric) create or replace function dfunc(a varchar = 'def a', out _a varchar, x numeric = NULL, out _c numeric)
...@@ -718,25 +718,25 @@ $$ language sql; ...@@ -718,25 +718,25 @@ $$ language sql;
select dfunc(1,2); select dfunc(1,2);
select dfunc('a'::text, 'b'); -- positional notation with default select dfunc('a'::text, 'b'); -- positional notation with default
select dfunc(1 as a, 2 as b); select dfunc(a := 1, b := 2);
select dfunc('a'::text as a, 'b' as b); select dfunc(a := 'a'::text, b := 'b');
select dfunc('a'::text as a, 'b' as b, false as flag); -- named notation select dfunc(a := 'a'::text, b := 'b', flag := false); -- named notation
select dfunc('b'::text as b, 'a' as a); -- named notation with default select dfunc(b := 'b'::text, a := 'a'); -- named notation with default
select dfunc('a'::text as a, true as flag); -- named notation with default select dfunc(a := 'a'::text, flag := true); -- named notation with default
select dfunc('a'::text as a, false as flag); -- named notation with default select dfunc(a := 'a'::text, flag := false); -- named notation with default
select dfunc('b'::text as b, 'a' as a, true as flag); -- named notation select dfunc(b := 'b'::text, a := 'a', flag := true); -- named notation
select dfunc('a'::text, 'b', false); -- full positional notation select dfunc('a'::text, 'b', false); -- full positional notation
select dfunc('a'::text, 'b', false as flag); -- mixed notation select dfunc('a'::text, 'b', flag := false); -- mixed notation
select dfunc('a'::text, 'b', true); -- full positional notation select dfunc('a'::text, 'b', true); -- full positional notation
select dfunc('a'::text, 'b', true as flag); -- mixed notation select dfunc('a'::text, 'b', flag := true); -- mixed notation
-- check reverse-listing of named-arg calls -- check reverse-listing of named-arg calls
CREATE VIEW dfview AS CREATE VIEW dfview AS
SELECT q1, q2, SELECT q1, q2,
dfunc(q1,q2, q1>q2 as flag) as c3, dfunc(q1,q2, flag := q1>q2) as c3,
dfunc(q1, q1<q2 as flag, q2 AS b) as c4 dfunc(q1, flag := q1<q2, b := q2) as c4
FROM int8_tbl; FROM int8_tbl;
select * from dfview; select * from dfview;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment