mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Merge pull request #36415 from bigo-sg/concurrent_join
This commit is contained in:
commit
bd5fab97d9
@ -340,7 +340,7 @@ class IColumn;
|
||||
M(UInt64, max_bytes_in_join, 0, "Maximum size of the hash table for JOIN (in number of bytes in memory).", 0) \
|
||||
M(OverflowMode, join_overflow_mode, OverflowMode::THROW, "What to do when the limit is exceeded.", 0) \
|
||||
M(Bool, join_any_take_last_row, false, "When disabled (default) ANY JOIN will take the first found row for a key. When enabled, it will take the last row seen if there are multiple rows for the same key.", IMPORTANT) \
|
||||
M(JoinAlgorithm, join_algorithm, JoinAlgorithm::HASH, "Specify join algorithm: 'auto', 'hash', 'partial_merge', 'prefer_partial_merge'. 'auto' tries to change HashJoin to MergeJoin on the fly to avoid out of memory.", 0) \
|
||||
M(JoinAlgorithm, join_algorithm, JoinAlgorithm::HASH, "Specify join algorithm: 'auto', 'hash', 'partial_merge', 'prefer_partial_merge', 'parallel_hash'. 'auto' tries to change HashJoin to MergeJoin on the fly to avoid out of memory.", 0) \
|
||||
M(UInt64, default_max_bytes_in_join, 1000000000, "Maximum size of right-side table if limit is required but max_bytes_in_join is not set.", 0) \
|
||||
M(UInt64, partial_merge_join_left_table_buffer_bytes, 0, "If not 0 group left table blocks in bigger ones for left-side table in partial merge join. It uses up to 2x of specified memory per joining thread.", 0) \
|
||||
M(UInt64, partial_merge_join_rows_in_right_blocks, 65536, "Split right-hand joining data in blocks of specified size. It's a portion of data indexed by min-max values and possibly unloaded on disk.", 0) \
|
||||
|
@ -34,7 +34,8 @@ IMPLEMENT_SETTING_ENUM(JoinAlgorithm, ErrorCodes::UNKNOWN_JOIN,
|
||||
{{"auto", JoinAlgorithm::AUTO},
|
||||
{"hash", JoinAlgorithm::HASH},
|
||||
{"partial_merge", JoinAlgorithm::PARTIAL_MERGE},
|
||||
{"prefer_partial_merge", JoinAlgorithm::PREFER_PARTIAL_MERGE}})
|
||||
{"prefer_partial_merge", JoinAlgorithm::PREFER_PARTIAL_MERGE},
|
||||
{"parallel_hash", JoinAlgorithm::PARALLEL_HASH}})
|
||||
|
||||
|
||||
IMPLEMENT_SETTING_ENUM(TotalsMode, ErrorCodes::UNKNOWN_TOTALS_MODE,
|
||||
|
@ -42,6 +42,7 @@ enum class JoinAlgorithm
|
||||
HASH,
|
||||
PARTIAL_MERGE,
|
||||
PREFER_PARTIAL_MERGE,
|
||||
PARALLEL_HASH,
|
||||
};
|
||||
|
||||
DECLARE_SETTING_ENUM(JoinAlgorithm)
|
||||
|
206
src/Interpreters/ConcurrentHashJoin.cpp
Normal file
206
src/Interpreters/ConcurrentHashJoin.cpp
Normal file
@ -0,0 +1,206 @@
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <Columns/FilterDescription.h>
|
||||
#include <Columns/IColumn.h>
|
||||
#include <Core/ColumnsWithTypeAndName.h>
|
||||
#include <Core/NamesAndTypes.h>
|
||||
#include <Interpreters/ConcurrentHashJoin.h>
|
||||
#include <Interpreters/Context.h>
|
||||
#include <Interpreters/ExpressionActions.h>
|
||||
#include <Interpreters/PreparedSets.h>
|
||||
#include <Interpreters/SubqueryForSet.h>
|
||||
#include <Interpreters/TableJoin.h>
|
||||
#include <Interpreters/createBlockSelector.h>
|
||||
#include <Parsers/DumpASTNode.h>
|
||||
#include <Parsers/ExpressionListParsers.h>
|
||||
#include <Parsers/IAST_fwd.h>
|
||||
#include <Parsers/parseQuery.h>
|
||||
#include <Common/Exception.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
namespace DB
|
||||
{
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int LOGICAL_ERROR;
|
||||
extern const int SET_SIZE_LIMIT_EXCEEDED;
|
||||
extern const int BAD_ARGUMENTS;
|
||||
}
|
||||
namespace JoinStuff
|
||||
{
|
||||
ConcurrentHashJoin::ConcurrentHashJoin(ContextPtr context_, std::shared_ptr<TableJoin> table_join_, size_t slots_, const Block & right_sample_block, bool any_take_last_row_)
|
||||
: context(context_)
|
||||
, table_join(table_join_)
|
||||
, slots(slots_)
|
||||
{
|
||||
if (!slots_ || slots_ >= 256)
|
||||
{
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Invalid argument slot : {}", slots_);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < slots; ++i)
|
||||
{
|
||||
auto inner_hash_join = std::make_shared<InternalHashJoin>();
|
||||
inner_hash_join->data = std::make_unique<HashJoin>(table_join_, right_sample_block, any_take_last_row_);
|
||||
hash_joins.emplace_back(std::move(inner_hash_join));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool ConcurrentHashJoin::addJoinedBlock(const Block & block, bool check_limits)
|
||||
{
|
||||
Blocks dispatched_blocks = dispatchBlock(table_join->getOnlyClause().key_names_right, block);
|
||||
|
||||
std::list<size_t> pending_blocks;
|
||||
for (size_t i = 0; i < dispatched_blocks.size(); ++i)
|
||||
pending_blocks.emplace_back(i);
|
||||
while (!pending_blocks.empty())
|
||||
{
|
||||
for (auto iter = pending_blocks.begin(); iter != pending_blocks.end();)
|
||||
{
|
||||
auto & i = *iter;
|
||||
auto & hash_join = hash_joins[i];
|
||||
auto & dispatched_block = dispatched_blocks[i];
|
||||
if (hash_join->mutex.try_lock())
|
||||
{
|
||||
if (!hash_join->data->addJoinedBlock(dispatched_block, check_limits))
|
||||
{
|
||||
hash_join->mutex.unlock();
|
||||
return false;
|
||||
}
|
||||
|
||||
hash_join->mutex.unlock();
|
||||
iter = pending_blocks.erase(iter);
|
||||
}
|
||||
else
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
|
||||
if (check_limits)
|
||||
return table_join->sizeLimits().check(getTotalRowCount(), getTotalByteCount(), "JOIN", ErrorCodes::SET_SIZE_LIMIT_EXCEEDED);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ConcurrentHashJoin::joinBlock(Block & block, std::shared_ptr<ExtraBlock> & /*not_processed*/)
|
||||
{
|
||||
Blocks dispatched_blocks = dispatchBlock(table_join->getOnlyClause().key_names_left, block);
|
||||
for (size_t i = 0; i < dispatched_blocks.size(); ++i)
|
||||
{
|
||||
std::shared_ptr<ExtraBlock> none_extra_block;
|
||||
auto & hash_join = hash_joins[i];
|
||||
auto & dispatched_block = dispatched_blocks[i];
|
||||
hash_join->data->joinBlock(dispatched_block, none_extra_block);
|
||||
if (none_extra_block && !none_extra_block->empty())
|
||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "not_processed should be empty");
|
||||
}
|
||||
|
||||
block = concatenateBlocks(dispatched_blocks);
|
||||
}
|
||||
|
||||
void ConcurrentHashJoin::checkTypesOfKeys(const Block & block) const
|
||||
{
|
||||
hash_joins[0]->data->checkTypesOfKeys(block);
|
||||
}
|
||||
|
||||
void ConcurrentHashJoin::setTotals(const Block & block)
|
||||
{
|
||||
if (block)
|
||||
{
|
||||
std::lock_guard lock(totals_mutex);
|
||||
totals = block;
|
||||
}
|
||||
}
|
||||
|
||||
const Block & ConcurrentHashJoin::getTotals() const
|
||||
{
|
||||
return totals;
|
||||
}
|
||||
|
||||
size_t ConcurrentHashJoin::getTotalRowCount() const
|
||||
{
|
||||
size_t res = 0;
|
||||
for (const auto & hash_join : hash_joins)
|
||||
{
|
||||
std::lock_guard lock(hash_join->mutex);
|
||||
res += hash_join->data->getTotalRowCount();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
size_t ConcurrentHashJoin::getTotalByteCount() const
|
||||
{
|
||||
size_t res = 0;
|
||||
for (const auto & hash_join : hash_joins)
|
||||
{
|
||||
std::lock_guard lock(hash_join->mutex);
|
||||
res += hash_join->data->getTotalByteCount();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
bool ConcurrentHashJoin::alwaysReturnsEmptySet() const
|
||||
{
|
||||
for (const auto & hash_join : hash_joins)
|
||||
{
|
||||
std::lock_guard lock(hash_join->mutex);
|
||||
if (!hash_join->data->alwaysReturnsEmptySet())
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::shared_ptr<NotJoinedBlocks> ConcurrentHashJoin::getNonJoinedBlocks(
|
||||
const Block & /*left_sample_block*/, const Block & /*result_sample_block*/, UInt64 /*max_block_size*/) const
|
||||
{
|
||||
if (table_join->strictness() == ASTTableJoin::Strictness::Asof ||
|
||||
table_join->strictness() == ASTTableJoin::Strictness::Semi ||
|
||||
!isRightOrFull(table_join->kind()))
|
||||
{
|
||||
return {};
|
||||
}
|
||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "Invalid join type. join kind: {}, strictness: {}", table_join->kind(), table_join->strictness());
|
||||
}
|
||||
|
||||
Blocks ConcurrentHashJoin::dispatchBlock(const Strings & key_columns_names, const Block & from_block)
|
||||
{
|
||||
Blocks result;
|
||||
|
||||
size_t num_shards = hash_joins.size();
|
||||
size_t num_rows = from_block.rows();
|
||||
size_t num_cols = from_block.columns();
|
||||
|
||||
ColumnRawPtrs key_cols;
|
||||
for (const auto & key_name : key_columns_names)
|
||||
{
|
||||
key_cols.push_back(from_block.getByName(key_name).column.get());
|
||||
}
|
||||
IColumn::Selector selector(num_rows);
|
||||
for (size_t i = 0; i < num_rows; ++i)
|
||||
{
|
||||
SipHash hash;
|
||||
for (const auto & key_col : key_cols)
|
||||
{
|
||||
key_col->updateHashWithValue(i, hash);
|
||||
}
|
||||
selector[i] = hash.get64() % num_shards;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < num_shards; ++i)
|
||||
{
|
||||
result.emplace_back(from_block.cloneEmpty());
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < num_cols; ++i)
|
||||
{
|
||||
auto dispatched_columns = from_block.getByPosition(i).column->scatter(num_shards, selector);
|
||||
assert(result.size() == dispatched_columns.size());
|
||||
for (size_t block_index = 0; block_index < num_shards; ++block_index)
|
||||
{
|
||||
result[block_index].getByPosition(i).column = std::move(dispatched_columns[block_index]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
75
src/Interpreters/ConcurrentHashJoin.h
Normal file
75
src/Interpreters/ConcurrentHashJoin.h
Normal file
@ -0,0 +1,75 @@
|
||||
#pragma once
|
||||
|
||||
#include <condition_variable>
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <Core/BackgroundSchedulePool.h>
|
||||
#include <Functions/FunctionsLogical.h>
|
||||
#include <Interpreters/Context.h>
|
||||
#include <Interpreters/ExpressionActions.h>
|
||||
#include <Interpreters/HashJoin.h>
|
||||
#include <Interpreters/IJoin.h>
|
||||
#include <base/defines.h>
|
||||
#include <base/types.h>
|
||||
#include <Common/Stopwatch.h>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
namespace JoinStuff
|
||||
{
|
||||
/**
|
||||
* Can run addJoinedBlock() parallelly to speedup the join process. On test, it almose linear speedup by
|
||||
* the degree of parallelism.
|
||||
*
|
||||
* The default HashJoin is not thread safe for inserting right table's rows and run it in a single thread. When
|
||||
* the right table is large, the join process is too slow.
|
||||
*
|
||||
* We create multiple HashJoin instances here. In addJoinedBlock(), one input block is split into multiple blocks
|
||||
* corresponding to the HashJoin instances by hashing every row on the join keys. And make a guarantee that every HashJoin
|
||||
* instance is written by only one thread.
|
||||
*
|
||||
* When come to the left table matching, the blocks from left table are alse split into different HashJoin instances.
|
||||
*
|
||||
*/
|
||||
class ConcurrentHashJoin : public IJoin
|
||||
{
|
||||
public:
|
||||
explicit ConcurrentHashJoin(ContextPtr context_, std::shared_ptr<TableJoin> table_join_, size_t slots_, const Block & right_sample_block, bool any_take_last_row_ = false);
|
||||
~ConcurrentHashJoin() override = default;
|
||||
|
||||
const TableJoin & getTableJoin() const override { return *table_join; }
|
||||
bool addJoinedBlock(const Block & block, bool check_limits) override;
|
||||
void checkTypesOfKeys(const Block & block) const override;
|
||||
void joinBlock(Block & block, std::shared_ptr<ExtraBlock> & not_processed) override;
|
||||
void setTotals(const Block & block) override;
|
||||
const Block & getTotals() const override;
|
||||
size_t getTotalRowCount() const override;
|
||||
size_t getTotalByteCount() const override;
|
||||
bool alwaysReturnsEmptySet() const override;
|
||||
bool supportParallelJoin() const override { return true; }
|
||||
std::shared_ptr<NotJoinedBlocks>
|
||||
getNonJoinedBlocks(const Block & left_sample_block, const Block & result_sample_block, UInt64 max_block_size) const override;
|
||||
private:
|
||||
struct InternalHashJoin
|
||||
{
|
||||
std::mutex mutex;
|
||||
std::unique_ptr<HashJoin> data;
|
||||
};
|
||||
|
||||
ContextPtr context;
|
||||
std::shared_ptr<TableJoin> table_join;
|
||||
size_t slots;
|
||||
std::vector<std::shared_ptr<InternalHashJoin>> hash_joins;
|
||||
|
||||
std::mutex finished_add_joined_blocks_tasks_mutex;
|
||||
std::condition_variable finished_add_joined_blocks_tasks_cond;
|
||||
std::atomic<UInt32> finished_add_joined_blocks_tasks = 0;
|
||||
|
||||
mutable std::mutex totals_mutex;
|
||||
Block totals;
|
||||
|
||||
Blocks dispatchBlock(const Strings & key_columns_names, const Block & from_block);
|
||||
|
||||
};
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
#include <memory>
|
||||
#include <Core/Block.h>
|
||||
|
||||
#include <Parsers/ASTExpressionList.h>
|
||||
@ -16,6 +17,7 @@
|
||||
|
||||
#include <Interpreters/ArrayJoinAction.h>
|
||||
#include <Interpreters/Context.h>
|
||||
#include <Interpreters/ConcurrentHashJoin.h>
|
||||
#include <Interpreters/DictionaryReader.h>
|
||||
#include <Interpreters/evaluateConstantExpression.h>
|
||||
#include <Interpreters/ExpressionActions.h>
|
||||
@ -934,7 +936,13 @@ static std::shared_ptr<IJoin> chooseJoinAlgorithm(std::shared_ptr<TableJoin> ana
|
||||
|
||||
bool allow_merge_join = analyzed_join->allowMergeJoin();
|
||||
if (analyzed_join->forceHashJoin() || (analyzed_join->preferMergeJoin() && !allow_merge_join))
|
||||
{
|
||||
if (analyzed_join->allowParallelHashJoin())
|
||||
{
|
||||
return std::make_shared<JoinStuff::ConcurrentHashJoin>(context, analyzed_join, context->getSettings().max_threads, sample_block);
|
||||
}
|
||||
return std::make_shared<HashJoin>(analyzed_join, sample_block);
|
||||
}
|
||||
else if (analyzed_join->forceMergeJoin() || (analyzed_join->preferMergeJoin() && allow_merge_join))
|
||||
return std::make_shared<MergeJoin>(analyzed_join, sample_block);
|
||||
return std::make_shared<JoinSwitcher>(analyzed_join, sample_block);
|
||||
|
@ -45,6 +45,9 @@ public:
|
||||
/// Different query plan is used for such joins.
|
||||
virtual bool isFilled() const { return false; }
|
||||
|
||||
// That can run FillingRightJoinSideTransform parallelly
|
||||
virtual bool supportParallelJoin() const { return false; }
|
||||
|
||||
virtual std::shared_ptr<NotJoinedBlocks>
|
||||
getNonJoinedBlocks(const Block & left_sample_block, const Block & result_sample_block, UInt64 max_block_size) const = 0;
|
||||
};
|
||||
|
@ -1280,7 +1280,9 @@ void InterpreterSelectQuery::executeImpl(QueryPlan & query_plan, std::optional<P
|
||||
query_plan.getCurrentDataStream(),
|
||||
joined_plan->getCurrentDataStream(),
|
||||
expressions.join,
|
||||
settings.max_block_size);
|
||||
settings.max_block_size,
|
||||
max_streams,
|
||||
analysis_result.optimize_read_in_order);
|
||||
|
||||
join_step->setStepDescription("JOIN");
|
||||
std::vector<QueryPlanPtr> plans;
|
||||
|
@ -748,4 +748,15 @@ void TableJoin::resetToCross()
|
||||
this->table_join.kind = ASTTableJoin::Kind::Cross;
|
||||
}
|
||||
|
||||
bool TableJoin::allowParallelHashJoin() const
|
||||
{
|
||||
if (dictionary_reader || join_algorithm != JoinAlgorithm::PARALLEL_HASH)
|
||||
return false;
|
||||
if (table_join.kind != ASTTableJoin::Kind::Left && table_join.kind != ASTTableJoin::Kind::Inner)
|
||||
return false;
|
||||
if (isSpecialStorage() || !oneDisjunct())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -191,10 +191,11 @@ public:
|
||||
bool allowMergeJoin() const;
|
||||
bool preferMergeJoin() const { return join_algorithm == JoinAlgorithm::PREFER_PARTIAL_MERGE; }
|
||||
bool forceMergeJoin() const { return join_algorithm == JoinAlgorithm::PARTIAL_MERGE; }
|
||||
bool allowParallelHashJoin() const;
|
||||
bool forceHashJoin() const
|
||||
{
|
||||
/// HashJoin always used for DictJoin
|
||||
return dictionary_reader || join_algorithm == JoinAlgorithm::HASH;
|
||||
return dictionary_reader || join_algorithm == JoinAlgorithm::HASH || join_algorithm == JoinAlgorithm::PARALLEL_HASH;
|
||||
}
|
||||
|
||||
bool forceNullableRight() const { return join_use_nulls && isLeftOrFull(table_join.kind); }
|
||||
|
@ -15,9 +15,10 @@ JoinStep::JoinStep(
|
||||
const DataStream & left_stream_,
|
||||
const DataStream & right_stream_,
|
||||
JoinPtr join_,
|
||||
size_t max_block_size_)
|
||||
: join(std::move(join_))
|
||||
, max_block_size(max_block_size_)
|
||||
size_t max_block_size_,
|
||||
size_t max_streams_,
|
||||
bool keep_left_read_in_order_)
|
||||
: join(std::move(join_)), max_block_size(max_block_size_), max_streams(max_streams_), keep_left_read_in_order(keep_left_read_in_order_)
|
||||
{
|
||||
input_streams = {left_stream_, right_stream_};
|
||||
output_stream = DataStream
|
||||
@ -31,7 +32,7 @@ QueryPipelineBuilderPtr JoinStep::updatePipeline(QueryPipelineBuilders pipelines
|
||||
if (pipelines.size() != 2)
|
||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "JoinStep expect two input steps");
|
||||
|
||||
return QueryPipelineBuilder::joinPipelines(std::move(pipelines[0]), std::move(pipelines[1]), join, max_block_size, &processors);
|
||||
return QueryPipelineBuilder::joinPipelines(std::move(pipelines[0]), std::move(pipelines[1]), join, max_block_size, max_streams, keep_left_read_in_order, &processors);
|
||||
}
|
||||
|
||||
void JoinStep::describePipeline(FormatSettings & settings) const
|
||||
|
@ -16,7 +16,9 @@ public:
|
||||
const DataStream & left_stream_,
|
||||
const DataStream & right_stream_,
|
||||
JoinPtr join_,
|
||||
size_t max_block_size_);
|
||||
size_t max_block_size_,
|
||||
size_t max_streams_,
|
||||
bool keep_left_read_in_order_);
|
||||
|
||||
String getName() const override { return "Join"; }
|
||||
|
||||
@ -29,6 +31,8 @@ public:
|
||||
private:
|
||||
JoinPtr join;
|
||||
size_t max_block_size;
|
||||
size_t max_streams;
|
||||
bool keep_left_read_in_order;
|
||||
Processors processors;
|
||||
};
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <Interpreters/Context.h>
|
||||
#include <Interpreters/ExpressionActions.h>
|
||||
#include <Interpreters/IJoin.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <Common/CurrentThread.h>
|
||||
#include <Processors/DelayedPortsProcessor.h>
|
||||
@ -306,6 +307,8 @@ std::unique_ptr<QueryPipelineBuilder> QueryPipelineBuilder::joinPipelines(
|
||||
std::unique_ptr<QueryPipelineBuilder> right,
|
||||
JoinPtr join,
|
||||
size_t max_block_size,
|
||||
size_t max_streams,
|
||||
bool keep_left_read_in_order,
|
||||
Processors * collected_processors)
|
||||
{
|
||||
left->checkInitializedAndNotCompleted();
|
||||
@ -344,15 +347,42 @@ std::unique_ptr<QueryPipelineBuilder> QueryPipelineBuilder::joinPipelines(
|
||||
/// ╞> FillingJoin ─> Resize ╣ ╞> Joining ─> (totals)
|
||||
/// (totals) ─────────┘ ╙─────┘
|
||||
|
||||
size_t num_streams = left->getNumStreams();
|
||||
right->resize(1);
|
||||
auto num_streams = left->getNumStreams();
|
||||
|
||||
auto adding_joined = std::make_shared<FillingRightJoinSideTransform>(right->getHeader(), join);
|
||||
InputPort * totals_port = nullptr;
|
||||
if (right->hasTotals())
|
||||
totals_port = adding_joined->addTotalsPort();
|
||||
if (join->supportParallelJoin() && !right->hasTotals())
|
||||
{
|
||||
if (!keep_left_read_in_order)
|
||||
{
|
||||
left->resize(max_streams);
|
||||
num_streams = max_streams;
|
||||
}
|
||||
|
||||
right->addTransform(std::move(adding_joined), totals_port, nullptr);
|
||||
right->resize(max_streams);
|
||||
auto concurrent_right_filling_transform = [&](OutputPortRawPtrs outports)
|
||||
{
|
||||
Processors processors;
|
||||
for (auto & outport : outports)
|
||||
{
|
||||
auto adding_joined = std::make_shared<FillingRightJoinSideTransform>(right->getHeader(), join);
|
||||
connect(*outport, adding_joined->getInputs().front());
|
||||
processors.emplace_back(adding_joined);
|
||||
}
|
||||
return processors;
|
||||
};
|
||||
right->transform(concurrent_right_filling_transform);
|
||||
right->resize(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
right->resize(1);
|
||||
|
||||
auto adding_joined = std::make_shared<FillingRightJoinSideTransform>(right->getHeader(), join);
|
||||
InputPort * totals_port = nullptr;
|
||||
if (right->hasTotals())
|
||||
totals_port = adding_joined->addTotalsPort();
|
||||
|
||||
right->addTransform(std::move(adding_joined), totals_port, nullptr);
|
||||
}
|
||||
|
||||
size_t num_streams_including_totals = num_streams + (left->hasTotals() ? 1 : 0);
|
||||
right->resize(num_streams_including_totals);
|
||||
|
@ -101,6 +101,8 @@ public:
|
||||
std::unique_ptr<QueryPipelineBuilder> right,
|
||||
JoinPtr join,
|
||||
size_t max_block_size,
|
||||
size_t max_streams,
|
||||
bool keep_left_read_in_order,
|
||||
Processors * collected_processors = nullptr);
|
||||
|
||||
/// Add other pipeline and execute it before current one.
|
||||
|
@ -1,83 +1,83 @@
|
||||
-- join_algorithm = default, join_use_nulls = 0 --
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_l LowCardinality(String)
|
||||
str_r 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_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_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
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_l LowCardinality(String)
|
||||
str_r 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_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_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
|
||||
str String
|
||||
String
|
||||
str_r String
|
||||
str String
|
||||
str_r String
|
||||
str String
|
||||
String
|
||||
str_l String
|
||||
str_r 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_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_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
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_l LowCardinality(String)
|
||||
str_r 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_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_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
|
||||
str Nullable(String)
|
||||
\N Nullable(String)
|
||||
@ -203,83 +203,83 @@ LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) str_r str_r Nu
|
||||
-- join_algorithm = partial_merge, join_use_nulls = 0 --
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_l LowCardinality(String)
|
||||
str_r 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_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_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
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_l LowCardinality(String)
|
||||
str_r 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_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_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
|
||||
str String
|
||||
String
|
||||
str_r String
|
||||
str String
|
||||
str_r String
|
||||
str String
|
||||
String
|
||||
str_l String
|
||||
str_r 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_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_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
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
str_r LowCardinality(String)
|
||||
str LowCardinality(String)
|
||||
LowCardinality(String)
|
||||
str_l LowCardinality(String)
|
||||
str_r 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_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_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
|
||||
str Nullable(String)
|
||||
\N Nullable(String)
|
||||
@ -402,6 +402,208 @@ LowCardinality(Nullable(String)) LowCardinality(Nullable(String)) \N \N Nullable
|
||||
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)
|
||||
|
@ -22,7 +22,7 @@ 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'] -%}
|
||||
{% for join_algorithm in [None, 'partial_merge', 'parallel_hash'] -%}
|
||||
{% for join_use_nulls in [0, 1] -%}
|
||||
|
||||
SELECT '-- join_algorithm = {{ join_algorithm or 'default' }}, join_use_nulls = {{ join_use_nulls }} --';
|
||||
@ -30,63 +30,64 @@ SELECT '-- join_algorithm = {{ join_algorithm or 'default' }}, 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;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r_lc AS r USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x;
|
||||
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r_lc AS r USING (lc) ORDER BY x, lc;
|
||||
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
|
||||
--
|
||||
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc AS l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
|
||||
--
|
||||
|
||||
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (x) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l RIGHT JOIN r USING (lc) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (x) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l FULL JOIN r USING (lc) ORDER BY x, lc;
|
||||
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
|
||||
--
|
||||
|
||||
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (x) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc RIGHT JOIN nr USING (lc) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (x) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM l_lc FULL JOIN nr USING (lc) ORDER BY x, lc;
|
||||
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
|
||||
--
|
||||
|
||||
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (x) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (lc) ORDER BY x;
|
||||
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (x) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM nl RIGHT JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (x) ORDER BY x, lc;
|
||||
SELECT lc, toTypeName(lc) FROM nl FULL JOIN r_lc USING (lc) ORDER BY x, lc;
|
||||
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
|
||||
{% endfor -%}
|
||||
{% endfor -%}
|
||||
@ -94,6 +95,7 @@ SELECT toTypeName(r.lc), toTypeName(materialize(r.lc)), r.lc, materialize(r.lc),
|
||||
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;
|
||||
|
||||
SELECT lowCardinalityKeys(lc.lc) FROM r FULL JOIN l_lc as lc USING (lc) ORDER BY lowCardinalityKeys(lc.lc);
|
||||
|
@ -8,6 +8,6 @@ create table test_01383.dimension (id1 Int64, name String) ENGINE = MergeTree()
|
||||
insert into test_01383.fact values (1,2,10),(2,2,10),(3,3,10),(4,3,10);
|
||||
insert into test_01383.dimension values (1,'name_1'),(2,'name_1'),(3,'name_3'),(4, 'name_4');
|
||||
|
||||
SELECT f.id1 AS ID, d.name AS Name, sum(f.value) FROM remote('127.0.0.{1,2,3}', test_01383.fact) AS f LEFT JOIN test_01383.dimension AS d ON f.id1 = d.id1 WHERE f.id1 = f.id2 GROUP BY ID, Name;
|
||||
SELECT f.id1 AS ID, d.name AS Name, sum(f.value) FROM remote('127.0.0.{1,2,3}', test_01383.fact) AS f LEFT JOIN test_01383.dimension AS d ON f.id1 = d.id1 WHERE f.id1 = f.id2 GROUP BY ID, Name ORDER BY ID;
|
||||
|
||||
DROP DATABASE test_01383;
|
||||
|
@ -26,7 +26,7 @@ INSERT INTO codecTest (key, name, ref_valueF64, valueF64, ref_valueF32, valueF32
|
||||
|
||||
SELECT IF(-2, NULL, 0.00009999999747378752), IF(1048577, 1048576, NULL), c1.key, IF(1, NULL, NULL), c2.key FROM codecTest AS c1 , codecTest AS c2 WHERE ignore(IF(257, -2, NULL), arrayJoin([65537]), IF(3, 1024, 9223372036854775807)) AND IF(NULL, 256, NULL) AND (IF(NULL, '1048576', NULL) = (c1.key - NULL)) LIMIT 65535;
|
||||
|
||||
SELECT c1.key, c1.name, c1.ref_valueF64, c1.valueF64, c1.ref_valueF64 - c1.valueF64 AS dF64, '', c2.key, c2.ref_valueF64 FROM codecTest AS c1 , codecTest AS c2 WHERE (dF64 != 3) AND c1.valueF64 AND (c2.key = (c1.key - 1048576)) LIMIT 0;
|
||||
SELECT c1.key, c1.name, c1.ref_valueF64, c1.valueF64, c1.ref_valueF64 - c1.valueF64 AS dF64, '', c2.key, c2.ref_valueF64 FROM codecTest AS c1 , codecTest AS c2 WHERE (dF64 != 3) AND c1.valueF64 != 0 AND (c2.key = (c1.key - 1048576)) LIMIT 0;
|
||||
|
||||
|
||||
DROP TABLE codecTest;
|
||||
|
@ -34,7 +34,7 @@ SELECT * FROM t1 ALL JOIN t2 ON t1.dt = t2.dt ORDER BY t1.time, t2.time;
|
||||
SELECT '-';
|
||||
SELECT * FROM t1 ALL JOIN t2 USING (dt) ORDER BY t1.time, t2.time;
|
||||
SELECT '-';
|
||||
SELECT * FROM t1 JOIN t2 ON t1.dt1 = t2.dt2 ORDER BY t1.time, t2.time;
|
||||
SELECT * FROM t1 JOIN t2 ON t1.dt1 = t2.dt2 ORDER BY t1.time, t1.dimension_1, t2.time, t2.dimension_2;
|
||||
SELECT '-';
|
||||
SELECT * FROM t1 JOIN t2 ON t1.foo = t2.bar WHERE t2.aliascol2 == 'fact2t1_val2';
|
||||
SELECT '-';
|
||||
|
@ -7,4 +7,5 @@ ALL LEFT JOIN
|
||||
(
|
||||
SELECT * FROM system.numbers LIMIT 10
|
||||
) t2
|
||||
USING number;
|
||||
USING number
|
||||
SETTINGS max_threads=16;
|
||||
|
299
tests/queries/1_stateful/00172_parallel_join.reference
Normal file
299
tests/queries/1_stateful/00172_parallel_join.reference
Normal file
@ -0,0 +1,299 @@
|
||||
2014-03-17 1406958 265108
|
||||
2014-03-19 1405797 261624
|
||||
2014-03-18 1383658 258723
|
||||
2014-03-20 1353623 255328
|
||||
2014-03-21 1245779 236232
|
||||
2014-03-23 1046491 202212
|
||||
2014-03-22 1031592 197354
|
||||
2014-03-17 1406958 265108
|
||||
2014-03-19 1405797 261624
|
||||
2014-03-18 1383658 258723
|
||||
2014-03-20 1353623 255328
|
||||
2014-03-21 1245779 236232
|
||||
2014-03-23 1046491 202212
|
||||
2014-03-22 1031592 197354
|
||||
4508153 712428
|
||||
auto.ru 576845 8935
|
||||
yandex.ru 410776 111278
|
||||
korer.ru 277987 0
|
||||
avito.ru 163820 15556
|
||||
mail.yandex.ru 152447 1046
|
||||
mail.ru 87949 22225
|
||||
best.ru 58537 55
|
||||
korablitz.ru 51844 0
|
||||
hurpass.com 49671 1251
|
||||
37292 0 35642
|
||||
92887 252214 0
|
||||
7842 196036 0
|
||||
42440 0 17837
|
||||
97811 0 13665
|
||||
99378 0 11401
|
||||
6764 0 11052
|
||||
43564 0 9522
|
||||
37645 0 9086
|
||||
76197 0 8379
|
||||
24271 0 7393
|
||||
39804 64180 0
|
||||
78332 0 6167
|
||||
82837 0 5928
|
||||
51651 0 5878
|
||||
63469 52152 0
|
||||
76593 0 4705
|
||||
54688 0 4421
|
||||
36747 44082 0
|
||||
51763 0 4309
|
||||
92887 252214 0
|
||||
7842 196036 0
|
||||
39804 64180 0
|
||||
63469 52152 0
|
||||
36747 44082 0
|
||||
10963 37562 0
|
||||
46685 28798 0
|
||||
24015 23368 0
|
||||
37615 20857 0
|
||||
62896 19719 0
|
||||
67664 19402 0
|
||||
96597 18557 0
|
||||
11045 17391 0
|
||||
25884 17302 0
|
||||
64910 17279 0
|
||||
26096 16994 0
|
||||
96134 16849 0
|
||||
5788 13974 0
|
||||
71509 13792 0
|
||||
67326 13181 0
|
||||
37292 0 35642
|
||||
42440 0 17837
|
||||
97811 0 13665
|
||||
99378 0 11401
|
||||
6764 0 11052
|
||||
43564 0 9522
|
||||
37645 0 9086
|
||||
76197 0 8379
|
||||
24271 0 7393
|
||||
78332 0 6167
|
||||
82837 0 5928
|
||||
51651 0 5878
|
||||
76593 0 4705
|
||||
54688 0 4421
|
||||
51763 0 4309
|
||||
37882 0 4094
|
||||
6236 0 3959
|
||||
28456 0 3746
|
||||
19008 0 3426
|
||||
81009 0 3158
|
||||
2961521519262 gen_time ['gen_time']
|
||||
2961521519262 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
2961521519262 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
2961521519262 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
2961521519262 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
2961521519262 Роль пользователя ['Роль пользователя']
|
||||
2961521519262 videoid ['videoid']
|
||||
2961521519262 videoid Done ['videoid']
|
||||
2961521519262 Поиск ['Поиск']
|
||||
2961521519262 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
2961521519262 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
2961521519262 videoid 8950vvvv ['videoid']
|
||||
2961521519262 errors SMS ['errors']
|
||||
2961521519262 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
2961521519262 videoid Done ['videoid']
|
||||
2961521519262 videoid ['videoid']
|
||||
2961521519262 Поиск ['Поиск']
|
||||
2961521519262 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
2961521519262 videoid 8950vvvv ['videoid']
|
||||
2961521519262 gen_timestamp 564.815 ['gen_timestamp']
|
||||
2961521519262 gen_timestamp 564.815 ['gen_timestamp']
|
||||
164599821266083 gen_time views ['gen_time']
|
||||
164599821266083 gen_timestamp vkontakte,face element ['gen_timestamp']
|
||||
164599821266083 Платность Превьюшки ['Платность']
|
||||
164599821266083 Аттачи в списке /pages/biblio ['Аттачи в списке']
|
||||
164599821266083 Платность Превьюшки ['Платность']
|
||||
164599821266083 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
164599821266083 Поиск Счетчика ['Поиск']
|
||||
335386658089392 gen_time ['gen_time']
|
||||
335386658089392 Роль пользователя ['Роль пользователя']
|
||||
335386658089392 Поиск ['Поиск']
|
||||
335386658089392 videoid ['videoid']
|
||||
335386658089392 videoid Done ['videoid']
|
||||
335386658089392 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
335386658089392 gen_time ['gen_time']
|
||||
335386658089392 Роль пользователя ['Роль пользователя']
|
||||
335386658089392 Дра ['Дра']
|
||||
419794772979101 gen_time ['gen_time']
|
||||
419794772979101 Роль пользователя ['Роль пользователя']
|
||||
419794772979101 Поиск ['Поиск']
|
||||
419794772979101 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
419794772979101 gen_time ['gen_time']
|
||||
419794772979101 Дра ['Дра']
|
||||
419794772979101 Эксперимент про Счетчик есть null ['Эксперимент про']
|
||||
419794772979101 Поиск ['Поиск']
|
||||
419794772979101 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
818136115259082 gen_time ['gen_time']
|
||||
818136115259082 Дра ['Дра']
|
||||
818136115259082 Роль пользователя ['Роль пользователя']
|
||||
818136115259082 Поиск ['Поиск']
|
||||
818136115259082 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
818136115259082 gen_timestamp 564.815 ['gen_timestamp']
|
||||
818136115259082 gen_timestamp 564.815 ['gen_timestamp']
|
||||
870023587671569 gen_time ['gen_time']
|
||||
870023587671569 gen_timestamp vkontakte,face element ['gen_timestamp']
|
||||
1391426411567902 gen_time ['gen_time']
|
||||
1391426411567902 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
1391426411567902 Платность model ['Платность']
|
||||
1391426411567902 Эксперимент про Счетчик есть null ['Эксперимент про']
|
||||
1391426411567902 videoid ['videoid']
|
||||
1391426411567902 videoid Done ['videoid']
|
||||
1391426411567902 Поиск ['Поиск']
|
||||
1391426411567902 Поиск ['Поиск']
|
||||
1391426411567902 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
1391426411567902 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
1391426411567902 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
1391426411567902 Toolbar auto 25%;\n\t\t\t\t<![endif]--> \n <head>\n return ['Toolbar']
|
||||
1391426411567902 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
1391426411567902 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
1391426411567902 Права ['Права']
|
||||
1391426411567902 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
1391426411567902 Toolbar Счетчик ['Toolbar']
|
||||
1391426411567902 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
1391426411567902 Поиск ['Поиск']
|
||||
1391426411567902 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 errors 1e521117369b39edaa078c8021df25 ['errors']
|
||||
1560113638322066 gen_time ['gen_time']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 Дра ['Дра']
|
||||
1560113638322066 Поиск ['Поиск']
|
||||
1560113638322066 Toolbar Счетчик ['Toolbar']
|
||||
1560113638322066 errors 1e521117369b39edaa078c8021df25 ['errors']
|
||||
1560113638322066 errors 1e521117369b39edaa078c8021df25 ['errors']
|
||||
1560113638322066 errors 1e521117369b39edaa078c8021df25 ['errors']
|
||||
1560113638322066 errors 1e521117369b39edaa078c8021df25 ['errors']
|
||||
1560113638322066 errors 1e521117369b39edaa078c8021df25 ['errors']
|
||||
1560113638322066 errors 1e521117369b39edaa078c8021df25 ['errors']
|
||||
1560113638322066 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
1560113638322066 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
1560113638322066 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
1560113638322066 errors SMS ['errors']
|
||||
2961521519262 []
|
||||
2961521519262 gen_time ['gen_time']
|
||||
2961521519262 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
2961521519262 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
2961521519262 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
2961521519262 hasTemplates Счетчик есть null ['hasTemplates']
|
||||
2961521519262 Роль пользователя ['Роль пользователя']
|
||||
2961521519262 videoid ['videoid']
|
||||
2961521519262 videoid Done ['videoid']
|
||||
2961521519262 Поиск ['Поиск']
|
||||
2961521519262 []
|
||||
2961521519262 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
2961521519262 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
2961521519262 []
|
||||
2961521519262 videoid 8950vvvv ['videoid']
|
||||
2961521519262 []
|
||||
2961521519262 errors SMS ['errors']
|
||||
2961521519262 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
2961521519262 videoid Done ['videoid']
|
||||
2961521519262 []
|
||||
2961521519262 videoid ['videoid']
|
||||
2961521519262 Поиск ['Поиск']
|
||||
2961521519262 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
2961521519262 []
|
||||
2961521519262 videoid 8950vvvv ['videoid']
|
||||
2961521519262 gen_timestamp 564.815 ['gen_timestamp']
|
||||
2961521519262 gen_timestamp 564.815 ['gen_timestamp']
|
||||
164599821266083 []
|
||||
164599821266083 []
|
||||
164599821266083 gen_time views ['gen_time']
|
||||
164599821266083 gen_timestamp vkontakte,face element ['gen_timestamp']
|
||||
164599821266083 Платность Превьюшки ['Платность']
|
||||
164599821266083 Аттачи в списке /pages/biblio ['Аттачи в списке']
|
||||
164599821266083 Платность Превьюшки ['Платность']
|
||||
164599821266083 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
164599821266083 []
|
||||
164599821266083 Поиск Счетчика ['Поиск']
|
||||
335386658089392 []
|
||||
335386658089392 gen_time ['gen_time']
|
||||
335386658089392 Роль пользователя ['Роль пользователя']
|
||||
335386658089392 Поиск ['Поиск']
|
||||
335386658089392 []
|
||||
335386658089392 videoid ['videoid']
|
||||
335386658089392 videoid Done ['videoid']
|
||||
335386658089392 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
335386658089392 []
|
||||
335386658089392 []
|
||||
335386658089392 []
|
||||
335386658089392 gen_time ['gen_time']
|
||||
335386658089392 Роль пользователя ['Роль пользователя']
|
||||
335386658089392 Дра ['Дра']
|
||||
419794772979101 []
|
||||
419794772979101 gen_time ['gen_time']
|
||||
419794772979101 Роль пользователя ['Роль пользователя']
|
||||
419794772979101 Поиск ['Поиск']
|
||||
419794772979101 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
419794772979101 []
|
||||
419794772979101 []
|
||||
419794772979101 gen_time ['gen_time']
|
||||
419794772979101 Дра ['Дра']
|
||||
419794772979101 Эксперимент про Счетчик есть null ['Эксперимент про']
|
||||
419794772979101 []
|
||||
419794772979101 Поиск ['Поиск']
|
||||
419794772979101 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
818136115259082 []
|
||||
818136115259082 gen_time ['gen_time']
|
||||
818136115259082 Дра ['Дра']
|
||||
818136115259082 Роль пользователя ['Роль пользователя']
|
||||
818136115259082 Поиск ['Поиск']
|
||||
818136115259082 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
818136115259082 []
|
||||
818136115259082 gen_timestamp 564.815 ['gen_timestamp']
|
||||
818136115259082 []
|
||||
818136115259082 gen_timestamp 564.815 ['gen_timestamp']
|
||||
870023587671569 []
|
||||
870023587671569 []
|
||||
870023587671569 gen_time ['gen_time']
|
||||
870023587671569 gen_timestamp vkontakte,face element ['gen_timestamp']
|
||||
870023587671569 []
|
||||
870023587671569 []
|
||||
1026297835113727 []
|
||||
1026297835113727 []
|
||||
1026297835113727 []
|
||||
1026297835113727 []
|
||||
1026297835113727 []
|
||||
1026297835113727 []
|
||||
1026297835113727 []
|
||||
1026297835113727 []
|
||||
1026297835113727 []
|
||||
1391426411567902 []
|
||||
1391426411567902 gen_time ['gen_time']
|
||||
1391426411567902 gen_timestamp Счетчика нет (10 ['gen_timestamp']
|
||||
1391426411567902 Платность model ['Платность']
|
||||
1391426411567902 Эксперимент про Счетчик есть null ['Эксперимент про']
|
||||
1391426411567902 []
|
||||
1391426411567902 videoid ['videoid']
|
||||
1391426411567902 videoid Done ['videoid']
|
||||
1391426411567902 Поиск ['Поиск']
|
||||
1391426411567902 Поиск ['Поиск']
|
||||
1391426411567902 Эксперимент /f/1/global/banners_v1_1.js ['Эксперимент']
|
||||
0 0 0
|
||||
2 2 1
|
||||
4 4 2
|
||||
6 6 3
|
||||
8 8 4
|
||||
0 0 0
|
||||
0 0 1
|
||||
1 1 2
|
||||
1 1 3
|
||||
2 2 4
|
||||
2 2 5
|
||||
3 3 6
|
||||
3 3 7
|
||||
4 4 8
|
||||
4 4 9
|
204
tests/queries/1_stateful/00172_parallel_join.sql
Normal file
204
tests/queries/1_stateful/00172_parallel_join.sql
Normal file
@ -0,0 +1,204 @@
|
||||
set join_algorithm='parallel_hash';
|
||||
SELECT
|
||||
EventDate,
|
||||
hits,
|
||||
visits
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
EventDate,
|
||||
count() AS hits
|
||||
FROM test.hits
|
||||
GROUP BY EventDate
|
||||
) ANY LEFT JOIN
|
||||
(
|
||||
SELECT
|
||||
StartDate AS EventDate,
|
||||
sum(Sign) AS visits
|
||||
FROM test.visits
|
||||
GROUP BY EventDate
|
||||
) USING EventDate
|
||||
ORDER BY hits DESC
|
||||
LIMIT 10
|
||||
SETTINGS joined_subquery_requires_alias = 0;
|
||||
|
||||
|
||||
SELECT
|
||||
EventDate,
|
||||
count() AS hits,
|
||||
any(visits)
|
||||
FROM test.hits ANY LEFT JOIN
|
||||
(
|
||||
SELECT
|
||||
StartDate AS EventDate,
|
||||
sum(Sign) AS visits
|
||||
FROM test.visits
|
||||
GROUP BY EventDate
|
||||
) USING EventDate
|
||||
GROUP BY EventDate
|
||||
ORDER BY hits DESC
|
||||
LIMIT 10
|
||||
SETTINGS joined_subquery_requires_alias = 0;
|
||||
|
||||
|
||||
SELECT
|
||||
domain,
|
||||
hits,
|
||||
visits
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
domain(URL) AS domain,
|
||||
count() AS hits
|
||||
FROM test.hits
|
||||
GROUP BY domain
|
||||
) ANY LEFT JOIN
|
||||
(
|
||||
SELECT
|
||||
domain(StartURL) AS domain,
|
||||
sum(Sign) AS visits
|
||||
FROM test.visits
|
||||
GROUP BY domain
|
||||
) USING domain
|
||||
ORDER BY hits DESC
|
||||
LIMIT 10
|
||||
SETTINGS joined_subquery_requires_alias = 0;
|
||||
|
||||
SELECT CounterID FROM test.visits ARRAY JOIN Goals.ID WHERE CounterID = 942285 ORDER BY CounterID;
|
||||
|
||||
|
||||
SELECT
|
||||
CounterID,
|
||||
hits,
|
||||
visits
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
(CounterID % 100000) AS CounterID,
|
||||
count() AS hits
|
||||
FROM test.hits
|
||||
GROUP BY CounterID
|
||||
) ANY FULL OUTER JOIN
|
||||
(
|
||||
SELECT
|
||||
(CounterID % 100000) AS CounterID,
|
||||
sum(Sign) AS visits
|
||||
FROM test.visits
|
||||
GROUP BY CounterID
|
||||
HAVING visits > 0
|
||||
) USING CounterID
|
||||
WHERE hits = 0 OR visits = 0
|
||||
ORDER BY
|
||||
hits + visits * 10 DESC,
|
||||
CounterID ASC
|
||||
LIMIT 20
|
||||
SETTINGS any_join_distinct_right_table_keys = 1, joined_subquery_requires_alias = 0;
|
||||
|
||||
|
||||
SELECT
|
||||
CounterID,
|
||||
hits,
|
||||
visits
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
(CounterID % 100000) AS CounterID,
|
||||
count() AS hits
|
||||
FROM test.hits
|
||||
GROUP BY CounterID
|
||||
) ANY LEFT JOIN
|
||||
(
|
||||
SELECT
|
||||
(CounterID % 100000) AS CounterID,
|
||||
sum(Sign) AS visits
|
||||
FROM test.visits
|
||||
GROUP BY CounterID
|
||||
HAVING visits > 0
|
||||
) USING CounterID
|
||||
WHERE hits = 0 OR visits = 0
|
||||
ORDER BY
|
||||
hits + visits * 10 DESC,
|
||||
CounterID ASC
|
||||
LIMIT 20
|
||||
SETTINGS any_join_distinct_right_table_keys = 1, joined_subquery_requires_alias = 0;
|
||||
|
||||
|
||||
SELECT
|
||||
CounterID,
|
||||
hits,
|
||||
visits
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
(CounterID % 100000) AS CounterID,
|
||||
count() AS hits
|
||||
FROM test.hits
|
||||
GROUP BY CounterID
|
||||
) ANY RIGHT JOIN
|
||||
(
|
||||
SELECT
|
||||
(CounterID % 100000) AS CounterID,
|
||||
sum(Sign) AS visits
|
||||
FROM test.visits
|
||||
GROUP BY CounterID
|
||||
HAVING visits > 0
|
||||
) USING CounterID
|
||||
WHERE hits = 0 OR visits = 0
|
||||
ORDER BY
|
||||
hits + visits * 10 DESC,
|
||||
CounterID ASC
|
||||
LIMIT 20
|
||||
SETTINGS any_join_distinct_right_table_keys = 1, joined_subquery_requires_alias = 0;
|
||||
|
||||
|
||||
SELECT
|
||||
CounterID,
|
||||
hits,
|
||||
visits
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
(CounterID % 100000) AS CounterID,
|
||||
count() AS hits
|
||||
FROM test.hits
|
||||
GROUP BY CounterID
|
||||
) ANY INNER JOIN
|
||||
(
|
||||
SELECT
|
||||
(CounterID % 100000) AS CounterID,
|
||||
sum(Sign) AS visits
|
||||
FROM test.visits
|
||||
GROUP BY CounterID
|
||||
HAVING visits > 0
|
||||
) USING CounterID
|
||||
WHERE hits = 0 OR visits = 0
|
||||
ORDER BY
|
||||
hits + visits * 10 DESC,
|
||||
CounterID ASC
|
||||
LIMIT 20
|
||||
SETTINGS any_join_distinct_right_table_keys = 1, joined_subquery_requires_alias = 0;
|
||||
|
||||
SELECT UserID, pp.Key1, pp.Key2, ParsedParams.Key1 FROM test.hits ARRAY JOIN ParsedParams AS pp WHERE CounterID = 1704509 ORDER BY UserID, EventTime, pp.Key1, pp.Key2 LIMIT 100;
|
||||
|
||||
SELECT UserID, pp.Key1, pp.Key2, ParsedParams.Key1 FROM test.hits LEFT ARRAY JOIN ParsedParams AS pp WHERE CounterID = 1704509 ORDER BY UserID, EventTime, pp.Key1, pp.Key2 LIMIT 100;
|
||||
|
||||
SELECT a.*, b.* FROM
|
||||
(
|
||||
SELECT number AS k FROM system.numbers LIMIT 10
|
||||
) AS a
|
||||
ANY INNER JOIN
|
||||
(
|
||||
SELECT number * 2 AS k, number AS joined FROM system.numbers LIMIT 10
|
||||
) AS b
|
||||
USING k ORDER BY joined
|
||||
SETTINGS any_join_distinct_right_table_keys = 1;
|
||||
|
||||
SELECT a.*, b.* FROM
|
||||
(
|
||||
SELECT number AS k FROM system.numbers LIMIT 10
|
||||
) AS a
|
||||
ALL INNER JOIN
|
||||
(
|
||||
SELECT intDiv(number, 2) AS k, number AS joined FROM system.numbers LIMIT 10
|
||||
) AS b
|
||||
USING k ORDER BY joined;
|
Loading…
Reference in New Issue
Block a user