mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Cleanup FunctionArgumentDescriptor
const char * can be nullptr, std::string_view can't.
This commit is contained in:
parent
9d8cc51dc5
commit
0ed3466124
@ -97,7 +97,7 @@ ColumnsWithTypeAndName createBlockWithNestedColumns(const ColumnsWithTypeAndName
|
||||
|
||||
void validateArgumentType(const IFunction & func, const DataTypes & arguments,
|
||||
size_t argument_index, bool (* validator_func)(const IDataType &),
|
||||
const char * expected_type_description)
|
||||
const char * type_name)
|
||||
{
|
||||
if (arguments.size() <= argument_index)
|
||||
throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Incorrect number of arguments of function {}",
|
||||
@ -106,7 +106,7 @@ void validateArgumentType(const IFunction & func, const DataTypes & arguments,
|
||||
const auto & argument = arguments[argument_index];
|
||||
if (!validator_func(*argument))
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of {} argument of function {}, expected {}",
|
||||
argument->getName(), std::to_string(argument_index), func.getName(), expected_type_description);
|
||||
argument->getName(), argument_index, func.getName(), type_name);
|
||||
}
|
||||
|
||||
namespace
|
||||
@ -120,9 +120,7 @@ void validateArgumentsImpl(const IFunction & func,
|
||||
{
|
||||
const auto argument_index = i + argument_offset;
|
||||
if (argument_index >= arguments.size())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
const auto & arg = arguments[i + argument_offset];
|
||||
const auto & descriptor = descriptors[i];
|
||||
@ -130,10 +128,10 @@ void validateArgumentsImpl(const IFunction & func,
|
||||
throw Exception(error_code,
|
||||
"Illegal type of argument #{}{} of function {}{}{}",
|
||||
argument_offset + i + 1, // +1 is for human-friendly 1-based indexing
|
||||
(descriptor.argument_name ? " '" + std::string(descriptor.argument_name) + "'" : String{}),
|
||||
" '" + String(descriptor.name) + "'",
|
||||
func.getName(),
|
||||
(descriptor.expected_type_description ? String(", expected ") + descriptor.expected_type_description : String{}),
|
||||
(arg.type ? ", got " + arg.type->getName() : String{}));
|
||||
String(", expected ") + String(descriptor.type_name),
|
||||
arg.type ? ", got " + arg.type->getName() : String{});
|
||||
}
|
||||
}
|
||||
|
||||
@ -141,19 +139,22 @@ void validateArgumentsImpl(const IFunction & func,
|
||||
|
||||
int FunctionArgumentDescriptor::isValid(const DataTypePtr & data_type, const ColumnPtr & column) const
|
||||
{
|
||||
if (type_validator_func && (data_type == nullptr || !type_validator_func(*data_type)))
|
||||
if (name.empty() || type_name.empty())
|
||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "name or type_name are not set");
|
||||
|
||||
if (type_validator && (data_type == nullptr || !type_validator(*data_type)))
|
||||
return ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
|
||||
if (column_validator_func && (column == nullptr || !column_validator_func(*column)))
|
||||
if (column_validator && (column == nullptr || !column_validator(*column)))
|
||||
return ErrorCodes::ILLEGAL_COLUMN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void validateFunctionArgumentTypes(const IFunction & func,
|
||||
const ColumnsWithTypeAndName & arguments,
|
||||
const FunctionArgumentDescriptors & mandatory_args,
|
||||
const FunctionArgumentDescriptors & optional_args)
|
||||
void validateFunctionArguments(const IFunction & func,
|
||||
const ColumnsWithTypeAndName & arguments,
|
||||
const FunctionArgumentDescriptors & mandatory_args,
|
||||
const FunctionArgumentDescriptors & optional_args)
|
||||
{
|
||||
if (arguments.size() < mandatory_args.size() || arguments.size() > mandatory_args.size() + optional_args.size())
|
||||
{
|
||||
@ -165,10 +166,8 @@ void validateFunctionArgumentTypes(const IFunction & func,
|
||||
using A = std::decay_t<decltype(a)>;
|
||||
if constexpr (std::is_same_v<A, FunctionArgumentDescriptor>)
|
||||
{
|
||||
if (a.argument_name)
|
||||
result += "'" + std::string(a.argument_name) + "' : ";
|
||||
if (a.expected_type_description)
|
||||
result += a.expected_type_description;
|
||||
result += "'" + String(a.name) + "' : ";
|
||||
result += a.type_name;
|
||||
}
|
||||
else if constexpr (std::is_same_v<A, ColumnWithTypeAndName>)
|
||||
result += a.type->getName();
|
||||
|
@ -119,73 +119,60 @@ ColumnsWithTypeAndName createBlockWithNestedColumns(const ColumnsWithTypeAndName
|
||||
/// throws if there is no argument at specified index or if predicate returns false.
|
||||
void validateArgumentType(const IFunction & func, const DataTypes & arguments,
|
||||
size_t argument_index, bool (* validator_func)(const IDataType &),
|
||||
const char * expected_type_description);
|
||||
const char * type_name);
|
||||
|
||||
/** Simple validator that is used in conjunction with validateFunctionArgumentTypes() to check if function arguments are as expected
|
||||
*
|
||||
* Also it is used to generate function description when arguments do not match expected ones.
|
||||
* Any field can be null:
|
||||
* `argument_name` - if not null, reported via type check errors.
|
||||
* `expected_type_description` - if not null, reported via type check errors.
|
||||
* `type_validator_func` - if not null, used to validate data type of function argument.
|
||||
* `column_validator_func` - if not null, used to validate column of function argument.
|
||||
*/
|
||||
/// Expected arguments for a function. Can be used in conjunction with validateFunctionArguments() to check that the user-provided
|
||||
/// arguments match the expected arguments.
|
||||
struct FunctionArgumentDescriptor
|
||||
{
|
||||
const char * argument_name;
|
||||
/// The argument name, e.g. "longitude".
|
||||
/// Should not be empty.
|
||||
std::string_view name;
|
||||
|
||||
/// A function which validates the argument data type.
|
||||
/// May be nullptr.
|
||||
using TypeValidator = bool (*)(const IDataType &);
|
||||
TypeValidator type_validator_func;
|
||||
TypeValidator type_validator;
|
||||
|
||||
/// A function which validates the argument column.
|
||||
/// May be nullptr.
|
||||
using ColumnValidator = bool (*)(const IColumn &);
|
||||
ColumnValidator column_validator_func;
|
||||
ColumnValidator column_validator;
|
||||
|
||||
const char * expected_type_description;
|
||||
/// The expected argument type, e.g. "const String" or "UInt64".
|
||||
/// Should not be empty.
|
||||
std::string_view type_name;
|
||||
|
||||
/** Validate argument type and column.
|
||||
*
|
||||
* Returns non-zero error code if:
|
||||
* Validator != nullptr && (Value == nullptr || Validator(*Value) == false)
|
||||
* For:
|
||||
* Validator is either `type_validator_func` or `column_validator_func`
|
||||
* Value is either `data_type` or `column` respectively.
|
||||
* ILLEGAL_TYPE_OF_ARGUMENT if type validation fails
|
||||
*
|
||||
*/
|
||||
/// Validate argument type and column.
|
||||
int isValid(const DataTypePtr & data_type, const ColumnPtr & column) const;
|
||||
};
|
||||
|
||||
using FunctionArgumentDescriptors = std::vector<FunctionArgumentDescriptor>;
|
||||
|
||||
/** Validate that function arguments match specification.
|
||||
*
|
||||
* Designed to simplify argument validation for functions with variable arguments
|
||||
* (e.g. depending on result type or other trait).
|
||||
* First, checks that number of arguments is as expected (including optional arguments).
|
||||
* Second, checks that mandatory args present and have valid type.
|
||||
* Third, checks optional arguments types, skipping ones that are missing.
|
||||
*
|
||||
* Please note that if you have several optional arguments, like f([a, b, c]),
|
||||
* only these calls are considered valid:
|
||||
* f(a)
|
||||
* f(a, b)
|
||||
* f(a, b, c)
|
||||
*
|
||||
* But NOT these: f(a, c), f(b, c)
|
||||
* In other words you can't omit middle optional arguments (just like in regular C++).
|
||||
*
|
||||
* If any mandatory arg is missing, throw an exception, with explicit description of expected arguments.
|
||||
*/
|
||||
void validateFunctionArgumentTypes(const IFunction & func, const ColumnsWithTypeAndName & arguments,
|
||||
const FunctionArgumentDescriptors & mandatory_args,
|
||||
const FunctionArgumentDescriptors & optional_args = {});
|
||||
/// Validates that the user-provided arguments match the expected arguments.
|
||||
///
|
||||
/// Checks that
|
||||
/// - the number of provided arguments matches the number of mandatory/optional arguments,
|
||||
/// - all mandatory arguments are present and have the right type,
|
||||
/// - optional arguments - if present - have the right type.
|
||||
///
|
||||
/// With multiple optional arguments, e.g. f([a, b, c]), provided arguments must match left-to-right. E.g. these calls are considered valid:
|
||||
/// f(a)
|
||||
/// f(a, b)
|
||||
/// f(a, b, c)
|
||||
/// but these are NOT:
|
||||
/// f(a, c)
|
||||
/// f(b, c)
|
||||
void validateFunctionArguments(const IFunction & func, const ColumnsWithTypeAndName & arguments,
|
||||
const FunctionArgumentDescriptors & mandatory_args,
|
||||
const FunctionArgumentDescriptors & optional_args = {});
|
||||
|
||||
/// Checks if a list of array columns have equal offsets. Return a pair of nested columns and offsets if true, otherwise throw.
|
||||
std::pair<std::vector<const IColumn *>, const ColumnArray::Offset *>
|
||||
checkAndGetNestedArrayOffset(const IColumn ** columns, size_t num_arguments);
|
||||
|
||||
/** Return ColumnNullable of src, with null map as OR-ed null maps of args columns.
|
||||
* Or ColumnConst(ColumnNullable) if the result is always NULL or if the result is constant and always not NULL.
|
||||
*/
|
||||
/// Return ColumnNullable of src, with null map as OR-ed null maps of args columns.
|
||||
/// Or ColumnConst(ColumnNullable) if the result is always NULL or if the result is constant and always not NULL.
|
||||
ColumnPtr wrapInNullable(const ColumnPtr & src, const ColumnsWithTypeAndName & args, const DataTypePtr & result_type, size_t input_rows_count);
|
||||
|
||||
struct NullPresence
|
||||
|
@ -40,7 +40,7 @@ public:
|
||||
{"replacement", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeString>();
|
||||
}
|
||||
|
@ -194,7 +194,7 @@ static inline void checkArgumentsWithSeparatorAndOptionalMaxSubstrings(
|
||||
{"max_substrings", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeInteger), isColumnConst, "const Number"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(func, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(func, arguments, mandatory_args, optional_args);
|
||||
}
|
||||
|
||||
static inline void checkArgumentsWithOptionalMaxSubstrings(const IFunction & func, const ColumnsWithTypeAndName & arguments)
|
||||
@ -207,7 +207,7 @@ static inline void checkArgumentsWithOptionalMaxSubstrings(const IFunction & fun
|
||||
{"max_substrings", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeInteger), isColumnConst, "const Number"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(func, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(func, arguments, mandatory_args, optional_args);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ public:
|
||||
FunctionArgumentDescriptors args{
|
||||
{"value", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isDateTime64), nullptr, "DateTime64"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeInt64>();
|
||||
}
|
||||
|
@ -165,7 +165,7 @@ private:
|
||||
});
|
||||
}
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments,
|
||||
validateFunctionArguments(*this, arguments,
|
||||
FunctionArgumentDescriptors{
|
||||
{"mode", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), isColumnConst, "encryption mode string"},
|
||||
{"input", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), {}, "plaintext"},
|
||||
@ -438,7 +438,7 @@ private:
|
||||
});
|
||||
}
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments,
|
||||
validateFunctionArguments(*this, arguments,
|
||||
FunctionArgumentDescriptors{
|
||||
{"mode", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), isColumnConst, "decryption mode string"},
|
||||
{"input", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), {}, "ciphertext"},
|
||||
|
@ -2020,7 +2020,7 @@ public:
|
||||
|
||||
DataTypePtr getReturnTypeImplRemovedNullable(const ColumnsWithTypeAndName & arguments) const
|
||||
{
|
||||
FunctionArgumentDescriptors mandatory_args = {{"Value", nullptr, nullptr, nullptr}};
|
||||
FunctionArgumentDescriptors mandatory_args = {{"Value", nullptr, nullptr, "any type"}};
|
||||
FunctionArgumentDescriptors optional_args;
|
||||
|
||||
if constexpr (to_decimal)
|
||||
@ -2049,7 +2049,7 @@ public:
|
||||
optional_args.push_back({"timezone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"});
|
||||
}
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
if constexpr (std::is_same_v<ToDataType, DataTypeInterval>)
|
||||
{
|
||||
@ -2390,7 +2390,7 @@ public:
|
||||
|
||||
if (isDateTime64<Name, ToDataType>(arguments))
|
||||
{
|
||||
validateFunctionArgumentTypes(*this, arguments,
|
||||
validateFunctionArguments(*this, arguments,
|
||||
FunctionArgumentDescriptors{{"string", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), nullptr, "String or FixedString"}},
|
||||
// optional
|
||||
FunctionArgumentDescriptors{
|
||||
|
@ -647,7 +647,7 @@ public:
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"N", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeInteger), nullptr, "The number of decimal places to round to"},
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
return arguments[0].type;
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ namespace
|
||||
{"json", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
return std::make_shared<DataTypeNullable>(std::make_shared<DataTypeUInt64>());
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,7 @@ public:
|
||||
{"URL", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(func, arguments, mandatory_args);
|
||||
validateFunctionArguments(func, arguments, mandatory_args);
|
||||
}
|
||||
|
||||
static constexpr auto strings_argument_position = 0uz;
|
||||
|
@ -30,7 +30,7 @@ public:
|
||||
{"URL", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(func, arguments, mandatory_args);
|
||||
validateFunctionArguments(func, arguments, mandatory_args);
|
||||
}
|
||||
|
||||
static constexpr auto strings_argument_position = 0uz;
|
||||
|
@ -30,7 +30,7 @@ public:
|
||||
{"URL", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(func, arguments, mandatory_args);
|
||||
validateFunctionArguments(func, arguments, mandatory_args);
|
||||
}
|
||||
|
||||
static constexpr auto strings_argument_position = 0uz;
|
||||
|
@ -31,7 +31,7 @@ public:
|
||||
{"URL", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(func, arguments, mandatory_args);
|
||||
validateFunctionArguments(func, arguments, mandatory_args);
|
||||
}
|
||||
|
||||
void init(const ColumnsWithTypeAndName & /*arguments*/, bool /*max_substrings_includes_remaining_string*/) {}
|
||||
|
@ -87,7 +87,7 @@ public:
|
||||
{"array_1", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isArray), nullptr, "Array"},
|
||||
{"array_2", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isArray), nullptr, "Array"},
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
return std::make_shared<DataTypeNumber<ResultType>>();
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,7 @@ public:
|
||||
{"array", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isArray), nullptr, "Array"},
|
||||
{"samples", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isUInt), isColumnConst, "const UInt*"},
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
// Return an array with the same nested type as the input array
|
||||
const DataTypePtr & array_type = arguments[0].type;
|
||||
|
@ -31,7 +31,7 @@ public:
|
||||
{"array", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isArray), nullptr, "Array"},
|
||||
{"length", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isInteger), nullptr, "Integer"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
const DataTypeArray * array_type = checkAndGetDataType<DataTypeArray>(arguments[0].type.get());
|
||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeArray>(array_type->getNestedType()));
|
||||
|
@ -159,7 +159,7 @@ public:
|
||||
{"separator", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), isColumnConst, "const String"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
return std::make_shared<DataTypeString>();
|
||||
}
|
||||
|
@ -203,7 +203,7 @@ private:
|
||||
|
||||
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
|
||||
{
|
||||
FunctionArgumentDescriptors mandatory_args = {{"Value", nullptr, nullptr, nullptr}};
|
||||
FunctionArgumentDescriptors mandatory_args = {{"Value", nullptr, nullptr, "any type"}};
|
||||
FunctionArgumentDescriptors optional_args;
|
||||
|
||||
if (isDecimal(type) || isDateTime64(type))
|
||||
@ -212,9 +212,9 @@ private:
|
||||
if (isDateTimeOrDateTime64(type))
|
||||
optional_args.push_back({"timezone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), isColumnConst, "const String"});
|
||||
|
||||
optional_args.push_back({"default_value", nullptr, nullptr, nullptr});
|
||||
optional_args.push_back({"default_value", nullptr, nullptr, "any type"});
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
size_t additional_argument_index = 1;
|
||||
|
||||
|
@ -38,7 +38,7 @@ public:
|
||||
{"haystack", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), nullptr, "String or FixedString"},
|
||||
{"pattern", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), isColumnConst, "constant String"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeUInt64>();
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"epoch", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeUInt), isColumnConst, "const UInt*"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, args, optional_args);
|
||||
|
||||
return std::make_shared<DataTypeUInt64>();
|
||||
}
|
||||
@ -91,7 +91,7 @@ public:
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"epoch", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeUInt), isColumnConst, "const UInt*"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, args, optional_args);
|
||||
|
||||
return std::make_shared<DataTypeUInt64>();
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ public:
|
||||
{"pattern", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), isColumnConst, "const String"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(func, arguments, mandatory_args);
|
||||
validateFunctionArguments(func, arguments, mandatory_args);
|
||||
}
|
||||
|
||||
static constexpr auto strings_argument_position = 0uz;
|
||||
|
@ -74,7 +74,7 @@ public:
|
||||
{"haystack", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), nullptr, "const String or const FixedString"},
|
||||
{"needle", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), isColumnConst, "const String or const FixedString"},
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
/// Two-dimensional array of strings, each `row` of top array represents matching groups.
|
||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>()));
|
||||
|
@ -48,7 +48,7 @@ public:
|
||||
{"haystack", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), nullptr, "const String or const FixedString"},
|
||||
{"needle", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isStringOrFixedString), isColumnConst, "const String or const FixedString"},
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeString>());
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ public:
|
||||
FunctionArgumentDescriptors args{
|
||||
{"query", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
DataTypePtr string_type = std::make_shared<DataTypeString>();
|
||||
if (error_handling == ErrorHandling::Null)
|
||||
|
@ -54,7 +54,7 @@ public:
|
||||
{
|
||||
FunctionArgumentDescriptors args{{"days", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeInteger), nullptr, "Integer"}};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<typename Traits::ReturnDataType>();
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ public:
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"expr", nullptr, nullptr, "Arbitrary expression"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
return std::make_shared<DataTypeUInt64>();
|
||||
}
|
||||
|
@ -30,9 +30,9 @@ public:
|
||||
{
|
||||
FunctionArgumentDescriptors mandatory_args;
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"expr", nullptr, nullptr, "Arbitrary Expression"}
|
||||
{"expr", nullptr, nullptr, "any type"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
return std::make_shared<DataTypeUUID>();
|
||||
}
|
||||
|
@ -163,7 +163,7 @@ public:
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"expr", nullptr, nullptr, "Arbitrary expression"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
return std::make_shared<DataTypeUUID>();
|
||||
}
|
||||
|
@ -87,7 +87,7 @@ public:
|
||||
{mandatory_argument_names_year_month_day[1], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNumber), nullptr, "Number"},
|
||||
{mandatory_argument_names_year_month_day[2], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNumber), nullptr, "Number"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -95,7 +95,7 @@ public:
|
||||
{mandatory_argument_names_year_dayofyear[0], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNumber), nullptr, "Number"},
|
||||
{mandatory_argument_names_year_dayofyear[1], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNumber), nullptr, "Number"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
}
|
||||
|
||||
return std::make_shared<typename Traits::ReturnDataType>();
|
||||
@ -193,7 +193,7 @@ public:
|
||||
{mandatory_argument_names[0], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNumber), nullptr, "Number"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<typename Traits::ReturnDataType>();
|
||||
}
|
||||
@ -357,7 +357,7 @@ public:
|
||||
{optional_argument_names[0], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), isColumnConst, "const String"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
/// Optional timezone argument
|
||||
std::string timezone;
|
||||
@ -440,7 +440,7 @@ public:
|
||||
{optional_argument_names[2], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), isColumnConst, "const String"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
if (arguments.size() >= mandatory_argument_names.size() + 1)
|
||||
{
|
||||
@ -572,7 +572,7 @@ public:
|
||||
{optional_argument_names[0], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), isColumnConst, "const String"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
/// Optional timezone argument
|
||||
std::string timezone;
|
||||
@ -652,7 +652,7 @@ public:
|
||||
{optional_argument_names[0], static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), isColumnConst, "const String"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
/// Optional precision argument
|
||||
auto precision = DEFAULT_PRECISION;
|
||||
|
@ -589,7 +589,7 @@ namespace
|
||||
{"timezone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), &isColumnConst, "const String"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
String time_zone_name = getTimeZone(arguments).getTimeZone();
|
||||
DataTypePtr date_type = std::make_shared<DataTypeDateTime>(time_zone_name);
|
||||
|
@ -68,7 +68,7 @@ public:
|
||||
{
|
||||
{"readable_size", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
DataTypePtr return_type = std::make_shared<DataTypeUInt64>();
|
||||
if constexpr (error_handling == ErrorHandling::Null)
|
||||
return std::make_shared<DataTypeNullable>(return_type);
|
||||
|
@ -54,7 +54,7 @@ public:
|
||||
if (arguments.size() == 3)
|
||||
args.emplace_back(FunctionArgumentDescriptor{"index", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isInteger), nullptr, "Integer"});
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeString>();
|
||||
}
|
||||
|
@ -201,7 +201,7 @@ public:
|
||||
{"n", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isInteger), nullptr, "Integer"},
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeString>();
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ public:
|
||||
{"time_series", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isArray), nullptr, "Array"},
|
||||
{"period", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeUInt), nullptr, "Unsigned Integer"},
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeArray>(std::make_shared<DataTypeFloat32>()));
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ public:
|
||||
{"max_percentile", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isFloat), isColumnConst, "Number"},
|
||||
{"k", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeNumber), isColumnConst, "Number"}};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
return std::make_shared<DataTypeArray>(std::make_shared<DataTypeFloat64>());
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ public:
|
||||
FunctionArgumentDescriptors args{
|
||||
{"value", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isDateTime), nullptr, "DateTime"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeInt64>();
|
||||
}
|
||||
@ -121,7 +121,7 @@ public:
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"time_zone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
String timezone;
|
||||
if (arguments.size() == 2)
|
||||
@ -190,7 +190,7 @@ public:
|
||||
FunctionArgumentDescriptors args{
|
||||
{"value", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isDateTime64), nullptr, "DateTime64"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeInt64>();
|
||||
}
|
||||
@ -255,7 +255,7 @@ public:
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"time_zone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
String timezone;
|
||||
if (arguments.size() == 2)
|
||||
|
@ -56,7 +56,7 @@ public:
|
||||
{"epoch", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeUInt), isColumnConst, "const UInt*"},
|
||||
{"time_zone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, args, optional_args);
|
||||
|
||||
String timezone;
|
||||
if (arguments.size() == 3)
|
||||
@ -127,7 +127,7 @@ public:
|
||||
{"epoch", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeUInt), isColumnConst, "const UInt*"},
|
||||
{"time_zone", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, args, optional_args);
|
||||
|
||||
String timezone;
|
||||
if (arguments.size() == 3)
|
||||
|
@ -48,7 +48,7 @@ public:
|
||||
{"n", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isInteger), nullptr, "Integer"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, args);
|
||||
validateFunctionArguments(*this, arguments, args);
|
||||
|
||||
return std::make_shared<DataTypeString>();
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ public:
|
||||
FunctionArgumentDescriptors optional_args{
|
||||
{"time", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"}
|
||||
};
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, optional_args);
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
|
||||
|
||||
return std::make_shared<DataTypeDateTime64>(DATETIME_SCALE);
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ public:
|
||||
{"precision", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeInteger), &isColumnConst, "const Integer"}
|
||||
};
|
||||
|
||||
validateFunctionArgumentTypes(*this, arguments, mandatory_args, {});
|
||||
validateFunctionArguments(*this, arguments, mandatory_args, {});
|
||||
|
||||
return std::make_shared<DataTypeString>();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user