Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
84d3d6e7
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
84d3d6e7
编写于
2月 01, 2021
作者:
A
Alexander Tokmakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix 'Unmatched parentheses', add test
上级
35f8a081
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
38 addition
and
5 deletion
+38
-5
src/Parsers/TokenIterator.cpp
src/Parsers/TokenIterator.cpp
+4
-3
src/Parsers/TokenIterator.h
src/Parsers/TokenIterator.h
+1
-1
src/Parsers/parseQuery.cpp
src/Parsers/parseQuery.cpp
+1
-1
tests/queries/0_stateless/01180_client_syntax_errors.expect
tests/queries/0_stateless/01180_client_syntax_errors.expect
+32
-0
tests/queries/0_stateless/01180_client_syntax_errors.reference
.../queries/0_stateless/01180_client_syntax_errors.reference
+0
-0
未找到文件。
src/Parsers/TokenIterator.cpp
浏览文件 @
84d3d6e7
...
...
@@ -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
)
{
...
...
src/Parsers/TokenIterator.h
浏览文件 @
84d3d6e7
...
...
@@ -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
);
}
src/Parsers/parseQuery.cpp
浏览文件 @
84d3d6e7
...
...
@@ -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
,
...
...
tests/queries/0_stateless/01180_client_syntax_errors.expect
0 → 100755
浏览文件 @
84d3d6e7
#!/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
tests/queries/0_stateless/01180_client_syntax_errors.reference
0 → 100644
浏览文件 @
84d3d6e7
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录