#include #include #include #include #include #include #include #include #include namespace DB { ConstantNode::ConstantNode(ConstantValuePtr constant_value_, QueryTreeNodePtr source_expression) : IQueryTreeNode(children_size) , constant_value(std::move(constant_value_)) , value_string(applyVisitor(FieldVisitorToString(), constant_value->getValue())) { children[source_child_index] = std::move(source_expression); } ConstantNode::ConstantNode(ConstantValuePtr constant_value_) : ConstantNode(constant_value_, nullptr /*source_expression*/) {} ConstantNode::ConstantNode(Field value_, DataTypePtr value_data_type_) : ConstantNode(std::make_shared(convertFieldToTypeOrThrow(value_, *value_data_type_), value_data_type_)) {} ConstantNode::ConstantNode(Field value_) : ConstantNode(value_, applyVisitor(FieldToDataType(), value_)) {} void ConstantNode::dumpTreeImpl(WriteBuffer & buffer, FormatState & format_state, size_t indent) const { buffer << std::string(indent, ' ') << "CONSTANT id: " << format_state.getNodeId(this); if (hasAlias()) buffer << ", alias: " << getAlias(); buffer << ", constant_value: " << constant_value->getValue().dump(); buffer << ", constant_value_type: " << constant_value->getType()->getName(); if (getSourceExpression()) { buffer << '\n' << std::string(indent + 2, ' ') << "EXPRESSION " << '\n'; getSourceExpression()->dumpTreeImpl(buffer, format_state, indent + 4); } } bool ConstantNode::isEqualImpl(const IQueryTreeNode & rhs) const { const auto & rhs_typed = assert_cast(rhs); return *constant_value == *rhs_typed.constant_value && value_string == rhs_typed.value_string; } void ConstantNode::updateTreeHashImpl(HashState & hash_state) const { auto type_name = constant_value->getType()->getName(); hash_state.update(type_name.size()); hash_state.update(type_name); hash_state.update(value_string.size()); hash_state.update(value_string); } QueryTreeNodePtr ConstantNode::cloneImpl() const { return std::make_shared(constant_value); } ASTPtr ConstantNode::toASTImpl() const { return std::make_shared(constant_value->getValue()); } }