#include #include namespace DB { namespace ErrorCodes { extern const int BAD_ARGUMENTS; } template T checkAndGetLiteralArgument(const ASTPtr & arg, const String & arg_name) { if (arg && arg->as()) return checkAndGetLiteralArgument(*arg->as(), arg_name); throw Exception( ErrorCodes::BAD_ARGUMENTS, "Argument '{}' must be a literal, get {} (value: {})", arg_name, arg ? arg->getID() : "NULL", arg ? arg->formatForErrorMessage() : "NULL"); } template T checkAndGetLiteralArgument(const ASTLiteral & arg, const String & arg_name) { auto requested_type = Field::TypeToEnum>>::value; auto provided_type = arg.value.getType(); if (requested_type != provided_type) throw Exception( ErrorCodes::BAD_ARGUMENTS, "Argument '{}' must be a literal with type {}, got {}", arg_name, fieldTypeToString(requested_type), fieldTypeToString(provided_type)); return arg.value.safeGet(); } template String checkAndGetLiteralArgument(const ASTPtr &, const String &); template UInt64 checkAndGetLiteralArgument(const ASTPtr &, const String &); template UInt8 checkAndGetLiteralArgument(const ASTPtr &, const String &); template bool checkAndGetLiteralArgument(const ASTPtr &, const String &); template String checkAndGetLiteralArgument(const ASTLiteral &, const String &); template UInt64 checkAndGetLiteralArgument(const ASTLiteral &, const String &); }