git.postgresql.org Git - postgresql.git/commitdiff

git projects / postgresql.git / commitdiff
? search:
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: f6d6d29)
Throw suitable error for COPY TO STDOUT/FROM STDIN in a SQL function.
2017年1月14日 18:27:47 +0000 (13:27 -0500)
2017年1月14日 18:27:47 +0000 (13:27 -0500)
A client copy can't work inside a function because the FE/BE wire protocol
doesn't support nesting of a COPY operation within query results. (Maybe
it could, but the protocol spec doesn't suggest that clients should support
this, and libpq for one certainly doesn't.)

In most PLs, this prohibition is enforced by spi.c, but SQL functions don't
use SPI. A comparison of _SPI_execute_plan() and init_execution_state()
shows that rejecting client COPY is the only discrepancy in what they
allow, so there's no other similar bugs.

This is an astonishingly ancient oversight, so back-patch to all supported
branches.

Report: https://postgr.es/m/BY2PR05MB2309EABA3DEFA0143F50F0D593780@BY2PR05MB2309.namprd05.prod.outlook.com


diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index 0a1bb9d52eeaa42f62f75ab3237ea7932cc5c84e..039defa7b85f681f5398838b7946fd9941ce9402 100644 (file)
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -500,7 +500,16 @@ init_execution_state(List *queryTree_list,
fcache->readonly_func ? CURSOR_OPT_PARALLEL_OK : 0,
NULL);
- /* Precheck all commands for validity in a function */
+ /*
+ * Precheck all commands for validity in a function. This should
+ * generally match the restrictions spi.c applies.
+ */
+ if (IsA(stmt, CopyStmt) &&
+ ((CopyStmt *) stmt)->filename == NULL)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("cannot COPY to/from client in a SQL function")));
+
if (IsA(stmt, TransactionStmt))
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
This is the main PostgreSQL git repository.
RSS Atom

AltStyle によって変換されたページ (->オリジナル) /