Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
0c634129
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,发现更多精彩内容 >>
提交
0c634129
编写于
7月 01, 2019
作者:
C
chertus
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add IColumn.isNullable()
上级
f19dee70
变更
16
隐藏空白更改
内联
并排
Showing
16 changed file
with
57 addition
and
32 deletion
+57
-32
dbms/src/Columns/ColumnConst.cpp
dbms/src/Columns/ColumnConst.cpp
+0
-5
dbms/src/Columns/ColumnConst.h
dbms/src/Columns/ColumnConst.h
+1
-2
dbms/src/Columns/ColumnLowCardinality.h
dbms/src/Columns/ColumnLowCardinality.h
+1
-0
dbms/src/Columns/ColumnNullable.cpp
dbms/src/Columns/ColumnNullable.cpp
+1
-9
dbms/src/Columns/ColumnNullable.h
dbms/src/Columns/ColumnNullable.h
+1
-2
dbms/src/Columns/ColumnUnique.h
dbms/src/Columns/ColumnUnique.h
+1
-1
dbms/src/Columns/IColumn.cpp
dbms/src/Columns/IColumn.cpp
+12
-0
dbms/src/Columns/IColumn.h
dbms/src/Columns/IColumn.h
+8
-1
dbms/src/Functions/array/arrayElement.cpp
dbms/src/Functions/array/arrayElement.cpp
+2
-2
dbms/src/Functions/coalesce.cpp
dbms/src/Functions/coalesce.cpp
+7
-3
dbms/src/Functions/if.cpp
dbms/src/Functions/if.cpp
+3
-3
dbms/src/Functions/multiIf.cpp
dbms/src/Functions/multiIf.cpp
+1
-1
dbms/src/Interpreters/Aggregator.h
dbms/src/Interpreters/Aggregator.h
+2
-2
dbms/src/Interpreters/Join.cpp
dbms/src/Interpreters/Join.cpp
+1
-1
dbms/tests/queries/0_stateless/00957_coalesce_const_nullable_crash.reference
...0_stateless/00957_coalesce_const_nullable_crash.reference
+7
-0
dbms/tests/queries/0_stateless/00957_coalesce_const_nullable_crash.sql
...eries/0_stateless/00957_coalesce_const_nullable_crash.sql
+9
-0
未找到文件。
dbms/src/Columns/ColumnConst.cpp
浏览文件 @
0c634129
...
...
@@ -102,9 +102,4 @@ void ColumnConst::getPermutation(bool /*reverse*/, size_t /*limit*/, int /*nan_d
res
[
i
]
=
i
;
}
bool
isColumnConst
(
const
IColumn
&
column
)
{
return
checkColumn
<
ColumnConst
>
(
column
);
}
}
dbms/src/Columns/ColumnConst.h
浏览文件 @
0c634129
...
...
@@ -197,6 +197,7 @@ public:
return
false
;
}
bool
isNullable
()
const
override
{
return
isColumnNullable
(
*
data
);
}
bool
onlyNull
()
const
override
{
return
data
->
isNullAt
(
0
);
}
bool
isNumeric
()
const
override
{
return
data
->
isNumeric
();
}
bool
isFixedAndContiguous
()
const
override
{
return
data
->
isFixedAndContiguous
();
}
...
...
@@ -216,6 +217,4 @@ public:
T
getValue
()
const
{
return
getField
().
safeGet
<
NearestFieldType
<
T
>>
();
}
};
bool
isColumnConst
(
const
IColumn
&
column
);
}
dbms/src/Columns/ColumnLowCardinality.h
浏览文件 @
0c634129
...
...
@@ -146,6 +146,7 @@ public:
size_t
sizeOfValueIfFixed
()
const
override
{
return
getDictionary
().
sizeOfValueIfFixed
();
}
bool
isNumeric
()
const
override
{
return
getDictionary
().
isNumeric
();
}
bool
lowCardinality
()
const
override
{
return
true
;
}
bool
isNullable
()
const
override
{
return
isColumnNullable
(
*
dictionary
.
getColumnUniquePtr
());
}
const
IColumnUnique
&
getDictionary
()
const
{
return
dictionary
.
getColumnUnique
();
}
const
ColumnPtr
&
getDictionaryPtr
()
const
{
return
dictionary
.
getColumnUniquePtr
();
}
...
...
dbms/src/Columns/ColumnNullable.cpp
浏览文件 @
0c634129
...
...
@@ -451,10 +451,9 @@ void ColumnNullable::checkConsistency() const
ErrorCodes
::
SIZES_OF_NESTED_COLUMNS_ARE_INCONSISTENT
);
}
ColumnPtr
makeNullable
(
const
ColumnPtr
&
column
)
{
if
(
checkColumn
<
ColumnNullable
>
(
*
column
))
if
(
isColumnNullable
(
*
column
))
return
column
;
if
(
isColumnConst
(
*
column
))
...
...
@@ -463,11 +462,4 @@ ColumnPtr makeNullable(const ColumnPtr & column)
return
ColumnNullable
::
create
(
column
,
ColumnUInt8
::
create
(
column
->
size
(),
0
));
}
bool
isNullable
(
const
IColumn
&
column
)
{
if
(
auto
*
column_const
=
checkAndGetColumn
<
ColumnConst
>
(
column
))
return
checkColumn
<
ColumnNullable
>
(
column_const
->
getDataColumn
());
return
checkColumn
<
ColumnNullable
>
(
column
);
}
}
dbms/src/Columns/ColumnNullable.h
浏览文件 @
0c634129
...
...
@@ -100,6 +100,7 @@ public:
return
false
;
}
bool
isNullable
()
const
override
{
return
true
;
}
bool
isFixedAndContiguous
()
const
override
{
return
false
;
}
bool
valuesHaveFixedSize
()
const
override
{
return
nested_column
->
valuesHaveFixedSize
();
}
size_t
sizeOfValueIfFixed
()
const
override
{
return
null_map
->
sizeOfValueIfFixed
()
+
nested_column
->
sizeOfValueIfFixed
();
}
...
...
@@ -141,8 +142,6 @@ private:
void
applyNullMapImpl
(
const
ColumnUInt8
&
map
);
};
ColumnPtr
makeNullable
(
const
ColumnPtr
&
column
);
bool
isNullable
(
const
IColumn
&
column
);
}
dbms/src/Columns/ColumnUnique.h
浏览文件 @
0c634129
...
...
@@ -191,7 +191,7 @@ ColumnUnique<ColumnType>::ColumnUnique(MutableColumnPtr && holder, bool is_nulla
{
if
(
column_holder
->
size
()
<
numSpecialValues
())
throw
Exception
(
"Too small holder column for ColumnUnique."
,
ErrorCodes
::
ILLEGAL_COLUMN
);
if
(
checkColumn
<
ColumnNullable
>
(
*
column_holder
))
if
(
isColumnNullable
(
*
column_holder
))
throw
Exception
(
"Holder column for ColumnUnique can't be nullable."
,
ErrorCodes
::
ILLEGAL_COLUMN
);
index
.
setColumn
(
getRawColumnPtr
());
...
...
dbms/src/Columns/IColumn.cpp
浏览文件 @
0c634129
#include <IO/WriteBufferFromString.h>
#include <IO/Operators.h>
#include <Columns/IColumn.h>
#include <Columns/ColumnNullable.h>
#include <Columns/ColumnConst.h>
namespace
DB
...
...
@@ -22,4 +24,14 @@ String IColumn::dumpStructure() const
return
res
.
str
();
}
bool
isColumnNullable
(
const
IColumn
&
column
)
{
return
checkColumn
<
ColumnNullable
>
(
column
);
}
bool
isColumnConst
(
const
IColumn
&
column
)
{
return
checkColumn
<
ColumnConst
>
(
column
);
}
}
dbms/src/Columns/IColumn.h
浏览文件 @
0c634129
...
...
@@ -297,6 +297,9 @@ public:
/// Various properties on behaviour of column type.
/// True if column contains something nullable inside. It's true for ColumnNullable, can be true or false for ColumnConst, etc.
virtual
bool
isNullable
()
const
{
return
false
;
}
/// It's a special kind of column, that contain single value, but is not a ColumnConst.
virtual
bool
isDummy
()
const
{
return
false
;
}
...
...
@@ -429,6 +432,10 @@ bool checkColumn(const IColumn * column)
return
checkAndGetColumn
<
Type
>
(
column
);
}
bool
isColumnConst
(
const
IColumn
&
column
);
/// defined in ColumnConst.cpp
/// True if column's an ColumnConst instance. It's just a syntax sugar for type check.
bool
isColumnConst
(
const
IColumn
&
column
);
/// True if column's an ColumnNullable instance. It's just a syntax sugar for type check.
bool
isColumnNullable
(
const
IColumn
&
column
);
}
dbms/src/Functions/array/arrayElement.cpp
浏览文件 @
0c634129
...
...
@@ -749,12 +749,12 @@ void FunctionArrayElement::executeImpl(Block & block, const ColumnNumbers & argu
col_array
=
checkAndGetColumn
<
ColumnArray
>
(
block
.
getByPosition
(
arguments
[
0
]).
column
.
get
());
if
(
col_array
)
is_array_of_nullable
=
checkColumn
<
ColumnNullable
>
(
col_array
->
getData
());
is_array_of_nullable
=
isColumnNullable
(
col_array
->
getData
());
else
{
col_const_array
=
checkAndGetColumnConstData
<
ColumnArray
>
(
block
.
getByPosition
(
arguments
[
0
]).
column
.
get
());
if
(
col_const_array
)
is_array_of_nullable
=
checkColumn
<
ColumnNullable
>
(
col_const_array
->
getData
());
is_array_of_nullable
=
isColumnNullable
(
col_const_array
->
getData
());
else
throw
Exception
(
"Illegal column "
+
block
.
getByPosition
(
arguments
[
0
]).
column
->
getName
()
+
" of first argument of function "
+
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
...
...
dbms/src/Functions/coalesce.cpp
浏览文件 @
0c634129
...
...
@@ -7,6 +7,7 @@
#include <DataTypes/getLeastSupertype.h>
#include <Core/ColumnNumbers.h>
#include <Columns/ColumnNullable.h>
#include <Columns/ColumnLowCardinality.h>
namespace
DB
...
...
@@ -150,11 +151,14 @@ public:
ColumnPtr
res
=
std
::
move
(
temp_block
.
getByPosition
(
result
).
column
);
/// if last argument is not nullable, result should be also not nullable
if
(
!
isNullable
(
*
block
.
getByPosition
(
multi_if_args
.
back
()).
column
)
&&
isNullable
(
*
res
))
if
(
!
block
.
getByPosition
(
multi_if_args
.
back
()).
column
->
isNullable
()
&&
res
->
isNullable
(
))
{
if
(
auto
*
column_const
=
checkAndGetColumn
<
ColumnConst
>
(
*
res
))
if
(
auto
*
column_lc
=
checkAndGetColumn
<
ColumnLowCardinality
>
(
*
res
))
res
=
checkAndGetColumn
<
ColumnNullable
>
(
*
column_lc
->
convertToFullColumn
())
->
getNestedColumnPtr
();
else
if
(
auto
*
column_const
=
checkAndGetColumn
<
ColumnConst
>
(
*
res
))
res
=
checkAndGetColumn
<
ColumnNullable
>
(
column_const
->
getDataColumn
())
->
getNestedColumnPtr
();
res
=
checkAndGetColumn
<
ColumnNullable
>
(
*
res
)
->
getNestedColumnPtr
();
else
res
=
checkAndGetColumn
<
ColumnNullable
>
(
*
res
)
->
getNestedColumnPtr
();
}
block
.
getByPosition
(
result
).
column
=
std
::
move
(
res
);
...
...
dbms/src/Functions/if.cpp
浏览文件 @
0c634129
...
...
@@ -693,7 +693,7 @@ private:
static
ColumnPtr
makeNullableColumnIfNot
(
const
ColumnPtr
&
column
)
{
if
(
checkColumn
<
ColumnNullable
>
(
*
column
))
if
(
isColumnNullable
(
*
column
))
return
column
;
return
ColumnNullable
::
create
(
...
...
@@ -813,7 +813,7 @@ private:
{
if
(
cond_col
)
{
if
(
checkColumn
<
ColumnNullable
>
(
*
arg_else
.
column
))
if
(
isColumnNullable
(
*
arg_else
.
column
))
{
auto
arg_else_column
=
arg_else
.
column
;
auto
result_column
=
(
*
std
::
move
(
arg_else_column
)).
mutate
();
...
...
@@ -855,7 +855,7 @@ private:
for
(
size_t
i
=
0
;
i
<
size
;
++
i
)
negated_null_map_data
[
i
]
=
!
null_map_data
[
i
];
if
(
checkColumn
<
ColumnNullable
>
(
*
arg_then
.
column
))
if
(
isColumnNullable
(
*
arg_then
.
column
))
{
auto
arg_then_column
=
arg_then
.
column
;
auto
result_column
=
(
*
std
::
move
(
arg_then_column
)).
mutate
();
...
...
dbms/src/Functions/multiIf.cpp
浏览文件 @
0c634129
...
...
@@ -152,7 +152,7 @@ public:
}
else
{
if
(
checkColumn
<
ColumnNullable
>
(
*
cond_col
.
column
))
if
(
isColumnNullable
(
*
cond_col
.
column
))
instruction
.
condition_is_nullable
=
true
;
instruction
.
condition
=
cond_col
.
column
.
get
();
...
...
dbms/src/Interpreters/Aggregator.h
浏览文件 @
0c634129
...
...
@@ -308,7 +308,7 @@ struct AggregationMethodKeysFixed
ColumnUInt8
*
null_map
;
/// If we have a nullable column, get its nested column and its null map.
if
(
has_nullable_keys
&&
checkColumn
<
ColumnNullable
>
(
*
key_columns
[
i
]))
if
(
has_nullable_keys
&&
isColumnNullable
(
*
key_columns
[
i
]))
{
ColumnNullable
&
nullable_col
=
static_cast
<
ColumnNullable
&>
(
*
key_columns
[
i
]);
observed_column
=
&
nullable_col
.
getNestedColumn
();
...
...
@@ -321,7 +321,7 @@ struct AggregationMethodKeysFixed
}
bool
is_null
;
if
(
has_nullable_keys
&&
checkColumn
<
ColumnNullable
>
(
*
key_columns
[
i
]))
if
(
has_nullable_keys
&&
isColumnNullable
(
*
key_columns
[
i
]))
{
/// The current column is nullable. Check if the value of the
/// corresponding key is nullable. Update the null map accordingly.
...
...
dbms/src/Interpreters/Join.cpp
浏览文件 @
0c634129
...
...
@@ -1411,7 +1411,7 @@ private:
const
auto
&
dst
=
out_block
.
getByPosition
(
key_pos
).
column
;
const
auto
&
src
=
sample_block_with_keys
.
getByPosition
(
i
).
column
;
if
(
checkColumn
<
ColumnNullable
>
(
*
dst
)
!=
checkColumn
<
ColumnNullable
>
(
*
src
))
if
(
isColumnNullable
(
*
dst
)
!=
isColumnNullable
(
*
src
))
nullability_changes
.
insert
(
key_pos
);
}
...
...
dbms/tests/queries/0_stateless/00957_coalesce_const_nullable_crash.reference
浏览文件 @
0c634129
...
...
@@ -2,3 +2,10 @@
2 Nullable(UInt8)
1 Nullable(UInt8)
\N Nullable(Nothing)
1 Nullable(UInt8)
2 Nullable(UInt8)
1 Nullable(UInt8)
\N Nullable(Nothing)
1 LowCardinality(Nullable(UInt8))
2 LowCardinality(Nullable(UInt8))
1 LowCardinality(Nullable(UInt8))
dbms/tests/queries/0_stateless/00957_coalesce_const_nullable_crash.sql
浏览文件 @
0c634129
...
...
@@ -2,3 +2,12 @@ SELECT coalesce(toNullable(1), toNullable(2)) as x, toTypeName(x);
SELECT
coalesce
(
NULL
,
toNullable
(
2
))
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
toNullable
(
1
),
NULL
)
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
NULL
,
NULL
)
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
toNullable
(
materialize
(
1
)),
toNullable
(
materialize
(
2
)))
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
NULL
,
toNullable
(
materialize
(
2
)))
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
toNullable
(
materialize
(
1
)),
NULL
)
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
materialize
(
NULL
),
materialize
(
NULL
))
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
toLowCardinality
(
toNullable
(
1
)),
toLowCardinality
(
toNullable
(
2
)))
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
NULL
,
toLowCardinality
(
toNullable
(
2
)))
as
x
,
toTypeName
(
x
);
SELECT
coalesce
(
toLowCardinality
(
toNullable
(
1
)),
NULL
)
as
x
,
toTypeName
(
x
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录