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;
