2000-01-05 18:31:08 +01:00
|
|
|
--
|
|
|
|
-- CREATE_VIEW
|
|
|
|
-- Virtual class definitions
|
|
|
|
-- (this also tests the query rewrite system)
|
|
|
|
--
|
|
|
|
CREATE VIEW street AS
|
2010-11-23 21:27:50 +01:00
|
|
|
SELECT r.name, r.thepath, c.cname AS cname
|
2000-06-10 07:19:26 +02:00
|
|
|
FROM ONLY road r, real_city c
|
1997-04-06 08:07:13 +02:00
|
|
|
WHERE c.outline ## r.thepath;
|
2000-01-05 18:31:08 +01:00
|
|
|
CREATE VIEW iexit AS
|
2010-11-23 21:27:50 +01:00
|
|
|
SELECT ih.name, ih.thepath,
|
1997-04-06 08:07:13 +02:00
|
|
|
interpt_pp(ih.thepath, r.thepath) AS exit
|
|
|
|
FROM ihighway ih, ramp r
|
|
|
|
WHERE ih.thepath ## r.thepath;
|
2000-01-05 18:31:08 +01:00
|
|
|
CREATE VIEW toyemp AS
|
1997-04-06 08:07:13 +02:00
|
|
|
SELECT name, age, location, 12*salary AS annualsal
|
|
|
|
FROM emp;
|
2003-11-21 23:32:49 +01:00
|
|
|
-- Test comments
|
|
|
|
COMMENT ON VIEW noview IS 'no view';
|
|
|
|
ERROR: relation "noview" does not exist
|
|
|
|
COMMENT ON VIEW toyemp IS 'is a view';
|
|
|
|
COMMENT ON VIEW toyemp IS NULL;
|
2002-09-02 04:13:02 +02:00
|
|
|
--
|
|
|
|
-- CREATE OR REPLACE VIEW
|
|
|
|
--
|
|
|
|
CREATE TABLE viewtest_tbl (a int, b int);
|
|
|
|
COPY viewtest_tbl FROM stdin;
|
|
|
|
CREATE OR REPLACE VIEW viewtest AS
|
|
|
|
SELECT * FROM viewtest_tbl;
|
|
|
|
CREATE OR REPLACE VIEW viewtest AS
|
|
|
|
SELECT * FROM viewtest_tbl WHERE a > 10;
|
|
|
|
SELECT * FROM viewtest;
|
|
|
|
a | b
|
|
|
|
----+----
|
|
|
|
15 | 20
|
|
|
|
20 | 25
|
|
|
|
(2 rows)
|
|
|
|
|
|
|
|
CREATE OR REPLACE VIEW viewtest AS
|
|
|
|
SELECT a, b FROM viewtest_tbl WHERE a > 5 ORDER BY b DESC;
|
|
|
|
SELECT * FROM viewtest;
|
|
|
|
a | b
|
|
|
|
----+----
|
|
|
|
20 | 25
|
|
|
|
15 | 20
|
|
|
|
10 | 15
|
|
|
|
(3 rows)
|
|
|
|
|
|
|
|
-- should fail
|
|
|
|
CREATE OR REPLACE VIEW viewtest AS
|
|
|
|
SELECT a FROM viewtest_tbl WHERE a <> 20;
|
2008-12-07 00:22:46 +01:00
|
|
|
ERROR: cannot drop columns from view
|
2002-09-02 04:13:02 +02:00
|
|
|
-- should fail
|
|
|
|
CREATE OR REPLACE VIEW viewtest AS
|
|
|
|
SELECT 1, * FROM viewtest_tbl;
|
2008-12-16 01:56:12 +01:00
|
|
|
ERROR: cannot change name of view column "a" to "?column?"
|
2002-09-02 04:13:02 +02:00
|
|
|
-- should fail
|
|
|
|
CREATE OR REPLACE VIEW viewtest AS
|
|
|
|
SELECT a, b::numeric FROM viewtest_tbl;
|
2008-12-16 01:56:12 +01:00
|
|
|
ERROR: cannot change data type of view column "b" from integer to numeric
|
2010-11-23 21:27:50 +01:00
|
|
|
-- should work
|
2008-12-07 00:22:46 +01:00
|
|
|
CREATE OR REPLACE VIEW viewtest AS
|
|
|
|
SELECT a, b, 0 AS c FROM viewtest_tbl;
|
2002-09-02 04:13:02 +02:00
|
|
|
DROP VIEW viewtest;
|
|
|
|
DROP TABLE viewtest_tbl;
|
2005-02-02 07:36:02 +01:00
|
|
|
-- tests for temporary views
|
|
|
|
CREATE SCHEMA temp_view_test
|
|
|
|
CREATE TABLE base_table (a int, id int)
|
|
|
|
CREATE TABLE base_table2 (a int, id int);
|
|
|
|
SET search_path TO temp_view_test, public;
|
|
|
|
CREATE TEMPORARY TABLE temp_table (a int, id int);
|
|
|
|
-- should be created in temp_view_test schema
|
|
|
|
CREATE VIEW v1 AS SELECT * FROM base_table;
|
|
|
|
-- should be created in temp object schema
|
|
|
|
CREATE VIEW v1_temp AS SELECT * FROM temp_table;
|
|
|
|
NOTICE: view "v1_temp" will be a temporary view
|
|
|
|
-- should be created in temp object schema
|
|
|
|
CREATE TEMP VIEW v2_temp AS SELECT * FROM base_table;
|
|
|
|
-- should be created in temp_views schema
|
|
|
|
CREATE VIEW temp_view_test.v2 AS SELECT * FROM base_table;
|
|
|
|
-- should fail
|
|
|
|
CREATE VIEW temp_view_test.v3_temp AS SELECT * FROM temp_table;
|
|
|
|
NOTICE: view "v3_temp" will be a temporary view
|
Wording cleanup for error messages. Also change can't -> cannot.
Standard English uses "may", "can", and "might" in different ways:
may - permission, "You may borrow my rake."
can - ability, "I can lift that log."
might - possibility, "It might rain today."
Unfortunately, in conversational English, their use is often mixed, as
in, "You may use this variable to do X", when in fact, "can" is a better
choice. Similarly, "It may crash" is better stated, "It might crash".
2007-02-01 20:10:30 +01:00
|
|
|
ERROR: temporary tables cannot specify a schema name
|
2005-02-02 07:36:02 +01:00
|
|
|
-- should fail
|
|
|
|
CREATE SCHEMA test_schema
|
|
|
|
CREATE TEMP VIEW testview AS SELECT 1;
|
Wording cleanup for error messages. Also change can't -> cannot.
Standard English uses "may", "can", and "might" in different ways:
may - permission, "You may borrow my rake."
can - ability, "I can lift that log."
might - possibility, "It might rain today."
Unfortunately, in conversational English, their use is often mixed, as
in, "You may use this variable to do X", when in fact, "can" is a better
choice. Similarly, "It may crash" is better stated, "It might crash".
2007-02-01 20:10:30 +01:00
|
|
|
ERROR: temporary tables cannot specify a schema name
|
2005-02-02 07:36:02 +01:00
|
|
|
-- joins: if any of the join relations are temporary, the view
|
|
|
|
-- should also be temporary
|
|
|
|
-- should be non-temp
|
|
|
|
CREATE VIEW v3 AS
|
|
|
|
SELECT t1.a AS t1_a, t2.a AS t2_a
|
|
|
|
FROM base_table t1, base_table2 t2
|
|
|
|
WHERE t1.id = t2.id;
|
|
|
|
-- should be temp (one join rel is temp)
|
|
|
|
CREATE VIEW v4_temp AS
|
|
|
|
SELECT t1.a AS t1_a, t2.a AS t2_a
|
|
|
|
FROM base_table t1, temp_table t2
|
|
|
|
WHERE t1.id = t2.id;
|
|
|
|
NOTICE: view "v4_temp" will be a temporary view
|
|
|
|
-- should be temp
|
|
|
|
CREATE VIEW v5_temp AS
|
|
|
|
SELECT t1.a AS t1_a, t2.a AS t2_a, t3.a AS t3_a
|
|
|
|
FROM base_table t1, base_table2 t2, temp_table t3
|
|
|
|
WHERE t1.id = t2.id and t2.id = t3.id;
|
|
|
|
NOTICE: view "v5_temp" will be a temporary view
|
|
|
|
-- subqueries
|
|
|
|
CREATE VIEW v4 AS SELECT * FROM base_table WHERE id IN (SELECT id FROM base_table2);
|
|
|
|
CREATE VIEW v5 AS SELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM base_table2) t2;
|
|
|
|
CREATE VIEW v6 AS SELECT * FROM base_table WHERE EXISTS (SELECT 1 FROM base_table2);
|
|
|
|
CREATE VIEW v7 AS SELECT * FROM base_table WHERE NOT EXISTS (SELECT 1 FROM base_table2);
|
|
|
|
CREATE VIEW v8 AS SELECT * FROM base_table WHERE EXISTS (SELECT 1);
|
|
|
|
CREATE VIEW v6_temp AS SELECT * FROM base_table WHERE id IN (SELECT id FROM temp_table);
|
|
|
|
NOTICE: view "v6_temp" will be a temporary view
|
|
|
|
CREATE VIEW v7_temp AS SELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM temp_table) t2;
|
|
|
|
NOTICE: view "v7_temp" will be a temporary view
|
|
|
|
CREATE VIEW v8_temp AS SELECT * FROM base_table WHERE EXISTS (SELECT 1 FROM temp_table);
|
|
|
|
NOTICE: view "v8_temp" will be a temporary view
|
|
|
|
CREATE VIEW v9_temp AS SELECT * FROM base_table WHERE NOT EXISTS (SELECT 1 FROM temp_table);
|
|
|
|
NOTICE: view "v9_temp" will be a temporary view
|
|
|
|
-- a view should also be temporary if it references a temporary view
|
|
|
|
CREATE VIEW v10_temp AS SELECT * FROM v7_temp;
|
|
|
|
NOTICE: view "v10_temp" will be a temporary view
|
|
|
|
CREATE VIEW v11_temp AS SELECT t1.id, t2.a FROM base_table t1, v10_temp t2;
|
|
|
|
NOTICE: view "v11_temp" will be a temporary view
|
|
|
|
CREATE VIEW v12_temp AS SELECT true FROM v11_temp;
|
|
|
|
NOTICE: view "v12_temp" will be a temporary view
|
|
|
|
-- a view should also be temporary if it references a temporary sequence
|
|
|
|
CREATE SEQUENCE seq1;
|
|
|
|
CREATE TEMPORARY SEQUENCE seq1_temp;
|
2005-04-07 03:51:41 +02:00
|
|
|
CREATE VIEW v9 AS SELECT seq1.is_called FROM seq1;
|
|
|
|
CREATE VIEW v13_temp AS SELECT seq1_temp.is_called FROM seq1_temp;
|
2005-02-02 07:36:02 +01:00
|
|
|
NOTICE: view "v13_temp" will be a temporary view
|
|
|
|
SELECT relname FROM pg_class
|
2010-11-23 21:27:50 +01:00
|
|
|
WHERE relname LIKE 'v_'
|
2005-02-02 07:36:02 +01:00
|
|
|
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'temp_view_test')
|
|
|
|
ORDER BY relname;
|
|
|
|
relname
|
|
|
|
---------
|
|
|
|
v1
|
|
|
|
v2
|
|
|
|
v3
|
|
|
|
v4
|
|
|
|
v5
|
|
|
|
v6
|
|
|
|
v7
|
|
|
|
v8
|
|
|
|
v9
|
|
|
|
(9 rows)
|
|
|
|
|
|
|
|
SELECT relname FROM pg_class
|
2010-11-23 21:27:50 +01:00
|
|
|
WHERE relname LIKE 'v%'
|
2005-02-02 07:36:02 +01:00
|
|
|
AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE 'pg_temp%')
|
|
|
|
ORDER BY relname;
|
|
|
|
relname
|
|
|
|
----------
|
|
|
|
v10_temp
|
|
|
|
v11_temp
|
|
|
|
v12_temp
|
|
|
|
v13_temp
|
|
|
|
v1_temp
|
|
|
|
v2_temp
|
|
|
|
v4_temp
|
|
|
|
v5_temp
|
|
|
|
v6_temp
|
|
|
|
v7_temp
|
|
|
|
v8_temp
|
|
|
|
v9_temp
|
|
|
|
(12 rows)
|
|
|
|
|
|
|
|
CREATE SCHEMA testviewschm2;
|
|
|
|
SET search_path TO testviewschm2, public;
|
|
|
|
CREATE TABLE t1 (num int, name text);
|
|
|
|
CREATE TABLE t2 (num2 int, value text);
|
|
|
|
CREATE TEMP TABLE tt (num2 int, value text);
|
|
|
|
CREATE VIEW nontemp1 AS SELECT * FROM t1 CROSS JOIN t2;
|
|
|
|
CREATE VIEW temporal1 AS SELECT * FROM t1 CROSS JOIN tt;
|
|
|
|
NOTICE: view "temporal1" will be a temporary view
|
|
|
|
CREATE VIEW nontemp2 AS SELECT * FROM t1 INNER JOIN t2 ON t1.num = t2.num2;
|
|
|
|
CREATE VIEW temporal2 AS SELECT * FROM t1 INNER JOIN tt ON t1.num = tt.num2;
|
|
|
|
NOTICE: view "temporal2" will be a temporary view
|
|
|
|
CREATE VIEW nontemp3 AS SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num2;
|
|
|
|
CREATE VIEW temporal3 AS SELECT * FROM t1 LEFT JOIN tt ON t1.num = tt.num2;
|
|
|
|
NOTICE: view "temporal3" will be a temporary view
|
|
|
|
CREATE VIEW nontemp4 AS SELECT * FROM t1 LEFT JOIN t2 ON t1.num = t2.num2 AND t2.value = 'xxx';
|
|
|
|
CREATE VIEW temporal4 AS SELECT * FROM t1 LEFT JOIN tt ON t1.num = tt.num2 AND tt.value = 'xxx';
|
|
|
|
NOTICE: view "temporal4" will be a temporary view
|
|
|
|
SELECT relname FROM pg_class
|
|
|
|
WHERE relname LIKE 'nontemp%'
|
|
|
|
AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'testviewschm2')
|
|
|
|
ORDER BY relname;
|
|
|
|
relname
|
|
|
|
----------
|
|
|
|
nontemp1
|
|
|
|
nontemp2
|
|
|
|
nontemp3
|
|
|
|
nontemp4
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
SELECT relname FROM pg_class
|
2010-11-23 21:27:50 +01:00
|
|
|
WHERE relname LIKE 'temporal%'
|
2005-02-02 07:36:02 +01:00
|
|
|
AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE 'pg_temp%')
|
|
|
|
ORDER BY relname;
|
|
|
|
relname
|
|
|
|
-----------
|
|
|
|
temporal1
|
|
|
|
temporal2
|
|
|
|
temporal3
|
|
|
|
temporal4
|
|
|
|
(4 rows)
|
|
|
|
|
|
|
|
CREATE TABLE tbl1 ( a int, b int);
|
|
|
|
CREATE TABLE tbl2 (c int, d int);
|
|
|
|
CREATE TABLE tbl3 (e int, f int);
|
|
|
|
CREATE TABLE tbl4 (g int, h int);
|
|
|
|
CREATE TEMP TABLE tmptbl (i int, j int);
|
|
|
|
--Should be in testviewschm2
|
|
|
|
CREATE VIEW pubview AS SELECT * FROM tbl1 WHERE tbl1.a
|
|
|
|
BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2)
|
|
|
|
AND EXISTS (SELECT g FROM tbl4 LEFT JOIN tbl3 ON tbl4.h = tbl3.f);
|
|
|
|
SELECT count(*) FROM pg_class where relname = 'pubview'
|
|
|
|
AND relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname = 'testviewschm2');
|
|
|
|
count
|
|
|
|
-------
|
|
|
|
1
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
--Should be in temp object schema
|
|
|
|
CREATE VIEW mytempview AS SELECT * FROM tbl1 WHERE tbl1.a
|
|
|
|
BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2)
|
|
|
|
AND EXISTS (SELECT g FROM tbl4 LEFT JOIN tbl3 ON tbl4.h = tbl3.f)
|
|
|
|
AND NOT EXISTS (SELECT g FROM tbl4 LEFT JOIN tmptbl ON tbl4.h = tmptbl.j);
|
|
|
|
NOTICE: view "mytempview" will be a temporary view
|
|
|
|
SELECT count(*) FROM pg_class where relname LIKE 'mytempview'
|
|
|
|
And relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname LIKE 'pg_temp%');
|
|
|
|
count
|
|
|
|
-------
|
|
|
|
1
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
DROP SCHEMA temp_view_test CASCADE;
|
2008-06-11 23:53:49 +02:00
|
|
|
NOTICE: drop cascades to 22 other objects
|
|
|
|
DETAIL: drop cascades to table temp_view_test.base_table
|
|
|
|
drop cascades to view v7_temp
|
|
|
|
drop cascades to view v10_temp
|
|
|
|
drop cascades to view v11_temp
|
|
|
|
drop cascades to view v12_temp
|
|
|
|
drop cascades to view v2_temp
|
|
|
|
drop cascades to view v4_temp
|
|
|
|
drop cascades to view v6_temp
|
|
|
|
drop cascades to view v8_temp
|
|
|
|
drop cascades to view v9_temp
|
|
|
|
drop cascades to table temp_view_test.base_table2
|
|
|
|
drop cascades to view v5_temp
|
|
|
|
drop cascades to view temp_view_test.v1
|
|
|
|
drop cascades to view temp_view_test.v2
|
|
|
|
drop cascades to view temp_view_test.v3
|
|
|
|
drop cascades to view temp_view_test.v4
|
|
|
|
drop cascades to view temp_view_test.v5
|
|
|
|
drop cascades to view temp_view_test.v6
|
|
|
|
drop cascades to view temp_view_test.v7
|
|
|
|
drop cascades to view temp_view_test.v8
|
|
|
|
drop cascades to sequence temp_view_test.seq1
|
|
|
|
drop cascades to view temp_view_test.v9
|
2005-02-02 07:36:02 +01:00
|
|
|
DROP SCHEMA testviewschm2 CASCADE;
|
2008-06-11 23:53:49 +02:00
|
|
|
NOTICE: drop cascades to 16 other objects
|
|
|
|
DETAIL: drop cascades to table t1
|
|
|
|
drop cascades to view temporal1
|
|
|
|
drop cascades to view temporal2
|
|
|
|
drop cascades to view temporal3
|
|
|
|
drop cascades to view temporal4
|
|
|
|
drop cascades to table t2
|
|
|
|
drop cascades to view nontemp1
|
|
|
|
drop cascades to view nontemp2
|
|
|
|
drop cascades to view nontemp3
|
|
|
|
drop cascades to view nontemp4
|
|
|
|
drop cascades to table tbl1
|
|
|
|
drop cascades to table tbl2
|
|
|
|
drop cascades to table tbl3
|
|
|
|
drop cascades to table tbl4
|
|
|
|
drop cascades to view mytempview
|
|
|
|
drop cascades to view pubview
|
2005-02-02 07:36:02 +01:00
|
|
|
SET search_path to public;
|