--
-- TEXT
--
SELECT text 'this is a text string' = text 'this is a text string' AS true;
SELECT text 'this is a text string' = text 'this is a text strin' AS false;
CREATE TABLE TEXT_TBL (f1 text);
INSERT INTO TEXT_TBL VALUES ('doh!');
INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor');
SELECT * FROM TEXT_TBL;
-- As of 8.3 we have removed most implicit casts to text, so that for example
-- this no longer works:
select length(42);
-stdin-:: Error: Type annotation
-stdin-::1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem
-- As of 8.3 we have removed most implicit casts to text, so that for example
^
-stdin-::3:8: Error: At function: PgCall
select length(42);
^
-stdin-::3:8: Error: Unable to find an overload for proc length with given argument types: (int4)
select length(42);
^
-- 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;
-stdin-:: Error: Type annotation
-stdin-::1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem
-- But as a special exception for usability's sake, we still allow implicit
^
-stdin-::4:23: Error: At function: PgOp
select 'four: '::text || 2+2;
^
-stdin-::4:23: Error: Unable to find an overload for operator || with given argument type(s): (text,int4)
select 'four: '::text || 2+2;
^
select 'four: ' || 2+2;
-stdin-:: Error: Type annotation
-stdin-::1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem
select 'four: ' || 2+2;
^
-stdin-::1:17: Error: At function: PgOp
select 'four: ' || 2+2;
^
-stdin-::1:17: Error: Unable to find an overload for operator || with given argument type(s): (unknown,int4)
select 'four: ' || 2+2;
^
-- but not this:
select 3 || 4.0;
-stdin-:: Error: Type annotation
-stdin-::1:1: Error: At function: RemovePrefixMembers, At function: PgSelect, At function: PgSetItem, At function: PgResultItem
-- but not this:
^
-stdin-::2:10: Error: At function: PgOp
select 3 || 4.0;
^
-stdin-::2:10: Error: Unable to find an overload for operator || with given argument type(s): (int4,numeric)
select 3 || 4.0;
^
/*
* various string functions
*/
select concat('one');
select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD'));
select concat_ws('#','one');
select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD'));
select concat_ws(',',10,20,null,30);
select concat_ws('',10,20,null,30);
select concat_ws(NULL,10,20,null,30) is null;
select reverse('abcde');
select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i;
select quote_literal('');
select quote_literal('abc''');
select quote_literal(e'\\');
-- check variadic labeled argument
select concat(variadic array[1,2,3]);
-stdin-:: Error: Parse Sql
-stdin-::2:8: Error: FuncCall: unsupported func_variadic
select concat(variadic array[1,2,3]);
^
select concat_ws(',', variadic array[1,2,3]);
-stdin-:: Error: Parse Sql
-stdin-::1:8: Error: FuncCall: unsupported func_variadic
select concat_ws(',', variadic array[1,2,3]);
^
select concat_ws(',', variadic NULL::int[]);
-stdin-:: Error: Parse Sql
-stdin-::1:8: Error: FuncCall: unsupported func_variadic
select concat_ws(',', variadic NULL::int[]);
^
select concat(variadic NULL::int[]) is NULL;
-stdin-:: Error: Parse Sql
-stdin-::1:8: Error: FuncCall: unsupported func_variadic
select concat(variadic NULL::int[]) is NULL;
^
select concat(variadic '{}'::int[]) = '';
-stdin-:: Error: Parse Sql
-stdin-::1:8: Error: FuncCall: unsupported func_variadic
select concat(variadic '{}'::int[]) = '';
^
--should fail
select concat_ws(',', variadic 10);
-stdin-:: Error: Parse Sql
-stdin-::2:8: Error: FuncCall: unsupported func_variadic
select concat_ws(',', variadic 10);
^
/*
* format
*/
select format(NULL);
select format('Hello');
select format('Hello %s', 'World');
select format('Hello %%');
select format('Hello %%%%');
-- should fail
select format('Hello %s %s', 'World');
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
-- should fail
^
-stdin-::1:1: Fatal: ERROR: too few arguments for format()
-- should fail
^
select format('Hello %s');
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
select format('Hello %s');
^
-stdin-::1:1: Fatal: ERROR: too few arguments for format()
select format('Hello %s');
^
select format('Hello %x', 20);
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
select format('Hello %x', 20);
^
-stdin-::1:1: Fatal: ERROR: unrecognized format() type specifier "x"
HINT: For a single "%" use "%%".
select format('Hello %x', 20);
^
-- check literal and sql identifiers
select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello');
select format('%s%s%s','Hello', NULL,'World');
select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL);
select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello');
-- should fail, sql identifier cannot be NULL
select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello');
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
-- should fail, sql identifier cannot be NULL
^
-stdin-::1:1: Fatal: ERROR: null values cannot be formatted as an SQL identifier
-- should fail, sql identifier cannot be NULL
^
-- check positional placeholders
select format('%1$s %3$s', 1, 2, 3);
select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
-- should fail
select format('%1$s %4$s', 1, 2, 3);
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
-- should fail
^
-stdin-::1:1: Fatal: ERROR: too few arguments for format()
-- should fail
^
select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
^
-stdin-::1:1: Fatal: ERROR: too few arguments for format()
select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
^
select format('%0$s', 'Hello');
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
select format('%0$s', 'Hello');
^
-stdin-::1:1: Fatal: ERROR: format specifies argument 0, but arguments are numbered from 1
select format('%0$s', 'Hello');
^
select format('%*0$s', 'Hello');
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
select format('%*0$s', 'Hello');
^
-stdin-::1:1: Fatal: ERROR: format specifies argument 0, but arguments are numbered from 1
select format('%*0$s', 'Hello');
^
select format('%1$', 1);
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
select format('%1$', 1);
^
-stdin-::1:1: Fatal: ERROR: unterminated format() type specifier
HINT: For a single "%" use "%%".
select format('%1$', 1);
^
select format('%1$1', 1);
-stdin-:: Fatal: Execution
-stdin-::1:1: Fatal: Execution of node: Result
select format('%1$1', 1);
^
-stdin-::1:1: Fatal: ERROR: unterminated format() type specifier
HINT: For a single "%" use "%%".
select format('%1$1', 1);
^
-- 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']);
-stdin-:: Error: Parse Sql
-stdin-::2:8: Error: FuncCall: unsupported func_variadic
select format('%s, %s', variadic array['Hello','World']);
^
select format('%s, %s', variadic array[1, 2]);
-stdin-:: Error: Parse Sql
-stdin-::1:8: Error: FuncCall: unsupported func_variadic
select format('%s, %s', variadic array[1, 2]);
^
select format('%s, %s', variadic array[true, false]);
-stdin-:: Error: Parse Sql
-stdin-::1:8: Error: FuncCall: unsupported func_variadic
select format('%s, %s', variadic array[true, false]);
^
select format('%s, %s', variadic array[true, false]::text[]);
-stdin-:: Error: Parse Sql
-stdin-::1:8: Error: FuncCall: unsupported func_variadic
select format('%s, %s', variadic array[true, false]::text[]);
^
-- check variadic with positional placeholders
select format('%2$s, %1$s', variadic array['first', 'second']);
-stdin-:: Error: Parse Sql
-stdin-::2:8: Error: FuncCall: unsupported func_variadic
select format('%2$s, %1$s', variadic array['first', 'second']);
^
select format('%2$s, %1$s', variadic array[1, 2]);
-stdin-:: Error: Parse Sql
-stdin-::1:8: Error: FuncCall: unsupported func_variadic
select format('%2$s, %1$s', variadic array[1, 2]);
^
-- variadic argument can be array type NULL, but should not be referenced
select format('Hello', variadic NULL::int[]);
-stdin-:: Error: Parse Sql
-stdin-::2:8: Error: FuncCall: unsupported func_variadic
select format('Hello', variadic NULL::int[]);
^
-- 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);
-stdin-:: Error: Parse Sql
-stdin-::2:8: Error: FuncCall: unsupported func_variadic
select format(string_agg('%s',','), variadic array_agg(i))
^
-- check field widths and left, right alignment
select format('>>%10s<<', 'Hello');
select format('>>%10s<<', NULL);
select format('>>%10s<<', '');
select format('>>%-10s<<', '');
select format('>>%-10s<<', 'Hello');
select format('>>%-10s<<', NULL);
select format('>>%1$10s<<', 'Hello');
select format('>>%1$-10I<<', 'Hello');
select format('>>%2$*1$L<<', 10, 'Hello');
select format('>>%2$*1$L<<', 10, NULL);
select format('>>%2$*1$L<<', -10, NULL);
select format('>>%*s<<', 10, 'Hello');
select format('>>%*1$s<<', 10, 'Hello');
select format('>>%-s<<', 'Hello');
select format('>>%10L<<', NULL);
select format('>>%2$*1$L<<', NULL, 'Hello');
select format('>>%2$*1$L<<', 0, 'Hello');