mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-12 09:22:05 +00:00
Merge remote-tracking branch 'origin/master' into parallel-window
This commit is contained in:
commit
d4be706ed4
@ -1264,7 +1264,8 @@ private:
|
|||||||
size_t identifier_bind_size,
|
size_t identifier_bind_size,
|
||||||
const QueryTreeNodePtr & compound_expression,
|
const QueryTreeNodePtr & compound_expression,
|
||||||
String compound_expression_source,
|
String compound_expression_source,
|
||||||
IdentifierResolveScope & scope);
|
IdentifierResolveScope & scope,
|
||||||
|
bool can_be_not_found = false);
|
||||||
|
|
||||||
QueryTreeNodePtr tryResolveIdentifierFromExpressionArguments(const IdentifierLookup & identifier_lookup, IdentifierResolveScope & scope);
|
QueryTreeNodePtr tryResolveIdentifierFromExpressionArguments(const IdentifierLookup & identifier_lookup, IdentifierResolveScope & scope);
|
||||||
|
|
||||||
@ -1313,6 +1314,14 @@ private:
|
|||||||
IdentifierResolveScope & scope,
|
IdentifierResolveScope & scope,
|
||||||
IdentifierResolveSettings identifier_resolve_settings = {});
|
IdentifierResolveSettings identifier_resolve_settings = {});
|
||||||
|
|
||||||
|
QueryTreeNodePtr tryResolveIdentifierFromStorage(
|
||||||
|
const Identifier & identifier,
|
||||||
|
const QueryTreeNodePtr & table_expression_node,
|
||||||
|
const TableExpressionData & table_expression_data,
|
||||||
|
IdentifierResolveScope & scope,
|
||||||
|
size_t identifier_column_qualifier_parts,
|
||||||
|
bool can_be_not_found = false);
|
||||||
|
|
||||||
/// Resolve query tree nodes functions
|
/// Resolve query tree nodes functions
|
||||||
|
|
||||||
void qualifyColumnNodesWithProjectionNames(const QueryTreeNodes & column_nodes,
|
void qualifyColumnNodesWithProjectionNames(const QueryTreeNodes & column_nodes,
|
||||||
@ -2395,11 +2404,13 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveTableIdentifierFromDatabaseCatalog(con
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Resolve identifier from compound expression
|
/// Resolve identifier from compound expression
|
||||||
|
/// If identifier cannot be resolved throw exception or return nullptr if can_be_not_found is true
|
||||||
QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromCompoundExpression(const Identifier & expression_identifier,
|
QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromCompoundExpression(const Identifier & expression_identifier,
|
||||||
size_t identifier_bind_size,
|
size_t identifier_bind_size,
|
||||||
const QueryTreeNodePtr & compound_expression,
|
const QueryTreeNodePtr & compound_expression,
|
||||||
String compound_expression_source,
|
String compound_expression_source,
|
||||||
IdentifierResolveScope & scope)
|
IdentifierResolveScope & scope,
|
||||||
|
bool can_be_not_found)
|
||||||
{
|
{
|
||||||
Identifier compound_expression_identifier;
|
Identifier compound_expression_identifier;
|
||||||
for (size_t i = 0; i < identifier_bind_size; ++i)
|
for (size_t i = 0; i < identifier_bind_size; ++i)
|
||||||
@ -2412,6 +2423,23 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromCompoundExpression(const
|
|||||||
|
|
||||||
if (!expression_type->hasSubcolumn(nested_path.getFullName()))
|
if (!expression_type->hasSubcolumn(nested_path.getFullName()))
|
||||||
{
|
{
|
||||||
|
if (auto * column = compound_expression->as<ColumnNode>())
|
||||||
|
{
|
||||||
|
const DataTypePtr & column_type = column->getColumn().getTypeInStorage();
|
||||||
|
if (column_type->getTypeId() == TypeIndex::Object)
|
||||||
|
{
|
||||||
|
const auto * object_type = checkAndGetDataType<DataTypeObject>(column_type.get());
|
||||||
|
if (object_type->getSchemaFormat() == "json" && object_type->hasNullableSubcolumns())
|
||||||
|
{
|
||||||
|
QueryTreeNodePtr constant_node_null = std::make_shared<ConstantNode>(Field());
|
||||||
|
return constant_node_null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (can_be_not_found)
|
||||||
|
return {};
|
||||||
|
|
||||||
std::unordered_set<Identifier> valid_identifiers;
|
std::unordered_set<Identifier> valid_identifiers;
|
||||||
collectCompoundExpressionValidIdentifiersForTypoCorrection(expression_identifier,
|
collectCompoundExpressionValidIdentifiersForTypoCorrection(expression_identifier,
|
||||||
expression_type,
|
expression_type,
|
||||||
@ -2427,20 +2455,6 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromCompoundExpression(const
|
|||||||
compound_expression_from_error_message += compound_expression_source;
|
compound_expression_from_error_message += compound_expression_source;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto * column = compound_expression->as<ColumnNode>())
|
|
||||||
{
|
|
||||||
const DataTypePtr & column_type = column->getColumn().getTypeInStorage();
|
|
||||||
if (column_type->getTypeId() == TypeIndex::Object)
|
|
||||||
{
|
|
||||||
const auto * object_type = checkAndGetDataType<DataTypeObject>(column_type.get());
|
|
||||||
if (object_type->getSchemaFormat() == "json" && object_type->hasNullableSubcolumns())
|
|
||||||
{
|
|
||||||
QueryTreeNodePtr constant_node_null = std::make_shared<ConstantNode>(Field());
|
|
||||||
return constant_node_null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw Exception(ErrorCodes::UNKNOWN_IDENTIFIER,
|
throw Exception(ErrorCodes::UNKNOWN_IDENTIFIER,
|
||||||
"Identifier {} nested path {} cannot be resolved from type {}{}. In scope {}{}",
|
"Identifier {} nested path {} cannot be resolved from type {}{}. In scope {}{}",
|
||||||
expression_identifier,
|
expression_identifier,
|
||||||
@ -2796,6 +2810,160 @@ bool QueryAnalyzer::tryBindIdentifierToTableExpressions(const IdentifierLookup &
|
|||||||
return can_bind_identifier_to_table_expression;
|
return can_bind_identifier_to_table_expression;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromStorage(
|
||||||
|
const Identifier & identifier,
|
||||||
|
const QueryTreeNodePtr & table_expression_node,
|
||||||
|
const TableExpressionData & table_expression_data,
|
||||||
|
IdentifierResolveScope & scope,
|
||||||
|
size_t identifier_column_qualifier_parts,
|
||||||
|
bool can_be_not_found)
|
||||||
|
{
|
||||||
|
auto identifier_without_column_qualifier = identifier;
|
||||||
|
identifier_without_column_qualifier.popFirst(identifier_column_qualifier_parts);
|
||||||
|
|
||||||
|
/** Compound identifier cannot be resolved directly from storage if storage is not table.
|
||||||
|
*
|
||||||
|
* Example: SELECT test_table.id.value1.value2 FROM test_table;
|
||||||
|
* In table storage column test_table.id.value1.value2 will exists.
|
||||||
|
*
|
||||||
|
* Example: SELECT test_subquery.compound_expression.value FROM (SELECT compound_expression AS value) AS test_subquery;
|
||||||
|
* Here there is no column with name test_subquery.compound_expression.value, and additional wrap in tuple element is required.
|
||||||
|
*/
|
||||||
|
|
||||||
|
QueryTreeNodePtr result_expression;
|
||||||
|
bool match_full_identifier = false;
|
||||||
|
|
||||||
|
auto it = table_expression_data.column_name_to_column_node.find(identifier_without_column_qualifier.getFullName());
|
||||||
|
if (it != table_expression_data.column_name_to_column_node.end())
|
||||||
|
{
|
||||||
|
match_full_identifier = true;
|
||||||
|
result_expression = it->second;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
it = table_expression_data.column_name_to_column_node.find(identifier_without_column_qualifier.at(0));
|
||||||
|
if (it != table_expression_data.column_name_to_column_node.end())
|
||||||
|
result_expression = it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool clone_is_needed = true;
|
||||||
|
|
||||||
|
String table_expression_source = table_expression_data.table_expression_description;
|
||||||
|
if (!table_expression_data.table_expression_name.empty())
|
||||||
|
table_expression_source += " with name " + table_expression_data.table_expression_name;
|
||||||
|
|
||||||
|
if (result_expression && !match_full_identifier && identifier_without_column_qualifier.isCompound())
|
||||||
|
{
|
||||||
|
size_t identifier_bind_size = identifier_column_qualifier_parts + 1;
|
||||||
|
result_expression = tryResolveIdentifierFromCompoundExpression(identifier,
|
||||||
|
identifier_bind_size,
|
||||||
|
result_expression,
|
||||||
|
table_expression_source,
|
||||||
|
scope,
|
||||||
|
can_be_not_found);
|
||||||
|
if (can_be_not_found && !result_expression)
|
||||||
|
return {};
|
||||||
|
clone_is_needed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result_expression)
|
||||||
|
{
|
||||||
|
QueryTreeNodes nested_column_nodes;
|
||||||
|
DataTypes nested_types;
|
||||||
|
Array nested_names_array;
|
||||||
|
|
||||||
|
for (const auto & [column_name, _] : table_expression_data.column_names_and_types)
|
||||||
|
{
|
||||||
|
Identifier column_name_identifier_without_last_part(column_name);
|
||||||
|
auto column_name_identifier_last_part = column_name_identifier_without_last_part.getParts().back();
|
||||||
|
column_name_identifier_without_last_part.popLast();
|
||||||
|
|
||||||
|
if (identifier_without_column_qualifier.getFullName() != column_name_identifier_without_last_part.getFullName())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto column_node_it = table_expression_data.column_name_to_column_node.find(column_name);
|
||||||
|
if (column_node_it == table_expression_data.column_name_to_column_node.end())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const auto & column_node = column_node_it->second;
|
||||||
|
const auto & column_type = column_node->getColumnType();
|
||||||
|
const auto * column_type_array = typeid_cast<const DataTypeArray *>(column_type.get());
|
||||||
|
if (!column_type_array)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
nested_column_nodes.push_back(column_node);
|
||||||
|
nested_types.push_back(column_type_array->getNestedType());
|
||||||
|
nested_names_array.push_back(Field(std::move(column_name_identifier_last_part)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!nested_types.empty())
|
||||||
|
{
|
||||||
|
auto nested_function_node = std::make_shared<FunctionNode>("nested");
|
||||||
|
auto & nested_function_node_arguments = nested_function_node->getArguments().getNodes();
|
||||||
|
|
||||||
|
auto nested_function_names_array_type = std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>());
|
||||||
|
auto nested_function_names_constant_node = std::make_shared<ConstantNode>(std::move(nested_names_array),
|
||||||
|
std::move(nested_function_names_array_type));
|
||||||
|
nested_function_node_arguments.push_back(std::move(nested_function_names_constant_node));
|
||||||
|
nested_function_node_arguments.insert(nested_function_node_arguments.end(),
|
||||||
|
nested_column_nodes.begin(),
|
||||||
|
nested_column_nodes.end());
|
||||||
|
|
||||||
|
auto nested_function = FunctionFactory::instance().get(nested_function_node->getFunctionName(), scope.context);
|
||||||
|
nested_function_node->resolveAsFunction(nested_function->build(nested_function_node->getArgumentColumns()));
|
||||||
|
|
||||||
|
clone_is_needed = false;
|
||||||
|
result_expression = std::move(nested_function_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!result_expression)
|
||||||
|
{
|
||||||
|
std::unordered_set<Identifier> valid_identifiers;
|
||||||
|
collectTableExpressionValidIdentifiersForTypoCorrection(identifier,
|
||||||
|
table_expression_node,
|
||||||
|
table_expression_data,
|
||||||
|
valid_identifiers);
|
||||||
|
|
||||||
|
auto hints = collectIdentifierTypoHints(identifier, valid_identifiers);
|
||||||
|
|
||||||
|
throw Exception(ErrorCodes::UNKNOWN_IDENTIFIER, "Identifier '{}' cannot be resolved from {}. In scope {}{}",
|
||||||
|
identifier.getFullName(),
|
||||||
|
table_expression_source,
|
||||||
|
scope.scope_node->formatASTForErrorMessage(),
|
||||||
|
getHintsErrorMessageSuffix(hints));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clone_is_needed)
|
||||||
|
result_expression = result_expression->clone();
|
||||||
|
|
||||||
|
auto qualified_identifier = identifier;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < identifier_column_qualifier_parts; ++i)
|
||||||
|
{
|
||||||
|
auto qualified_identifier_with_removed_part = qualified_identifier;
|
||||||
|
qualified_identifier_with_removed_part.popFirst();
|
||||||
|
|
||||||
|
if (qualified_identifier_with_removed_part.empty())
|
||||||
|
break;
|
||||||
|
|
||||||
|
IdentifierLookup column_identifier_lookup = {qualified_identifier_with_removed_part, IdentifierLookupContext::EXPRESSION};
|
||||||
|
if (tryBindIdentifierToAliases(column_identifier_lookup, scope))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (table_expression_data.should_qualify_columns &&
|
||||||
|
tryBindIdentifierToTableExpressions(column_identifier_lookup, table_expression_node, scope))
|
||||||
|
break;
|
||||||
|
|
||||||
|
qualified_identifier = std::move(qualified_identifier_with_removed_part);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto qualified_identifier_full_name = qualified_identifier.getFullName();
|
||||||
|
node_to_projection_name.emplace(result_expression, std::move(qualified_identifier_full_name));
|
||||||
|
|
||||||
|
return result_expression;
|
||||||
|
}
|
||||||
|
|
||||||
QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromTableExpression(const IdentifierLookup & identifier_lookup,
|
QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromTableExpression(const IdentifierLookup & identifier_lookup,
|
||||||
const QueryTreeNodePtr & table_expression_node,
|
const QueryTreeNodePtr & table_expression_node,
|
||||||
IdentifierResolveScope & scope)
|
IdentifierResolveScope & scope)
|
||||||
@ -2836,151 +3004,6 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromTableExpression(const Id
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto resolve_identifier_from_storage_or_throw = [&](size_t identifier_column_qualifier_parts) -> QueryTreeNodePtr
|
|
||||||
{
|
|
||||||
auto identifier_without_column_qualifier = identifier;
|
|
||||||
identifier_without_column_qualifier.popFirst(identifier_column_qualifier_parts);
|
|
||||||
|
|
||||||
/** Compound identifier cannot be resolved directly from storage if storage is not table.
|
|
||||||
*
|
|
||||||
* Example: SELECT test_table.id.value1.value2 FROM test_table;
|
|
||||||
* In table storage column test_table.id.value1.value2 will exists.
|
|
||||||
*
|
|
||||||
* Example: SELECT test_subquery.compound_expression.value FROM (SELECT compound_expression AS value) AS test_subquery;
|
|
||||||
* Here there is no column with name test_subquery.compound_expression.value, and additional wrap in tuple element is required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
QueryTreeNodePtr result_expression;
|
|
||||||
bool match_full_identifier = false;
|
|
||||||
|
|
||||||
auto it = table_expression_data.column_name_to_column_node.find(identifier_without_column_qualifier.getFullName());
|
|
||||||
if (it != table_expression_data.column_name_to_column_node.end())
|
|
||||||
{
|
|
||||||
match_full_identifier = true;
|
|
||||||
result_expression = it->second;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
it = table_expression_data.column_name_to_column_node.find(identifier_without_column_qualifier.at(0));
|
|
||||||
if (it != table_expression_data.column_name_to_column_node.end())
|
|
||||||
result_expression = it->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool clone_is_needed = true;
|
|
||||||
|
|
||||||
String table_expression_source = table_expression_data.table_expression_description;
|
|
||||||
if (!table_expression_data.table_expression_name.empty())
|
|
||||||
table_expression_source += " with name " + table_expression_data.table_expression_name;
|
|
||||||
|
|
||||||
if (result_expression && !match_full_identifier && identifier_without_column_qualifier.isCompound())
|
|
||||||
{
|
|
||||||
size_t identifier_bind_size = identifier_column_qualifier_parts + 1;
|
|
||||||
result_expression = tryResolveIdentifierFromCompoundExpression(identifier_lookup.identifier,
|
|
||||||
identifier_bind_size,
|
|
||||||
result_expression,
|
|
||||||
table_expression_source,
|
|
||||||
scope);
|
|
||||||
clone_is_needed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!result_expression)
|
|
||||||
{
|
|
||||||
QueryTreeNodes nested_column_nodes;
|
|
||||||
DataTypes nested_types;
|
|
||||||
Array nested_names_array;
|
|
||||||
|
|
||||||
for (auto & [column_name, _] : table_expression_data.column_names_and_types)
|
|
||||||
{
|
|
||||||
Identifier column_name_identifier_without_last_part(column_name);
|
|
||||||
auto column_name_identifier_last_part = column_name_identifier_without_last_part.getParts().back();
|
|
||||||
column_name_identifier_without_last_part.popLast();
|
|
||||||
|
|
||||||
if (identifier_without_column_qualifier.getFullName() != column_name_identifier_without_last_part.getFullName())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto column_node_it = table_expression_data.column_name_to_column_node.find(column_name);
|
|
||||||
if (column_node_it == table_expression_data.column_name_to_column_node.end())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const auto & column_node = column_node_it->second;
|
|
||||||
const auto & column_type = column_node->getColumnType();
|
|
||||||
const auto * column_type_array = typeid_cast<const DataTypeArray *>(column_type.get());
|
|
||||||
if (!column_type_array)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
nested_column_nodes.push_back(column_node);
|
|
||||||
nested_types.push_back(column_type_array->getNestedType());
|
|
||||||
nested_names_array.push_back(Field(std::move(column_name_identifier_last_part)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nested_types.empty())
|
|
||||||
{
|
|
||||||
auto nested_function_node = std::make_shared<FunctionNode>("nested");
|
|
||||||
auto & nested_function_node_arguments = nested_function_node->getArguments().getNodes();
|
|
||||||
|
|
||||||
auto nested_function_names_array_type = std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>());
|
|
||||||
auto nested_function_names_constant_node = std::make_shared<ConstantNode>(std::move(nested_names_array),
|
|
||||||
std::move(nested_function_names_array_type));
|
|
||||||
nested_function_node_arguments.push_back(std::move(nested_function_names_constant_node));
|
|
||||||
nested_function_node_arguments.insert(nested_function_node_arguments.end(),
|
|
||||||
nested_column_nodes.begin(),
|
|
||||||
nested_column_nodes.end());
|
|
||||||
|
|
||||||
auto nested_function = FunctionFactory::instance().get(nested_function_node->getFunctionName(), scope.context);
|
|
||||||
nested_function_node->resolveAsFunction(nested_function->build(nested_function_node->getArgumentColumns()));
|
|
||||||
|
|
||||||
clone_is_needed = false;
|
|
||||||
result_expression = std::move(nested_function_node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!result_expression)
|
|
||||||
{
|
|
||||||
std::unordered_set<Identifier> valid_identifiers;
|
|
||||||
collectTableExpressionValidIdentifiersForTypoCorrection(identifier,
|
|
||||||
table_expression_node,
|
|
||||||
table_expression_data,
|
|
||||||
valid_identifiers);
|
|
||||||
|
|
||||||
auto hints = collectIdentifierTypoHints(identifier, valid_identifiers);
|
|
||||||
|
|
||||||
throw Exception(ErrorCodes::UNKNOWN_IDENTIFIER, "Identifier '{}' cannot be resolved from {}. In scope {}{}",
|
|
||||||
identifier.getFullName(),
|
|
||||||
table_expression_source,
|
|
||||||
scope.scope_node->formatASTForErrorMessage(),
|
|
||||||
getHintsErrorMessageSuffix(hints));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (clone_is_needed)
|
|
||||||
result_expression = result_expression->clone();
|
|
||||||
|
|
||||||
auto qualified_identifier = identifier;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < identifier_column_qualifier_parts; ++i)
|
|
||||||
{
|
|
||||||
auto qualified_identifier_with_removed_part = qualified_identifier;
|
|
||||||
qualified_identifier_with_removed_part.popFirst();
|
|
||||||
|
|
||||||
if (qualified_identifier_with_removed_part.empty())
|
|
||||||
break;
|
|
||||||
|
|
||||||
IdentifierLookup column_identifier_lookup = {qualified_identifier_with_removed_part, IdentifierLookupContext::EXPRESSION};
|
|
||||||
if (tryBindIdentifierToAliases(column_identifier_lookup, scope))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (table_expression_data.should_qualify_columns &&
|
|
||||||
tryBindIdentifierToTableExpressions(column_identifier_lookup, table_expression_node, scope))
|
|
||||||
break;
|
|
||||||
|
|
||||||
qualified_identifier = std::move(qualified_identifier_with_removed_part);
|
|
||||||
}
|
|
||||||
|
|
||||||
auto qualified_identifier_full_name = qualified_identifier.getFullName();
|
|
||||||
node_to_projection_name.emplace(result_expression, std::move(qualified_identifier_full_name));
|
|
||||||
|
|
||||||
return result_expression;
|
|
||||||
};
|
|
||||||
|
|
||||||
/** If identifier first part binds to some column start or table has full identifier name. Then we can try to find whole identifier in table.
|
/** If identifier first part binds to some column start or table has full identifier name. Then we can try to find whole identifier in table.
|
||||||
* 1. Try to bind identifier first part to column in table, if true get full identifier from table or throw exception.
|
* 1. Try to bind identifier first part to column in table, if true get full identifier from table or throw exception.
|
||||||
* 2. Try to bind identifier first part to table name or storage alias, if true remove first part and try to get full identifier from table or throw exception.
|
* 2. Try to bind identifier first part to table name or storage alias, if true remove first part and try to get full identifier from table or throw exception.
|
||||||
@ -2988,24 +3011,35 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromTableExpression(const Id
|
|||||||
* 3. Try to bind identifier first parts to database name and table name, if true remove first two parts and try to get full identifier from table or throw exception.
|
* 3. Try to bind identifier first parts to database name and table name, if true remove first two parts and try to get full identifier from table or throw exception.
|
||||||
*/
|
*/
|
||||||
if (table_expression_data.hasFullIdentifierName(IdentifierView(identifier)))
|
if (table_expression_data.hasFullIdentifierName(IdentifierView(identifier)))
|
||||||
return resolve_identifier_from_storage_or_throw(0 /*identifier_column_qualifier_parts*/);
|
return tryResolveIdentifierFromStorage(identifier, table_expression_node, table_expression_data, scope, 0 /*identifier_column_qualifier_parts*/);
|
||||||
|
|
||||||
if (table_expression_data.canBindIdentifier(IdentifierView(identifier)))
|
if (table_expression_data.canBindIdentifier(IdentifierView(identifier)))
|
||||||
return resolve_identifier_from_storage_or_throw(0 /*identifier_column_qualifier_parts*/);
|
{
|
||||||
|
/** This check is insufficient to determine whether and identifier can be resolved from table expression.
|
||||||
|
* A further check will be performed in `tryResolveIdentifierFromStorage` to see if we have such a subcolumn.
|
||||||
|
* In cases where the subcolumn cannot be found we want to have `nullptr` instead of exception.
|
||||||
|
* So, we set `can_be_not_found = true` to have an attempt to resolve the identifier from another table expression.
|
||||||
|
* Example: `SELECT t.t from (SELECT 1 as t) AS a FULL JOIN (SELECT 1 as t) as t ON a.t = t.t;`
|
||||||
|
* Initially, we will try to resolve t.t from `a` because `t.` is bound to `1 as t`. However, as it is not a nested column, we will need to resolve it from the second table expression.
|
||||||
|
*/
|
||||||
|
auto resolved_identifier = tryResolveIdentifierFromStorage(identifier, table_expression_node, table_expression_data, scope, 0 /*identifier_column_qualifier_parts*/, true /*can_be_not_found*/);
|
||||||
|
if (resolved_identifier)
|
||||||
|
return resolved_identifier;
|
||||||
|
}
|
||||||
|
|
||||||
if (identifier.getPartsSize() == 1)
|
if (identifier.getPartsSize() == 1)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
const auto & table_name = table_expression_data.table_name;
|
const auto & table_name = table_expression_data.table_name;
|
||||||
if ((!table_name.empty() && path_start == table_name) || (table_expression_node->hasAlias() && path_start == table_expression_node->getAlias()))
|
if ((!table_name.empty() && path_start == table_name) || (table_expression_node->hasAlias() && path_start == table_expression_node->getAlias()))
|
||||||
return resolve_identifier_from_storage_or_throw(1 /*identifier_column_qualifier_parts*/);
|
return tryResolveIdentifierFromStorage(identifier, table_expression_node, table_expression_data, scope, 1 /*identifier_column_qualifier_parts*/);
|
||||||
|
|
||||||
if (identifier.getPartsSize() == 2)
|
if (identifier.getPartsSize() == 2)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
const auto & database_name = table_expression_data.database_name;
|
const auto & database_name = table_expression_data.database_name;
|
||||||
if (!database_name.empty() && path_start == database_name && identifier[1] == table_name)
|
if (!database_name.empty() && path_start == database_name && identifier[1] == table_name)
|
||||||
return resolve_identifier_from_storage_or_throw(2 /*identifier_column_qualifier_parts*/);
|
return tryResolveIdentifierFromStorage(identifier, table_expression_node, table_expression_data, scope, 2 /*identifier_column_qualifier_parts*/);
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -301,7 +301,7 @@ std::vector<UInt8> DatabaseReplicated::tryGetAreReplicasActive(const ClusterPtr
|
|||||||
{
|
{
|
||||||
for (const auto & replica : addresses_with_failover[shard_index])
|
for (const auto & replica : addresses_with_failover[shard_index])
|
||||||
{
|
{
|
||||||
String full_name = getFullReplicaName(replica.database_shard_name, replica.database_replica_name, replica.database_replica_name);
|
String full_name = getFullReplicaName(replica.database_shard_name, replica.database_replica_name, replica.database_replica_group_name);
|
||||||
paths.emplace_back(fs::path(zookeeper_path) / "replicas" / full_name / "active");
|
paths.emplace_back(fs::path(zookeeper_path) / "replicas" / full_name / "active");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include <Interpreters/DatabaseAndTableWithAlias.h>
|
#include <Interpreters/DatabaseAndTableWithAlias.h>
|
||||||
#include <Interpreters/InDepthNodeVisitor.h>
|
#include <Interpreters/InDepthNodeVisitor.h>
|
||||||
#include <Interpreters/QueryAliasesVisitor.h>
|
#include <Interpreters/QueryAliasesVisitor.h>
|
||||||
#include <Interpreters/getHeaderForProcessingStage.h>
|
|
||||||
#include <Interpreters/getTableExpressions.h>
|
#include <Interpreters/getTableExpressions.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <Analyzer/QueryNode.h>
|
||||||
|
#include <Analyzer/Utils.h>
|
||||||
#include <Interpreters/getHeaderForProcessingStage.h>
|
#include <Interpreters/getHeaderForProcessingStage.h>
|
||||||
#include <Interpreters/InterpreterSelectQuery.h>
|
#include <Interpreters/InterpreterSelectQuery.h>
|
||||||
#include <Interpreters/InterpreterSelectQueryAnalyzer.h>
|
#include <Interpreters/InterpreterSelectQueryAnalyzer.h>
|
||||||
@ -8,6 +10,7 @@
|
|||||||
#include <Parsers/ASTFunction.h>
|
#include <Parsers/ASTFunction.h>
|
||||||
#include <Parsers/ASTIdentifier.h>
|
#include <Parsers/ASTIdentifier.h>
|
||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
|
#include <Planner/Utils.h>
|
||||||
#include <Processors/Sources/SourceFromSingleChunk.h>
|
#include <Processors/Sources/SourceFromSingleChunk.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
@ -16,7 +19,6 @@ namespace DB
|
|||||||
namespace ErrorCodes
|
namespace ErrorCodes
|
||||||
{
|
{
|
||||||
extern const int LOGICAL_ERROR;
|
extern const int LOGICAL_ERROR;
|
||||||
extern const int UNSUPPORTED_METHOD;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasJoin(const ASTSelectQuery & select)
|
bool hasJoin(const ASTSelectQuery & select)
|
||||||
@ -124,13 +126,27 @@ Block getHeaderForProcessingStage(
|
|||||||
ASTPtr query = query_info.query;
|
ASTPtr query = query_info.query;
|
||||||
if (const auto * select = query_info.query->as<ASTSelectQuery>(); select && hasJoin(*select))
|
if (const auto * select = query_info.query->as<ASTSelectQuery>(); select && hasJoin(*select))
|
||||||
{
|
{
|
||||||
/// TODO: Analyzer syntax analyzer result
|
|
||||||
if (!query_info.syntax_analyzer_result)
|
if (!query_info.syntax_analyzer_result)
|
||||||
throw Exception(ErrorCodes::UNSUPPORTED_METHOD, "getHeaderForProcessingStage is unsupported");
|
{
|
||||||
|
if (!query_info.planner_context)
|
||||||
|
throw Exception(ErrorCodes::LOGICAL_ERROR, "Query is not analyzed: no planner context");
|
||||||
|
|
||||||
query = query_info.query->clone();
|
const auto & query_node = query_info.query_tree->as<QueryNode &>();
|
||||||
TreeRewriterResult new_rewriter_result = *query_info.syntax_analyzer_result;
|
const auto & join_tree = query_node.getJoinTree();
|
||||||
removeJoin(*query->as<ASTSelectQuery>(), new_rewriter_result, context);
|
auto left_table_expression = extractLeftTableExpression(join_tree);
|
||||||
|
|
||||||
|
auto & table_expression_data = query_info.planner_context->getTableExpressionDataOrThrow(left_table_expression);
|
||||||
|
const auto & query_context = query_info.planner_context->getQueryContext();
|
||||||
|
auto columns = table_expression_data.getColumns();
|
||||||
|
auto new_query_node = buildSubqueryToReadColumnsFromTableExpression(columns, left_table_expression, query_context);
|
||||||
|
query = new_query_node->toAST();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
query = query_info.query->clone();
|
||||||
|
TreeRewriterResult new_rewriter_result = *query_info.syntax_analyzer_result;
|
||||||
|
removeJoin(*query->as<ASTSelectQuery>(), new_rewriter_result, context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Block result;
|
Block result;
|
||||||
|
@ -1248,7 +1248,26 @@ JoinTreeQueryPlan buildQueryPlanForJoinNode(const QueryTreeNodePtr & join_table_
|
|||||||
const auto & join_clause = table_join->getOnlyClause();
|
const auto & join_clause = table_join->getOnlyClause();
|
||||||
|
|
||||||
bool kind_allows_filtering = isInner(join_kind) || isLeft(join_kind) || isRight(join_kind);
|
bool kind_allows_filtering = isInner(join_kind) || isLeft(join_kind) || isRight(join_kind);
|
||||||
if (settings.max_rows_in_set_to_optimize_join > 0 && kind_allows_filtering)
|
|
||||||
|
auto has_non_const = [](const Block & block, const auto & keys)
|
||||||
|
{
|
||||||
|
for (const auto & key : keys)
|
||||||
|
{
|
||||||
|
const auto & column = block.getByName(key).column;
|
||||||
|
if (column && !isColumnConst(*column))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// This optimization relies on the sorting that should buffer data from both streams before emitting any rows.
|
||||||
|
/// Sorting on a stream with const keys can start returning rows immediately and pipeline may stuck.
|
||||||
|
/// Note: it's also doesn't work with the read-in-order optimization.
|
||||||
|
/// No checks here because read in order is not applied if we have `CreateSetAndFilterOnTheFlyStep` in the pipeline between the reading and sorting steps.
|
||||||
|
bool has_non_const_keys = has_non_const(left_plan.getCurrentDataStream().header, join_clause.key_names_left)
|
||||||
|
&& has_non_const(right_plan.getCurrentDataStream().header, join_clause.key_names_right);
|
||||||
|
|
||||||
|
if (settings.max_rows_in_set_to_optimize_join > 0 && kind_allows_filtering && has_non_const_keys)
|
||||||
{
|
{
|
||||||
auto * left_set = add_create_set(left_plan, join_clause.key_names_left, JoinTableSide::Left);
|
auto * left_set = add_create_set(left_plan, join_clause.key_names_left, JoinTableSide::Left);
|
||||||
auto * right_set = add_create_set(right_plan, join_clause.key_names_right, JoinTableSide::Right);
|
auto * right_set = add_create_set(right_plan, join_clause.key_names_right, JoinTableSide::Right);
|
||||||
|
@ -584,13 +584,17 @@ std::shared_ptr<DirectKeyValueJoin> tryDirectJoin(const std::shared_ptr<TableJoi
|
|||||||
const String & key_name = clauses[0].key_names_right[0];
|
const String & key_name = clauses[0].key_names_right[0];
|
||||||
|
|
||||||
auto & right_table_expression_data = planner_context->getTableExpressionDataOrThrow(right_table_expression);
|
auto & right_table_expression_data = planner_context->getTableExpressionDataOrThrow(right_table_expression);
|
||||||
const auto * table_column_name = right_table_expression_data.getColumnNameOrNull(key_name);
|
|
||||||
if (!table_column_name)
|
|
||||||
return {};
|
|
||||||
|
|
||||||
const auto & storage_primary_key = storage->getPrimaryKey();
|
if (const auto * table_column_name = right_table_expression_data.getColumnNameOrNull(key_name))
|
||||||
if (storage_primary_key.size() != 1 || storage_primary_key[0] != *table_column_name)
|
{
|
||||||
|
const auto & storage_primary_key = storage->getPrimaryKey();
|
||||||
|
if (storage_primary_key.size() != 1 || storage_primary_key[0] != *table_column_name)
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
return {};
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
/** For right table expression during execution columns have unique name.
|
/** For right table expression during execution columns have unique name.
|
||||||
* Direct key value join implementation during storage querying must use storage column names.
|
* Direct key value join implementation during storage querying must use storage column names.
|
||||||
@ -608,8 +612,8 @@ std::shared_ptr<DirectKeyValueJoin> tryDirectJoin(const std::shared_ptr<TableJoi
|
|||||||
|
|
||||||
for (const auto & right_table_expression_column : right_table_expression_header)
|
for (const auto & right_table_expression_column : right_table_expression_header)
|
||||||
{
|
{
|
||||||
const auto * table_column_name_ = right_table_expression_data.getColumnNameOrNull(right_table_expression_column.name);
|
const auto * table_column_name = right_table_expression_data.getColumnNameOrNull(right_table_expression_column.name);
|
||||||
if (!table_column_name_)
|
if (!table_column_name)
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
auto right_table_expression_column_with_storage_column_name = right_table_expression_column;
|
auto right_table_expression_column_with_storage_column_name = right_table_expression_column;
|
||||||
|
@ -17,6 +17,7 @@ static FormatSettings updateFormatSettings(const FormatSettings & settings, cons
|
|||||||
updated.skip_unknown_fields = true;
|
updated.skip_unknown_fields = true;
|
||||||
updated.with_names_use_header = true;
|
updated.with_names_use_header = true;
|
||||||
updated.date_time_input_format = FormatSettings::DateTimeInputFormat::BestEffort;
|
updated.date_time_input_format = FormatSettings::DateTimeInputFormat::BestEffort;
|
||||||
|
updated.defaults_for_omitted_fields = true;
|
||||||
updated.csv.delimiter = updated.hive_text.fields_delimiter;
|
updated.csv.delimiter = updated.hive_text.fields_delimiter;
|
||||||
if (settings.hive_text.input_field_names.empty())
|
if (settings.hive_text.input_field_names.empty())
|
||||||
updated.hive_text.input_field_names = header.getNames();
|
updated.hive_text.input_field_names = header.getNames();
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
01268_shard_avgweighted
|
01268_shard_avgweighted
|
||||||
01270_optimize_skip_unused_shards_low_cardinality
|
01270_optimize_skip_unused_shards_low_cardinality
|
||||||
01319_optimize_skip_unused_shards_nesting
|
01319_optimize_skip_unused_shards_nesting
|
||||||
01353_low_cardinality_join_types
|
01428_nullable_asof_join
|
||||||
01455_shard_leaf_max_rows_bytes_to_read
|
01455_shard_leaf_max_rows_bytes_to_read
|
||||||
01495_subqueries_in_with_statement
|
01495_subqueries_in_with_statement
|
||||||
01504_rocksdb
|
01504_rocksdb
|
||||||
@ -52,7 +52,6 @@
|
|||||||
01681_bloom_filter_nullable_column
|
01681_bloom_filter_nullable_column
|
||||||
01700_system_zookeeper_path_in
|
01700_system_zookeeper_path_in
|
||||||
01710_projection_additional_filters
|
01710_projection_additional_filters
|
||||||
01721_join_implicit_cast_long
|
|
||||||
01739_index_hint
|
01739_index_hint
|
||||||
02880_indexHint__partition_id
|
02880_indexHint__partition_id
|
||||||
01747_join_view_filter_dictionary
|
01747_join_view_filter_dictionary
|
||||||
@ -76,8 +75,6 @@
|
|||||||
02131_used_row_policies_in_query_log
|
02131_used_row_policies_in_query_log
|
||||||
02139_MV_with_scalar_subquery
|
02139_MV_with_scalar_subquery
|
||||||
02174_cte_scalar_cache_mv
|
02174_cte_scalar_cache_mv
|
||||||
02242_join_rocksdb
|
|
||||||
02267_join_dup_columns_issue36199
|
|
||||||
02302_s3_file_pruning
|
02302_s3_file_pruning
|
||||||
02341_global_join_cte
|
02341_global_join_cte
|
||||||
02345_implicit_transaction
|
02345_implicit_transaction
|
||||||
@ -85,7 +82,6 @@
|
|||||||
02354_annoy
|
02354_annoy
|
||||||
02366_union_decimal_conversion
|
02366_union_decimal_conversion
|
||||||
02375_rocksdb_with_filters
|
02375_rocksdb_with_filters
|
||||||
02382_join_and_filtering_set
|
|
||||||
02402_merge_engine_with_view
|
02402_merge_engine_with_view
|
||||||
02404_memory_bound_merging
|
02404_memory_bound_merging
|
||||||
02426_orc_bug
|
02426_orc_bug
|
||||||
|
@ -8,9 +8,10 @@ import logging
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
from github import Github
|
from github import Github
|
||||||
from github.GithubObject import _NotSetType, NotSet as NotSet
|
|
||||||
from github.Commit import Commit
|
from github.Commit import Commit
|
||||||
from github.CommitStatus import CommitStatus
|
from github.CommitStatus import CommitStatus
|
||||||
|
from github.GithubException import GithubException
|
||||||
|
from github.GithubObject import _NotSetType, NotSet as NotSet
|
||||||
from github.IssueComment import IssueComment
|
from github.IssueComment import IssueComment
|
||||||
from github.PullRequest import PullRequest
|
from github.PullRequest import PullRequest
|
||||||
from github.Repository import Repository
|
from github.Repository import Repository
|
||||||
@ -336,7 +337,18 @@ def remove_labels(gh: Github, pr_info: PRInfo, labels_names: List[str]) -> None:
|
|||||||
repo = get_repo(gh)
|
repo = get_repo(gh)
|
||||||
pull_request = repo.get_pull(pr_info.number)
|
pull_request = repo.get_pull(pr_info.number)
|
||||||
for label in labels_names:
|
for label in labels_names:
|
||||||
pull_request.remove_from_labels(label)
|
try:
|
||||||
|
pull_request.remove_from_labels(label)
|
||||||
|
except GithubException as exc:
|
||||||
|
if not (
|
||||||
|
exc.status == 404
|
||||||
|
and isinstance(exc.data, dict)
|
||||||
|
and exc.data.get("message", "") == "Label does not exist"
|
||||||
|
):
|
||||||
|
raise
|
||||||
|
logging.warning(
|
||||||
|
"The label '%s' does not exist in PR #%s", pr_info.number, label
|
||||||
|
)
|
||||||
pr_info.labels.remove(label)
|
pr_info.labels.remove(label)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,615 +0,0 @@
|
|||||||
-- join_algorithm = default, join_use_nulls = 0 --
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str String
|
|
||||||
String
|
|
||||||
str String
|
|
||||||
str_r String
|
|
||||||
str String
|
|
||||||
String
|
|
||||||
str_l String
|
|
||||||
str String
|
|
||||||
str_r String
|
|
||||||
str_l String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
-- join_algorithm = default, join_use_nulls = 1 --
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
-- join_algorithm = partial_merge, join_use_nulls = 0 --
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str String
|
|
||||||
String
|
|
||||||
str String
|
|
||||||
str_r String
|
|
||||||
str String
|
|
||||||
String
|
|
||||||
str_l String
|
|
||||||
str String
|
|
||||||
str_r String
|
|
||||||
str_l String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
-- join_algorithm = partial_merge, join_use_nulls = 1 --
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
-- join_algorithm = parallel_hash, join_use_nulls = 0 --
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
String String str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str String
|
|
||||||
String
|
|
||||||
str String
|
|
||||||
str_r String
|
|
||||||
str String
|
|
||||||
String
|
|
||||||
str_l String
|
|
||||||
str String
|
|
||||||
str_r String
|
|
||||||
str_l String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str String String str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
|
||||||
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
str_r LowCardinality(String)
|
|
||||||
str_l LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
-- join_algorithm = parallel_hash, join_use_nulls = 1 --
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
\N LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str LowCardinality(Nullable(String))
|
|
||||||
str_l LowCardinality(Nullable(String))
|
|
||||||
str_r LowCardinality(Nullable(String))
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
|
||||||
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
|
||||||
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
\N Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str Nullable(String)
|
|
||||||
str_l Nullable(String)
|
|
||||||
str_r Nullable(String)
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
|
||||||
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
|
||||||
--
|
|
||||||
LowCardinality(String)
|
|
||||||
str LowCardinality(String)
|
|
||||||
|
|
||||||
|
|
||||||
str
|
|
||||||
str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
|
||||||
str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
|
||||||
\N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
|
@ -0,0 +1,635 @@
|
|||||||
|
-- { echoOn }
|
||||||
|
SET allow_experimental_analyzer = 0;
|
||||||
|
{% for join_algorithm in ['default', 'partial_merge', 'parallel_hash'] -%}
|
||||||
|
SET join_algorithm = '{{ join_algorithm }}';
|
||||||
|
SET join_use_nulls = 0;
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
str_r String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
String
|
||||||
|
str_l String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
str_r String
|
||||||
|
str_l String
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str String String str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str String String str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str String String str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
||||||
|
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str String String str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
||||||
|
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN nr AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN nr AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN nr AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN nr AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SET join_use_nulls = 1;
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
str_r LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
str_r LowCardinality(Nullable(String))
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
str_r LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
str_r LowCardinality(Nullable(String))
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
str_r LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
str_r LowCardinality(Nullable(String))
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN nr AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN nr AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN nr AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN nr AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
{% endfor -%}
|
||||||
|
SELECT '--';
|
||||||
|
--
|
||||||
|
SET join_use_nulls = 0;
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY l.lc;
|
||||||
|
LowCardinality(String)
|
||||||
|
str LowCardinality(String)
|
||||||
|
SET join_algorithm = 'partial_merge';
|
||||||
|
SET join_use_nulls = 1;
|
||||||
|
SELECT r.lc, materialize(r.lc), toTypeName(r.lc), toTypeName(materialize(r.lc)) FROM l_lc AS l FULL OUTER JOIN r_lc AS r USING (x) ORDER BY r.lc;
|
||||||
|
str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
||||||
|
str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
||||||
|
\N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
||||||
|
SET allow_experimental_analyzer = 1;
|
||||||
|
{% for join_algorithm in ['default', 'partial_merge', 'parallel_hash'] -%}
|
||||||
|
SET join_algorithm = '{{ join_algorithm }}';
|
||||||
|
SET join_use_nulls = 0;
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
LowCardinality(String) LowCardinality(String) LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
str_r String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
str_r String
|
||||||
|
str_l String
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str String String str str
|
||||||
|
String String str_r str_r String String
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
String String str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
String String LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str String String str str
|
||||||
|
String String str_r str_r String String
|
||||||
|
String String String String str_l str_l
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
str_r String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
String
|
||||||
|
str_l String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
str_r String
|
||||||
|
str_l String
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str String String str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str String String str str
|
||||||
|
String String str_r str_r String String
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str String String str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r String String
|
||||||
|
LowCardinality(String) LowCardinality(String) String String str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str String String str str
|
||||||
|
String String str_r str_r String String
|
||||||
|
String String String String str_l str_l
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
LowCardinality(String)
|
||||||
|
str_l LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN nr AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN nr AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN nr AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(String) LowCardinality(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(String) LowCardinality(String)
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(String) LowCardinality(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN nr AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
Nullable(String) Nullable(String) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
LowCardinality(String) LowCardinality(String) Nullable(String) Nullable(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SET join_use_nulls = 1;
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(String)
|
||||||
|
str_r LowCardinality(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
str_r LowCardinality(Nullable(String))
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
str_r String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
String String str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str Nullable(String) Nullable(String) str str
|
||||||
|
String String str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str String
|
||||||
|
str_r String
|
||||||
|
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
String String str str Nullable(String) Nullable(String) str str
|
||||||
|
String String str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (x) ORDER BY x, lc;
|
||||||
|
str LowCardinality(Nullable(String))
|
||||||
|
\N LowCardinality(Nullable(String))
|
||||||
|
str_l LowCardinality(Nullable(String))
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN nr AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l RIGHT JOIN nr AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN nr AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N
|
||||||
|
Nullable(String) Nullable(String) \N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM l_lc AS l FULL JOIN nr AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
--
|
||||||
|
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (x) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
\N Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||||
|
str Nullable(String)
|
||||||
|
str_l Nullable(String)
|
||||||
|
str_r Nullable(String)
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(String) LowCardinality(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(String) LowCardinality(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, r.lc, l.lc;
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str str Nullable(String) Nullable(String) str str
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc), toTypeName(l.lc), toTypeName(materialize(l.lc)), l.lc, materialize(l.lc) FROM nl AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, r.lc, l.lc;
|
||||||
|
Nullable(String) Nullable(String) str str Nullable(String) Nullable(String) str str
|
||||||
|
Nullable(String) Nullable(String) \N \N Nullable(String) Nullable(String) str_l str_l
|
||||||
|
Nullable(String) Nullable(String) str_r str_r Nullable(String) Nullable(String) \N \N
|
||||||
|
{% endfor -%}
|
||||||
|
SELECT '--';
|
||||||
|
--
|
||||||
|
SET join_use_nulls = 0;
|
||||||
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY l.lc;
|
||||||
|
LowCardinality(String)
|
||||||
|
str LowCardinality(String)
|
||||||
|
SET join_algorithm = 'partial_merge';
|
||||||
|
SET join_use_nulls = 1;
|
||||||
|
SELECT r.lc, materialize(r.lc), toTypeName(r.lc), toTypeName(materialize(r.lc)) FROM l_lc AS l FULL OUTER JOIN r_lc AS r USING (x) ORDER BY r.lc;
|
||||||
|
str str LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
||||||
|
str_r str_r LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
||||||
|
\N \N LowCardinality(Nullable(String)) LowCardinality(Nullable(String))
|
||||||
|
DROP TABLE l;
|
||||||
|
DROP TABLE r;
|
||||||
|
DROP TABLE nl;
|
||||||
|
DROP TABLE nr;
|
||||||
|
DROP TABLE l_lc;
|
||||||
|
DROP TABLE r_lc;
|
@ -22,15 +22,17 @@ INSERT INTO l VALUES (0, 'str'), (2, 'str_l');
|
|||||||
INSERT INTO nl VALUES (0, 'str'), (2, 'str_l');
|
INSERT INTO nl VALUES (0, 'str'), (2, 'str_l');
|
||||||
INSERT INTO l_lc VALUES (0, 'str'), (2, 'str_l');
|
INSERT INTO l_lc VALUES (0, 'str'), (2, 'str_l');
|
||||||
|
|
||||||
{% for join_algorithm in [None, 'partial_merge', 'parallel_hash'] -%}
|
-- { echoOn }
|
||||||
|
{% for allow_experimental_analyzer in [0, 1] -%}
|
||||||
|
|
||||||
|
SET allow_experimental_analyzer = {{ allow_experimental_analyzer }};
|
||||||
|
|
||||||
|
{% for join_algorithm in ['default', 'partial_merge', 'parallel_hash'] -%}
|
||||||
|
SET join_algorithm = '{{ join_algorithm }}';
|
||||||
|
|
||||||
{% for join_use_nulls in [0, 1] -%}
|
{% for join_use_nulls in [0, 1] -%}
|
||||||
|
|
||||||
SELECT '-- join_algorithm = {{ join_algorithm or 'default' }}, join_use_nulls = {{ join_use_nulls }} --';
|
|
||||||
|
|
||||||
{% if join_algorithm %}SET join_algorithm = '{{ join_algorithm }}';{% endif -%}
|
|
||||||
SET join_use_nulls = {{ join_use_nulls }};
|
SET join_use_nulls = {{ join_use_nulls }};
|
||||||
|
|
||||||
|
|
||||||
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||||
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x, lc;
|
||||||
@ -98,13 +100,13 @@ SET join_use_nulls = 0;
|
|||||||
|
|
||||||
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY l.lc;
|
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (x) ORDER BY l.lc;
|
||||||
|
|
||||||
SELECT lowCardinalityKeys(lc.lc) FROM r FULL JOIN l_lc as lc USING (lc) ORDER BY lowCardinalityKeys(lc.lc);
|
|
||||||
|
|
||||||
SET join_algorithm = 'partial_merge';
|
SET join_algorithm = 'partial_merge';
|
||||||
SET join_use_nulls = 1;
|
SET join_use_nulls = 1;
|
||||||
|
|
||||||
SELECT r.lc, materialize(r.lc), toTypeName(r.lc), toTypeName(materialize(r.lc)) FROM l_lc AS l FULL OUTER JOIN r_lc AS r USING (x) ORDER BY r.lc;
|
SELECT r.lc, materialize(r.lc), toTypeName(r.lc), toTypeName(materialize(r.lc)) FROM l_lc AS l FULL OUTER JOIN r_lc AS r USING (x) ORDER BY r.lc;
|
||||||
|
|
||||||
|
{% endfor -%}
|
||||||
|
|
||||||
DROP TABLE l;
|
DROP TABLE l;
|
||||||
DROP TABLE r;
|
DROP TABLE r;
|
||||||
DROP TABLE nl;
|
DROP TABLE nl;
|
||||||
|
@ -34,3 +34,21 @@ UInt64 LowCardinality(UInt64) LowCardinality(String) String
|
|||||||
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
||||||
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
||||||
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
||||||
|
-
|
||||||
|
UInt64 UInt64 String LowCardinality(String)
|
||||||
|
-
|
||||||
|
UInt64 UInt64 LowCardinality(String) String
|
||||||
|
-
|
||||||
|
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
||||||
|
-
|
||||||
|
UInt64 UInt64 String LowCardinality(String)
|
||||||
|
UInt64 UInt64 String LowCardinality(String)
|
||||||
|
UInt64 UInt64 String LowCardinality(String)
|
||||||
|
-
|
||||||
|
UInt64 UInt64 LowCardinality(String) String
|
||||||
|
UInt64 UInt64 LowCardinality(String) String
|
||||||
|
UInt64 UInt64 LowCardinality(String) String
|
||||||
|
-
|
||||||
|
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
||||||
|
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
||||||
|
LowCardinality(UInt64) LowCardinality(UInt64) LowCardinality(String) LowCardinality(String)
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
SET allow_experimental_analyzer = 0;
|
||||||
set join_algorithm = 'hash';
|
set join_algorithm = 'hash';
|
||||||
|
|
||||||
select '-';
|
select '-';
|
||||||
@ -73,3 +74,42 @@ select toTypeName(materialize(js1.k)), toTypeName(materialize(js2.k)), toTypeNam
|
|||||||
from (select toLowCardinality(number) k, toLowCardinality(toString(number)) s from numbers(2)) as js1
|
from (select toLowCardinality(number) k, toLowCardinality(toString(number)) s from numbers(2)) as js1
|
||||||
full join (select toLowCardinality(number+1) k, toLowCardinality(toString(number+1)) s from numbers(2)) as js2
|
full join (select toLowCardinality(number+1) k, toLowCardinality(toString(number+1)) s from numbers(2)) as js2
|
||||||
using k order by js1.k, js2.k;
|
using k order by js1.k, js2.k;
|
||||||
|
|
||||||
|
SET allow_experimental_analyzer = 1;
|
||||||
|
set join_algorithm = 'hash';
|
||||||
|
|
||||||
|
select '-';
|
||||||
|
select toTypeName(materialize(js1.k)), toTypeName(materialize(js2.k)), toTypeName(materialize(js1.s)), toTypeName(materialize(js2.s))
|
||||||
|
from (select toLowCardinality(number) k, toString(number) s from numbers(2)) as js1
|
||||||
|
join (select number+1 k, toLowCardinality(toString(number+1)) s from numbers(2)) as js2
|
||||||
|
using k order by js1.k, js2.k;
|
||||||
|
|
||||||
|
select '-';
|
||||||
|
select toTypeName(materialize(js1.k)), toTypeName(materialize(js2.k)), toTypeName(materialize(js1.s)), toTypeName(materialize(js2.s))
|
||||||
|
from (select number k, toLowCardinality(toString(number)) s from numbers(2)) as js1
|
||||||
|
join (select toLowCardinality(number+1) k, toString(number+1) s from numbers(2)) as js2
|
||||||
|
using k order by js1.k, js2.k;
|
||||||
|
|
||||||
|
select '-';
|
||||||
|
select toTypeName(materialize(js1.k)), toTypeName(materialize(js2.k)), toTypeName(materialize(js1.s)), toTypeName(materialize(js2.s))
|
||||||
|
from (select toLowCardinality(number) k, toLowCardinality(toString(number)) s from numbers(2)) as js1
|
||||||
|
join (select toLowCardinality(number+1) k, toLowCardinality(toString(number+1)) s from numbers(2)) as js2
|
||||||
|
using k order by js1.k, js2.k;
|
||||||
|
|
||||||
|
select '-';
|
||||||
|
select toTypeName(materialize(js1.k)), toTypeName(materialize(js2.k)), toTypeName(materialize(js1.s)), toTypeName(materialize(js2.s))
|
||||||
|
from (select toLowCardinality(number) k, toString(number) s from numbers(2)) as js1
|
||||||
|
full join (select number+1 k, toLowCardinality(toString(number+1)) s from numbers(2)) as js2
|
||||||
|
using k order by js1.k, js2.k;
|
||||||
|
|
||||||
|
select '-';
|
||||||
|
select toTypeName(materialize(js1.k)), toTypeName(materialize(js2.k)), toTypeName(materialize(js1.s)), toTypeName(materialize(js2.s))
|
||||||
|
from (select number k, toLowCardinality(toString(number)) s from numbers(2)) as js1
|
||||||
|
full join (select toLowCardinality(number+1) k, toString(number+1) s from numbers(2)) as js2
|
||||||
|
using k order by js1.k, js2.k;
|
||||||
|
|
||||||
|
select '-';
|
||||||
|
select toTypeName(materialize(js1.k)), toTypeName(materialize(js2.k)), toTypeName(materialize(js1.s)), toTypeName(materialize(js2.s))
|
||||||
|
from (select toLowCardinality(number) k, toLowCardinality(toString(number)) s from numbers(2)) as js1
|
||||||
|
full join (select toLowCardinality(number+1) k, toLowCardinality(toString(number+1)) s from numbers(2)) as js2
|
||||||
|
using k order by js1.k, js2.k;
|
||||||
|
@ -82,6 +82,16 @@
|
|||||||
3 3 3
|
3 3 3
|
||||||
4 4 4
|
4 4 4
|
||||||
5 5 5
|
5 5 5
|
||||||
|
-4 0 -4
|
||||||
|
-3 0 -3
|
||||||
|
-2 0 -2
|
||||||
|
-1 0 -1
|
||||||
|
0 0 0
|
||||||
|
1 1 1
|
||||||
|
2 2 2
|
||||||
|
3 3 3
|
||||||
|
4 4 4
|
||||||
|
5 5 5
|
||||||
= inner =
|
= inner =
|
||||||
1 1 1
|
1 1 1
|
||||||
2 2 2
|
2 2 2
|
||||||
@ -284,6 +294,16 @@
|
|||||||
\N \N -2
|
\N \N -2
|
||||||
\N \N -1
|
\N \N -1
|
||||||
\N \N 0
|
\N \N 0
|
||||||
|
1 1 1
|
||||||
|
2 2 2
|
||||||
|
3 3 3
|
||||||
|
4 4 4
|
||||||
|
5 5 5
|
||||||
|
-4 \N -4
|
||||||
|
-3 \N -3
|
||||||
|
-2 \N -2
|
||||||
|
-1 \N -1
|
||||||
|
0 \N 0
|
||||||
= inner =
|
= inner =
|
||||||
1 1 1
|
1 1 1
|
||||||
2 2 2
|
2 2 2
|
||||||
@ -402,5 +422,6 @@
|
|||||||
1
|
1
|
||||||
1
|
1
|
||||||
1
|
1
|
||||||
|
1
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
{% endfor -%}
|
{% endfor -%}
|
||||||
|
@ -37,7 +37,8 @@ SELECT a, t1.a, t2.a FROM t1 FULL JOIN t2 USING (a) ORDER BY (t1.a, t2.a); {{ is
|
|||||||
SELECT '= left =';
|
SELECT '= left =';
|
||||||
SELECT a, t1.a, t2.a FROM t1 LEFT JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
SELECT a, t1.a, t2.a FROM t1 LEFT JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
||||||
SELECT '= right =';
|
SELECT '= right =';
|
||||||
SELECT a, t1.a, t2.a FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (t1.a, t2.a); {{ is_implemented(join_algorithm) }}
|
SELECT a, t1.a, t2.a FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (t1.a, t2.a) SETTINGS allow_experimental_analyzer = 0; {{ is_implemented(join_algorithm) }}
|
||||||
|
SELECT a, t1.a, t2.a FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (t1.a, t2.a) SETTINGS allow_experimental_analyzer = 1; {{ is_implemented(join_algorithm) }}
|
||||||
SELECT '= inner =';
|
SELECT '= inner =';
|
||||||
SELECT a, t1.a, t2.a FROM t1 INNER JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
SELECT a, t1.a, t2.a FROM t1 INNER JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
||||||
|
|
||||||
@ -61,10 +62,10 @@ SELECT '= inner =';
|
|||||||
SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a);
|
SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a);
|
||||||
|
|
||||||
-- Int64 and UInt64 has no supertype
|
-- Int64 and UInt64 has no supertype
|
||||||
SELECT * FROM t1 FULL JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 }
|
SELECT * FROM t1 FULL JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53,386 }
|
||||||
SELECT * FROM t1 LEFT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 }
|
SELECT * FROM t1 LEFT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53,386 }
|
||||||
SELECT * FROM t1 RIGHT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 }
|
SELECT * FROM t1 RIGHT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53,386 }
|
||||||
SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 }
|
SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53,386 }
|
||||||
|
|
||||||
SELECT '= agg =';
|
SELECT '= agg =';
|
||||||
SELECT sum(a) == 7 FROM t1 FULL JOIN t2 USING (a) WHERE b > 102 AND t2.b <= 204; {{ is_implemented(join_algorithm) }}
|
SELECT sum(a) == 7 FROM t1 FULL JOIN t2 USING (a) WHERE b > 102 AND t2.b <= 204; {{ is_implemented(join_algorithm) }}
|
||||||
@ -118,7 +119,8 @@ SELECT a, t1.a, t2.a FROM t1 FULL JOIN t2 USING (a) ORDER BY (t1.a, t2.a); {{ is
|
|||||||
SELECT '= left =';
|
SELECT '= left =';
|
||||||
SELECT a, t1.a, t2.a FROM t1 LEFT JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
SELECT a, t1.a, t2.a FROM t1 LEFT JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
||||||
SELECT '= right =';
|
SELECT '= right =';
|
||||||
SELECT a, t1.a, t2.a FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (t1.a, t2.a); {{ is_implemented(join_algorithm) }}
|
SELECT a, t1.a, t2.a FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (t1.a, t2.a) SETTINGS allow_experimental_analyzer = 0; {{ is_implemented(join_algorithm) }}
|
||||||
|
SELECT a, t1.a, t2.a FROM t1 RIGHT JOIN t2 USING (a) ORDER BY (t1.a, t2.a) SETTINGS allow_experimental_analyzer = 1; {{ is_implemented(join_algorithm) }}
|
||||||
SELECT '= inner =';
|
SELECT '= inner =';
|
||||||
SELECT a, t1.a, t2.a FROM t1 INNER JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
SELECT a, t1.a, t2.a FROM t1 INNER JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
||||||
|
|
||||||
@ -142,10 +144,10 @@ SELECT '= inner =';
|
|||||||
SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a);
|
SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b = t2.a + t2.b - 100) ORDER BY (t1.a, t2.a);
|
||||||
|
|
||||||
-- Int64 and UInt64 has no supertype
|
-- Int64 and UInt64 has no supertype
|
||||||
SELECT * FROM t1 FULL JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 }
|
SELECT * FROM t1 FULL JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53,386 }
|
||||||
SELECT * FROM t1 LEFT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 }
|
SELECT * FROM t1 LEFT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53,386 }
|
||||||
SELECT * FROM t1 RIGHT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 }
|
SELECT * FROM t1 RIGHT JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53,386 }
|
||||||
SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53 }
|
SELECT * FROM t1 INNER JOIN t2 ON (t1.a + t1.b + 100 = t2.a + t2.b) ORDER BY (t1.a, t2.a); -- { serverError 53,386 }
|
||||||
|
|
||||||
SELECT '= agg =';
|
SELECT '= agg =';
|
||||||
SELECT sum(a) == 7 FROM t1 FULL JOIN t2 USING (a) WHERE b > 102 AND t2.b <= 204; {{ is_implemented(join_algorithm) }}
|
SELECT sum(a) == 7 FROM t1 FULL JOIN t2 USING (a) WHERE b > 102 AND t2.b <= 204; {{ is_implemented(join_algorithm) }}
|
||||||
@ -163,7 +165,10 @@ SELECT a > 0, sum(a), sum(t2.a), sum(b), sum(t2.b) FROM t1 FULL JOIN t2 ON (t1.a
|
|||||||
SELECT '= types =';
|
SELECT '= types =';
|
||||||
SELECT any(toTypeName(a)) == 'Nullable(Int32)' AND any(toTypeName(t2.a)) == 'Nullable(Int32)' FROM t1 FULL JOIN t2 USING (a); {{ is_implemented(join_algorithm) }}
|
SELECT any(toTypeName(a)) == 'Nullable(Int32)' AND any(toTypeName(t2.a)) == 'Nullable(Int32)' FROM t1 FULL JOIN t2 USING (a); {{ is_implemented(join_algorithm) }}
|
||||||
SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Nullable(Int32)' FROM t1 LEFT JOIN t2 USING (a);
|
SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Nullable(Int32)' FROM t1 LEFT JOIN t2 USING (a);
|
||||||
SELECT any(toTypeName(a)) == 'Nullable(Int32)' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 RIGHT JOIN t2 USING (a); {{ is_implemented(join_algorithm) }}
|
|
||||||
|
SELECT any(toTypeName(a)) == 'Nullable(Int32)' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 RIGHT JOIN t2 USING (a) SETTINGS allow_experimental_analyzer = 0; {{ is_implemented(join_algorithm) }}
|
||||||
|
SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 RIGHT JOIN t2 USING (a) SETTINGS allow_experimental_analyzer = 1; {{ is_implemented(join_algorithm) }}
|
||||||
|
|
||||||
SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 INNER JOIN t2 USING (a);
|
SELECT any(toTypeName(a)) == 'Int32' AND any(toTypeName(t2.a)) == 'Int32' FROM t1 INNER JOIN t2 USING (a);
|
||||||
|
|
||||||
SELECT toTypeName(any(a)) == 'Nullable(Int32)' AND toTypeName(any(t2.a)) == 'Nullable(Int32)' FROM t1 FULL JOIN t2 USING (a); {{ is_implemented(join_algorithm) }}
|
SELECT toTypeName(any(a)) == 'Nullable(Int32)' AND toTypeName(any(t2.a)) == 'Nullable(Int32)' FROM t1 FULL JOIN t2 USING (a); {{ is_implemented(join_algorithm) }}
|
||||||
|
@ -6,3 +6,5 @@
|
|||||||
1 1 1 2
|
1 1 1 2
|
||||||
2
|
2
|
||||||
4
|
4
|
||||||
|
1 1 2
|
||||||
|
1 1 2
|
||||||
|
@ -27,6 +27,7 @@ $CLICKHOUSE_CLIENT -nm -q "
|
|||||||
select * from test_distributed td asof join $CLICKHOUSE_DATABASE.test_local tl on td.k = tl.k and td.v < tl.v order by tl.v;
|
select * from test_distributed td asof join $CLICKHOUSE_DATABASE.test_local tl on td.k = tl.k and td.v < tl.v order by tl.v;
|
||||||
select sum(td.v) from test_distributed td asof join $CLICKHOUSE_DATABASE.test_local tl on td.k = tl.k and td.v < tl.v group by tl.k;
|
select sum(td.v) from test_distributed td asof join $CLICKHOUSE_DATABASE.test_local tl on td.k = tl.k and td.v < tl.v group by tl.k;
|
||||||
select sum(tl.v) from test_distributed td asof join $CLICKHOUSE_DATABASE.test_local tl on td.k = tl.k and td.v < tl.v group by td.k;
|
select sum(tl.v) from test_distributed td asof join $CLICKHOUSE_DATABASE.test_local tl on td.k = tl.k and td.v < tl.v group by td.k;
|
||||||
|
select td.k, tl.* from test_distributed td join $CLICKHOUSE_DATABASE.test_local tl on td.k = tl.k;
|
||||||
|
|
||||||
drop table test_distributed;
|
drop table test_distributed;
|
||||||
drop table test_source;
|
drop table test_source;
|
||||||
|
@ -30,3 +30,27 @@
|
|||||||
\N 3
|
\N 3
|
||||||
1 \N
|
1 \N
|
||||||
2 \N
|
2 \N
|
||||||
|
2 2
|
||||||
|
2 2
|
||||||
|
-- { echoOn }
|
||||||
|
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id AND 1 = 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
1 0
|
||||||
|
2 2
|
||||||
|
SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id AND 1 = 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
2 2
|
||||||
|
0 3
|
||||||
|
SELECT * FROM t1 FULL JOIN t2 ON t1.id = t2.id AND 1 = 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
1 0
|
||||||
|
2 2
|
||||||
|
0 3
|
||||||
|
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id AND 1 = 2 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
1 0
|
||||||
|
2 0
|
||||||
|
SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id AND 1 = 2 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
0 2
|
||||||
|
0 3
|
||||||
|
SELECT * FROM t1 FULL JOIN t2 ON t1.id = t2.id AND 1 = 2 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
1 0
|
||||||
|
2 0
|
||||||
|
0 2
|
||||||
|
0 3
|
||||||
|
@ -10,23 +10,23 @@ INSERT INTO t2 VALUES (2), (3);
|
|||||||
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON 1 = 1;
|
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON 1 = 1;
|
||||||
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON 1;
|
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON 1;
|
||||||
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON 2 = 2 AND 3 = 3;
|
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON 2 = 2 AND 3 = 3;
|
||||||
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 INNER ANY JOIN t2 ON toNullable(1);
|
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON toNullable(1);
|
||||||
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 INNER ANY JOIN t2 ON toLowCardinality(1);
|
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON toLowCardinality(1);
|
||||||
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 INNER ANY JOIN t2 ON toLowCardinality(toNullable(1));
|
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON toLowCardinality(toNullable(1));
|
||||||
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 INNER ANY JOIN t2 ON toNullable(toLowCardinality(1));
|
SELECT 70 = 10 * sum(t1.id) + sum(t2.id) AND count() == 4 FROM t1 JOIN t2 ON toNullable(toLowCardinality(1));
|
||||||
|
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON toUInt16(1); -- { serverError 403 }
|
SELECT * FROM t1 JOIN t2 ON toUInt16(1); -- { serverError 403 }
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON toInt8(1); -- { serverError 403 }
|
SELECT * FROM t1 JOIN t2 ON toInt8(1); -- { serverError 403 }
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON 256; -- { serverError 403 }
|
SELECT * FROM t1 JOIN t2 ON 256; -- { serverError 403 }
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON -1; -- { serverError 403 }
|
SELECT * FROM t1 JOIN t2 ON -1; -- { serverError 403 }
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON toString(1); -- { serverError 403 }
|
SELECT * FROM t1 JOIN t2 ON toString(1); -- { serverError 403 }
|
||||||
|
|
||||||
SELECT '- ON NULL -';
|
SELECT '- ON NULL -';
|
||||||
|
|
||||||
SELECT '- inner -';
|
SELECT '- inner -';
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON NULL;
|
SELECT * FROM t1 JOIN t2 ON NULL;
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON 0;
|
SELECT * FROM t1 JOIN t2 ON 0;
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON 1 = 2;
|
SELECT * FROM t1 JOIN t2 ON 1 = 2;
|
||||||
SELECT '- left -';
|
SELECT '- left -';
|
||||||
SELECT * FROM t1 LEFT JOIN t2 ON NULL ORDER BY t1.id, t2.id;
|
SELECT * FROM t1 LEFT JOIN t2 ON NULL ORDER BY t1.id, t2.id;
|
||||||
SELECT '- right -';
|
SELECT '- right -';
|
||||||
@ -35,7 +35,7 @@ SELECT '- full -';
|
|||||||
SELECT * FROM t1 FULL JOIN t2 ON NULL ORDER BY t1.id, t2.id;
|
SELECT * FROM t1 FULL JOIN t2 ON NULL ORDER BY t1.id, t2.id;
|
||||||
|
|
||||||
SELECT '- inner -';
|
SELECT '- inner -';
|
||||||
SELECT * FROM t1 INNER ANY JOIN t2 ON NULL ORDER BY t1.id NULLS FIRST, t2.id SETTINGS join_use_nulls = 1;
|
SELECT * FROM t1 JOIN t2 ON NULL ORDER BY t1.id NULLS FIRST, t2.id SETTINGS join_use_nulls = 1;
|
||||||
SELECT '- left -';
|
SELECT '- left -';
|
||||||
SELECT * FROM t1 LEFT JOIN t2 ON NULL ORDER BY t1.id NULLS FIRST, t2.id SETTINGS join_use_nulls = 1;
|
SELECT * FROM t1 LEFT JOIN t2 ON NULL ORDER BY t1.id NULLS FIRST, t2.id SETTINGS join_use_nulls = 1;
|
||||||
SELECT '- right -';
|
SELECT '- right -';
|
||||||
@ -43,29 +43,45 @@ SELECT * FROM t1 RIGHT JOIN t2 ON NULL ORDER BY t1.id NULLS FIRST, t2.id SETTING
|
|||||||
SELECT '- full -';
|
SELECT '- full -';
|
||||||
SELECT * FROM t1 FULL JOIN t2 ON NULL ORDER BY t1.id NULLS FIRST, t2.id SETTINGS join_use_nulls = 1;
|
SELECT * FROM t1 FULL JOIN t2 ON NULL ORDER BY t1.id NULLS FIRST, t2.id SETTINGS join_use_nulls = 1;
|
||||||
|
|
||||||
-- in this cases we have AMBIGUOUS_COLUMN_NAME instead of INVALID_JOIN_ON_EXPRESSION
|
-- in this cases in old analuyzer we have AMBIGUOUS_COLUMN_NAME instead of INVALID_JOIN_ON_EXPRESSION
|
||||||
-- because there's some function in ON expression is not constant itself (result is constant)
|
-- because there's some function in ON expression is not constant itself (result is constant)
|
||||||
SELECT * FROM t1 JOIN t2 ON 1 = 1 SETTINGS join_algorithm = 'full_sorting_merge'; -- { serverError AMBIGUOUS_COLUMN_NAME }
|
SELECT * FROM t1 JOIN t2 ON 1 = 1 SETTINGS join_algorithm = 'full_sorting_merge'; -- { serverError AMBIGUOUS_COLUMN_NAME,NOT_IMPLEMENTED }
|
||||||
SELECT * FROM t1 JOIN t2 ON 1 = 1 SETTINGS join_algorithm = 'partial_merge'; -- { serverError AMBIGUOUS_COLUMN_NAME }
|
SELECT * FROM t1 JOIN t2 ON 1 = 1 SETTINGS join_algorithm = 'partial_merge'; -- { serverError AMBIGUOUS_COLUMN_NAME,NOT_IMPLEMENTED }
|
||||||
SELECT * FROM t1 JOIN t2 ON 1 = 1 SETTINGS join_algorithm = 'auto'; -- { serverError AMBIGUOUS_COLUMN_NAME }
|
SELECT * FROM t1 JOIN t2 ON 1 = 1 SETTINGS join_algorithm = 'auto'; -- { serverError AMBIGUOUS_COLUMN_NAME,NOT_IMPLEMENTED }
|
||||||
|
|
||||||
SELECT * FROM t1 JOIN t2 ON NULL SETTINGS join_algorithm = 'full_sorting_merge'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 JOIN t2 ON NULL SETTINGS join_algorithm = 'full_sorting_merge'; -- { serverError INVALID_JOIN_ON_EXPRESSION,NOT_IMPLEMENTED }
|
||||||
SELECT * FROM t1 JOIN t2 ON NULL SETTINGS join_algorithm = 'partial_merge'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 JOIN t2 ON NULL SETTINGS join_algorithm = 'partial_merge'; -- { serverError INVALID_JOIN_ON_EXPRESSION,NOT_IMPLEMENTED }
|
||||||
SELECT * FROM t1 LEFT JOIN t2 ON NULL SETTINGS join_algorithm = 'partial_merge'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 LEFT JOIN t2 ON NULL SETTINGS join_algorithm = 'partial_merge'; -- { serverError INVALID_JOIN_ON_EXPRESSION,NOT_IMPLEMENTED }
|
||||||
SELECT * FROM t1 RIGHT JOIN t2 ON NULL SETTINGS join_algorithm = 'auto'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 RIGHT JOIN t2 ON NULL SETTINGS join_algorithm = 'auto'; -- { serverError INVALID_JOIN_ON_EXPRESSION,NOT_IMPLEMENTED }
|
||||||
SELECT * FROM t1 FULL JOIN t2 ON NULL SETTINGS join_algorithm = 'partial_merge'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 FULL JOIN t2 ON NULL SETTINGS join_algorithm = 'partial_merge'; -- { serverError INVALID_JOIN_ON_EXPRESSION,NOT_IMPLEMENTED }
|
||||||
|
|
||||||
-- mixing of constant and non-constant expressions in ON is not allowed
|
-- mixing of constant and non-constant expressions in ON is not allowed
|
||||||
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 == 1; -- { serverError AMBIGUOUS_COLUMN_NAME }
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 == 1 SETTINGS allow_experimental_analyzer = 0; -- { serverError AMBIGUOUS_COLUMN_NAME }
|
||||||
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 == 2; -- { serverError AMBIGUOUS_COLUMN_NAME }
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 == 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 == 2 SETTINGS allow_experimental_analyzer = 0; -- { serverError AMBIGUOUS_COLUMN_NAME }
|
||||||
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 == 2 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
|
||||||
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 != 1; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 != 1 SETTINGS allow_experimental_analyzer = 0; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
||||||
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 != 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND NULL; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND NULL; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
||||||
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 'aaa'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 'aaa'; -- { serverError INVALID_JOIN_ON_EXPRESSION,ILLEGAL_TYPE_OF_ARGUMENT }
|
||||||
SELECT * FROM t1 JOIN t2 ON 'aaa'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 JOIN t2 ON 'aaa'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
||||||
|
|
||||||
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 0; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 0 SETTINGS allow_experimental_analyzer = 0; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
||||||
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 0 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 SETTINGS allow_experimental_analyzer = 0; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
||||||
|
SELECT * FROM t1 JOIN t2 ON t1.id = t2.id AND 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
|
||||||
|
-- { echoOn }
|
||||||
|
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id AND 1 = 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id AND 1 = 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
SELECT * FROM t1 FULL JOIN t2 ON t1.id = t2.id AND 1 = 1 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
|
||||||
|
SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id AND 1 = 2 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id AND 1 = 2 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
SELECT * FROM t1 FULL JOIN t2 ON t1.id = t2.id AND 1 = 2 SETTINGS allow_experimental_analyzer = 1;
|
||||||
|
|
||||||
|
-- { echoOff }
|
||||||
|
|
||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
DROP TABLE IF EXISTS t2;
|
DROP TABLE IF EXISTS t2;
|
||||||
|
@ -45,7 +45,7 @@ SELECT '--- key types';
|
|||||||
SELECT * FROM t2 INNER JOIN rdb ON rdb.key == t2.k ORDER BY rdb.key;
|
SELECT * FROM t2 INNER JOIN rdb ON rdb.key == t2.k ORDER BY rdb.key;
|
||||||
|
|
||||||
-- can't promote right table type
|
-- can't promote right table type
|
||||||
SELECT * FROM (SELECT toUInt64(k) as k FROM t2) as t2 INNER JOIN rdb ON rdb.key == t2.k; -- { serverError TYPE_MISMATCH }
|
SELECT * FROM (SELECT toUInt64(k) as k FROM t2) as t2 INNER JOIN rdb ON rdb.key == t2.k; -- { serverError NOT_IMPLEMENTED,TYPE_MISMATCH }
|
||||||
-- TODO: support fallcack when right table key type can't be changed
|
-- TODO: support fallcack when right table key type can't be changed
|
||||||
-- SELECT * FROM (SELECT toUInt64(k) as k FROM t2) as t2 INNER JOIN rdb ON rdb.key == t2.k FORMAT Null SETTINGS join_algorithm = 'direct,hash';
|
-- SELECT * FROM (SELECT toUInt64(k) as k FROM t2) as t2 INNER JOIN rdb ON rdb.key == t2.k FORMAT Null SETTINGS join_algorithm = 'direct,hash';
|
||||||
|
|
||||||
|
@ -12,3 +12,10 @@ y 0 0 1 3
|
|||||||
0 0 1 0
|
0 0 1 0
|
||||||
y 0 0 1 3
|
y 0 0 1 3
|
||||||
\N 0 \N 10000000000 \N
|
\N 0 \N 10000000000 \N
|
||||||
|
2 1 1 2
|
||||||
|
0 1 1 0
|
||||||
|
0 1 1 0
|
||||||
|
0 1 1 0
|
||||||
|
0 0 0 0 1 1 0
|
||||||
|
y 0 0 0 1 1 3
|
||||||
|
\N 0 \N \N 10000000000 \N
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
SET allow_experimental_analyzer = 0;
|
||||||
|
|
||||||
SET join_algorithm = 'hash';
|
SET join_algorithm = 'hash';
|
||||||
|
|
||||||
SELECT * FROM ( SELECT 2 AS x ) AS t1 RIGHT JOIN ( SELECT count('x'), count('y'), 2 AS x ) AS t2 ON t1.x = t2.x;
|
SELECT * FROM ( SELECT 2 AS x ) AS t1 RIGHT JOIN ( SELECT count('x'), count('y'), 2 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
@ -15,7 +17,18 @@ SELECT * FROM ( SELECT 2 AS x ) AS t1 RIGHT JOIN ( SELECT count('x'), count('y')
|
|||||||
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x'), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x'), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x') :: Nullable(Int32), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x') :: Nullable(Int32), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x') :: Nullable(Int32), count('y') :: Nullable(Int32), 0 AS x ) AS t2 ON t1.x = t2.x;
|
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x') :: Nullable(Int32), count('y') :: Nullable(Int32), 0 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
|
SELECT * FROM ( SELECT count('a'), count('b'), count('c'), 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x'), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
|
|
||||||
|
SELECT 'y', * FROM (SELECT count('y'), count('y'), 2 AS x) AS t1 RIGHT JOIN (SELECT count('x'), count('y'), 3 AS x) AS t2 ON t1.x = t2.x;
|
||||||
|
SELECT * FROM (SELECT arrayJoin([NULL]), 9223372036854775806, arrayJoin([NULL]), NULL AS x) AS t1 RIGHT JOIN (SELECT arrayJoin([arrayJoin([10000000000.])]), NULL AS x) AS t2 ON t1.x = t2.x;
|
||||||
|
|
||||||
|
SET allow_experimental_analyzer = 1;
|
||||||
|
SET join_algorithm = 'hash';
|
||||||
|
|
||||||
|
SELECT * FROM ( SELECT 2 AS x ) AS t1 RIGHT JOIN ( SELECT count('x'), count('y'), 2 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
|
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x'), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
|
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x') :: Nullable(Int32), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
|
SELECT * FROM ( SELECT 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x') :: Nullable(Int32), count('y') :: Nullable(Int32), 0 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
SELECT * FROM ( SELECT count('a'), count('b'), count('c'), 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x'), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
SELECT * FROM ( SELECT count('a'), count('b'), count('c'), 2 AS x ) as t1 RIGHT JOIN ( SELECT count('x'), count('y'), 0 AS x ) AS t2 ON t1.x = t2.x;
|
||||||
|
|
||||||
SELECT 'y', * FROM (SELECT count('y'), count('y'), 2 AS x) AS t1 RIGHT JOIN (SELECT count('x'), count('y'), 3 AS x) AS t2 ON t1.x = t2.x;
|
SELECT 'y', * FROM (SELECT count('y'), count('y'), 2 AS x) AS t1 RIGHT JOIN (SELECT count('x'), count('y'), 3 AS x) AS t2 ON t1.x = t2.x;
|
||||||
|
@ -7,8 +7,5 @@
|
|||||||
10
|
10
|
||||||
bug with constant columns in join keys
|
bug with constant columns in join keys
|
||||||
a a
|
a a
|
||||||
a a
|
|
||||||
a a
|
|
||||||
a a
|
|
||||||
1
|
1
|
||||||
1
|
1
|
||||||
|
@ -22,20 +22,20 @@ SELECT count() FROM t1 JOIN t2 ON t1.x = t2.x WHERE t1.x % 2 == 0 AND t2.x % 2 =
|
|||||||
SELECT 'bug with constant columns in join keys';
|
SELECT 'bug with constant columns in join keys';
|
||||||
|
|
||||||
SELECT * FROM ( SELECT 'a' AS key ) AS t1
|
SELECT * FROM ( SELECT 'a' AS key ) AS t1
|
||||||
INNER JOIN ( SELECT 'a' AS key GROUP BY ignore(1), ignore(2) WITH CUBE ) AS t2
|
INNER JOIN ( SELECT 'a' AS key ) AS t2
|
||||||
ON t1.key = t2.key
|
ON t1.key = t2.key
|
||||||
;
|
;
|
||||||
|
|
||||||
SELECT count() > 1 FROM (EXPLAIN PIPELINE
|
SELECT count() > 1 FROM (EXPLAIN PIPELINE
|
||||||
SELECT * FROM ( SELECT materialize('a') AS key ) AS t1
|
SELECT * FROM ( SELECT materialize('a') AS key ) AS t1
|
||||||
INNER JOIN ( SELECT materialize('a') AS key GROUP BY ignore(1), ignore(2) WITH CUBE ) AS t2
|
INNER JOIN ( SELECT materialize('a') AS key ) AS t2
|
||||||
ON t1.key = t2.key
|
ON t1.key = t2.key
|
||||||
) WHERE explain ilike '%FilterBySetOnTheFlyTransform%'
|
) WHERE explain ilike '%FilterBySetOnTheFlyTransform%'
|
||||||
;
|
;
|
||||||
|
|
||||||
SELECT count() == 0 FROM (EXPLAIN PIPELINE
|
SELECT count() == 0 FROM (EXPLAIN PIPELINE
|
||||||
SELECT * FROM ( SELECT 'a' AS key ) AS t1
|
SELECT * FROM ( SELECT 'a' AS key ) AS t1
|
||||||
INNER JOIN ( SELECT 'a' AS key GROUP BY ignore(1), ignore(2) WITH CUBE ) AS t2
|
INNER JOIN ( SELECT 'a' AS key ) AS t2
|
||||||
ON t1.key = t2.key
|
ON t1.key = t2.key
|
||||||
) WHERE explain ilike '%FilterBySetOnTheFlyTransform%'
|
) WHERE explain ilike '%FilterBySetOnTheFlyTransform%'
|
||||||
;
|
;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
DROP TABLE IF EXISTS t_mutations_subcolumns;
|
DROP TABLE IF EXISTS t_missed_subcolumns;
|
||||||
|
|
||||||
SET allow_experimental_object_type = 1;
|
SET allow_experimental_object_type = 1;
|
||||||
|
|
||||||
@ -14,7 +14,7 @@ OPTIMIZE TABLE t_missed_subcolumns FINAL;
|
|||||||
|
|
||||||
SELECT count(), min(id) FROM t_missed_subcolumns;
|
SELECT count(), min(id) FROM t_missed_subcolumns;
|
||||||
|
|
||||||
SELECT * FROM t_missed_subcolumns WHERE obj.k4 = 5 ORDER BY id FORMAT JSONEachRow;
|
SELECT * FROM t_missed_subcolumns WHERE obj.k4 = 5 ORDER BY id FORMAT JSONEachRow;
|
||||||
|
|
||||||
SELECT * FROM t_missed_subcolumns WHERE obj.k1.k3 = 'fee' ORDER BY id FORMAT JSONEachRow;
|
SELECT * FROM t_missed_subcolumns WHERE obj.k1.k3 = 'fee' ORDER BY id FORMAT JSONEachRow;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user