8000 Throw suitable error for COPY TO STDOUT/FROM STDIN in a SQL function. · hackingwu/postgres@c377557 · GitHub
[go: up one dir, main page]

Skip to content

Commit c377557

Browse files
committed
Throw suitable error for COPY TO STDOUT/FROM STDIN in a SQL function.
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
1 parent 2c72d9c commit c377557

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

src/backend/executor/functions.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,16 @@ init_execution_state(List *queryTree_list,
498498
else
499499
stmt = (Node *) pg_plan_query(queryTree, 0, NULL);
500500

501-
/* Precheck all commands for validity in a function */
501+
/*
502+
* Precheck all commands for validity in a function. This should
503+
* generally match the restrictions spi.c applies.
504+
*/
505+
if (IsA(stmt, CopyStmt) &&
506+
((CopyStmt *) stmt)->filename == NULL)
507+
ereport(ERROR,
508+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
509+
errmsg("cannot COPY to/from client in a SQL function")));
510+
502511
if (IsA(stmt, TransactionStmt))
503512
ereport(ERROR,
504513
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),

0 commit comments

Comments
 (0)
0