--
-- 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.
/*
 * various 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 quote_literal('');
 quote_literal 
---------------
 ''
(1 row)

select quote_literal('abc''');
 quote_literal 
---------------
 'abc'''
(1 row)

select quote_literal(e'\\');
 quote_literal 
---------------
 E'\\'
(1 row)

/*
 * format
 */
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)

