postgres.git / summary / log / commit / refs

commit    5e1e2e75d25b7fd7152fa2b41998efd2dac9c275
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sat Jan 14 18:27:47 2017 +0000

    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


src/backend/executor/functions.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index a14053e8425..a3642e28dd5 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -497,7 +497,16 @@ init_execution_state(List *queryTree_list, else stmt = (Node *) pg_plan_query(queryTree, 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), [parent: c59a1a890356]