dbms: development [#CONV-2944].

This commit is contained in:
Alexey Milovidov 2012-08-23 22:40:51 +00:00
parent ff2797d346
commit 4bb02285a1
2 changed files with 25 additions and 5 deletions

View File

@ -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;

View File

@ -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.");
} }
} }