Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
8dac30ae
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,发现更多精彩内容 >>
提交
8dac30ae
编写于
6月 14, 2020
作者:
A
Alexey Milovidov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Split file for better build times
上级
067cf4cc
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
148 addition
and
132 deletion
+148
-132
src/Common/FieldVisitors.h
src/Common/FieldVisitors.h
+0
-128
src/Common/FieldVisitorsAccurateComparison.h
src/Common/FieldVisitorsAccurateComparison.h
+142
-0
src/Functions/array/arrayIndex.h
src/Functions/array/arrayIndex.h
+1
-1
src/Interpreters/FillingRow.cpp
src/Interpreters/FillingRow.cpp
+2
-0
src/Interpreters/FillingRow.h
src/Interpreters/FillingRow.h
+1
-1
src/Interpreters/InterpreterSelectQuery.cpp
src/Interpreters/InterpreterSelectQuery.cpp
+1
-1
src/Storages/MergeTree/KeyCondition.cpp
src/Storages/MergeTree/KeyCondition.cpp
+1
-1
未找到文件。
src/Common/FieldVisitors.h
浏览文件 @
8dac30ae
#pragma once
#include <Core/Field.h>
#include <Core/AccurateComparison.h>
#include <common/demangle.h>
#include <IO/ReadBufferFromString.h>
#include <IO/ReadHelpers.h>
class
SipHash
;
...
...
@@ -16,7 +13,6 @@ namespace DB
namespace
ErrorCodes
{
extern
const
int
CANNOT_CONVERT_TYPE
;
extern
const
int
BAD_TYPE_OF_FIELD
;
extern
const
int
LOGICAL_ERROR
;
}
...
...
@@ -179,130 +175,6 @@ template <> constexpr bool isDecimalField<DecimalField<Decimal64>>() { return tr
template
<
>
constexpr
bool
isDecimalField
<
DecimalField
<
Decimal128
>>
()
{
return
true
;
}
/** More precise comparison, used for index.
* Differs from Field::operator< and Field::operator== in that it also compares values of different types.
* Comparison rules are same as in FunctionsComparison (to be consistent with expression evaluation in query).
*/
class
FieldVisitorAccurateEquals
:
public
StaticVisitor
<
bool
>
{
public:
template
<
typename
T
,
typename
U
>
bool
operator
()
(
const
T
&
l
,
const
U
&
r
)
const
{
if
constexpr
(
std
::
is_same_v
<
T
,
Null
>
||
std
::
is_same_v
<
U
,
Null
>
)
return
std
::
is_same_v
<
T
,
U
>
;
else
{
if
constexpr
(
std
::
is_same_v
<
T
,
U
>
)
return
l
==
r
;
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
&&
std
::
is_arithmetic_v
<
U
>
)
return
accurate
::
equalsOp
(
l
,
r
);
if
constexpr
(
isDecimalField
<
T
>
()
&&
isDecimalField
<
U
>
())
return
l
==
r
;
if
constexpr
(
isDecimalField
<
T
>
()
&&
std
::
is_arithmetic_v
<
U
>
)
return
l
==
DecimalField
<
Decimal128
>
(
r
,
0
);
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
&&
isDecimalField
<
U
>
())
return
DecimalField
<
Decimal128
>
(
l
,
0
)
==
r
;
if
constexpr
(
std
::
is_same_v
<
T
,
String
>
)
{
if
constexpr
(
std
::
is_same_v
<
U
,
UInt128
>
)
return
stringToUUID
(
l
)
==
r
;
if
constexpr
(
std
::
is_arithmetic_v
<
U
>
)
{
ReadBufferFromString
in
(
l
);
T
parsed
;
readText
(
parsed
,
in
);
return
operator
()(
parsed
,
r
);
}
}
if
constexpr
(
std
::
is_same_v
<
U
,
String
>
)
{
if
constexpr
(
std
::
is_same_v
<
T
,
UInt128
>
)
return
l
==
stringToUUID
(
r
);
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
)
{
ReadBufferFromString
in
(
r
);
T
parsed
;
readText
(
parsed
,
in
);
return
operator
()(
l
,
parsed
);
}
}
}
throw
Exception
(
"Cannot compare "
+
demangle
(
typeid
(
T
).
name
())
+
" with "
+
demangle
(
typeid
(
U
).
name
()),
ErrorCodes
::
BAD_TYPE_OF_FIELD
);
}
};
class
FieldVisitorAccurateLess
:
public
StaticVisitor
<
bool
>
{
public:
template
<
typename
T
,
typename
U
>
bool
operator
()
(
const
T
&
l
,
const
U
&
r
)
const
{
if
constexpr
(
std
::
is_same_v
<
T
,
Null
>
||
std
::
is_same_v
<
U
,
Null
>
)
return
false
;
else
{
if
constexpr
(
std
::
is_same_v
<
T
,
U
>
)
return
l
<
r
;
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
&&
std
::
is_arithmetic_v
<
U
>
)
return
accurate
::
lessOp
(
l
,
r
);
if
constexpr
(
isDecimalField
<
T
>
()
&&
isDecimalField
<
U
>
())
return
l
<
r
;
if
constexpr
(
isDecimalField
<
T
>
()
&&
std
::
is_arithmetic_v
<
U
>
)
return
l
<
DecimalField
<
Decimal128
>
(
r
,
0
);
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
&&
isDecimalField
<
U
>
())
return
DecimalField
<
Decimal128
>
(
l
,
0
)
<
r
;
if
constexpr
(
std
::
is_same_v
<
T
,
String
>
)
{
if
constexpr
(
std
::
is_same_v
<
U
,
UInt128
>
)
return
stringToUUID
(
l
)
<
r
;
if
constexpr
(
std
::
is_arithmetic_v
<
U
>
)
{
ReadBufferFromString
in
(
l
);
T
parsed
;
readText
(
parsed
,
in
);
return
operator
()(
parsed
,
r
);
}
}
if
constexpr
(
std
::
is_same_v
<
U
,
String
>
)
{
if
constexpr
(
std
::
is_same_v
<
T
,
UInt128
>
)
return
l
<
stringToUUID
(
r
);
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
)
{
ReadBufferFromString
in
(
r
);
T
parsed
;
readText
(
parsed
,
in
);
return
operator
()(
l
,
parsed
);
}
}
}
throw
Exception
(
"Cannot compare "
+
demangle
(
typeid
(
T
).
name
())
+
" with "
+
demangle
(
typeid
(
U
).
name
()),
ErrorCodes
::
BAD_TYPE_OF_FIELD
);
}
};
/** Implements `+=` operation.
* Returns false if the result is zero.
*/
...
...
src/Common/FieldVisitorsAccurateComparison.h
0 → 100644
浏览文件 @
8dac30ae
#pragma once
#include <Core/Field.h>
#include <Core/AccurateComparison.h>
#include <common/demangle.h>
#include <Common/FieldVisitors.h>
#include <IO/ReadBufferFromString.h>
#include <IO/ReadHelpers.h>
namespace
DB
{
namespace
ErrorCodes
{
extern
const
int
BAD_TYPE_OF_FIELD
;
}
/** More precise comparison, used for index.
* Differs from Field::operator< and Field::operator== in that it also compares values of different types.
* Comparison rules are same as in FunctionsComparison (to be consistent with expression evaluation in query).
*/
class
FieldVisitorAccurateEquals
:
public
StaticVisitor
<
bool
>
{
public:
template
<
typename
T
,
typename
U
>
bool
operator
()
(
const
T
&
l
,
const
U
&
r
)
const
{
if
constexpr
(
std
::
is_same_v
<
T
,
Null
>
||
std
::
is_same_v
<
U
,
Null
>
)
return
std
::
is_same_v
<
T
,
U
>
;
else
{
if
constexpr
(
std
::
is_same_v
<
T
,
U
>
)
return
l
==
r
;
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
&&
std
::
is_arithmetic_v
<
U
>
)
return
accurate
::
equalsOp
(
l
,
r
);
if
constexpr
(
isDecimalField
<
T
>
()
&&
isDecimalField
<
U
>
())
return
l
==
r
;
if
constexpr
(
isDecimalField
<
T
>
()
&&
std
::
is_arithmetic_v
<
U
>
)
return
l
==
DecimalField
<
Decimal128
>
(
r
,
0
);
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
&&
isDecimalField
<
U
>
())
return
DecimalField
<
Decimal128
>
(
l
,
0
)
==
r
;
if
constexpr
(
std
::
is_same_v
<
T
,
String
>
)
{
if
constexpr
(
std
::
is_same_v
<
U
,
UInt128
>
)
return
stringToUUID
(
l
)
==
r
;
if
constexpr
(
std
::
is_arithmetic_v
<
U
>
)
{
ReadBufferFromString
in
(
l
);
T
parsed
;
readText
(
parsed
,
in
);
return
operator
()(
parsed
,
r
);
}
}
if
constexpr
(
std
::
is_same_v
<
U
,
String
>
)
{
if
constexpr
(
std
::
is_same_v
<
T
,
UInt128
>
)
return
l
==
stringToUUID
(
r
);
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
)
{
ReadBufferFromString
in
(
r
);
T
parsed
;
readText
(
parsed
,
in
);
return
operator
()(
l
,
parsed
);
}
}
}
throw
Exception
(
"Cannot compare "
+
demangle
(
typeid
(
T
).
name
())
+
" with "
+
demangle
(
typeid
(
U
).
name
()),
ErrorCodes
::
BAD_TYPE_OF_FIELD
);
}
};
class
FieldVisitorAccurateLess
:
public
StaticVisitor
<
bool
>
{
public:
template
<
typename
T
,
typename
U
>
bool
operator
()
(
const
T
&
l
,
const
U
&
r
)
const
{
if
constexpr
(
std
::
is_same_v
<
T
,
Null
>
||
std
::
is_same_v
<
U
,
Null
>
)
return
false
;
else
{
if
constexpr
(
std
::
is_same_v
<
T
,
U
>
)
return
l
<
r
;
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
&&
std
::
is_arithmetic_v
<
U
>
)
return
accurate
::
lessOp
(
l
,
r
);
if
constexpr
(
isDecimalField
<
T
>
()
&&
isDecimalField
<
U
>
())
return
l
<
r
;
if
constexpr
(
isDecimalField
<
T
>
()
&&
std
::
is_arithmetic_v
<
U
>
)
return
l
<
DecimalField
<
Decimal128
>
(
r
,
0
);
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
&&
isDecimalField
<
U
>
())
return
DecimalField
<
Decimal128
>
(
l
,
0
)
<
r
;
if
constexpr
(
std
::
is_same_v
<
T
,
String
>
)
{
if
constexpr
(
std
::
is_same_v
<
U
,
UInt128
>
)
return
stringToUUID
(
l
)
<
r
;
if
constexpr
(
std
::
is_arithmetic_v
<
U
>
)
{
ReadBufferFromString
in
(
l
);
T
parsed
;
readText
(
parsed
,
in
);
return
operator
()(
parsed
,
r
);
}
}
if
constexpr
(
std
::
is_same_v
<
U
,
String
>
)
{
if
constexpr
(
std
::
is_same_v
<
T
,
UInt128
>
)
return
l
<
stringToUUID
(
r
);
if
constexpr
(
std
::
is_arithmetic_v
<
T
>
)
{
ReadBufferFromString
in
(
r
);
T
parsed
;
readText
(
parsed
,
in
);
return
operator
()(
l
,
parsed
);
}
}
}
throw
Exception
(
"Cannot compare "
+
demangle
(
typeid
(
T
).
name
())
+
" with "
+
demangle
(
typeid
(
U
).
name
()),
ErrorCodes
::
BAD_TYPE_OF_FIELD
);
}
};
}
src/Functions/array/arrayIndex.h
浏览文件 @
8dac30ae
...
...
@@ -9,7 +9,7 @@
#include <Columns/ColumnFixedString.h>
#include <Columns/ColumnsNumber.h>
#include <Columns/ColumnNullable.h>
#include <Common/FieldVisitors.h>
#include <Common/FieldVisitors
AccurateComparison
.h>
#include <Common/memcmpSmall.h>
#include <Common/assert_cast.h>
...
...
src/Interpreters/FillingRow.cpp
浏览文件 @
8dac30ae
#include <Interpreters/FillingRow.h>
#include <Common/FieldVisitorsAccurateComparison.h>
namespace
DB
{
...
...
src/Interpreters/FillingRow.h
浏览文件 @
8dac30ae
#pragma once
#include <Core/SortDescription.h>
#include <Columns/IColumn.h>
#include <Common/FieldVisitors.h>
namespace
DB
{
...
...
src/Interpreters/InterpreterSelectQuery.cpp
浏览文件 @
8dac30ae
...
...
@@ -37,7 +37,7 @@
#include <Core/Field.h>
#include <Core/Types.h>
#include <Columns/Collator.h>
#include <Common/FieldVisitors.h>
#include <Common/FieldVisitors
AccurateComparison
.h>
#include <Common/typeid_cast.h>
#include <Common/checkStackSize.h>
#include <ext/map.h>
...
...
src/Storages/MergeTree/KeyCondition.cpp
浏览文件 @
8dac30ae
...
...
@@ -7,7 +7,7 @@
#include <Interpreters/misc.h>
#include <Functions/FunctionFactory.h>
#include <Functions/IFunction.h>
#include <Common/FieldVisitors.h>
#include <Common/FieldVisitors
AccurateComparison
.h>
#include <Common/typeid_cast.h>
#include <Interpreters/convertFieldToType.h>
#include <Interpreters/Set.h>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录