Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
bdeee538
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,发现更多精彩内容 >>
提交
bdeee538
编写于
3月 31, 2014
作者:
P
Pavel Kartavyy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dbms: development [#METR-10498]
Signed-off-by:
N
Pavel Kartavyy
<
kartavyy@yandex-team.ru
>
上级
a737895e
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
57 addition
and
16 deletion
+57
-16
dbms/include/DB/Interpreters/ExpressionAnalyzer.h
dbms/include/DB/Interpreters/ExpressionAnalyzer.h
+7
-0
dbms/include/DB/Interpreters/Set.h
dbms/include/DB/Interpreters/Set.h
+1
-0
dbms/include/DB/Storages/MergeTree/PKCondition.h
dbms/include/DB/Storages/MergeTree/PKCondition.h
+1
-2
dbms/src/Interpreters/ExpressionAnalyzer.cpp
dbms/src/Interpreters/ExpressionAnalyzer.cpp
+29
-2
dbms/src/Interpreters/InterpreterSelectQuery.cpp
dbms/src/Interpreters/InterpreterSelectQuery.cpp
+1
-0
dbms/src/Storages/MergeTree/PKCondition.cpp
dbms/src/Storages/MergeTree/PKCondition.cpp
+18
-12
未找到文件。
dbms/include/DB/Interpreters/ExpressionAnalyzer.h
浏览文件 @
bdeee538
...
...
@@ -101,6 +101,10 @@ public:
/// Все новые временные таблицы, полученные при выполнении подзапросов GLOBAL IN.
Tables
external_tables
;
/// создает Set, заданные явно
void
makeExplicitSets
();
private:
typedef
std
::
set
<
String
>
NamesSet
;
...
...
@@ -313,6 +317,9 @@ private:
void
assertSelect
();
void
assertAggregation
();
void
assertArrayJoin
();
void
makeExplicitSet
(
ASTFunction
*
node
,
const
Block
&
sample_block
);
void
makeExplicitSetsRecursively
(
ASTPtr
&
node
,
const
Block
&
sample_block
);
};
}
dbms/include/DB/Interpreters/Set.h
浏览文件 @
bdeee538
...
...
@@ -21,6 +21,7 @@
#include <DB/Columns/ColumnArray.h>
#include <DB/Storages/MergeTree/BoolMask.h>
#include <DB/Storages/MergeTree/PKCondition.h>
namespace
DB
{
...
...
dbms/include/DB/Storages/MergeTree/PKCondition.h
浏览文件 @
bdeee538
...
...
@@ -8,7 +8,6 @@
#include <DB/Parsers/ASTSelectQuery.h>
#include <DB/Parsers/ASTFunction.h>
#include <DB/Parsers/ASTLiteral.h>
#include <DB/Columns/ColumnSet.h>
#include <DB/Storages/MergeTree/BoolMask.h>
...
...
@@ -347,7 +346,7 @@ private:
Range
range
;
size_t
key_column
;
/// Для FUNCTION_IN_SET
SetPtr
set
;
ASTPtr
in_function
;
};
typedef
std
::
vector
<
RPNElement
>
RPN
;
...
...
dbms/src/Interpreters/ExpressionAnalyzer.cpp
浏览文件 @
bdeee538
...
...
@@ -498,6 +498,26 @@ void ExpressionAnalyzer::normalizeTreeImpl(ASTPtr & ast, MapOfASTs & finished_as
finished_asts
[
initial_ast
]
=
ast
;
}
void
ExpressionAnalyzer
::
makeExplicitSets
()
{
makeExplicitSetsRecursively
(
ast
,
storage
->
getSampleBlock
());
}
void
ExpressionAnalyzer
::
makeExplicitSetsRecursively
(
ASTPtr
&
node
,
const
Block
&
sample_block
)
{
for
(
auto
&
child
:
node
->
children
)
makeExplicitSetsRecursively
(
child
,
sample_block
);
ASTFunction
*
func
=
dynamic_cast
<
ASTFunction
*>
(
node
.
get
());
if
(
func
&&
func
->
kind
==
ASTFunction
::
FUNCTION
&&
(
func
->
name
==
"in"
||
func
->
name
==
"notIn"
))
{
IAST
&
args
=
*
func
->
arguments
;
ASTPtr
&
arg
=
args
.
children
[
1
];
if
(
!
dynamic_cast
<
ASTSet
*>
(
&*
arg
)
&&
!
dynamic_cast
<
ASTSubquery
*>
(
&*
arg
))
makeExplicitSet
(
func
,
sample_block
);
}
}
void
ExpressionAnalyzer
::
findGlobalFunctions
(
ASTPtr
&
ast
,
std
::
vector
<
ASTPtr
>
&
global_nodes
)
{
...
...
@@ -679,7 +699,15 @@ void ExpressionAnalyzer::makeSet(ASTFunction * node, const Block & sample_block)
}
else
{
/// Случай явного перечисления значений.
makeExplicitSet
(
node
,
sample_block
);
}
}
/// Случай явного перечисления значений.
void
ExpressionAnalyzer
::
makeExplicitSet
(
ASTFunction
*
node
,
const
Block
&
sample_block
)
{
IAST
&
args
=
*
node
->
arguments
;
ASTPtr
&
arg
=
args
.
children
[
1
];
DataTypes
set_element_types
;
ASTPtr
&
left_arg
=
args
.
children
[
0
];
...
...
@@ -741,7 +769,6 @@ void ExpressionAnalyzer::makeSet(ASTFunction * node, const Block & sample_block)
ast_set
->
set
=
new
Set
(
settings
.
limits
);
ast_set
->
set
->
createFromAST
(
set_element_types
,
elements_ast
);
arg
=
ast_set_ptr
;
}
}
...
...
dbms/src/Interpreters/InterpreterSelectQuery.cpp
浏览文件 @
bdeee538
...
...
@@ -501,6 +501,7 @@ QueryProcessingStage::Enum InterpreterSelectQuery::executeFetchColumns(BlockInpu
QueryProcessingStage
::
Enum
from_stage
=
QueryProcessingStage
::
FetchColumns
;
query_analyzer
->
makeExplicitSets
();
/// Инициализируем изначальные потоки данных, на которые накладываются преобразования запроса. Таблица или подзапрос?
if
(
!
interpreter_subquery
)
{
...
...
dbms/src/Storages/MergeTree/PKCondition.cpp
浏览文件 @
bdeee538
...
...
@@ -3,6 +3,7 @@
#include <DB/Interpreters/ExpressionAnalyzer.h>
#include <DB/Columns/ColumnSet.h>
#include <DB/Columns/ColumnTuple.h>
#include <DB/Parsers/ASTSet.h>
namespace
DB
{
...
...
@@ -139,15 +140,11 @@ bool PKCondition::atomFromAST(ASTPtr & node, Block & block_with_constants, RPNEl
inverted
=
true
;
column
=
pk_columns
[
args
[
1
]
->
getColumnName
()];
}
/// для In, notIn
else
if
(
pk_columns
.
count
(
args
[
0
]
->
getColumnName
())
&&
dynamic_cast
<
DB
::
ColumnSet
*>
(
args
[
1
].
get
()))
else
if
(
pk_columns
.
count
(
args
[
0
]
->
getColumnName
())
&&
dynamic_cast
<
ASTSet
*>
(
args
[
1
].
get
()))
{
/// для in не бывает inverted
inverted
=
false
;
/// не поддерживаем Primary Key, если аргумент функции in tuple
if
(
dynamic_cast
<
DB
::
ColumnTuple
*>
(
args
[
0
].
get
()))
return
false
;
column
=
pk_columns
[
args
[
0
]
->
getColumnName
()];
dynamic_cast
<
ASTSet
*>
(
args
[
1
].
get
())
->
set
->
createOrderedSet
();
}
else
return
false
;
...
...
@@ -188,8 +185,7 @@ bool PKCondition::atomFromAST(ASTPtr & node, Block & block_with_constants, RPNEl
else
if
(
func
->
name
==
"in"
||
func
->
name
==
"notIn"
)
{
out
.
function
=
func
->
name
==
"in"
?
RPNElement
::
FUNCTION_IN_SET
:
RPNElement
::
FUNCTION_NOT_IN_SET
;
out
.
set
=
(
dynamic_cast
<
DB
::
ColumnSet
*>
(
args
[
1
].
get
())
->
getData
());
out
.
set
->
createOrderedSet
();
out
.
in_function
=
node
;
}
else
return
false
;
...
...
@@ -282,11 +278,21 @@ bool PKCondition::mayBeTrueInRange(const Field * left_pk, const Field * right_pk
}
else
if
(
element
.
function
==
RPNElement
::
FUNCTION_IN_SET
||
element
.
function
==
RPNElement
::
FUNCTION_NOT_IN_SET
)
{
const
Range
&
key_range
=
key_ranges
[
element
.
key_column
];
ASTFunction
*
in_func
=
dynamic_cast
<
ASTFunction
*>
(
element
.
in_function
.
get
());
ASTs
&
args
=
dynamic_cast
<
ASTExpressionList
&>
(
*
in_func
->
arguments
).
children
;
ASTSet
*
ast_set
=
dynamic_cast
<
ASTSet
*>
(
args
[
1
].
get
());
if
(
in_func
&&
ast_set
)
{
const
Range
&
key_range
=
key_ranges
[
element
.
key_column
];
rpn_stack
.
push_back
(
element
.
set
->
mayBeTrueInRange
(
key_range
.
left
,
key_range
.
right
));
if
(
element
.
function
==
RPNElement
::
FUNCTION_NOT_IN_SET
)
rpn_stack
.
back
()
=
!
rpn_stack
.
back
();
rpn_stack
.
push_back
(
ast_set
->
set
->
mayBeTrueInRange
(
key_range
.
left
,
key_range
.
right
));
if
(
element
.
function
==
RPNElement
::
FUNCTION_NOT_IN_SET
)
rpn_stack
.
back
()
=
!
rpn_stack
.
back
();
}
else
{
throw
DB
::
Exception
(
"Set for IN is not created yet!"
);
}
}
else
if
(
element
.
function
==
RPNElement
::
FUNCTION_NOT
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录