From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id D764D28BE4 for ; Sat, 2 Mar 2019 08:08:02 -0500 (EST) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Q0ueEAiX3RSF for ; Sat, 2 Mar 2019 08:08:02 -0500 (EST) Received: from smtpng3.m.smailru.net (smtpng3.m.smailru.net [94.100.177.149]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id 647F5261E0 for ; Sat, 2 Mar 2019 08:08:02 -0500 (EST) From: imeevma@tarantool.org Subject: [tarantool-patches] [PATCH v3 7/9] sql: rework four semantic errors Date: Sat, 2 Mar 2019 16:08:00 +0300 Message-Id: <68603a625edc2f90ae0533b0462575e4818bb1da.1551530224.git.imeevma@gmail.com> In-Reply-To: References: Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: korablev@tarantool.org Cc: tarantool-patches@freelists.org This patch reworks four semantic errors. Part of #3965 --- src/box/errcode.h | 4 ++++ src/box/sql/build.c | 4 +++- src/box/sql/expr.c | 28 ++++++++++++---------- src/box/sql/parse.y | 16 +++++++++---- src/box/sql/select.c | 5 +++- src/box/sql/where.c | 4 +++- test/box/misc.result | 4 ++++ test/sql-tap/gh-2549-many-columns.test.lua | 2 +- test/sql-tap/gh2548-select-compound-limit.test.lua | 2 +- test/sql-tap/hexlit.test.lua | 4 ++-- test/sql-tap/join.test.lua | 18 +++++++------- test/sql-tap/join3.test.lua | 2 +- test/sql-tap/select7.test.lua | 2 +- test/sql-tap/where7.test.lua | 2 +- test/sql/gh-2347-max-int-literals.result | 6 +++-- test/sql/integer-overflow.result | 9 ++++--- test/sql/iproto.result | 5 ++-- 17 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/box/errcode.h b/src/box/errcode.h index 057a6d3..06f7a63 100644 --- a/src/box/errcode.h +++ b/src/box/errcode.h @@ -242,6 +242,10 @@ struct errcode_record { /*187 */_(ER_INDEX_DEF, "%s prohibited in an index definition") \ /*188 */_(ER_CHECK_CONSTRAINT_DEF, "%s prohibited in prohibited in a CHECK constraint definition") \ /*189 */_(ER_PRIMARY_KEY_DEF, "Expressions are prohibited in a primary key definition") \ + /*190 */_(ER_COLUMN_COUNT_MAX, "Failed to create space '%s': space column count %d exceeds the limit (%d)") \ + /*191 */_(ER_HEX_LITERAL_MAX, "Hex literal %s%s length %d exceeds the supported limit (%d)") \ + /*192 */_(ER_INT_LITERAL_MAX, "Integer literal %s%s exceeds the supported range %lld - %lld") \ + /*193 */_(ER_SQL_PARSER_LIMIT, "%s%.*s %d exceeds the limit (%d)") \ /* * !IMPORTANT! Please follow instructions at start of the file diff --git a/src/box/sql/build.c b/src/box/sql/build.c index 651e02a..64d2690 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -436,7 +436,9 @@ sqlAddColumn(Parse * pParse, Token * pName, struct type_def *type_def) #if SQL_MAX_COLUMN if ((int)def->field_count + 1 > db->aLimit[SQL_LIMIT_COLUMN]) { - sqlErrorMsg(pParse, "too many columns on %s", def->name); + diag_set(ClientError, ER_COLUMN_COUNT_MAX, def->name, + def->field_count + 1, db->aLimit[SQL_LIMIT_COLUMN]); + pParse->is_aborted = true; return; } #endif diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index 7ea344b..ffcb455 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -730,9 +730,9 @@ sqlExprCheckHeight(Parse * pParse, int nHeight) int rc = SQL_OK; int mxHeight = pParse->db->aLimit[SQL_LIMIT_EXPR_DEPTH]; if (nHeight > mxHeight) { - sqlErrorMsg(pParse, - "Expression tree is too large (maximum depth %d)", - mxHeight); + diag_set(ClientError, ER_SQL_PARSER_LIMIT, "Number of nodes "\ + "in expression tree", 0, "", nHeight, mxHeight); + pParse->is_aborted = true; rc = SQL_ERROR; } return rc; @@ -1174,9 +1174,9 @@ sqlExprAssignVarNumber(Parse * pParse, Expr * pExpr, u32 n) testcase(i == SQL_BIND_PARAMETER_MAX - 1); testcase(i == SQL_BIND_PARAMETER_MAX); if (!is_ok || i < 1 || i > SQL_BIND_PARAMETER_MAX) { - sqlErrorMsg(pParse, - "variable number must be between $1 and $%d", - SQL_BIND_PARAMETER_MAX); + diag_set(ClientError, ER_SQL_BIND_PARAMETER_MAX, + SQL_BIND_PARAMETER_MAX); + pParse->is_aborted = true; return; } if (x > pParse->nVar) { @@ -1204,7 +1204,9 @@ sqlExprAssignVarNumber(Parse * pParse, Expr * pExpr, u32 n) } pExpr->iColumn = x; if (x > SQL_BIND_PARAMETER_MAX) { - sqlErrorMsg(pParse, "too many SQL variables"); + diag_set(ClientError, ER_SQL_BIND_PARAMETER_MAX, + SQL_BIND_PARAMETER_MAX); + pParse->is_aborted = true; } } @@ -3314,15 +3316,15 @@ expr_code_int(struct Parse *parse, struct Expr *expr, bool is_neg, int c = sql_dec_or_hex_to_i64(z, &value); if (c == 1 || (c == 2 && !is_neg) || (is_neg && value == SMALLEST_INT64)) { + const char *sign = is_neg ? "-" : ""; if (sql_strnicmp(z, "0x", 2) == 0) { - sqlErrorMsg(parse, - "hex literal too big: %s%s", - is_neg ? "-" : "", z); + diag_set(ClientError, ER_HEX_LITERAL_MAX, sign, + z, strlen(z) - 2, 16); } else { - sqlErrorMsg(parse, - "oversized integer: %s%s", - is_neg ? "-" : "", z); + diag_set(ClientError, ER_INT_LITERAL_MAX, sign, + z, INT64_MIN, INT64_MAX); } + parse->is_aborted = true; } else { if (is_neg) value = c == 2 ? SMALLEST_INT64 : -value; diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y index b8c0515..b69f059 100644 --- a/src/box/sql/parse.y +++ b/src/box/sql/parse.y @@ -410,9 +410,9 @@ cmd ::= select(X). { (mxSelect = pParse->db->aLimit[SQL_LIMIT_COMPOUND_SELECT])>0 && cnt>mxSelect ){ - sqlErrorMsg(pParse, "Too many UNION or EXCEPT or INTERSECT " - "operations (limit %d is set)", - pParse->db->aLimit[SQL_LIMIT_COMPOUND_SELECT]); + diag_set(ClientError, ER_SQL_PARSER_LIMIT, "The number of UNION or "\ + "EXCEPT or INTERSECT operations", 0, "", cnt, mxSelect); + pParse->is_aborted = true; } } } @@ -930,7 +930,10 @@ expr(A) ::= CAST(X) LP expr(E) AS typedef(T) RP(Y). { %endif SQL_OMIT_CAST expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). { if( Y && Y->nExpr>pParse->db->aLimit[SQL_LIMIT_FUNCTION_ARG] ){ - sqlErrorMsg(pParse, "too many arguments on function %T", &X); + diag_set(ClientError, ER_SQL_PARSER_LIMIT, "Number of "\ + "arguments to function ", X.n, X.z, Y->nExpr, + pParse->db->aLimit[SQL_LIMIT_FUNCTION_ARG]); + pParse->is_aborted = true; } A.pExpr = sqlExprFunction(pParse, Y, &X); spanSet(&A,&X,&E); @@ -944,7 +947,10 @@ type_func(A) ::= DATETIME(A) . type_func(A) ::= CHAR(A) . expr(A) ::= type_func(X) LP distinct(D) exprlist(Y) RP(E). { if( Y && Y->nExpr>pParse->db->aLimit[SQL_LIMIT_FUNCTION_ARG] ){ - sqlErrorMsg(pParse, "too many arguments on function %T", &X); + diag_set(ClientError, ER_SQL_PARSER_LIMIT, "Number of "\ + "arguments to function ", X.n, X.z, Y->nExpr, + pParse->db->aLimit[SQL_LIMIT_FUNCTION_ARG]); + pParse->is_aborted = true; } A.pExpr = sqlExprFunction(pParse, Y, &X); spanSet(&A,&X,&E); diff --git a/src/box/sql/select.c b/src/box/sql/select.c index 66cbc73..30ba947 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -5063,7 +5063,10 @@ selectExpander(Walker * pWalker, Select * p) } #if SQL_MAX_COLUMN if (p->pEList && p->pEList->nExpr > db->aLimit[SQL_LIMIT_COLUMN]) { - sqlErrorMsg(pParse, "too many columns in result set"); + diag_set(ClientError, ER_SQL_PARSER_LIMIT, "The number of "\ + "columns in result set", 0, "", p->pEList->nExpr, + db->aLimit[SQL_LIMIT_COLUMN]); + pParse->is_aborted = true; return WRC_Abort; } #endif diff --git a/src/box/sql/where.c b/src/box/sql/where.c index cf70e06..33885d0 100644 --- a/src/box/sql/where.c +++ b/src/box/sql/where.c @@ -4286,7 +4286,9 @@ sqlWhereBegin(Parse * pParse, /* The parser context */ */ testcase(pTabList->nSrc == BMS); if (pTabList->nSrc > BMS) { - sqlErrorMsg(pParse, "at most %d tables in a join", BMS); + diag_set(ClientError, ER_SQL_PARSER_LIMIT, "The number of "\ + "tables in a join", 0, "", pTabList->nSrc, BMS); + pParse->is_aborted = true; return 0; } diff --git a/test/box/misc.result b/test/box/misc.result index a3bc7b7..2bb6613 100644 --- a/test/box/misc.result +++ b/test/box/misc.result @@ -518,6 +518,10 @@ t; 187: box.error.INDEX_DEF 188: box.error.CHECK_CONSTRAINT_DEF 189: box.error.PRIMARY_KEY_DEF + 190: box.error.COLUMN_COUNT_MAX + 191: box.error.HEX_LITERAL_MAX + 192: box.error.INT_LITERAL_MAX + 193: box.error.SQL_PARSER_LIMIT ... test_run:cmd("setopt delimiter ''"); --- diff --git a/test/sql-tap/gh-2549-many-columns.test.lua b/test/sql-tap/gh-2549-many-columns.test.lua index 3de4d67..ed8c9d9 100755 --- a/test/sql-tap/gh-2549-many-columns.test.lua +++ b/test/sql-tap/gh-2549-many-columns.test.lua @@ -35,7 +35,7 @@ test:do_catchsql_test( "columns-1.2", fail_statement, { -- - 1, "too many columns on T2" + 1, "Failed to create space 'T2': space column count 2001 exceeds the limit (2000)" -- }) diff --git a/test/sql-tap/gh2548-select-compound-limit.test.lua b/test/sql-tap/gh2548-select-compound-limit.test.lua index 5494a66..e8c8d95 100755 --- a/test/sql-tap/gh2548-select-compound-limit.test.lua +++ b/test/sql-tap/gh2548-select-compound-limit.test.lua @@ -58,7 +58,7 @@ test:do_catchsql_test( "gh2548-select-compound-limit-2", select_string_last, { -- - 1, "Too many UNION or EXCEPT or INTERSECT operations (limit 30 is set)" + 1, "The number of UNION or EXCEPT or INTERSECT operations 31 exceeds the limit (30)" -- }) diff --git a/test/sql-tap/hexlit.test.lua b/test/sql-tap/hexlit.test.lua index 158eda7..288d823 100755 --- a/test/sql-tap/hexlit.test.lua +++ b/test/sql-tap/hexlit.test.lua @@ -107,7 +107,7 @@ test:do_catchsql_test( SELECT 0x10000000000000000; ]], { -- - 1, "hex literal too big: 0x10000000000000000" + 1, "Hex literal 0x10000000000000000 length 17 exceeds the supported limit (16)" -- }) @@ -119,7 +119,7 @@ test:do_catchsql_test( INSERT INTO t1 VALUES(1+0x10000000000000000); ]], { -- - 1, "hex literal too big: 0x10000000000000000" + 1, "Hex literal 0x10000000000000000 length 17 exceeds the supported limit (16)" -- }) diff --git a/test/sql-tap/join.test.lua b/test/sql-tap/join.test.lua index df272a9..ce0d9e9 100755 --- a/test/sql-tap/join.test.lua +++ b/test/sql-tap/join.test.lua @@ -1067,11 +1067,11 @@ end jointest("join-12.2", 30, {0, {1}}) jointest("join-12.3", 63, {0, {1}}) jointest("join-12.4", 64, {0, {1}}) -jointest("join-12.5", 65, {1, 'at most 64 tables in a join'}) -jointest("join-12.6", 66, {1, 'at most 64 tables in a join'}) -jointest("join-12.7", 127, {1, 'at most 64 tables in a join'}) -jointest("join-12.8", 128, {1, 'at most 64 tables in a join'}) -jointest("join-12.9", 1000, {1, 'at most 64 tables in a join'}) +jointest("join-12.5", 65, {1, 'The number of tables in a join 65 exceeds the limit (64)'}) +jointest("join-12.6", 66, {1, 'The number of tables in a join 66 exceeds the limit (64)'}) +jointest("join-12.7", 127, {1, 'The number of tables in a join 127 exceeds the limit (64)'}) +jointest("join-12.8", 128, {1, 'The number of tables in a join 128 exceeds the limit (64)'}) +jointest("join-12.9", 1000, {1, 'The number of tables in a join 1000 exceeds the limit (64)'}) -- If sql is built with sql_MEMDEBUG, then the huge number of realloc() -- calls made by the following test cases are too time consuming to run. -- Without sql_MEMDEBUG, realloc() is fast enough that these are not @@ -1079,10 +1079,10 @@ jointest("join-12.9", 1000, {1, 'at most 64 tables in a join'}) --if X(0, "X!capable", [["pragma&&compileoption_diags"]]) then -- if X(703, "X!cmd", [=[["expr","[lsearch [db eval {PRAGMA compile_options}] MEMDEBUG]<0"]]=]) -- then -jointest("join-12.10", 65534, {1, 'at most 64 tables in a join'}) -jointest("join-12.11", 65535, {1, 'at most 64 tables in a join'}) -jointest("join-12.12", 65536, {1, 'at most 64 tables in a join'}) -jointest("join-12.13", 65537, {1, 'at most 64 tables in a join'}) +jointest("join-12.10", 65534, {1, 'The number of tables in a join 65534 exceeds the limit (64)'}) +jointest("join-12.11", 65535, {1, 'The number of tables in a join 65535 exceeds the limit (64)'}) +jointest("join-12.12", 65536, {1, 'The number of tables in a join 65536 exceeds the limit (64)'}) +jointest("join-12.13", 65537, {1, 'The number of tables in a join 65537 exceeds the limit (64)'}) -- end --end diff --git a/test/sql-tap/join3.test.lua b/test/sql-tap/join3.test.lua index 6b822de..91118dc 100755 --- a/test/sql-tap/join3.test.lua +++ b/test/sql-tap/join3.test.lua @@ -85,7 +85,7 @@ test:do_test( return test:catchsql(sql) end, { -- - 1, "at most "..bitmask_size.." tables in a join" + 1, "The number of tables in a join 65 exceeds the limit (64)" -- }) diff --git a/test/sql-tap/select7.test.lua b/test/sql-tap/select7.test.lua index 4029c20..7037d20 100755 --- a/test/sql-tap/select7.test.lua +++ b/test/sql-tap/select7.test.lua @@ -179,7 +179,7 @@ test:do_catchsql_test( "select7-6.2", sql, { -- - 1, "Too many UNION or EXCEPT or INTERSECT operations (limit 30 is set)" + 1, "The number of UNION or EXCEPT or INTERSECT operations 33 exceeds the limit (30)" -- }) diff --git a/test/sql-tap/where7.test.lua b/test/sql-tap/where7.test.lua index 2e6f116..ecd0d24 100755 --- a/test/sql-tap/where7.test.lua +++ b/test/sql-tap/where7.test.lua @@ -325,7 +325,7 @@ test:do_test( end return test:catchsql(sql) end, { - 1, "Expression tree is too large (maximum depth 200)" + 1, "Number of nodes in expression tree 201 exceeds the limit (200)" }) test:do_test( diff --git a/test/sql/gh-2347-max-int-literals.result b/test/sql/gh-2347-max-int-literals.result index c289a80..b511440 100644 --- a/test/sql/gh-2347-max-int-literals.result +++ b/test/sql/gh-2347-max-int-literals.result @@ -20,9 +20,11 @@ box.sql.execute("select (-9223372036854775808)") ... box.sql.execute("select (9223372036854775808)") --- -- error: 'oversized integer: 9223372036854775808' +- error: Integer literal 9223372036854775808 exceeds the supported range -9223372036854775808 + - 9223372036854775807 ... box.sql.execute("select (-9223372036854775809)") --- -- error: 'oversized integer: -9223372036854775809' +- error: Integer literal -9223372036854775809 exceeds the supported range -9223372036854775808 + - 9223372036854775807 ... diff --git a/test/sql/integer-overflow.result b/test/sql/integer-overflow.result index 4754c04..09e864e 100644 --- a/test/sql/integer-overflow.result +++ b/test/sql/integer-overflow.result @@ -30,15 +30,18 @@ box.sql.execute('SELECT (9223372036854775807 + 1);') -- box.sql.execute('SELECT 9223372036854775808;') --- -- error: 'oversized integer: 9223372036854775808' +- error: Integer literal 9223372036854775808 exceeds the supported range -9223372036854775808 + - 9223372036854775807 ... box.sql.execute('SELECT -9223372036854775809;') --- -- error: 'oversized integer: -9223372036854775809' +- error: Integer literal -9223372036854775809 exceeds the supported range -9223372036854775808 + - 9223372036854775807 ... box.sql.execute('SELECT 9223372036854775808 - 1;') --- -- error: 'oversized integer: 9223372036854775808' +- error: Integer literal 9223372036854775808 exceeds the supported range -9223372036854775808 + - 9223372036854775807 ... -- Test that CAST may also leads to overflow. -- diff --git a/test/sql/iproto.result b/test/sql/iproto.result index 938aea9..56099fa 100644 --- a/test/sql/iproto.result +++ b/test/sql/iproto.result @@ -363,7 +363,7 @@ sql = 'select '..string.rep('?, ', box.schema.SQL_BIND_PARAMETER_MAX)..'?' ... cn:execute(sql) --- -- error: 'Failed to execute SQL statement: too many SQL variables' +- error: 'Failed to execute SQL statement: SQL bind parameter limit reached: 65000' ... -- Try too many parameter values. sql = 'select ?' @@ -571,8 +571,7 @@ cn:execute('select ?1, ?2, ?3', {1, 2, 3}) ... cn:execute('select $name, $name2', {1, 2}) --- -- error: 'Failed to execute SQL statement: variable number must be between $1 and - $65000' +- error: 'Failed to execute SQL statement: SQL bind parameter limit reached: 65000' ... parameters = {} --- -- 2.7.4