mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-18 13:42:02 +00:00
Merge remote-tracking branch 'rschu1ze/master' into string-args-in-week-functions
This commit is contained in:
commit
dda673f58b
@ -1264,7 +1264,8 @@ private:
|
||||
size_t identifier_bind_size,
|
||||
const QueryTreeNodePtr & compound_expression,
|
||||
String compound_expression_source,
|
||||
IdentifierResolveScope & scope);
|
||||
IdentifierResolveScope & scope,
|
||||
bool can_be_not_found = false);
|
||||
|
||||
QueryTreeNodePtr tryResolveIdentifierFromExpressionArguments(const IdentifierLookup & identifier_lookup, IdentifierResolveScope & scope);
|
||||
|
||||
@ -1313,6 +1314,14 @@ private:
|
||||
IdentifierResolveScope & scope,
|
||||
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
|
||||
|
||||
void qualifyColumnNodesWithProjectionNames(const QueryTreeNodes & column_nodes,
|
||||
@ -2395,11 +2404,13 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveTableIdentifierFromDatabaseCatalog(con
|
||||
}
|
||||
|
||||
/// 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,
|
||||
size_t identifier_bind_size,
|
||||
const QueryTreeNodePtr & compound_expression,
|
||||
String compound_expression_source,
|
||||
IdentifierResolveScope & scope)
|
||||
IdentifierResolveScope & scope,
|
||||
bool can_be_not_found)
|
||||
{
|
||||
Identifier compound_expression_identifier;
|
||||
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 (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;
|
||||
collectCompoundExpressionValidIdentifiersForTypoCorrection(expression_identifier,
|
||||
expression_type,
|
||||
@ -2427,20 +2455,6 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromCompoundExpression(const
|
||||
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,
|
||||
"Identifier {} nested path {} cannot be resolved from type {}{}. In scope {}{}",
|
||||
expression_identifier,
|
||||
@ -2796,6 +2810,160 @@ bool QueryAnalyzer::tryBindIdentifierToTableExpressions(const IdentifierLookup &
|
||||
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,
|
||||
const QueryTreeNodePtr & table_expression_node,
|
||||
IdentifierResolveScope & scope)
|
||||
@ -2836,151 +3004,6 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromTableExpression(const Id
|
||||
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.
|
||||
* 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.
|
||||
@ -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.
|
||||
*/
|
||||
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)))
|
||||
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)
|
||||
return {};
|
||||
|
||||
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()))
|
||||
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)
|
||||
return {};
|
||||
|
||||
const auto & database_name = table_expression_data.database_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 {};
|
||||
}
|
||||
|
@ -301,7 +301,7 @@ std::vector<UInt8> DatabaseReplicated::tryGetAreReplicasActive(const ClusterPtr
|
||||
{
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,6 @@
|
||||
#include <Interpreters/DatabaseAndTableWithAlias.h>
|
||||
#include <Interpreters/InDepthNodeVisitor.h>
|
||||
#include <Interpreters/QueryAliasesVisitor.h>
|
||||
#include <Interpreters/getHeaderForProcessingStage.h>
|
||||
#include <Interpreters/getTableExpressions.h>
|
||||
|
||||
namespace DB
|
||||
|
@ -1,3 +1,5 @@
|
||||
#include <Analyzer/QueryNode.h>
|
||||
#include <Analyzer/Utils.h>
|
||||
#include <Interpreters/getHeaderForProcessingStage.h>
|
||||
#include <Interpreters/InterpreterSelectQuery.h>
|
||||
#include <Interpreters/InterpreterSelectQueryAnalyzer.h>
|
||||
@ -8,6 +10,7 @@
|
||||
#include <Parsers/ASTFunction.h>
|
||||
#include <Parsers/ASTIdentifier.h>
|
||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||
#include <Planner/Utils.h>
|
||||
#include <Processors/Sources/SourceFromSingleChunk.h>
|
||||
|
||||
namespace DB
|
||||
@ -16,7 +19,6 @@ namespace DB
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int LOGICAL_ERROR;
|
||||
extern const int UNSUPPORTED_METHOD;
|
||||
}
|
||||
|
||||
bool hasJoin(const ASTSelectQuery & select)
|
||||
@ -124,13 +126,27 @@ Block getHeaderForProcessingStage(
|
||||
ASTPtr query = query_info.query;
|
||||
if (const auto * select = query_info.query->as<ASTSelectQuery>(); select && hasJoin(*select))
|
||||
{
|
||||
/// TODO: Analyzer 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();
|
||||
TreeRewriterResult new_rewriter_result = *query_info.syntax_analyzer_result;
|
||||
removeJoin(*query->as<ASTSelectQuery>(), new_rewriter_result, context);
|
||||
const auto & query_node = query_info.query_tree->as<QueryNode &>();
|
||||
const auto & join_tree = query_node.getJoinTree();
|
||||
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;
|
||||
|
@ -1248,7 +1248,26 @@ JoinTreeQueryPlan buildQueryPlanForJoinNode(const QueryTreeNodePtr & join_table_
|
||||
const auto & join_clause = table_join->getOnlyClause();
|
||||
|
||||
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 * 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];
|
||||
|
||||
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 (storage_primary_key.size() != 1 || storage_primary_key[0] != *table_column_name)
|
||||
if (const auto * table_column_name = right_table_expression_data.getColumnNameOrNull(key_name))
|
||||
{
|
||||
const auto & storage_primary_key = storage->getPrimaryKey();
|
||||
if (storage_primary_key.size() != 1 || storage_primary_key[0] != *table_column_name)
|
||||
return {};
|
||||
}
|
||||
else
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
/** For right table expression during execution columns have unique name.
|
||||
* 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)
|
||||
{
|
||||
const auto * table_column_name_ = right_table_expression_data.getColumnNameOrNull(right_table_expression_column.name);
|
||||
if (!table_column_name_)
|
||||
const auto * table_column_name = right_table_expression_data.getColumnNameOrNull(right_table_expression_column.name);
|
||||
if (!table_column_name)
|
||||
return {};
|
||||
|
||||
auto right_table_expression_column_with_storage_column_name = right_table_expression_column;
|
||||
|
@ -29,7 +29,7 @@
|
||||
01268_shard_avgweighted
|
||||
01270_optimize_skip_unused_shards_low_cardinality
|
||||
01319_optimize_skip_unused_shards_nesting
|
||||
01353_low_cardinality_join_types
|
||||
01428_nullable_asof_join
|
||||
01455_shard_leaf_max_rows_bytes_to_read
|
||||
01495_subqueries_in_with_statement
|
||||
01504_rocksdb
|
||||
@ -52,7 +52,6 @@
|
||||
01681_bloom_filter_nullable_column
|
||||
01700_system_zookeeper_path_in
|
||||
01710_projection_additional_filters
|
||||
01721_join_implicit_cast_long
|
||||
01739_index_hint
|
||||
02880_indexHint__partition_id
|
||||
01747_join_view_filter_dictionary
|
||||
@ -76,8 +75,6 @@
|
||||
02131_used_row_policies_in_query_log
|
||||
02139_MV_with_scalar_subquery
|
||||
02174_cte_scalar_cache_mv
|
||||
02242_join_rocksdb
|
||||
02267_join_dup_columns_issue36199
|
||||
02302_s3_file_pruning
|
||||
02341_global_join_cte
|
||||
02345_implicit_transaction
|
||||
@ -85,7 +82,6 @@
|
||||
02354_annoy
|
||||
02366_union_decimal_conversion
|
||||
02375_rocksdb_with_filters
|
||||
02382_join_and_filtering_set
|
||||
02402_merge_engine_with_view
|
||||
02404_memory_bound_merging
|
||||
02426_orc_bug
|
||||
|
@ -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 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] -%}
|
||||
|
||||
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 }};
|
||||
|
||||
|
||||
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 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 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_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;
|
||||
|
||||
{% endfor -%}
|
||||
|
||||
DROP TABLE l;
|
||||
DROP TABLE r;
|
||||
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)
|
||||
-
|
||||
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';
|
||||
|
||||
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
|
||||
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;
|
||||
|
||||
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
|
||||
4 4 4
|
||||
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 =
|
||||
1 1 1
|
||||
2 2 2
|
||||
@ -284,6 +294,16 @@
|
||||
\N \N -2
|
||||
\N \N -1
|
||||
\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 =
|
||||
1 1 1
|
||||
2 2 2
|
||||
@ -402,5 +422,6 @@
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
||||
{% endif -%}
|
||||
{% 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 a, t1.a, t2.a FROM t1 LEFT JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
||||
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 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);
|
||||
|
||||
-- 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 LEFT 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 }
|
||||
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 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,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,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,386 }
|
||||
|
||||
SELECT '= agg =';
|
||||
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 a, t1.a, t2.a FROM t1 LEFT JOIN t2 USING (a) ORDER BY (t1.a, t2.a);
|
||||
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 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);
|
||||
|
||||
-- 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 LEFT 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 }
|
||||
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 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,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,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,386 }
|
||||
|
||||
SELECT '= agg =';
|
||||
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 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)) == '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 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
|
||||
2
|
||||
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 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 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_source;
|
||||
|
@ -30,3 +30,27 @@
|
||||
\N 3
|
||||
1 \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;
|
||||
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 INNER ANY 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 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(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 JOIN t2 ON toLowCardinality(toNullable(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 INNER ANY JOIN t2 ON toInt8(1); -- { serverError 403 }
|
||||
SELECT * FROM t1 INNER ANY JOIN t2 ON 256; -- { serverError 403 }
|
||||
SELECT * FROM t1 INNER ANY JOIN t2 ON -1; -- { serverError 403 }
|
||||
SELECT * FROM t1 INNER ANY JOIN t2 ON toString(1); -- { serverError 403 }
|
||||
SELECT * FROM t1 JOIN t2 ON toUInt16(1); -- { serverError 403 }
|
||||
SELECT * FROM t1 JOIN t2 ON toInt8(1); -- { serverError 403 }
|
||||
SELECT * FROM t1 JOIN t2 ON 256; -- { serverError 403 }
|
||||
SELECT * FROM t1 JOIN t2 ON -1; -- { serverError 403 }
|
||||
SELECT * FROM t1 JOIN t2 ON toString(1); -- { serverError 403 }
|
||||
|
||||
SELECT '- ON NULL -';
|
||||
|
||||
SELECT '- inner -';
|
||||
SELECT * FROM t1 INNER ANY JOIN t2 ON NULL;
|
||||
SELECT * FROM t1 INNER ANY JOIN t2 ON 0;
|
||||
SELECT * FROM t1 INNER ANY JOIN t2 ON 1 = 2;
|
||||
SELECT * FROM t1 JOIN t2 ON NULL;
|
||||
SELECT * FROM t1 JOIN t2 ON 0;
|
||||
SELECT * FROM t1 JOIN t2 ON 1 = 2;
|
||||
SELECT '- left -';
|
||||
SELECT * FROM t1 LEFT JOIN t2 ON NULL ORDER BY t1.id, t2.id;
|
||||
SELECT '- right -';
|
||||
@ -35,7 +35,7 @@ SELECT '- full -';
|
||||
SELECT * FROM t1 FULL JOIN t2 ON NULL ORDER BY t1.id, t2.id;
|
||||
|
||||
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 * FROM t1 LEFT JOIN t2 ON NULL ORDER BY t1.id NULLS FIRST, t2.id SETTINGS join_use_nulls = 1;
|
||||
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 * 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)
|
||||
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 = 'partial_merge'; -- { serverError AMBIGUOUS_COLUMN_NAME }
|
||||
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 = '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,NOT_IMPLEMENTED }
|
||||
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 = '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 }
|
||||
SELECT * FROM t1 RIGHT JOIN t2 ON NULL SETTINGS join_algorithm = 'auto'; -- { serverError INVALID_JOIN_ON_EXPRESSION }
|
||||
SELECT * FROM t1 FULL JOIN t2 ON NULL SETTINGS join_algorithm = 'partial_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,NOT_IMPLEMENTED }
|
||||
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,NOT_IMPLEMENTED }
|
||||
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
|
||||
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 == 2; -- { 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 == 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 '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 t1.id = t2.id AND 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 = 0; -- { 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 t2;
|
||||
|
@ -45,7 +45,7 @@ SELECT '--- key types';
|
||||
SELECT * FROM t2 INNER JOIN rdb ON rdb.key == t2.k ORDER BY rdb.key;
|
||||
|
||||
-- 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
|
||||
-- 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
|
||||
y 0 0 1 3
|
||||
\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';
|
||||
|
||||
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') :: 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 '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 '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
|
||||
bug with constant columns in join keys
|
||||
a a
|
||||
a a
|
||||
a a
|
||||
a a
|
||||
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 * 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
|
||||
;
|
||||
|
||||
SELECT count() > 1 FROM (EXPLAIN PIPELINE
|
||||
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
|
||||
) WHERE explain ilike '%FilterBySetOnTheFlyTransform%'
|
||||
;
|
||||
|
||||
SELECT count() == 0 FROM (EXPLAIN PIPELINE
|
||||
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
|
||||
) 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;
|
||||
|
||||
@ -14,7 +14,7 @@ OPTIMIZE TABLE t_missed_subcolumns FINAL;
|
||||
|
||||
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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user