fix arrayIndex for new columns's isNullable

This commit is contained in:
chertus 2019-06-27 15:49:08 +03:00
parent 65c0d23efa
commit 68034103bb
2 changed files with 18 additions and 23 deletions

View File

@ -907,22 +907,21 @@ public:
/// (they are vectors of Fields, which may represent the NULL value), /// (they are vectors of Fields, which may represent the NULL value),
/// they do not require any preprocessing /// they do not require any preprocessing
/// Check if the 1st function argument is a non-constant array of nullable
/// values.
bool is_nullable;
const ColumnArray * col_array = checkAndGetColumn<ColumnArray>(block.getByPosition(arguments[0]).column.get()); const ColumnArray * col_array = checkAndGetColumn<ColumnArray>(block.getByPosition(arguments[0]).column.get());
if (col_array)
is_nullable = col_array->getData().isColumnNullable();
else
is_nullable = false;
/// Check nullability of the 2nd function argument. const ColumnNullable * nullable = nullptr;
bool is_arg_nullable = block.getByPosition(arguments[1]).column->isColumnNullable(); if (col_array && !col_array->getData().isColumnConst())
nullable = getNullableColumn(col_array->getData());
if (!is_nullable && !is_arg_nullable) auto & arg_column = block.getByPosition(arguments[1]).column;
const ColumnNullable * arg_nullable = nullptr;
if (!arg_column->isColumnConst())
arg_nullable = getNullableColumn(*arg_column);
if (!nullable && !arg_nullable)
{ {
/// Simple case: no nullable value is passed. /// Simple case: no or constant nullable values passeded.
perform(block, arguments, result); perform(block, arguments, result);
} }
else else
@ -955,10 +954,9 @@ public:
} }
}; };
if (is_nullable) if (nullable)
{ {
const auto & nullable_col = static_cast<const ColumnNullable &>(col_array->getData()); const auto & nested_col = nullable->getNestedColumnPtr();
const auto & nested_col = nullable_col.getNestedColumnPtr();
auto & data = source_block.getByPosition(0); auto & data = source_block.getByPosition(0);
data.column = ColumnArray::create(nested_col, col_array->getOffsetsPtr()); data.column = ColumnArray::create(nested_col, col_array->getOffsetsPtr());
@ -967,7 +965,7 @@ public:
*static_cast<const DataTypeArray &>(*block.getByPosition(arguments[0]).type).getNestedType()).getNestedType()); *static_cast<const DataTypeArray &>(*block.getByPosition(arguments[0]).type).getNestedType()).getNestedType());
auto & null_map = source_block.getByPosition(2); auto & null_map = source_block.getByPosition(2);
null_map.column = nullable_col.getNullMapColumnPtr(); null_map.column = nullable->getNullMapColumnPtr();
null_map.type = std::make_shared<DataTypeUInt8>(); null_map.type = std::make_shared<DataTypeUInt8>();
} }
else else
@ -976,17 +974,14 @@ public:
data = block.getByPosition(arguments[0]); data = block.getByPosition(arguments[0]);
} }
if (is_arg_nullable) if (arg_nullable)
{ {
const auto & col = block.getByPosition(arguments[1]).column;
const auto & nullable_col = static_cast<const ColumnNullable &>(*col);
auto & arg = source_block.getByPosition(1); auto & arg = source_block.getByPosition(1);
arg.column = nullable_col.getNestedColumnPtr(); arg.column = arg_nullable->getNestedColumnPtr();
arg.type = static_cast<const DataTypeNullable &>(*block.getByPosition(arguments[1]).type).getNestedType(); arg.type = static_cast<const DataTypeNullable &>(*block.getByPosition(arguments[1]).type).getNestedType();
auto & null_map = source_block.getByPosition(3); auto & null_map = source_block.getByPosition(3);
null_map.column = nullable_col.getNullMapColumnPtr(); null_map.column = arg_nullable->getNullMapColumnPtr();
null_map.type = std::make_shared<DataTypeUInt8>(); null_map.type = std::make_shared<DataTypeUInt8>();
} }
else else

View File

@ -73,7 +73,7 @@ static ColumnWithTypeAndName correctNullability(ColumnWithTypeAndName && column,
if (negative_null_map.size()) if (negative_null_map.size())
{ {
MutableColumnPtr mutable_column = (*std::move(column.column)).mutate(); MutableColumnPtr mutable_column = (*std::move(column.column)).mutate();
static_cast<ColumnNullable &>(*mutable_column).applyNegatedNullMap(negative_null_map); getNullableColumnRef(*mutable_column).applyNegatedNullMap(negative_null_map);
column.column = std::move(mutable_column); column.column = std::move(mutable_column);
} }
} }