]> granicus.if.org Git - postgresql/blob - src/test/regress/expected/text.out
Fix concat() and format() to handle VARIADIC-labeled arguments correctly.
[postgresql] / src / test / regress / expected / text.out
1 --
2 -- TEXT
3 --
4 SELECT text 'this is a text string' = text 'this is a text string' AS true;
5  true 
6 ------
7  t
8 (1 row)
9
10 SELECT text 'this is a text string' = text 'this is a text strin' AS false;
11  false 
12 -------
13  f
14 (1 row)
15
16 CREATE TABLE TEXT_TBL (f1 text);
17 INSERT INTO TEXT_TBL VALUES ('doh!');
18 INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor');
19 SELECT '' AS two, * FROM TEXT_TBL;
20  two |        f1         
21 -----+-------------------
22      | doh!
23      | hi de ho neighbor
24 (2 rows)
25
26 -- As of 8.3 we have removed most implicit casts to text, so that for example
27 -- this no longer works:
28 select length(42);
29 ERROR:  function length(integer) does not exist
30 LINE 1: select length(42);
31                ^
32 HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
33 -- But as a special exception for usability's sake, we still allow implicit
34 -- casting to text in concatenations, so long as the other input is text or
35 -- an unknown literal.  So these work:
36 select 'four: '::text || 2+2;
37  ?column? 
38 ----------
39  four: 4
40 (1 row)
41
42 select 'four: ' || 2+2;
43  ?column? 
44 ----------
45  four: 4
46 (1 row)
47
48 -- but not this:
49 select 3 || 4.0;
50 ERROR:  operator does not exist: integer || numeric
51 LINE 1: select 3 || 4.0;
52                  ^
53 HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
54 /*
55  * various string functions
56  */
57 select concat('one');
58  concat 
59 --------
60  one
61 (1 row)
62
63 select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD'));
64         concat        
65 ----------------------
66  123hellotf03-09-2010
67 (1 row)
68
69 select concat_ws('#','one');
70  concat_ws 
71 -----------
72  one
73 (1 row)
74
75 select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD'));
76          concat_ws          
77 ----------------------------
78  1#2#3#hello#t#f#03-09-2010
79 (1 row)
80
81 select concat_ws(',',10,20,null,30);
82  concat_ws 
83 -----------
84  10,20,30
85 (1 row)
86
87 select concat_ws('',10,20,null,30);
88  concat_ws 
89 -----------
90  102030
91 (1 row)
92
93 select concat_ws(NULL,10,20,null,30) is null;
94  ?column? 
95 ----------
96  t
97 (1 row)
98
99 select reverse('abcde');
100  reverse 
101 ---------
102  edcba
103 (1 row)
104
105 select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i;
106  i  | left | right 
107 ----+------+-------
108  -5 |      | 
109  -4 |      | 
110  -3 | a    | j
111  -2 | ah   | oj
112  -1 | aho  | hoj
113   0 |      | 
114   1 | a    | j
115   2 | ah   | oj
116   3 | aho  | hoj
117   4 | ahoj | ahoj
118   5 | ahoj | ahoj
119 (11 rows)
120
121 select quote_literal('');
122  quote_literal 
123 ---------------
124  ''
125 (1 row)
126
127 select quote_literal('abc''');
128  quote_literal 
129 ---------------
130  'abc'''
131 (1 row)
132
133 select quote_literal(e'\\');
134  quote_literal 
135 ---------------
136  E'\\'
137 (1 row)
138
139 -- check variadic labeled argument
140 select concat(variadic array[1,2,3]);
141  concat 
142 --------
143  123
144 (1 row)
145
146 select concat_ws(',', variadic array[1,2,3]);
147  concat_ws 
148 -----------
149  1,2,3
150 (1 row)
151
152 select concat_ws(',', variadic NULL);
153  concat_ws 
154 -----------
155  
156 (1 row)
157
158 select concat(variadic NULL) is NULL;
159  ?column? 
160 ----------
161  t
162 (1 row)
163
164 select concat(variadic '{}'::int[]) = '';
165  ?column? 
166 ----------
167  t
168 (1 row)
169
170 --should fail
171 select concat_ws(',', variadic 10);
172 ERROR:  VARIADIC argument must be an array
173 /*
174  * format
175  */
176 select format(NULL);
177  format 
178 --------
179  
180 (1 row)
181
182 select format('Hello');
183  format 
184 --------
185  Hello
186 (1 row)
187
188 select format('Hello %s', 'World');
189    format    
190 -------------
191  Hello World
192 (1 row)
193
194 select format('Hello %%');
195  format  
196 ---------
197  Hello %
198 (1 row)
199
200 select format('Hello %%%%');
201   format  
202 ----------
203  Hello %%
204 (1 row)
205
206 -- should fail
207 select format('Hello %s %s', 'World');
208 ERROR:  too few arguments for format
209 select format('Hello %s');
210 ERROR:  too few arguments for format
211 select format('Hello %x', 20);
212 ERROR:  unrecognized conversion specifier "x"
213 -- check literal and sql identifiers
214 select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello');
215                  format                 
216 ----------------------------------------
217  INSERT INTO mytab VALUES('10','Hello')
218 (1 row)
219
220 select format('%s%s%s','Hello', NULL,'World');
221    format   
222 ------------
223  HelloWorld
224 (1 row)
225
226 select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL);
227                format                
228 -------------------------------------
229  INSERT INTO mytab VALUES('10',NULL)
230 (1 row)
231
232 select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello');
233                  format                 
234 ----------------------------------------
235  INSERT INTO mytab VALUES(NULL,'Hello')
236 (1 row)
237
238 -- should fail, sql identifier cannot be NULL
239 select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello');
240 ERROR:  null values cannot be formatted as an SQL identifier
241 -- check positional placeholders
242 select format('%1$s %3$s', 1, 2, 3);
243  format 
244 --------
245  1 3
246 (1 row)
247
248 select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
249  format 
250 --------
251  1 12
252 (1 row)
253
254 -- should fail
255 select format('%1$s %4$s', 1, 2, 3);
256 ERROR:  too few arguments for format
257 select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
258 ERROR:  too few arguments for format
259 select format('%1s', 1);
260 ERROR:  unterminated conversion specifier
261 select format('%1$', 1);
262 ERROR:  unterminated conversion specifier
263 select format('%1$1', 1);
264 ERROR:  unrecognized conversion specifier "1"
265 -- check mix of positional and ordered placeholders
266 select format('Hello %s %1$s %s', 'World', 'Hello again');
267             format             
268 -------------------------------
269  Hello World World Hello again
270 (1 row)
271
272 select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again');
273                       format                      
274 --------------------------------------------------
275  Hello World Hello again, Hello again Hello again
276 (1 row)
277
278 -- check variadic labeled arguments
279 select format('%s, %s', variadic array['Hello','World']);
280     format    
281 --------------
282  Hello, World
283 (1 row)
284
285 select format('%s, %s', variadic array[1, 2]);
286  format 
287 --------
288  1, 2
289 (1 row)
290
291 select format('%s, %s', variadic array[true, false]);
292  format 
293 --------
294  t, f
295 (1 row)
296
297 select format('%s, %s', variadic array[true, false]::text[]);
298    format    
299 -------------
300  true, false
301 (1 row)
302
303 -- check variadic with positional placeholders
304 select format('%2$s, %1$s', variadic array['first', 'second']);
305     format     
306 ---------------
307  second, first
308 (1 row)
309
310 select format('%2$s, %1$s', variadic array[1, 2]);
311  format 
312 --------
313  2, 1
314 (1 row)
315
316 -- variadic argument can be NULL, but should not be referenced
317 select format('Hello', variadic NULL);
318  format 
319 --------
320  Hello
321 (1 row)
322
323 -- variadic argument allows simulating more than FUNC_MAX_ARGS parameters
324 select format(string_agg('%s',','), variadic array_agg(i))
325 from generate_series(1,200) g(i);
326                                                                                                                                                                                                                                                                                                                                                        format                                                                                                                                                                                                                                                                                                                                                        
327 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
328  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
329 (1 row)
330