postgresql/src/test/regress/expected/text.out
Robert Haas 7504870778 Add new SQL function, format(text).
Currently, three conversion format specifiers are supported: %s for a
string, %L for an SQL literal, and %I for an SQL identifier.  The latter
two are deliberately designed not to overlap with what sprintf() already
supports, in case we want to add more of sprintf()'s functionality here
later.

Patch by Pavel Stehule, heavily revised by me.  Reviewed by Jeff Janes
and, in earlier versions, by Itagaki Takahiro and Tom Lane.
2010-11-20 22:33:27 -05:00

223 lines
4.9 KiB
Plaintext

--
-- TEXT
--
SELECT text 'this is a text string' = text 'this is a text string' AS true;
true
------
t
(1 row)
SELECT text 'this is a text string' = text 'this is a text strin' AS false;
false
-------
f
(1 row)
CREATE TABLE TEXT_TBL (f1 text);
INSERT INTO TEXT_TBL VALUES ('doh!');
INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor');
SELECT '' AS two, * FROM TEXT_TBL;
two | f1
-----+-------------------
| doh!
| hi de ho neighbor
(2 rows)
-- As of 8.3 we have removed most implicit casts to text, so that for example
-- this no longer works:
select length(42);
ERROR: function length(integer) does not exist
LINE 1: select length(42);
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
-- But as a special exception for usability's sake, we still allow implicit
-- casting to text in concatenations, so long as the other input is text or
-- an unknown literal. So these work:
select 'four: '::text || 2+2;
?column?
----------
four: 4
(1 row)
select 'four: ' || 2+2;
?column?
----------
four: 4
(1 row)
-- but not this:
select 3 || 4.0;
ERROR: operator does not exist: integer || numeric
LINE 1: select 3 || 4.0;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
/*
* string functions
*/
select concat('one');
concat
--------
one
(1 row)
select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD'));
concat
----------------------
123hellotf03-09-2010
(1 row)
select concat_ws('#','one');
concat_ws
-----------
one
(1 row)
select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD'));
concat_ws
----------------------------
1#2#3#hello#t#f#03-09-2010
(1 row)
select concat_ws(',',10,20,null,30);
concat_ws
-----------
10,20,30
(1 row)
select concat_ws('',10,20,null,30);
concat_ws
-----------
102030
(1 row)
select concat_ws(NULL,10,20,null,30) is null;
?column?
----------
t
(1 row)
select reverse('abcde');
reverse
---------
edcba
(1 row)
select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i;
i | left | right
----+------+-------
-5 | |
-4 | |
-3 | a | j
-2 | ah | oj
-1 | aho | hoj
0 | |
1 | a | j
2 | ah | oj
3 | aho | hoj
4 | ahoj | ahoj
5 | ahoj | ahoj
(11 rows)
select format(NULL);
format
--------
(1 row)
select format('Hello');
format
--------
Hello
(1 row)
select format('Hello %s', 'World');
format
-------------
Hello World
(1 row)
select format('Hello %%');
format
---------
Hello %
(1 row)
select format('Hello %%%%');
format
----------
Hello %%
(1 row)
-- should fail
select format('Hello %s %s', 'World');
ERROR: too few arguments for format conversion
select format('Hello %s');
ERROR: too few arguments for format conversion
select format('Hello %x', 20);
ERROR: unrecognized conversion specifier: x
-- check literal and sql identifiers
select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello');
format
----------------------------------------
INSERT INTO mytab VALUES('10','Hello')
(1 row)
select format('%s%s%s','Hello', NULL,'World');
format
------------
HelloWorld
(1 row)
select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL);
format
-------------------------------------
INSERT INTO mytab VALUES('10',NULL)
(1 row)
select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello');
format
----------------------------------------
INSERT INTO mytab VALUES(NULL,'Hello')
(1 row)
-- should fail, sql identifier cannot be NULL
select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello');
ERROR: NULL cannot be escaped as an SQL identifier
-- check positional placeholders
select format('%1$s %3$s', 1, 2, 3);
format
--------
1 3
(1 row)
select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
format
--------
1 12
(1 row)
-- should fail
select format('%1$s %4$s', 1, 2, 3);
ERROR: too few arguments for format conversion
select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
ERROR: too few arguments for format conversion
select format('%1s', 1);
ERROR: unterminated conversion specifier
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
select format('Hello %s %1$s %s', 'World', 'Hello again');
format
-------------------------------
Hello World World Hello again
(1 row)
select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again');
format
--------------------------------------------------
Hello World Hello again, Hello again Hello again
(1 row)