diff --git a/doc/src/sgml/ref/create_table_as.sgml b/doc/src/sgml/ref/create_table_as.sgml
index bf3c78896b06d0aad6baef6d0e10078950d04890..b31a25704f8d11092b24353b4a6f5cc486c429c2 100644
--- a/doc/src/sgml/ref/create_table_as.sgml
+++ b/doc/src/sgml/ref/create_table_as.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/create_table_as.sgml,v 1.39 2008/11/14 10:22:46 petere Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/create_table_as.sgml,v 1.40 2008/11/20 14:04:45 petere Exp $
 PostgreSQL documentation
 -->
 
@@ -196,10 +196,12 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name
     <term><replaceable>query</replaceable></term>
     <listitem>
      <para>
-      A <xref linkend="sql-select" endterm="sql-select-title"> or
+      A <xref linkend="sql-select"
+      endterm="sql-select-title">, <link linkend="sql-table">TABLE</link>,
+      or
       <xref linkend="sql-values" endterm="sql-values-title"> command,
       or an <xref linkend="sql-execute" endterm="sql-execute-title"> command
-      that runs a prepared <command>SELECT</> or <command>VALUES</> query.
+      that runs a prepared <command>SELECT</>, <command>TABLE</>, or <command>VALUES</> query.
      </para>
     </listitem>
    </varlistentry>
@@ -260,6 +262,16 @@ CREATE TABLE films_recent AS
 </programlisting>
   </para>
 
+  <para>
+   To copy a table completely, the short form using
+   the <literal>TABLE</literal> command can also be used:
+
+<programlisting>
+CREATE TABLE films2 AS
+  TABLE films;
+</programlisting>
+  </para>
+
   <para>
    Create a new temporary table <literal>films_recent</literal>, consisting of
    only recent entries from the table <literal>films</literal>, using a
diff --git a/doc/src/sgml/ref/select.sgml b/doc/src/sgml/ref/select.sgml
index 75ef1ee1f21cc22be91b12de891a1f01386f388a..68ec391238bdf7914dbaf930ac9147bafdd5ca02 100644
--- a/doc/src/sgml/ref/select.sgml
+++ b/doc/src/sgml/ref/select.sgml
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/select.sgml,v 1.109 2008/11/19 12:21:57 petere Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/select.sgml,v 1.110 2008/11/20 14:04:45 petere Exp $
 PostgreSQL documentation
 -->
 
@@ -12,6 +12,7 @@ PostgreSQL documentation
 
  <refnamediv>
   <refname>SELECT</refname>
+  <refname>TABLE</refname>
   <refname>WITH</refname>
   <refpurpose>retrieve rows from a table or view</refpurpose>
  </refnamediv>
@@ -20,6 +21,10 @@ PostgreSQL documentation
   <primary>SELECT</primary>
  </indexterm>
 
+ <indexterm zone="sql-select">
+  <primary>TABLE command</primary>
+ </indexterm>
+
  <indexterm zone="sql-select">
   <primary>WITH</primary>
   <secondary>in SELECT</secondary>
@@ -53,6 +58,8 @@ where <replaceable class="parameter">from_item</replaceable> can be one of:
 and <replaceable class="parameter">with_query</replaceable> is:
 
     <replaceable class="parameter">with_query_name</replaceable> [ ( <replaceable class="parameter">column_name</replaceable> [, ...] ) ] AS ( <replaceable class="parameter">select</replaceable> )
+
+TABLE <replaceable class="parameter">table_name</replaceable> | <replaceable class="parameter">with_query_name</replaceable>
 </synopsis>
 
  </refsynopsisdiv>
@@ -1071,6 +1078,23 @@ ROLLBACK TO s;
    </para>
   </caution>
   </refsect2>
+
+  <refsect2 id="SQL-TABLE">
+   <title><literal>TABLE</literal> Command</title>
+
+   <para>
+    The command
+<programlisting>
+TABLE <replaceable class="parameter">name</replaceable>
+</programlisting>
+    is completely equivalent to
+<programlisting>
+SELECT * FROM <replaceable class="parameter">name</replaceable>
+</programlisting>
+    It can be used as a top-level command or as a space-saving syntax
+    variant in parts of complex queries.
+   </para>
+  </refsect2>
  </refsect1>
 
  <refsect1>
diff --git a/src/backend/catalog/sql_features.txt b/src/backend/catalog/sql_features.txt
index 354fd98811b40f2d3617147ecbfaa24e4f8bea71..3afffa814ab95457bc5dd1fc1ba78d425906eadd 100644
--- a/src/backend/catalog/sql_features.txt
+++ b/src/backend/catalog/sql_features.txt
@@ -280,7 +280,7 @@ F591	Derived tables			YES
 F611	Indicator data types			YES	
 F641	Row and table constructors			NO	
 F651	Catalog name qualifiers			YES	
-F661	Simple tables			NO	
+F661	Simple tables			YES	
 F671	Subqueries in CHECK			NO	intentionally omitted
 F672	Retrospective check constraints			YES	
 F690	Collation support			NO	
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index b3046c04b201b66c8e1786f810982b5737eaf91c..6733372da2d6ec7811bea0725b50dcdf2dd51e7d 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.637 2008/11/13 11:10:06 meskes Exp $
+ *	  $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.638 2008/11/20 14:04:46 petere Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -6431,6 +6431,28 @@ simple_select:
 					$$ = (Node *)n;
 				}
 			| values_clause							{ $$ = $1; }
