* [tarantool-patches] [PATCH v1 1/1] sql: rework five syntax errors
@ 2019-02-21 15:40 imeevma
2019-02-21 19:01 ` [tarantool-patches] " n.pettik
0 siblings, 1 reply; 2+ messages in thread
From: imeevma @ 2019-02-21 15:40 UTC (permalink / raw)
To: korablev; +Cc: tarantool-patches
This patch reworks five syntax errors. These SQL errors were
converted into Tarantool errors.
Part of #3965
---
https://github.com/tarantool/tarantool/issues/3965
https://github.com/tarantool/tarantool/tree/imeevma/gh-3965-use-diag_set-to-describe-error
src/box/errcode.h | 5 +++++
src/box/sql/build.c | 6 +++---
src/box/sql/parse.y | 26 ++++++++++++++++----------
src/box/sql/select.c | 6 +++---
test/box/misc.result | 4 ++++
test/sql-tap/check.test.lua | 6 +++---
test/sql-tap/e_select1.test.lua | 10 +++++-----
test/sql-tap/index7.test.lua | 2 +-
test/sql-tap/join.test.lua | 2 +-
test/sql-tap/keyword1.test.lua | 2 +-
test/sql-tap/misc1.test.lua | 2 +-
test/sql-tap/misc5.test.lua | 2 +-
test/sql-tap/select1.test.lua | 12 ++++++------
test/sql-tap/select3.test.lua | 2 +-
test/sql-tap/start-transaction.test.lua | 10 +++++-----
test/sql-tap/table.test.lua | 6 +++---
test/sql-tap/tkt3935.test.lua | 14 +++++++-------
test/sql-tap/trigger1.test.lua | 8 ++++----
test/sql-tap/with1.test.lua | 6 +++---
test/sql-tap/with2.test.lua | 4 ++--
test/sql/iproto.result | 4 ++--
test/sql/misc.result | 14 ++++++++------
test/sql/on-conflict.result | 16 ++++++++--------
test/sql/types.result | 9 ++++++---
24 files changed, 99 insertions(+), 79 deletions(-)
diff --git a/src/box/errcode.h b/src/box/errcode.h
index 1523b19..1807151 100644
--- a/src/box/errcode.h
+++ b/src/box/errcode.h
@@ -230,6 +230,11 @@ struct errcode_record {
/*175 */_(ER_SQL_NO_SUCH_PRAGMA, "Pragma '%s' does not exist") \
/*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_SQL_SYNTAX, "Syntax error in %s: %s") \
+ /*179 */_(ER_SQL_STACK_OVERFLOW, "Failed to parse SQL statement: parser stack limit reached") \
+ /*180 */_(ER_SQL_SELECT_WILDCARD, "Failed to expand '*' in SELECT statement without FROM clause") \
+ /*181 */_(ER_SQL_STATEMENT_EMPTY, "Failed to execute an empty SQL statement") \
+ /*182 */_(ER_SQL_KEYWORD_IS_RESERVED, "Keyword '%.*s' is reserved. Please use double quotes if '%.*s' is an identifier.") \
/*
* !IMPORTANT! Please follow instructions at start of the file
diff --git a/src/box/sql/build.c b/src/box/sql/build.c
index 03bfbfb..173eea2 100644
--- a/src/box/sql/build.c
+++ b/src/box/sql/build.c
@@ -2815,9 +2815,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 661e695..f3f6803 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);
+ sql_parser_error(pParse);
} else {
sqlErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
}
}
%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);
}
}
@@ -1380,14 +1385,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 f469de5..824a8ff 100644
--- a/src/box/sql/select.c
+++ b/src/box/sql/select.c
@@ -5028,11 +5028,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/test/box/misc.result b/test/box/misc.result
index 80bde72..eaf9bc8 100644
--- a/test/box/misc.result
+++ b/test/box/misc.result
@@ -507,6 +507,10 @@ t;
175: box.error.SQL_NO_SUCH_PRAGMA
176: box.error.SQL_CANT_RESOLVE_FIELD
177: box.error.INDEX_EXISTS_IN_SPACE
+ 178: box.error.SQL_SYNTAX
+ 179: box.error.SQL_STACK_OVERFLOW
+ 180: box.error.SQL_SELECT_WILDCARD
+ 181: box.error.SQL_STATEMENT_EMPTY
...
test_run:cmd("setopt delimiter ''");
---
diff --git a/test/sql-tap/check.test.lua b/test/sql-tap/check.test.lua
index 2bb1b2e..3191393 100755
--- a/test/sql-tap/check.test.lua
+++ b/test/sql-tap/check.test.lua
@@ -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/e_select1.test.lua b/test/sql-tap/e_select1.test.lua
index bd98528..3170b39 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>
})
@@ -811,10 +811,10 @@ data = {
{"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' }
+ {"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/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..e5f1303 100755
--- a/test/sql-tap/misc1.test.lua
+++ b/test/sql-tap/misc1.test.lua
@@ -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>
})
diff --git a/test/sql-tap/misc5.test.lua b/test/sql-tap/misc5.test.lua
index 0852741..05084a1 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>
})
diff --git a/test/sql-tap/select1.test.lua b/test/sql-tap/select1.test.lua
index 6c35b6f..84c5359 100755
--- a/test/sql-tap/select1.test.lua
+++ b/test/sql-tap/select1.test.lua
@@ -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>
})
@@ -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>
})
@@ -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..9582a40 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>
})
diff --git a/test/sql-tap/start-transaction.test.lua b/test/sql-tap/start-transaction.test.lua
index 82356ae..918b759 100755
--- a/test/sql-tap/start-transaction.test.lua
+++ b/test/sql-tap/start-transaction.test.lua
@@ -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..73198dd 100755
--- a/test/sql-tap/table.test.lua
+++ b/test/sql-tap/table.test.lua
@@ -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/trigger1.test.lua b/test/sql-tap/trigger1.test.lua
index 871a144..4ca4f67 100755
--- a/test/sql-tap/trigger1.test.lua
+++ b/test/sql-tap/trigger1.test.lua
@@ -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/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..23ed55b 100755
--- a/test/sql-tap/with2.test.lua
+++ b/test/sql-tap/with2.test.lua
@@ -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>
})
diff --git a/test/sql/iproto.result b/test/sql/iproto.result
index 562e068..e7de36a 100644
--- a/test/sql/iproto.result
+++ b/test/sql/iproto.result
@@ -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.
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 9043cbf..7261f66 100644
--- a/test/sql/types.result
+++ b/test/sql/types.result
@@ -8,7 +8,8 @@ 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);")
---
@@ -16,7 +17,8 @@ box.sql.execute("CREATE TABLE t1 (a, id INT PRIMARY KEY);")
...
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);")
---
@@ -24,7 +26,8 @@ box.sql.execute("CREATE TABLE t1 (id INT PRIMARY KEY, a);")
...
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
^ permalink raw reply [flat|nested] 2+ messages in thread
* [tarantool-patches] Re: [PATCH v1 1/1] sql: rework five syntax errors
2019-02-21 15:40 [tarantool-patches] [PATCH v1 1/1] sql: rework five syntax errors imeevma
@ 2019-02-21 19:01 ` n.pettik
0 siblings, 0 replies; 2+ messages in thread
From: n.pettik @ 2019-02-21 19:01 UTC (permalink / raw)
To: tarantool-patches; +Cc: Imeev Mergen
> On 21 Feb 2019, at 18:40, imeevma@tarantool.org wrote:
>
> This patch reworks five syntax errors.
Why only five? There are 10 errors at all, so lets finish this part
adding all syntax errors.
> These SQL errors were
> converted into Tarantool errors.
>
> Part of #3965
> ---
> https://github.com/tarantool/tarantool/issues/3965
> https://github.com/tarantool/tarantool/tree/imeevma/gh-3965-use-diag_set-to-describe-error
>
> diff --git a/src/box/errcode.h b/src/box/errcode.h
> index 1523b19..1807151 100644
> --- a/src/box/errcode.h
> +++ b/src/box/errcode.h
> @@ -230,6 +230,11 @@ struct errcode_record {
> /*175 */_(ER_SQL_NO_SUCH_PRAGMA, "Pragma '%s' does not exist") \
> /*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_SQL_SYNTAX, "Syntax error in %s: %s") \
> + /*179 */_(ER_SQL_STACK_OVERFLOW, "Failed to parse SQL statement: parser stack limit reached") \
> + /*180 */_(ER_SQL_SELECT_WILDCARD, "Failed to expand '*' in SELECT statement without FROM clause") \
> + /*181 */_(ER_SQL_STATEMENT_EMPTY, "Failed to execute an empty SQL statement") \
I’ve already said that: why do we consider empty query as an error? Don’t understand.
The rest is ok as obvious.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-02-21 19:01 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-21 15:40 [tarantool-patches] [PATCH v1 1/1] sql: rework five syntax errors imeevma
2019-02-21 19:01 ` [tarantool-patches] " n.pettik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox