Normalize left, right, leftUTF8, rightUTF8 functions

This commit is contained in:
Alexey Milovidov 2022-01-05 06:46:31 +03:00
parent ff779b6409
commit c4713ee34b
5 changed files with 311 additions and 5 deletions

View File

@ -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);

View File

@ -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];

View File

@ -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);
}

View 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

View 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);