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;