Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
fff1593b
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,发现更多精彩内容 >>
提交
fff1593b
编写于
4月 01, 2014
作者:
S
Sergey Fedorov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
dbms: Sending only required external tables to remote servers [METR-10071]
上级
e4266679
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
43 addition
and
6 deletion
+43
-6
dbms/include/DB/Interpreters/ExpressionAnalyzer.h
dbms/include/DB/Interpreters/ExpressionAnalyzer.h
+3
-2
dbms/src/Interpreters/ExpressionAnalyzer.cpp
dbms/src/Interpreters/ExpressionAnalyzer.cpp
+37
-2
dbms/src/Interpreters/InterpreterSelectQuery.cpp
dbms/src/Interpreters/InterpreterSelectQuery.cpp
+3
-2
未找到文件。
dbms/include/DB/Interpreters/ExpressionAnalyzer.h
浏览文件 @
fff1593b
...
...
@@ -100,7 +100,7 @@ public:
Block
getSelectSampleBlock
();
/// Все новые временные таблицы, полученные при выполнении подзапросов GLOBAL IN.
std
::
vector
<
StoragePtr
>
external_tables
;
Tables
external_tables
;
private:
typedef
std
::
set
<
String
>
NamesSet
;
...
...
@@ -263,7 +263,8 @@ private:
/// Обходит запрос и сохраняет найденные глобальные функции (например GLOBAL IN)
void
findGlobalFunctions
(
ASTPtr
&
ast
,
std
::
vector
<
ASTPtr
>
&
global_nodes
);
void
findExternalTables
(
ASTPtr
&
ast
);
/// Превратить перечисление значений или подзапрос в ASTSet. node - функция in или notIn.
void
makeSet
(
ASTFunction
*
node
,
const
Block
&
sample_block
);
/// Выполнить подзапрос в секции GLOBAL IN и запомнить результат во временную таблицу типа memory
...
...
dbms/src/Interpreters/ExpressionAnalyzer.cpp
浏览文件 @
fff1593b
...
...
@@ -516,6 +516,34 @@ void ExpressionAnalyzer::findGlobalFunctions(ASTPtr & ast, std::vector<ASTPtr> &
}
void
ExpressionAnalyzer
::
findExternalTables
(
ASTPtr
&
ast
)
{
/// Рекурсивные вызовы. Намеренно опускаемся в подзапросы.
for
(
ASTs
::
iterator
it
=
ast
->
children
.
begin
();
it
!=
ast
->
children
.
end
();
++
it
)
findExternalTables
(
*
it
);
/// Если идентификатор типа таблица
StoragePtr
external_storage
;
if
(
ASTIdentifier
*
node
=
dynamic_cast
<
ASTIdentifier
*>
(
&*
ast
))
if
(
node
->
kind
==
ASTIdentifier
::
Kind
::
Table
)
if
(
external_storage
=
context
.
tryGetExternalTable
(
node
->
name
))
external_tables
[
node
->
name
]
=
external_storage
;
if
(
ASTFunction
*
node
=
dynamic_cast
<
ASTFunction
*>
(
&*
ast
))
{
if
(
node
->
name
==
"globalIn"
||
node
->
name
==
"globalNotIn"
||
node
->
name
==
"In"
||
node
->
name
==
"NotIn"
)
{
IAST
&
args
=
*
node
->
arguments
;
ASTPtr
&
arg
=
args
.
children
[
1
];
/// Если имя таблицы для селекта
if
(
ASTIdentifier
*
id
=
dynamic_cast
<
ASTIdentifier
*>
(
&*
arg
))
if
(
external_storage
=
context
.
tryGetExternalTable
(
id
->
name
))
external_tables
[
id
->
name
]
=
external_storage
;
}
}
}
void
ExpressionAnalyzer
::
addExternalStorage
(
ASTFunction
*
node
,
size_t
&
name_id
)
{
IAST
&
args
=
*
node
->
arguments
;
...
...
@@ -542,8 +570,13 @@ void ExpressionAnalyzer::addExternalStorage(ASTFunction * node, size_t & name_id
{
ParserSelectQuery
parser
;
if
(
context
.
tryGetExternalTable
(
table
->
name
))
StoragePtr
existing_storage
;
if
(
existing_storage
=
context
.
tryGetExternalTable
(
table
->
name
))
{
external_tables
[
table
->
name
]
=
existing_storage
;
return
;
}
String
query
=
"SELECT * FROM "
+
table
->
name
;
const
char
*
begin
=
query
.
data
();
...
...
@@ -573,7 +606,7 @@ void ExpressionAnalyzer::addExternalStorage(ASTFunction * node, size_t & name_id
ast_ident
->
kind
=
ASTIdentifier
::
Table
;
ast_ident
->
name
=
external_storage
->
getTableName
();
arg
=
ast_ident
;
external_tables
.
push_back
(
external_storage
)
;
external_tables
[
external_table_name
]
=
external_storage
;
}
else
throw
Exception
(
"GLOBAL [NOT] IN supports only SELECT data."
,
ErrorCodes
::
BAD_ARGUMENTS
);
...
...
@@ -1177,6 +1210,8 @@ void ExpressionAnalyzer::processGlobalOperations()
++
id
;
addExternalStorage
(
dynamic_cast
<
ASTFunction
*>
(
&*
global_nodes
[
i
]),
id
);
}
findExternalTables
(
ast
);
}
bool
ExpressionAnalyzer
::
appendArrayJoin
(
ExpressionActionsChain
&
chain
,
bool
only_types
)
...
...
dbms/src/Interpreters/InterpreterSelectQuery.cpp
浏览文件 @
fff1593b
...
...
@@ -83,7 +83,8 @@ void InterpreterSelectQuery::init(BlockInputStreamPtr input_, const NamesAndType
/// Сохраняем в query context новые временные таблицы
for
(
auto
&
it
:
query_analyzer
->
external_tables
)
context
.
addExternalTable
(
it
->
getTableName
(),
it
);
if
(
!
(
context
.
tryGetExternalTable
(
it
.
first
)))
context
.
addExternalTable
(
it
.
first
,
it
.
second
);
if
(
input_
)
streams
.
push_back
(
input_
);
...
...
@@ -504,7 +505,7 @@ QueryProcessingStage::Enum InterpreterSelectQuery::executeFetchColumns(BlockInpu
if
(
!
interpreter_subquery
)
{
if
(
storage
->
isRemote
())
storage
->
storeExternalTables
(
context
.
getExternalTables
()
);
storage
->
storeExternalTables
(
query_analyzer
->
external_tables
);
streams
=
storage
->
read
(
required_columns
,
query_ptr
,
settings_for_storage
,
from_stage
,
settings
.
max_block_size
,
settings
.
max_threads
);
for
(
auto
stream
:
streams
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录