diff --git a/src/box/execute.c b/src/box/execute.c
index f88572d220c9eabb8a61ef728a7f27677c0775bb..5dc40f6abc57d93eb521786323c96d9b12f4242a 100644
--- a/src/box/execute.c
+++ b/src/box/execute.c
@@ -284,7 +284,8 @@ xrow_decode_sql(const struct xrow_header *row, struct sql_request *request,
 			if (sql_bind_list_decode(request, value, region) != 0)
 				return -1;
 		} else {
-			request->sql_text = value;
+			request->sql_text =
+				mp_decode_str(&value, &request->sql_text_len);
 		}
 	}
 	if (request->sql_text == NULL) {
@@ -594,8 +595,7 @@ sql_prepare_and_execute(const struct sql_request *request,
 			struct sql_response *response, struct region *region)
 {
 	const char *sql = request->sql_text;
-	uint32_t len;
-	sql = mp_decode_str(&sql, &len);
+	uint32_t len = request->sql_text_len;
 	struct sqlite3_stmt *stmt;
 	sqlite3 *db = sql_get();
 	if (db == NULL) {
diff --git a/src/box/execute.h b/src/box/execute.h
index 77bfd7913d1639136ce51631ea7177540374084a..79cee69b277b24518f7c659fa9bea6383a7233f4 100644
--- a/src/box/execute.h
+++ b/src/box/execute.h
@@ -58,6 +58,8 @@ struct sql_request {
 	uint64_t sync;
 	/** SQL statement text. */
 	const char *sql_text;
+	/** Length of the SQL statement text. */
+	uint32_t sql_text_len;
 	/** Array of parameters. */
 	struct sql_bind *bind;
 	/** Length of the @bind. */