Skip to content

Commit

Permalink
Merge branch 'master' of github.com:ClickHouse/ClickHouse into collec…
Browse files Browse the repository at this point in the history
…t-binary-size
  • Loading branch information
alexey-milovidov committed Nov 13, 2023
2 parents 9436209 + 213c7cf commit 6e910f0
Show file tree
Hide file tree
Showing 40 changed files with 240 additions and 79 deletions.
2 changes: 1 addition & 1 deletion contrib/grpc
Submodule grpc updated 9753 files
1 change: 1 addition & 0 deletions contrib/sparse-checkout/update-grpc.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ echo '/*' > $FILES_TO_CHECKOUT
echo '!/test/*' >> $FILES_TO_CHECKOUT
echo '/test/build/*' >> $FILES_TO_CHECKOUT
echo '/test/core/tsi/alts/fake_handshaker/*' >> $FILES_TO_CHECKOUT
echo '/test/core/event_engine/fuzzing_event_engine/*' >> $FILES_TO_CHECKOUT
echo '!/tools/*' >> $FILES_TO_CHECKOUT
echo '/tools/codegen/*' >> $FILES_TO_CHECKOUT
echo '!/examples/*' >> $FILES_TO_CHECKOUT
Expand Down
62 changes: 61 additions & 1 deletion src/Functions/FunctionsConversion.h
Original file line number Diff line number Diff line change
Expand Up @@ -4159,6 +4159,61 @@ arguments, result_type, input_rows_count); \
};
}

template <typename EnumType>
WrapperType createEnumToStringWrapper() const
{
const char * function_name = cast_name;
return [function_name] (
ColumnsWithTypeAndName & arguments, const DataTypePtr & res_type, const ColumnNullable * nullable_col, size_t /*input_rows_count*/)
{
using ColumnEnumType = EnumType::ColumnType;

const auto & first_col = arguments.front().column.get();
const auto & first_type = arguments.front().type.get();

const ColumnEnumType * enum_col = typeid_cast<const ColumnEnumType *>(first_col);
const EnumType * enum_type = typeid_cast<const EnumType *>(first_type);

if (enum_col && nullable_col && nullable_col->size() != enum_col->size())
throw Exception(ErrorCodes::LOGICAL_ERROR, "ColumnNullable is not compatible with original");

if (enum_col && enum_type)
{
const auto size = enum_col->size();
const auto & enum_data = enum_col->getData();

auto res = res_type->createColumn();

if (nullable_col)
{
for (size_t i = 0; i < size; ++i)
{
if (!nullable_col->isNullAt(i))
{
const auto & value = enum_type->getNameForValue(enum_data[i]);
res->insertData(value.data, value.size);
}
else
res->insertDefault();
}
}
else
{
for (size_t i = 0; i < size; ++i)
{
const auto & value = enum_type->getNameForValue(enum_data[i]);
res->insertData(value.data, value.size);
}
}

return res;
}
else
throw Exception(ErrorCodes::LOGICAL_ERROR, "Unexpected column {} as first argument of function {}",
first_col->getName(), function_name);
};
}

static WrapperType createIdentityWrapper(const DataTypePtr &)
{
return [] (ColumnsWithTypeAndName & arguments, const DataTypePtr &, const ColumnNullable *, size_t /*input_rows_count*/)
Expand Down Expand Up @@ -4546,7 +4601,12 @@ arguments, result_type, input_rows_count); \

if constexpr (WhichDataType(ToDataType::type_id).isStringOrFixedString())
{
if (from_type->getCustomSerialization())
if constexpr (WhichDataType(FromDataType::type_id).isEnum())
{
ret = createEnumToStringWrapper<FromDataType>();
return true;
}
else if (from_type->getCustomSerialization())
{
ret = [](ColumnsWithTypeAndName & arguments, const DataTypePtr & result_type, const ColumnNullable *, size_t input_rows_count) -> ColumnPtr
{
Expand Down
11 changes: 6 additions & 5 deletions src/Interpreters/Cache/QueryCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,17 +147,18 @@ QueryCache::Key::Key(ASTPtr ast_, const String & user_name_)
{
}

/// Hashing of ASTs must consider aliases (issue #56258)
constexpr bool ignore_aliases = false;

bool QueryCache::Key::operator==(const Key & other) const
{
return ast->getTreeHash() == other.ast->getTreeHash();
return ast->getTreeHash(ignore_aliases) == other.ast->getTreeHash(ignore_aliases);
}

size_t QueryCache::KeyHasher::operator()(const Key & key) const
{
SipHash hash;
hash.update(key.ast->getTreeHash());
auto res = hash.get64();
return res;
IAST::Hash hash = key.ast->getTreeHash(ignore_aliases);
return hash.low64;
}

size_t QueryCache::QueryCacheEntryWeight::operator()(const Entry & entry) const
Expand Down
8 changes: 4 additions & 4 deletions src/Parsers/ASTColumnsMatcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ void ASTColumnsRegexpMatcher::appendColumnName(WriteBuffer & ostr) const
writeChar(')', ostr);
}

void ASTColumnsRegexpMatcher::updateTreeHashImpl(SipHash & hash_state) const
void ASTColumnsRegexpMatcher::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(original_pattern.size());
hash_state.update(original_pattern);
IAST::updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}

void ASTColumnsRegexpMatcher::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
Expand Down Expand Up @@ -201,11 +201,11 @@ const std::shared_ptr<re2::RE2> & ASTQualifiedColumnsRegexpMatcher::getMatcher()
return column_matcher;
}

void ASTQualifiedColumnsRegexpMatcher::updateTreeHashImpl(SipHash & hash_state) const
void ASTQualifiedColumnsRegexpMatcher::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(original_pattern.size());
hash_state.update(original_pattern);
IAST::updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}

void ASTQualifiedColumnsRegexpMatcher::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
Expand Down
4 changes: 2 additions & 2 deletions src/Parsers/ASTColumnsMatcher.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class ASTColumnsRegexpMatcher : public IAST
const String & getPattern() const;
const std::shared_ptr<re2::RE2> & getMatcher() const;
bool isColumnMatching(const String & column_name) const;
void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;

ASTPtr expression;
ASTPtr transformers;
Expand Down Expand Up @@ -65,7 +65,7 @@ class ASTQualifiedColumnsRegexpMatcher : public IAST
const std::shared_ptr<re2::RE2> & getMatcher() const;
void setPattern(String pattern, bool set_matcher = true);
void setMatcher(std::shared_ptr<re2::RE2> matcher);
void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;

ASTPtr qualifier;
ASTPtr transformers;
Expand Down
22 changes: 11 additions & 11 deletions src/Parsers/ASTColumnsTransformers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,23 +151,23 @@ void ASTColumnsApplyTransformer::appendColumnName(WriteBuffer & ostr) const
}
}

void ASTColumnsApplyTransformer::updateTreeHashImpl(SipHash & hash_state) const
void ASTColumnsApplyTransformer::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(func_name.size());
hash_state.update(func_name);
if (parameters)
parameters->updateTreeHashImpl(hash_state);
parameters->updateTreeHashImpl(hash_state, ignore_aliases);

if (lambda)
lambda->updateTreeHashImpl(hash_state);
lambda->updateTreeHashImpl(hash_state, ignore_aliases);

hash_state.update(lambda_arg.size());
hash_state.update(lambda_arg);

hash_state.update(column_name_prefix.size());
hash_state.update(column_name_prefix);

IAST::updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}

void ASTColumnsExceptTransformer::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
Expand Down Expand Up @@ -216,13 +216,13 @@ void ASTColumnsExceptTransformer::appendColumnName(WriteBuffer & ostr) const
writeChar(')', ostr);
}

void ASTColumnsExceptTransformer::updateTreeHashImpl(SipHash & hash_state) const
void ASTColumnsExceptTransformer::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(is_strict);
hash_state.update(original_pattern.size());
hash_state.update(original_pattern);

IAST::updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}

void ASTColumnsExceptTransformer::transform(ASTs & nodes) const
Expand Down Expand Up @@ -312,14 +312,14 @@ void ASTColumnsReplaceTransformer::Replacement::appendColumnName(WriteBuffer & o
writeProbablyBackQuotedString(name, ostr);
}

void ASTColumnsReplaceTransformer::Replacement::updateTreeHashImpl(SipHash & hash_state) const
void ASTColumnsReplaceTransformer::Replacement::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
assert(children.size() == 1);

hash_state.update(name.size());
hash_state.update(name);
children[0]->updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state);
children[0]->updateTreeHashImpl(hash_state, ignore_aliases);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}

void ASTColumnsReplaceTransformer::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
Expand Down Expand Up @@ -361,10 +361,10 @@ void ASTColumnsReplaceTransformer::appendColumnName(WriteBuffer & ostr) const
writeChar(')', ostr);
}

void ASTColumnsReplaceTransformer::updateTreeHashImpl(SipHash & hash_state) const
void ASTColumnsReplaceTransformer::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(is_strict);
IAST::updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}

void ASTColumnsReplaceTransformer::replaceChildren(ASTPtr & node, const ASTPtr & replacement, const String & name)
Expand Down
8 changes: 4 additions & 4 deletions src/Parsers/ASTColumnsTransformers.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class ASTColumnsApplyTransformer : public IASTColumnsTransformer
}
void transform(ASTs & nodes) const override;
void appendColumnName(WriteBuffer & ostr) const override;
void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;

// Case 1 APPLY (quantile(0.9))
String func_name;
Expand Down Expand Up @@ -80,7 +80,7 @@ class ASTColumnsExceptTransformer : public IASTColumnsTransformer
const std::shared_ptr<re2::RE2> & getMatcher() const;
bool isColumnMatching(const String & column_name) const;
void appendColumnName(WriteBuffer & ostr) const override;
void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;

