allow-create-view-on-table-without-columns-v3.patch
application/octet-stream
Filename: allow-create-view-on-table-without-columns-v3.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch v3
| File | + | − |
|---|---|---|
| src/backend/commands/view.c | 0 | 4 |
| src/test/regress/expected/create_view.out | 14 | 0 |
| src/test/regress/expected/matview.out | 16 | 0 |
| src/test/regress/expected/rules.out | 4 | 0 |
| src/test/regress/expected/sanity_check.out | 1 | 0 |
| src/test/regress/expected/select_into.out | 9 | 0 |
| src/test/regress/sql/create_view.sql | 10 | 0 |
| src/test/regress/sql/matview.sql | 12 | 0 |
| src/test/regress/sql/select_into.sql | 7 | 0 |
diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c
index 65f4b40..c49ae97 100644
--- a/src/backend/commands/view.c
+++ b/src/backend/commands/view.c
@@ -111,10 +111,6 @@ DefineVirtualRelation(RangeVar *relation, List *tlist, bool replace,
}
}
- if (attrList == NIL)
- ereport(ERROR,
- (errcode(ERRCODE_INVALID_TABLE_DEFINITION),
- errmsg("view must have at least one column")));
/*
* Look up, check permissions on, and lock the creation namespace; also
diff --git a/src/test/regress/expected/create_view.out b/src/test/regress/expected/create_view.out
index 141fc6d..18c1cd9 100644
--- a/src/test/regress/expected/create_view.out
+++ b/src/test/regress/expected/create_view.out
@@ -63,6 +63,20 @@ CREATE OR REPLACE VIEW viewtest AS
SELECT a, b, 0 AS c FROM viewtest_tbl;
DROP VIEW viewtest;
DROP TABLE viewtest_tbl;
+-- create view on a table without columns. should work
+CREATE TABLE view_table_no_columns();
+CREATE OR REPLACE VIEW view_no_columns AS SELECT * FROM view_table_no_columns;
+SELECT * FROM view_no_columns;
+--
+(0 rows)
+
+-- create view selecting zero columns. should work
+ALTER TABLE view_table_no_columns ADD COLUMN a integer;
+CREATE OR REPLACE VIEW view_zero_columns AS SELECT FROM view_table_no_columns;
+SELECT * FROM view_zero_columns;
+--
+(0 rows)
+
-- tests for temporary views
CREATE SCHEMA temp_view_test
CREATE TABLE base_table (a int, id int)
diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out
index d0121a7..b303416 100644
--- a/src/test/regress/expected/matview.out
+++ b/src/test/regress/expected/matview.out
@@ -589,3 +589,19 @@ SELECT * FROM mvtest2;
ERROR: materialized view "mvtest2" has not been populated
HINT: Use the REFRESH MATERIALIZED VIEW command.
ROLLBACK;
+-- create materialized view on a table without columns.
+CREATE TABLE matview_table_no_columns();
+CREATE MATERIALIZED VIEW matview_no_columns AS SELECT * FROM matview_table_no_columns;
+SELECT * FROM matview_no_columns;
+--
+(0 rows)
+
+-- create materialized view selecting zero columns.
+ALTER TABLE matview_table_no_columns ADD COLUMN a integer;
+CREATE MATERIALIZED VIEW matview_zero_columns AS SELECT FROM matview_table_no_columns;
+SELECT * FROM matview_zero_columns;
+--
+(0 rows)
+
+DROP MATERIALIZED VIEW matview_no_columns, matview_zero_columns;
+DROP TABLE matview_table_no_columns;
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index 2c8e21b..ac1f4ec 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -2346,6 +2346,10 @@ toyemp| SELECT emp.name,
emp.location,
(12 * emp.salary) AS annualsal
FROM emp;
+view_no_columns| SELECT
+ FROM view_table_no_columns;
+view_zero_columns| SELECT
+ FROM view_table_no_columns;
SELECT tablename, rulename, definition FROM pg_rules
ORDER BY tablename, rulename;
pg_settings|pg_settings_n|CREATE RULE pg_settings_n AS
diff --git a/src/test/regress/expected/sanity_check.out b/src/test/regress/expected/sanity_check.out
index 89537bc..b848f58 100644
--- a/src/test/regress/expected/sanity_check.out
+++ b/src/test/regress/expected/sanity_check.out
@@ -205,6 +205,7 @@ timestamp_tbl|f
timestamptz_tbl|f
timetz_tbl|f
varchar_tbl|f
+view_table_no_columns|f
-- restore normal output mode
\a\t
--
diff --git a/src/test/regress/expected/select_into.out b/src/test/regress/expected/select_into.out
index f373fae..23967a7 100644
--- a/src/test/regress/expected/select_into.out
+++ b/src/test/regress/expected/select_into.out
@@ -140,3 +140,12 @@ INSERT INTO b SELECT 1 INTO f;
ERROR: SELECT ... INTO is not allowed here
LINE 1: INSERT INTO b SELECT 1 INTO f;
^
+-- Create a new table named "table_no_column_copy" using table "table_no_column"
+-- without columns. Should succeed.
+CREATE TABLE table_no_columns();
+SELECT * INTO table_no_columns_copy FROM table_no_columns;
+SELECT * FROM table_no_columns;
+--
+(0 rows)
+
+DROP TABLE table_no_columns, table_no_columns_copy;
diff --git a/src/test/regress/sql/create_view.sql b/src/test/regress/sql/create_view.sql
index 9480030..e07bd3e 100644
--- a/src/test/regress/sql/create_view.sql
+++ b/src/test/regress/sql/create_view.sql
@@ -68,6 +68,16 @@ CREATE OR REPLACE VIEW viewtest AS
DROP VIEW viewtest;
DROP TABLE viewtest_tbl;
+-- create view on a table without columns. should work
+CREATE TABLE view_table_no_columns();
+CREATE OR REPLACE VIEW view_no_columns AS SELECT * FROM view_table_no_columns;
+SELECT * FROM view_no_columns;
+
+-- create view selecting zero columns. should work
+ALTER TABLE view_table_no_columns ADD COLUMN a integer;
+CREATE OR REPLACE VIEW view_zero_columns AS SELECT FROM view_table_no_columns;
+SELECT * FROM view_zero_columns;
+
-- tests for temporary views
CREATE SCHEMA temp_view_test
diff --git a/src/test/regress/sql/matview.sql b/src/test/regress/sql/matview.sql
index d96175a..eae374d 100644
--- a/src/test/regress/sql/matview.sql
+++ b/src/test/regress/sql/matview.sql
@@ -236,3 +236,15 @@ SELECT mvtest_func();
SELECT * FROM mvtest1;
SELECT * FROM mvtest2;
ROLLBACK;
+
+-- create materialized view on a table without columns.
+CREATE TABLE matview_table_no_columns();
+CREATE MATERIALIZED VIEW matview_no_columns AS SELECT * FROM matview_table_no_columns;
+SELECT * FROM matview_no_columns;
+
+-- create materialized view selecting zero columns.
+ALTER TABLE matview_table_no_columns ADD COLUMN a integer;
+CREATE MATERIALIZED VIEW matview_zero_columns AS SELECT FROM matview_table_no_columns;
+SELECT * FROM matview_zero_columns;
+DROP MATERIALIZED VIEW matview_no_columns, matview_zero_columns;
+DROP TABLE matview_table_no_columns;
diff --git a/src/test/regress/sql/select_into.sql b/src/test/regress/sql/select_into.sql
index a708fef..121d500 100644
--- a/src/test/regress/sql/select_into.sql
+++ b/src/test/regress/sql/select_into.sql
@@ -104,3 +104,10 @@ COPY (SELECT 1 INTO frak UNION SELECT 2) TO 'blob';
SELECT * FROM (SELECT 1 INTO f) bar;
CREATE VIEW foo AS SELECT 1 INTO b;
INSERT INTO b SELECT 1 INTO f;
+
+-- Create a new table named "table_no_column_copy" using table "table_no_column"
+-- without columns. Should succeed.
+CREATE TABLE table_no_columns();
+SELECT * INTO table_no_columns_copy FROM table_no_columns;
+SELECT * FROM table_no_columns;
+DROP TABLE table_no_columns, table_no_columns_copy;