summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2008-11-20 14:04:46 +0000
committerPeter Eisentraut2008-11-20 14:04:46 +0000
commit538ae432d47c2a99fc841c36d733af13c19df332 (patch)
tree03e1ca7e7f8fc8f120cd468aadfd0b7e63897420
parentf86d99a20e12e3da546c3967f7971c9b317539b4 (diff)
TABLE command
-rw-r--r--doc/src/sgml/ref/create_table_as.sgml16
-rw-r--r--doc/src/sgml/ref/select.sgml24
-rw-r--r--src/backend/catalog/sql_features.txt2
-rw-r--r--src/backend/parser/gram.y22
-rw-r--r--src/bin/psql/tab-complete.c12
-rw-r--r--src/test/regress/expected/select.out2
-rw-r--r--src/test/regress/sql/select.sql2
7 files changed, 69 insertions, 11 deletions
diff --git a/doc/src/sgml/ref/create_table_as.sgml b/doc/src/sgml/ref/create_table_as.sgml
index 658ed5a02c..f7742b2313 100644
--- a/doc/src/sgml/ref/create_table_as.sgml
+++ b/doc/src/sgml/ref/create_table_as.sgml
@@ -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>
@@ -261,6 +263,16 @@ CREATE TABLE films_recent AS
</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
prepared statement. The new table has OIDs and will be dropped at commit:
diff --git a/doc/src/sgml/ref/select.sgml b/doc/src/sgml/ref/select.sgml
index 61b49cfc48..ced2b50963 100644
--- a/doc/src/sgml/ref/select.sgml
+++ b/doc/src/sgml/ref/select.sgml
@@ -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>
@@ -21,6 +22,10 @@ PostgreSQL documentation
</indexterm>
<indexterm zone="sql-select">
+ <primary>TABLE command</primary>
+ </indexterm>
+
+ <indexterm zone="sql-select">
<primary>WITH</primary>
<secondary>in SELECT</secondary>
</indexterm>
@@ -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 354fd98811..3afffa814a 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 34fd0b21cb..cefbc5f865 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -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 cff6728196..784413b167 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -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 2936f0306a..19a0b9caae 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 bb1fc9b934..a9ddd5e586 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