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