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;") ---