+ endterm="sql-select-title">, and
+ endterm="sql-execute-title"> for a summary of possible output
+ messages.
+
-EXECUTE plan_name [ (parameter [, ...] ) ] [ INTO [ TEMPORARY | TEMP ] table ]
+EXECUTE plan_name [ (parameter [, ...] ) ]
name of a prepared statement must be unique within a database session.
- Like SELECT INTO, EXECUTE can
- store the results of executing a query into a newly-created
- table, by specifying an INTO> clause. For more information on this behavior,
- see .
-
-
For more information on the creation and usage of prepared statements,
see .
-
-
- table
-
- The name of the table in which to store the results of executing
- the statement (if it is a SELECT). If no
- table is specified, the results are returned to the client (as
- normal).
-
-
-
* 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 $
*
*-------------------------------------------------------------------------
*/
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)
{
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);
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);
*
*
* 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
/*****************************************************************************
*
- * QUERY:
- *
EXECUTE [(params, ...)] [INTO ...]
+ *
EXECUTE [(params, ...)]
+ *
CREATE TABLE AS EXECUTE [(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;
}
;
-- 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
---------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+---------
-- 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;