From: imeevma@tarantool.org To: korablev@tarantool.org Cc: tarantool-patches@freelists.org Subject: [tarantool-patches] [PATCH v3 1/9] sql: rework syntax errors Date: Sat, 2 Mar 2019 16:07:48 +0300 [thread overview] Message-ID: <8bd6b8f7e60a581d62673d548ecf5a3039d16d6e.1551530224.git.imeevma@gmail.com> (raw) In-Reply-To: <cover.1551530224.git.imeevma@gmail.com> Hi! Thank you for review. My answer, diff between versions and new version below. On 2/25/19 11:02 PM, n.pettik wrote: >> diff --git a/src/box/errcode.h b/src/box/errcode.h >> index a1fcf01..6546b2f 100644 >> --- a/src/box/errcode.h >> +++ b/src/box/errcode.h >> @@ -231,6 +231,13 @@ struct errcode_record { >> /*176 */_(ER_SQL_CANT_RESOLVE_FIELD, "Can’t resolve field '%s'") \ >> /*177 */_(ER_INDEX_EXISTS_IN_SPACE, "Index '%s' already exists in space '%s'") \ >> /*178 */_(ER_INCONSISTENT_TYPES, "Inconsistent types: expected %s got %s") \ >> + /*179 */_(ER_SQL_SYNTAX, "Syntax error in %s: %s") \ >> + /*180 */_(ER_SQL_STACK_OVERFLOW, "Failed to parse SQL statement: parser stack limit reached") \ >> + /*181 */_(ER_SQL_SELECT_WILDCARD, "Failed to expand '*' in SELECT statement without FROM clause") \ >> + /*182 */_(ER_SQL_STATEMENT_EMPTY, "Failed to execute an empty SQL statement") \ >> + /*183 */_(ER_SQL_KEYWORD_IS_RESERVED, "Keyword '%.*s' is reserved. Please use double quotes if '%.*s' is an identifier.") \ >> + /*184 */_(ER_SQL_SYNTAX_NEAR, "Unrecognized syntax near '%.*s'") \ > > Quite strange name for err code. > I’d rather say ER_SQL_UNRECOGNIZED_SYMBOL/SYNTAX. > Is this message suggested by Konstantin? To be honest, I would > prefer old one. “Unrecognized syntax” doesn’t sound good and clear enough, > at least for me. Personally I would say “Syntax error near %s”. > The last one is used in several DBs, so I suppose it is common way to raise > errors like that. > Fixed. Changed to ER_SQL_UNRECOGNIZED_SYNTAX with description: "Syntax error near '%.*s'". Diff between versions: commit b71703e1ad00454e81d2d8a4d91022a7c7ffb905 Author: Mergen Imeev <imeevma@gmail.com> Date: Tue Feb 26 20:09:57 2019 +0300 Temporary: review fix Replace ER_SQL_SYNTAX_NEAR by ER_SQL_UNRECOGNIZED_SYNTAX. diff --git a/src/box/errcode.h b/src/box/errcode.h index 6546b2f..f2f47c0 100644 --- a/src/box/errcode.h +++ b/src/box/errcode.h @@ -236,7 +236,7 @@ struct errcode_record { /*181 */_(ER_SQL_SELECT_WILDCARD, "Failed to expand '*' in SELECT statement without FROM clause") \ /*182 */_(ER_SQL_STATEMENT_EMPTY, "Failed to execute an empty SQL statement") \ /*183 */_(ER_SQL_KEYWORD_IS_RESERVED, "Keyword '%.*s' is reserved. Please use double quotes if '%.*s' is an identifier.") \ - /*184 */_(ER_SQL_SYNTAX_NEAR, "Unrecognized syntax near '%.*s'") \ + /*184 */_(ER_SQL_UNRECOGNIZED_SYNTAX, "Syntax error near '%.*s'") \ /*185 */_(ER_SQL_UNKNOWN_TOKEN, "Syntax error: unrecognized token: '%.*s'") \ /* diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y index 884f59b..f980945 100644 --- a/src/box/sql/parse.y +++ b/src/box/sql/parse.y @@ -36,7 +36,7 @@ diag_set(ClientError, ER_SQL_KEYWORD_IS_RESERVED, TOKEN.n, TOKEN.z, TOKEN.n, TOKEN.z); } else { - diag_set(ClientError, ER_SQL_SYNTAX_NEAR, TOKEN.n, TOKEN.z); + diag_set(ClientError, ER_SQL_UNRECOGNIZED_SYNTAX, TOKEN.n, TOKEN.z); } sql_parser_error(pParse); } @@ -903,7 +903,7 @@ expr(A) ::= VARIABLE(X). { u32 n = X.n; spanExpr(&A, pParse, TK_VARIABLE, X); if (A.pExpr->u.zToken[0] == '?' && n > 1) { - diag_set(ClientError, ER_SQL_SYNTAX_NEAR, t.n, t.z); + diag_set(ClientError, ER_SQL_UNRECOGNIZED_SYNTAX, t.n, t.z); sql_parser_error(pParse); } else { sqlExprAssignVarNumber(pParse, A.pExpr, n); @@ -911,7 +911,7 @@ expr(A) ::= VARIABLE(X). { }else{ assert( t.n>=2 ); spanSet(&A, &t, &t); - diag_set(ClientError, ER_SQL_SYNTAX_NEAR, t.n, t.z); + diag_set(ClientError, ER_SQL_UNRECOGNIZED_SYNTAX, t.n, t.z); sql_parser_error(pParse); A.pExpr = NULL; } diff --git a/src/box/sql/select.c b/src/box/sql/select.c index 81da0f6..ef24760 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -2092,7 +2092,7 @@ computeLimitRegisters(Parse * pParse, Select * p, int iBreak) if((p->pLimit->flags & EP_Collate) != 0 || (p->pOffset != NULL && (p->pOffset->flags & EP_Collate) != 0)) { - diag_set(ClientError, ER_SQL_SYNTAX_NEAR, + diag_set(ClientError, ER_SQL_UNRECOGNIZED_SYNTAX, sizeof("COLLATE"), "COLLATE"); sql_parser_error(pParse); return; diff --git a/test/box/misc.result b/test/box/misc.result index a1c94bf..27579c6 100644 --- a/test/box/misc.result +++ b/test/box/misc.result @@ -512,7 +512,7 @@ t; 180: box.error.SQL_STACK_OVERFLOW 181: box.error.SQL_SELECT_WILDCARD 182: box.error.SQL_STATEMENT_EMPTY - 184: box.error.SQL_SYNTAX_NEAR + 184: box.error.SQL_UNRECOGNIZED_SYNTAX 185: box.error.SQL_UNKNOWN_TOKEN ... test_run:cmd("setopt delimiter ''"); diff --git a/test/sql-tap/alter2.test.lua b/test/sql-tap/alter2.test.lua index ef57955..beb6f5d 100755 --- a/test/sql-tap/alter2.test.lua +++ b/test/sql-tap/alter2.test.lua @@ -223,7 +223,7 @@ test:do_catchsql_test( ALTER TABLE child ADD CONSTRAINT fk FOREIGN KEY REFERENCES child(id); ]], { -- <alter2-4.1> - 1, "Unrecognized syntax near 'REFERENCES'" + 1, "Syntax error near 'REFERENCES'" -- </alter2-4.1> }) @@ -233,7 +233,7 @@ test:do_catchsql_test( ALTER TABLE child ADD CONSTRAINT fk () FOREIGN KEY REFERENCES child(id); ]], { -- <alter2-4.1> - 1, "Unrecognized syntax near '('" + 1, "Syntax error near '('" -- </alter2-4.2> }) diff --git a/test/sql-tap/check.test.lua b/test/sql-tap/check.test.lua index f7d3ffe..b6b7fc7 100755 --- a/test/sql-tap/check.test.lua +++ b/test/sql-tap/check.test.lua @@ -281,7 +281,7 @@ test:do_catchsql_test( ); ]], { -- <check-2.10> - 1,"Unrecognized syntax near ','" + 1,"Syntax error near ','" -- </check-2.10> }) @@ -295,7 +295,7 @@ test:do_catchsql_test( ); ]], { -- <check-2.10> - 1,"Unrecognized syntax near ','" + 1,"Syntax error near ','" -- </check-2.10> }) diff --git a/test/sql-tap/colname.test.lua b/test/sql-tap/colname.test.lua index db655a7..29fdf13 100755 --- a/test/sql-tap/colname.test.lua +++ b/test/sql-tap/colname.test.lua @@ -576,7 +576,7 @@ for i, val in ipairs(data) do end local data2 = { - {[['a']],{1, "/Unrecognized syntax/"}}, -- because ' is delimiter for strings + {[['a']],{1, "/Syntax error/"}}, -- because ' is delimiter for strings {[[`a`]],{1, "/unrecognized token/"}}, -- because ` is undefined symbol {"[a]",{1, "/unrecognized token/"}} -- because [ is undefined symbol } diff --git a/test/sql-tap/count.test.lua b/test/sql-tap/count.test.lua index fb2d403..cf5bfcc 100755 --- a/test/sql-tap/count.test.lua +++ b/test/sql-tap/count.test.lua @@ -128,7 +128,7 @@ test:do_catchsql_test( SELECT count(DISTINCT *) FROM t2 ]], { -- <count-2.2> - 1, [[Unrecognized syntax near '*']] + 1, [[Syntax error near '*']] -- </count-2.2> }) diff --git a/test/sql-tap/default.test.lua b/test/sql-tap/default.test.lua index ec8928a..9be4614 100755 --- a/test/sql-tap/default.test.lua +++ b/test/sql-tap/default.test.lua @@ -224,7 +224,7 @@ test:do_catchsql_test( CREATE TABLE t6(id INTEGER PRIMARY KEY, b TEXT DEFAULT id); ]], { -- <default-5.2> - 1, "Unrecognized syntax near 'id'" + 1, "Syntax error near 'id'" -- </default-5.2> }) @@ -234,7 +234,7 @@ test:do_catchsql_test( CREATE TABLE t6(id INTEGER PRIMARY KEY, b TEXT DEFAULT "id"); ]], { -- <default-5.3> - 1, "Unrecognized syntax near '\"id\"'" + 1, "Syntax error near '\"id\"'" -- </default-5.3> }) diff --git a/test/sql-tap/e_select1.test.lua b/test/sql-tap/e_select1.test.lua index 9ade46c..e190ad7 100755 --- a/test/sql-tap/e_select1.test.lua +++ b/test/sql-tap/e_select1.test.lua @@ -807,10 +807,10 @@ test:do_select_tests( -- FROM clause. -- data = { - {"1.1", "SELECT a, b, c FROM z1 WHERE *", "Unrecognized syntax near '*'"}, - {"1.2", "SELECT a, b, c FROM z1 GROUP BY *", "Unrecognized syntax near '*'"}, - {"1.3", "SELECT 1 + * FROM z1", "Unrecognized syntax near '*'"}, - {"1.4", "SELECT * + 1 FROM z1", "Unrecognized syntax near '+'"}, + {"1.1", "SELECT a, b, c FROM z1 WHERE *", "Syntax error near '*'"}, + {"1.2", "SELECT a, b, c FROM z1 GROUP BY *", "Syntax error near '*'"}, + {"1.3", "SELECT 1 + * FROM z1", "Syntax error near '*'"}, + {"1.4", "SELECT * + 1 FROM z1", "Syntax error near '+'"}, {"2.1", "SELECT *", "Failed to expand '*' in SELECT statement without FROM clause"}, {"2.2", "SELECT * WHERE 1", "Failed to expand '*' in SELECT statement without FROM clause"}, {"2.3", "SELECT * WHERE 0", "Failed to expand '*' in SELECT statement without FROM clause"}, diff --git a/test/sql-tap/gh2168-temp-tables.test.lua b/test/sql-tap/gh2168-temp-tables.test.lua index 0de4be5..3b29c9e 100755 --- a/test/sql-tap/gh2168-temp-tables.test.lua +++ b/test/sql-tap/gh2168-temp-tables.test.lua @@ -8,7 +8,7 @@ test:do_catchsql_test( CREATE TEMP TABLE tmp1 (id INTEGER PRIMARY KEY); ]], { -- <trigger2-10.1> - 1, "Unrecognized syntax near 'TEMP'" + 1, "Syntax error near 'TEMP'" -- <trigger2-10.1> }); @@ -23,7 +23,7 @@ test:do_catchsql_test( END; ]], { -- <trigger2-10.1> - 1, "Unrecognized syntax near 'TEMP'" + 1, "Syntax error near 'TEMP'" -- <trigger2-10.1> }); diff --git a/test/sql-tap/identifier_case.test.lua b/test/sql-tap/identifier_case.test.lua index e2b408a..74c7ce2 100755 --- a/test/sql-tap/identifier_case.test.lua +++ b/test/sql-tap/identifier_case.test.lua @@ -238,7 +238,7 @@ test:do_catchsql_test( data = { { 1, [[ 'a' < 'b' collate binary ]], {1, "Collation 'BINARY' does not exist"}}, { 2, [[ 'a' < 'b' collate "binary" ]], {0, {1}}}, - { 3, [[ 'a' < 'b' collate 'binary' ]], {1, [[Unrecognized syntax near ''binary'']]}}, + { 3, [[ 'a' < 'b' collate 'binary' ]], {1, [[Syntax error near ''binary'']]}}, { 4, [[ 'a' < 'b' collate "unicode" ]], {0, {1}}}, { 5, [[ 5 < 'b' collate "unicode" ]], {0, {1}}}, { 6, [[ 5 < 'b' collate unicode ]], {1,"Collation 'UNICODE' does not exist"}}, diff --git a/test/sql-tap/index-info.test.lua b/test/sql-tap/index-info.test.lua index 499f620..a5ed9a9 100755 --- a/test/sql-tap/index-info.test.lua +++ b/test/sql-tap/index-info.test.lua @@ -26,7 +26,7 @@ test:do_catchsql_test( "index-info-1.2", "PRAGMA index_info = t1.a;", { - 1, "Unrecognized syntax near '.'", + 1, "Syntax error near '.'", }) -- Case: single column index with an integer column. diff --git a/test/sql-tap/index1.test.lua b/test/sql-tap/index1.test.lua index 5dbeb84..7fec294 100755 --- a/test/sql-tap/index1.test.lua +++ b/test/sql-tap/index1.test.lua @@ -994,7 +994,7 @@ test:do_catchsql_test( CREATE INDEX temp.i21 ON t6(c); ]], { -- <index-21.1> - 1, "Unrecognized syntax near '.'" + 1, "Syntax error near '.'" -- </index-21.1> }) diff --git a/test/sql-tap/misc1.test.lua b/test/sql-tap/misc1.test.lua index 6d2d813..1b288da 100755 --- a/test/sql-tap/misc1.test.lua +++ b/test/sql-tap/misc1.test.lua @@ -271,7 +271,7 @@ test:do_catchsql_test( UPDATE t3 SET a=0 WHEREwww b=2; ]], { -- <misc1-5.1> - 1, [[Unrecognized syntax near 'WHEREwww']] + 1, [[Syntax error near 'WHEREwww']] -- </misc1-5.1> }) @@ -1037,7 +1037,7 @@ test:do_catchsql_test( select''like''like''like#0; ]], { -- <misc1-21.1> - 1, [[Unrecognized syntax near '#0']] + 1, [[Syntax error near '#0']] -- </misc1-21.1> }) @@ -1047,7 +1047,7 @@ test:do_catchsql_test( VALUES(0,0x0MATCH#0; ]], { -- <misc1-21.2> - 1, [[Unrecognized syntax near ';']] + 1, [[Syntax error near ';']] -- </misc1-21.2> }) diff --git a/test/sql-tap/null.test.lua b/test/sql-tap/null.test.lua index 456ec03..50a2cfb 100755 --- a/test/sql-tap/null.test.lua +++ b/test/sql-tap/null.test.lua @@ -517,7 +517,7 @@ test:do_catchsql_test( ]], { -- <index-1.3> - 1, "Unrecognized syntax near '1'" + 1, "Syntax error near '1'" -- <index-1.3> }) @@ -528,7 +528,7 @@ test:do_catchsql_test( ]], { -- <index-1.3> - 1, "Unrecognized syntax near '1'" + 1, "Syntax error near '1'" -- <index-1.3> }) @@ -539,7 +539,7 @@ test:do_catchsql_test( ]], { -- <index-1.3> - 1, "Unrecognized syntax near '1'" + 1, "Syntax error near '1'" -- <index-1.3> }) @@ -550,7 +550,7 @@ test:do_catchsql_test( ]], { -- <index-1.3> - 1, "Unrecognized syntax near '1'" + 1, "Syntax error near '1'" -- <index-1.3> }) diff --git a/test/sql-tap/pragma.test.lua b/test/sql-tap/pragma.test.lua index b3fc207..14d622f 100755 --- a/test/sql-tap/pragma.test.lua +++ b/test/sql-tap/pragma.test.lua @@ -43,7 +43,7 @@ test:do_catchsql_test( [[ pragma sql_default_engine 'memtx'; ]], { - 1, "Unrecognized syntax near ''memtx''" + 1, "Syntax error near ''memtx''" }) test:do_catchsql_test( @@ -51,7 +51,7 @@ test:do_catchsql_test( [[ pragma sql_default_engine 1; ]], { - 1, "Unrecognized syntax near '1'" + 1, "Syntax error near '1'" }) -- diff --git a/test/sql-tap/select1.test.lua b/test/sql-tap/select1.test.lua index 57f3fcb..d73429a 100755 --- a/test/sql-tap/select1.test.lua +++ b/test/sql-tap/select1.test.lua @@ -1406,7 +1406,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 WHERE f2=; ]], { -- <select1-7.1> - 1, [[Unrecognized syntax near ';']] + 1, [[Syntax error near ';']] -- </select1-7.1> }) @@ -1438,7 +1438,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 ORDER BY; ]], { -- <select1-7.4> - 1, [[Unrecognized syntax near ';']] + 1, [[Syntax error near ';']] -- </select1-7.4> }) @@ -1468,7 +1468,7 @@ test:do_catchsql_test( SELECT count(f1,f2+) FROM test1; ]], { -- <select1-7.7> - 1, [[Unrecognized syntax near ')']] + 1, [[Syntax error near ')']] -- </select1-7.7> }) @@ -1478,7 +1478,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 ORDER BY f2, f1+; ]], { -- <select1-7.8> - 1, [[Unrecognized syntax near ';']] + 1, [[Syntax error near ';']] -- </select1-7.8> }) diff --git a/test/sql-tap/select3.test.lua b/test/sql-tap/select3.test.lua index 6ae3135..9fb825f 100755 --- a/test/sql-tap/select3.test.lua +++ b/test/sql-tap/select3.test.lua @@ -190,7 +190,7 @@ test:do_catchsql_test("select3-2.14", [[ SELECT log, count(*) FROM t1 GROUP BY; ]], { -- <select3-2.14> - 1, [[Unrecognized syntax near ';']] + 1, [[Syntax error near ';']] -- </select3-2.14> }) diff --git a/test/sql-tap/start-transaction.test.lua b/test/sql-tap/start-transaction.test.lua index feb55a2..c5703d4 100755 --- a/test/sql-tap/start-transaction.test.lua +++ b/test/sql-tap/start-transaction.test.lua @@ -21,7 +21,7 @@ test:do_catchsql_test( COMMIT; ]], { -- <start-transaction-1.0> - 1, "Unrecognized syntax near 'BEGIN'" + 1, "Syntax error near 'BEGIN'" -- <start-transaction-1.0> }) @@ -46,7 +46,7 @@ test:do_catchsql_test( COMMIT; ]], { -- <start-transaction-1.1> - 1, "Unrecognized syntax near 'BEGIN'" + 1, "Syntax error near 'BEGIN'" -- <start-transaction-1.1> }) diff --git a/test/sql-tap/table.test.lua b/test/sql-tap/table.test.lua index c487e1e..770d00c 100755 --- a/test/sql-tap/table.test.lua +++ b/test/sql-tap/table.test.lua @@ -620,7 +620,7 @@ test:do_catchsql_test( CREATE TEMP TABLE t1(a INTEGER PRIMARY KEY, b VARCHAR(10)); ]], { -- <temp> - 1, "Unrecognized syntax near 'TEMP'" + 1, "Syntax error near 'TEMP'" -- <temp> }) @@ -630,7 +630,7 @@ test:do_catchsql_test( CREATE TEMPORARY TABLE t1(a INTEGER PRIMARY KEY, b VARCHAR(10)); ]], { -- <temporary> - 1, "Unrecognized syntax near 'TEMPORARY'" + 1, "Syntax error near 'TEMPORARY'" -- <temporary> }) diff --git a/test/sql-tap/tokenize.test.lua b/test/sql-tap/tokenize.test.lua index 0c79f75..b1a097e 100755 --- a/test/sql-tap/tokenize.test.lua +++ b/test/sql-tap/tokenize.test.lua @@ -145,7 +145,7 @@ test:do_catchsql_test( [[ SELECT 1, 2 /*]], { -- <tokenize-2.1> - 1, [[Unrecognized syntax near '*']] + 1, [[Syntax error near '*']] -- </tokenize-2.1> }) diff --git a/test/sql-tap/trigger1.test.lua b/test/sql-tap/trigger1.test.lua index d0edcd7..2984d4c 100755 --- a/test/sql-tap/trigger1.test.lua +++ b/test/sql-tap/trigger1.test.lua @@ -72,7 +72,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-1.1.3> - 1, [[Unrecognized syntax near 'STATEMENT']] + 1, [[Syntax error near 'STATEMENT']] -- </trigger1-1.1.3> }) @@ -297,7 +297,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-2.1> - 1, [[Unrecognized syntax near ';']] + 1, [[Syntax error near ';']] -- </trigger1-2.1> }) @@ -310,7 +310,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-2.2> - 1, [[Unrecognized syntax near ';']] + 1, [[Syntax error near ';']] -- </trigger1-2.2> }) diff --git a/test/sql-tap/view.test.lua b/test/sql-tap/view.test.lua index 2808ac7..72fdab8 100755 --- a/test/sql-tap/view.test.lua +++ b/test/sql-tap/view.test.lua @@ -961,7 +961,7 @@ test:do_catchsql_test( DROP VIEW main.nosuchview ]], { -- <view-17.2> - 1, "Unrecognized syntax near '.'" + 1, "Syntax error near '.'" -- </view-17.2> }) diff --git a/test/sql-tap/with2.test.lua b/test/sql-tap/with2.test.lua index 9700729..ca3f00e 100755 --- a/test/sql-tap/with2.test.lua +++ b/test/sql-tap/with2.test.lua @@ -317,7 +317,7 @@ test:do_catchsql_test(4.1, [[ SELECT * FROM x; ]], { -- <4.1> - 1, [[Unrecognized syntax near ')']] + 1, [[Syntax error near ')']] -- </4.1> }) @@ -519,7 +519,7 @@ test:do_catchsql_test(6.2, [[ INSERT INTO t2 VALUES(1, 2,); ]], { -- <6.2> - 1, [[Unrecognized syntax near ')']] + 1, [[Syntax error near ')']] -- </6.2> }) @@ -555,7 +555,7 @@ test:do_catchsql_test(6.5, [[ DELETE FROM t2 WHERE; ]], { -- <6.5> - 1, [[Unrecognized syntax near ';']] + 1, [[Syntax error near ';']] -- </6.5> }) @@ -563,7 +563,7 @@ test:do_catchsql_test(6.6, [[ WITH x AS (SELECT * FROM t1) DELETE FROM t2 WHERE ]], { -- <6.6> - 1, "Unrecognized syntax near '\n'" + 1, "Syntax error near '\n'" -- </6.6> }) @@ -571,7 +571,7 @@ test:do_catchsql_test(6.7, [[ WITH x AS (SELECT * FROM t1) DELETE FROM t2 WHRE 1; ]], { -- <6.7> - 1, "Unrecognized syntax near 'WHRE'" + 1, "Syntax error near 'WHRE'" -- </6.7> }) @@ -579,7 +579,7 @@ test:do_catchsql_test(6.8, [[ WITH x AS (SELECT * FROM t1) UPDATE t2 SET a = 10, b = ; ]], { -- <6.8> - 1, "Unrecognized syntax near ';'" + 1, "Syntax error near ';'" -- </6.8> }) @@ -587,7 +587,7 @@ test:do_catchsql_test(6.9, [[ WITH x AS (SELECT * FROM t1) UPDATE t2 SET a = 10, b = 1 WHERE a===b; ]], { -- <6.9> - 1, "Unrecognized syntax near '='" + 1, "Syntax error near '='" -- </6.9> }) diff --git a/test/sql/checks.result b/test/sql/checks.result index cfce2e4..e31964c 100644 --- a/test/sql/checks.result +++ b/test/sql/checks.result @@ -30,7 +30,7 @@ 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: - Unrecognized syntax near ''<'')' + Syntax error near ''<'')' ... opts = {checks = {{expr = 'X>5'}}} --- diff --git a/test/sql/collation.result b/test/sql/collation.result index bad265d..fbdb1b8 100644 --- a/test/sql/collation.result +++ b/test/sql/collation.result @@ -14,23 +14,23 @@ box.sql.execute('pragma sql_default_engine=\''..engine..'\'') -- All of these tests should throw error "near "COLLATE": syntax error" box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY;") --- -- error: Unrecognized syntax near 'COLLATE' +- error: Syntax error near 'COLLATE' ... box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY OFFSET 1;") --- -- error: Unrecognized syntax near 'COLLATE' +- error: Syntax error near 'COLLATE' ... box.sql.execute("SELECT 1 LIMIT 1 OFFSET 1 COLLATE BINARY;") --- -- error: Unrecognized syntax near 'COLLATE' +- error: Syntax error near 'COLLATE' ... box.sql.execute("SELECT 1 LIMIT 1, 1 COLLATE BINARY;") --- -- error: Unrecognized syntax near 'COLLATE' +- error: Syntax error near 'COLLATE' ... box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY, 1;") --- -- error: Unrecognized syntax near 'COLLATE' +- error: Syntax error near 'COLLATE' ... -- gh-3052: upper/lower support only default locale -- For tr-TR result depends on collation @@ -102,7 +102,7 @@ cn = remote.connect(box.cfg.listen) ... cn:execute('select 1 limit ? collate not_exist', {1}) --- -- error: 'Failed to execute SQL statement: Unrecognized syntax near ''COLLATE''' +- error: 'Failed to execute SQL statement: Syntax error near ''COLLATE''' ... cn:close() --- diff --git a/test/sql/gh-3888-values-blob-assert.result b/test/sql/gh-3888-values-blob-assert.result index 600acf7..9045572 100644 --- a/test/sql/gh-3888-values-blob-assert.result +++ b/test/sql/gh-3888-values-blob-assert.result @@ -16,20 +16,20 @@ box.sql.execute('pragma sql_default_engine=\''..engine..'\'') -- check 'VALUES' against typedef keywords (should fail) box.sql.execute('VALUES(blob)') --- -- error: Unrecognized syntax near 'blob' +- error: Syntax error near 'blob' ... box.sql.execute('VALUES(float)') --- -- error: Unrecognized syntax near 'float' +- error: Syntax error near 'float' ... -- check 'SELECT' against typedef keywords (should fail) box.sql.execute('SELECT blob') --- -- error: Unrecognized syntax near 'blob' +- error: Syntax error near 'blob' ... box.sql.execute('SELECT float') --- -- error: Unrecognized syntax near 'float' +- error: Syntax error near 'float' ... -- check 'VALUES' against ID (should fail) box.sql.execute('VALUES(TheColumnName)') diff --git a/test/sql/iproto.result b/test/sql/iproto.result index 48f877a..938aea9 100644 --- a/test/sql/iproto.result +++ b/test/sql/iproto.result @@ -96,7 +96,7 @@ cn:execute('insert into not_existing_table values ("kek")') ... cn:execute('insert qwerty gjsdjq q qwd qmq;; q;qwd;') --- -- error: 'Failed to execute SQL statement: Unrecognized syntax near ''qwerty''' +- error: 'Failed to execute SQL statement: Syntax error near ''qwerty''' ... -- Empty result. cn:execute('select id as identifier from test where a = 5;') @@ -109,7 +109,7 @@ cn:execute('select id as identifier from test where a = 5;') -- netbox API errors. cn:execute(100) --- -- error: 'Failed to execute SQL statement: Unrecognized syntax near ''100''' +- error: 'Failed to execute SQL statement: Syntax error near ''100''' ... cn:execute('select 1', nil, {dry_run = true}) --- @@ -567,7 +567,7 @@ cn:execute('drop table if exists test3') -- cn:execute('select ?1, ?2, ?3', {1, 2, 3}) --- -- error: 'Failed to execute SQL statement: Unrecognized syntax near ''?1''' +- error: 'Failed to execute SQL statement: Syntax error near ''?1''' ... cn:execute('select $name, $name2', {1, 2}) --- diff --git a/test/sql/types.result b/test/sql/types.result index 82f2873..98464f8 100644 --- a/test/sql/types.result +++ b/test/sql/types.result @@ -13,7 +13,7 @@ box.sql.execute("CREATE TABLE t1 (id PRIMARY KEY);") ... box.sql.execute("CREATE TABLE t1 (a, id INT PRIMARY KEY);") --- -- error: Unrecognized syntax near ',' +- error: Syntax error near ',' ... box.sql.execute("CREATE TABLE t1 (id PRIMARY KEY, a INT);") --- @@ -22,7 +22,7 @@ box.sql.execute("CREATE TABLE t1 (id PRIMARY KEY, a INT);") ... box.sql.execute("CREATE TABLE t1 (id INT PRIMARY KEY, a);") --- -- error: Unrecognized syntax near ')' +- error: Syntax error near ')' ... box.sql.execute("CREATE TABLE t1 (id INT PRIMARY KEY, a INT, b UNIQUE);") --- New version: commit 8bd6b8f7e60a581d62673d548ecf5a3039d16d6e Author: Mergen Imeev <imeevma@gmail.com> Date: Thu Feb 21 11:25:24 2019 +0300 sql: rework syntax errors This patch reworks SQL syntax errors. After this patch, these error will be set as Tarantool errors. Part of #3965 diff --git a/src/box/errcode.h b/src/box/errcode.h index a1fcf01..f2f47c0 100644 --- a/src/box/errcode.h +++ b/src/box/errcode.h @@ -231,6 +231,13 @@ struct errcode_record { /*176 */_(ER_SQL_CANT_RESOLVE_FIELD, "Can’t resolve field '%s'") \ /*177 */_(ER_INDEX_EXISTS_IN_SPACE, "Index '%s' already exists in space '%s'") \ /*178 */_(ER_INCONSISTENT_TYPES, "Inconsistent types: expected %s got %s") \ + /*179 */_(ER_SQL_SYNTAX, "Syntax error in %s: %s") \ + /*180 */_(ER_SQL_STACK_OVERFLOW, "Failed to parse SQL statement: parser stack limit reached") \ + /*181 */_(ER_SQL_SELECT_WILDCARD, "Failed to expand '*' in SELECT statement without FROM clause") \ + /*182 */_(ER_SQL_STATEMENT_EMPTY, "Failed to execute an empty SQL statement") \ + /*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'") \ /* * !IMPORTANT! Please follow instructions at start of the file diff --git a/src/box/sql/build.c b/src/box/sql/build.c index e9851d9..f112c9f 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -2823,9 +2823,9 @@ sqlSrcListAppendFromTerm(Parse * pParse, /* Parsing context */ struct SrcList_item *pItem; sql *db = pParse->db; if (!p && (pOn || pUsing)) { - sqlErrorMsg(pParse, "a JOIN clause is required before %s", - (pOn ? "ON" : "USING") - ); + diag_set(ClientError, ER_SQL_SYNTAX, "FROM clause", + "a JOIN clause is required before ON and USING"); + sql_parser_error(pParse); goto append_from_error; } p = sqlSrcListAppend(db, p, pTable); diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y index e2504c4..f980945 100644 --- a/src/box/sql/parse.y +++ b/src/box/sql/parse.y @@ -33,13 +33,16 @@ UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ if (yypParser->is_fallback_failed && TOKEN.isReserved) { - sqlErrorMsg(pParse, "keyword \"%T\" is reserved", &TOKEN); + diag_set(ClientError, ER_SQL_KEYWORD_IS_RESERVED, TOKEN.n, TOKEN.z, + TOKEN.n, TOKEN.z); } else { - sqlErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); + diag_set(ClientError, ER_SQL_UNRECOGNIZED_SYNTAX, TOKEN.n, TOKEN.z); } + sql_parser_error(pParse); } %stack_overflow { - sqlErrorMsg(pParse, "parser stack overflow"); + diag_set(ClientError, ER_SQL_STACK_OVERFLOW); + sql_parser_error(pParse); } // The name of the generated procedure that implements the parser @@ -114,7 +117,8 @@ ecmd ::= explain cmdx SEMI. { sql_finish_coding(pParse); } ecmd ::= SEMI. { - sqlErrorMsg(pParse, "syntax error: empty request"); + diag_set(ClientError, ER_SQL_STATEMENT_EMPTY); + sql_parser_error(pParse); } explain ::= . explain ::= EXPLAIN. { pParse->explain = 1; } @@ -227,7 +231,8 @@ columnname(A) ::= nm(A) typedef(Y). {sqlAddColumn(pParse,&A,&Y);} %type nm {Token} nm(A) ::= id(A). { if(A.isReserved) { - sqlErrorMsg(pParse, "keyword \"%T\" is reserved", &A); + diag_set(ClientError, ER_SQL_KEYWORD_IS_RESERVED, A.n, A.z, A.n, A.z); + sql_parser_error(pParse); } } @@ -897,14 +902,17 @@ expr(A) ::= VARIABLE(X). { } else if (!(X.z[0]=='#' && sqlIsdigit(X.z[1]))) { u32 n = X.n; spanExpr(&A, pParse, TK_VARIABLE, X); - if (A.pExpr->u.zToken[0] == '?' && n > 1) - sqlErrorMsg(pParse, "near \"%T\": syntax error", &t); - else - sqlExprAssignVarNumber(pParse, A.pExpr, n); + if (A.pExpr->u.zToken[0] == '?' && n > 1) { + diag_set(ClientError, ER_SQL_UNRECOGNIZED_SYNTAX, t.n, t.z); + sql_parser_error(pParse); + } else { + sqlExprAssignVarNumber(pParse, A.pExpr, n); + } }else{ assert( t.n>=2 ); spanSet(&A, &t, &t); - sqlErrorMsg(pParse, "near \"%T\": syntax error", &t); + diag_set(ClientError, ER_SQL_UNRECOGNIZED_SYNTAX, t.n, t.z); + sql_parser_error(pParse); A.pExpr = NULL; } } @@ -1374,14 +1382,15 @@ trnm(A) ::= nm DOT nm(X). { // tridxby ::= . tridxby ::= INDEXED BY nm. { - sqlErrorMsg(pParse, - "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " - "within triggers"); + diag_set(ClientError, ER_SQL_SYNTAX, "trigger body", "the INDEXED BY clause "\ + "is not allowed on UPDATE or DELETE statements within triggers"); + sql_parser_error(pParse); } tridxby ::= NOT INDEXED. { - sqlErrorMsg(pParse, - "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " - "within triggers"); + diag_set(ClientError, ER_SQL_SYNTAX, "trigger body", "the NOT INDEXED "\ + "clause is not allowed on UPDATE or DELETE statements within "\ + "triggers"); + sql_parser_error(pParse); } diff --git a/src/box/sql/select.c b/src/box/sql/select.c index 782da1f..ef24760 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -2092,8 +2092,9 @@ computeLimitRegisters(Parse * pParse, Select * p, int iBreak) if((p->pLimit->flags & EP_Collate) != 0 || (p->pOffset != NULL && (p->pOffset->flags & EP_Collate) != 0)) { - sqlErrorMsg(pParse, "near \"COLLATE\": "\ - "syntax error"); + diag_set(ClientError, ER_SQL_UNRECOGNIZED_SYNTAX, + sizeof("COLLATE"), "COLLATE"); + sql_parser_error(pParse); return; } p->iLimit = iLimit = ++pParse->nMem; @@ -5049,11 +5050,11 @@ selectExpander(Walker * pWalker, Select * p) diag_set(ClientError, ER_NO_SUCH_SPACE, zTName); - sql_parser_error(pParse); } else { - sqlErrorMsg(pParse, - "no tables specified"); + diag_set(ClientError, + ER_SQL_SELECT_WILDCARD); } + sql_parser_error(pParse); } } } diff --git a/src/box/sql/tokenize.c b/src/box/sql/tokenize.c index abf837d..58685c4 100644 --- a/src/box/sql/tokenize.c +++ b/src/box/sql/tokenize.c @@ -506,9 +506,10 @@ sqlRunParser(Parse * pParse, const char *zSql, char **pzErrMsg) break; } if (tokenType == TK_ILLEGAL) { - sqlErrorMsg(pParse, - "unrecognized token: \"%T\"", - &pParse->sLastToken); + diag_set(ClientError, ER_SQL_UNKNOWN_TOKEN, + pParse->sLastToken.n, + pParse->sLastToken.z); + sql_parser_error(pParse); break; } } else { diff --git a/test/box/misc.result b/test/box/misc.result index d9f5dd5..27579c6 100644 --- a/test/box/misc.result +++ b/test/box/misc.result @@ -508,6 +508,12 @@ t; 176: box.error.SQL_CANT_RESOLVE_FIELD 177: box.error.INDEX_EXISTS_IN_SPACE 178: box.error.INCONSISTENT_TYPES + 179: box.error.SQL_SYNTAX + 180: box.error.SQL_STACK_OVERFLOW + 181: box.error.SQL_SELECT_WILDCARD + 182: box.error.SQL_STATEMENT_EMPTY + 184: box.error.SQL_UNRECOGNIZED_SYNTAX + 185: box.error.SQL_UNKNOWN_TOKEN ... test_run:cmd("setopt delimiter ''"); --- diff --git a/test/sql-tap/alter2.test.lua b/test/sql-tap/alter2.test.lua index e219a36..beb6f5d 100755 --- a/test/sql-tap/alter2.test.lua +++ b/test/sql-tap/alter2.test.lua @@ -223,7 +223,7 @@ test:do_catchsql_test( ALTER TABLE child ADD CONSTRAINT fk FOREIGN KEY REFERENCES child(id); ]], { -- <alter2-4.1> - 1, "near \"REFERENCES\": syntax error" + 1, "Syntax error near 'REFERENCES'" -- </alter2-4.1> }) @@ -233,7 +233,7 @@ test:do_catchsql_test( ALTER TABLE child ADD CONSTRAINT fk () FOREIGN KEY REFERENCES child(id); ]], { -- <alter2-4.1> - 1, "near \"(\": syntax error" + 1, "Syntax error near '('" -- </alter2-4.2> }) diff --git a/test/sql-tap/blob.test.lua b/test/sql-tap/blob.test.lua index c7b328a..e2cc4d9 100755 --- a/test/sql-tap/blob.test.lua +++ b/test/sql-tap/blob.test.lua @@ -72,7 +72,7 @@ test:do_catchsql_test( SELECT X'01020k304', 100 ]], { -- <blob-1.4> - 1, [[unrecognized token: "X'01020k304'"]] + 1, [[Syntax error: unrecognized token: 'X'01020k304'']] -- </blob-1.4> }) @@ -81,7 +81,7 @@ test:do_catchsql_test( [[ SELECT X'01020, 100]], { -- <blob-1.5> - 1, [[unrecognized token: "X'01020, 100"]] + 1, [[Syntax error: unrecognized token: 'X'01020, 100']] -- </blob-1.5> }) @@ -91,7 +91,7 @@ test:do_catchsql_test( SELECT X'01020 100' ]], { -- <blob-1.6> - 1, [[unrecognized token: "X'01020 100'"]] + 1, [[Syntax error: unrecognized token: 'X'01020 100'']] -- </blob-1.6> }) @@ -101,7 +101,7 @@ test:do_catchsql_test( SELECT X'01001' ]], { -- <blob-1.7> - 1, [[unrecognized token: "X'01001'"]] + 1, [[Syntax error: unrecognized token: 'X'01001'']] -- </blob-1.7> }) @@ -111,7 +111,7 @@ test:do_catchsql_test( SELECT x'012/45' ]], { -- <blob-1.8> - 1, [[unrecognized token: "x'012/45'"]] + 1, [[Syntax error: unrecognized token: 'x'012/45'']] -- </blob-1.8> }) @@ -121,7 +121,7 @@ test:do_catchsql_test( SELECT x'012:45' ]], { -- <blob-1.9> - 1, [[unrecognized token: "x'012:45'"]] + 1, [[Syntax error: unrecognized token: 'x'012:45'']] -- </blob-1.9> }) @@ -131,7 +131,7 @@ test:do_catchsql_test( SELECT x'012@45' ]], { -- <blob-1.10> - 1, [[unrecognized token: "x'012@45'"]] + 1, [[Syntax error: unrecognized token: 'x'012@45'']] -- </blob-1.10> }) @@ -141,7 +141,7 @@ test:do_catchsql_test( SELECT x'012G45' ]], { -- <blob-1.11> - 1, [[unrecognized token: "x'012G45'"]] + 1, [[Syntax error: unrecognized token: 'x'012G45'']] -- </blob-1.11> }) @@ -151,7 +151,7 @@ test:do_catchsql_test( SELECT x'012`45' ]], { -- <blob-1.12> - 1, [[unrecognized token: "x'012`45'"]] + 1, [[Syntax error: unrecognized token: 'x'012`45'']] -- </blob-1.12> }) @@ -161,7 +161,7 @@ test:do_catchsql_test( SELECT x'012g45' ]], { -- <blob-1.13> - 1, [[unrecognized token: "x'012g45'"]] + 1, [[Syntax error: unrecognized token: 'x'012g45'']] -- </blob-1.13> }) diff --git a/test/sql-tap/check.test.lua b/test/sql-tap/check.test.lua index 2bb1b2e..b6b7fc7 100755 --- a/test/sql-tap/check.test.lua +++ b/test/sql-tap/check.test.lua @@ -281,7 +281,7 @@ test:do_catchsql_test( ); ]], { -- <check-2.10> - 1,"near \",\": syntax error" + 1,"Syntax error near ','" -- </check-2.10> }) @@ -295,7 +295,7 @@ test:do_catchsql_test( ); ]], { -- <check-2.10> - 1,"near \",\": syntax error" + 1,"Syntax error near ','" -- </check-2.10> }) @@ -781,7 +781,7 @@ test:do_catchsql_test( ON CONFLICT REPLACE) ]], { -- <9.1> - 1, "keyword \"ON\" is reserved" + 1, "Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier." -- </9.1> }) @@ -792,7 +792,7 @@ test:do_catchsql_test( ON CONFLICT ABORT) ]], { -- <9.2> - 1, "keyword \"ON\" is reserved" + 1, "Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier." -- </9.2> }) @@ -803,7 +803,7 @@ test:do_catchsql_test( ON CONFLICT ROLLBACK) ]], { -- <9.3> - 1, "keyword \"ON\" is reserved" + 1, "Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier." -- </9.3> }) diff --git a/test/sql-tap/colname.test.lua b/test/sql-tap/colname.test.lua index b7dd2b7..29fdf13 100755 --- a/test/sql-tap/colname.test.lua +++ b/test/sql-tap/colname.test.lua @@ -576,7 +576,7 @@ for i, val in ipairs(data) do end local data2 = { - {[['a']],{1, "/syntax error/"}}, -- because ' is delimiter for strings + {[['a']],{1, "/Syntax error/"}}, -- because ' is delimiter for strings {[[`a`]],{1, "/unrecognized token/"}}, -- because ` is undefined symbol {"[a]",{1, "/unrecognized token/"}} -- because [ is undefined symbol } diff --git a/test/sql-tap/count.test.lua b/test/sql-tap/count.test.lua index fbd60da..cf5bfcc 100755 --- a/test/sql-tap/count.test.lua +++ b/test/sql-tap/count.test.lua @@ -128,7 +128,7 @@ test:do_catchsql_test( SELECT count(DISTINCT *) FROM t2 ]], { -- <count-2.2> - 1, [[near "*": syntax error]] + 1, [[Syntax error near '*']] -- </count-2.2> }) diff --git a/test/sql-tap/default.test.lua b/test/sql-tap/default.test.lua index e0dbb91..9be4614 100755 --- a/test/sql-tap/default.test.lua +++ b/test/sql-tap/default.test.lua @@ -224,7 +224,7 @@ test:do_catchsql_test( CREATE TABLE t6(id INTEGER PRIMARY KEY, b TEXT DEFAULT id); ]], { -- <default-5.2> - 1, "near \"id\": syntax error" + 1, "Syntax error near 'id'" -- </default-5.2> }) @@ -234,7 +234,7 @@ test:do_catchsql_test( CREATE TABLE t6(id INTEGER PRIMARY KEY, b TEXT DEFAULT "id"); ]], { -- <default-5.3> - 1, "near \"\"id\"\": syntax error" + 1, "Syntax error near '\"id\"'" -- </default-5.3> }) diff --git a/test/sql-tap/e_select1.test.lua b/test/sql-tap/e_select1.test.lua index 75fe81e..e190ad7 100755 --- a/test/sql-tap/e_select1.test.lua +++ b/test/sql-tap/e_select1.test.lua @@ -105,7 +105,7 @@ test:do_catchsql_test( SELECT count(*) FROM t1, t2 USING (a) ON (t1.a=t2.a) ]], { -- <e_select-0.1.5> - 1, [[keyword "ON" is reserved]] + 1, [[Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier.]] -- </e_select-0.1.5> }) @@ -807,14 +807,14 @@ test:do_select_tests( -- FROM clause. -- data = { - {"1.1", "SELECT a, b, c FROM z1 WHERE *", 'near \"*\": syntax error'}, - {"1.2", "SELECT a, b, c FROM z1 GROUP BY *", 'near \"*\": syntax error'}, - {"1.3", "SELECT 1 + * FROM z1", 'near \"*\": syntax error'}, - {"1.4", "SELECT * + 1 FROM z1", 'near \"+\": syntax error'}, - {"2.1", "SELECT *", 'no tables specified'}, - {"2.2", "SELECT * WHERE 1", 'no tables specified'}, - {"2.3", "SELECT * WHERE 0", 'no tables specified'}, - {"2.4", "SELECT count(*), *", 'no tables specified' } + {"1.1", "SELECT a, b, c FROM z1 WHERE *", "Syntax error near '*'"}, + {"1.2", "SELECT a, b, c FROM z1 GROUP BY *", "Syntax error near '*'"}, + {"1.3", "SELECT 1 + * FROM z1", "Syntax error near '*'"}, + {"1.4", "SELECT * + 1 FROM z1", "Syntax error near '+'"}, + {"2.1", "SELECT *", "Failed to expand '*' in SELECT statement without FROM clause"}, + {"2.2", "SELECT * WHERE 1", "Failed to expand '*' in SELECT statement without FROM clause"}, + {"2.3", "SELECT * WHERE 0", "Failed to expand '*' in SELECT statement without FROM clause"}, + {"2.4", "SELECT count(*), *", "Failed to expand '*' in SELECT statement without FROM clause"} } for _, val in ipairs(data) do diff --git a/test/sql-tap/gh2168-temp-tables.test.lua b/test/sql-tap/gh2168-temp-tables.test.lua index 536e187..3b29c9e 100755 --- a/test/sql-tap/gh2168-temp-tables.test.lua +++ b/test/sql-tap/gh2168-temp-tables.test.lua @@ -8,7 +8,7 @@ test:do_catchsql_test( CREATE TEMP TABLE tmp1 (id INTEGER PRIMARY KEY); ]], { -- <trigger2-10.1> - 1, "near \"TEMP\": syntax error" + 1, "Syntax error near 'TEMP'" -- <trigger2-10.1> }); @@ -23,7 +23,7 @@ test:do_catchsql_test( END; ]], { -- <trigger2-10.1> - 1, "near \"TEMP\": syntax error" + 1, "Syntax error near 'TEMP'" -- <trigger2-10.1> }); diff --git a/test/sql-tap/identifier_case.test.lua b/test/sql-tap/identifier_case.test.lua index 923d5e6..74c7ce2 100755 --- a/test/sql-tap/identifier_case.test.lua +++ b/test/sql-tap/identifier_case.test.lua @@ -238,7 +238,7 @@ test:do_catchsql_test( data = { { 1, [[ 'a' < 'b' collate binary ]], {1, "Collation 'BINARY' does not exist"}}, { 2, [[ 'a' < 'b' collate "binary" ]], {0, {1}}}, - { 3, [[ 'a' < 'b' collate 'binary' ]], {1, [[near "'binary'": syntax error]]}}, + { 3, [[ 'a' < 'b' collate 'binary' ]], {1, [[Syntax error near ''binary'']]}}, { 4, [[ 'a' < 'b' collate "unicode" ]], {0, {1}}}, { 5, [[ 5 < 'b' collate "unicode" ]], {0, {1}}}, { 6, [[ 5 < 'b' collate unicode ]], {1,"Collation 'UNICODE' does not exist"}}, diff --git a/test/sql-tap/index-info.test.lua b/test/sql-tap/index-info.test.lua index d052e8c..a5ed9a9 100755 --- a/test/sql-tap/index-info.test.lua +++ b/test/sql-tap/index-info.test.lua @@ -26,7 +26,7 @@ test:do_catchsql_test( "index-info-1.2", "PRAGMA index_info = t1.a;", { - 1, "near \".\": syntax error", + 1, "Syntax error near '.'", }) -- Case: single column index with an integer column. diff --git a/test/sql-tap/index1.test.lua b/test/sql-tap/index1.test.lua index 2ed1451..7fec294 100755 --- a/test/sql-tap/index1.test.lua +++ b/test/sql-tap/index1.test.lua @@ -994,7 +994,7 @@ test:do_catchsql_test( CREATE INDEX temp.i21 ON t6(c); ]], { -- <index-21.1> - 1, "near \".\": syntax error" + 1, "Syntax error near '.'" -- </index-21.1> }) diff --git a/test/sql-tap/index7.test.lua b/test/sql-tap/index7.test.lua index 0a7fe60..7dd9efa 100755 --- a/test/sql-tap/index7.test.lua +++ b/test/sql-tap/index7.test.lua @@ -292,7 +292,7 @@ test:do_catchsql_test( CREATE TABLE t1 (a INTEGER PRIMARY KEY, b INTEGER); CREATE UNIQUE INDEX i ON t1 (a) WHERE a = 3; ]], { - 1, "keyword \"WHERE\" is reserved" + 1, "Keyword 'WHERE' is reserved. Please use double quotes if 'WHERE' is an identifier." }) -- Currently, when a user tries to create index (or primary key, diff --git a/test/sql-tap/join.test.lua b/test/sql-tap/join.test.lua index bda4091..df272a9 100755 --- a/test/sql-tap/join.test.lua +++ b/test/sql-tap/join.test.lua @@ -570,7 +570,7 @@ test:do_catchsql_test( SELECT * FROM t1 USING(a) ]], { -- <join-3.5> - 1, "a JOIN clause is required before USING" + 1, "Syntax error in FROM clause: a JOIN clause is required before ON and USING" -- </join-3.5> }) diff --git a/test/sql-tap/keyword1.test.lua b/test/sql-tap/keyword1.test.lua index 6895dc1..33873d1 100755 --- a/test/sql-tap/keyword1.test.lua +++ b/test/sql-tap/keyword1.test.lua @@ -237,7 +237,7 @@ for _, kw in ipairs(bannedkws) do test:do_catchsql_test( "bannedkw1-"..kw..".1", query, { - 1, 'keyword "'..kw..'" is reserved' + 1, "Keyword '"..kw.."' is reserved. Please use double quotes if '"..kw.."' is an identifier." }) end diff --git a/test/sql-tap/misc1.test.lua b/test/sql-tap/misc1.test.lua index 4358b58..1b288da 100755 --- a/test/sql-tap/misc1.test.lua +++ b/test/sql-tap/misc1.test.lua @@ -271,7 +271,7 @@ test:do_catchsql_test( UPDATE t3 SET a=0 WHEREwww b=2; ]], { -- <misc1-5.1> - 1, [[near "WHEREwww": syntax error]] + 1, [[Syntax error near 'WHEREwww']] -- </misc1-5.1> }) @@ -413,7 +413,7 @@ test:do_catchsql_test( SELECT *; ]], { -- <misc1-8.1> - 1, "no tables specified" + 1, "Failed to expand '*' in SELECT statement without FROM clause" -- </misc1-8.1> }) @@ -1037,7 +1037,7 @@ test:do_catchsql_test( select''like''like''like#0; ]], { -- <misc1-21.1> - 1, [[near "#0": syntax error]] + 1, [[Syntax error near '#0']] -- </misc1-21.1> }) @@ -1047,7 +1047,7 @@ test:do_catchsql_test( VALUES(0,0x0MATCH#0; ]], { -- <misc1-21.2> - 1, [[near ";": syntax error]] + 1, [[Syntax error near ';']] -- </misc1-21.2> }) diff --git a/test/sql-tap/misc5.test.lua b/test/sql-tap/misc5.test.lua index 0852741..5f98f21 100755 --- a/test/sql-tap/misc5.test.lua +++ b/test/sql-tap/misc5.test.lua @@ -299,7 +299,7 @@ test:do_test( return test:catchsql(sql) end, { -- <misc5-7.1> - 1, "parser stack overflow" + 1, "Failed to parse SQL statement: parser stack limit reached" -- </misc5-7.1> }) @@ -347,7 +347,7 @@ test:do_catchsql_test( SELECT 123abc ]], { -- <misc5-10.1> - 1, [[unrecognized token: "123abc"]] + 1, [[Syntax error: unrecognized token: '123abc']] -- </misc5-10.1> }) @@ -357,7 +357,7 @@ test:do_catchsql_test( SELECT 1*123.4e5ghi; ]], { -- <misc5-10.2> - 1, [[unrecognized token: "123.4e5ghi"]] + 1, [[Syntax error: unrecognized token: '123.4e5ghi']] -- </misc5-10.2> }) diff --git a/test/sql-tap/null.test.lua b/test/sql-tap/null.test.lua index 66135d3..50a2cfb 100755 --- a/test/sql-tap/null.test.lua +++ b/test/sql-tap/null.test.lua @@ -517,7 +517,7 @@ test:do_catchsql_test( ]], { -- <index-1.3> - 1, "near \"1\": syntax error" + 1, "Syntax error near '1'" -- <index-1.3> }) @@ -528,7 +528,7 @@ test:do_catchsql_test( ]], { -- <index-1.3> - 1, "near \"1\": syntax error" + 1, "Syntax error near '1'" -- <index-1.3> }) @@ -539,7 +539,7 @@ test:do_catchsql_test( ]], { -- <index-1.3> - 1, "near \"1\": syntax error" + 1, "Syntax error near '1'" -- <index-1.3> }) @@ -550,7 +550,7 @@ test:do_catchsql_test( ]], { -- <index-1.3> - 1, "near \"1\": syntax error" + 1, "Syntax error near '1'" -- <index-1.3> }) diff --git a/test/sql-tap/pragma.test.lua b/test/sql-tap/pragma.test.lua index 975a0e9..14d622f 100755 --- a/test/sql-tap/pragma.test.lua +++ b/test/sql-tap/pragma.test.lua @@ -43,7 +43,7 @@ test:do_catchsql_test( [[ pragma sql_default_engine 'memtx'; ]], { - 1, 'near \"\'memtx\'\": syntax error' + 1, "Syntax error near ''memtx''" }) test:do_catchsql_test( @@ -51,7 +51,7 @@ test:do_catchsql_test( [[ pragma sql_default_engine 1; ]], { - 1, 'near \"1\": syntax error' + 1, "Syntax error near '1'" }) -- diff --git a/test/sql-tap/select1.test.lua b/test/sql-tap/select1.test.lua index 6c35b6f..d73429a 100755 --- a/test/sql-tap/select1.test.lua +++ b/test/sql-tap/select1.test.lua @@ -1406,7 +1406,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 WHERE f2=; ]], { -- <select1-7.1> - 1, [[near ";": syntax error]] + 1, [[Syntax error near ';']] -- </select1-7.1> }) @@ -1416,7 +1416,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 UNION SELECT WHERE; ]], { -- <select1-7.2> - 1, [[keyword "WHERE" is reserved]] + 1, [[Keyword 'WHERE' is reserved. Please use double quotes if 'WHERE' is an identifier.]] -- </select1-7.2> }) @@ -1428,7 +1428,7 @@ test:do_catchsql_test( [[ SELECT f1 FROM test1 as "hi", test2 as]], { -- <select1-7.3> - 1, [[keyword "as" is reserved]] + 1, [[Keyword 'as' is reserved. Please use double quotes if 'as' is an identifier.]] -- </select1-7.3> }) @@ -1438,7 +1438,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 ORDER BY; ]], { -- <select1-7.4> - 1, [[near ";": syntax error]] + 1, [[Syntax error near ';']] -- </select1-7.4> }) @@ -1448,7 +1448,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 ORDER BY f1 desc, f2 where; ]], { -- <select1-7.5> - 1, [[keyword "where" is reserved]] + 1, [[Keyword 'where' is reserved. Please use double quotes if 'where' is an identifier.]] -- </select1-7.5> }) @@ -1458,7 +1458,7 @@ test:do_catchsql_test( SELECT count(f1,f2 FROM test1; ]], { -- <select1-7.6> - 1, [[keyword "FROM" is reserved]] + 1, [[Keyword 'FROM' is reserved. Please use double quotes if 'FROM' is an identifier.]] -- </select1-7.6> }) @@ -1468,7 +1468,7 @@ test:do_catchsql_test( SELECT count(f1,f2+) FROM test1; ]], { -- <select1-7.7> - 1, [[near ")": syntax error]] + 1, [[Syntax error near ')']] -- </select1-7.7> }) @@ -1478,7 +1478,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 ORDER BY f2, f1+; ]], { -- <select1-7.8> - 1, [[near ";": syntax error]] + 1, [[Syntax error near ';']] -- </select1-7.8> }) @@ -1488,7 +1488,7 @@ test:do_catchsql_test( SELECT f1 FROM test1 LIMIT 5+3 OFFSET 11 ORDER BY f2; ]], { -- <select1-7.9> - 1, [[keyword "ORDER" is reserved]] + 1, [[Keyword 'ORDER' is reserved. Please use double quotes if 'ORDER' is an identifier.]] -- </select1-7.9> }) @@ -2075,7 +2075,7 @@ test:do_catchsql_test( SELECT 1 FROM (SELECT *) ]], { -- <select1-16.1> - 1, "no tables specified" + 1, "Failed to expand '*' in SELECT statement without FROM clause" -- </select1-16.1> }) diff --git a/test/sql-tap/select3.test.lua b/test/sql-tap/select3.test.lua index e7e306e..9fb825f 100755 --- a/test/sql-tap/select3.test.lua +++ b/test/sql-tap/select3.test.lua @@ -182,7 +182,7 @@ test:do_catchsql_test("select3-2.13", [[ SELECT log, count(*) FROM t1 GROUP BY ORDER BY log; ]], { -- <select3-2.13> - 1, [[keyword "ORDER" is reserved]] + 1, [[Keyword 'ORDER' is reserved. Please use double quotes if 'ORDER' is an identifier.]] -- </select3-2.13> }) @@ -190,7 +190,7 @@ test:do_catchsql_test("select3-2.14", [[ SELECT log, count(*) FROM t1 GROUP BY; ]], { -- <select3-2.14> - 1, [[near ";": syntax error]] + 1, [[Syntax error near ';']] -- </select3-2.14> }) diff --git a/test/sql-tap/start-transaction.test.lua b/test/sql-tap/start-transaction.test.lua index 82356ae..c5703d4 100755 --- a/test/sql-tap/start-transaction.test.lua +++ b/test/sql-tap/start-transaction.test.lua @@ -21,7 +21,7 @@ test:do_catchsql_test( COMMIT; ]], { -- <start-transaction-1.0> - 1, "near \"BEGIN\": syntax error" + 1, "Syntax error near 'BEGIN'" -- <start-transaction-1.0> }) @@ -46,7 +46,7 @@ test:do_catchsql_test( COMMIT; ]], { -- <start-transaction-1.1> - 1, "near \"BEGIN\": syntax error" + 1, "Syntax error near 'BEGIN'" -- <start-transaction-1.1> }) @@ -94,7 +94,7 @@ test:do_catchsql_test( COMMIT TRANSACTION; ]], { -- <start-transaction-1.6> - 1, "keyword \"TRANSACTION\" is reserved" + 1, "Keyword 'TRANSACTION' is reserved. Please use double quotes if 'TRANSACTION' is an identifier." -- <start-transaction-1.6> }) @@ -119,7 +119,7 @@ test:do_catchsql_test( END; ]], { -- <start-transaction-1.8> - 1, "keyword \"END\" is reserved" + 1, "Keyword 'END' is reserved. Please use double quotes if 'END' is an identifier." -- <start-transaction-1.8> }) @@ -144,7 +144,7 @@ test:do_catchsql_test( END TRANSACTION; ]], { -- <start-transaction-1.10> - 1, "keyword \"END\" is reserved" + 1, "Keyword 'END' is reserved. Please use double quotes if 'END' is an identifier." -- <start-transaction-1.10> }) @@ -193,7 +193,7 @@ test:do_catchsql_test( COMMIT; ]], { -- <start-transaction-1.14> - 1, "keyword \"TRANSACTION\" is reserved" + 1, "Keyword 'TRANSACTION' is reserved. Please use double quotes if 'TRANSACTION' is an identifier." -- <start-transaction-1.14> }) @@ -246,7 +246,7 @@ test:do_catchsql_test( COMMIT; ]], { -- <start-transaction-1.18> - 1, "keyword \"TRANSACTION\" is reserved" + 1, "Keyword 'TRANSACTION' is reserved. Please use double quotes if 'TRANSACTION' is an identifier." -- <start-transaction-1.18> }) diff --git a/test/sql-tap/table.test.lua b/test/sql-tap/table.test.lua index 2bcc5aa..770d00c 100755 --- a/test/sql-tap/table.test.lua +++ b/test/sql-tap/table.test.lua @@ -620,7 +620,7 @@ test:do_catchsql_test( CREATE TEMP TABLE t1(a INTEGER PRIMARY KEY, b VARCHAR(10)); ]], { -- <temp> - 1, "near \"TEMP\": syntax error" + 1, "Syntax error near 'TEMP'" -- <temp> }) @@ -630,7 +630,7 @@ test:do_catchsql_test( CREATE TEMPORARY TABLE t1(a INTEGER PRIMARY KEY, b VARCHAR(10)); ]], { -- <temporary> - 1, "near \"TEMPORARY\": syntax error" + 1, "Syntax error near 'TEMPORARY'" -- <temporary> }) @@ -1253,7 +1253,7 @@ test:do_catchsql_test( ); ]], { -- <table-22.1> - 1,"keyword \"CONSTRAINT\" is reserved" + 1,"Keyword 'CONSTRAINT' is reserved. Please use double quotes if 'CONSTRAINT' is an identifier." -- </table-22.1> }) @@ -1318,7 +1318,7 @@ test:do_catchsql_test( ); ]], { -- <table-22.6> - 1,"keyword \"CONSTRAINT\" is reserved" + 1,"Keyword 'CONSTRAINT' is reserved. Please use double quotes if 'CONSTRAINT' is an identifier." -- </table-22.6> }) @@ -1332,7 +1332,7 @@ test:do_catchsql_test( ); ]], { -- <table-22.7> - 1,"keyword \"CONSTRAINT\" is reserved" + 1,"Keyword 'CONSTRAINT' is reserved. Please use double quotes if 'CONSTRAINT' is an identifier." -- </table-22.7> }) diff --git a/test/sql-tap/tkt3935.test.lua b/test/sql-tap/tkt3935.test.lua index e13391c..cc8fea7 100755 --- a/test/sql-tap/tkt3935.test.lua +++ b/test/sql-tap/tkt3935.test.lua @@ -57,7 +57,7 @@ test:do_catchsql_test( SELECT a FROM (t1) AS t ON b USING(a) ]], { -- <tkt3935.4> - 1, "a JOIN clause is required before ON" + 1, "Syntax error in FROM clause: a JOIN clause is required before ON and USING" -- </tkt3935.4> }) @@ -67,7 +67,7 @@ test:do_catchsql_test( SELECT a FROM (t1) AS t ON b ]], { -- <tkt3935.5> - 1, "a JOIN clause is required before ON" + 1, "Syntax error in FROM clause: a JOIN clause is required before ON and USING" -- </tkt3935.5> }) @@ -77,7 +77,7 @@ test:do_catchsql_test( SELECT a FROM (SELECT * FROM t1) AS t ON b USING(a) ]], { -- <tkt3935.6> - 1, "a JOIN clause is required before ON" + 1, "Syntax error in FROM clause: a JOIN clause is required before ON and USING" -- </tkt3935.6> }) @@ -87,7 +87,7 @@ test:do_catchsql_test( SELECT a FROM (SELECT * FROM t1) AS t ON b ]], { -- <tkt3935.7> - 1, "a JOIN clause is required before ON" + 1, "Syntax error in FROM clause: a JOIN clause is required before ON and USING" -- </tkt3935.7> }) @@ -97,7 +97,7 @@ test:do_catchsql_test( SELECT a FROM t1 AS t ON b ]], { -- <tkt3935.8> - 1, "a JOIN clause is required before ON" + 1, "Syntax error in FROM clause: a JOIN clause is required before ON and USING" -- </tkt3935.8> }) @@ -107,7 +107,7 @@ test:do_catchsql_test( SELECT a FROM t1 AS t ON b USING(a) ]], { -- <tkt3935.9> - 1, "a JOIN clause is required before ON" + 1, "Syntax error in FROM clause: a JOIN clause is required before ON and USING" -- </tkt3935.9> }) @@ -117,7 +117,7 @@ test:do_catchsql_test( SELECT a FROM t1 AS t USING(a) ]], { -- <tkt3935.10> - 1, "a JOIN clause is required before USING" + 1, "Syntax error in FROM clause: a JOIN clause is required before ON and USING" -- </tkt3935.10> }) diff --git a/test/sql-tap/tokenize.test.lua b/test/sql-tap/tokenize.test.lua index 9ef4fd0..b1a097e 100755 --- a/test/sql-tap/tokenize.test.lua +++ b/test/sql-tap/tokenize.test.lua @@ -26,7 +26,7 @@ test:do_catchsql_test( SELECT 1.0e+ ]], { -- <tokenize-1.1> - 1, [[unrecognized token: "1.0e"]] + 1, [[Syntax error: unrecognized token: '1.0e']] -- </tokenize-1.1> }) @@ -36,7 +36,7 @@ test:do_catchsql_test( SELECT 1.0E+ ]], { -- <tokenize-1.2> - 1, [[unrecognized token: "1.0E"]] + 1, [[Syntax error: unrecognized token: '1.0E']] -- </tokenize-1.2> }) @@ -46,7 +46,7 @@ test:do_catchsql_test( SELECT 1.0e- ]], { -- <tokenize-1.3> - 1, [[unrecognized token: "1.0e"]] + 1, [[Syntax error: unrecognized token: '1.0e']] -- </tokenize-1.3> }) @@ -56,7 +56,7 @@ test:do_catchsql_test( SELECT 1.0E- ]], { -- <tokenize-1.4> - 1, [[unrecognized token: "1.0E"]] + 1, [[Syntax error: unrecognized token: '1.0E']] -- </tokenize-1.4> }) @@ -66,7 +66,7 @@ test:do_catchsql_test( SELECT 1.0e+/ ]], { -- <tokenize-1.5> - 1, [[unrecognized token: "1.0e"]] + 1, [[Syntax error: unrecognized token: '1.0e']] -- </tokenize-1.5> }) @@ -76,7 +76,7 @@ test:do_catchsql_test( SELECT 1.0E+: ]], { -- <tokenize-1.6> - 1, [[unrecognized token: "1.0E"]] + 1, [[Syntax error: unrecognized token: '1.0E']] -- </tokenize-1.6> }) @@ -86,7 +86,7 @@ test:do_catchsql_test( SELECT 1.0e-: ]], { -- <tokenize-1.7> - 1, [[unrecognized token: "1.0e"]] + 1, [[Syntax error: unrecognized token: '1.0e']] -- </tokenize-1.7> }) @@ -96,7 +96,7 @@ test:do_catchsql_test( SELECT 1.0E-/ ]], { -- <tokenize-1.8> - 1, [[unrecognized token: "1.0E"]] + 1, [[Syntax error: unrecognized token: '1.0E']] -- </tokenize-1.8> }) @@ -106,7 +106,7 @@ test:do_catchsql_test( SELECT 1.0F+5 ]], { -- <tokenize-1.9> - 1, [[unrecognized token: "1.0F"]] + 1, [[Syntax error: unrecognized token: '1.0F']] -- </tokenize-1.9> }) @@ -116,7 +116,7 @@ test:do_catchsql_test( SELECT 1.0d-10 ]], { -- <tokenize-1.10> - 1, [[unrecognized token: "1.0d"]] + 1, [[Syntax error: unrecognized token: '1.0d']] -- </tokenize-1.10> }) @@ -126,7 +126,7 @@ test:do_catchsql_test( SELECT 1.0e,5 ]], { -- <tokenize-1.11> - 1, [[unrecognized token: "1.0e"]] + 1, [[Syntax error: unrecognized token: '1.0e']] -- </tokenize-1.11> }) @@ -136,7 +136,7 @@ test:do_catchsql_test( SELECT 1.0E.10 ]], { -- <tokenize-1.12> - 1, [[unrecognized token: "1.0E"]] + 1, [[Syntax error: unrecognized token: '1.0E']] -- </tokenize-1.12> }) @@ -145,7 +145,7 @@ test:do_catchsql_test( [[ SELECT 1, 2 /*]], { -- <tokenize-2.1> - 1, [[near "*": syntax error]] + 1, [[Syntax error near '*']] -- </tokenize-2.1> }) diff --git a/test/sql-tap/trigger1.test.lua b/test/sql-tap/trigger1.test.lua index 871a144..2984d4c 100755 --- a/test/sql-tap/trigger1.test.lua +++ b/test/sql-tap/trigger1.test.lua @@ -72,7 +72,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-1.1.3> - 1, [[near "STATEMENT": syntax error]] + 1, [[Syntax error near 'STATEMENT']] -- </trigger1-1.1.3> }) @@ -297,7 +297,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-2.1> - 1, [[near ";": syntax error]] + 1, [[Syntax error near ';']] -- </trigger1-2.1> }) @@ -310,7 +310,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-2.2> - 1, [[near ";": syntax error]] + 1, [[Syntax error near ';']] -- </trigger1-2.2> }) @@ -809,7 +809,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-16.4> - 1, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements within triggers" + 1, "Syntax error in trigger body: the NOT INDEXED clause is not allowed on UPDATE or DELETE statements within triggers" -- </trigger1-16.4> }) @@ -821,7 +821,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-16.5> - 1, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements within triggers" + 1, "Syntax error in trigger body: the INDEXED BY clause is not allowed on UPDATE or DELETE statements within triggers" -- </trigger1-16.5> }) @@ -833,7 +833,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-16.6> - 1, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements within triggers" + 1, "Syntax error in trigger body: the NOT INDEXED clause is not allowed on UPDATE or DELETE statements within triggers" -- </trigger1-16.6> }) @@ -845,7 +845,7 @@ test:do_catchsql_test( END; ]], { -- <trigger1-16.7> - 1, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements within triggers" + 1, "Syntax error in trigger body: the INDEXED BY clause is not allowed on UPDATE or DELETE statements within triggers" -- </trigger1-16.7> }) diff --git a/test/sql-tap/view.test.lua b/test/sql-tap/view.test.lua index c99a0a5..72fdab8 100755 --- a/test/sql-tap/view.test.lua +++ b/test/sql-tap/view.test.lua @@ -293,7 +293,7 @@ test:do_catchsql_test( CREATE VIEW v1err(x,y DESC,z) AS SELECT a, b+c, c-b FROM t1; ]], { -- <view-3.3.4> - 1, [[keyword "DESC" is reserved]] + 1, [[Keyword 'DESC' is reserved. Please use double quotes if 'DESC' is an identifier.]] -- </view-3.3.4> }) @@ -961,7 +961,7 @@ test:do_catchsql_test( DROP VIEW main.nosuchview ]], { -- <view-17.2> - 1, "near \".\": syntax error" + 1, "Syntax error near '.'" -- </view-17.2> }) diff --git a/test/sql-tap/with1.test.lua b/test/sql-tap/with1.test.lua index 7896483..add2345 100755 --- a/test/sql-tap/with1.test.lua +++ b/test/sql-tap/with1.test.lua @@ -178,7 +178,7 @@ test:do_catchsql_test(3.6, [[ SELECT * FROM tmp; ]], { -- <3.6> - 1, [[keyword "SELECT" is reserved]] + 1, [[Keyword 'SELECT' is reserved. Please use double quotes if 'SELECT' is an identifier.]] -- </3.6> }) @@ -1018,7 +1018,7 @@ test:do_catchsql_test(13.1, [[ SELECT i FROM c; ]], { -- <13.1> - 1, "no tables specified" + 1, "Failed to expand '*' in SELECT statement without FROM clause" -- </13.1> }) @@ -1027,7 +1027,7 @@ test:do_catchsql_test(13.2, [[ SELECT i FROM c; ]], { -- <13.2> - 1, "no tables specified" + 1, "Failed to expand '*' in SELECT statement without FROM clause" -- </13.2> }) diff --git a/test/sql-tap/with2.test.lua b/test/sql-tap/with2.test.lua index c27a9d1..ca3f00e 100755 --- a/test/sql-tap/with2.test.lua +++ b/test/sql-tap/with2.test.lua @@ -317,7 +317,7 @@ test:do_catchsql_test(4.1, [[ SELECT * FROM x; ]], { -- <4.1> - 1, [[near ")": syntax error]] + 1, [[Syntax error near ')']] -- </4.1> }) @@ -519,7 +519,7 @@ test:do_catchsql_test(6.2, [[ INSERT INTO t2 VALUES(1, 2,); ]], { -- <6.2> - 1, [[near ")": syntax error]] + 1, [[Syntax error near ')']] -- </6.2> }) @@ -528,7 +528,7 @@ test:do_catchsql_test("6.3.1", [[ INSERT INTO t2 SELECT a, b, FROM t1; ]], { -- <6.3> - 1, [[keyword "FROM" is reserved]] + 1, [[Keyword 'FROM' is reserved. Please use double quotes if 'FROM' is an identifier.]] -- </6.3> }) @@ -546,7 +546,7 @@ test:do_catchsql_test(6.4, [[ INSERT INTO t2 SELECT a, b, FROM t1 a a a; ]], { -- <6.4> - 1, [[keyword "FROM" is reserved]] + 1, [[Keyword 'FROM' is reserved. Please use double quotes if 'FROM' is an identifier.]] -- </6.4> }) @@ -555,7 +555,7 @@ test:do_catchsql_test(6.5, [[ DELETE FROM t2 WHERE; ]], { -- <6.5> - 1, [[near ";": syntax error]] + 1, [[Syntax error near ';']] -- </6.5> }) @@ -563,7 +563,7 @@ test:do_catchsql_test(6.6, [[ WITH x AS (SELECT * FROM t1) DELETE FROM t2 WHERE ]], { -- <6.6> - 1, '/near .* syntax error/' + 1, "Syntax error near '\n'" -- </6.6> }) @@ -571,7 +571,7 @@ test:do_catchsql_test(6.7, [[ WITH x AS (SELECT * FROM t1) DELETE FROM t2 WHRE 1; ]], { -- <6.7> - 1, '/near .* syntax error/' + 1, "Syntax error near 'WHRE'" -- </6.7> }) @@ -579,7 +579,7 @@ test:do_catchsql_test(6.8, [[ WITH x AS (SELECT * FROM t1) UPDATE t2 SET a = 10, b = ; ]], { -- <6.8> - 1, '/near .* syntax error/' + 1, "Syntax error near ';'" -- </6.8> }) @@ -587,7 +587,7 @@ test:do_catchsql_test(6.9, [[ WITH x AS (SELECT * FROM t1) UPDATE t2 SET a = 10, b = 1 WHERE a===b; ]], { -- <6.9> - 1, '/near .* syntax error/' + 1, "Syntax error near '='" -- </6.9> }) diff --git a/test/sql/checks.result b/test/sql/checks.result index 2eafae8..e31964c 100644 --- a/test/sql/checks.result +++ b/test/sql/checks.result @@ -30,7 +30,7 @@ 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: - near "<": syntax error)' + Syntax error near ''<'')' ... opts = {checks = {{expr = 'X>5'}}} --- diff --git a/test/sql/collation.result b/test/sql/collation.result index daea355..fbdb1b8 100644 --- a/test/sql/collation.result +++ b/test/sql/collation.result @@ -14,23 +14,23 @@ box.sql.execute('pragma sql_default_engine=\''..engine..'\'') -- All of these tests should throw error "near "COLLATE": syntax error" box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY;") --- -- error: 'near "COLLATE": syntax error' +- error: Syntax error near 'COLLATE' ... box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY OFFSET 1;") --- -- error: 'near "COLLATE": syntax error' +- error: Syntax error near 'COLLATE' ... box.sql.execute("SELECT 1 LIMIT 1 OFFSET 1 COLLATE BINARY;") --- -- error: 'near "COLLATE": syntax error' +- error: Syntax error near 'COLLATE' ... box.sql.execute("SELECT 1 LIMIT 1, 1 COLLATE BINARY;") --- -- error: 'near "COLLATE": syntax error' +- error: Syntax error near 'COLLATE' ... box.sql.execute("SELECT 1 LIMIT 1 COLLATE BINARY, 1;") --- -- error: 'near "COLLATE": syntax error' +- error: Syntax error near 'COLLATE' ... -- gh-3052: upper/lower support only default locale -- For tr-TR result depends on collation @@ -102,7 +102,7 @@ cn = remote.connect(box.cfg.listen) ... cn:execute('select 1 limit ? collate not_exist', {1}) --- -- error: 'Failed to execute SQL statement: near "COLLATE": syntax error' +- error: 'Failed to execute SQL statement: Syntax error near ''COLLATE''' ... cn:close() --- diff --git a/test/sql/foreign-keys.result b/test/sql/foreign-keys.result index becb4c2..3c6464e 100644 --- a/test/sql/foreign-keys.result +++ b/test/sql/foreign-keys.result @@ -358,19 +358,21 @@ box.sql.execute('CREATE TABLE t1 (id INT PRIMARY KEY);') ... box.sql.execute('CREATE TABLE t2 (id INT PRIMARY KEY REFERENCES t2 ON DELETE CASCADE ON DELETE RESTRICT);') --- -- error: keyword "DELETE" is reserved +- error: Keyword 'DELETE' is reserved. Please use double quotes if 'DELETE' is an + identifier. ... box.sql.execute('CREATE TABLE t2 (id INT PRIMARY KEY REFERENCES t2 ON DELETE CASCADE ON DELETE CASCADE);') --- -- error: keyword "DELETE" is reserved +- error: Keyword 'DELETE' is reserved. Please use double quotes if 'DELETE' is an + identifier. ... box.sql.execute('CREATE TABLE t2 (id INT PRIMARY KEY REFERENCES t2 ON DELETE CASCADE ON UPDATE RESTRICT ON DELETE RESTRICT);') --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... box.sql.execute('CREATE TABLE t2 (id INT PRIMARY KEY REFERENCES t2 ON DELETE CASCADE MATCH FULL);') --- -- error: keyword "MATCH" is reserved +- error: Keyword 'MATCH' is reserved. Please use double quotes if 'MATCH' is an identifier. ... box.space.T1:drop() --- diff --git a/test/sql/gh-3888-values-blob-assert.result b/test/sql/gh-3888-values-blob-assert.result index 67948cd..9045572 100644 --- a/test/sql/gh-3888-values-blob-assert.result +++ b/test/sql/gh-3888-values-blob-assert.result @@ -16,20 +16,20 @@ box.sql.execute('pragma sql_default_engine=\''..engine..'\'') -- check 'VALUES' against typedef keywords (should fail) box.sql.execute('VALUES(blob)') --- -- error: 'near "blob": syntax error' +- error: Syntax error near 'blob' ... box.sql.execute('VALUES(float)') --- -- error: 'near "float": syntax error' +- error: Syntax error near 'float' ... -- check 'SELECT' against typedef keywords (should fail) box.sql.execute('SELECT blob') --- -- error: 'near "blob": syntax error' +- error: Syntax error near 'blob' ... box.sql.execute('SELECT float') --- -- error: 'near "float": syntax error' +- error: Syntax error near 'float' ... -- check 'VALUES' against ID (should fail) box.sql.execute('VALUES(TheColumnName)') diff --git a/test/sql/iproto.result b/test/sql/iproto.result index da7b40f..938aea9 100644 --- a/test/sql/iproto.result +++ b/test/sql/iproto.result @@ -96,7 +96,7 @@ cn:execute('insert into not_existing_table values ("kek")') ... cn:execute('insert qwerty gjsdjq q qwd qmq;; q;qwd;') --- -- error: 'Failed to execute SQL statement: near "qwerty": syntax error' +- error: 'Failed to execute SQL statement: Syntax error near ''qwerty''' ... -- Empty result. cn:execute('select id as identifier from test where a = 5;') @@ -109,7 +109,7 @@ cn:execute('select id as identifier from test where a = 5;') -- netbox API errors. cn:execute(100) --- -- error: 'Failed to execute SQL statement: near "100": syntax error' +- error: 'Failed to execute SQL statement: Syntax error near ''100''' ... cn:execute('select 1', nil, {dry_run = true}) --- @@ -118,11 +118,11 @@ cn:execute('select 1', nil, {dry_run = true}) -- Empty request. cn:execute('') --- -- error: 'Failed to execute SQL statement: syntax error: empty request' +- error: 'Failed to execute SQL statement: Failed to execute an empty SQL statement' ... cn:execute(' ;') --- -- error: 'Failed to execute SQL statement: syntax error: empty request' +- error: 'Failed to execute SQL statement: Failed to execute an empty SQL statement' ... -- -- gh-3467: allow only positive integers under limit clause. @@ -567,7 +567,7 @@ cn:execute('drop table if exists test3') -- cn:execute('select ?1, ?2, ?3', {1, 2, 3}) --- -- error: 'Failed to execute SQL statement: near "?1": syntax error' +- error: 'Failed to execute SQL statement: Syntax error near ''?1''' ... cn:execute('select $name, $name2', {1, 2}) --- diff --git a/test/sql/misc.result b/test/sql/misc.result index ef104c1..9a8aa8d 100644 --- a/test/sql/misc.result +++ b/test/sql/misc.result @@ -14,11 +14,13 @@ box.sql.execute('select 1;') ... box.sql.execute('select 1; select 2;') --- -- error: keyword "select" is reserved +- error: Keyword 'select' is reserved. Please use double quotes if 'select' is an + identifier. ... box.sql.execute('create table t1 (id INT primary key); select 100;') --- -- error: keyword "select" is reserved +- error: Keyword 'select' is reserved. Please use double quotes if 'select' is an + identifier. ... box.space.t1 == nil --- @@ -26,17 +28,17 @@ box.space.t1 == nil ... box.sql.execute(';') --- -- error: 'syntax error: empty request' +- error: Failed to execute an empty SQL statement ... box.sql.execute('') --- -- error: 'syntax error: empty request' +- error: Failed to execute an empty SQL statement ... box.sql.execute(' ;') --- -- error: 'syntax error: empty request' +- error: Failed to execute an empty SQL statement ... box.sql.execute('\n\n\n\t\t\t ') --- -- error: 'syntax error: empty request' +- error: Failed to execute an empty SQL statement ... diff --git a/test/sql/on-conflict.result b/test/sql/on-conflict.result index 07bb403..6d37e69 100644 --- a/test/sql/on-conflict.result +++ b/test/sql/on-conflict.result @@ -13,37 +13,37 @@ box.sql.execute('pragma sql_default_engine=\''..engine..'\'') -- box.sql.execute("CREATE TABLE t (id INTEGER PRIMARY KEY, v INTEGER UNIQUE ON CONFLICT ABORT)") --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... box.sql.execute("CREATE TABLE q (id INTEGER PRIMARY KEY, v INTEGER UNIQUE ON CONFLICT FAIL)") --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... box.sql.execute("CREATE TABLE p (id INTEGER PRIMARY KEY, v INTEGER UNIQUE ON CONFLICT IGNORE)") --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... box.sql.execute("CREATE TABLE g (id INTEGER PRIMARY KEY, v INTEGER UNIQUE ON CONFLICT REPLACE)") --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... box.sql.execute("CREATE TABLE e (id INTEGER PRIMARY KEY ON CONFLICT REPLACE, v INTEGER)") --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... box.sql.execute("CREATE TABLE t1(a INT PRIMARY KEY ON CONFLICT REPLACE)") --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... box.sql.execute("CREATE TABLE t2(a INT PRIMARY KEY ON CONFLICT IGNORE)") --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... -- CHECK constraint is illegal with REPLACE option. -- box.sql.execute("CREATE TABLE t (id INTEGER PRIMARY KEY, a INTEGER CHECK (a > 5) ON CONFLICT REPLACE);") --- -- error: keyword "ON" is reserved +- error: Keyword 'ON' is reserved. Please use double quotes if 'ON' is an identifier. ... -- -- gh-3473: Primary key can't be declared with NULL. diff --git a/test/sql/types.result b/test/sql/types.result index a0159d6..98464f8 100644 --- a/test/sql/types.result +++ b/test/sql/types.result @@ -8,23 +8,26 @@ test_run = env.new() -- box.sql.execute("CREATE TABLE t1 (id PRIMARY KEY);") --- -- error: keyword "PRIMARY" is reserved +- error: Keyword 'PRIMARY' is reserved. Please use double quotes if 'PRIMARY' is an + identifier. ... box.sql.execute("CREATE TABLE t1 (a, id INT PRIMARY KEY);") --- -- error: 'near ",": syntax error' +- error: Syntax error near ',' ... box.sql.execute("CREATE TABLE t1 (id PRIMARY KEY, a INT);") --- -- error: keyword "PRIMARY" is reserved +- error: Keyword 'PRIMARY' is reserved. Please use double quotes if 'PRIMARY' is an + identifier. ... box.sql.execute("CREATE TABLE t1 (id INT PRIMARY KEY, a);") --- -- error: 'near ")": syntax error' +- error: Syntax error near ')' ... box.sql.execute("CREATE TABLE t1 (id INT PRIMARY KEY, a INT, b UNIQUE);") --- -- error: keyword "UNIQUE" is reserved +- error: Keyword 'UNIQUE' is reserved. Please use double quotes if 'UNIQUE' is an + identifier. ... -- gh-3104: real type is stored in space format. -- -- 2.7.4
next prev parent reply other threads:[~2019-03-02 13:07 UTC|newest] Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-03-02 13:07 [tarantool-patches] [PATCH v3 0/9] sql: use diag_set() for errors in SQL imeevma 2019-03-02 13:07 ` imeevma [this message] 2019-03-04 17:47 ` [tarantool-patches] Re: [PATCH v3 1/9] sql: rework syntax errors n.pettik 2019-03-05 8:31 ` Konstantin Osipov 2019-03-02 13:07 ` [tarantool-patches] [PATCH v3 2/9] sql: save SQL parser errors in diag_set() imeevma 2019-03-05 8:40 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 9:06 ` n.pettik 2019-03-02 13:07 ` [tarantool-patches] [PATCH v3 3/9] sql: remove field nErr of struct Parse imeevma 2019-03-05 8:41 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 9:06 ` n.pettik 2019-03-02 13:07 ` [tarantool-patches] [PATCH v3 4/9] sql: remove field rc " imeevma 2019-03-05 8:42 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 9:06 ` n.pettik 2019-03-02 13:07 ` [tarantool-patches] [PATCH v3 5/9] sql: remove field zErrMsg " imeevma 2019-03-05 8:43 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 9:06 ` n.pettik 2019-03-02 13:07 ` [tarantool-patches] [PATCH v3 6/9] sql: rework six syntax errors imeevma 2019-03-05 8:45 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 9:07 ` n.pettik 2019-03-02 13:08 ` [tarantool-patches] [PATCH v3 7/9] sql: rework four semantic errors imeevma 2019-03-05 8:46 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 9:16 ` n.pettik 2019-03-02 13:08 ` [tarantool-patches] [PATCH v3 8/9] sql: rework three errors of "unsupported" type imeevma 2019-03-05 8:47 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 9:34 ` n.pettik 2019-03-05 9:43 ` Konstantin Osipov 2019-03-02 13:08 ` [tarantool-patches] [PATCH v3 9/9] sql: remove sqlErrorMsg() imeevma 2019-03-05 8:48 ` [tarantool-patches] " Konstantin Osipov 2019-03-05 12:16 ` n.pettik 2019-03-05 15:44 ` Konstantin Osipov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=8bd6b8f7e60a581d62673d548ecf5a3039d16d6e.1551530224.git.imeevma@gmail.com \ --to=imeevma@tarantool.org \ --cc=korablev@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [tarantool-patches] [PATCH v3 1/9] sql: rework syntax errors' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox