mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 00:22:29 +00:00
dbms: fixed error with IN [#METR-15293].
This commit is contained in:
parent
a21b2573c5
commit
9981a29365
@ -55,9 +55,8 @@ struct SetMethodOneNumber
|
||||
Key getKey(
|
||||
const ConstColumnPlainPtrs & key_columns, /// Ключевые столбцы.
|
||||
size_t keys_size, /// Количество ключевых столбцов.
|
||||
size_t i, /// Из какой строки блока достать ключ.
|
||||
const Sizes & key_sizes, /// Если ключи фиксированной длины - их длины. Не используется в методах по ключам переменной длины.
|
||||
StringRefs & keys) const /// Сюда могут быть записаны ссылки на данные ключей в столбцах. Они могут быть использованы в дальнейшем.
|
||||
size_t i, /// Из какой строки блока достать ключ.
|
||||
const Sizes & key_sizes) const /// Если ключи фиксированной длины - их длины. Не используется в методах по ключам переменной длины.
|
||||
{
|
||||
return unionCastToUInt64(vec[i]);
|
||||
}
|
||||
@ -65,7 +64,7 @@ struct SetMethodOneNumber
|
||||
|
||||
/** Разместить дополнительные данные, если это необходимо, в случае, когда в хэш-таблицу был вставлен новый ключ.
|
||||
*/
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, StringRefs & keys, Arena & pool) {}
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, Arena & pool) {}
|
||||
};
|
||||
|
||||
/// Для случая, когда есть один строковый ключ.
|
||||
@ -94,8 +93,7 @@ struct SetMethodString
|
||||
const ConstColumnPlainPtrs & key_columns,
|
||||
size_t keys_size,
|
||||
size_t i,
|
||||
const Sizes & key_sizes,
|
||||
StringRefs & keys) const
|
||||
const Sizes & key_sizes) const
|
||||
{
|
||||
return StringRef(
|
||||
&(*chars)[i == 0 ? 0 : (*offsets)[i - 1]],
|
||||
@ -103,7 +101,7 @@ struct SetMethodString
|
||||
}
|
||||
};
|
||||
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, StringRefs & keys, Arena & pool)
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, Arena & pool)
|
||||
{
|
||||
value.data = pool.insert(value.data, value.size);
|
||||
}
|
||||
@ -135,14 +133,13 @@ struct SetMethodFixedString
|
||||
const ConstColumnPlainPtrs & key_columns,
|
||||
size_t keys_size,
|
||||
size_t i,
|
||||
const Sizes & key_sizes,
|
||||
StringRefs & keys) const
|
||||
const Sizes & key_sizes) const
|
||||
{
|
||||
return StringRef(&(*chars)[i * n], n);
|
||||
}
|
||||
};
|
||||
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, StringRefs & keys, Arena & pool)
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, Arena & pool)
|
||||
{
|
||||
value.data = pool.insert(value.data, value.size);
|
||||
}
|
||||
@ -167,14 +164,13 @@ struct SetMethodKeysFixed
|
||||
const ConstColumnPlainPtrs & key_columns,
|
||||
size_t keys_size,
|
||||
size_t i,
|
||||
const Sizes & key_sizes,
|
||||
StringRefs & keys) const
|
||||
const Sizes & key_sizes) const
|
||||
{
|
||||
return packFixed<Key>(i, keys_size, key_columns, key_sizes);
|
||||
}
|
||||
};
|
||||
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, StringRefs & keys, Arena & pool) {}
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, Arena & pool) {}
|
||||
};
|
||||
|
||||
/// Для остальных случаев. По 128 битному хэшу от ключа. (При этом, строки, содержащие нули посередине, могут склеиться.)
|
||||
@ -196,14 +192,13 @@ struct SetMethodHashed
|
||||
const ConstColumnPlainPtrs & key_columns,
|
||||
size_t keys_size,
|
||||
size_t i,
|
||||
const Sizes & key_sizes,
|
||||
StringRefs & keys) const
|
||||
const Sizes & key_sizes) const
|
||||
{
|
||||
return hash128(i, keys_size, key_columns, keys);
|
||||
return hash128(i, keys_size, key_columns);
|
||||
}
|
||||
};
|
||||
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, StringRefs & keys, Arena & pool) {}
|
||||
static void onNewKey(typename Data::value_type & value, size_t keys_size, size_t i, Arena & pool) {}
|
||||
};
|
||||
|
||||
|
||||
@ -367,7 +362,6 @@ private:
|
||||
Method & method,
|
||||
const ConstColumnPlainPtrs & key_columns,
|
||||
size_t rows,
|
||||
StringRefs & keys,
|
||||
SetVariants & variants);
|
||||
|
||||
template <typename Method>
|
||||
@ -376,8 +370,7 @@ private:
|
||||
const ConstColumnPlainPtrs & key_columns,
|
||||
ColumnUInt8::Container_t & vec_res,
|
||||
bool negative,
|
||||
size_t rows,
|
||||
StringRefs & keys) const;
|
||||
size_t rows) const;
|
||||
|
||||
template <typename Method>
|
||||
void executeArrayImpl(
|
||||
@ -386,8 +379,7 @@ private:
|
||||
const ColumnArray::Offsets_t & offsets,
|
||||
ColumnUInt8::Container_t & vec_res,
|
||||
bool negative,
|
||||
size_t rows,
|
||||
StringRefs & keys) const;
|
||||
size_t rows) const;
|
||||
};
|
||||
|
||||
typedef Poco::SharedPtr<Set> SetPtr;
|
||||
|
@ -140,7 +140,6 @@ void NO_INLINE Set::insertFromBlockImpl(
|
||||
Method & method,
|
||||
const ConstColumnPlainPtrs & key_columns,
|
||||
size_t rows,
|
||||
StringRefs & keys,
|
||||
SetVariants & variants)
|
||||
{
|
||||
typename Method::State state;
|
||||
@ -151,14 +150,14 @@ void NO_INLINE Set::insertFromBlockImpl(
|
||||
for (size_t i = 0; i < rows; ++i)
|
||||
{
|
||||
/// Строим ключ
|
||||
typename Method::Key key = state.getKey(key_columns, keys_size, i, key_sizes, keys);
|
||||
typename Method::Key key = state.getKey(key_columns, keys_size, i, key_sizes);
|
||||
|
||||
typename Method::Data::iterator it = method.data.find(key);
|
||||
bool inserted;
|
||||
method.data.emplace(key, it, inserted);
|
||||
|
||||
if (inserted)
|
||||
method.onNewKey(*it, keys_size, i, keys, variants.string_pool);
|
||||
method.onNewKey(*it, keys_size, i, variants.string_pool);
|
||||
}
|
||||
}
|
||||
|
||||
@ -184,12 +183,10 @@ bool Set::insertFromBlock(const Block & block, bool create_ordered_set)
|
||||
if (empty())
|
||||
data.init(data.chooseMethod(key_columns, key_sizes));
|
||||
|
||||
StringRefs keys;
|
||||
|
||||
if (false) {}
|
||||
#define M(NAME) \
|
||||
else if (data.type == SetVariants::Type::NAME) \
|
||||
insertFromBlockImpl(*data.NAME, key_columns, rows, keys, data);
|
||||
insertFromBlockImpl(*data.NAME, key_columns, rows, data);
|
||||
APPLY_FOR_SET_VARIANTS(M)
|
||||
#undef M
|
||||
else
|
||||
@ -471,8 +468,7 @@ void NO_INLINE Set::executeImpl(
|
||||
const ConstColumnPlainPtrs & key_columns,
|
||||
ColumnUInt8::Container_t & vec_res,
|
||||
bool negative,
|
||||
size_t rows,
|
||||
StringRefs & keys) const
|
||||
size_t rows) const
|
||||
{
|
||||
typename Method::State state;
|
||||
state.init(key_columns);
|
||||
@ -484,7 +480,7 @@ void NO_INLINE Set::executeImpl(
|
||||
for (size_t i = 0; i < rows; ++i)
|
||||
{
|
||||
/// Строим ключ
|
||||
typename Method::Key key = state.getKey(key_columns, keys_size, i, key_sizes, keys);
|
||||
typename Method::Key key = state.getKey(key_columns, keys_size, i, key_sizes);
|
||||
vec_res[i] = negative ^ (method.data.end() != method.data.find(key));
|
||||
}
|
||||
}
|
||||
@ -496,8 +492,7 @@ void NO_INLINE Set::executeArrayImpl(
|
||||
const ColumnArray::Offsets_t & offsets,
|
||||
ColumnUInt8::Container_t & vec_res,
|
||||
bool negative,
|
||||
size_t rows,
|
||||
StringRefs & keys) const
|
||||
size_t rows) const
|
||||
{
|
||||
typename Method::State state;
|
||||
state.init(key_columns);
|
||||
@ -512,7 +507,7 @@ void NO_INLINE Set::executeArrayImpl(
|
||||
for (size_t j = prev_offset; j < offsets[i]; ++j)
|
||||
{
|
||||
/// Строим ключ
|
||||
typename Method::Key key = state.getKey(key_columns, keys_size, i, key_sizes, keys);
|
||||
typename Method::Key key = state.getKey(key_columns, keys_size, i, key_sizes);
|
||||
res |= negative ^ (method.data.end() != method.data.find(key));
|
||||
if (res)
|
||||
break;
|
||||
@ -526,12 +521,11 @@ void NO_INLINE Set::executeArrayImpl(
|
||||
void Set::executeOrdinary(const ConstColumnPlainPtrs & key_columns, ColumnUInt8::Container_t & vec_res, bool negative) const
|
||||
{
|
||||
size_t rows = key_columns[0]->size();
|
||||
StringRefs keys;
|
||||
|
||||
if (false) {}
|
||||
#define M(NAME) \
|
||||
else if (data.type == SetVariants::Type::NAME) \
|
||||
executeImpl(*data.NAME, key_columns, vec_res, negative, rows, keys);
|
||||
executeImpl(*data.NAME, key_columns, vec_res, negative, rows);
|
||||
APPLY_FOR_SET_VARIANTS(M)
|
||||
#undef M
|
||||
else
|
||||
@ -543,12 +537,11 @@ void Set::executeArray(const ColumnArray * key_column, ColumnUInt8::Container_t
|
||||
size_t rows = key_column->size();
|
||||
const ColumnArray::Offsets_t & offsets = key_column->getOffsets();
|
||||
const IColumn & nested_column = key_column->getData();
|
||||
StringRefs keys;
|
||||
|
||||
if (false) {}
|
||||
#define M(NAME) \
|
||||
else if (data.type == SetVariants::Type::NAME) \
|
||||
executeArrayImpl(*data.NAME, ConstColumnPlainPtrs{key_column}, offsets, vec_res, negative, rows, keys);
|
||||
executeArrayImpl(*data.NAME, ConstColumnPlainPtrs{key_column}, offsets, vec_res, negative, rows);
|
||||
APPLY_FOR_SET_VARIANTS(M)
|
||||
#undef M
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user