This commit is contained in:
Alexey Arno 2015-09-03 16:14:26 +03:00
commit cb5387405b
9 changed files with 74 additions and 4 deletions

View File

@ -180,7 +180,7 @@ inline String likePatternToRegexp(const String & pattern)
break;
case '%':
if (pos + 1 != end)
res += ".*";
res += "(?:.|\n)*";
else
return res;
break;

View File

@ -66,7 +66,7 @@ struct MergeTreeSettings
size_t replicated_logs_to_keep = 100;
/// Настройки минимального количества битых данных, при котором отказываться автоматически их удалять.
size_t max_suspicious_broken_parts = 5;
size_t max_suspicious_broken_parts = 10;
/// Максимальное количество ошибок при загрузке кусков, при котором ReplicatedMergeTree соглашается запускаться.
size_t replicated_max_unexpected_parts = 3;

View File

@ -886,8 +886,45 @@ static SharedPtr<InterpreterSelectQuery> interpretSubquery(
select_query->children.emplace_back(select_query->table);
}
else
{
query = subquery->children.at(0);
/** В подзапросе могут быть указаны столбцы с одинаковыми именами. Например, SELECT x, x FROM t
* Это плохо, потому что результат такого запроса нельзя сохранить в таблицу, потому что в таблице не может быть одноимённых столбцов.
* Сохранение в таблицу требуется для GLOBAL-подзапросов.
*
* Чтобы избежать такой ситуации, будем переименовывать одинаковые столбцы.
*/
std::set<std::string> all_column_names;
std::set<std::string> assigned_column_names;
if (ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(query.get()))
{
for (auto & expr : select->select_expression_list->children)
all_column_names.insert(expr->getAliasOrColumnName());
for (auto & expr : select->select_expression_list->children)
{
auto name = expr->getAliasOrColumnName();
if (!assigned_column_names.insert(name).second)
{
size_t i = 1;
while (all_column_names.end() != all_column_names.find(name + "_" + toString(i)))
++i;
name = name + "_" + toString(i);
expr = expr->clone(); /// Отменяет склейку одинаковых выражений в дереве.
expr->setAlias(name);
all_column_names.insert(name);
assigned_column_names.insert(name);
}
}
}
}
if (required_columns.empty())
return new InterpreterSelectQuery(query, subquery_context, QueryProcessingStage::Complete, subquery_depth + 1);
else

View File

@ -259,7 +259,7 @@ void ITableDeclaration::check(const Block & block, bool need_all) const
const ColumnWithTypeAndName & column = block.getByPosition(i);
if (names_in_block.count(column.name))
throw Exception("Duplicate column " + column.name + " in block",
throw Exception("Duplicate column " + column.name + " in block",
ErrorCodes::DUPLICATE_COLUMN);
names_in_block.insert(column.name);

View File

@ -275,7 +275,14 @@ void StorageBuffer::shutdown()
if (flush_thread.joinable())
flush_thread.join();
optimize(context.getSettings());
try
{
optimize(context.getSettings());
}
catch (...)
{
tryLogCurrentException(__PRETTY_FUNCTION__);
}
}

View File

@ -0,0 +1,2 @@
SELECT k, a FROM (SELECT 42 AS k FROM remote('127.0.0.1', system.one)) GLOBAL ALL FULL OUTER JOIN (SELECT 42 AS k, 1 AS a, a) USING k;
SELECT 1 FROM remote('127.0.0.1', system.one) WHERE (1, 1) GLOBAL IN (SELECT 1 AS a, a);

View File

@ -0,0 +1,11 @@
1
1
1
1
1
1
1
1
1
0
0

View File

@ -0,0 +1,11 @@
SELECT 'abcdef' LIKE '%abc%def%';
SELECT 'abctdef' LIKE '%abc%def%';
SELECT 'abc\ndef' LIKE '%abc%def%';
SELECT 'abc\ntdef' LIKE '%abc%def%';
SELECT 'abct\ndef' LIKE '%abc%def%';
SELECT 'abc\n\ndef' LIKE '%abc%def%';
SELECT 'abc\n\ntdef' LIKE '%abc%def%';
SELECT 'abc\nt\ndef' LIKE '%abc%def%';
SELECT 'abct\n\ndef' LIKE '%abc%def%';
SELECT 'ab\ndef' LIKE '%abc%def%';
SELECT 'abc\nef' LIKE '%abc%def%';