#include #include #include #include #include #include #include #include #include namespace DB { void RewriteCountVariantsVisitor::visit(ASTPtr & node) { checkStackSize(); if (node->as() || node->as() || node->as()) return; for (auto & child : node->children) visit(child); if (auto * func = node->as()) visit(*func); } void RewriteCountVariantsVisitor::visit(ASTFunction & func) { if (!func.arguments || func.arguments->children.empty() || func.arguments->children.size() > 1 || !func.arguments->children[0]) return; auto name = Poco::toLower(func.name); if (name != "sum" && name != "count") return; auto & func_arguments = func.arguments->children; const auto * first_arg_literal = func_arguments[0]->as(); if (!first_arg_literal) return; bool transform = false; if (name == "count") { if (first_arg_literal->value.getType() != Field::Types::Null) transform = true; } else if (name == "sum") { if (first_arg_literal->value.getType() == Field::Types::UInt64) { auto constant = first_arg_literal->value.get(); if (constant == 1 && !context->getSettingsRef().aggregate_functions_null_for_empty) transform = true; } } if (!transform) return; func.name = "count"; func.arguments->children.clear(); } }