Re: We still claim "cannot begin/end transactions in PL/pgSQL"
От | Peter Eisentraut |
---|---|
Тема | Re: We still claim "cannot begin/end transactions in PL/pgSQL" |
Дата | |
Msg-id | b964bd07-65e2-5949-70dc-974332ad24fd@2ndquadrant.com обсуждение исходный текст |
Ответ на | We still claim "cannot begin/end transactions in PL/pgSQL" (Tom Lane <tgl@sss.pgh.pa.us>) |
Ответы |
Re: We still claim "cannot begin/end transactions in PL/pgSQL"
|
Список | pgsql-hackers |
On 5/25/18 12:16, Tom Lane wrote: > I notice there are still several places in pl_exec.c like this: > > case SPI_ERROR_TRANSACTION: > ereport(ERROR, > (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), > errmsg("cannot begin/end transactions in PL/pgSQL"), > errhint("Use a BEGIN block with an EXCEPTION clause instead."))); > break; > > At best, the wording of these error messages is now obsolete. I'm not > sure if we expect them to be reachable at all. If they should be > can't-happen cases, I'd suggest just deleting them and letting control > fall to the generic default: cases in each switch. If they are reachable, > the messages need work. There are three occurrences: The occurrence in exec_prepare_plan() could never be reached AFAICT, because SPI_prepare_params() does not produce those SPI_prepare_params() error values in the first place. So remove them altogether. The occurrence in exec_stmt_execsql() can be reached by running for example SAVEPOINT, or any other TransactionStmt other than COMMIT and ROLLBACK, which are intercepted by PL/pgSQL. So we still need an error message there. Unfortunately, we don't know which TransactionStmt caused the error, so the error has to be pretty generic. The occurrence in exec_stmt_dynexecute() can be reached using something like EXECUTE 'COMMIT', which is not supported/not implemented. Hence a tweaked error message there as well. Possible patch attached. -- Peter Eisentraut http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Вложения
В списке pgsql-hackers по дате отправления: