Commit 30168be8 authored by Tom Lane's avatar Tom Lane

Remove plpgsql's special-case code paths for SET/RESET.

In the wake of 84f5c290, it's no longer necessary for plpgsql to
handle SET/RESET specially.  The point of that was just to avoid
taking a new transaction snapshot prematurely, which the regular code
path through _SPI_execute_plan() now does just fine (in fact better,
since it now does the right thing for LOCK too).  Hence, rip out a
few lines of code, going back to the old way of treating SET/RESET
as a generic SQL command.  This essentially reverts all but the
test cases from b981275b.

Discussion: https://postgr.es/m/15990-eee2ac466b11293d@postgresql.org
parent 9e215378
...@@ -497,7 +497,7 @@ END; ...@@ -497,7 +497,7 @@ END;
$$; $$;
ERROR: SET TRANSACTION ISOLATION LEVEL must be called before any query ERROR: SET TRANSACTION ISOLATION LEVEL must be called before any query
CONTEXT: SQL statement "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ" CONTEXT: SQL statement "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ"
PL/pgSQL function inline_code_block line 3 at SET PL/pgSQL function inline_code_block line 3 at SQL statement
DO LANGUAGE plpgsql $$ DO LANGUAGE plpgsql $$
BEGIN BEGIN
SAVEPOINT foo; SAVEPOINT foo;
......
...@@ -317,8 +317,6 @@ static int exec_stmt_commit(PLpgSQL_execstate *estate, ...@@ -317,8 +317,6 @@ static int exec_stmt_commit(PLpgSQL_execstate *estate,
PLpgSQL_stmt_commit *stmt); PLpgSQL_stmt_commit *stmt);
static int exec_stmt_rollback(PLpgSQL_execstate *estate, static int exec_stmt_rollback(PLpgSQL_execstate *estate,
PLpgSQL_stmt_rollback *stmt); PLpgSQL_stmt_rollback *stmt);
static int exec_stmt_set(PLpgSQL_execstate *estate,
PLpgSQL_stmt_set *stmt);
static void plpgsql_estate_setup(PLpgSQL_execstate *estate, static void plpgsql_estate_setup(PLpgSQL_execstate *estate,
PLpgSQL_function *func, PLpgSQL_function *func,
...@@ -2088,10 +2086,6 @@ exec_stmts(PLpgSQL_execstate *estate, List *stmts) ...@@ -2088,10 +2086,6 @@ exec_stmts(PLpgSQL_execstate *estate, List *stmts)
rc = exec_stmt_rollback(estate, (PLpgSQL_stmt_rollback *) stmt); rc = exec_stmt_rollback(estate, (PLpgSQL_stmt_rollback *) stmt);
break; break;
case PLPGSQL_STMT_SET:
rc = exec_stmt_set(estate, (PLpgSQL_stmt_set *) stmt);
break;
default: default:
/* point err_stmt to parent, since this one seems corrupt */ /* point err_stmt to parent, since this one seems corrupt */
estate->err_stmt = save_estmt; estate->err_stmt = save_estmt;
...@@ -4926,37 +4920,6 @@ exec_stmt_rollback(PLpgSQL_execstate *estate, PLpgSQL_stmt_rollback *stmt) ...@@ -4926,37 +4920,6 @@ exec_stmt_rollback(PLpgSQL_execstate *estate, PLpgSQL_stmt_rollback *stmt)
return PLPGSQL_RC_OK; return PLPGSQL_RC_OK;
} }
/*
* exec_stmt_set
*
* Execute SET/RESET statement.
*
* We just parse and execute the statement normally, but we have to do it
* without setting a snapshot, for things like SET TRANSACTION.
* XXX spi.c now handles this correctly, so we no longer need a special case.
*/
static int
exec_stmt_set(PLpgSQL_execstate *estate, PLpgSQL_stmt_set *stmt)
{
PLpgSQL_expr *expr = stmt->expr;
SPIExecuteOptions options;
int rc;
if (expr->plan == NULL)
exec_prepare_plan(estate, expr, 0);
memset(&options, 0, sizeof(options));
options.read_only = estate->readonly_func;
rc = SPI_execute_plan_extended(expr->plan, &options);
if (rc != SPI_OK_UTILITY)
elog(ERROR, "SPI_execute_plan_extended failed executing query \"%s\": %s",
expr->query, SPI_result_code_string(rc));
return PLPGSQL_RC_OK;
}
/* ---------- /* ----------
* exec_assign_expr Put an expression's result into a variable. * exec_assign_expr Put an expression's result into a variable.
* ---------- * ----------
......
...@@ -288,8 +288,6 @@ plpgsql_stmt_typename(PLpgSQL_stmt *stmt) ...@@ -288,8 +288,6 @@ plpgsql_stmt_typename(PLpgSQL_stmt *stmt)
return "COMMIT"; return "COMMIT";
case PLPGSQL_STMT_ROLLBACK: case PLPGSQL_STMT_ROLLBACK:
return "ROLLBACK"; return "ROLLBACK";
case PLPGSQL_STMT_SET:
return "SET";
} }
return "unknown"; return "unknown";
...@@ -370,7 +368,6 @@ static void free_perform(PLpgSQL_stmt_perform *stmt); ...@@ -370,7 +368,6 @@ static void free_perform(PLpgSQL_stmt_perform *stmt);
static void free_call(PLpgSQL_stmt_call *stmt); static void free_call(PLpgSQL_stmt_call *stmt);
static void free_commit(PLpgSQL_stmt_commit *stmt); static void free_commit(PLpgSQL_stmt_commit *stmt);
static void free_rollback(PLpgSQL_stmt_rollback *stmt); static void free_rollback(PLpgSQL_stmt_rollback *stmt);
static void free_set(PLpgSQL_stmt_set *stmt);
static void free_expr(PLpgSQL_expr *expr); static void free_expr(PLpgSQL_expr *expr);
...@@ -460,9 +457,6 @@ free_stmt(PLpgSQL_stmt *stmt) ...@@ -460,9 +457,6 @@ free_stmt(PLpgSQL_stmt *stmt)
case PLPGSQL_STMT_ROLLBACK: case PLPGSQL_STMT_ROLLBACK:
free_rollback((PLpgSQL_stmt_rollback *) stmt); free_rollback((PLpgSQL_stmt_rollback *) stmt);
break; break;
case PLPGSQL_STMT_SET:
free_set((PLpgSQL_stmt_set *) stmt);
break;
default: default:
elog(ERROR, "unrecognized cmd_type: %d", stmt->cmd_type); elog(ERROR, "unrecognized cmd_type: %d", stmt->cmd_type);
break; break;
...@@ -626,12 +620,6 @@ free_rollback(PLpgSQL_stmt_rollback *stmt) ...@@ -626,12 +620,6 @@ free_rollback(PLpgSQL_stmt_rollback *stmt)
{ {
} }
static void
free_set(PLpgSQL_stmt_set *stmt)
{
free_expr(stmt->expr);
}
static void static void
free_exit(PLpgSQL_stmt_exit *stmt) free_exit(PLpgSQL_stmt_exit *stmt)
{ {
...@@ -825,7 +813,6 @@ static void dump_perform(PLpgSQL_stmt_perform *stmt); ...@@ -825,7 +813,6 @@ static void dump_perform(PLpgSQL_stmt_perform *stmt);
static void dump_call(PLpgSQL_stmt_call *stmt); static void dump_call(PLpgSQL_stmt_call *stmt);
static void dump_commit(PLpgSQL_stmt_commit *stmt); static void dump_commit(PLpgSQL_stmt_commit *stmt);
static void dump_rollback(PLpgSQL_stmt_rollback *stmt); static void dump_rollback(PLpgSQL_stmt_rollback *stmt);
static void dump_set(PLpgSQL_stmt_set *stmt);
static void dump_expr(PLpgSQL_expr *expr); static void dump_expr(PLpgSQL_expr *expr);
...@@ -925,9 +912,6 @@ dump_stmt(PLpgSQL_stmt *stmt) ...@@ -925,9 +912,6 @@ dump_stmt(PLpgSQL_stmt *stmt)
case PLPGSQL_STMT_ROLLBACK: case PLPGSQL_STMT_ROLLBACK:
dump_rollback((PLpgSQL_stmt_rollback *) stmt); dump_rollback((PLpgSQL_stmt_rollback *) stmt);
break; break;
case PLPGSQL_STMT_SET:
dump_set((PLpgSQL_stmt_set *) stmt);
break;
default: default:
elog(ERROR, "unrecognized cmd_type: %d", stmt->cmd_type); elog(ERROR, "unrecognized cmd_type: %d", stmt->cmd_type);
break; break;
...@@ -1329,13 +1313,6 @@ dump_rollback(PLpgSQL_stmt_rollback *stmt) ...@@ -1329,13 +1313,6 @@ dump_rollback(PLpgSQL_stmt_rollback *stmt)
printf("ROLLBACK\n"); printf("ROLLBACK\n");
} }
static void
dump_set(PLpgSQL_stmt_set *stmt)
{
dump_ind();
printf("%s\n", stmt->expr->query);
}
static void static void
dump_exit(PLpgSQL_stmt_exit *stmt) dump_exit(PLpgSQL_stmt_exit *stmt)
{ {
......
...@@ -197,7 +197,7 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt); ...@@ -197,7 +197,7 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt);
%type <stmt> stmt_return stmt_raise stmt_assert stmt_execsql %type <stmt> stmt_return stmt_raise stmt_assert stmt_execsql
%type <stmt> stmt_dynexecute stmt_for stmt_perform stmt_call stmt_getdiag %type <stmt> stmt_dynexecute stmt_for stmt_perform stmt_call stmt_getdiag
%type <stmt> stmt_open stmt_fetch stmt_move stmt_close stmt_null %type <stmt> stmt_open stmt_fetch stmt_move stmt_close stmt_null
%type <stmt> stmt_commit stmt_rollback stmt_set %type <stmt> stmt_commit stmt_rollback
%type <stmt> stmt_case stmt_foreach_a %type <stmt> stmt_case stmt_foreach_a
%type <list> proc_exceptions %type <list> proc_exceptions
...@@ -328,7 +328,6 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt); ...@@ -328,7 +328,6 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt);
%token <keyword> K_QUERY %token <keyword> K_QUERY
%token <keyword> K_RAISE %token <keyword> K_RAISE
%token <keyword> K_RELATIVE %token <keyword> K_RELATIVE
%token <keyword> K_RESET
%token <keyword> K_RETURN %token <keyword> K_RETURN
%token <keyword> K_RETURNED_SQLSTATE %token <keyword> K_RETURNED_SQLSTATE
%token <keyword> K_REVERSE %token <keyword> K_REVERSE
...@@ -338,7 +337,6 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt); ...@@ -338,7 +337,6 @@ static void check_raise_parameters(PLpgSQL_stmt_raise *stmt);
%token <keyword> K_SCHEMA %token <keyword> K_SCHEMA
%token <keyword> K_SCHEMA_NAME %token <keyword> K_SCHEMA_NAME
%token <keyword> K_SCROLL %token <keyword> K_SCROLL
%token <keyword> K_SET
%token <keyword> K_SLICE %token <keyword> K_SLICE
%token <keyword> K_SQLSTATE %token <keyword> K_SQLSTATE
%token <keyword> K_STACKED %token <keyword> K_STACKED
...@@ -899,8 +897,6 @@ proc_stmt : pl_block ';' ...@@ -899,8 +897,6 @@ proc_stmt : pl_block ';'
{ $$ = $1; } { $$ = $1; }
| stmt_rollback | stmt_rollback
{ $$ = $1; } { $$ = $1; }
| stmt_set
{ $$ = $1; }
; ;
stmt_perform : K_PERFORM stmt_perform : K_PERFORM
...@@ -2273,34 +2269,6 @@ opt_transaction_chain: ...@@ -2273,34 +2269,6 @@ opt_transaction_chain:
| /* EMPTY */ { $$ = false; } | /* EMPTY */ { $$ = false; }
; ;
stmt_set : K_SET
{
PLpgSQL_stmt_set *new;
new = palloc0(sizeof(PLpgSQL_stmt_set));
new->cmd_type = PLPGSQL_STMT_SET;
new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
plpgsql_push_back_token(K_SET);
new->expr = read_sql_stmt();
$$ = (PLpgSQL_stmt *)new;
}
| K_RESET
{
PLpgSQL_stmt_set *new;
new = palloc0(sizeof(PLpgSQL_stmt_set));
new->cmd_type = PLPGSQL_STMT_SET;
new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
plpgsql_push_back_token(K_RESET);
new->expr = read_sql_stmt();
$$ = (PLpgSQL_stmt *)new;
}
;
cursor_variable : T_DATUM cursor_variable : T_DATUM
{ {
...@@ -2588,7 +2556,6 @@ unreserved_keyword : ...@@ -2588,7 +2556,6 @@ unreserved_keyword :
| K_QUERY | K_QUERY
| K_RAISE | K_RAISE
| K_RELATIVE | K_RELATIVE
| K_RESET
| K_RETURN | K_RETURN
| K_RETURNED_SQLSTATE | K_RETURNED_SQLSTATE
| K_REVERSE | K_REVERSE
...@@ -2598,7 +2565,6 @@ unreserved_keyword : ...@@ -2598,7 +2565,6 @@ unreserved_keyword :
| K_SCHEMA | K_SCHEMA
| K_SCHEMA_NAME | K_SCHEMA_NAME
| K_SCROLL | K_SCROLL
| K_SET
| K_SLICE | K_SLICE
| K_SQLSTATE | K_SQLSTATE
| K_STACKED | K_STACKED
......
...@@ -89,7 +89,6 @@ PG_KEYWORD("prior", K_PRIOR) ...@@ -89,7 +89,6 @@ PG_KEYWORD("prior", K_PRIOR)
PG_KEYWORD("query", K_QUERY) PG_KEYWORD("query", K_QUERY)
PG_KEYWORD("raise", K_RAISE) PG_KEYWORD("raise", K_RAISE)
PG_KEYWORD("relative", K_RELATIVE) PG_KEYWORD("relative", K_RELATIVE)
PG_KEYWORD("reset", K_RESET)
PG_KEYWORD("return", K_RETURN) PG_KEYWORD("return", K_RETURN)
PG_KEYWORD("returned_sqlstate", K_RETURNED_SQLSTATE) PG_KEYWORD("returned_sqlstate", K_RETURNED_SQLSTATE)
PG_KEYWORD("reverse", K_REVERSE) PG_KEYWORD("reverse", K_REVERSE)
...@@ -99,7 +98,6 @@ PG_KEYWORD("rowtype", K_ROWTYPE) ...@@ -99,7 +98,6 @@ PG_KEYWORD("rowtype", K_ROWTYPE)
PG_KEYWORD("schema", K_SCHEMA) PG_KEYWORD("schema", K_SCHEMA)
PG_KEYWORD("schema_name", K_SCHEMA_NAME) PG_KEYWORD("schema_name", K_SCHEMA_NAME)
PG_KEYWORD("scroll", K_SCROLL) PG_KEYWORD("scroll", K_SCROLL)
PG_KEYWORD("set", K_SET)
PG_KEYWORD("slice", K_SLICE) PG_KEYWORD("slice", K_SLICE)
PG_KEYWORD("sqlstate", K_SQLSTATE) PG_KEYWORD("sqlstate", K_SQLSTATE)
PG_KEYWORD("stacked", K_STACKED) PG_KEYWORD("stacked", K_STACKED)
......
...@@ -127,8 +127,7 @@ typedef enum PLpgSQL_stmt_type ...@@ -127,8 +127,7 @@ typedef enum PLpgSQL_stmt_type
PLPGSQL_STMT_PERFORM, PLPGSQL_STMT_PERFORM,
PLPGSQL_STMT_CALL, PLPGSQL_STMT_CALL,
PLPGSQL_STMT_COMMIT, PLPGSQL_STMT_COMMIT,
PLPGSQL_STMT_ROLLBACK, PLPGSQL_STMT_ROLLBACK
PLPGSQL_STMT_SET
} PLpgSQL_stmt_type; } PLpgSQL_stmt_type;
/* /*
...@@ -566,17 +565,6 @@ typedef struct PLpgSQL_stmt_rollback ...@@ -566,17 +565,6 @@ typedef struct PLpgSQL_stmt_rollback
bool chain; bool chain;
} PLpgSQL_stmt_rollback; } PLpgSQL_stmt_rollback;
/*
* SET statement
*/
typedef struct PLpgSQL_stmt_set
{
PLpgSQL_stmt_type cmd_type;
int lineno;
unsigned int stmtid;
PLpgSQL_expr *expr;
} PLpgSQL_stmt_set;
/* /*
* GET DIAGNOSTICS item * GET DIAGNOSTICS item
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment