Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

executor: fix compatibility issue of release savepoint #35064

Merged
merged 2 commits into from
Jun 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 20 additions & 7 deletions executor/executor_txn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,13 +308,13 @@ func TestTxnSavepoint0(t *testing.T) {
{"savepoint s1", []string{"s1"}, ""},
{"savepoint s2", []string{"s1", "s2"}, ""},
{"savepoint s3", []string{"s1", "s2", "s3"}, ""},
{"release savepoint s2", []string{"s1", "s3"}, ""},
{"rollback to S2", []string{"s1", "s3"}, "[executor:1305]SAVEPOINT S2 does not exist"},
{"release savepoint s3", []string{"s1"}, ""},
{"release savepoint s2", []string{"s1"}, ""},
{"rollback to S2", []string{"s1"}, "[executor:1305]SAVEPOINT S2 does not exist"},
{"release savepoint s3", []string{"s1"}, "[executor:1305]SAVEPOINT s3 does not exist"},
{"savepoint s2", []string{"s1", "s2"}, ""},
{"release savepoint s1", []string{"s2"}, ""},
{"release savepoint s1", []string{"s2"}, "[executor:1305]SAVEPOINT s1 does not exist"},
{"release savepoint S2", nil, ""},
{"release savepoint s1", nil, ""},
{"release savepoint s1", nil, "[executor:1305]SAVEPOINT s1 does not exist"},
{"release savepoint S2", nil, "[executor:1305]SAVEPOINT S2 does not exist"},
{"commit", nil, ""},
}

Expand Down Expand Up @@ -366,7 +366,7 @@ func TestTxnSavepoint1(t *testing.T) {
{sql: "savepoint s4"},
{sql: "release savepoint s1"},
{sql: "rollback to s1", err: "[executor:1305]SAVEPOINT s1 does not exist"},
{sql: "rollback to s2"},
{sql: "rollback to s2", err: "[executor:1305]SAVEPOINT s2 does not exist"},
{sql: "rollback to s3", err: "[executor:1305]SAVEPOINT s3 does not exist"},
{sql: "rollback to savepoint s4", err: "[executor:1305]SAVEPOINT s4 does not exist"},
{sql: "rollback"},
Expand Down Expand Up @@ -435,6 +435,19 @@ func TestTxnSavepoint1(t *testing.T) {
{sql: "commit"},
{sql: "select * from t order by id", result: []string{"1 1", "2 2"}},
{sql: "delete from t"},

// Test for release savepoint
{sql: "begin;"},
{sql: "insert into t values (1, 1)"},
{sql: "savepoint s1"},
{sql: "insert into t values (2, 2)"},
{sql: "savepoint s2"},
{sql: "select * from t order by id", result: []string{"1 1", "2 2"}},
{sql: "release savepoint s1;"},
{sql: "select * from t order by id", result: []string{"1 1", "2 2"}},
{sql: "rollback to s2", err: "[executor:1305]SAVEPOINT s2 does not exist"},
{sql: "select * from t order by id", result: []string{"1 1", "2 2"}},
{sql: "rollback"},
}
txnModes := []string{"optimistic", "pessimistic", ""}
for _, txnMode := range txnModes {
Expand Down
2 changes: 1 addition & 1 deletion executor/simple.go
Original file line number Diff line number Diff line change
Expand Up @@ -626,7 +626,7 @@ func (e *SimpleExec) executeSavepoint(s *ast.SavepointStmt) error {
}

func (e *SimpleExec) executeReleaseSavepoint(s *ast.ReleaseSavepointStmt) error {
deleted := e.ctx.GetSessionVars().TxnCtx.DeleteSavepoint(s.Name)
deleted := e.ctx.GetSessionVars().TxnCtx.ReleaseSavepoint(s.Name)
if !deleted {
return errSavepointNotExists.GenWithStackByArgs("SAVEPOINT", s.Name)
}
Expand Down
12 changes: 12 additions & 0 deletions sessionctx/variable/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,18 @@ func (tc *TransactionContext) DeleteSavepoint(name string) bool {
return false
}

// ReleaseSavepoint deletes the named savepoint and the later savepoints, return false indicate the named savepoint doesn't exists.
func (tc *TransactionContext) ReleaseSavepoint(name string) bool {
name = strings.ToLower(name)
for i, sp := range tc.Savepoints {
if sp.Name == name {
tc.Savepoints = append(tc.Savepoints[:i])
return true
}
}
return false
}

// RollbackToSavepoint rollbacks to the specified savepoint by name.
func (tc *TransactionContext) RollbackToSavepoint(name string) *SavepointRecord {
name = strings.ToLower(name)
Expand Down