mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-23 08:02:02 +00:00
Merge pull request #53059 from ClibMouse/feature/hastokenornull-empty-needle
Make hasTokenOrNull return null on empty needle
This commit is contained in:
commit
ad82dcec7d
@ -13,6 +13,7 @@ namespace ErrorCodes
|
||||
extern const int BAD_ARGUMENTS;
|
||||
extern const int ILLEGAL_COLUMN;
|
||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
extern const int LOGICAL_ERROR;
|
||||
}
|
||||
|
||||
/** Token search the string, means that needle must be surrounded by some separator chars, like whitespace or puctuation.
|
||||
@ -39,9 +40,6 @@ struct HasTokenImpl
|
||||
if (start_pos != nullptr)
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Function '{}' does not support start_pos argument", name);
|
||||
|
||||
if (pattern.empty())
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Needle cannot be empty, because empty string isn't a token");
|
||||
|
||||
if (haystack_offsets.empty())
|
||||
return;
|
||||
|
||||
@ -49,7 +47,7 @@ struct HasTokenImpl
|
||||
const UInt8 * const end = haystack_data.data() + haystack_data.size();
|
||||
const UInt8 * pos = begin;
|
||||
|
||||
if (!std::none_of(pattern.begin(), pattern.end(), isTokenSeparator))
|
||||
if (const auto has_separator = std::any_of(pattern.cbegin(), pattern.cend(), isTokenSeparator); has_separator || pattern.empty())
|
||||
{
|
||||
if (res_null)
|
||||
{
|
||||
@ -57,8 +55,12 @@ struct HasTokenImpl
|
||||
std::ranges::fill(res_null->getData(), true);
|
||||
return;
|
||||
}
|
||||
else
|
||||
else if (has_separator)
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Needle must not contain whitespace or separator characters");
|
||||
else if (pattern.empty())
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Needle cannot be empty, because empty string isn't a token");
|
||||
else
|
||||
throw Exception(ErrorCodes::LOGICAL_ERROR, "Unexpected internal state");
|
||||
}
|
||||
|
||||
size_t pattern_size = pattern.size();
|
||||
|
@ -1,2 +1,6 @@
|
||||
0
|
||||
\N
|
||||
\N
|
||||
0
|
||||
\N
|
||||
\N
|
||||
|
@ -2,6 +2,10 @@ SELECT hasTokenCaseInsensitive('K(G', ''); -- { serverError BAD_ARGUMENTS }
|
||||
SELECT hasTokenCaseInsensitive('Hello', ''); -- { serverError BAD_ARGUMENTS }
|
||||
SELECT hasTokenCaseInsensitive('', ''); -- { serverError BAD_ARGUMENTS }
|
||||
SELECT hasTokenCaseInsensitive('', 'Hello');
|
||||
SELECT hasTokenCaseInsensitiveOrNull('Hello', '');
|
||||
SELECT hasTokenCaseInsensitiveOrNull('', '');
|
||||
SELECT hasToken('Hello', ''); -- { serverError BAD_ARGUMENTS }
|
||||
SELECT hasToken('', 'Hello');
|
||||
SELECT hasToken('', ''); -- { serverError BAD_ARGUMENTS }
|
||||
SELECT hasTokenOrNull('', '');
|
||||
SELECT hasTokenOrNull('Hello', '');
|
||||
|
Loading…
Reference in New Issue
Block a user