Fix obsolete comment regarding FSM truncation.
[PostgreSQL.git] / src / test / regress / expected / rowtypes.out
blobe1181a61b8327475e0602a56fc31e8c81e8d32ed
1 --
2 -- ROWTYPES
3 --
4 -- Make both a standalone composite type and a table rowtype
5 create type complex as (r float8, i float8);
6 create temp table fullname (first text, last text);
7 -- Nested composite
8 create type quad as (c1 complex, c2 complex);
9 -- Some simple tests of I/O conversions and row construction
10 select (1.1,2.2)::complex, row((3.3,4.4),(5.5,null))::quad;
11     row    |          row           
12 -----------+------------------------
13  (1.1,2.2) | ("(3.3,4.4)","(5.5,)")
14 (1 row)
16 select row('Joe', 'Blow')::fullname, '(Joe,Blow)'::fullname;
17     row     |  fullname  
18 ------------+------------
19  (Joe,Blow) | (Joe,Blow)
20 (1 row)
22 select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname;
23      fullname     |   fullname   
24 ------------------+--------------
25  (Joe,"von Blow") | (Joe,d'Blow)
26 (1 row)
28 select '(Joe,"von""Blow")'::fullname, E'(Joe,d\\\\Blow)'::fullname;
29      fullname      |    fullname     
30 -------------------+-----------------
31  (Joe,"von""Blow") | (Joe,"d\\Blow")
32 (1 row)
34 select '(Joe,"Blow,Jr")'::fullname;
35     fullname     
36 -----------------
37  (Joe,"Blow,Jr")
38 (1 row)
40 select '(Joe,)'::fullname;      -- ok, null 2nd column
41  fullname 
42 ----------
43  (Joe,)
44 (1 row)
46 select '(Joe)'::fullname;       -- bad
47 ERROR:  malformed record literal: "(Joe)"
48 LINE 1: select '(Joe)'::fullname;
49                ^
50 DETAIL:  Too few columns.
51 select '(Joe,,)'::fullname;     -- bad
52 ERROR:  malformed record literal: "(Joe,,)"
53 LINE 1: select '(Joe,,)'::fullname;
54                ^
55 DETAIL:  Too many columns.
56 create temp table quadtable(f1 int, q quad);
57 insert into quadtable values (1, ((3.3,4.4),(5.5,6.6)));
58 insert into quadtable values (2, ((null,4.4),(5.5,6.6)));
59 select * from quadtable;
60  f1 |             q             
61 ----+---------------------------
62   1 | ("(3.3,4.4)","(5.5,6.6)")
63   2 | ("(,4.4)","(5.5,6.6)")
64 (2 rows)
66 begin;
67 set local add_missing_from = false;
68 select f1, q.c1 from quadtable;         -- fails, q is a table reference
69 ERROR:  missing FROM-clause entry for table "q"
70 LINE 1: select f1, q.c1 from quadtable;
71                    ^
72 rollback;
73 select f1, (q).c1, (qq.q).c1.i from quadtable qq;
74  f1 |    c1     |  i  
75 ----+-----------+-----
76   1 | (3.3,4.4) | 4.4
77   2 | (,4.4)    | 4.4
78 (2 rows)
80 create temp table people (fn fullname, bd date);
81 insert into people values ('(Joe,Blow)', '1984-01-10');
82 select * from people;
83      fn     |     bd     
84 ------------+------------
85  (Joe,Blow) | 01-10-1984
86 (1 row)
88 -- at the moment this will not work due to ALTER TABLE inadequacy:
89 alter table fullname add column suffix text default '';
90 ERROR:  cannot alter table "fullname" because column "people"."fn" uses its rowtype
91 -- but this should work:
92 alter table fullname add column suffix text default null;
93 select * from people;
94      fn      |     bd     
95 -------------+------------
96  (Joe,Blow,) | 01-10-1984
97 (1 row)
99 -- test insertion/updating of subfields
100 update people set fn.suffix = 'Jr';
101 select * from people;
102       fn       |     bd     
103 ---------------+------------
104  (Joe,Blow,Jr) | 01-10-1984
105 (1 row)
107 insert into quadtable (f1, q.c1.r, q.c2.i) values(44,55,66);
108 select * from quadtable;
109  f1 |             q             
110 ----+---------------------------
111   1 | ("(3.3,4.4)","(5.5,6.6)")
112   2 | ("(,4.4)","(5.5,6.6)")
113  44 | ("(55,)","(,66)")
114 (3 rows)
116 -- The object here is to ensure that toasted references inside
117 -- composite values don't cause problems.  The large f1 value will
118 -- be toasted inside pp, it must still work after being copied to people.
119 create temp table pp (f1 text);
120 insert into pp values (repeat('abcdefghijkl', 100000));
121 insert into people select ('Jim', f1, null)::fullname, current_date from pp;
122 select (fn).first, substr((fn).last, 1, 20), length((fn).last) from people;
123  first |        substr        | length  
124 -------+----------------------+---------
125  Joe   | Blow                 |       4
126  Jim   | abcdefghijklabcdefgh | 1200000
127 (2 rows)
129 -- Test row comparison semantics.  Prior to PG 8.2 we did this in a totally
130 -- non-spec-compliant way.
131 select ROW(1,2) < ROW(1,3) as true;
132  true 
133 ------
135 (1 row)
137 select ROW(1,2) < ROW(1,1) as false;
138  false 
139 -------
141 (1 row)
143 select ROW(1,2) < ROW(1,NULL) as null;
144  null 
145 ------
147 (1 row)
149 select ROW(1,2,3) < ROW(1,3,NULL) as true; -- the NULL is not examined
150  true 
151 ------
153 (1 row)
155 select ROW(11,'ABC') < ROW(11,'DEF') as true;
156  true 
157 ------
159 (1 row)
161 select ROW(11,'ABC') > ROW(11,'DEF') as false;
162  false 
163 -------
165 (1 row)
167 select ROW(12,'ABC') > ROW(11,'DEF') as true;
168  true 
169 ------
171 (1 row)
173 -- = and <> have different NULL-behavior than < etc
174 select ROW(1,2,3) < ROW(1,NULL,4) as null;
175  null 
176 ------
178 (1 row)
180 select ROW(1,2,3) = ROW(1,NULL,4) as false;
181  false 
182 -------
184 (1 row)
186 select ROW(1,2,3) <> ROW(1,NULL,4) as true;
187  true 
188 ------
190 (1 row)
192 -- We allow operators beyond the six standard ones, if they have btree
193 -- operator classes.
194 select ROW('ABC','DEF') ~<=~ ROW('DEF','ABC') as true;
195  true 
196 ------
198 (1 row)
200 select ROW('ABC','DEF') ~>=~ ROW('DEF','ABC') as false;
201  false 
202 -------
204 (1 row)
206 select ROW('ABC','DEF') ~~ ROW('DEF','ABC') as fail;
207 ERROR:  could not determine interpretation of row comparison operator ~~
208 LINE 1: select ROW('ABC','DEF') ~~ ROW('DEF','ABC') as fail;
209                                 ^
210 HINT:  Row comparison operators must be associated with btree operator families.
211 -- Check row comparison with a subselect
212 select unique1, unique2 from tenk1
213 where (unique1, unique2) < any (select ten, ten from tenk1 where hundred < 3)
214       and unique1 <= 20
215 order by 1;
216  unique1 | unique2 
217 ---------+---------
218        0 |    9998
219        1 |    2838
220 (2 rows)
222 -- Also check row comparison with an indexable condition
223 select thousand, tenthous from tenk1
224 where (thousand, tenthous) >= (997, 5000)
225 order by thousand, tenthous;
226  thousand | tenthous 
227 ----------+----------
228       997 |     5997
229       997 |     6997
230       997 |     7997
231       997 |     8997
232       997 |     9997
233       998 |      998
234       998 |     1998
235       998 |     2998
236       998 |     3998
237       998 |     4998
238       998 |     5998
239       998 |     6998
240       998 |     7998
241       998 |     8998
242       998 |     9998
243       999 |      999
244       999 |     1999
245       999 |     2999
246       999 |     3999
247       999 |     4999
248       999 |     5999
249       999 |     6999
250       999 |     7999
251       999 |     8999
252       999 |     9999
253 (25 rows)
255 -- Check some corner cases involving empty rowtypes
256 select ROW();
257  row 
258 -----
259  ()
260 (1 row)
262 select ROW() IS NULL;
263  ?column? 
264 ----------
266 (1 row)
268 select ROW() = ROW();
269 ERROR:  cannot compare rows of zero length
270 LINE 1: select ROW() = ROW();
271                      ^
272 -- Check ability to create arrays of anonymous rowtypes
273 select array[ row(1,2), row(3,4), row(5,6) ];
274            array           
275 ---------------------------
276  {"(1,2)","(3,4)","(5,6)"}
277 (1 row)
279 -- Check ability to compare an anonymous row to elements of an array
280 select row(1,1.1) = any (array[ row(7,7.7), row(1,1.1), row(0,0.0) ]);
281  ?column? 
282 ----------
284 (1 row)
286 select row(1,1.1) = any (array[ row(7,7.7), row(1,1.0), row(0,0.0) ]);
287  ?column? 
288 ----------
290 (1 row)