diff options
| author | Tom Lane | 2013-01-25 05:19:18 +0000 |
|---|---|---|
| committer | Tom Lane | 2013-01-25 05:19:56 +0000 |
| commit | 760f3c043ad4ee622b596d005ec31bb5e0322c4a (patch) | |
| tree | c25bee99d164d7e5cd8d481f224d1acaf3f8b589 /src/test | |
| parent | 56a6317bf54625c7fdade6cd1ab38178bba42448 (diff) | |
Fix concat() and format() to handle VARIADIC-labeled arguments correctly.
Previously, the VARIADIC labeling was effectively ignored, but now these
functions act as though the array elements had all been given as separate
arguments.
Pavel Stehule
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/text.out | 89 | ||||
| -rw-r--r-- | src/test/regress/sql/text.sql | 23 |
2 files changed, 110 insertions, 2 deletions
diff --git a/src/test/regress/expected/text.out b/src/test/regress/expected/text.out index e45714f77e..b7565830d6 100644 --- a/src/test/regress/expected/text.out +++ b/src/test/regress/expected/text.out @@ -136,6 +136,40 @@ select quote_literal(e'\\'); E'\\' (1 row) +-- check variadic labeled argument +select concat(variadic array[1,2,3]); + concat +-------- + 123 +(1 row) + +select concat_ws(',', variadic array[1,2,3]); + concat_ws +----------- + 1,2,3 +(1 row) + +select concat_ws(',', variadic NULL); + concat_ws +----------- + +(1 row) + +select concat(variadic NULL) is NULL; + ?column? +---------- + t +(1 row) + +select concat(variadic '{}'::int[]) = ''; + ?column? +---------- + t +(1 row) + +--should fail +select concat_ws(',', variadic 10); +ERROR: VARIADIC argument must be an array /* * format */ @@ -228,7 +262,7 @@ select format('%1$', 1); ERROR: unterminated conversion specifier select format('%1$1', 1); ERROR: unrecognized conversion specifier "1" ---checkk mix of positional and ordered placeholders +-- check mix of positional and ordered placeholders select format('Hello %s %1$s %s', 'World', 'Hello again'); format ------------------------------- @@ -241,3 +275,56 @@ select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); Hello World Hello again, Hello again Hello again (1 row) +-- check variadic labeled arguments +select format('%s, %s', variadic array['Hello','World']); + format +-------------- + Hello, World +(1 row) + +select format('%s, %s', variadic array[1, 2]); + format +-------- + 1, 2 +(1 row) + +select format('%s, %s', variadic array[true, false]); + format +-------- + t, f +(1 row) + +select format('%s, %s', variadic array[true, false]::text[]); + format +------------- + true, false +(1 row) + +-- check variadic with positional placeholders +select format('%2$s, %1$s', variadic array['first', 'second']); + format +--------------- + second, first +(1 row) + +select format('%2$s, %1$s', variadic array[1, 2]); + format +-------- + 2, 1 +(1 row) + +-- variadic argument can be NULL, but should not be referenced +select format('Hello', variadic NULL); + format +-------- + Hello +(1 row) + +-- variadic argument allows simulating more than FUNC_MAX_ARGS parameters +select format(string_agg('%s',','), variadic array_agg(i)) +from generate_series(1,200) g(i); + format +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200 +(1 row) + diff --git a/src/test/regress/sql/text.sql b/src/test/regress/sql/text.sql index 96e425d3cf..a96e9f7d1e 100644 --- a/src/test/regress/sql/text.sql +++ b/src/test/regress/sql/text.sql @@ -44,6 +44,14 @@ select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) ord select quote_literal(''); select quote_literal('abc'''); select quote_literal(e'\\'); +-- check variadic labeled argument +select concat(variadic array[1,2,3]); +select concat_ws(',', variadic array[1,2,3]); +select concat_ws(',', variadic NULL); +select concat(variadic NULL) is NULL; +select concat(variadic '{}'::int[]) = ''; +--should fail +select concat_ws(',', variadic 10); /* * format @@ -73,6 +81,19 @@ select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); select format('%1s', 1); select format('%1$', 1); select format('%1$1', 1); ---checkk mix of positional and ordered placeholders +-- check mix of positional and ordered placeholders select format('Hello %s %1$s %s', 'World', 'Hello again'); select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); +-- check variadic labeled arguments +select format('%s, %s', variadic array['Hello','World']); +select format('%s, %s', variadic array[1, 2]); +select format('%s, %s', variadic array[true, false]); +select format('%s, %s', variadic array[true, false]::text[]); +-- check variadic with positional placeholders +select format('%2$s, %1$s', variadic array['first', 'second']); +select format('%2$s, %1$s', variadic array[1, 2]); +-- variadic argument can be NULL, but should not be referenced +select format('Hello', variadic NULL); +-- variadic argument allows simulating more than FUNC_MAX_ARGS parameters +select format(string_agg('%s',','), variadic array_agg(i)) +from generate_series(1,200) g(i); |