+			| TABLE qualified_name
+				{
+					/* same as SELECT * FROM qualified_name */
+					ColumnRef *cr = makeNode(ColumnRef);
+					ResTarget *rt = makeNode(ResTarget);
+					SelectStmt *n = makeNode(SelectStmt);
+
+					cr->fields = list_make1(makeNode(A_Star));
+					cr->location = -1;
+
+					rt->name = NULL;
+					rt->indirection = NIL;
+					rt->val = (Node *)cr;
+					rt->location = -1;
+
+					$2->inhOpt = INH_DEFAULT;
+					$2->alias = NULL;
+
+					n->targetList = list_make1(rt);
+					n->fromClause = list_make1($2);
+					$$ = (Node *)n;
+				}
 			| select_clause UNION opt_all select_clause
 				{
 					$$ = makeSetOp(SETOP_UNION, $3, $1, $4);
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index d262f21771e7d679f7039fb67284851f30fddeec..635e0c7fa7b25e855a24afba38812722f7e2d907 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2008, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.176 2008/11/11 02:42:32 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.177 2008/11/20 14:04:46 petere Exp $
  */
 
 /*----------------------------------------------------------------------
@@ -615,7 +615,7 @@ psql_completion(char *text, int start, int end)
 		"DELETE FROM", "DISCARD", "DROP", "END", "EXECUTE", "EXPLAIN", "FETCH",
 		"GRANT", "INSERT", "LISTEN", "LOAD", "LOCK", "MOVE", "NOTIFY", "PREPARE",
 		"REASSIGN", "REINDEX", "RELEASE", "RESET", "REVOKE", "ROLLBACK",
-		"SAVEPOINT", "SELECT", "SET", "SHOW", "START", "TRUNCATE", "UNLISTEN",
+		"SAVEPOINT", "SELECT", "SET", "SHOW", "START", "TABLE", "TRUNCATE", "UNLISTEN",
 		"UPDATE", "VACUUM", "VALUES", "WITH", NULL
 	};
 
@@ -1694,24 +1694,24 @@ psql_completion(char *text, int start, int end)
 		COMPLETE_WITH_ATTR(prev_wd, "");
 
 	/*
-	 * Complete INSERT INTO <table> with "VALUES" or "SELECT" or "DEFAULT
-	 * VALUES"
+	 * Complete INSERT INTO <table> with "VALUES" or "SELECT" or
+	 * "TABLE" or "DEFAULT VALUES"
 	 */
 	else if (pg_strcasecmp(prev3_wd, "INSERT") == 0 &&
 			 pg_strcasecmp(prev2_wd, "INTO") == 0)
 	{
 		static const char *const list_INSERT[] =
-		{"DEFAULT VALUES", "SELECT", "VALUES", NULL};
+		{"DEFAULT VALUES", "SELECT", "TABLE", "VALUES", NULL};
 
 		COMPLETE_WITH_LIST(list_INSERT);
 	}
-	/* Complete INSERT INTO <table> (attribs) with "VALUES" or "SELECT" */
+	/* Complete INSERT INTO <table> (attribs) with "VALUES" or "SELECT" or "TABLE" */
 	else if (pg_strcasecmp(prev4_wd, "INSERT") == 0 &&
 			 pg_strcasecmp(prev3_wd, "INTO") == 0 &&
 			 prev_wd[strlen(prev_wd) - 1] == ')')
 	{
 		static const char *const list_INSERT[] =
-		{"SELECT", "VALUES", NULL};
+		{"SELECT", "TABLE", "VALUES", NULL};
 
 		COMPLETE_WITH_LIST(list_INSERT);
 	}
diff --git a/src/test/regress/expected/select.out b/src/test/regress/expected/select.out
index 2936f0306aba92ea92d6f12a59c66a01b195d785..19a0b9caae67bbec689758c191e64f5ebceb0444 100644
--- a/src/test/regress/expected/select.out
+++ b/src/test/regress/expected/select.out
@@ -506,7 +506,7 @@ VALUES (1,2), (3,4+4), (7,77.7)
 UNION ALL
 SELECT 2+2, 57
 UNION ALL
-SELECT * FROM int8_tbl;
+TABLE int8_tbl;
      column1      |      column2      
 ------------------+-------------------
                 1 |                 2
diff --git a/src/test/regress/sql/select.sql b/src/test/regress/sql/select.sql
index bb1fc9b9347d0e9db40550aa9cd01a4721f1b984..a9ddd5e5861eee963a3dde46d19a4343aec25b75 100644
--- a/src/test/regress/sql/select.sql
+++ b/src/test/regress/sql/select.sql
@@ -146,7 +146,7 @@ VALUES (1,2), (3,4+4), (7,77.7)
 UNION ALL
 SELECT 2+2, 57
 UNION ALL
-SELECT * FROM int8_tbl;
+TABLE int8_tbl;
 
 --
 -- Test ORDER BY options