Consistently use "superuser" instead of "super user"
[pgsql.git] / src / test / regress / expected / create_view.out
blobf50ef7668574130d8aa861d382e451bc335aa51b
1 --
2 -- CREATE_VIEW
3 -- Virtual class definitions
4 --      (this also tests the query rewrite system)
5 --
6 CREATE VIEW street AS
7    SELECT r.name, r.thepath, c.cname AS cname
8    FROM ONLY road r, real_city c
9    WHERE c.outline ## r.thepath;
10 CREATE VIEW iexit AS
11    SELECT ih.name, ih.thepath,
12         interpt_pp(ih.thepath, r.thepath) AS exit
13    FROM ihighway ih, ramp r
14    WHERE ih.thepath ## r.thepath;
15 CREATE VIEW toyemp AS
16    SELECT name, age, location, 12*salary AS annualsal
17    FROM emp;
18 -- Test comments
19 COMMENT ON VIEW noview IS 'no view';
20 ERROR:  relation "noview" does not exist
21 COMMENT ON VIEW toyemp IS 'is a view';
22 COMMENT ON VIEW toyemp IS NULL;
23 -- These views are left around mainly to exercise special cases in pg_dump.
24 CREATE TABLE view_base_table (key int PRIMARY KEY, data varchar(20));
25 CREATE VIEW key_dependent_view AS
26    SELECT * FROM view_base_table GROUP BY key;
27 ALTER TABLE view_base_table DROP CONSTRAINT view_base_table_pkey;  -- fails
28 ERROR:  cannot drop constraint view_base_table_pkey on table view_base_table because other objects depend on it
29 DETAIL:  view key_dependent_view depends on constraint view_base_table_pkey on table view_base_table
30 HINT:  Use DROP ... CASCADE to drop the dependent objects too.
31 CREATE VIEW key_dependent_view_no_cols AS
32    SELECT FROM view_base_table GROUP BY key HAVING length(data) > 0;
34 -- CREATE OR REPLACE VIEW
36 CREATE TABLE viewtest_tbl (a int, b int);
37 COPY viewtest_tbl FROM stdin;
38 CREATE OR REPLACE VIEW viewtest AS
39         SELECT * FROM viewtest_tbl;
40 CREATE OR REPLACE VIEW viewtest AS
41         SELECT * FROM viewtest_tbl WHERE a > 10;
42 SELECT * FROM viewtest;
43  a  | b  
44 ----+----
45  15 | 20
46  20 | 25
47 (2 rows)
49 CREATE OR REPLACE VIEW viewtest AS
50         SELECT a, b FROM viewtest_tbl WHERE a > 5 ORDER BY b DESC;
51 SELECT * FROM viewtest;
52  a  | b  
53 ----+----
54  20 | 25
55  15 | 20
56  10 | 15
57 (3 rows)
59 -- should fail
60 CREATE OR REPLACE VIEW viewtest AS
61         SELECT a FROM viewtest_tbl WHERE a <> 20;
62 ERROR:  cannot drop columns from view
63 -- should fail
64 CREATE OR REPLACE VIEW viewtest AS
65         SELECT 1, * FROM viewtest_tbl;
66 ERROR:  cannot change name of view column "a" to "?column?"
67 HINT:  Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead.
68 -- should fail
69 CREATE OR REPLACE VIEW viewtest AS
70         SELECT a, b::numeric FROM viewtest_tbl;
71 ERROR:  cannot change data type of view column "b" from integer to numeric
72 -- should work
73 CREATE OR REPLACE VIEW viewtest AS
74         SELECT a, b, 0 AS c FROM viewtest_tbl;
75 DROP VIEW viewtest;
76 DROP TABLE viewtest_tbl;
77 -- tests for temporary views
78 CREATE SCHEMA temp_view_test
79     CREATE TABLE base_table (a int, id int)
80     CREATE TABLE base_table2 (a int, id int);
81 SET search_path TO temp_view_test, public;
82 CREATE TEMPORARY TABLE temp_table (a int, id int);
83 -- should be created in temp_view_test schema
84 CREATE VIEW v1 AS SELECT * FROM base_table;
85 -- should be created in temp object schema
86 CREATE VIEW v1_temp AS SELECT * FROM temp_table;
87 NOTICE:  view "v1_temp" will be a temporary view
88 -- should be created in temp object schema
89 CREATE TEMP VIEW v2_temp AS SELECT * FROM base_table;
90 -- should be created in temp_views schema
91 CREATE VIEW temp_view_test.v2 AS SELECT * FROM base_table;
92 -- should fail
93 CREATE VIEW temp_view_test.v3_temp AS SELECT * FROM temp_table;
94 NOTICE:  view "v3_temp" will be a temporary view
95 ERROR:  cannot create temporary relation in non-temporary schema
96 -- should fail
97 CREATE SCHEMA test_view_schema
98     CREATE TEMP VIEW testview AS SELECT 1;
99 ERROR:  cannot create temporary relation in non-temporary schema
100 -- joins: if any of the join relations are temporary, the view
101 -- should also be temporary
102 -- should be non-temp
103 CREATE VIEW v3 AS
104     SELECT t1.a AS t1_a, t2.a AS t2_a
105     FROM base_table t1, base_table2 t2
106     WHERE t1.id = t2.id;
107 -- should be temp (one join rel is temp)
108 CREATE VIEW v4_temp AS
109     SELECT t1.a AS t1_a, t2.a AS t2_a
110     FROM base_table t1, temp_table t2
111     WHERE t1.id = t2.id;
112 NOTICE:  view "v4_temp" will be a temporary view
113 -- should be temp
114 CREATE VIEW v5_temp AS
115     SELECT t1.a AS t1_a, t2.a AS t2_a, t3.a AS t3_a
116     FROM base_table t1, base_table2 t2, temp_table t3
117     WHERE t1.id = t2.id and t2.id = t3.id;
118 NOTICE:  view "v5_temp" will be a temporary view
119 -- subqueries
120 CREATE VIEW v4 AS SELECT * FROM base_table WHERE id IN (SELECT id FROM base_table2);
121 CREATE VIEW v5 AS SELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM base_table2) t2;
122 CREATE VIEW v6 AS SELECT * FROM base_table WHERE EXISTS (SELECT 1 FROM base_table2);
123 CREATE VIEW v7 AS SELECT * FROM base_table WHERE NOT EXISTS (SELECT 1 FROM base_table2);
124 CREATE VIEW v8 AS SELECT * FROM base_table WHERE EXISTS (SELECT 1);
125 CREATE VIEW v6_temp AS SELECT * FROM base_table WHERE id IN (SELECT id FROM temp_table);
126 NOTICE:  view "v6_temp" will be a temporary view
127 CREATE VIEW v7_temp AS SELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM temp_table) t2;
128 NOTICE:  view "v7_temp" will be a temporary view
129 CREATE VIEW v8_temp AS SELECT * FROM base_table WHERE EXISTS (SELECT 1 FROM temp_table);
130 NOTICE:  view "v8_temp" will be a temporary view
131 CREATE VIEW v9_temp AS SELECT * FROM base_table WHERE NOT EXISTS (SELECT 1 FROM temp_table);
132 NOTICE:  view "v9_temp" will be a temporary view
133 -- a view should also be temporary if it references a temporary view
134 CREATE VIEW v10_temp AS SELECT * FROM v7_temp;
135 NOTICE:  view "v10_temp" will be a temporary view
136 CREATE VIEW v11_temp AS SELECT t1.id, t2.a FROM base_table t1, v10_temp t2;
137 NOTICE:  view "v11_temp" will be a temporary view
138 CREATE VIEW v12_temp AS SELECT true FROM v11_temp;
139 NOTICE:  view "v12_temp" will be a temporary view
140 -- a view should also be temporary if it references a temporary sequence
141 CREATE SEQUENCE seq1;
142 CREATE TEMPORARY SEQUENCE seq1_temp;
143 CREATE VIEW v9 AS SELECT seq1.is_called FROM seq1;
144 CREATE VIEW v13_temp AS SELECT seq1_temp.is_called FROM seq1_temp;
145 NOTICE:  view "v13_temp" will be a temporary view
146 SELECT relname FROM pg_class
147     WHERE relname LIKE 'v_'
148     AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'temp_view_test')
149     ORDER BY relname;
150  relname 
151 ---------
152  v1
153  v2
154  v3
155  v4
156  v5
157  v6
158  v7
159  v8
160  v9
161 (9 rows)
163 SELECT relname FROM pg_class
164     WHERE relname LIKE 'v%'
165     AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE 'pg_temp%')
166     ORDER BY relname;
167  relname  
168 ----------
169  v10_temp
170  v11_temp
171  v12_temp
172  v13_temp
173  v1_temp
174  v2_temp
175  v4_temp
176  v5_temp
177  v6_temp
178  v7_temp
179  v8_temp
180  v9_temp
181 (12 rows)
183 CREATE SCHEMA testviewschm2;
184 SET search_path TO testviewschm2, public;
185 CREATE TABLE t1 (num int, name text);
186 CREATE TABLE t2 (num2 int, value text);
187 CREATE TEMP TABLE tt (num2 int, value text);
188 CREATE VIEW nontemp1 AS SELECT * FROM t1 CROSS JOIN t2;
189 CREATE VIEW temporal1 AS SELECT * FROM t1 CROSS JOIN tt;
190 NOTICE:  view "temporal1" will be a temporary view
191 CREATE VIEW nontemp2 AS SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num2;
192 CREATE VIEW temporal2 AS SELECT * FROM t1 INNER JOIN tt ON t1.num = tt.num2;
193 NOTICE:  view "temporal2" will be a temporary view
194 CREATE VIEW nontemp3 AS SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num2;
195 CREATE VIEW temporal3 AS SELECT * FROM t1 LEFT JOIN tt ON t1.num = tt.num2;
196 NOTICE:  view "temporal3" will be a temporary view
197 CREATE VIEW nontemp4 AS SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num2 AND t2.value = 'xxx';
198 CREATE VIEW temporal4 AS SELECT * FROM t1 LEFT JOIN tt ON t1.num = tt.num2 AND tt.value = 'xxx';
199 NOTICE:  view "temporal4" will be a temporary view
200 SELECT relname FROM pg_class
201     WHERE relname LIKE 'nontemp%'
202     AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'testviewschm2')
203     ORDER BY relname;
204  relname  
205 ----------
206  nontemp1
207  nontemp2
208  nontemp3
209  nontemp4
210 (4 rows)
212 SELECT relname FROM pg_class
213     WHERE relname LIKE 'temporal%'
214     AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE 'pg_temp%')
215     ORDER BY relname;
216   relname  
217 -----------
218  temporal1
219  temporal2
220  temporal3
221  temporal4
222 (4 rows)
224 CREATE TABLE tbl1 ( a int, b int);
225 CREATE TABLE tbl2 (c int, d int);
226 CREATE TABLE tbl3 (e int, f int);
227 CREATE TABLE tbl4 (g int, h int);
228 CREATE TEMP TABLE tmptbl (i int, j int);
229 --Should be in testviewschm2
230 CREATE   VIEW  pubview AS SELECT * FROM tbl1 WHERE tbl1.a
231 BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2)
232 AND EXISTS (SELECT g FROM tbl4 LEFT JOIN tbl3 ON tbl4.h = tbl3.f);
233 SELECT count(*) FROM pg_class where relname = 'pubview'
234 AND relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname = 'testviewschm2');
235  count 
236 -------
237      1
238 (1 row)
240 --Should be in temp object schema
241 CREATE   VIEW  mytempview AS SELECT * FROM tbl1 WHERE tbl1.a
242 BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2)
243 AND EXISTS (SELECT g FROM tbl4 LEFT JOIN tbl3 ON tbl4.h = tbl3.f)
244 AND NOT EXISTS (SELECT g FROM tbl4 LEFT JOIN tmptbl ON tbl4.h = tmptbl.j);
245 NOTICE:  view "mytempview" will be a temporary view
246 SELECT count(*) FROM pg_class where relname LIKE 'mytempview'
247 And relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname LIKE 'pg_temp%');
248  count 
249 -------
250      1
251 (1 row)
254 -- CREATE VIEW and WITH(...) clause
256 CREATE VIEW mysecview1
257        AS SELECT * FROM tbl1 WHERE a = 0;
258 CREATE VIEW mysecview2 WITH (security_barrier=true)
259        AS SELECT * FROM tbl1 WHERE a > 0;
260 CREATE VIEW mysecview3 WITH (security_barrier=false)
261        AS SELECT * FROM tbl1 WHERE a < 0;
262 CREATE VIEW mysecview4 WITH (security_barrier)
263        AS SELECT * FROM tbl1 WHERE a <> 0;
264 CREATE VIEW mysecview5 WITH (security_barrier=100)      -- Error
265        AS SELECT * FROM tbl1 WHERE a > 100;
266 ERROR:  invalid value for boolean option "security_barrier": 100
267 CREATE VIEW mysecview6 WITH (invalid_option)            -- Error
268        AS SELECT * FROM tbl1 WHERE a < 100;
269 ERROR:  unrecognized parameter "invalid_option"
270 SELECT relname, relkind, reloptions FROM pg_class
271        WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass,
272                      'mysecview3'::regclass, 'mysecview4'::regclass)
273        ORDER BY relname;
274   relname   | relkind |        reloptions        
275 ------------+---------+--------------------------
276  mysecview1 | v       | 
277  mysecview2 | v       | {security_barrier=true}
278  mysecview3 | v       | {security_barrier=false}
279  mysecview4 | v       | {security_barrier=true}
280 (4 rows)
282 CREATE OR REPLACE VIEW mysecview1
283        AS SELECT * FROM tbl1 WHERE a = 256;
284 CREATE OR REPLACE VIEW mysecview2
285        AS SELECT * FROM tbl1 WHERE a > 256;
286 CREATE OR REPLACE VIEW mysecview3 WITH (security_barrier=true)
287        AS SELECT * FROM tbl1 WHERE a < 256;
288 CREATE OR REPLACE VIEW mysecview4 WITH (security_barrier=false)
289        AS SELECT * FROM tbl1 WHERE a <> 256;
290 SELECT relname, relkind, reloptions FROM pg_class
291        WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass,
292                      'mysecview3'::regclass, 'mysecview4'::regclass)
293        ORDER BY relname;
294   relname   | relkind |        reloptions        
295 ------------+---------+--------------------------
296  mysecview1 | v       | 
297  mysecview2 | v       | 
298  mysecview3 | v       | {security_barrier=true}
299  mysecview4 | v       | {security_barrier=false}
300 (4 rows)
302 -- Check that unknown literals are converted to "text" in CREATE VIEW,
303 -- so that we don't end up with unknown-type columns.
304 CREATE VIEW unspecified_types AS
305   SELECT 42 as i, 42.5 as num, 'foo' as u, 'foo'::unknown as u2, null as n;
306 \d+ unspecified_types
307                    View "testviewschm2.unspecified_types"
308  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
309 --------+---------+-----------+----------+---------+----------+-------------
310  i      | integer |           |          |         | plain    | 
311  num    | numeric |           |          |         | main     | 
312  u      | text    |           |          |         | extended | 
313  u2     | text    |           |          |         | extended | 
314  n      | text    |           |          |         | extended | 
315 View definition:
316  SELECT 42 AS i,
317     42.5 AS num,
318     'foo'::text AS u,
319     'foo'::text AS u2,
320     NULL::text AS n;
322 SELECT * FROM unspecified_types;
323  i  | num  |  u  | u2  | n 
324 ----+------+-----+-----+---
325  42 | 42.5 | foo | foo | 
326 (1 row)
328 -- This test checks that proper typmods are assigned in a multi-row VALUES
329 CREATE VIEW tt1 AS
330   SELECT * FROM (
331     VALUES
332        ('abc'::varchar(3), '0123456789', 42, 'abcd'::varchar(4)),
333        ('0123456789', 'abc'::varchar(3), 42.12, 'abc'::varchar(4))
334   ) vv(a,b,c,d);
335 \d+ tt1
336                                 View "testviewschm2.tt1"
337  Column |         Type         | Collation | Nullable | Default | Storage  | Description 
338 --------+----------------------+-----------+----------+---------+----------+-------------
339  a      | character varying    |           |          |         | extended | 
340  b      | character varying    |           |          |         | extended | 
341  c      | numeric              |           |          |         | main     | 
342  d      | character varying(4) |           |          |         | extended | 
343 View definition:
344  SELECT vv.a,
345     vv.b,
346     vv.c,
347     vv.d
348    FROM ( VALUES ('abc'::character varying(3),'0123456789'::character varying,42,'abcd'::character varying(4)), ('0123456789'::character varying,'abc'::character varying(3),42.12,'abc'::character varying(4))) vv(a, b, c, d);
350 SELECT * FROM tt1;
351      a      |     b      |   c   |  d   
352 ------------+------------+-------+------
353  abc        | 0123456789 |    42 | abcd
354  0123456789 | abc        | 42.12 | abc
355 (2 rows)
357 SELECT a::varchar(3) FROM tt1;
358   a  
359 -----
360  abc
361  012
362 (2 rows)
364 DROP VIEW tt1;
365 -- Test view decompilation in the face of relation renaming conflicts
366 CREATE TABLE tt1 (f1 int, f2 int, f3 text);
367 CREATE TABLE tx1 (x1 int, x2 int, x3 text);
368 CREATE TABLE temp_view_test.tt1 (y1 int, f2 int, f3 text);
369 CREATE VIEW aliased_view_1 AS
370   select * from tt1
371     where exists (select 1 from tx1 where tt1.f1 = tx1.x1);
372 CREATE VIEW aliased_view_2 AS
373   select * from tt1 a1
374     where exists (select 1 from tx1 where a1.f1 = tx1.x1);
375 CREATE VIEW aliased_view_3 AS
376   select * from tt1
377     where exists (select 1 from tx1 a2 where tt1.f1 = a2.x1);
378 CREATE VIEW aliased_view_4 AS
379   select * from temp_view_test.tt1
380     where exists (select 1 from tt1 where temp_view_test.tt1.y1 = tt1.f1);
381 \d+ aliased_view_1
382                     View "testviewschm2.aliased_view_1"
383  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
384 --------+---------+-----------+----------+---------+----------+-------------
385  f1     | integer |           |          |         | plain    | 
386  f2     | integer |           |          |         | plain    | 
387  f3     | text    |           |          |         | extended | 
388 View definition:
389  SELECT tt1.f1,
390     tt1.f2,
391     tt1.f3
392    FROM tt1
393   WHERE (EXISTS ( SELECT 1
394            FROM tx1
395           WHERE tt1.f1 = tx1.x1));
397 \d+ aliased_view_2
398                     View "testviewschm2.aliased_view_2"
399  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
400 --------+---------+-----------+----------+---------+----------+-------------
401  f1     | integer |           |          |         | plain    | 
402  f2     | integer |           |          |         | plain    | 
403  f3     | text    |           |          |         | extended | 
404 View definition:
405  SELECT a1.f1,
406     a1.f2,
407     a1.f3
408    FROM tt1 a1
409   WHERE (EXISTS ( SELECT 1
410            FROM tx1
411           WHERE a1.f1 = tx1.x1));
413 \d+ aliased_view_3
414                     View "testviewschm2.aliased_view_3"
415  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
416 --------+---------+-----------+----------+---------+----------+-------------
417  f1     | integer |           |          |         | plain    | 
418  f2     | integer |           |          |         | plain    | 
419  f3     | text    |           |          |         | extended | 
420 View definition:
421  SELECT tt1.f1,
422     tt1.f2,
423     tt1.f3
424    FROM tt1
425   WHERE (EXISTS ( SELECT 1
426            FROM tx1 a2
427           WHERE tt1.f1 = a2.x1));
429 \d+ aliased_view_4
430                     View "testviewschm2.aliased_view_4"
431  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
432 --------+---------+-----------+----------+---------+----------+-------------
433  y1     | integer |           |          |         | plain    | 
434  f2     | integer |           |          |         | plain    | 
435  f3     | text    |           |          |         | extended | 
436 View definition:
437  SELECT tt1.y1,
438     tt1.f2,
439     tt1.f3
440    FROM temp_view_test.tt1
441   WHERE (EXISTS ( SELECT 1
442            FROM tt1 tt1_1
443           WHERE tt1.y1 = tt1_1.f1));
445 ALTER TABLE tx1 RENAME TO a1;
446 \d+ aliased_view_1
447                     View "testviewschm2.aliased_view_1"
448  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
449 --------+---------+-----------+----------+---------+----------+-------------
450  f1     | integer |           |          |         | plain    | 
451  f2     | integer |           |          |         | plain    | 
452  f3     | text    |           |          |         | extended | 
453 View definition:
454  SELECT tt1.f1,
455     tt1.f2,
456     tt1.f3
457    FROM tt1
458   WHERE (EXISTS ( SELECT 1
459            FROM a1
460           WHERE tt1.f1 = a1.x1));
462 \d+ aliased_view_2
463                     View "testviewschm2.aliased_view_2"
464  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
465 --------+---------+-----------+----------+---------+----------+-------------
466  f1     | integer |           |          |         | plain    | 
467  f2     | integer |           |          |         | plain    | 
468  f3     | text    |           |          |         | extended | 
469 View definition:
470  SELECT a1.f1,
471     a1.f2,
472     a1.f3
473    FROM tt1 a1
474   WHERE (EXISTS ( SELECT 1
475            FROM a1 a1_1
476           WHERE a1.f1 = a1_1.x1));
478 \d+ aliased_view_3
479                     View "testviewschm2.aliased_view_3"
480  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
481 --------+---------+-----------+----------+---------+----------+-------------
482  f1     | integer |           |          |         | plain    | 
483  f2     | integer |           |          |         | plain    | 
484  f3     | text    |           |          |         | extended | 
485 View definition:
486  SELECT tt1.f1,
487     tt1.f2,
488     tt1.f3
489    FROM tt1
490   WHERE (EXISTS ( SELECT 1
491            FROM a1 a2
492           WHERE tt1.f1 = a2.x1));
494 \d+ aliased_view_4
495                     View "testviewschm2.aliased_view_4"
496  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
497 --------+---------+-----------+----------+---------+----------+-------------
498  y1     | integer |           |          |         | plain    | 
499  f2     | integer |           |          |         | plain    | 
500  f3     | text    |           |          |         | extended | 
501 View definition:
502  SELECT tt1.y1,
503     tt1.f2,
504     tt1.f3
505    FROM temp_view_test.tt1
506   WHERE (EXISTS ( SELECT 1
507            FROM tt1 tt1_1
508           WHERE tt1.y1 = tt1_1.f1));
510 ALTER TABLE tt1 RENAME TO a2;
511 \d+ aliased_view_1
512                     View "testviewschm2.aliased_view_1"
513  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
514 --------+---------+-----------+----------+---------+----------+-------------
515  f1     | integer |           |          |         | plain    | 
516  f2     | integer |           |          |         | plain    | 
517  f3     | text    |           |          |         | extended | 
518 View definition:
519  SELECT a2.f1,
520     a2.f2,
521     a2.f3
522    FROM a2
523   WHERE (EXISTS ( SELECT 1
524            FROM a1
525           WHERE a2.f1 = a1.x1));
527 \d+ aliased_view_2
528                     View "testviewschm2.aliased_view_2"
529  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
530 --------+---------+-----------+----------+---------+----------+-------------
531  f1     | integer |           |          |         | plain    | 
532  f2     | integer |           |          |         | plain    | 
533  f3     | text    |           |          |         | extended | 
534 View definition:
535  SELECT a1.f1,
536     a1.f2,
537     a1.f3
538    FROM a2 a1
539   WHERE (EXISTS ( SELECT 1
540            FROM a1 a1_1
541           WHERE a1.f1 = a1_1.x1));
543 \d+ aliased_view_3
544                     View "testviewschm2.aliased_view_3"
545  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
546 --------+---------+-----------+----------+---------+----------+-------------
547  f1     | integer |           |          |         | plain    | 
548  f2     | integer |           |          |         | plain    | 
549  f3     | text    |           |          |         | extended | 
550 View definition:
551  SELECT a2.f1,
552     a2.f2,
553     a2.f3
554    FROM a2
555   WHERE (EXISTS ( SELECT 1
556            FROM a1 a2_1
557           WHERE a2.f1 = a2_1.x1));
559 \d+ aliased_view_4
560                     View "testviewschm2.aliased_view_4"
561  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
562 --------+---------+-----------+----------+---------+----------+-------------
563  y1     | integer |           |          |         | plain    | 
564  f2     | integer |           |          |         | plain    | 
565  f3     | text    |           |          |         | extended | 
566 View definition:
567  SELECT tt1.y1,
568     tt1.f2,
569     tt1.f3
570    FROM temp_view_test.tt1
571   WHERE (EXISTS ( SELECT 1
572            FROM a2
573           WHERE tt1.y1 = a2.f1));
575 ALTER TABLE a1 RENAME TO tt1;
576 \d+ aliased_view_1
577                     View "testviewschm2.aliased_view_1"
578  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
579 --------+---------+-----------+----------+---------+----------+-------------
580  f1     | integer |           |          |         | plain    | 
581  f2     | integer |           |          |         | plain    | 
582  f3     | text    |           |          |         | extended | 
583 View definition:
584  SELECT a2.f1,
585     a2.f2,
586     a2.f3
587    FROM a2
588   WHERE (EXISTS ( SELECT 1
589            FROM tt1
590           WHERE a2.f1 = tt1.x1));
592 \d+ aliased_view_2
593                     View "testviewschm2.aliased_view_2"
594  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
595 --------+---------+-----------+----------+---------+----------+-------------
596  f1     | integer |           |          |         | plain    | 
597  f2     | integer |           |          |         | plain    | 
598  f3     | text    |           |          |         | extended | 
599 View definition:
600  SELECT a1.f1,
601     a1.f2,
602     a1.f3
603    FROM a2 a1
604   WHERE (EXISTS ( SELECT 1
605            FROM tt1
606           WHERE a1.f1 = tt1.x1));
608 \d+ aliased_view_3
609                     View "testviewschm2.aliased_view_3"
610  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
611 --------+---------+-----------+----------+---------+----------+-------------
612  f1     | integer |           |          |         | plain    | 
613  f2     | integer |           |          |         | plain    | 
614  f3     | text    |           |          |         | extended | 
615 View definition:
616  SELECT a2.f1,
617     a2.f2,
618     a2.f3
619    FROM a2
620   WHERE (EXISTS ( SELECT 1
621            FROM tt1 a2_1
622           WHERE a2.f1 = a2_1.x1));
624 \d+ aliased_view_4
625                     View "testviewschm2.aliased_view_4"
626  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
627 --------+---------+-----------+----------+---------+----------+-------------
628  y1     | integer |           |          |         | plain    | 
629  f2     | integer |           |          |         | plain    | 
630  f3     | text    |           |          |         | extended | 
631 View definition:
632  SELECT tt1.y1,
633     tt1.f2,
634     tt1.f3
635    FROM temp_view_test.tt1
636   WHERE (EXISTS ( SELECT 1
637            FROM a2
638           WHERE tt1.y1 = a2.f1));
640 ALTER TABLE a2 RENAME TO tx1;
641 ALTER TABLE tx1 SET SCHEMA temp_view_test;
642 \d+ aliased_view_1
643                     View "testviewschm2.aliased_view_1"
644  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
645 --------+---------+-----------+----------+---------+----------+-------------
646  f1     | integer |           |          |         | plain    | 
647  f2     | integer |           |          |         | plain    | 
648  f3     | text    |           |          |         | extended | 
649 View definition:
650  SELECT tx1.f1,
651     tx1.f2,
652     tx1.f3
653    FROM temp_view_test.tx1
654   WHERE (EXISTS ( SELECT 1
655            FROM tt1
656           WHERE tx1.f1 = tt1.x1));
658 \d+ aliased_view_2
659                     View "testviewschm2.aliased_view_2"
660  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
661 --------+---------+-----------+----------+---------+----------+-------------
662  f1     | integer |           |          |         | plain    | 
663  f2     | integer |           |          |         | plain    | 
664  f3     | text    |           |          |         | extended | 
665 View definition:
666  SELECT a1.f1,
667     a1.f2,
668     a1.f3
669    FROM temp_view_test.tx1 a1
670   WHERE (EXISTS ( SELECT 1
671            FROM tt1
672           WHERE a1.f1 = tt1.x1));
674 \d+ aliased_view_3
675                     View "testviewschm2.aliased_view_3"
676  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
677 --------+---------+-----------+----------+---------+----------+-------------
678  f1     | integer |           |          |         | plain    | 
679  f2     | integer |           |          |         | plain    | 
680  f3     | text    |           |          |         | extended | 
681 View definition:
682  SELECT tx1.f1,
683     tx1.f2,
684     tx1.f3
685    FROM temp_view_test.tx1
686   WHERE (EXISTS ( SELECT 1
687            FROM tt1 a2
688           WHERE tx1.f1 = a2.x1));
690 \d+ aliased_view_4
691                     View "testviewschm2.aliased_view_4"
692  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
693 --------+---------+-----------+----------+---------+----------+-------------
694  y1     | integer |           |          |         | plain    | 
695  f2     | integer |           |          |         | plain    | 
696  f3     | text    |           |          |         | extended | 
697 View definition:
698  SELECT tt1.y1,
699     tt1.f2,
700     tt1.f3
701    FROM temp_view_test.tt1
702   WHERE (EXISTS ( SELECT 1
703            FROM temp_view_test.tx1
704           WHERE tt1.y1 = tx1.f1));
706 ALTER TABLE temp_view_test.tt1 RENAME TO tmp1;
707 ALTER TABLE temp_view_test.tmp1 SET SCHEMA testviewschm2;
708 ALTER TABLE tmp1 RENAME TO tx1;
709 \d+ aliased_view_1
710                     View "testviewschm2.aliased_view_1"
711  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
712 --------+---------+-----------+----------+---------+----------+-------------
713  f1     | integer |           |          |         | plain    | 
714  f2     | integer |           |          |         | plain    | 
715  f3     | text    |           |          |         | extended | 
716 View definition:
717  SELECT tx1.f1,
718     tx1.f2,
719     tx1.f3
720    FROM temp_view_test.tx1
721   WHERE (EXISTS ( SELECT 1
722            FROM tt1
723           WHERE tx1.f1 = tt1.x1));
725 \d+ aliased_view_2
726                     View "testviewschm2.aliased_view_2"
727  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
728 --------+---------+-----------+----------+---------+----------+-------------
729  f1     | integer |           |          |         | plain    | 
730  f2     | integer |           |          |         | plain    | 
731  f3     | text    |           |          |         | extended | 
732 View definition:
733  SELECT a1.f1,
734     a1.f2,
735     a1.f3
736    FROM temp_view_test.tx1 a1
737   WHERE (EXISTS ( SELECT 1
738            FROM tt1
739           WHERE a1.f1 = tt1.x1));
741 \d+ aliased_view_3
742                     View "testviewschm2.aliased_view_3"
743  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
744 --------+---------+-----------+----------+---------+----------+-------------
745  f1     | integer |           |          |         | plain    | 
746  f2     | integer |           |          |         | plain    | 
747  f3     | text    |           |          |         | extended | 
748 View definition:
749  SELECT tx1.f1,
750     tx1.f2,
751     tx1.f3
752    FROM temp_view_test.tx1
753   WHERE (EXISTS ( SELECT 1
754            FROM tt1 a2
755           WHERE tx1.f1 = a2.x1));
757 \d+ aliased_view_4
758                     View "testviewschm2.aliased_view_4"
759  Column |  Type   | Collation | Nullable | Default | Storage  | Description 
760 --------+---------+-----------+----------+---------+----------+-------------
761  y1     | integer |           |          |         | plain    | 
762  f2     | integer |           |          |         | plain    | 
763  f3     | text    |           |          |         | extended | 
764 View definition:
765  SELECT tx1.y1,
766     tx1.f2,
767     tx1.f3
768    FROM tx1
769   WHERE (EXISTS ( SELECT 1
770            FROM temp_view_test.tx1 tx1_1
771           WHERE tx1.y1 = tx1_1.f1));
773 -- Test aliasing of joins
774 create view view_of_joins as
775 select * from
776   (select * from (tbl1 cross join tbl2) same) ss,
777   (tbl3 cross join tbl4) same;
778 \d+ view_of_joins
779                     View "testviewschm2.view_of_joins"
780  Column |  Type   | Collation | Nullable | Default | Storage | Description 
781 --------+---------+-----------+----------+---------+---------+-------------
782  a      | integer |           |          |         | plain   | 
783  b      | integer |           |          |         | plain   | 
784  c      | integer |           |          |         | plain   | 
785  d      | integer |           |          |         | plain   | 
786  e      | integer |           |          |         | plain   | 
787  f      | integer |           |          |         | plain   | 
788  g      | integer |           |          |         | plain   | 
789  h      | integer |           |          |         | plain   | 
790 View definition:
791  SELECT ss.a,
792     ss.b,
793     ss.c,
794     ss.d,
795     same.e,
796     same.f,
797     same.g,
798     same.h
799    FROM ( SELECT same_1.a,
800             same_1.b,
801             same_1.c,
802             same_1.d
803            FROM (tbl1
804              CROSS JOIN tbl2) same_1) ss,
805     (tbl3
806      CROSS JOIN tbl4) same;
808 create table tbl1a (a int, c int);
809 create view view_of_joins_2a as select * from tbl1 join tbl1a using (a);
810 create view view_of_joins_2b as select * from tbl1 join tbl1a using (a) as x;
811 create view view_of_joins_2c as select * from (tbl1 join tbl1a using (a)) as y;
812 create view view_of_joins_2d as select * from (tbl1 join tbl1a using (a) as x) as y;
813 select pg_get_viewdef('view_of_joins_2a', true);
814        pg_get_viewdef       
815 ----------------------------
816   SELECT tbl1.a,           +
817      tbl1.b,               +
818      tbl1a.c               +
819     FROM tbl1              +
820       JOIN tbl1a USING (a);
821 (1 row)
823 select pg_get_viewdef('view_of_joins_2b', true);
824          pg_get_viewdef          
825 ---------------------------------
826   SELECT tbl1.a,                +
827      tbl1.b,                    +
828      tbl1a.c                    +
829     FROM tbl1                   +
830       JOIN tbl1a USING (a) AS x;
831 (1 row)
833 select pg_get_viewdef('view_of_joins_2c', true);
834         pg_get_viewdef         
835 -------------------------------
836   SELECT y.a,                 +
837      y.b,                     +
838      y.c                      +
839     FROM (tbl1                +
840       JOIN tbl1a USING (a)) y;
841 (1 row)
843 select pg_get_viewdef('view_of_joins_2d', true);
844            pg_get_viewdef           
845 ------------------------------------
846   SELECT y.a,                      +
847      y.b,                          +
848      y.c                           +
849     FROM (tbl1                     +
850       JOIN tbl1a USING (a) AS x) y;
851 (1 row)
853 -- Test view decompilation in the face of column addition/deletion/renaming
854 create table tt2 (a int, b int, c int);
855 create table tt3 (ax int8, b int2, c numeric);
856 create table tt4 (ay int, b int, q int);
857 create view v1 as select * from tt2 natural join tt3;
858 create view v1a as select * from (tt2 natural join tt3) j;
859 create view v2 as select * from tt2 join tt3 using (b,c) join tt4 using (b);
860 create view v2a as select * from (tt2 join tt3 using (b,c) join tt4 using (b)) j;
861 create view v3 as select * from tt2 join tt3 using (b,c) full join tt4 using (b);
862 select pg_get_viewdef('v1', true);
863        pg_get_viewdef        
864 -----------------------------
865   SELECT tt2.b,             +
866      tt3.c,                 +
867      tt2.a,                 +
868      tt3.ax                 +
869     FROM tt2                +
870       JOIN tt3 USING (b, c);
871 (1 row)
873 select pg_get_viewdef('v1a', true);
874          pg_get_viewdef         
875 --------------------------------
876   SELECT j.b,                  +
877      j.c,                      +
878      j.a,                      +
879      j.ax                      +
880     FROM (tt2                  +
881       JOIN tt3 USING (b, c)) j;
882 (1 row)
884 select pg_get_viewdef('v2', true);
885        pg_get_viewdef       
886 ----------------------------
887   SELECT tt2.b,            +
888      tt3.c,                +
889      tt2.a,                +
890      tt3.ax,               +
891      tt4.ay,               +
892      tt4.q                 +
893     FROM tt2               +
894       JOIN tt3 USING (b, c)+
895       JOIN tt4 USING (b);
896 (1 row)
898 select pg_get_viewdef('v2a', true);
899        pg_get_viewdef        
900 -----------------------------
901   SELECT j.b,               +
902      j.c,                   +
903      j.a,                   +
904      j.ax,                  +
905      j.ay,                  +
906      j.q                    +
907     FROM (tt2               +
908       JOIN tt3 USING (b, c) +
909       JOIN tt4 USING (b)) j;
910 (1 row)
912 select pg_get_viewdef('v3', true);
913         pg_get_viewdef         
914 -------------------------------
915   SELECT b,                   +
916      tt3.c,                   +
917      tt2.a,                   +
918      tt3.ax,                  +
919      tt4.ay,                  +
920      tt4.q                    +
921     FROM tt2                  +
922       JOIN tt3 USING (b, c)   +
923       FULL JOIN tt4 USING (b);
924 (1 row)
926 alter table tt2 add column d int;
927 alter table tt2 add column e int;
928 select pg_get_viewdef('v1', true);
929        pg_get_viewdef        
930 -----------------------------
931   SELECT tt2.b,             +
932      tt3.c,                 +
933      tt2.a,                 +
934      tt3.ax                 +
935     FROM tt2                +
936       JOIN tt3 USING (b, c);
937 (1 row)
939 select pg_get_viewdef('v1a', true);
940          pg_get_viewdef         
941 --------------------------------
942   SELECT j.b,                  +
943      j.c,                      +
944      j.a,                      +
945      j.ax                      +
946     FROM (tt2                  +
947       JOIN tt3 USING (b, c)) j;
948 (1 row)
950 select pg_get_viewdef('v2', true);
951        pg_get_viewdef       
952 ----------------------------
953   SELECT tt2.b,            +
954      tt3.c,                +
955      tt2.a,                +
956      tt3.ax,               +
957      tt4.ay,               +
958      tt4.q                 +
959     FROM tt2               +
960       JOIN tt3 USING (b, c)+
961       JOIN tt4 USING (b);
962 (1 row)
964 select pg_get_viewdef('v2a', true);
965        pg_get_viewdef        
966 -----------------------------
967   SELECT j.b,               +
968      j.c,                   +
969      j.a,                   +
970      j.ax,                  +
971      j.ay,                  +
972      j.q                    +
973     FROM (tt2               +
974       JOIN tt3 USING (b, c) +
975       JOIN tt4 USING (b)) j;
976 (1 row)
978 select pg_get_viewdef('v3', true);
979         pg_get_viewdef         
980 -------------------------------
981   SELECT b,                   +
982      tt3.c,                   +
983      tt2.a,                   +
984      tt3.ax,                  +
985      tt4.ay,                  +
986      tt4.q                    +
987     FROM tt2                  +
988       JOIN tt3 USING (b, c)   +
989       FULL JOIN tt4 USING (b);
990 (1 row)
992 alter table tt3 rename c to d;
993 select pg_get_viewdef('v1', true);
994               pg_get_viewdef               
995 -------------------------------------------
996   SELECT tt2.b,                           +
997      tt3.c,                               +
998      tt2.a,                               +
999      tt3.ax                               +
1000     FROM tt2                              +
1001       JOIN tt3 tt3(ax, b, c) USING (b, c);
1002 (1 row)
1004 select pg_get_viewdef('v1a', true);
1005                 pg_get_viewdef                
1006 ----------------------------------------------
1007   SELECT j.b,                                +
1008      j.c,                                    +
1009      j.a,                                    +
1010      j.ax                                    +
1011     FROM (tt2                                +
1012       JOIN tt3 tt3(ax, b, c) USING (b, c)) j;
1013 (1 row)
1015 select pg_get_viewdef('v2', true);
1016               pg_get_viewdef              
1017 ------------------------------------------
1018   SELECT tt2.b,                          +
1019      tt3.c,                              +
1020      tt2.a,                              +
1021      tt3.ax,                             +
1022      tt4.ay,                             +
1023      tt4.q                               +
1024     FROM tt2                             +
1025       JOIN tt3 tt3(ax, b, c) USING (b, c)+
1026       JOIN tt4 USING (b);
1027 (1 row)
1029 select pg_get_viewdef('v2a', true);
1030               pg_get_viewdef              
1031 ------------------------------------------
1032   SELECT j.b,                            +
1033      j.c,                                +
1034      j.a,                                +
1035      j.ax,                               +
1036      j.ay,                               +
1037      j.q                                 +
1038     FROM (tt2                            +
1039       JOIN tt3 tt3(ax, b, c) USING (b, c)+
1040       JOIN tt4 USING (b)) j;
1041 (1 row)
1043 select pg_get_viewdef('v3', true);
1044               pg_get_viewdef              
1045 ------------------------------------------
1046   SELECT b,                              +
1047      tt3.c,                              +
1048      tt2.a,                              +
1049      tt3.ax,                             +
1050      tt4.ay,                             +
1051      tt4.q                               +
1052     FROM tt2                             +
1053       JOIN tt3 tt3(ax, b, c) USING (b, c)+
1054       FULL JOIN tt4 USING (b);
1055 (1 row)
1057 alter table tt3 add column c int;
1058 alter table tt3 add column e int;
1059 select pg_get_viewdef('v1', true);
1060                   pg_get_viewdef                   
1061 ---------------------------------------------------
1062   SELECT tt2.b,                                   +
1063      tt3.c,                                       +
1064      tt2.a,                                       +
1065      tt3.ax                                       +
1066     FROM tt2                                      +
1067       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c);
1068 (1 row)
1070 select pg_get_viewdef('v1a', true);
1071                                   pg_get_viewdef                                   
1072 -----------------------------------------------------------------------------------
1073   SELECT j.b,                                                                     +
1074      j.c,                                                                         +
1075      j.a,                                                                         +
1076      j.ax                                                                         +
1077     FROM (tt2                                                                     +
1078       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)) j(b, c, a, d, e, ax, c_1, e_1);
1079 (1 row)
1081 select pg_get_viewdef('v2', true);
1082                   pg_get_viewdef                  
1083 --------------------------------------------------
1084   SELECT tt2.b,                                  +
1085      tt3.c,                                      +
1086      tt2.a,                                      +
1087      tt3.ax,                                     +
1088      tt4.ay,                                     +
1089      tt4.q                                       +
1090     FROM tt2                                     +
1091       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
1092       JOIN tt4 USING (b);
1093 (1 row)
1095 select pg_get_viewdef('v2a', true);
1096                          pg_get_viewdef                          
1097 -----------------------------------------------------------------
1098   SELECT j.b,                                                   +
1099      j.c,                                                       +
1100      j.a,                                                       +
1101      j.ax,                                                      +
1102      j.ay,                                                      +
1103      j.q                                                        +
1104     FROM (tt2                                                   +
1105       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)               +
1106       JOIN tt4 USING (b)) j(b, c, a, d, e, ax, c_1, e_1, ay, q);
1107 (1 row)
1109 select pg_get_viewdef('v3', true);
1110                   pg_get_viewdef                  
1111 --------------------------------------------------
1112   SELECT b,                                      +
1113      tt3.c,                                      +
1114      tt2.a,                                      +
1115      tt3.ax,                                     +
1116      tt4.ay,                                     +
1117      tt4.q                                       +
1118     FROM tt2                                     +
1119       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
1120       FULL JOIN tt4 USING (b);
1121 (1 row)
1123 alter table tt2 drop column d;
1124 select pg_get_viewdef('v1', true);
1125                   pg_get_viewdef                   
1126 ---------------------------------------------------
1127   SELECT tt2.b,                                   +
1128      tt3.c,                                       +
1129      tt2.a,                                       +
1130      tt3.ax                                       +
1131     FROM tt2                                      +
1132       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c);
1133 (1 row)
1135 select pg_get_viewdef('v1a', true);
1136                                  pg_get_viewdef                                 
1137 --------------------------------------------------------------------------------
1138   SELECT j.b,                                                                  +
1139      j.c,                                                                      +
1140      j.a,                                                                      +
1141      j.ax                                                                      +
1142     FROM (tt2                                                                  +
1143       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)) j(b, c, a, e, ax, c_1, e_1);
1144 (1 row)
1146 select pg_get_viewdef('v2', true);
1147                   pg_get_viewdef                  
1148 --------------------------------------------------
1149   SELECT tt2.b,                                  +
1150      tt3.c,                                      +
1151      tt2.a,                                      +
1152      tt3.ax,                                     +
1153      tt4.ay,                                     +
1154      tt4.q                                       +
1155     FROM tt2                                     +
1156       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
1157       JOIN tt4 USING (b);
1158 (1 row)
1160 select pg_get_viewdef('v2a', true);
1161                         pg_get_viewdef                        
1162 --------------------------------------------------------------
1163   SELECT j.b,                                                +
1164      j.c,                                                    +
1165      j.a,                                                    +
1166      j.ax,                                                   +
1167      j.ay,                                                   +
1168      j.q                                                     +
1169     FROM (tt2                                                +
1170       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)            +
1171       JOIN tt4 USING (b)) j(b, c, a, e, ax, c_1, e_1, ay, q);
1172 (1 row)
1174 select pg_get_viewdef('v3', true);
1175                   pg_get_viewdef                  
1176 --------------------------------------------------
1177   SELECT b,                                      +
1178      tt3.c,                                      +
1179      tt2.a,                                      +
1180      tt3.ax,                                     +
1181      tt4.ay,                                     +
1182      tt4.q                                       +
1183     FROM tt2                                     +
1184       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c)+
1185       FULL JOIN tt4 USING (b);
1186 (1 row)
1188 create table tt5 (a int, b int);
1189 create table tt6 (c int, d int);
1190 create view vv1 as select * from (tt5 cross join tt6) j(aa,bb,cc,dd);
1191 select pg_get_viewdef('vv1', true);
1192              pg_get_viewdef              
1193 -----------------------------------------
1194   SELECT j.aa,                          +
1195      j.bb,                              +
1196      j.cc,                              +
1197      j.dd                               +
1198     FROM (tt5                           +
1199       CROSS JOIN tt6) j(aa, bb, cc, dd);
1200 (1 row)
1202 alter table tt5 add column c int;
1203 select pg_get_viewdef('vv1', true);
1204                pg_get_viewdef               
1205 --------------------------------------------
1206   SELECT j.aa,                             +
1207      j.bb,                                 +
1208      j.cc,                                 +
1209      j.dd                                  +
1210     FROM (tt5                              +
1211       CROSS JOIN tt6) j(aa, bb, c, cc, dd);
1212 (1 row)
1214 alter table tt5 add column cc int;
1215 select pg_get_viewdef('vv1', true);
1216                   pg_get_viewdef                  
1217 --------------------------------------------------
1218   SELECT j.aa,                                   +
1219      j.bb,                                       +
1220      j.cc,                                       +
1221      j.dd                                        +
1222     FROM (tt5                                    +
1223       CROSS JOIN tt6) j(aa, bb, c, cc_1, cc, dd);
1224 (1 row)
1226 alter table tt5 drop column c;
1227 select pg_get_viewdef('vv1', true);
1228                 pg_get_viewdef                 
1229 -----------------------------------------------
1230   SELECT j.aa,                                +
1231      j.bb,                                    +
1232      j.cc,                                    +
1233      j.dd                                     +
1234     FROM (tt5                                 +
1235       CROSS JOIN tt6) j(aa, bb, cc_1, cc, dd);
1236 (1 row)
1238 create view v4 as select * from v1;
1239 alter view v1 rename column a to x;
1240 select pg_get_viewdef('v1', true);
1241                   pg_get_viewdef                   
1242 ---------------------------------------------------
1243   SELECT tt2.b,                                   +
1244      tt3.c,                                       +
1245      tt2.a AS x,                                  +
1246      tt3.ax                                       +
1247     FROM tt2                                      +
1248       JOIN tt3 tt3(ax, b, c, c_1, e) USING (b, c);
1249 (1 row)
1251 select pg_get_viewdef('v4', true);
1252  pg_get_viewdef 
1253 ----------------
1254   SELECT v1.b, +
1255      v1.c,     +
1256      v1.x AS a,+
1257      v1.ax     +
1258     FROM v1;
1259 (1 row)
1261 -- Unnamed FULL JOIN USING is lots of fun too
1262 create table tt7 (x int, xx int, y int);
1263 alter table tt7 drop column xx;
1264 create table tt8 (x int, z int);
1265 create view vv2 as
1266 select * from (values(1,2,3,4,5)) v(a,b,c,d,e)
1267 union all
1268 select * from tt7 full join tt8 using (x), tt8 tt8x;
1269 select pg_get_viewdef('vv2', true);
1270                  pg_get_viewdef                 
1271 ------------------------------------------------
1272   SELECT v.a,                                  +
1273      v.b,                                      +
1274      v.c,                                      +
1275      v.d,                                      +
1276      v.e                                       +
1277     FROM ( VALUES (1,2,3,4,5)) v(a, b, c, d, e)+
1278  UNION ALL                                     +
1279   SELECT x AS a,                               +
1280      tt7.y AS b,                               +
1281      tt8.z AS c,                               +
1282      tt8x.x_1 AS d,                            +
1283      tt8x.z AS e                               +
1284     FROM tt7                                   +
1285       FULL JOIN tt8 USING (x),                 +
1286      tt8 tt8x(x_1, z);
1287 (1 row)
1289 create view vv3 as
1290 select * from (values(1,2,3,4,5,6)) v(a,b,c,x,e,f)
1291 union all
1292 select * from
1293   tt7 full join tt8 using (x),
1294   tt7 tt7x full join tt8 tt8x using (x);
1295 select pg_get_viewdef('vv3', true);
1296                    pg_get_viewdef                    
1297 -----------------------------------------------------
1298   SELECT v.a,                                       +
1299      v.b,                                           +
1300      v.c,                                           +
1301      v.x,                                           +
1302      v.e,                                           +
1303      v.f                                            +
1304     FROM ( VALUES (1,2,3,4,5,6)) v(a, b, c, x, e, f)+
1305  UNION ALL                                          +
1306   SELECT x AS a,                                    +
1307      tt7.y AS b,                                    +
1308      tt8.z AS c,                                    +
1309      x_1 AS x,                                      +
1310      tt7x.y AS e,                                   +
1311      tt8x.z AS f                                    +
1312     FROM tt7                                        +
1313       FULL JOIN tt8 USING (x),                      +
1314      tt7 tt7x(x_1, y)                               +
1315       FULL JOIN tt8 tt8x(x_1, z) USING (x_1);
1316 (1 row)
1318 create view vv4 as
1319 select * from (values(1,2,3,4,5,6,7)) v(a,b,c,x,e,f,g)
1320 union all
1321 select * from
1322   tt7 full join tt8 using (x),
1323   tt7 tt7x full join tt8 tt8x using (x) full join tt8 tt8y using (x);
1324 select pg_get_viewdef('vv4', true);
1325                       pg_get_viewdef                      
1326 ----------------------------------------------------------
1327   SELECT v.a,                                            +
1328      v.b,                                                +
1329      v.c,                                                +
1330      v.x,                                                +
1331      v.e,                                                +
1332      v.f,                                                +
1333      v.g                                                 +
1334     FROM ( VALUES (1,2,3,4,5,6,7)) v(a, b, c, x, e, f, g)+
1335  UNION ALL                                               +
1336   SELECT x AS a,                                         +
1337      tt7.y AS b,                                         +
1338      tt8.z AS c,                                         +
1339      x_1 AS x,                                           +
1340      tt7x.y AS e,                                        +
1341      tt8x.z AS f,                                        +
1342      tt8y.z AS g                                         +
1343     FROM tt7                                             +
1344       FULL JOIN tt8 USING (x),                           +
1345      tt7 tt7x(x_1, y)                                    +
1346       FULL JOIN tt8 tt8x(x_1, z) USING (x_1)             +
1347       FULL JOIN tt8 tt8y(x_1, z) USING (x_1);
1348 (1 row)
1350 alter table tt7 add column zz int;
1351 alter table tt7 add column z int;
1352 alter table tt7 drop column zz;
1353 alter table tt8 add column z2 int;
1354 select pg_get_viewdef('vv2', true);
1355                  pg_get_viewdef                 
1356 ------------------------------------------------
1357   SELECT v.a,                                  +
1358      v.b,                                      +
1359      v.c,                                      +
1360      v.d,                                      +
1361      v.e                                       +
1362     FROM ( VALUES (1,2,3,4,5)) v(a, b, c, d, e)+
1363  UNION ALL                                     +
1364   SELECT x AS a,                               +
1365      tt7.y AS b,                               +
1366      tt8.z AS c,                               +
1367      tt8x.x_1 AS d,                            +
1368      tt8x.z AS e                               +
1369     FROM tt7                                   +
1370       FULL JOIN tt8 USING (x),                 +
1371      tt8 tt8x(x_1, z, z2);
1372 (1 row)
1374 select pg_get_viewdef('vv3', true);
1375                    pg_get_viewdef                    
1376 -----------------------------------------------------
1377   SELECT v.a,                                       +
1378      v.b,                                           +
1379      v.c,                                           +
1380      v.x,                                           +
1381      v.e,                                           +
1382      v.f                                            +
1383     FROM ( VALUES (1,2,3,4,5,6)) v(a, b, c, x, e, f)+
1384  UNION ALL                                          +
1385   SELECT x AS a,                                    +
1386      tt7.y AS b,                                    +
1387      tt8.z AS c,                                    +
1388      x_1 AS x,                                      +
1389      tt7x.y AS e,                                   +
1390      tt8x.z AS f                                    +
1391     FROM tt7                                        +
1392       FULL JOIN tt8 USING (x),                      +
1393      tt7 tt7x(x_1, y, z)                            +
1394       FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1);
1395 (1 row)
1397 select pg_get_viewdef('vv4', true);
1398                       pg_get_viewdef                      
1399 ----------------------------------------------------------
1400   SELECT v.a,                                            +
1401      v.b,                                                +
1402      v.c,                                                +
1403      v.x,                                                +
1404      v.e,                                                +
1405      v.f,                                                +
1406      v.g                                                 +
1407     FROM ( VALUES (1,2,3,4,5,6,7)) v(a, b, c, x, e, f, g)+
1408  UNION ALL                                               +
1409   SELECT x AS a,                                         +
1410      tt7.y AS b,                                         +
1411      tt8.z AS c,                                         +
1412      x_1 AS x,                                           +
1413      tt7x.y AS e,                                        +
1414      tt8x.z AS f,                                        +
1415      tt8y.z AS g                                         +
1416     FROM tt7                                             +
1417       FULL JOIN tt8 USING (x),                           +
1418      tt7 tt7x(x_1, y, z)                                 +
1419       FULL JOIN tt8 tt8x(x_1, z, z2) USING (x_1)         +
1420       FULL JOIN tt8 tt8y(x_1, z, z2) USING (x_1);
1421 (1 row)
1423 -- Implicit coercions in a JOIN USING create issues similar to FULL JOIN
1424 create table tt7a (x date, xx int, y int);
1425 alter table tt7a drop column xx;
1426 create table tt8a (x timestamptz, z int);
1427 create view vv2a as
1428 select * from (values(now(),2,3,now(),5)) v(a,b,c,d,e)
1429 union all
1430 select * from tt7a left join tt8a using (x), tt8a tt8ax;
1431 select pg_get_viewdef('vv2a', true);
1432                      pg_get_viewdef                     
1433 --------------------------------------------------------
1434   SELECT v.a,                                          +
1435      v.b,                                              +
1436      v.c,                                              +
1437      v.d,                                              +
1438      v.e                                               +
1439     FROM ( VALUES (now(),2,3,now(),5)) v(a, b, c, d, e)+
1440  UNION ALL                                             +
1441   SELECT x AS a,                                       +
1442      tt7a.y AS b,                                      +
1443      tt8a.z AS c,                                      +
1444      tt8ax.x_1 AS d,                                   +
1445      tt8ax.z AS e                                      +
1446     FROM tt7a                                          +
1447       LEFT JOIN tt8a USING (x),                        +
1448      tt8a tt8ax(x_1, z);
1449 (1 row)
1452 -- Also check dropping a column that existed when the view was made
1454 create table tt9 (x int, xx int, y int);
1455 create table tt10 (x int, z int);
1456 create view vv5 as select x,y,z from tt9 join tt10 using(x);
1457 select pg_get_viewdef('vv5', true);
1458       pg_get_viewdef       
1459 ---------------------------
1460   SELECT tt9.x,           +
1461      tt9.y,               +
1462      tt10.z               +
1463     FROM tt9              +
1464       JOIN tt10 USING (x);
1465 (1 row)
1467 alter table tt9 drop column xx;
1468 select pg_get_viewdef('vv5', true);
1469       pg_get_viewdef       
1470 ---------------------------
1471   SELECT tt9.x,           +
1472      tt9.y,               +
1473      tt10.z               +
1474     FROM tt9              +
1475       JOIN tt10 USING (x);
1476 (1 row)
1479 -- Another corner case is that we might add a column to a table below a
1480 -- JOIN USING, and thereby make the USING column name ambiguous
1482 create table tt11 (x int, y int);
1483 create table tt12 (x int, z int);
1484 create table tt13 (z int, q int);
1485 create view vv6 as select x,y,z,q from
1486   (tt11 join tt12 using(x)) join tt13 using(z);
1487 select pg_get_viewdef('vv6', true);
1488       pg_get_viewdef       
1489 ---------------------------
1490   SELECT tt11.x,          +
1491      tt11.y,              +
1492      tt12.z,              +
1493      tt13.q               +
1494     FROM tt11             +
1495       JOIN tt12 USING (x) +
1496       JOIN tt13 USING (z);
1497 (1 row)
1499 alter table tt11 add column z int;
1500 select pg_get_viewdef('vv6', true);
1501         pg_get_viewdef        
1502 ------------------------------
1503   SELECT tt11.x,             +
1504      tt11.y,                 +
1505      tt12.z,                 +
1506      tt13.q                  +
1507     FROM tt11 tt11(x, y, z_1)+
1508       JOIN tt12 USING (x)    +
1509       JOIN tt13 USING (z);
1510 (1 row)
1513 -- Check cases involving dropped/altered columns in a function's rowtype result
1515 create table tt14t (f1 text, f2 text, f3 text, f4 text);
1516 insert into tt14t values('foo', 'bar', 'baz', '42');
1517 alter table tt14t drop column f2;
1518 create function tt14f() returns setof tt14t as
1520 declare
1521     rec1 record;
1522 begin
1523     for rec1 in select * from tt14t
1524     loop
1525         return next rec1;
1526     end loop;
1527 end;
1529 language plpgsql;
1530 create view tt14v as select t.* from tt14f() t;
1531 select pg_get_viewdef('tt14v', true);
1532          pg_get_viewdef         
1533 --------------------------------
1534   SELECT t.f1,                 +
1535      t.f3,                     +
1536      t.f4                      +
1537     FROM tt14f() t(f1, f3, f4);
1538 (1 row)
1540 select * from tt14v;
1541  f1  | f3  | f4 
1542 -----+-----+----
1543  foo | baz | 42
1544 (1 row)
1546 begin;
1547 -- this perhaps should be rejected, but it isn't:
1548 alter table tt14t drop column f3;
1549 -- f3 is still in the view ...
1550 select pg_get_viewdef('tt14v', true);
1551          pg_get_viewdef         
1552 --------------------------------
1553   SELECT t.f1,                 +
1554      t.f3,                     +
1555      t.f4                      +
1556     FROM tt14f() t(f1, f3, f4);
1557 (1 row)
1559 -- but will fail at execution
1560 select f1, f4 from tt14v;
1561  f1  | f4 
1562 -----+----
1563  foo | 42
1564 (1 row)
1566 select * from tt14v;
1567 ERROR:  attribute 3 of type record has been dropped
1568 rollback;
1569 begin;
1570 -- this perhaps should be rejected, but it isn't:
1571 alter table tt14t alter column f4 type integer using f4::integer;
1572 -- f4 is still in the view ...
1573 select pg_get_viewdef('tt14v', true);
1574          pg_get_viewdef         
1575 --------------------------------
1576   SELECT t.f1,                 +
1577      t.f3,                     +
1578      t.f4                      +
1579     FROM tt14f() t(f1, f3, f4);
1580 (1 row)
1582 -- but will fail at execution
1583 select f1, f3 from tt14v;
1584  f1  | f3  
1585 -----+-----
1586  foo | baz
1587 (1 row)
1589 select * from tt14v;
1590 ERROR:  attribute 4 of type record has wrong type
1591 DETAIL:  Table has type integer, but query expects text.
1592 rollback;
1593 -- check display of whole-row variables in some corner cases
1594 create type nestedcomposite as (x int8_tbl);
1595 create view tt15v as select row(i)::nestedcomposite from int8_tbl i;
1596 select * from tt15v;
1597                    row                    
1598 ------------------------------------------
1599  ("(123,456)")
1600  ("(123,4567890123456789)")
1601  ("(4567890123456789,123)")
1602  ("(4567890123456789,4567890123456789)")
1603  ("(4567890123456789,-4567890123456789)")
1604 (5 rows)
1606 select pg_get_viewdef('tt15v', true);
1607                     pg_get_viewdef                    
1608 ------------------------------------------------------
1609   SELECT ROW(i.*::int8_tbl)::nestedcomposite AS "row"+
1610     FROM int8_tbl i;
1611 (1 row)
1613 select row(i.*::int8_tbl)::nestedcomposite from int8_tbl i;
1614                    row                    
1615 ------------------------------------------
1616  ("(123,456)")
1617  ("(123,4567890123456789)")
1618  ("(4567890123456789,123)")
1619  ("(4567890123456789,4567890123456789)")
1620  ("(4567890123456789,-4567890123456789)")
1621 (5 rows)
1623 create view tt16v as select * from int8_tbl i, lateral(values(i)) ss;
1624 select * from tt16v;
1625         q1        |        q2         |               column1                
1626 ------------------+-------------------+--------------------------------------
1627               123 |               456 | (123,456)
1628               123 |  4567890123456789 | (123,4567890123456789)
1629  4567890123456789 |               123 | (4567890123456789,123)
1630  4567890123456789 |  4567890123456789 | (4567890123456789,4567890123456789)
1631  4567890123456789 | -4567890123456789 | (4567890123456789,-4567890123456789)
1632 (5 rows)
1634 select pg_get_viewdef('tt16v', true);
1635               pg_get_viewdef               
1636 -------------------------------------------
1637   SELECT i.q1,                            +
1638      i.q2,                                +
1639      ss.column1                           +
1640     FROM int8_tbl i,                      +
1641      LATERAL ( VALUES (i.*::int8_tbl)) ss;
1642 (1 row)
1644 select * from int8_tbl i, lateral(values(i.*::int8_tbl)) ss;
1645         q1        |        q2         |               column1                
1646 ------------------+-------------------+--------------------------------------
1647               123 |               456 | (123,456)
1648               123 |  4567890123456789 | (123,4567890123456789)
1649  4567890123456789 |               123 | (4567890123456789,123)
1650  4567890123456789 |  4567890123456789 | (4567890123456789,4567890123456789)
1651  4567890123456789 | -4567890123456789 | (4567890123456789,-4567890123456789)
1652 (5 rows)
1654 create view tt17v as select * from int8_tbl i where i in (values(i));
1655 select * from tt17v;
1656         q1        |        q2         
1657 ------------------+-------------------
1658               123 |               456
1659               123 |  4567890123456789
1660  4567890123456789 |               123
1661  4567890123456789 |  4567890123456789
1662  4567890123456789 | -4567890123456789
1663 (5 rows)
1665 select pg_get_viewdef('tt17v', true);
1666                pg_get_viewdef                
1667 ---------------------------------------------
1668   SELECT i.q1,                              +
1669      i.q2                                   +
1670     FROM int8_tbl i                         +
1671    WHERE (i.* IN ( VALUES (i.*::int8_tbl)));
1672 (1 row)
1674 select * from int8_tbl i where i.* in (values(i.*::int8_tbl));
1675         q1        |        q2         
1676 ------------------+-------------------
1677               123 |               456
1678               123 |  4567890123456789
1679  4567890123456789 |               123
1680  4567890123456789 |  4567890123456789
1681  4567890123456789 | -4567890123456789
1682 (5 rows)
1684 -- check unique-ification of overlength names
1685 create view tt18v as
1686   select * from int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
1687   union all
1688   select * from int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz;
1689 NOTICE:  identifier "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy" will be truncated to "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
1690 NOTICE:  identifier "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz" will be truncated to "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
1691 select pg_get_viewdef('tt18v', true);
1692                                   pg_get_viewdef                                   
1693 -----------------------------------------------------------------------------------
1694   SELECT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.q1,      +
1695      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.q2           +
1696     FROM int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +
1697  UNION ALL                                                                        +
1698   SELECT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.q1,      +
1699      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.q2           +
1700     FROM int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
1701 (1 row)
1703 explain (costs off) select * from tt18v;
1704                                          QUERY PLAN                                         
1705 --------------------------------------------------------------------------------------------
1706  Append
1707    ->  Seq Scan on int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1708    ->  Seq Scan on int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_1
1709 (3 rows)
1711 -- check display of ScalarArrayOp with a sub-select
1712 select 'foo'::text = any(array['abc','def','foo']::text[]);
1713  ?column? 
1714 ----------
1716 (1 row)
1718 select 'foo'::text = any((select array['abc','def','foo']::text[]));  -- fail
1719 ERROR:  operator does not exist: text = text[]
1720 LINE 1: select 'foo'::text = any((select array['abc','def','foo']::t...
1721                            ^
1722 HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
1723 select 'foo'::text = any((select array['abc','def','foo']::text[])::text[]);
1724  ?column? 
1725 ----------
1727 (1 row)
1729 create view tt19v as
1730 select 'foo'::text = any(array['abc','def','foo']::text[]) c1,
1731        'foo'::text = any((select array['abc','def','foo']::text[])::text[]) c2;
1732 select pg_get_viewdef('tt19v', true);
1733                                                pg_get_viewdef                                               
1734 ------------------------------------------------------------------------------------------------------------
1735   SELECT 'foo'::text = ANY (ARRAY['abc'::text, 'def'::text, 'foo'::text]) AS c1,                           +
1736      'foo'::text = ANY ((( SELECT ARRAY['abc'::text, 'def'::text, 'foo'::text] AS "array"))::text[]) AS c2;
1737 (1 row)
1739 -- check display of assorted RTE_FUNCTION expressions
1740 create view tt20v as
1741 select * from
1742   coalesce(1,2) as c,
1743   collation for ('x'::text) col,
1744   current_date as d,
1745   localtimestamp(3) as t,
1746   cast(1+2 as int4) as i4,
1747   cast(1+2 as int8) as i8;
1748 select pg_get_viewdef('tt20v', true);
1749                pg_get_viewdef                
1750 ---------------------------------------------
1751   SELECT c.c,                               +
1752      col.col,                               +
1753      d.d,                                   +
1754      t.t,                                   +
1755      i4.i4,                                 +
1756      i8.i8                                  +
1757     FROM COALESCE(1, 2) c(c),               +
1758      COLLATION FOR ('x'::text) col(col),    +
1759      CURRENT_DATE d(d),                     +
1760      LOCALTIMESTAMP(3) t(t),                +
1761      CAST(1 + 2 AS integer) i4(i4),         +
1762      CAST((1 + 2)::bigint AS bigint) i8(i8);
1763 (1 row)
1765 -- reverse-listing of various special function syntaxes required by SQL
1766 create view tt201v as
1767 select
1768   extract(day from now()) as extr,
1769   (now(), '1 day'::interval) overlaps
1770     (current_timestamp(2), '1 day'::interval) as o,
1771   'foo' is normalized isn,
1772   'foo' is nfkc normalized isnn,
1773   normalize('foo') as n,
1774   normalize('foo', nfkd) as nfkd,
1775   overlay('foo' placing 'bar' from 2) as ovl,
1776   overlay('foo' placing 'bar' from 2 for 3) as ovl2,
1777   position('foo' in 'foobar') as p,
1778   substring('foo' from 2 for 3) as s,
1779   substring('foo' similar 'f' escape '#') as ss,
1780   substring('foo' from 'oo') as ssf,  -- historically-permitted abuse
1781   trim(' ' from ' foo ') as bt,
1782   trim(leading ' ' from ' foo ') as lt,
1783   trim(trailing ' foo ') as rt,
1784   trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) as btb,
1785   trim(leading E'\\000'::bytea from E'\\000Tom\\000'::bytea) as ltb,
1786   trim(trailing E'\\000'::bytea from E'\\000Tom\\000'::bytea) as rtb;
1787 select pg_get_viewdef('tt201v', true);
1788                                         pg_get_viewdef                                         
1789 -----------------------------------------------------------------------------------------------
1790   SELECT EXTRACT(day FROM now()) AS extr,                                                     +
1791      ((now(), '@ 1 day'::interval) OVERLAPS (CURRENT_TIMESTAMP(2), '@ 1 day'::interval)) AS o,+
1792      (('foo'::text) IS NORMALIZED) AS isn,                                                    +
1793      (('foo'::text) IS NFKC NORMALIZED) AS isnn,                                              +
1794      NORMALIZE('foo'::text) AS n,                                                             +
1795      NORMALIZE('foo'::text, NFKD) AS nfkd,                                                    +
1796      OVERLAY('foo'::text PLACING 'bar'::text FROM 2) AS ovl,                                  +
1797      OVERLAY('foo'::text PLACING 'bar'::text FROM 2 FOR 3) AS ovl2,                           +
1798      POSITION(('foo'::text) IN ('foobar'::text)) AS p,                                        +
1799      SUBSTRING('foo'::text FROM 2 FOR 3) AS s,                                                +
1800      SUBSTRING('foo'::text SIMILAR 'f'::text ESCAPE '#'::text) AS ss,                         +
1801      "substring"('foo'::text, 'oo'::text) AS ssf,                                             +
1802      TRIM(BOTH ' '::text FROM ' foo '::text) AS bt,                                           +
1803      TRIM(LEADING ' '::text FROM ' foo '::text) AS lt,                                        +
1804      TRIM(TRAILING FROM ' foo '::text) AS rt,                                                 +
1805      TRIM(BOTH '\x00'::bytea FROM '\x00546f6d00'::bytea) AS btb,                              +
1806      TRIM(LEADING '\x00'::bytea FROM '\x00546f6d00'::bytea) AS ltb,                           +
1807      TRIM(TRAILING '\x00'::bytea FROM '\x00546f6d00'::bytea) AS rtb;
1808 (1 row)
1810 -- corner cases with empty join conditions
1811 create view tt21v as
1812 select * from tt5 natural inner join tt6;
1813 select pg_get_viewdef('tt21v', true);
1814     pg_get_viewdef    
1815 ----------------------
1816   SELECT tt5.a,      +
1817      tt5.b,          +
1818      tt5.cc,         +
1819      tt6.c,          +
1820      tt6.d           +
1821     FROM tt5         +
1822       CROSS JOIN tt6;
1823 (1 row)
1825 create view tt22v as
1826 select * from tt5 natural left join tt6;
1827 select pg_get_viewdef('tt22v', true);
1828        pg_get_viewdef        
1829 -----------------------------
1830   SELECT tt5.a,             +
1831      tt5.b,                 +
1832      tt5.cc,                +
1833      tt6.c,                 +
1834      tt6.d                  +
1835     FROM tt5                +
1836       LEFT JOIN tt6 ON TRUE;
1837 (1 row)
1839 -- check handling of views with immediately-renamed columns
1840 create view tt23v (col_a, col_b) as
1841 select q1 as other_name1, q2 as other_name2 from int8_tbl
1842 union
1843 select 42, 43;
1844 select pg_get_viewdef('tt23v', true);
1845         pg_get_viewdef         
1846 -------------------------------
1847   SELECT int8_tbl.q1 AS col_a,+
1848      int8_tbl.q2 AS col_b     +
1849     FROM int8_tbl             +
1850  UNION                        +
1851   SELECT 42 AS col_a,         +
1852      43 AS col_b;
1853 (1 row)
1855 select pg_get_ruledef(oid, true) from pg_rewrite
1856   where ev_class = 'tt23v'::regclass and ev_type = '1';
1857                          pg_get_ruledef                          
1858 -----------------------------------------------------------------
1859  CREATE RULE "_RETURN" AS                                       +
1860      ON SELECT TO tt23v DO INSTEAD  SELECT int8_tbl.q1 AS col_a,+
1861      int8_tbl.q2 AS col_b                                       +
1862     FROM int8_tbl                                               +
1863  UNION                                                          +
1864   SELECT 42 AS col_a,                                           +
1865      43 AS col_b;
1866 (1 row)
1868 -- test extraction of FieldSelect field names (get_name_for_var_field)
1869 create view tt24v as
1870 with cte as materialized (select r from (values(1,2),(3,4)) r)
1871 select (r).column2 as col_a, (rr).column2 as col_b from
1872   cte join (select rr from (values(1,7),(3,8)) rr limit 2) ss
1873   on (r).column1 = (rr).column1;
1874 select pg_get_viewdef('tt24v', true);
1875                        pg_get_viewdef                       
1876 ------------------------------------------------------------
1877   WITH cte AS MATERIALIZED (                               +
1878           SELECT r.*::record AS r                          +
1879             FROM ( VALUES (1,2), (3,4)) r                  +
1880          )                                                 +
1881   SELECT (cte.r).column2 AS col_a,                         +
1882      (ss.rr).column2 AS col_b                              +
1883     FROM cte                                               +
1884       JOIN ( SELECT rr.*::record AS rr                     +
1885             FROM ( VALUES (1,7), (3,8)) rr                 +
1886           LIMIT 2) ss ON (cte.r).column1 = (ss.rr).column1;
1887 (1 row)
1889 create view tt25v as
1890 with cte as materialized (select pg_get_keywords() k)
1891 select (k).word from cte;
1892 select pg_get_viewdef('tt25v', true);
1893              pg_get_viewdef             
1894 ----------------------------------------
1895   WITH cte AS MATERIALIZED (           +
1896           SELECT pg_get_keywords() AS k+
1897          )                             +
1898   SELECT (cte.k).word AS word          +
1899     FROM cte;
1900 (1 row)
1902 -- also check cases seen only in EXPLAIN
1903 explain (verbose, costs off)
1904 select * from tt24v;
1905                                         QUERY PLAN                                        
1906 ------------------------------------------------------------------------------------------
1907  Hash Join
1908    Output: (cte.r).column2, ((ROW("*VALUES*".column1, "*VALUES*".column2))).column2
1909    Hash Cond: (((ROW("*VALUES*".column1, "*VALUES*".column2))).column1 = (cte.r).column1)
1910    CTE cte
1911      ->  Values Scan on "*VALUES*_1"
1912            Output: ROW("*VALUES*_1".column1, "*VALUES*_1".column2)
1913    ->  Limit
1914          Output: (ROW("*VALUES*".column1, "*VALUES*".column2))
1915          ->  Values Scan on "*VALUES*"
1916                Output: ROW("*VALUES*".column1, "*VALUES*".column2)
1917    ->  Hash
1918          Output: cte.r
1919          ->  CTE Scan on cte
1920                Output: cte.r
1921 (14 rows)
1923 explain (verbose, costs off)
1924 select (r).column2 from (select r from (values(1,2),(3,4)) r limit 1) ss;
1925                             QUERY PLAN                             
1926 -------------------------------------------------------------------
1927  Subquery Scan on ss
1928    Output: (ss.r).column2
1929    ->  Limit
1930          Output: (ROW("*VALUES*".column1, "*VALUES*".column2))
1931          ->  Values Scan on "*VALUES*"
1932                Output: ROW("*VALUES*".column1, "*VALUES*".column2)
1933 (6 rows)
1935 -- test pretty-print parenthesization rules, and SubLink deparsing
1936 create view tt26v as
1937 select x + y + z as c1,
1938        (x * y) + z as c2,
1939        x + (y * z) as c3,
1940        (x + y) * z as c4,
1941        x * (y + z) as c5,
1942        x + (y + z) as c6,
1943        x + (y # z) as c7,
1944        (x > y) AND (y > z OR x > z) as c8,
1945        (x > y) OR (y > z AND NOT (x > z)) as c9,
1946        (x,y) <> ALL (values(1,2),(3,4)) as c10,
1947        (x,y) <= ANY (values(1,2),(3,4)) as c11
1948 from (values(1,2,3)) v(x,y,z);
1949 select pg_get_viewdef('tt26v', true);
1950                      pg_get_viewdef                     
1951 --------------------------------------------------------
1952   SELECT v.x + v.y + v.z AS c1,                        +
1953      v.x * v.y + v.z AS c2,                            +
1954      v.x + v.y * v.z AS c3,                            +
1955      (v.x + v.y) * v.z AS c4,                          +
1956      v.x * (v.y + v.z) AS c5,                          +
1957      v.x + (v.y + v.z) AS c6,                          +
1958      v.x + (v.y # v.z) AS c7,                          +
1959      v.x > v.y AND (v.y > v.z OR v.x > v.z) AS c8,     +
1960      v.x > v.y OR v.y > v.z AND NOT v.x > v.z AS c9,   +
1961      ((v.x, v.y) <> ALL ( VALUES (1,2), (3,4))) AS c10,+
1962      ((v.x, v.y) <= ANY ( VALUES (1,2), (3,4))) AS c11 +
1963     FROM ( VALUES (1,2,3)) v(x, y, z);
1964 (1 row)
1966 -- clean up all the random objects we made above
1967 DROP SCHEMA temp_view_test CASCADE;
1968 NOTICE:  drop cascades to 27 other objects
1969 DETAIL:  drop cascades to table temp_view_test.base_table
1970 drop cascades to view v2_temp
1971 drop cascades to view v4_temp
1972 drop cascades to view v6_temp
1973 drop cascades to view v7_temp
1974 drop cascades to view v10_temp
1975 drop cascades to view v8_temp
1976 drop cascades to view v9_temp
1977 drop cascades to view v11_temp
1978 drop cascades to view v12_temp
1979 drop cascades to table temp_view_test.base_table2
1980 drop cascades to view v5_temp
1981 drop cascades to view temp_view_test.v1
1982 drop cascades to view temp_view_test.v2
1983 drop cascades to view temp_view_test.v3
1984 drop cascades to view temp_view_test.v4
1985 drop cascades to view temp_view_test.v5
1986 drop cascades to view temp_view_test.v6
1987 drop cascades to view temp_view_test.v7
1988 drop cascades to view temp_view_test.v8
1989 drop cascades to sequence temp_view_test.seq1
1990 drop cascades to view temp_view_test.v9
1991 drop cascades to table temp_view_test.tx1
1992 drop cascades to view aliased_view_1
1993 drop cascades to view aliased_view_2
1994 drop cascades to view aliased_view_3
1995 drop cascades to view aliased_view_4
1996 DROP SCHEMA testviewschm2 CASCADE;
1997 NOTICE:  drop cascades to 73 other objects
1998 DETAIL:  drop cascades to table t1
1999 drop cascades to view temporal1
2000 drop cascades to view temporal2
2001 drop cascades to view temporal3
2002 drop cascades to view temporal4
2003 drop cascades to table t2
2004 drop cascades to view nontemp1
2005 drop cascades to view nontemp2
2006 drop cascades to view nontemp3
2007 drop cascades to view nontemp4
2008 drop cascades to table tbl1
2009 drop cascades to table tbl2
2010 drop cascades to table tbl3
2011 drop cascades to table tbl4
2012 drop cascades to view mytempview
2013 drop cascades to view pubview
2014 drop cascades to view mysecview1
2015 drop cascades to view mysecview2
2016 drop cascades to view mysecview3
2017 drop cascades to view mysecview4
2018 drop cascades to view unspecified_types
2019 drop cascades to table tt1
2020 drop cascades to table tx1
2021 drop cascades to view view_of_joins
2022 drop cascades to table tbl1a
2023 drop cascades to view view_of_joins_2a
2024 drop cascades to view view_of_joins_2b
2025 drop cascades to view view_of_joins_2c
2026 drop cascades to view view_of_joins_2d
2027 drop cascades to table tt2
2028 drop cascades to table tt3
2029 drop cascades to table tt4
2030 drop cascades to view v1
2031 drop cascades to view v1a
2032 drop cascades to view v2
2033 drop cascades to view v2a
2034 drop cascades to view v3
2035 drop cascades to table tt5
2036 drop cascades to table tt6
2037 drop cascades to view vv1
2038 drop cascades to view v4
2039 drop cascades to table tt7
2040 drop cascades to table tt8
2041 drop cascades to view vv2
2042 drop cascades to view vv3
2043 drop cascades to view vv4
2044 drop cascades to table tt7a
2045 drop cascades to table tt8a
2046 drop cascades to view vv2a
2047 drop cascades to table tt9
2048 drop cascades to table tt10
2049 drop cascades to view vv5
2050 drop cascades to table tt11
2051 drop cascades to table tt12
2052 drop cascades to table tt13
2053 drop cascades to view vv6
2054 drop cascades to table tt14t
2055 drop cascades to function tt14f()
2056 drop cascades to view tt14v
2057 drop cascades to type nestedcomposite
2058 drop cascades to view tt15v
2059 drop cascades to view tt16v
2060 drop cascades to view tt17v
2061 drop cascades to view tt18v
2062 drop cascades to view tt19v
2063 drop cascades to view tt20v
2064 drop cascades to view tt201v
2065 drop cascades to view tt21v
2066 drop cascades to view tt22v
2067 drop cascades to view tt23v
2068 drop cascades to view tt24v
2069 drop cascades to view tt25v
2070 drop cascades to view tt26v