diff --git a/src/box/sql/prepare.c b/src/box/sql/prepare.c index 828a1aee8c3331c6e9c337b9bca70c8dc26b0d7e..4eaa9a46bad880cd4a27431f06fc167f2003a219 100644 --- a/src/box/sql/prepare.c +++ b/src/box/sql/prepare.c @@ -52,7 +52,6 @@ sqlPrepare(sql * db, /* Database handle. */ const char **pzTail /* OUT: End of parsed string */ ) { - char *zErrMsg = 0; /* Error message */ int rc = SQL_OK; /* Result code */ Parse sParse; /* Parsing context */ sql_parser_create(&sParse, db); @@ -89,14 +88,14 @@ sqlPrepare(sql * db, /* Database handle. */ } zSqlCopy = sqlDbStrNDup(db, zSql, nBytes); if (zSqlCopy) { - sqlRunParser(&sParse, zSqlCopy, &zErrMsg); + sqlRunParser(&sParse, zSqlCopy); sParse.zTail = &zSql[sParse.zTail - zSqlCopy]; sqlDbFree(db, zSqlCopy); } else { sParse.zTail = &zSql[nBytes]; } } else { - sqlRunParser(&sParse, zSql, &zErrMsg); + sqlRunParser(&sParse, zSql); } assert(0 == sParse.nQueryLoop); @@ -168,11 +167,7 @@ sqlPrepare(sql * db, /* Database handle. */ *ppStmt = (sql_stmt *) sParse.pVdbe; } - if (zErrMsg) { - sqlErrorWithMsg(db, rc, "%s", zErrMsg); - } else { - sqlError(db, rc); - } + db->errCode = rc; /* Delete any TriggerPrg structures allocated while parsing this statement. */ while (sParse.pTriggerPrg) { diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h index f7b83a71f6f919a86e65869e52050522f9fa68d6..d54d16b8a7e6038f019a28d6f1a080100ef5664f 100644 --- a/src/box/sql/sqlInt.h +++ b/src/box/sql/sqlInt.h @@ -3198,7 +3198,7 @@ void sqlDequote(char *); void sqlNormalizeName(char *z); void sqlTokenInit(Token *, char *); int sqlKeywordCode(const unsigned char *, int); -int sqlRunParser(Parse *, const char *, char **); +int sqlRunParser(Parse *, const char *); /** * Increment error counter. diff --git a/src/box/sql/tokenize.c b/src/box/sql/tokenize.c index f0a2f166f076eedb4b787f9d1838851f38fcd42a..8ee996e96b7a33b54c9c06a0a5d4218795ed457d 100644 --- a/src/box/sql/tokenize.c +++ b/src/box/sql/tokenize.c @@ -437,17 +437,17 @@ parser_space_delete(struct sql *db, struct space *space) sql_expr_list_delete(db, space->def->opts.checks); } -/* - * Run the parser on the given SQL string. The parser structure is - * passed in. An SQL_ status code is returned. If an error occurs - * then an and attempt is made to write an error message into - * memory obtained from sql_malloc() and to make *pzErrMsg point to that - * error message. +/** + * Run the parser on the given SQL string. + * + * @param pParse Parser context. + * @param zSql SQL string. + * @retval 0 on success. + * @retval -1 on error. */ int -sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg) +sqlRunParser(Parse * pParse, const char *zSql) { - int nErr = 0; /* Number of errors encountered */ int i; /* Loop counter */ void *pEngine; /* The LEMON-generated LALR(1) parser */ int tokenType; /* type of the next token */ @@ -463,12 +463,11 @@ sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg) pParse->rc = SQL_OK; pParse->zTail = zSql; i = 0; - assert(pzErrMsg != 0); /* sqlParserTrace(stdout, "parser: "); */ pEngine = sqlParserAlloc(sqlMalloc); if (pEngine == 0) { sqlOomFault(db); - return SQL_NOMEM; + return -1; } assert(pParse->new_space == NULL); assert(pParse->parsed_ast.trigger == NULL); @@ -518,7 +517,6 @@ sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg) break; } } - assert(nErr == 0); pParse->zTail = &zSql[i]; #ifdef YYTRACKMAXSTACKDEPTH sqlStatusHighwater(SQL_STATUS_PARSER_STACK, @@ -530,21 +528,8 @@ sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg) pParse->rc = SQL_TARANTOOL_ERROR; } if (pParse->rc != SQL_OK && pParse->rc != SQL_DONE - && pParse->zErrMsg == 0) { - const char *error; - if (is_tarantool_error(pParse->rc) && - tarantoolErrorMessage() != NULL) - error = tarantoolErrorMessage(); - else - error = sqlErrStr(pParse->rc); - pParse->zErrMsg = sqlMPrintf(db, "%s", error); - } - assert(pzErrMsg != 0); - if (pParse->zErrMsg) { - *pzErrMsg = pParse->zErrMsg; - sql_log(pParse->rc, "%s", *pzErrMsg); - nErr++; - } + && pParse->zErrMsg == 0) + pParse->zErrMsg = sqlMPrintf(db, "%s", tarantoolErrorMessage()); if (pParse->pVdbe != NULL && pParse->nErr > 0) { sqlVdbeDelete(pParse->pVdbe); pParse->pVdbe = 0; @@ -553,8 +538,7 @@ sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg) if (pParse->pWithToFree) sqlWithDelete(db, pParse->pWithToFree); sqlDbFree(db, pParse->pVList); - assert(nErr == 0 || pParse->rc != SQL_OK); - return nErr; + return pParse->nErr > 0 || pParse->rc == SQL_TARANTOOL_ERROR ? -1 : 0; } struct Expr * @@ -575,11 +559,8 @@ sql_expr_compile(sql *db, const char *expr, int expr_len) } sprintf(stmt, "%s%.*s", outer, expr_len, expr); - char *sql_error = NULL; - if (sqlRunParser(&parser, stmt, &sql_error) != SQL_OK || - parser.parsed_ast_type != AST_TYPE_EXPR) { - diag_set(ClientError, ER_SQL, sql_error); - } else { + if (sqlRunParser(&parser, stmt) == 0 && + parser.parsed_ast_type == AST_TYPE_EXPR) { expression = parser.parsed_ast.expr; parser.parsed_ast.expr = NULL; } @@ -597,8 +578,7 @@ sql_view_compile(struct sql *db, const char *view_stmt) struct Select *select = NULL; - char *unused; - if (sqlRunParser(&parser, view_stmt, &unused) != SQL_OK || + if (sqlRunParser(&parser, view_stmt) != 0 || parser.parsed_ast_type != AST_TYPE_SELECT) { diag_set(ClientError, ER_SQL_EXECUTE, view_stmt); } else { @@ -616,13 +596,9 @@ sql_trigger_compile(struct sql *db, const char *sql) struct Parse parser; sql_parser_create(&parser, db); parser.parse_only = true; - char *sql_error = NULL; struct sql_trigger *trigger = NULL; - if (sqlRunParser(&parser, sql, &sql_error) != SQL_OK || - parser.parsed_ast_type != AST_TYPE_TRIGGER) { - if (parser.rc != SQL_TARANTOOL_ERROR) - diag_set(ClientError, ER_SQL, sql_error); - } else { + if (sqlRunParser(&parser, sql) == 0 && + parser.parsed_ast_type == AST_TYPE_TRIGGER) { trigger = parser.parsed_ast.trigger; parser.parsed_ast.trigger = NULL; } diff --git a/test/sql-tap/check.test.lua b/test/sql-tap/check.test.lua index bab64937f26fc3aca5540a2d0a94da3e8a67f873..0d8bf15a725963c29b482f80b7a8fe64bab089d5 100755 --- a/test/sql-tap/check.test.lua +++ b/test/sql-tap/check.test.lua @@ -516,7 +516,7 @@ test:do_catchsql_test( ); ]], { -- <check-5.1> - 1, "Wrong space options (field 5): invalid expression specified (SQL error: bindings are not allowed in DDL)" + 1, "Wrong space options (field 5): invalid expression specified (bindings are not allowed in DDL)" -- </check-5.1> }) @@ -528,7 +528,7 @@ test:do_catchsql_test( ); ]], { -- <check-5.2> - 1, "Wrong space options (field 5): invalid expression specified (SQL error: bindings are not allowed in DDL)" + 1, "Wrong space options (field 5): invalid expression specified (bindings are not allowed in DDL)" -- </check-5.2> }) diff --git a/test/sql/checks.result b/test/sql/checks.result index e31964c1ec533b46b01791b75c051a5256befb5a..42df65711ed7facb2e5838708aa31f4da7ae6e89 100644 --- a/test/sql/checks.result +++ b/test/sql/checks.result @@ -29,8 +29,8 @@ t = {513, 1, 'test', 'memtx', 0, opts, format} ... s = box.space._space:insert(t) --- -- error: 'Wrong space options (field 5): invalid expression specified (SQL error: - Syntax error near ''<'')' +- error: 'Wrong space options (field 5): invalid expression specified (Syntax error + near ''<'')' ... opts = {checks = {{expr = 'X>5'}}} --- @@ -122,8 +122,8 @@ box.sql.execute("DROP TABLE w2;") -- box.sql.execute("CREATE TABLE t5(x INT PRIMARY KEY, y INT, CHECK( x*y < ? ));") --- -- error: 'Wrong space options (field 5): invalid expression specified (SQL error: - bindings are not allowed in DDL)' +- error: 'Wrong space options (field 5): invalid expression specified (bindings are + not allowed in DDL)' ... opts = {checks = {{expr = '?>5', name = 'ONE'}}} --- @@ -136,8 +136,8 @@ t = {513, 1, 'test', 'memtx', 0, opts, format} ... s = box.space._space:insert(t) --- -- error: 'Wrong space options (field 5): invalid expression specified (SQL error: - bindings are not allowed in DDL)' +- error: 'Wrong space options (field 5): invalid expression specified (bindings are + not allowed in DDL)' ... test_run:cmd("clear filter") ---