diff --git a/doc/src/sgml/ref/create_table_as.sgml b/doc/src/sgml/ref/create_table_as.sgml index d298e1a5ea1d622d83d0ad2238520413b843c6b3..0f648d56b3a93ca864d9111fb8993bf2f9ca077a 100644 --- a/doc/src/sgml/ref/create_table_as.sgml +++ b/doc/src/sgml/ref/create_table_as.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_table_as.sgml,v 1.13 2003/05/04 00:03:55 tgl Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_table_as.sgml,v 1.14 2003/07/01 00:04:31 petere Exp $ PostgreSQL documentation --> @@ -26,11 +26,12 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name <para> <command>CREATE TABLE AS</command> creates a table and fills it - with data computed by a <command>SELECT</command> command. The - table columns have the names and data types associated with the - output columns of the <command>SELECT</command> (except that you - can override the column names by giving an explicit list of new - column names). + with data computed by a <command>SELECT</command> command or an + <command>EXECUTE</command> that runs a prepared + <command>SELECT</command> command. The table columns have the + names and data types associated with the output columns of the + <command>SELECT</command> (except that you can override the column + names by giving an explicit list of new column names). </para> <para> @@ -73,7 +74,9 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name <para> The name of a column in the new table. If column names are not provided, they are taken from the output column names of the - query. + query. If the table is created out of an + <command>EXECUTE</command> command, a column name list can + currently not be specified. </para> </listitem> </varlistentry> @@ -82,10 +85,12 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name <term><replaceable>query</replaceable></term> <listitem> <para> - A query statement (that is, a <command>SELECT</command> - command). Refer to - <xref linkend="sql-select" endterm="sql-select-title"> - for a description of the allowed syntax. + A query statement (that is, a <command>SELECT</command> command + or an <command>EXECUTE</command> command that runs a prepared + <command>SELECT</command> command). Refer to <xref + linkend="sql-select" endterm="sql-select-title"> or <xref + linkend="sql-execute" endterm="sql-execute-title">, + respectively, for a description of the allowed syntax. </para> </listitem> </varlistentry> @@ -96,9 +101,11 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name <title>Diagnostics</title> <para> - Refer to <xref linkend="sql-createtable" endterm="sql-createtable-title"> and - <xref linkend="sql-select" endterm="sql-select-title"> - for a summary of possible output messages. + Refer to <xref linkend="sql-createtable" + endterm="sql-createtable-title">, <xref linkend="sql-select" + endterm="sql-select-title">, and <xref linkend="sql-execute" + endterm="sql-execute-title"> for a summary of possible output + messages. </para> </refsect1> @@ -131,6 +138,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable>table_name <simplelist type="inline"> <member><xref linkend="sql-createtable" endterm="sql-createtable-title"></member> <member><xref linkend="sql-createview" endterm="sql-createview-title"></member> + <member><xref linkend="sql-execute" endterm="sql-execute-title"></member> <member><xref linkend="sql-select" endterm="sql-select-title"></member> <member><xref linkend="sql-selectinto" endterm="sql-selectinto-title"></member> </simplelist> diff --git a/doc/src/sgml/ref/execute.sgml b/doc/src/sgml/ref/execute.sgml index f4b0a062fc8e0400c37bf7b5aeedc56c1f83fd0b..7704b8ce27b67ade824d66ced73b88eca1c8dfeb 100644 --- a/doc/src/sgml/ref/execute.sgml +++ b/doc/src/sgml/ref/execute.sgml @@ -1,5 +1,5 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/ref/execute.sgml,v 1.4 2003/04/26 23:56:51 petere Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/ref/execute.sgml,v 1.5 2003/07/01 00:04:31 petere Exp $ PostgreSQL documentation --> @@ -16,7 +16,7 @@ PostgreSQL documentation <refsynopsisdiv> <synopsis> -EXECUTE <replaceable class="PARAMETER">plan_name</replaceable> [ (<replaceable class="PARAMETER">parameter</replaceable> [, ...] ) ] [ INTO [ TEMPORARY | TEMP ] <replaceable class="PARAMETER">table</replaceable> ] +EXECUTE <replaceable class="PARAMETER">plan_name</replaceable> [ (<replaceable class="PARAMETER">parameter</replaceable> [, ...] ) ] </synopsis> </refsynopsisdiv> @@ -40,13 +40,6 @@ EXECUTE <replaceable class="PARAMETER">plan_name</replaceable> [ (<replaceable c name of a prepared statement must be unique within a database session. </para> - <para> - Like <command>SELECT INTO</command>, <command>EXECUTE</command> can - store the results of executing a query into a newly-created - table, by specifying an <literal>INTO</> clause. For more information on this behavior, - see <xref linkend="sql-selectinto" endterm="sql-selectinto-title">. - </para> - <para> For more information on the creation and usage of prepared statements, see <xref linkend="sql-prepare" endterm="sql-prepare-title">. @@ -78,18 +71,6 @@ EXECUTE <replaceable class="PARAMETER">plan_name</replaceable> [ (<replaceable c </para> </listitem> </varlistentry> - - <varlistentry> - <term><replaceable class="PARAMETER">table</replaceable></term> - <listitem> - <para> - The name of the table in which to store the results of executing - the statement (if it is a <command>SELECT</command>). If no - table is specified, the results are returned to the client (as - normal). - </para> - </listitem> - </varlistentry> </variablelist> </refsect1> diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 433fd8e049e86a7a4c8419ac43a2385c6c40f981..dad1b7f703c6cff910aa0ba0bb83be8cc4cfdd95 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -10,7 +10,7 @@ * Copyright (c) 2002-2003, PostgreSQL Global Development Group * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.18 2003/05/08 18:16:36 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/prepare.c,v 1.19 2003/07/01 00:04:31 petere Exp $ * *------------------------------------------------------------------------- */ @@ -140,10 +140,10 @@ ExecuteQuery(ExecuteStmt *stmt, DestReceiver *dest) portal = CreateNewPortal(); /* - * For EXECUTE INTO, make a copy of the stored query so that we can - * modify its destination (yech, but INTO has always been ugly). - * For regular EXECUTE we can just use the stored query where it sits, - * since the executor is read-only. + * For CREATE TABLE / AS EXECUTE, make a copy of the stored query + * so that we can modify its destination (yech, but this has + * always been ugly). For regular EXECUTE we can just use the + * stored query where it sits, since the executor is read-only. */ if (stmt->into) { @@ -159,10 +159,10 @@ ExecuteQuery(ExecuteStmt *stmt, DestReceiver *dest) qcontext = PortalGetHeapMemory(portal); if (length(query_list) != 1) - elog(ERROR, "INTO clause specified for non-SELECT query"); + elog(ERROR, "prepared statement is not a SELECT"); query = (Query *) lfirst(query_list); if (query->commandType != CMD_SELECT) - elog(ERROR, "INTO clause specified for non-SELECT query"); + elog(ERROR, "prepared statement is not a SELECT"); query->into = copyObject(stmt->into); MemoryContextSwitchTo(oldContext); @@ -519,7 +519,7 @@ ExplainExecuteQuery(ExplainStmt *stmt, TupOutputState *tstate) if (execstmt->into) { if (query->commandType != CMD_SELECT) - elog(ERROR, "INTO clause specified for non-SELECT query"); + elog(ERROR, "prepared statement is not a SELECT"); /* Copy the query so we can modify it */ query = copyObject(query); diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index a8df7c65e9dfe376d82464e09cc0c41ff7dc4426..fbd70807dff039c05a6b73d115d2984f8bb13450 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.423 2003/06/29 00:33:43 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.424 2003/07/01 00:04:31 petere Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -4116,17 +4116,29 @@ PreparableStmt: /***************************************************************************** * - * QUERY: - * EXECUTE <plan_name> [(params, ...)] [INTO ...] + * EXECUTE <plan_name> [(params, ...)] + * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)] * *****************************************************************************/ -ExecuteStmt: EXECUTE name execute_param_clause into_clause +ExecuteStmt: EXECUTE name execute_param_clause { ExecuteStmt *n = makeNode(ExecuteStmt); n->name = $2; n->params = $3; + n->into = NULL; + $$ = (Node *) n; + } + | CREATE OptTemp TABLE qualified_name OptCreateAs AS EXECUTE name execute_param_clause + { + ExecuteStmt *n = makeNode(ExecuteStmt); + n->name = $8; + n->params = $9; + $4->istemp = $2; n->into = $4; + if ($5) + elog(ERROR, "column name list not allowed in CREATE TABLE / AS EXECUTE"); + /* ... because it's not implemented, but it could be */ $$ = (Node *) n; } ; diff --git a/src/test/regress/expected/prepare.out b/src/test/regress/expected/prepare.out index 629e444fb7b7fbce78823dc9ac5865dfb78744dd..04ab65b718ff982e9459ce3ff3543f9a0cb18e72 100644 --- a/src/test/regress/expected/prepare.out +++ b/src/test/regress/expected/prepare.out @@ -80,10 +80,10 @@ ERROR: Parameter $3 of type boolean cannot be coerced into the expected type do -- invalid type PREPARE q4(nonexistenttype) AS SELECT $1; ERROR: Type "nonexistenttype" does not exist --- execute into +-- create table as execute PREPARE q5(int, text) AS SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2; -EXECUTE q5(200, 'DTAAAA') INTO TEMPORARY q5_prep_results; +CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA'); SELECT * FROM q5_prep_results; unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 ---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- diff --git a/src/test/regress/sql/prepare.sql b/src/test/regress/sql/prepare.sql index ee8df42e0e1b74cbd71f895285e72715335afa98..fc6924307da9f79c9fe5b52e408ff37b02ec4609 100644 --- a/src/test/regress/sql/prepare.sql +++ b/src/test/regress/sql/prepare.sql @@ -38,8 +38,8 @@ EXECUTE q3(5::smallint, 10.5::float, false, 500::oid, 4::bigint, 'bytea'); -- invalid type PREPARE q4(nonexistenttype) AS SELECT $1; --- execute into +-- create table as execute PREPARE q5(int, text) AS SELECT * FROM tenk1 WHERE unique1 = $1 OR stringu1 = $2; -EXECUTE q5(200, 'DTAAAA') INTO TEMPORARY q5_prep_results; +CREATE TEMPORARY TABLE q5_prep_results AS EXECUTE q5(200, 'DTAAAA'); SELECT * FROM q5_prep_results;