mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 00:22:29 +00:00
fix 'Unmatched parentheses', add test
This commit is contained in:
parent
35f8a0810a
commit
84d3d6e728
@ -4,13 +4,14 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
UnmatchedParentheses checkUnmatchedParentheses(TokenIterator begin, Token last)
|
||||
UnmatchedParentheses checkUnmatchedParentheses(TokenIterator begin)
|
||||
{
|
||||
/// We have just two kind of parentheses: () and [].
|
||||
UnmatchedParentheses stack;
|
||||
|
||||
for (TokenIterator it = begin;
|
||||
it.isValid() && it->begin <= last.begin; ++it)
|
||||
/// We have to iterate through all tokens until the end to avoid false positive "Unmatched parentheses" error
|
||||
/// when parser failed in the middle of the query.
|
||||
for (TokenIterator it = begin; it.isValid(); ++it)
|
||||
{
|
||||
if (it->type == TokenType::OpeningRoundBracket || it->type == TokenType::OpeningSquareBracket)
|
||||
{
|
||||
|
@ -80,6 +80,6 @@ public:
|
||||
|
||||
/// Returns positions of unmatched parentheses.
|
||||
using UnmatchedParentheses = std::vector<Token>;
|
||||
UnmatchedParentheses checkUnmatchedParentheses(TokenIterator begin, Token last);
|
||||
UnmatchedParentheses checkUnmatchedParentheses(TokenIterator begin);
|
||||
|
||||
}
|
||||
|
@ -290,7 +290,7 @@ ASTPtr tryParseQuery(
|
||||
}
|
||||
|
||||
/// Unmatched parentheses
|
||||
UnmatchedParentheses unmatched_parens = checkUnmatchedParentheses(TokenIterator(tokens), last_token);
|
||||
UnmatchedParentheses unmatched_parens = checkUnmatchedParentheses(TokenIterator(tokens));
|
||||
if (!unmatched_parens.empty())
|
||||
{
|
||||
out_error_message = getUnmatchedParenthesesErrorMessage(query_begin,
|
||||
|
32
tests/queries/0_stateless/01180_client_syntax_errors.expect
Executable file
32
tests/queries/0_stateless/01180_client_syntax_errors.expect
Executable file
@ -0,0 +1,32 @@
|
||||
#!/usr/bin/expect -f
|
||||
|
||||
log_user 0
|
||||
set timeout 5
|
||||
match_max 100000
|
||||
# A default timeout action is to do nothing, change it to fail
|
||||
expect_after {
|
||||
timeout {
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
set basedir [file dirname $argv0]
|
||||
spawn bash -c "source $basedir/../shell_config.sh ; \$CLICKHOUSE_CLIENT_BINARY \$CLICKHOUSE_CLIENT_OPT"
|
||||
expect ":) "
|
||||
|
||||
# Make a query with syntax error
|
||||
send -- "select \r"
|
||||
expect "Syntax error: failed at position 7 (end of query):"
|
||||
expect "Expected one of: "
|
||||
|
||||
# Make another query with syntax error
|
||||
send -- "CREATE TABLE t4 UUID '57f27aa5-141c-47c5-888a-9563681717f5' AS t1 (`rowNumberInAllBlocks()` UInt64, `toLowCardinality(arrayJoin(\['exchange', 'tables'\]))` LowCardinality(String)) ENGINE = MergeTree \r"
|
||||
expect "Syntax error: failed at position 93 ('UInt64'):*"
|
||||
|
||||
# Make a query with unmatched parentheses
|
||||
send -- "select (1, 2\r"
|
||||
expect "Syntax error: failed at position 8 ('('):"
|
||||
expect "Unmatched parentheses: ("
|
||||
|
||||
send -- "\4"
|
||||
expect eof
|
Loading…
Reference in New Issue
Block a user