mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 01:22:04 +00:00
dbms: development [#CONV-2944].
This commit is contained in:
parent
ff2797d346
commit
4bb02285a1
@ -14,8 +14,9 @@ namespace DB
|
||||
|
||||
/** Структура данных для реализации выражения IN.
|
||||
*/
|
||||
struct Set
|
||||
class Set
|
||||
{
|
||||
public:
|
||||
Set() : type(EMPTY), log(&Logger::get("Set")) {}
|
||||
bool empty() { return type == EMPTY; }
|
||||
|
||||
@ -23,7 +24,7 @@ struct Set
|
||||
void create(BlockInputStreamPtr stream);
|
||||
|
||||
/** Создать множество по выражению (для перечисления в самом запросе). */
|
||||
void create(ASTPtr node);
|
||||
void create(ASTPtr node); // TODO
|
||||
|
||||
/** Для указанных столбцов блока проверить принадлежность их значений множеству.
|
||||
* Записать результат в столбец в позиции result.
|
||||
@ -65,6 +66,11 @@ private:
|
||||
HASHED = 4,
|
||||
};
|
||||
Type type;
|
||||
|
||||
/** Типы данных, из которых было создано множество.
|
||||
* При проверке на принадлежность множеству, типы проверяемых столбцов должны с ними совпадать.
|
||||
*/
|
||||
DataTypes data_types;
|
||||
|
||||
Logger * log;
|
||||
|
||||
|
@ -46,6 +46,9 @@ Set::Type Set::chooseMethod(Columns & key_columns, bool & keys_fit_128_bits, Siz
|
||||
}
|
||||
|
||||
|
||||
// TODO: Избавиться от copy-paste при вычислении key_hashed.
|
||||
|
||||
|
||||
void Set::create(BlockInputStreamPtr stream)
|
||||
{
|
||||
LOG_TRACE(log, "Creating set");
|
||||
@ -56,10 +59,14 @@ void Set::create(BlockInputStreamPtr stream)
|
||||
size_t keys_size = block.columns();
|
||||
Row key(keys_size);
|
||||
Columns key_columns(keys_size);
|
||||
data_types.resize(keys_size);
|
||||
|
||||
/// Запоминаем столбцы, с которыми будем работать
|
||||
for (size_t i = 0; i < keys_size; ++i)
|
||||
{
|
||||
key_columns[i] = block.getByPosition(i).column;
|
||||
data_types[i] = block.getByPosition(i).type;
|
||||
}
|
||||
|
||||
size_t rows = block.rows();
|
||||
|
||||
@ -199,6 +206,8 @@ void Set::create(BlockInputStreamPtr stream)
|
||||
|
||||
void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result, bool negative) const
|
||||
{
|
||||
LOG_TRACE(log, "Checking set membership for block.");
|
||||
|
||||
ColumnUInt8 * c_res = new ColumnUInt8;
|
||||
block.getByPosition(result).column = c_res;
|
||||
ColumnUInt8::Container_t & vec_res = c_res->getData();
|
||||
@ -208,10 +217,15 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
|
||||
Row key(keys_size);
|
||||
Columns key_columns(keys_size);
|
||||
|
||||
/// Запоминаем столбцы, с которыми будем работать
|
||||
/// Запоминаем столбцы, с которыми будем работать. Также проверим, что типы данных правильные.
|
||||
for (size_t i = 0; i < keys_size; ++i)
|
||||
{
|
||||
key_columns[i] = block.getByPosition(arguments[i]).column;
|
||||
|
||||
if (data_types[i]->getName() != block.getByPosition(arguments[i]).type->getName())
|
||||
throw Exception("Types in section IN doesn't match.", ErrorCodes::TYPE_MISMATCH);
|
||||
}
|
||||
|
||||
size_t rows = block.rows();
|
||||
|
||||
/// Какую структуру данных для множества использовать?
|
||||
@ -331,8 +345,8 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
|
||||
}
|
||||
else
|
||||
throw Exception("Unknown set variant.", ErrorCodes::UNKNOWN_SET_DATA_VARIANT);
|
||||
|
||||
/* TODO */
|
||||
|
||||
LOG_TRACE(log, "Checked set membership for block.");
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user