protected:
void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
Expand All @@ -103,7 +103,7 @@ class ASTColumnsReplaceTransformer : public IASTColumnsTransformer
}

void appendColumnName(WriteBuffer & ostr) const override;
void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;

String name;

Expand All @@ -121,7 +121,7 @@ class ASTColumnsReplaceTransformer : public IASTColumnsTransformer
}
void transform(ASTs & nodes) const override;
void appendColumnName(WriteBuffer & ostr) const override;
void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;

protected:
void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
Expand Down
4 changes: 2 additions & 2 deletions src/Parsers/ASTFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -599,11 +599,11 @@ ASTPtr ASTFunction::clone() const
}


void ASTFunction::updateTreeHashImpl(SipHash & hash_state) const
void ASTFunction::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(name.size());
hash_state.update(name);
IAST::updateTreeHashImpl(hash_state);
ASTWithAlias::updateTreeHashImpl(hash_state, ignore_aliases);
}

template <typename Container>
Expand Down
2 changes: 1 addition & 1 deletion src/Parsers/ASTFunction.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class ASTFunction : public ASTWithAlias

ASTPtr clone() const override;

void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;

ASTSelectWithUnionQuery * tryGetQueryArgument() const;

Expand Down
8 changes: 4 additions & 4 deletions src/Parsers/ASTFunctionWithKeyValueArguments.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,12 @@ bool ASTPair::hasSecretParts() const
}


void ASTPair::updateTreeHashImpl(SipHash & hash_state) const
void ASTPair::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(first.size());
hash_state.update(first);
hash_state.update(second_with_brackets);
IAST::updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}


Expand Down Expand Up @@ -92,12 +92,12 @@ void ASTFunctionWithKeyValueArguments::formatImpl(const FormatSettings & setting
}


void ASTFunctionWithKeyValueArguments::updateTreeHashImpl(SipHash & hash_state) const
void ASTFunctionWithKeyValueArguments::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(name.size());
hash_state.update(name);
hash_state.update(has_brackets);
IAST::updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}

}
4 changes: 2 additions & 2 deletions src/Parsers/ASTFunctionWithKeyValueArguments.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class ASTPair : public IAST

bool hasSecretParts() const override;

void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;

void forEachPointerToChild(std::function<void(void**)> f) override
{
Expand Down Expand Up @@ -66,7 +66,7 @@ class ASTFunctionWithKeyValueArguments : public IAST

void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;

void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
};

}
9 changes: 7 additions & 2 deletions src/Parsers/ASTIdentifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ void ASTIdentifier::setShortName(const String & new_name)
semantic->table = table;
}

void ASTIdentifier::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
ASTWithAlias::updateTreeHashImpl(hash_state, ignore_aliases);
}

const String & ASTIdentifier::name() const
{
if (children.empty())
Expand Down Expand Up @@ -244,10 +249,10 @@ void ASTTableIdentifier::resetTable(const String & database_name, const String &
uuid = identifier->uuid;
}

void ASTTableIdentifier::updateTreeHashImpl(SipHash & hash_state) const
void ASTTableIdentifier::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(uuid);
IAST::updateTreeHashImpl(hash_state);
ASTIdentifier::updateTreeHashImpl(hash_state, ignore_aliases);
}

String getIdentifierName(const IAST * ast)
Expand Down
4 changes: 3 additions & 1 deletion src/Parsers/ASTIdentifier.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ class ASTIdentifier : public ASTWithAlias
const String & shortName() const { return name_parts.back(); }
const String & name() const;

void updateTreeHashImpl(SipHash & hash_state, bool ignore_alias) const override;

void restoreTable(); // TODO(ilezhankin): get rid of this
std::shared_ptr<ASTTableIdentifier> createTable() const; // returns |nullptr| if identifier is not table.

Expand Down Expand Up @@ -91,7 +93,7 @@ class ASTTableIdentifier : public ASTIdentifier
// FIXME: used only when it's needed to rewrite distributed table name to real remote table name.
void resetTable(const String & database_name, const String & table_name); // TODO(ilezhankin): get rid of this

void updateTreeHashImpl(SipHash & hash_state) const override;
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
};

}
4 changes: 2 additions & 2 deletions src/Parsers/ASTInsertQuery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,13 +138,13 @@ void ASTInsertQuery::formatImpl(const FormatSettings & settings, FormatState & s
}
}

void ASTInsertQuery::updateTreeHashImpl(SipHash & hash_state) const
void ASTInsertQuery::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
{
hash_state.update(table_id.database_name);
hash_state.update(table_id.table_name);
hash_state.update(table_id.uuid);
hash_state.update(format);
IAST::updateTreeHashImpl(hash_state);
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
}


Expand Down
Loading

0 comments on commit 6e910f0

Please sign in to comment.