Merge pull request #28349 from vdimir/issue-27691-qf

Fix non joined rows from nullable column
This commit is contained in:
Vladimir C 2021-08-31 17:09:24 +03:00 committed by GitHub
commit 94d5f3a87b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 70 additions and 6 deletions

View File

@ -9,7 +9,6 @@
#include <DataTypes/DataTypeLowCardinality.h>
#include <DataTypes/DataTypeNullable.h>
#include <DataTypes/DataTypesNumber.h>
#include <DataTypes/getLeastSupertype.h>
#include <IO/WriteHelpers.h>
@ -30,12 +29,41 @@ namespace ErrorCodes
namespace
{
void insertFromNullableOrDefault(MutableColumnPtr & dst, const ColumnNullable * nullable_col)
{
const auto & nested = nullable_col->getNestedColumn();
const auto & nullmap = nullable_col->getNullMapColumn().getData();
if (auto * lc = typeid_cast<ColumnLowCardinality *>(dst.get()); lc && !nested.lowCardinality())
{
for (size_t i = 0; i < nullable_col->size(); ++i)
{
if (nullmap[i])
lc->insertDefault();
else
lc->insertRangeFromFullColumn(nested, i, 1);
}
}
else
{
for (size_t i = 0; i < nullable_col->size(); ++i)
{
if (nullmap[i])
dst->insertDefault();
else
dst->insertFrom(nested, i);
}
}
}
ColumnPtr changeLowCardinality(const ColumnPtr & column, const ColumnPtr & dst_sample)
{
if (dst_sample->lowCardinality())
{
MutableColumnPtr lc = dst_sample->cloneEmpty();
typeid_cast<ColumnLowCardinality &>(*lc).insertRangeFromFullColumn(*column, 0, column->size());
if (const auto * nullable_col = typeid_cast<const ColumnNullable *>(column.get()))
insertFromNullableOrDefault(lc, nullable_col);
else
typeid_cast<ColumnLowCardinality &>(*lc).insertRangeFromFullColumn(*column, 0, column->size());
return lc;
}
@ -190,9 +218,9 @@ void removeColumnNullability(ColumnWithTypeAndName & column)
if (column.column && column.column->isNullable())
{
const auto * nullable_column = checkAndGetColumn<ColumnNullable>(*column.column);
ColumnPtr nested_column = nullable_column->getNestedColumnPtr();
MutableColumnPtr mutable_column = IColumn::mutate(std::move(nested_column));
const auto * nullable_col = checkAndGetColumn<ColumnNullable>(*column.column);
MutableColumnPtr mutable_column = nullable_col->getNestedColumn().cloneEmpty();
insertFromNullableOrDefault(mutable_column, nullable_col);
column.column = std::move(mutable_column);
}
}

View File

@ -1,8 +1,8 @@
#include <Processors/Transforms/JoiningTransform.h>
#include <Interpreters/ExpressionAnalyzer.h>
#include <Interpreters/join_common.h>
#include <DataStreams/IBlockInputStream.h>
#include <common/logger_useful.h>
namespace DB
{
@ -15,7 +15,9 @@ namespace ErrorCodes
Block JoiningTransform::transformHeader(Block header, const JoinPtr & join)
{
ExtraBlockPtr tmp;
LOG_DEBUG(&Poco::Logger::get("JoiningTransform"), "Before join block: '{}'", header.dumpStructure());
join->joinBlock(header, tmp);
LOG_DEBUG(&Poco::Logger::get("JoiningTransform"), "After join block: '{}'", header.dumpStructure());
return header;
}

View File

@ -22,3 +22,13 @@
13 13
14 14
\N 8
0 0
0 2
0 4
0 6
0 8
1 1
3 3
5 5
7 7
9 9

View File

@ -30,3 +30,13 @@ ANY RIGHT JOIN
(
SELECT nullIf(number, 8) AS k, toString(number) AS b FROM system.numbers LIMIT 5, 10
) js2 USING (k) ORDER BY k;
SELECT k, b
FROM
(
SELECT number + 1 AS k FROM numbers(10)
) js1
RIGHT JOIN
(
SELECT nullIf(number, if(number % 2 == 0, number, 0)) AS k, number AS b FROM numbers(10)
) js2 USING (k) ORDER BY k, b;

View File

@ -13,6 +13,8 @@
0 \N Nullable(String)
1 l \N Nullable(String)
-
0
-
1 l \N Nullable(String)
2 \N \N Nullable(String)
1 l \N Nullable(String)
@ -27,3 +29,6 @@
\N \N \N Nullable(String)
1 l \N Nullable(String)
\N \N \N Nullable(String)
-
\N \N
-

View File

@ -27,6 +27,10 @@ SELECT x, lc, materialize(r.lc) y, toTypeName(y) FROM t AS l FULL JOIN nr AS r U
SELECT '-';
SELECT x, lc FROM t AS l RIGHT JOIN nr AS r USING (lc);
SELECT '-';
SET join_use_nulls = 1;
SELECT x, lc, r.lc, toTypeName(r.lc) FROM t AS l LEFT JOIN nr AS r USING (x) ORDER BY x;
@ -45,6 +49,11 @@ SELECT x, lc, materialize(r.lc) y, toTypeName(y) FROM t AS l LEFT JOIN nr AS r U
SELECT x, lc, materialize(r.lc) y, toTypeName(y) FROM t AS l RIGHT JOIN nr AS r USING (lc) ORDER BY x;
SELECT x, lc, materialize(r.lc) y, toTypeName(y) FROM t AS l FULL JOIN nr AS r USING (lc) ORDER BY x;
SELECT '-';
SELECT x, lc FROM t AS l RIGHT JOIN nr AS r USING (lc);
SELECT '-';
DROP TABLE t;
DROP TABLE nr;