From a396931bbe6c1d67968dae34c1854c8d17fe8c71 Mon Sep 17 00:00:00 2001
From: Denis Smirnov <sd@picodata.io>
Date: Fri, 30 Aug 2024 18:02:52 +0700
Subject: [PATCH] fix: check sql statement is not busy on unprepare

NO_DOC=internal
NO_TEST=internal
NO_CHANGELOG=internal
---
 src/box/errcode.h     | 2 +-
 src/box/execute.c     | 9 +++++++++
 test/box/error.result | 1 +
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/box/errcode.h b/src/box/errcode.h
index 1044dad736..a3a8bcddf6 100644
--- a/src/box/errcode.h
+++ b/src/box/errcode.h
@@ -323,7 +323,7 @@ struct errcode_record {
 	/*268 */_(ER_ILLEGAL_OPTIONS,		"Illegal options: %s")   \
 	/*269 */_(ER_ILLEGAL_OPTIONS_FORMAT,    "Each option in third argument must be a table containing only one key value pair")   \
 	/*270 */_(ER_CANT_GENERATE,		"Can't generate %s") \
-	/*271 */_(ER_UNUSED5,			"") \
+	/*271 */_(ER_SQL_STATEMENT_BUSY,	"SQL statement %d is busy") \
 	/*272 */_(ER_SCHEMA_UPGRADE_IN_PROGRESS, "Schema upgrade is already in progress") \
 	/*273 */_(ER_UNUSED7,			"") \
 	/*274 */_(ER_UNCONFIGURED,		"Please call box.cfg{} first") \
diff --git a/src/box/execute.c b/src/box/execute.c
index 7da79e6025..0bb678820d 100644
--- a/src/box/execute.c
+++ b/src/box/execute.c
@@ -195,6 +195,15 @@ sql_unprepare_ext(uint32_t stmt_id, uint64_t session_id)
 		diag_set(ClientError, ER_WRONG_QUERY_ID, stmt_id);
 		return -1;
 	}
+	struct sql_stmt *stmt = sql_stmt_cache_find(stmt_id);
+	if (stmt == NULL) {
+		diag_set(ClientError, ER_WRONG_QUERY_ID, stmt_id);
+		return -1;
+	}
+	if (sql_stmt_busy(stmt)) {
+		diag_set(ClientError, ER_SQL_STATEMENT_BUSY, stmt_id);
+		return -1;
+	}
 	session_remove_stmt_id(session, stmt_id);
 	sql_stmt_unref(stmt_id);
 	return 0;
diff --git a/test/box/error.result b/test/box/error.result
index da623923a2..b412d3caad 100644
--- a/test/box/error.result
+++ b/test/box/error.result
@@ -489,6 +489,7 @@ t;
  |   268: box.error.ILLEGAL_OPTIONS
  |   269: box.error.ILLEGAL_OPTIONS_FORMAT
  |   270: box.error.CANT_GENERATE
+ |   271: box.error.SQL_STATEMENT_BUSY
  |   272: box.error.SCHEMA_UPGRADE_IN_PROGRESS
  |   274: box.error.UNCONFIGURED
  |   278: box.error.IN_ANOTHER_PROMOTE
-- 
GitLab