mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 00:30:49 +00:00
Fix #56258, attempt II
This commit is contained in:
parent
4223b82fb4
commit
8ad124ef64
@ -147,14 +147,17 @@ QueryCache::Key::Key(ASTPtr ast_, const String & user_name_)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Hashing of ASTs must consider aliases (issue #56258)
|
||||||
|
const bool dont_ignore_aliases = false;
|
||||||
|
|
||||||
bool QueryCache::Key::operator==(const Key & other) const
|
bool QueryCache::Key::operator==(const Key & other) const
|
||||||
{
|
{
|
||||||
return ast->getTreeHash() == other.ast->getTreeHash();
|
return ast->getTreeHash(dont_ignore_aliases) == other.ast->getTreeHash(dont_ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t QueryCache::KeyHasher::operator()(const Key & key) const
|
size_t QueryCache::KeyHasher::operator()(const Key & key) const
|
||||||
{
|
{
|
||||||
IAST::Hash hash = key.ast->getTreeHash();
|
IAST::Hash hash = key.ast->getTreeHash(dont_ignore_aliases);
|
||||||
return hash.low64;
|
return hash.low64;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,11 +46,11 @@ void ASTColumnsRegexpMatcher::appendColumnName(WriteBuffer & ostr) const
|
|||||||
writeChar(')', ostr);
|
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.size());
|
||||||
hash_state.update(original_pattern);
|
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
|
void ASTColumnsRegexpMatcher::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
|
||||||
@ -201,11 +201,11 @@ const std::shared_ptr<re2::RE2> & ASTQualifiedColumnsRegexpMatcher::getMatcher()
|
|||||||
return column_matcher;
|
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.size());
|
||||||
hash_state.update(original_pattern);
|
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
|
void ASTQualifiedColumnsRegexpMatcher::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
|
||||||
|
@ -27,7 +27,7 @@ public:
|
|||||||
const String & getPattern() const;
|
const String & getPattern() const;
|
||||||
const std::shared_ptr<re2::RE2> & getMatcher() const;
|
const std::shared_ptr<re2::RE2> & getMatcher() const;
|
||||||
bool isColumnMatching(const String & column_name) 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 expression;
|
||||||
ASTPtr transformers;
|
ASTPtr transformers;
|
||||||
@ -65,7 +65,7 @@ public:
|
|||||||
const std::shared_ptr<re2::RE2> & getMatcher() const;
|
const std::shared_ptr<re2::RE2> & getMatcher() const;
|
||||||
void setPattern(String pattern, bool set_matcher = true);
|
void setPattern(String pattern, bool set_matcher = true);
|
||||||
void setMatcher(std::shared_ptr<re2::RE2> matcher);
|
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 qualifier;
|
||||||
ASTPtr transformers;
|
ASTPtr transformers;
|
||||||
|
@ -151,15 +151,15 @@ 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.size());
|
||||||
hash_state.update(func_name);
|
hash_state.update(func_name);
|
||||||
if (parameters)
|
if (parameters)
|
||||||
parameters->updateTreeHashImpl(hash_state);
|
parameters->updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
|
|
||||||
if (lambda)
|
if (lambda)
|
||||||
lambda->updateTreeHashImpl(hash_state);
|
lambda->updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
|
|
||||||
hash_state.update(lambda_arg.size());
|
hash_state.update(lambda_arg.size());
|
||||||
hash_state.update(lambda_arg);
|
hash_state.update(lambda_arg);
|
||||||
@ -167,7 +167,7 @@ void ASTColumnsApplyTransformer::updateTreeHashImpl(SipHash & hash_state) const
|
|||||||
hash_state.update(column_name_prefix.size());
|
hash_state.update(column_name_prefix.size());
|
||||||
hash_state.update(column_name_prefix);
|
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
|
void ASTColumnsExceptTransformer::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
|
||||||
@ -216,13 +216,13 @@ void ASTColumnsExceptTransformer::appendColumnName(WriteBuffer & ostr) const
|
|||||||
writeChar(')', ostr);
|
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(is_strict);
|
||||||
hash_state.update(original_pattern.size());
|
hash_state.update(original_pattern.size());
|
||||||
hash_state.update(original_pattern);
|
hash_state.update(original_pattern);
|
||||||
|
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTColumnsExceptTransformer::transform(ASTs & nodes) const
|
void ASTColumnsExceptTransformer::transform(ASTs & nodes) const
|
||||||
@ -312,14 +312,14 @@ void ASTColumnsReplaceTransformer::Replacement::appendColumnName(WriteBuffer & o
|
|||||||
writeProbablyBackQuotedString(name, ostr);
|
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);
|
assert(children.size() == 1);
|
||||||
|
|
||||||
hash_state.update(name.size());
|
hash_state.update(name.size());
|
||||||
hash_state.update(name);
|
hash_state.update(name);
|
||||||
children[0]->updateTreeHashImpl(hash_state);
|
children[0]->updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTColumnsReplaceTransformer::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
|
void ASTColumnsReplaceTransformer::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
|
||||||
@ -361,10 +361,10 @@ void ASTColumnsReplaceTransformer::appendColumnName(WriteBuffer & ostr) const
|
|||||||
writeChar(')', ostr);
|
writeChar(')', ostr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTColumnsReplaceTransformer::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTColumnsReplaceTransformer::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
hash_state.update(is_strict);
|
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)
|
void ASTColumnsReplaceTransformer::replaceChildren(ASTPtr & node, const ASTPtr & replacement, const String & name)
|
||||||
|
@ -48,7 +48,7 @@ public:
|
|||||||
}
|
}
|
||||||
void transform(ASTs & nodes) const override;
|
void transform(ASTs & nodes) const override;
|
||||||
void appendColumnName(WriteBuffer & ostr) 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))
|
// Case 1 APPLY (quantile(0.9))
|
||||||
String func_name;
|
String func_name;
|
||||||
@ -80,7 +80,7 @@ public:
|
|||||||
const std::shared_ptr<re2::RE2> & getMatcher() const;
|
const std::shared_ptr<re2::RE2> & getMatcher() const;
|
||||||
bool isColumnMatching(const String & column_name) const;
|
bool isColumnMatching(const String & column_name) const;
|
||||||
void appendColumnName(WriteBuffer & ostr) 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:
|
protected:
|
||||||
void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
|
void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
|
||||||
@ -103,7 +103,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void appendColumnName(WriteBuffer & ostr) 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;
|
||||||
|
|
||||||
String name;
|
String name;
|
||||||
|
|
||||||
@ -121,7 +121,7 @@ public:
|
|||||||
}
|
}
|
||||||
void transform(ASTs & nodes) const override;
|
void transform(ASTs & nodes) const override;
|
||||||
void appendColumnName(WriteBuffer & ostr) 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:
|
protected:
|
||||||
void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
|
void formatImpl(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
|
||||||
|
@ -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.size());
|
||||||
hash_state.update(name);
|
hash_state.update(name);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
ASTWithAlias::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
|
@ -63,7 +63,7 @@ public:
|
|||||||
|
|
||||||
ASTPtr clone() const override;
|
ASTPtr clone() const override;
|
||||||
|
|
||||||
void updateTreeHashImpl(SipHash & hash_state) const override;
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
|
|
||||||
ASTSelectWithUnionQuery * tryGetQueryArgument() const;
|
ASTSelectWithUnionQuery * tryGetQueryArgument() const;
|
||||||
|
|
||||||
|
@ -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.size());
|
||||||
hash_state.update(first);
|
hash_state.update(first);
|
||||||
hash_state.update(second_with_brackets);
|
hash_state.update(second_with_brackets);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -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.size());
|
||||||
hash_state.update(name);
|
hash_state.update(name);
|
||||||
hash_state.update(has_brackets);
|
hash_state.update(has_brackets);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ public:
|
|||||||
|
|
||||||
bool hasSecretParts() const override;
|
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
|
void forEachPointerToChild(std::function<void(void**)> f) override
|
||||||
{
|
{
|
||||||
@ -66,7 +66,7 @@ public:
|
|||||||
|
|
||||||
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -87,6 +87,11 @@ void ASTIdentifier::setShortName(const String & new_name)
|
|||||||
semantic->table = table;
|
semantic->table = table;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ASTIdentifier::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
|
{
|
||||||
|
ASTWithAlias::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
|
}
|
||||||
|
|
||||||
const String & ASTIdentifier::name() const
|
const String & ASTIdentifier::name() const
|
||||||
{
|
{
|
||||||
if (children.empty())
|
if (children.empty())
|
||||||
@ -244,10 +249,10 @@ void ASTTableIdentifier::resetTable(const String & database_name, const String &
|
|||||||
uuid = identifier->uuid;
|
uuid = identifier->uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTTableIdentifier::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTTableIdentifier::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
hash_state.update(uuid);
|
hash_state.update(uuid);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
ASTIdentifier::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
String getIdentifierName(const IAST * ast)
|
String getIdentifierName(const IAST * ast)
|
||||||
|
@ -47,6 +47,8 @@ public:
|
|||||||
const String & shortName() const { return name_parts.back(); }
|
const String & shortName() const { return name_parts.back(); }
|
||||||
const String & name() const;
|
const String & name() const;
|
||||||
|
|
||||||
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_alias) const override;
|
||||||
|
|
||||||
void restoreTable(); // TODO(ilezhankin): get rid of this
|
void restoreTable(); // TODO(ilezhankin): get rid of this
|
||||||
std::shared_ptr<ASTTableIdentifier> createTable() const; // returns |nullptr| if identifier is not table.
|
std::shared_ptr<ASTTableIdentifier> createTable() const; // returns |nullptr| if identifier is not table.
|
||||||
|
|
||||||
@ -91,7 +93,7 @@ public:
|
|||||||
// FIXME: used only when it's needed to rewrite distributed table name to real remote table name.
|
// 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 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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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.database_name);
|
||||||
hash_state.update(table_id.table_name);
|
hash_state.update(table_id.table_name);
|
||||||
hash_state.update(table_id.uuid);
|
hash_state.update(table_id.uuid);
|
||||||
hash_state.update(format);
|
hash_state.update(format);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,11 +10,9 @@
|
|||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
void ASTLiteral::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTLiteral::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
const char * prefix = "Literal_";
|
ASTWithAlias::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
hash_state.update(prefix, strlen(prefix));
|
|
||||||
applyVisitor(FieldVisitorHash(hash_state), value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr ASTLiteral::clone() const
|
ASTPtr ASTLiteral::clone() const
|
||||||
|
@ -41,7 +41,7 @@ public:
|
|||||||
|
|
||||||
ASTPtr clone() const override;
|
ASTPtr clone() const override;
|
||||||
|
|
||||||
void updateTreeHashImpl(SipHash & hash_state) const override;
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void formatImplWithoutAlias(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
|
void formatImplWithoutAlias(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
|
||||||
|
@ -7,13 +7,13 @@
|
|||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
void ASTOrderByElement::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTOrderByElement::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
hash_state.update(direction);
|
hash_state.update(direction);
|
||||||
hash_state.update(nulls_direction);
|
hash_state.update(nulls_direction);
|
||||||
hash_state.update(nulls_direction_was_explicitly_specified);
|
hash_state.update(nulls_direction_was_explicitly_specified);
|
||||||
hash_state.update(with_fill);
|
hash_state.update(with_fill);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTOrderByElement::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
|
void ASTOrderByElement::formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const
|
||||||
|
@ -32,7 +32,7 @@ public:
|
|||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateTreeHashImpl(SipHash & hash_state) const override;
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
|
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
|
||||||
|
@ -23,4 +23,9 @@ void ASTQueryParameter::appendColumnNameImpl(WriteBuffer & ostr) const
|
|||||||
writeString(name, ostr);
|
writeString(name, ostr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ASTQueryParameter::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
|
{
|
||||||
|
ASTWithAlias::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,8 @@ public:
|
|||||||
|
|
||||||
ASTPtr clone() const override { return std::make_shared<ASTQueryParameter>(*this); }
|
ASTPtr clone() const override { return std::make_shared<ASTQueryParameter>(*this); }
|
||||||
|
|
||||||
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void formatImplWithoutAlias(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
|
void formatImplWithoutAlias(const FormatSettings & settings, FormatState &, FormatStateStacked) const override;
|
||||||
void appendColumnNameImpl(WriteBuffer & ostr) const override;
|
void appendColumnNameImpl(WriteBuffer & ostr) const override;
|
||||||
|
@ -42,14 +42,14 @@ ASTPtr ASTSelectQuery::clone() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ASTSelectQuery::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTSelectQuery::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
hash_state.update(distinct);
|
hash_state.update(distinct);
|
||||||
hash_state.update(group_by_with_totals);
|
hash_state.update(group_by_with_totals);
|
||||||
hash_state.update(group_by_with_rollup);
|
hash_state.update(group_by_with_rollup);
|
||||||
hash_state.update(group_by_with_cube);
|
hash_state.update(group_by_with_cube);
|
||||||
hash_state.update(limit_with_ties);
|
hash_state.update(limit_with_ties);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ public:
|
|||||||
void replaceDatabaseAndTable(const String & database_name, const String & table_name);
|
void replaceDatabaseAndTable(const String & database_name, const String & table_name);
|
||||||
void replaceDatabaseAndTable(const StorageID & table_id);
|
void replaceDatabaseAndTable(const StorageID & table_id);
|
||||||
void addTableFunction(ASTPtr & table_function_ptr);
|
void addTableFunction(ASTPtr & table_function_ptr);
|
||||||
void updateTreeHashImpl(SipHash & hash_state) const override;
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
|
|
||||||
void setFinal();
|
void setFinal();
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
void ASTSetQuery::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTSetQuery::updateTreeHashImpl(SipHash & hash_state, bool /*ignore_aliases*/) const
|
||||||
{
|
{
|
||||||
for (const auto & change : changes)
|
for (const auto & change : changes)
|
||||||
{
|
{
|
||||||
|
@ -34,7 +34,7 @@ public:
|
|||||||
|
|
||||||
void formatImpl(const FormatSettings & format, FormatState &, FormatStateStacked) const override;
|
void formatImpl(const FormatSettings & format, FormatState &, FormatStateStacked) const override;
|
||||||
|
|
||||||
void updateTreeHashImpl(SipHash & hash_state) const override;
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
|
|
||||||
QueryKind getQueryKind() const override { return QueryKind::Set; }
|
QueryKind getQueryKind() const override { return QueryKind::Set; }
|
||||||
|
|
||||||
|
@ -51,11 +51,11 @@ void ASTSubquery::formatImplWithoutAlias(const FormatSettings & settings, Format
|
|||||||
settings.ostr << nl_or_nothing << indent_str << ")";
|
settings.ostr << nl_or_nothing << indent_str << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTSubquery::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTSubquery::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
if (!cte_name.empty())
|
if (!cte_name.empty())
|
||||||
hash_state.update(cte_name);
|
hash_state.update(cte_name);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
ASTWithAlias::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
String ASTSubquery::getAliasOrColumnName() const
|
String ASTSubquery::getAliasOrColumnName() const
|
||||||
|
@ -14,7 +14,7 @@ class ASTSubquery : public ASTWithAlias
|
|||||||
public:
|
public:
|
||||||
// Stored the name when the subquery is defined in WITH clause. For example:
|
// Stored the name when the subquery is defined in WITH clause. For example:
|
||||||
// WITH (SELECT 1) AS a SELECT * FROM a AS b; cte_name will be `a`.
|
// WITH (SELECT 1) AS a SELECT * FROM a AS b; cte_name will be `a`.
|
||||||
std::string cte_name;
|
String cte_name;
|
||||||
|
|
||||||
/** Get the text that identifies this element. */
|
/** Get the text that identifies this element. */
|
||||||
String getID(char) const override { return "Subquery"; }
|
String getID(char) const override { return "Subquery"; }
|
||||||
@ -26,7 +26,7 @@ public:
|
|||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateTreeHashImpl(SipHash & hash_state) const override;
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
String getAliasOrColumnName() const override;
|
String getAliasOrColumnName() const override;
|
||||||
String tryGetAlias() const override;
|
String tryGetAlias() const override;
|
||||||
|
|
||||||
|
@ -21,10 +21,10 @@ do \
|
|||||||
while (false)
|
while (false)
|
||||||
|
|
||||||
|
|
||||||
void ASTTableExpression::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTTableExpression::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
hash_state.update(final);
|
hash_state.update(final);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -42,12 +42,12 @@ ASTPtr ASTTableExpression::clone() const
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTTableJoin::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTTableJoin::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
hash_state.update(locality);
|
hash_state.update(locality);
|
||||||
hash_state.update(strictness);
|
hash_state.update(strictness);
|
||||||
hash_state.update(kind);
|
hash_state.update(kind);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr ASTTableJoin::clone() const
|
ASTPtr ASTTableJoin::clone() const
|
||||||
@ -61,10 +61,10 @@ ASTPtr ASTTableJoin::clone() const
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTArrayJoin::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTArrayJoin::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
hash_state.update(kind);
|
hash_state.update(kind);
|
||||||
IAST::updateTreeHashImpl(hash_state);
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr ASTArrayJoin::clone() const
|
ASTPtr ASTArrayJoin::clone() const
|
||||||
|
@ -59,7 +59,7 @@ struct ASTTableExpression : public IAST
|
|||||||
String getID(char) const override { return "TableExpression"; }
|
String getID(char) const override { return "TableExpression"; }
|
||||||
ASTPtr clone() const override;
|
ASTPtr clone() const override;
|
||||||
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ struct ASTTableJoin : public IAST
|
|||||||
void formatImplBeforeTable(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const;
|
void formatImplBeforeTable(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const;
|
||||||
void formatImplAfterTable(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const;
|
void formatImplAfterTable(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const;
|
||||||
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Specification of ARRAY JOIN.
|
/// Specification of ARRAY JOIN.
|
||||||
@ -102,7 +102,7 @@ struct ASTArrayJoin : public IAST
|
|||||||
String getID(char) const override { return "ArrayJoin"; }
|
String getID(char) const override { return "ArrayJoin"; }
|
||||||
ASTPtr clone() const override;
|
ASTPtr clone() const override;
|
||||||
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ IAST::QueryKind ASTTransactionControl::getQueryKind() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASTTransactionControl::updateTreeHashImpl(SipHash & hash_state) const
|
void ASTTransactionControl::updateTreeHashImpl(SipHash & hash_state, bool /*ignore_aliases*/) const
|
||||||
{
|
{
|
||||||
hash_state.update(action);
|
hash_state.update(action);
|
||||||
}
|
}
|
||||||
|
@ -20,13 +20,13 @@ public:
|
|||||||
|
|
||||||
UInt64 snapshot; /// For SET TRANSACTION SNAPSHOT ...
|
UInt64 snapshot; /// For SET TRANSACTION SNAPSHOT ...
|
||||||
|
|
||||||
ASTTransactionControl(QueryType action_) : action(action_) {}
|
explicit ASTTransactionControl(QueryType action_) : action(action_) {}
|
||||||
|
|
||||||
String getID(char /*delimiter*/) const override { return "ASTTransactionControl"; }
|
String getID(char /*delimiter*/) const override { return "ASTTransactionControl"; }
|
||||||
ASTPtr clone() const override { return std::make_shared<ASTTransactionControl>(*this); }
|
ASTPtr clone() const override { return std::make_shared<ASTTransactionControl>(*this); }
|
||||||
|
|
||||||
void formatImpl(const FormatSettings & format, FormatState & /*state*/, FormatStateStacked /*frame*/) const override;
|
void formatImpl(const FormatSettings & format, FormatState & /*state*/, FormatStateStacked /*frame*/) const override;
|
||||||
void updateTreeHashImpl(SipHash & hash_state) const override;
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
|
|
||||||
QueryKind getQueryKind() const override;
|
QueryKind getQueryKind() const override;
|
||||||
};
|
};
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <Common/SipHash.h>
|
||||||
#include <Parsers/ASTWithAlias.h>
|
#include <Parsers/ASTWithAlias.h>
|
||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <IO/Operators.h>
|
#include <IO/Operators.h>
|
||||||
@ -42,6 +43,13 @@ void ASTWithAlias::formatImpl(const FormatSettings & settings, FormatState & sta
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ASTWithAlias::updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const
|
||||||
|
{
|
||||||
|
if (!ignore_aliases && !alias.empty())
|
||||||
|
hash_state.update(alias);
|
||||||
|
IAST::updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
|
}
|
||||||
|
|
||||||
void ASTWithAlias::appendColumnName(WriteBuffer & ostr) const
|
void ASTWithAlias::appendColumnName(WriteBuffer & ostr) const
|
||||||
{
|
{
|
||||||
if (prefer_alias_to_column_name && !alias.empty())
|
if (prefer_alias_to_column_name && !alias.empty())
|
||||||
|
@ -27,7 +27,9 @@ public:
|
|||||||
void setAlias(const String & to) override { alias = to; }
|
void setAlias(const String & to) override { alias = to; }
|
||||||
|
|
||||||
/// Calls formatImplWithoutAlias, and also outputs an alias. If necessary, encloses the entire expression in brackets.
|
/// Calls formatImplWithoutAlias, and also outputs an alias. If necessary, encloses the entire expression in brackets.
|
||||||
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const override final;
|
void formatImpl(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const final;
|
||||||
|
|
||||||
|
void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const override;
|
||||||
|
|
||||||
virtual void formatImplWithoutAlias(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const = 0;
|
virtual void formatImplWithoutAlias(const FormatSettings & settings, FormatState & state, FormatStateStacked frame) const = 0;
|
||||||
|
|
||||||
|
@ -114,24 +114,24 @@ size_t IAST::checkSize(size_t max_size) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
IAST::Hash IAST::getTreeHash() const
|
IAST::Hash IAST::getTreeHash(bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
SipHash hash_state;
|
SipHash hash_state;
|
||||||
updateTreeHash(hash_state);
|
updateTreeHash(hash_state, ignore_aliases);
|
||||||
return getSipHash128AsPair(hash_state);
|
return getSipHash128AsPair(hash_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void IAST::updateTreeHash(SipHash & hash_state) const
|
void IAST::updateTreeHash(SipHash & hash_state, bool ignore_aliases) const
|
||||||
{
|
{
|
||||||
updateTreeHashImpl(hash_state);
|
updateTreeHashImpl(hash_state, ignore_aliases);
|
||||||
hash_state.update(children.size());
|
hash_state.update(children.size());
|
||||||
for (const auto & child : children)
|
for (const auto & child : children)
|
||||||
child->updateTreeHash(hash_state);
|
child->updateTreeHash(hash_state, ignore_aliases);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void IAST::updateTreeHashImpl(SipHash & hash_state) const
|
void IAST::updateTreeHashImpl(SipHash & hash_state, bool /*ignore_aliases*/) const
|
||||||
{
|
{
|
||||||
auto id = getID();
|
auto id = getID();
|
||||||
hash_state.update(id.data(), id.size());
|
hash_state.update(id.data(), id.size());
|
||||||
|
@ -78,11 +78,13 @@ public:
|
|||||||
virtual ASTPtr clone() const = 0;
|
virtual ASTPtr clone() const = 0;
|
||||||
|
|
||||||
/** Get hash code, identifying this element and its subtree.
|
/** Get hash code, identifying this element and its subtree.
|
||||||
|
* Hashing by default ignores aliases (e.g. identifier aliases, function aliases, literal aliases) which is
|
||||||
|
* useful for common subexpression elimination. Set 'ignore_aliases = false' if you don't want that behavior.
|
||||||
*/
|
*/
|
||||||
using Hash = CityHash_v1_0_2::uint128;
|
using Hash = CityHash_v1_0_2::uint128;
|
||||||
Hash getTreeHash() const;
|
Hash getTreeHash(bool ignore_aliases = true) const;
|
||||||
void updateTreeHash(SipHash & hash_state) const;
|
void updateTreeHash(SipHash & hash_state, bool ignore_aliases = true) const;
|
||||||
virtual void updateTreeHashImpl(SipHash & hash_state) const;
|
virtual void updateTreeHashImpl(SipHash & hash_state, bool ignore_aliases) const;
|
||||||
|
|
||||||
void dumpTree(WriteBuffer & ostr, size_t indent = 0) const;
|
void dumpTree(WriteBuffer & ostr, size_t indent = 0) const;
|
||||||
std::string dumpTree(size_t indent = 0) const;
|
std::string dumpTree(size_t indent = 0) const;
|
||||||
|
24
tests/queries/0_stateless/02494_query_cache_bugs.reference
Normal file
24
tests/queries/0_stateless/02494_query_cache_bugs.reference
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
-- Bug 56258: Check literals (ASTLiteral)
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
10: 10
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
x: 10
|
||||||
|
2
|
||||||
|
-- Bug 56258: Check functions (ASTFunction)
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
toUInt64(42): 42
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
x: 42
|
||||||
|
2
|
||||||
|
-- Bug 56258: Check identifiers (ASTIdentifier)
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
c: 1
|
||||||
|
Row 1:
|
||||||
|
──────
|
||||||
|
x: 1
|
||||||
|
2
|
39
tests/queries/0_stateless/02494_query_cache_bugs.sql
Normal file
39
tests/queries/0_stateless/02494_query_cache_bugs.sql
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
-- Tags: no-parallel
|
||||||
|
-- Tag no-parallel: Messes with internal cache
|
||||||
|
|
||||||
|
-- Test for Bug 56258
|
||||||
|
|
||||||
|
SYSTEM DROP QUERY CACHE;
|
||||||
|
|
||||||
|
SELECT '-- Bug 56258: Check literals (ASTLiteral)';
|
||||||
|
|
||||||
|
SELECT 10 FORMAT Vertical SETTINGS use_query_cache = 1;
|
||||||
|
SELECT 10 AS x FORMAT Vertical SETTINGS use_query_cache = 1;
|
||||||
|
|
||||||
|
SELECT count(*) FROM system.query_cache;
|
||||||
|
|
||||||
|
SYSTEM DROP QUERY CACHE;
|
||||||
|
|
||||||
|
SELECT '-- Bug 56258: Check functions (ASTFunction)';
|
||||||
|
|
||||||
|
SELECT toUInt64(42) FORMAT Vertical SETTINGS use_query_cache = 1;
|
||||||
|
SELECT toUInt64(42) AS x FORMAT Vertical SETTINGS use_query_cache = 1;
|
||||||
|
|
||||||
|
SELECT count(*) FROM system.query_cache;
|
||||||
|
|
||||||
|
SYSTEM DROP QUERY CACHE;
|
||||||
|
|
||||||
|
SELECT '-- Bug 56258: Check identifiers (ASTIdentifier)';
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS tab;
|
||||||
|
|
||||||
|
CREATE TABLE tab(c UInt64) ENGINE = Memory AS SELECT 1;
|
||||||
|
|
||||||
|
SELECT c FROM tab FORMAT Vertical SETTINGS use_query_cache = 1;
|
||||||
|
SELECT c AS x FROM tab FORMAT Vertical SETTINGS use_query_cache = 1;
|
||||||
|
|
||||||
|
SELECT count(*) FROM system.query_cache;
|
||||||
|
|
||||||
|
DROP TABLE tab;
|
||||||
|
|
||||||
|
SYSTEM DROP QUERY CACHE;
|
Loading…
Reference in New Issue
Block a user