Reword SPI_ERROR_TRANSACTION errors in PL/pgSQL
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 26 Jun 2018 09:38:46 +0000 (11:38 +0200)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 26 Jun 2018 09:38:46 +0000 (11:38 +0200)
The previous message for SPI_ERROR_TRANSACTION claimed "cannot begin/end
transactions in PL/pgSQL", but that is no longer true.  Nevertheless,
the error can still happen, so reword the messages.  The error cases in
exec_prepare_plan() could never happen, so remove them.

src/pl/plpgsql/src/expected/plpgsql_transaction.out
src/pl/plpgsql/src/pl_exec.c
src/pl/plpgsql/src/sql/plpgsql_transaction.sql

index 2d0e3fa85ede2e6deb983d33c68cdf39eb03db11..7f008ac57e92f4da66d36ac0957bb1f4b413676d 100644 (file)
@@ -409,7 +409,7 @@ $$;
 INFO:  read committed
 INFO:  repeatable read
 INFO:  read committed
--- error case
+-- error cases
 DO LANGUAGE plpgsql $$
 BEGIN
     SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
@@ -418,6 +418,20 @@ $$;
 ERROR:  SET TRANSACTION ISOLATION LEVEL must be called before any query
 CONTEXT:  SQL statement "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ"
 PL/pgSQL function inline_code_block line 3 at SET
+DO LANGUAGE plpgsql $$
+BEGIN
+    SAVEPOINT foo;
+END;
+$$;
+ERROR:  unsupported transaction command in PL/pgSQL
+CONTEXT:  PL/pgSQL function inline_code_block line 3 at SQL statement
+DO LANGUAGE plpgsql $$
+BEGIN
+    EXECUTE 'COMMIT';
+END;
+$$;
+ERROR:  EXECUTE of transaction commands is not implemented
+CONTEXT:  PL/pgSQL function inline_code_block line 3 at EXECUTE
 DROP TABLE test1;
 DROP TABLE test2;
 DROP TABLE test3;
index ef013bcdc7ffb6e36abee90271af041660d312a5..66ecf5eb559da27daef2de57a45bec75955aa1cf 100644 (file)
@@ -3965,27 +3965,8 @@ exec_prepare_plan(PLpgSQL_execstate *estate,
                              (void *) expr,
                              cursorOptions);
    if (plan == NULL)
-   {
-       /* Some SPI errors deserve specific error messages */
-       switch (SPI_result)
-       {
-           case SPI_ERROR_COPY:
-               ereport(ERROR,
-                       (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-                        errmsg("cannot COPY to/from client in PL/pgSQL")));
-               break;
-           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;
-           default:
-               elog(ERROR, "SPI_prepare_params failed for \"%s\": %s",
-                    expr->query, SPI_result_code_string(SPI_result));
-               break;
-       }
-   }
+       elog(ERROR, "SPI_prepare_params failed for \"%s\": %s",
+            expr->query, SPI_result_code_string(SPI_result));
    if (keepplan)
        SPI_keepplan(plan);
    expr->plan = plan;
@@ -4129,8 +4110,7 @@ exec_stmt_execsql(PLpgSQL_execstate *estate,
        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.")));
+                    errmsg("unsupported transaction command in PL/pgSQL")));
            break;
 
        default:
@@ -4317,8 +4297,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate *estate,
        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.")));
+                    errmsg("EXECUTE of transaction commands is not implemented")));
            break;
 
        default:
index 373d89864a233e207863a14181362f2a8c784e9c..eddc518bb6aaa21083b183644f3a8ea3cf30b9bd 100644 (file)
@@ -335,13 +335,25 @@ BEGIN
 END;
 $$;
 
--- error case
+-- error cases
 DO LANGUAGE plpgsql $$
 BEGIN
     SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
 END;
 $$;
 
+DO LANGUAGE plpgsql $$
+BEGIN
+    SAVEPOINT foo;
+END;
+$$;
+
+DO LANGUAGE plpgsql $$
+BEGIN
+    EXECUTE 'COMMIT';
+END;
+$$;
+
 DROP TABLE test1;
 DROP TABLE test2;
 DROP TABLE test3;