diff --git a/src/box/errcode.h b/src/box/errcode.h
index f2f47c027b9a7e5201a521c049bb5a52d638fe14..d234d26c856bfb447bc5d7f7ef94573d05b720cb 100644
--- a/src/box/errcode.h
+++ b/src/box/errcode.h
@@ -238,6 +238,7 @@ struct errcode_record {
 	/*183 */_(ER_SQL_KEYWORD_IS_RESERVED,	"Keyword '%.*s' is reserved. Please use double quotes if '%.*s' is an identifier.") \
 	/*184 */_(ER_SQL_UNRECOGNIZED_SYNTAX,	"Syntax error near '%.*s'") \
 	/*185 */_(ER_SQL_UNKNOWN_TOKEN,		"Syntax error: unrecognized token: '%.*s'") \
+	/*186 */_(ER_SQL_PARSER_GENERIC,	"%s") \
 
 /*
  * !IMPORTANT! Please follow instructions at start of the file
diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index f112c9ff1e50ba1d7d140c1ab464f6b0e8bfe466..deb5b894cf6233cdd978c4c79c98f92fa807f6bf 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -194,7 +194,8 @@ sql_finish_coding(struct Parse *parse_context)
 		sqlVdbeMakeReady(v, parse_context);
 		parse_context->rc = SQL_DONE;
 	} else {
-		parse_context->rc = SQL_ERROR;
+		if (parse_context->rc != SQL_TARANTOOL_ERROR)
+			parse_context->rc = SQL_ERROR;
 	}
 }
 /**
diff --git a/src/box/sql/malloc.c b/src/box/sql/malloc.c
index e0d2ec886f822a0fd5f39c32eb9ce7a7fdfb1a53..dc018fc6349d0ad509ae1ff8fc794b6440a77f00 100644
--- a/src/box/sql/malloc.c
+++ b/src/box/sql/malloc.c
@@ -51,14 +51,13 @@ sql_sized_malloc(int nByte)
 	assert(nByte > 0);
 	nByte = ROUND8(nByte);
 	p = malloc(nByte + 8);
-	if (p) {
-		p[0] = nByte;
-		p++;
-	} else {
-		testcase(sqlGlobalConfig.xLog != 0);
-		sql_log(SQL_NOMEM,
-			    "failed to allocate %u bytes of memory", nByte);
+	if (p == NULL) {
+		sql_get()->mallocFailed = 1;
+		diag_set(OutOfMemory, nByte, "malloc", "p");
+		return NULL;
 	}
+	p[0] = nByte;
+	p++;
 	return (void *)p;
 }
 
@@ -111,15 +110,13 @@ sql_sized_realloc(void *pPrior, int nByte)
 	assert(nByte == ROUND8(nByte));	/* EV: R-46199-30249 */
 	p--;
 	p = realloc(p, nByte + 8);
-	if (p) {
-		p[0] = nByte;
-		p++;
-	} else {
-		testcase(sqlGlobalConfig.xLog != 0);
-		sql_log(SQL_NOMEM,
-			    "failed memory resize %u to %u bytes",
-			    sql_sized_sizeof(pPrior), nByte);
+	if (p == NULL) {
+		sql_get()->mallocFailed = 1;
+		diag_set(OutOfMemory, nByte, "realloc", "p");
+		return NULL;
 	}
+	p[0] = nByte;
+	p++;
 	return (void *)p;
 }
 
diff --git a/src/box/sql/prepare.c b/src/box/sql/prepare.c
index 0c6296d4f6042be4ff2002fdc2aae6ece314f0d5..828a1aee8c3331c6e9c337b9bca70c8dc26b0d7e 100644
--- a/src/box/sql/prepare.c
+++ b/src/box/sql/prepare.c
@@ -102,9 +102,8 @@ sqlPrepare(sql * db,	/* Database handle. */
 
 	if (sParse.rc == SQL_DONE)
 		sParse.rc = SQL_OK;
-	if (db->mallocFailed) {
-		sParse.rc = SQL_NOMEM;
-	}
+	if (db->mallocFailed)
+		sParse.rc = SQL_TARANTOOL_ERROR;
 	if (pzTail) {
 		*pzTail = sParse.zTail;
 	}
diff --git a/src/box/sql/tokenize.c b/src/box/sql/tokenize.c
index 58685c4b8c8eeb7b1c623c090b50363e1b7804bf..f0a2f166f076eedb4b787f9d1838851f38fcd42a 100644
--- a/src/box/sql/tokenize.c
+++ b/src/box/sql/tokenize.c
@@ -483,7 +483,9 @@ sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg)
 				      &pParse->sLastToken.isReserved);
 			i += pParse->sLastToken.n;
 			if (i > mxSqlLen) {
-				pParse->rc = SQL_TOOBIG;
+				diag_set(ClientError, ER_SQL_PARSER_GENERIC,
+					 "string or blob too big");
+				pParse->rc = SQL_TARANTOOL_ERROR;
 				break;
 			}
 		} else {
@@ -501,10 +503,6 @@ sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg)
 		if (tokenType >= TK_SPACE) {
 			assert(tokenType == TK_SPACE
 			       || tokenType == TK_ILLEGAL);
-			if (db->u1.isInterrupted) {
-				pParse->rc = SQL_INTERRUPT;
-				break;
-			}
 			if (tokenType == TK_ILLEGAL) {
 				diag_set(ClientError, ER_SQL_UNKNOWN_TOKEN,
 					 pParse->sLastToken.n,
@@ -529,7 +527,7 @@ sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg)
 #endif				/* YYDEBUG */
 	sqlParserFree(pEngine, sql_free);
 	if (db->mallocFailed) {
-		pParse->rc = SQL_NOMEM;
+		pParse->rc = SQL_TARANTOOL_ERROR;
 	}
 	if (pParse->rc != SQL_OK && pParse->rc != SQL_DONE
 	    && pParse->zErrMsg == 0) {
diff --git a/src/box/sql/util.c b/src/box/sql/util.c
index c89e2e8abcb81bfdc68382b541bead20ee9fb93f..a6d1f5cea9b959c0be7ee182ebd0a21b8fcf979a 100644
--- a/src/box/sql/util.c
+++ b/src/box/sql/util.c
@@ -211,7 +211,8 @@ sqlErrorWithMsg(sql * db, int err_code, const char *zFormat, ...)
 }
 
 /*
- * Add an error message to pParse->zErrMsg and increment pParse->nErr.
+ * Add an error to the diagnostics area, increment pParse->nErr
+ * and set pParse->rc.
  * The following formatting characters are allowed:
  *
  *      %s      Insert a string
@@ -236,10 +237,10 @@ sqlErrorMsg(Parse * pParse, const char *zFormat, ...)
 	va_start(ap, zFormat);
 	zMsg = sqlVMPrintf(db, zFormat, ap);
 	va_end(ap);
+	diag_set(ClientError, ER_SQL_PARSER_GENERIC, zMsg);
+	sqlDbFree(db, zMsg);
 	pParse->nErr++;
-	sqlDbFree(db, pParse->zErrMsg);
-	pParse->zErrMsg = zMsg;
-	pParse->rc = SQL_ERROR;
+	pParse->rc = SQL_TARANTOOL_ERROR;
 }
 
 void
diff --git a/test/box/misc.result b/test/box/misc.result
index 27579c6a57de141b3f161f4fcd46b164f5e236db..9f0b2c73ac7db6fd61ba910419c31e5882ae8205 100644
--- a/test/box/misc.result
+++ b/test/box/misc.result
@@ -514,6 +514,7 @@ t;
   182: box.error.SQL_STATEMENT_EMPTY
   184: box.error.SQL_UNRECOGNIZED_SYNTAX
   185: box.error.SQL_UNKNOWN_TOKEN
+  186: box.error.SQL_PARSER_GENERIC
 ...
 test_run:cmd("setopt delimiter ''");
 ---
diff --git a/test/sql-tap/check.test.lua b/test/sql-tap/check.test.lua
index b6b7fc7af6a4028dff6138ea3b04371472be8140..bab64937f26fc3aca5540a2d0a94da3e8a67f873 100755
--- a/test/sql-tap/check.test.lua
+++ b/test/sql-tap/check.test.lua
@@ -319,7 +319,7 @@ test:do_catchsql_test(
         );
     ]], {
         -- <check-3.1>
-        1, "Failed to create space 'T3': SQL error: subqueries prohibited in CHECK constraints"
+        1, "Failed to create space 'T3': subqueries prohibited in CHECK constraints"
         -- </check-3.1>
     })
 
diff --git a/test/sql/triggers.result b/test/sql/triggers.result
index 2f5b148033962d9e481832b2e53c4d76dd164641..826e998e157857498b07f8a463bd0d745bdb22a4 100644
--- a/test/sql/triggers.result
+++ b/test/sql/triggers.result
@@ -398,14 +398,14 @@ space_id = box.space.T1.id
 ...
 box.sql.execute("CREATE TRIGGER tr1 AFTER INSERT ON t1 WHEN new.a = ? BEGIN SELECT 1; END;")
 ---
-- error: 'SQL error: bindings are not allowed in DDL'
+- error: bindings are not allowed in DDL
 ...
 tuple = {"TR1", space_id, {sql = [[CREATE TRIGGER tr1 AFTER INSERT ON t1 WHEN new.a = ? BEGIN SELECT 1; END;]]}}
 ---
 ...
 box.space._trigger:insert(tuple)
 ---
-- error: 'SQL error: bindings are not allowed in DDL'
+- error: bindings are not allowed in DDL
 ...
 box.sql.execute("DROP TABLE t1;")
 ---