mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 09:32:06 +00:00
add empty/notEmpty function support for IP types
This commit is contained in:
parent
dc0e3bd802
commit
79d82a3587
@ -115,6 +115,16 @@ struct CRCFunctionWrapper
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function {} to UUID argument", std::string(Impl::name));
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv6(const ColumnIPv6::Container & /*offsets*/, size_t /*n*/, PaddedPODArray<ReturnType> & /*res*/)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function {} to IPv6 argument", std::string(Impl::name));
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv4(const ColumnIPv4::Container & /*offsets*/, size_t /*n*/, PaddedPODArray<ReturnType> & /*res*/)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function {} to IPv4 argument", std::string(Impl::name));
|
||||
}
|
||||
|
||||
private:
|
||||
static ReturnType doCRC(const ColumnString::Chars & buf, size_t offset, size_t size)
|
||||
{
|
||||
|
@ -61,6 +61,18 @@ struct EmptyImpl
|
||||
for (size_t i = 0; i < n; ++i)
|
||||
res[i] = negative ^ (container[i].toUnderType() == 0);
|
||||
}
|
||||
|
||||
static void ipv6(const ColumnIPv6::Container & container, size_t n, PaddedPODArray<UInt8> & res)
|
||||
{
|
||||
for (size_t i = 0; i < n; ++i)
|
||||
res[i] = negative ^ (container[i].toUnderType() == 0);
|
||||
}
|
||||
|
||||
static void ipv4(const ColumnIPv4::Container & container, size_t n, PaddedPODArray<UInt8> & res)
|
||||
{
|
||||
for (size_t i = 0; i < n; ++i)
|
||||
res[i] = negative ^ (container[i].toUnderType() == 0);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -52,7 +52,9 @@ public:
|
||||
if (!isStringOrFixedString(arguments[0])
|
||||
&& !isArray(arguments[0])
|
||||
&& !isMap(arguments[0])
|
||||
&& !isUUID(arguments[0]))
|
||||
&& !isUUID(arguments[0])
|
||||
&& !isIPv6(arguments[0])
|
||||
&& !isIPv4(arguments[0]))
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of argument of function {}", arguments[0]->getName(), getName());
|
||||
|
||||
return std::make_shared<DataTypeNumber<ResultType>>();
|
||||
@ -121,6 +123,22 @@ public:
|
||||
Impl::uuid(col_uuid->getData(), input_rows_count, vec_res);
|
||||
return col_res;
|
||||
}
|
||||
else if (const ColumnIPv6 * col_ipv6 = checkAndGetColumn<ColumnIPv6>(column.get()))
|
||||
{
|
||||
auto col_res = ColumnVector<ResultType>::create();
|
||||
typename ColumnVector<ResultType>::Container & vec_res = col_res->getData();
|
||||
vec_res.resize(col_ipv6->size());
|
||||
Impl::ipv6(col_ipv6->getData(), input_rows_count, vec_res);
|
||||
return col_res;
|
||||
}
|
||||
else if (const ColumnIPv4 * col_ipv4 = checkAndGetColumn<ColumnIPv4>(column.get()))
|
||||
{
|
||||
auto col_res = ColumnVector<ResultType>::create();
|
||||
typename ColumnVector<ResultType>::Container & vec_res = col_res->getData();
|
||||
vec_res.resize(col_ipv4->size());
|
||||
Impl::ipv4(col_ipv4->getData(), input_rows_count, vec_res);
|
||||
return col_res;
|
||||
}
|
||||
else
|
||||
throw Exception(ErrorCodes::ILLEGAL_COLUMN, "Illegal column {} of argument of function {}",
|
||||
arguments[0].column->getName(), getName());
|
||||
|
@ -43,6 +43,16 @@ struct LengthImpl
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function length to UUID argument");
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv6(const ColumnIPv6::Container &, size_t &, PaddedPODArray<UInt64> &)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function length to IPv6 argument");
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv4(const ColumnIPv4::Container &, size_t &, PaddedPODArray<UInt64> &)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function length to IPv4 argument");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -60,6 +60,16 @@ struct AsciiImpl
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function {} to UUID argument", AsciiName::name);
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv6(const ColumnIPv6::Container & /*offsets*/, size_t /*n*/, PaddedPODArray<ReturnType> & /*res*/)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function {} to IPv6 argument", AsciiName::name);
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv4(const ColumnIPv4::Container & /*offsets*/, size_t /*n*/, PaddedPODArray<ReturnType> & /*res*/)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function {} to IPv4 argument", AsciiName::name);
|
||||
}
|
||||
|
||||
private:
|
||||
static Int32 doAscii(const ColumnString::Chars & buf, size_t offset, size_t size)
|
||||
{
|
||||
|
@ -248,6 +248,16 @@ SOFTWARE.
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function isValidUTF8 to UUID argument");
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv6(const ColumnIPv6::Container &, size_t &, PaddedPODArray<UInt8> &)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function isValidUTF8 to IPv6 argument");
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv4(const ColumnIPv4::Container &, size_t &, PaddedPODArray<UInt8> &)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function isValidUTF8 to IPv4 argument");
|
||||
}
|
||||
};
|
||||
|
||||
struct NameIsValidUTF8
|
||||
|
@ -58,6 +58,16 @@ struct LengthUTF8Impl
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function lengthUTF8 to UUID argument");
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv6(const ColumnIPv6::Container &, size_t &, PaddedPODArray<UInt64> &)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function lengthUTF8 to IPv6 argument");
|
||||
}
|
||||
|
||||
[[noreturn]] static void ipv4(const ColumnIPv4::Container &, size_t &, PaddedPODArray<UInt64> &)
|
||||
{
|
||||
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Cannot apply function lengthUTF8 to IPv4 argument");
|
||||
}
|
||||
};
|
||||
|
||||
struct NameLengthUTF8
|
||||
|
@ -0,0 +1,8 @@
|
||||
1
|
||||
0
|
||||
0
|
||||
1
|
||||
1
|
||||
0
|
||||
0
|
||||
1
|
@ -0,0 +1,9 @@
|
||||
SELECT empty(toIPv6('::'));
|
||||
SELECT notEmpty(toIPv6('::'));
|
||||
SELECT empty(toIPv6('::1'));
|
||||
SELECT notEmpty(toIPv6('::1'));
|
||||
|
||||
SELECT empty(toIPv4('0.0.0.0'));
|
||||
SELECT notEmpty(toIPv4('0.0.0.0'));
|
||||
SELECT empty(toIPv4('127.0.0.1'));
|
||||
SELECT notEmpty(toIPv4('127.0.0.1'));
|
Loading…
Reference in New Issue
Block a user