[tarantool-patches] [PATCH 4/4] sql: fix SAVEPOINT RELEASE statement

Nikita Pettik korablev at tarantool.org
Thu May 3 21:49:25 MSK 2018


Before this patch SAVEPOINT RELEASE statement always raised error,
due to SQLite's obsolete code. Now it has been removed, and
SAVEPOINT RELEASE works as desired.

Closes #3379
---
 src/box/sql/vdbe.c                           |  7 -----
 test/sql/gh-3379-release-savepoints.result   | 40 ++++++++++++++++++++++++++++
 test/sql/gh-3379-release-savepoints.test.lua | 26 ++++++++++++++++++
 3 files changed, 66 insertions(+), 7 deletions(-)
 create mode 100644 test/sql/gh-3379-release-savepoints.result
 create mode 100644 test/sql/gh-3379-release-savepoints.test.lua

diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c
index 6ea04901c..62f393de4 100644
--- a/src/box/sql/vdbe.c
+++ b/src/box/sql/vdbe.c
@@ -2901,13 +2901,6 @@ case OP_Savepoint: {
 		if (!pSavepoint) {
 			sqlite3VdbeError(p, "no such savepoint: %s", zName);
 			rc = SQLITE_ERROR;
-		} else if (p1==SAVEPOINT_RELEASE) {
-			/* It is not possible to release (commit) a savepoint if there are
-			 * active write statements.
-			 */
-			sqlite3VdbeError(p, "cannot release savepoint - "
-					 "SQL statements in progress");
-			rc = SQLITE_BUSY;
 		} else {
 
 			/* Determine whether or not this is a transaction savepoint. If so,
diff --git a/test/sql/gh-3379-release-savepoints.result b/test/sql/gh-3379-release-savepoints.result
new file mode 100644
index 000000000..5f5804b66
--- /dev/null
+++ b/test/sql/gh-3379-release-savepoints.result
@@ -0,0 +1,40 @@
+test_run = require('test_run').new()
+---
+...
+test_run:cmd("setopt delimiter ';'") 
+---
+- true
+...
+-- These tests check that release of SQL savepoints works as desired. 
+--
+-- box.cfg()
+release_sv = function()
+    box.begin()
+    box.sql.execute('SAVEPOINT t1;')
+    box.sql.execute('RELEASE SAVEPOINT t1;')
+end;
+---
+...
+release_sv();
+---
+...
+box.commit();
+---
+...
+release_sv_fail = function()
+    box.begin()
+    box.sql.execute('SAVEPOINT t1;')
+    box.sql.execute('SAVEPOINT t2;')
+    box.sql.execute('RELEASE SAVEPOINT t2;')
+    box.sql.execute('RELEASE SAVEPOINT t1;')
+    box.sql.execute('ROLLBACK TO t1;')
+end;
+---
+...
+release_sv_fail();
+---
+- error: 'no such savepoint: T1'
+...
+box.commit();
+---
+...
diff --git a/test/sql/gh-3379-release-savepoints.test.lua b/test/sql/gh-3379-release-savepoints.test.lua
new file mode 100644
index 000000000..6b299045d
--- /dev/null
+++ b/test/sql/gh-3379-release-savepoints.test.lua
@@ -0,0 +1,26 @@
+test_run = require('test_run').new()
+test_run:cmd("setopt delimiter ';'") 
+
+-- These tests check that release of SQL savepoints works as desired. 
+--
+
+-- box.cfg()
+
+release_sv = function()
+    box.begin()
+    box.sql.execute('SAVEPOINT t1;')
+    box.sql.execute('RELEASE SAVEPOINT t1;')
+end;
+release_sv();
+box.commit();
+
+release_sv_fail = function()
+    box.begin()
+    box.sql.execute('SAVEPOINT t1;')
+    box.sql.execute('SAVEPOINT t2;')
+    box.sql.execute('RELEASE SAVEPOINT t2;')
+    box.sql.execute('RELEASE SAVEPOINT t1;')
+    box.sql.execute('ROLLBACK TO t1;')
+end;
+release_sv_fail();
+box.commit();
-- 
2.15.1





More information about the Tarantool-patches mailing list