mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
Merge branch 'master' of github.com:yandex/ClickHouse
This commit is contained in:
commit
9d5c9b602d
@ -32,7 +32,7 @@ if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None")
|
|||||||
set (CMAKE_BUILD_TYPE "RELWITHDEBINFO")
|
set (CMAKE_BUILD_TYPE "RELWITHDEBINFO")
|
||||||
endif ()
|
endif ()
|
||||||
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
|
||||||
message (STATUS "CMAKE_BUILD_TYPE: " ${CMAKE_BUILD_TYPE} )
|
message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
|
||||||
|
|
||||||
set (CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel" CACHE STRING "" FORCE)
|
set (CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel" CACHE STRING "" FORCE)
|
||||||
|
|
||||||
|
@ -50,3 +50,7 @@ target_include_directories(jemalloc PRIVATE
|
|||||||
${JEMALLOC_SOURCE_DIR}/include)
|
${JEMALLOC_SOURCE_DIR}/include)
|
||||||
|
|
||||||
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE)
|
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_NO_PRIVATE_NAMESPACE)
|
||||||
|
|
||||||
|
if (CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG")
|
||||||
|
target_compile_definitions(jemalloc PRIVATE -DJEMALLOC_DEBUG=1)
|
||||||
|
endif ()
|
||||||
|
@ -391,6 +391,8 @@ namespace ErrorCodes
|
|||||||
extern const int CANNOT_READLINE = 414;
|
extern const int CANNOT_READLINE = 414;
|
||||||
extern const int ALL_REPLICAS_LOST = 415;
|
extern const int ALL_REPLICAS_LOST = 415;
|
||||||
extern const int REPLICA_STATUS_CHANGED = 416;
|
extern const int REPLICA_STATUS_CHANGED = 416;
|
||||||
|
extern const int EXPECTED_ALL_OR_ANY = 417;
|
||||||
|
extern const int UNKNOWN_JOIN_STRICTNESS = 418;
|
||||||
|
|
||||||
extern const int KEEPER_EXCEPTION = 999;
|
extern const int KEEPER_EXCEPTION = 999;
|
||||||
extern const int POCO_EXCEPTION = 1000;
|
extern const int POCO_EXCEPTION = 1000;
|
||||||
|
@ -96,6 +96,7 @@ namespace ErrorCodes
|
|||||||
extern const int CONDITIONAL_TREE_PARENT_NOT_FOUND;
|
extern const int CONDITIONAL_TREE_PARENT_NOT_FOUND;
|
||||||
extern const int TYPE_MISMATCH;
|
extern const int TYPE_MISMATCH;
|
||||||
extern const int INVALID_JOIN_ON_EXPRESSION;
|
extern const int INVALID_JOIN_ON_EXPRESSION;
|
||||||
|
extern const int EXPECTED_ALL_OR_ANY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2054,8 +2055,13 @@ void ExpressionAnalyzer::getActionsImpl(const ASTPtr & ast, bool no_subqueries,
|
|||||||
if (AggregateFunctionFactory::instance().isAggregateFunctionName(node->name))
|
if (AggregateFunctionFactory::instance().isAggregateFunctionName(node->name))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const FunctionBuilderPtr & function_builder = FunctionFactory::instance().get(node->name, context);
|
/// Context object that we pass to function should live during query.
|
||||||
auto projection_action = getProjectionAction(node->name, actions_stack, projection_manipulator, getColumnName(), context);
|
const Context & function_context = context.hasQueryContext()
|
||||||
|
? context.getQueryContext()
|
||||||
|
: context;
|
||||||
|
|
||||||
|
const FunctionBuilderPtr & function_builder = FunctionFactory::instance().get(node->name, function_context);
|
||||||
|
auto projection_action = getProjectionAction(node->name, actions_stack, projection_manipulator, getColumnName(), function_context);
|
||||||
|
|
||||||
Names argument_names;
|
Names argument_names;
|
||||||
DataTypes argument_types;
|
DataTypes argument_types;
|
||||||
@ -2483,7 +2489,18 @@ bool ExpressionAnalyzer::appendJoin(ExpressionActionsChain & chain, bool only_ty
|
|||||||
ExpressionActionsChain::Step & step = chain.steps.back();
|
ExpressionActionsChain::Step & step = chain.steps.back();
|
||||||
|
|
||||||
const auto & join_element = static_cast<const ASTTablesInSelectQueryElement &>(*select_query->join());
|
const auto & join_element = static_cast<const ASTTablesInSelectQueryElement &>(*select_query->join());
|
||||||
const auto & join_params = static_cast<const ASTTableJoin &>(*join_element.table_join);
|
auto & join_params = static_cast<ASTTableJoin &>(*join_element.table_join);
|
||||||
|
|
||||||
|
if (join_params.strictness == ASTTableJoin::Strictness::Unspecified && join_params.kind != ASTTableJoin::Kind::Cross)
|
||||||
|
{
|
||||||
|
if (settings.join_default_strictness.toString() == "ANY")
|
||||||
|
join_params.strictness = ASTTableJoin::Strictness::Any;
|
||||||
|
else if (settings.join_default_strictness.toString() == "ALL")
|
||||||
|
join_params.strictness = ASTTableJoin::Strictness::All;
|
||||||
|
else
|
||||||
|
throw Exception("Expected ANY or ALL in JOIN section, because setting (join_default_strictness) is empty", DB::ErrorCodes::EXPECTED_ALL_OR_ANY);
|
||||||
|
}
|
||||||
|
|
||||||
const auto & table_to_join = static_cast<const ASTTableExpression &>(*join_element.table_expression);
|
const auto & table_to_join = static_cast<const ASTTableExpression &>(*join_element.table_expression);
|
||||||
|
|
||||||
getActionsFromJoinKeys(join_params, only_types, false, step.actions);
|
getActionsFromJoinKeys(join_params, only_types, false, step.actions);
|
||||||
|
@ -173,6 +173,8 @@ struct Settings
|
|||||||
\
|
\
|
||||||
M(SettingBool, join_use_nulls, 0, "Use NULLs for non-joined rows of outer JOINs. If false, use default value of corresponding columns data type.") \
|
M(SettingBool, join_use_nulls, 0, "Use NULLs for non-joined rows of outer JOINs. If false, use default value of corresponding columns data type.") \
|
||||||
\
|
\
|
||||||
|
M(SettingJoinStrictness, join_default_strictness, JoinStrictness::Unspecified, "Set default strictness in JOIN query. Possible values: empty string, 'ANY', 'ALL'. If empty, query without strictness will throw exception.") \
|
||||||
|
\
|
||||||
M(SettingUInt64, preferred_block_size_bytes, 1000000, "") \
|
M(SettingUInt64, preferred_block_size_bytes, 1000000, "") \
|
||||||
\
|
\
|
||||||
M(SettingUInt64, max_replica_delay_for_distributed_queries, 300, "If set, distributed queries of Replicated tables will choose servers with replication delay in seconds less than the specified value (not inclusive). Zero means do not take delay into account.") \
|
M(SettingUInt64, max_replica_delay_for_distributed_queries, 300, "If set, distributed queries of Replicated tables will choose servers with replication delay in seconds less than the specified value (not inclusive). Zero means do not take delay into account.") \
|
||||||
|
@ -22,6 +22,7 @@ namespace ErrorCodes
|
|||||||
extern const int UNKNOWN_COMPRESSION_METHOD;
|
extern const int UNKNOWN_COMPRESSION_METHOD;
|
||||||
extern const int UNKNOWN_DISTRIBUTED_PRODUCT_MODE;
|
extern const int UNKNOWN_DISTRIBUTED_PRODUCT_MODE;
|
||||||
extern const int UNKNOWN_GLOBAL_SUBQUERIES_METHOD;
|
extern const int UNKNOWN_GLOBAL_SUBQUERIES_METHOD;
|
||||||
|
extern const int UNKNOWN_JOIN_STRICTNESS;
|
||||||
extern const int SIZE_OF_FIXED_STRING_DOESNT_MATCH;
|
extern const int SIZE_OF_FIXED_STRING_DOESNT_MATCH;
|
||||||
extern const int BAD_ARGUMENTS;
|
extern const int BAD_ARGUMENTS;
|
||||||
}
|
}
|
||||||
@ -288,6 +289,53 @@ void SettingLoadBalancing::write(WriteBuffer & buf) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
JoinStrictness SettingJoinStrictness::getJoinStrictness(const String & s)
|
||||||
|
{
|
||||||
|
if (s == "") return JoinStrictness::Unspecified;
|
||||||
|
if (s == "ALL") return JoinStrictness::ALL;
|
||||||
|
if (s == "ANY") return JoinStrictness::ANY;
|
||||||
|
|
||||||
|
throw Exception("Unknown join strictness mode: '" + s + "', must be one of '', 'ALL', 'ANY'",
|
||||||
|
ErrorCodes::UNKNOWN_JOIN_STRICTNESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
String SettingJoinStrictness::toString() const
|
||||||
|
{
|
||||||
|
const char * strings[] = {"", "ALL", "ANY"};
|
||||||
|
if (value < JoinStrictness::Unspecified || value > JoinStrictness::ANY)
|
||||||
|
throw Exception("Unknown join strictness mode", ErrorCodes::UNKNOWN_JOIN_STRICTNESS);
|
||||||
|
return strings[static_cast<size_t>(value)];
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingJoinStrictness::set(JoinStrictness x)
|
||||||
|
{
|
||||||
|
value = x;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingJoinStrictness::set(const Field & x)
|
||||||
|
{
|
||||||
|
set(safeGet<const String &>(x));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingJoinStrictness::set(const String & x)
|
||||||
|
{
|
||||||
|
set(getJoinStrictness(x));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingJoinStrictness::set(ReadBuffer & buf)
|
||||||
|
{
|
||||||
|
String x;
|
||||||
|
readBinary(x, buf);
|
||||||
|
set(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingJoinStrictness::write(WriteBuffer & buf) const
|
||||||
|
{
|
||||||
|
writeBinary(toString(), buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TotalsMode SettingTotalsMode::getTotalsMode(const String & s)
|
TotalsMode SettingTotalsMode::getTotalsMode(const String & s)
|
||||||
{
|
{
|
||||||
if (s == "before_having") return TotalsMode::BEFORE_HAVING;
|
if (s == "before_having") return TotalsMode::BEFORE_HAVING;
|
||||||
|
@ -191,6 +191,37 @@ struct SettingLoadBalancing
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum class JoinStrictness
|
||||||
|
{
|
||||||
|
Unspecified = 0, /// Query JOIN without strictness will throw Exception.
|
||||||
|
ALL, /// Query JOIN without strictness -> ALL JOIN ...
|
||||||
|
ANY, /// Query JOIN without strictness -> ANY JOIN ...
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct SettingJoinStrictness
|
||||||
|
{
|
||||||
|
JoinStrictness value;
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
SettingJoinStrictness(JoinStrictness x) : value(x) {}
|
||||||
|
|
||||||
|
operator JoinStrictness() const { return value; }
|
||||||
|
SettingJoinStrictness & operator= (JoinStrictness x) { set(x); return *this; }
|
||||||
|
|
||||||
|
static JoinStrictness getJoinStrictness(const String & s);
|
||||||
|
|
||||||
|
String toString() const;
|
||||||
|
|
||||||
|
void set(JoinStrictness x);
|
||||||
|
void set(const Field & x);
|
||||||
|
void set(const String & x);
|
||||||
|
void set(ReadBuffer & buf);
|
||||||
|
|
||||||
|
void write(WriteBuffer & buf) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/// Which rows should be included in TOTALS.
|
/// Which rows should be included in TOTALS.
|
||||||
enum class TotalsMode
|
enum class TotalsMode
|
||||||
{
|
{
|
||||||
|
@ -136,6 +136,8 @@ bool ParserTablesInSelectQueryElement::parseImpl(Pos & pos, ASTPtr & node, Expec
|
|||||||
table_join->strictness = ASTTableJoin::Strictness::Any;
|
table_join->strictness = ASTTableJoin::Strictness::Any;
|
||||||
else if (ParserKeyword("ALL").ignore(pos))
|
else if (ParserKeyword("ALL").ignore(pos))
|
||||||
table_join->strictness = ASTTableJoin::Strictness::All;
|
table_join->strictness = ASTTableJoin::Strictness::All;
|
||||||
|
else
|
||||||
|
table_join->strictness = ASTTableJoin::Strictness::Unspecified;
|
||||||
|
|
||||||
if (ParserKeyword("INNER").ignore(pos))
|
if (ParserKeyword("INNER").ignore(pos))
|
||||||
table_join->kind = ASTTableJoin::Kind::Inner;
|
table_join->kind = ASTTableJoin::Kind::Inner;
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
0
|
@ -0,0 +1 @@
|
|||||||
|
SELECT (toDecimal128(materialize('1'), 0), toDecimal128('2', 0)) < (toDecimal128('1', 0), toDecimal128('2', 0));
|
@ -0,0 +1,12 @@
|
|||||||
|
1 1
|
||||||
|
1 2
|
||||||
|
1 3
|
||||||
|
1 1
|
||||||
|
1 1
|
||||||
|
1 1
|
||||||
|
1 2
|
||||||
|
1 2
|
||||||
|
1 2
|
||||||
|
1 3
|
||||||
|
1 3
|
||||||
|
1 3
|
@ -0,0 +1,24 @@
|
|||||||
|
CREATE DATABASE IF NOT EXISTS test;
|
||||||
|
DROP TABLE IF EXISTS test.a1;
|
||||||
|
DROP TABLE IF EXISTS test.a2;
|
||||||
|
|
||||||
|
SET send_logs_level = 'none';
|
||||||
|
|
||||||
|
CREATE TABLE test.a1(a UInt8, b UInt8) ENGINE=Memory;
|
||||||
|
CREATE TABLE test.a2(a UInt8, b UInt8) ENGINE=Memory;
|
||||||
|
|
||||||
|
INSERT INTO test.a1 VALUES (1, 1);
|
||||||
|
INSERT INTO test.a1 VALUES (1, 2);
|
||||||
|
INSERT INTO test.a1 VALUES (1, 3);
|
||||||
|
INSERT INTO test.a2 VALUES (1, 2);
|
||||||
|
INSERT INTO test.a2 VALUES (1, 3);
|
||||||
|
INSERT INTO test.a2 VALUES (1, 4);
|
||||||
|
|
||||||
|
SELECT a, b FROM test.a1 LEFT JOIN (SELECT a, b FROM test.a2) USING a ORDER BY b; -- { serverError 417 }
|
||||||
|
|
||||||
|
SELECT a, b FROM test.a1 LEFT JOIN (SELECT a, b FROM test.a2) USING a ORDER BY b SETTINGS join_default_strictness='ANY';
|
||||||
|
|
||||||
|
SELECT a, b FROM test.a1 LEFT JOIN (SELECT a, b FROM test.a2) USING a ORDER BY b SETTINGS join_default_strictness='ALL';
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS test.a1;
|
||||||
|
DROP TABLE IF EXISTS test.a2;
|
Loading…
Reference in New Issue
Block a user