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.
|
/** Структура данных для реализации выражения IN.
|
||||||
*/
|
*/
|
||||||
struct Set
|
class Set
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
Set() : type(EMPTY), log(&Logger::get("Set")) {}
|
Set() : type(EMPTY), log(&Logger::get("Set")) {}
|
||||||
bool empty() { return type == EMPTY; }
|
bool empty() { return type == EMPTY; }
|
||||||
|
|
||||||
@ -23,7 +24,7 @@ struct Set
|
|||||||
void create(BlockInputStreamPtr stream);
|
void create(BlockInputStreamPtr stream);
|
||||||
|
|
||||||
/** Создать множество по выражению (для перечисления в самом запросе). */
|
/** Создать множество по выражению (для перечисления в самом запросе). */
|
||||||
void create(ASTPtr node);
|
void create(ASTPtr node); // TODO
|
||||||
|
|
||||||
/** Для указанных столбцов блока проверить принадлежность их значений множеству.
|
/** Для указанных столбцов блока проверить принадлежность их значений множеству.
|
||||||
* Записать результат в столбец в позиции result.
|
* Записать результат в столбец в позиции result.
|
||||||
@ -65,6 +66,11 @@ private:
|
|||||||
HASHED = 4,
|
HASHED = 4,
|
||||||
};
|
};
|
||||||
Type type;
|
Type type;
|
||||||
|
|
||||||
|
/** Типы данных, из которых было создано множество.
|
||||||
|
* При проверке на принадлежность множеству, типы проверяемых столбцов должны с ними совпадать.
|
||||||
|
*/
|
||||||
|
DataTypes data_types;
|
||||||
|
|
||||||
Logger * log;
|
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)
|
void Set::create(BlockInputStreamPtr stream)
|
||||||
{
|
{
|
||||||
LOG_TRACE(log, "Creating set");
|
LOG_TRACE(log, "Creating set");
|
||||||
@ -56,10 +59,14 @@ void Set::create(BlockInputStreamPtr stream)
|
|||||||
size_t keys_size = block.columns();
|
size_t keys_size = block.columns();
|
||||||
Row key(keys_size);
|
Row key(keys_size);
|
||||||
Columns key_columns(keys_size);
|
Columns key_columns(keys_size);
|
||||||
|
data_types.resize(keys_size);
|
||||||
|
|
||||||
/// Запоминаем столбцы, с которыми будем работать
|
/// Запоминаем столбцы, с которыми будем работать
|
||||||
for (size_t i = 0; i < keys_size; ++i)
|
for (size_t i = 0; i < keys_size; ++i)
|
||||||
|
{
|
||||||
key_columns[i] = block.getByPosition(i).column;
|
key_columns[i] = block.getByPosition(i).column;
|
||||||
|
data_types[i] = block.getByPosition(i).type;
|
||||||
|
}
|
||||||
|
|
||||||
size_t rows = block.rows();
|
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
|
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;
|
ColumnUInt8 * c_res = new ColumnUInt8;
|
||||||
block.getByPosition(result).column = c_res;
|
block.getByPosition(result).column = c_res;
|
||||||
ColumnUInt8::Container_t & vec_res = c_res->getData();
|
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);
|
Row key(keys_size);
|
||||||
Columns key_columns(keys_size);
|
Columns key_columns(keys_size);
|
||||||
|
|
||||||
/// Запоминаем столбцы, с которыми будем работать
|
/// Запоминаем столбцы, с которыми будем работать. Также проверим, что типы данных правильные.
|
||||||
for (size_t i = 0; i < keys_size; ++i)
|
for (size_t i = 0; i < keys_size; ++i)
|
||||||
|
{
|
||||||
key_columns[i] = block.getByPosition(arguments[i]).column;
|
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();
|
size_t rows = block.rows();
|
||||||
|
|
||||||
/// Какую структуру данных для множества использовать?
|
/// Какую структуру данных для множества использовать?
|
||||||
@ -331,8 +345,8 @@ void Set::execute(Block & block, const ColumnNumbers & arguments, size_t result,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw Exception("Unknown set variant.", ErrorCodes::UNKNOWN_SET_DATA_VARIANT);
|
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