mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 15:42:02 +00:00
Normalize left, right, leftUTF8, rightUTF8 functions
This commit is contained in:
parent
ff779b6409
commit
c4713ee34b
@ -348,7 +348,7 @@ void NO_INLINE sliceDynamicOffsetUnbounded(Source && src, Sink && sink, const IC
|
||||
}
|
||||
|
||||
|
||||
template <bool inverse_offset, typename Source, typename Sink>
|
||||
template <bool inverse, typename Source, typename Sink>
|
||||
static void sliceDynamicOffsetBoundedImpl(Source && src, Sink && sink, const IColumn * offset_column, const IColumn * length_column)
|
||||
{
|
||||
const bool is_offset_null = !offset_column || offset_column->onlyNull();
|
||||
@ -390,14 +390,14 @@ static void sliceDynamicOffsetBoundedImpl(Source && src, Sink && sink, const ICo
|
||||
|
||||
if (offset > 0)
|
||||
{
|
||||
if constexpr (inverse_offset)
|
||||
slice = src.getSliceFromRight(offset - 1, size);
|
||||
if constexpr (inverse)
|
||||
slice = src.getSliceFromRight(size + offset - 1, size);
|
||||
else
|
||||
slice = src.getSliceFromLeft(offset - 1, size);
|
||||
}
|
||||
else
|
||||
{
|
||||
if constexpr (inverse_offset)
|
||||
if constexpr (inverse)
|
||||
slice = src.getSliceFromLeft(-UInt64(offset), size);
|
||||
else
|
||||
slice = src.getSliceFromRight(-UInt64(offset), size);
|
||||
|
@ -358,6 +358,11 @@ struct UTF8StringSource : public StringSource
|
||||
return pos;
|
||||
}
|
||||
|
||||
size_t getElementSize() const
|
||||
{
|
||||
return UTF8::countCodePoints(&elements[prev_offset], StringSource::getElementSize());
|
||||
}
|
||||
|
||||
Slice getSliceFromLeft(size_t offset) const
|
||||
{
|
||||
const auto * begin = &elements[prev_offset];
|
||||
|
@ -85,7 +85,7 @@ public:
|
||||
else
|
||||
{
|
||||
if (column_length_const)
|
||||
sliceFromRightConstantOffsetBounded(source, StringSink(*col_res, input_rows_count), 0, length_value);
|
||||
sliceFromRightConstantOffsetUnbounded(source, StringSink(*col_res, input_rows_count), length_value);
|
||||
else
|
||||
sliceFromRightDynamicLength(source, StringSink(*col_res, input_rows_count), *column_length);
|
||||
}
|
||||
|
230
tests/queries/0_stateless/02159_left_right.reference
Normal file
230
tests/queries/0_stateless/02159_left_right.reference
Normal file
@ -0,0 +1,230 @@
|
||||
-- { echo }
|
||||
|
||||
SELECT left('Hello', 3);
|
||||
Hel
|
||||
SELECT left('Hello', -3);
|
||||
He
|
||||
SELECT left('Hello', 5);
|
||||
Hello
|
||||
SELECT left('Hello', -5);
|
||||
|
||||
SELECT left('Hello', 6);
|
||||
Hello
|
||||
SELECT left('Hello', -6);
|
||||
|
||||
SELECT left('Hello', 0);
|
||||
|
||||
SELECT left('Hello', NULL);
|
||||
\N
|
||||
SELECT left(materialize('Привет'), 4);
|
||||
Пр
|
||||
SELECT LEFT('Привет', -4);
|
||||
Прив
|
||||
SELECT left(toNullable('Привет'), 12);
|
||||
Привет
|
||||
SELECT lEFT('Привет', -12);
|
||||
|
||||
SELECT left(materialize(toNullable('Привет')), 13);
|
||||
Привет
|
||||
SELECT left('Привет', -13);
|
||||
|
||||
SELECT Left('Привет', 0);
|
||||
|
||||
SELECT left('Привет', NULL);
|
||||
\N
|
||||
SELECT leftUTF8('Привет', 4);
|
||||
Прив
|
||||
SELECT leftUTF8('Привет', -4);
|
||||
Пр
|
||||
SELECT leftUTF8('Привет', 12);
|
||||
Привет
|
||||
SELECT leftUTF8('Привет', -12);
|
||||
|
||||
SELECT leftUTF8('Привет', 13);
|
||||
Привет
|
||||
SELECT leftUTF8('Привет', -13);
|
||||
|
||||
SELECT leftUTF8('Привет', 0);
|
||||
|
||||
SELECT leftUTF8('Привет', NULL);
|
||||
\N
|
||||
SELECT left('Hello', number) FROM numbers(10);
|
||||
|
||||
H
|
||||
He
|
||||
Hel
|
||||
Hell
|
||||
Hello
|
||||
Hello
|
||||
Hello
|
||||
Hello
|
||||
Hello
|
||||
SELECT leftUTF8('Привет', number) FROM numbers(10);
|
||||
|
||||
П
|
||||
Пр
|
||||
При
|
||||
Прив
|
||||
Приве
|
||||
Привет
|
||||
Привет
|
||||
Привет
|
||||
Привет
|
||||
SELECT left('Hello', -number) FROM numbers(10);
|
||||
|
||||
Hell
|
||||
Hel
|
||||
He
|
||||
H
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
SELECT leftUTF8('Привет', -number) FROM numbers(10);
|
||||
|
||||
Приве
|
||||
Прив
|
||||
При
|
||||
Пр
|
||||
П
|
||||
|
||||
|
||||
|
||||
|
||||
SELECT leftUTF8('Привет', number % 3 = 0 ? NULL : (number % 2 ? toInt64(number) : -number)) FROM numbers(10);
|
||||
\N
|
||||
П
|
||||
Прив
|
||||
\N
|
||||
Пр
|
||||
Приве
|
||||
\N
|
||||
Привет
|
||||
|
||||
\N
|
||||
SELECT leftUTF8(number < 5 ? 'Hello' : 'Привет', number % 3 = 0 ? NULL : (number % 2 ? toInt64(number) : -number)) FROM numbers(10);
|
||||
\N
|
||||
H
|
||||
Hel
|
||||
\N
|
||||
H
|
||||
Приве
|
||||
\N
|
||||
Привет
|
||||
|
||||
\N
|
||||
SELECT right('Hello', 3);
|
||||
llo
|
||||
SELECT right('Hello', -3);
|
||||
lo
|
||||
SELECT right('Hello', 5);
|
||||
Hello
|
||||
SELECT right('Hello', -5);
|
||||
|
||||
SELECT right('Hello', 6);
|
||||
Hello
|
||||
SELECT right('Hello', -6);
|
||||
|
||||
SELECT right('Hello', 0);
|
||||
|
||||
SELECT right('Hello', NULL);
|
||||
\N
|
||||
SELECT RIGHT(materialize('Привет'), 4);
|
||||
ет
|
||||
SELECT right('Привет', -4);
|
||||
ивет
|
||||
SELECT Right(toNullable('Привет'), 12);
|
||||
Привет
|
||||
SELECT right('Привет', -12);
|
||||
|
||||
SELECT rIGHT(materialize(toNullable('Привет')), 13);
|
||||
Привет
|
||||
SELECT right('Привет', -13);
|
||||
|
||||
SELECT rIgHt('Привет', 0);
|
||||
|
||||
SELECT RiGhT('Привет', NULL);
|
||||
\N
|
||||
SELECT rightUTF8('Привет', 4);
|
||||
ивет
|
||||
SELECT rightUTF8('Привет', -4);
|
||||
ет
|
||||
SELECT rightUTF8('Привет', 12);
|
||||
Привет
|
||||
SELECT rightUTF8('Привет', -12);
|
||||
|
||||
SELECT rightUTF8('Привет', 13);
|
||||
Привет
|
||||
SELECT rightUTF8('Привет', -13);
|
||||
|
||||
SELECT rightUTF8('Привет', 0);
|
||||
|
||||
SELECT rightUTF8('Привет', NULL);
|
||||
\N
|
||||
SELECT right('Hello', number) FROM numbers(10);
|
||||
|
||||
o
|
||||
lo
|
||||
llo
|
||||
ello
|
||||
Hello
|
||||
Hello
|
||||
Hello
|
||||
Hello
|
||||
Hello
|
||||
SELECT rightUTF8('Привет', number) FROM numbers(10);
|
||||
|
||||
т
|
||||
ет
|
||||
вет
|
||||
ивет
|
||||
ривет
|
||||
Привет
|
||||
Привет
|
||||
Привет
|
||||
Привет
|
||||
SELECT right('Hello', -number) FROM numbers(10);
|
||||
|
||||
ello
|
||||
llo
|
||||
lo
|
||||
o
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
SELECT rightUTF8('Привет', -number) FROM numbers(10);
|
||||
|
||||
ривет
|
||||
ивет
|
||||
вет
|
||||
ет
|
||||
т
|
||||
|
||||
|
||||
|
||||
|
||||
SELECT rightUTF8('Привет', number % 3 = 0 ? NULL : (number % 2 ? toInt64(number) : -number)) FROM numbers(10);
|
||||
\N
|
||||
т
|
||||
ивет
|
||||
\N
|
||||
ет
|
||||
ривет
|
||||
\N
|
||||
Привет
|
||||
|
||||
\N
|
||||
SELECT rightUTF8(number < 5 ? 'Hello' : 'Привет', number % 3 = 0 ? NULL : (number % 2 ? toInt64(number) : -number)) FROM numbers(10);
|
||||
\N
|
||||
o
|
||||
llo
|
||||
\N
|
||||
o
|
||||
ривет
|
||||
\N
|
||||
Привет
|
||||
|
||||
\N
|
71
tests/queries/0_stateless/02159_left_right.sql
Normal file
71
tests/queries/0_stateless/02159_left_right.sql
Normal file
@ -0,0 +1,71 @@
|
||||
-- { echo }
|
||||
|
||||
SELECT left('Hello', 3);
|
||||
SELECT left('Hello', -3);
|
||||
SELECT left('Hello', 5);
|
||||
SELECT left('Hello', -5);
|
||||
SELECT left('Hello', 6);
|
||||
SELECT left('Hello', -6);
|
||||
SELECT left('Hello', 0);
|
||||
SELECT left('Hello', NULL);
|
||||
|
||||
SELECT left(materialize('Привет'), 4);
|
||||
SELECT LEFT('Привет', -4);
|
||||
SELECT left(toNullable('Привет'), 12);
|
||||
SELECT lEFT('Привет', -12);
|
||||
SELECT left(materialize(toNullable('Привет')), 13);
|
||||
SELECT left('Привет', -13);
|
||||
SELECT Left('Привет', 0);
|
||||
SELECT left('Привет', NULL);
|
||||
|
||||
SELECT leftUTF8('Привет', 4);
|
||||
SELECT leftUTF8('Привет', -4);
|
||||
SELECT leftUTF8('Привет', 12);
|
||||
SELECT leftUTF8('Привет', -12);
|
||||
SELECT leftUTF8('Привет', 13);
|
||||
SELECT leftUTF8('Привет', -13);
|
||||
SELECT leftUTF8('Привет', 0);
|
||||
SELECT leftUTF8('Привет', NULL);
|
||||
|
||||
SELECT left('Hello', number) FROM numbers(10);
|
||||
SELECT leftUTF8('Привет', number) FROM numbers(10);
|
||||
SELECT left('Hello', -number) FROM numbers(10);
|
||||
SELECT leftUTF8('Привет', -number) FROM numbers(10);
|
||||
|
||||
SELECT leftUTF8('Привет', number % 3 = 0 ? NULL : (number % 2 ? toInt64(number) : -number)) FROM numbers(10);
|
||||
SELECT leftUTF8(number < 5 ? 'Hello' : 'Привет', number % 3 = 0 ? NULL : (number % 2 ? toInt64(number) : -number)) FROM numbers(10);
|
||||
|
||||
SELECT right('Hello', 3);
|
||||
SELECT right('Hello', -3);
|
||||
SELECT right('Hello', 5);
|
||||
SELECT right('Hello', -5);
|
||||
SELECT right('Hello', 6);
|
||||
SELECT right('Hello', -6);
|
||||
SELECT right('Hello', 0);
|
||||
SELECT right('Hello', NULL);
|
||||
|
||||
SELECT RIGHT(materialize('Привет'), 4);
|
||||
SELECT right('Привет', -4);
|
||||
SELECT Right(toNullable('Привет'), 12);
|
||||
SELECT right('Привет', -12);
|
||||
SELECT rIGHT(materialize(toNullable('Привет')), 13);
|
||||
SELECT right('Привет', -13);
|
||||
SELECT rIgHt('Привет', 0);
|
||||
SELECT RiGhT('Привет', NULL);
|
||||
|
||||
SELECT rightUTF8('Привет', 4);
|
||||
SELECT rightUTF8('Привет', -4);
|
||||
SELECT rightUTF8('Привет', 12);
|
||||
SELECT rightUTF8('Привет', -12);
|
||||
SELECT rightUTF8('Привет', 13);
|
||||
SELECT rightUTF8('Привет', -13);
|
||||
SELECT rightUTF8('Привет', 0);
|
||||
SELECT rightUTF8('Привет', NULL);
|
||||
|
||||
SELECT right('Hello', number) FROM numbers(10);
|
||||
SELECT rightUTF8('Привет', number) FROM numbers(10);
|
||||
SELECT right('Hello', -number) FROM numbers(10);
|
||||
SELECT rightUTF8('Привет', -number) FROM numbers(10);
|
||||
|
||||
SELECT rightUTF8('Привет', number % 3 = 0 ? NULL : (number % 2 ? toInt64(number) : -number)) FROM numbers(10);
|
||||
SELECT rightUTF8(number < 5 ? 'Hello' : 'Привет', number % 3 = 0 ? NULL : (number % 2 ? toInt64(number) : -number)) FROM numbers(10);
|
Loading…
Reference in New Issue
Block a user