change as request

This commit is contained in:
taiyang-li 2024-08-19 12:45:15 +08:00
parent 0abca8b7dd
commit 8eb922036e
6 changed files with 203 additions and 543 deletions

View File

@ -251,24 +251,24 @@ select printf('%%%s %s %d', 'Hello', 'World', 2024);
## overlay
Replace the string `s` with the string `replace` starting from the 1-based `position` for `length` bytes. If `length` is omitted or negative, then it defaults to the length of `replace`.
Replace the string `s` with the string `replace` starting from the 1-based `offset` for `length` bytes. If `length` is omitted or negative, then it defaults to the length of `replace`.
**Syntax**
```sql
overlay(s, replace, position[, length])
overlay(s, replace, offset[, length])
```
**Parameters**
- `s`: A string type [String](../data-types/string.md).
- `replace`: A string type [String](../data-types/string.md).
- `position`: An integer type [Int](../data-types/int-uint.md).
- `offset`: An integer type [Int](../data-types/int-uint.md).
- `length`: Optional. An integer type [Int](../data-types/int-uint.md).
**Returned value**
- A [String](../data-types/string.md) data type value. If `position` is negative the position is counted starting from the back. `length` specifies the length of the snippet within input to be replaced.
- A [String](../data-types/string.md) data type value. If `offset` is negative the offset is counted starting from the back. `length` specifies the length of the snippet within input to be replaced.
**Example**
@ -286,26 +286,26 @@ Result:
## overlayUTF8
Replace the string `s` with the string `replace` starting from the 1-based `position` for `length` UTF-8 characters. If `length` is omitted or negative, then it defaults to the length of `replace`.
Replace the string `s` with the string `replace` starting from the 1-based `offset` for `length` UTF-8 characters. If `length` is omitted or negative, then it defaults to the length of `replace`.
Assumes that the string contains valid UTF-8 encoded text. If this assumption is violated, no exception is thrown and the result is undefined.
**Syntax**
```sql
overlayUTF8(s, replace, position[, length])
overlayUTF8(s, replace, offset[, length])
```
**Parameters**
- `s`: A string type [String](../data-types/string.md).
- `replace`: A string type [String](../data-types/string.md).
- `position`: An integer type [Int](../data-types/int-uint.md).
- `offset`: An integer type [Int](../data-types/int-uint.md).
- `length`: Optional. An integer type [Int](../data-types/int-uint.md).
**Returned value**
- A [String](../data-types/string.md) data type value. If `position` is negative the position is counted starting from the back. `length` specifies the length of the snippet within input to be replaced.
- A [String](../data-types/string.md) data type value. If `offset` is negative the offset is counted starting from the back. `length` specifies the length of the snippet within input to be replaced.
**Example**

View File

@ -17,13 +17,13 @@ extern const int ILLEGAL_TYPE_OF_ARGUMENT;
extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH;
}
using namespace GatherUtils;
namespace
{
/// If 'is_utf8' - measure offset and length in code points instead of bytes.
/// Syntax: overlay(input, replace, offset[, length])
/// Syntax:
/// - overlay(input, replace, offset[, length])
/// - overlayUTF8(input, replace, offset[, length]) - measure offset and length in code points instead of bytes
template <bool is_utf8>
class FunctionOverlay : public IFunction
{
@ -37,63 +37,39 @@ public:
bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }
bool useDefaultImplementationForConstants() const override { return true; }
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName & arguments) const override
{
const size_t number_of_arguments = arguments.size();
if (number_of_arguments < 3 || number_of_arguments > 4)
throw Exception(
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH,
"Number of arguments for function {} doesn't match: "
"passed {}, should be 3 or 4",
getName(),
number_of_arguments);
FunctionArgumentDescriptors mandatory_args{
{"input", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
{"replace", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isString), nullptr, "String"},
{"offset", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeInteger), nullptr, "(U)Int8/16/32/64"},
};
/// first argument is string
if (!isString(arguments[0]))
throw Exception(
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
"Illegal type {} of first argument of function {}, expected String",
arguments[0]->getName(),
getName());
FunctionArgumentDescriptors optional_args{
{"length", static_cast<FunctionArgumentDescriptor::TypeValidator>(&isNativeInteger), nullptr, "(U)Int8/16/32/64"},
};
/// second argument is string
if (!isString(arguments[1]))
throw Exception(
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
"Illegal type {} of second argument of function {}, expected String",
arguments[1]->getName(),
getName());
if (!isNativeNumber(arguments[2]))
throw Exception(
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
"Illegal type {} of third argument of function {}, expected (U)Int8|16|32|64",
arguments[2]->getName(),
getName());
if (number_of_arguments == 4 && !isNativeNumber(arguments[3]))
throw Exception(
ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
"Illegal type {} of second argument of function {}, expected (U)Int8|16|32|64",
arguments[3]->getName(),
getName());
validateFunctionArguments(*this, arguments, mandatory_args, optional_args);
return std::make_shared<DataTypeString>();
}
ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t input_rows_count) const override
{
if (input_rows_count == 0)
return ColumnString::create();
const size_t number_of_arguments = arguments.size();
bool three_args = number_of_arguments == 3;
bool has_three_args = number_of_arguments == 3;
ColumnPtr column_offset = arguments[2].column;
ColumnPtr column_length;
if (!three_args)
if (!has_three_args)
column_length = arguments[3].column;
const ColumnConst * column_offset_const = checkAndGetColumn<ColumnConst>(column_offset.get());
const ColumnConst * column_length_const = nullptr;
if (!three_args)
if (!has_three_args)
column_length_const = checkAndGetColumn<ColumnConst>(column_length.get());
bool offset_is_const = false;
@ -126,7 +102,7 @@ public:
if (column_input_const)
{
StringRef input = column_input_const->getDataAt(0);
res_data.reserve(input.size * input_rows_count);
res_data.reserve((input.size + 1) * input_rows_count);
}
else
{
@ -135,8 +111,8 @@ public:
const auto * column_replace_const = checkAndGetColumn<ColumnConst>(column_replace.get());
const auto * column_replace_string = checkAndGetColumn<ColumnString>(column_replace.get());
bool input_is_const = column_input_const != nullptr;
bool replace_is_const = column_replace_const != nullptr;
bool input_is_const = (column_input_const != nullptr);
bool replace_is_const = (column_replace_const != nullptr);
#define OVERLAY_EXECUTE_CASE(THREE_ARGS, OFFSET_IS_CONST, LENGTH_IS_CONST) \
if (input_is_const && replace_is_const) \
@ -150,8 +126,9 @@ public:
length, \
res_data, \
res_offsets); \
else if (input_is_const) \
else if (input_is_const && !replace_is_const) \
constantVector<THREE_ARGS, OFFSET_IS_CONST, LENGTH_IS_CONST>( \
input_rows_count, \
column_input_const->getDataAt(0), \
column_replace_string->getChars(), \
column_replace_string->getOffsets(), \
@ -161,8 +138,9 @@ public:
length, \
res_data, \
res_offsets); \
else if (replace_is_const) \
else if (!input_is_const && replace_is_const) \
vectorConstant<THREE_ARGS, OFFSET_IS_CONST, LENGTH_IS_CONST>( \
input_rows_count, \
column_input_string->getChars(), \
column_input_string->getOffsets(), \
column_replace_const->getDataAt(0), \
@ -174,6 +152,7 @@ public:
res_offsets); \
else \
vectorVector<THREE_ARGS, OFFSET_IS_CONST, LENGTH_IS_CONST>( \
input_rows_count, \
column_input_string->getChars(), \
column_input_string->getOffsets(), \
column_replace_string->getChars(), \
@ -185,7 +164,7 @@ public:
res_data, \
res_offsets);
if (three_args)
if (has_three_args)
{
if (offset_is_const)
{
@ -251,7 +230,7 @@ private:
return bytes;
}
template <bool three_args, bool offset_is_const, bool length_is_const>
template <bool has_three_args, bool offset_is_const, bool length_is_const>
void constantConstant(
size_t rows,
const StringRef & input,
@ -263,7 +242,7 @@ private:
ColumnString::Chars & res_data,
ColumnString::Offsets & res_offsets) const
{
if (!three_args && length_is_const && const_length < 0)
if (!has_three_args && length_is_const && const_length < 0)
{
constantConstant<true, offset_is_const, false>(
rows, input, replace, column_offset, column_length, const_offset, -1, res_data, res_offsets);
@ -277,12 +256,12 @@ private:
size_t replace_size = getSliceSize(reinterpret_cast<const UInt8 *>(replace.data), replace.size);
size_t valid_length = 0; // not negative
if constexpr (!three_args && length_is_const)
if constexpr (!has_three_args && length_is_const)
{
assert(const_length >= 0);
valid_length = const_length;
}
else if constexpr (three_args)
else if constexpr (has_three_args)
{
valid_length = replace_size;
}
@ -300,7 +279,7 @@ private:
valid_offset = getValidOffset(offset, input_size);
}
if constexpr (!three_args && !length_is_const)
if constexpr (!has_three_args && !length_is_const)
{
length = column_length->getInt(i);
valid_length = length >= 0 ? length : replace_size;
@ -331,10 +310,10 @@ private:
}
else
{
const auto * prefix_end = UTF8StringSource::skipCodePointsForward(input_begin, prefix_size, input_end);
const auto * prefix_end = GatherUtils::UTF8StringSource::skipCodePointsForward(input_begin, prefix_size, input_end);
size_t prefix_bytes = prefix_end > input_end ? input.size : prefix_end - input_begin;
const auto * suffix_begin = UTF8StringSource::skipCodePointsBackward(input_end, suffix_size, input_begin);
const auto * suffix_begin = GatherUtils::UTF8StringSource::skipCodePointsBackward(input_end, suffix_size, input_begin);
size_t suffix_bytes = input_end - suffix_begin;
size_t new_res_size = res_data.size() + prefix_bytes + replace.size + suffix_bytes + 1; /// +1 for zero terminator
@ -363,8 +342,9 @@ private:
}
}
template <bool three_args, bool offset_is_const, bool length_is_const>
template <bool has_three_args, bool offset_is_const, bool length_is_const>
void vectorConstant(
size_t rows,
const ColumnString::Chars & input_data,
const ColumnString::Offsets & input_offsets,
const StringRef & replace,
@ -375,27 +355,26 @@ private:
ColumnString::Chars & res_data,
ColumnString::Offsets & res_offsets) const
{
if (!three_args && length_is_const && const_length < 0)
if (!has_three_args && length_is_const && const_length < 0)
{
vectorConstant<true, offset_is_const, false>(
input_data, input_offsets, replace, column_offset, column_length, const_offset, -1, res_data, res_offsets);
rows, input_data, input_offsets, replace, column_offset, column_length, const_offset, -1, res_data, res_offsets);
return;
}
size_t replace_size = getSliceSize(reinterpret_cast<const UInt8 *>(replace.data), replace.size);
Int64 length = 0; // maybe negative
size_t valid_length = 0; // not negative
if constexpr (!three_args && length_is_const)
if constexpr (!has_three_args && length_is_const)
{
assert(const_length >= 0);
valid_length = const_length;
}
else if constexpr (three_args)
else if constexpr (has_three_args)
{
valid_length = replace_size;
}
size_t rows = input_offsets.size();
Int64 offset = 0; // start from 1, maybe negative
size_t valid_offset = 0; // start from 0, not negative
size_t res_offset = 0;
@ -415,7 +394,7 @@ private:
valid_offset = getValidOffset(offset, input_size);
}
if constexpr (!three_args && !length_is_const)
if constexpr (!has_three_args && !length_is_const)
{
length = column_length->getInt(i);
valid_length = length >= 0 ? length : replace_size;
@ -449,9 +428,9 @@ private:
{
const auto * input_begin = &input_data[input_offset];
const auto * input_end = &input_data[input_offset + input_bytes];
const auto * prefix_end = UTF8StringSource::skipCodePointsForward(input_begin, prefix_size, input_end);
const auto * prefix_end = GatherUtils::UTF8StringSource::skipCodePointsForward(input_begin, prefix_size, input_end);
size_t prefix_bytes = prefix_end > input_end ? input_bytes : prefix_end - input_begin;
const auto * suffix_begin = UTF8StringSource::skipCodePointsBackward(input_end, suffix_size, input_begin);
const auto * suffix_begin = GatherUtils::UTF8StringSource::skipCodePointsBackward(input_end, suffix_size, input_begin);
size_t suffix_bytes = input_end - suffix_begin;
size_t new_res_size = res_data.size() + prefix_bytes + replace.size + suffix_bytes + 1; /// +1 for zero terminator
@ -480,8 +459,9 @@ private:
}
}
template <bool three_args, bool offset_is_const, bool length_is_const>
template <bool has_three_args, bool offset_is_const, bool length_is_const>
void constantVector(
size_t rows,
const StringRef & input,
const ColumnString::Chars & replace_data,
const ColumnString::Offsets & replace_offsets,
@ -492,10 +472,10 @@ private:
ColumnString::Chars & res_data,
ColumnString::Offsets & res_offsets) const
{
if (!three_args && length_is_const && const_length < 0)
if (!has_three_args && length_is_const && const_length < 0)
{
constantVector<true, offset_is_const, false>(
input, replace_data, replace_offsets, column_offset, column_length, const_offset, -1, res_data, res_offsets);
rows, input, replace_data, replace_offsets, column_offset, column_length, const_offset, -1, res_data, res_offsets);
return;
}
@ -506,13 +486,12 @@ private:
Int64 length = 0; // maybe negative
size_t valid_length = 0; // not negative
if constexpr (!three_args && length_is_const)
if constexpr (!has_three_args && length_is_const)
{
assert(const_length >= 0);
valid_length = const_length;
}
size_t rows = replace_offsets.size();
const auto * input_begin = reinterpret_cast<const UInt8 *>(input.data);
const auto * input_end = reinterpret_cast<const UInt8 *>(input.data + input.size);
Int64 offset = 0; // start from 1, maybe negative
@ -529,7 +508,7 @@ private:
valid_offset = getValidOffset(offset, input_size);
}
if constexpr (three_args)
if constexpr (has_three_args)
{
valid_length = replace_size;
}
@ -564,9 +543,9 @@ private:
}
else
{
const auto * prefix_end = UTF8StringSource::skipCodePointsForward(input_begin, prefix_size, input_end);
const auto * prefix_end = GatherUtils::UTF8StringSource::skipCodePointsForward(input_begin, prefix_size, input_end);
size_t prefix_bytes = prefix_end > input_end ? input.size : prefix_end - input_begin;
const auto * suffix_begin = UTF8StringSource::skipCodePointsBackward(input_end, suffix_size, input_begin);
const auto * suffix_begin = GatherUtils::UTF8StringSource::skipCodePointsBackward(input_end, suffix_size, input_begin);
size_t suffix_bytes = input_end - suffix_begin;
size_t new_res_size = res_data.size() + prefix_bytes + replace_bytes + suffix_bytes + 1; /// +1 for zero terminator
res_data.resize(new_res_size);
@ -594,8 +573,9 @@ private:
}
}
template <bool three_args, bool offset_is_const, bool length_is_const>
template <bool has_three_args, bool offset_is_const, bool length_is_const>
void vectorVector(
size_t rows,
const ColumnString::Chars & input_data,
const ColumnString::Offsets & input_offsets,
const ColumnString::Chars & replace_data,
@ -607,9 +587,10 @@ private:
ColumnString::Chars & res_data,
ColumnString::Offsets & res_offsets) const
{
if (!three_args && length_is_const && const_length < 0)
if (!has_three_args && length_is_const && const_length < 0)
{
vectorVector<true, offset_is_const, false>(
rows,
input_data,
input_offsets,
replace_data,
@ -625,13 +606,12 @@ private:
Int64 length = 0; // maybe negative
size_t valid_length = 0; // not negative
if constexpr (!three_args && length_is_const)
if constexpr (!has_three_args && length_is_const)
{
assert(const_length >= 0);
valid_length = const_length;
}
size_t rows = input_offsets.size();
Int64 offset = 0; // start from 1, maybe negative
size_t valid_offset = 0; // start from 0, not negative
size_t res_offset = 0;
@ -655,7 +635,7 @@ private:
valid_offset = getValidOffset(offset, input_size);
}
if constexpr (three_args)
if constexpr (has_three_args)
{
valid_length = replace_size;
}
@ -693,9 +673,9 @@ private:
{
const auto * input_begin = &input_data[input_offset];
const auto * input_end = &input_data[input_offset + input_bytes];
const auto * prefix_end = UTF8StringSource::skipCodePointsForward(input_begin, prefix_size, input_end);
const auto * prefix_end = GatherUtils::UTF8StringSource::skipCodePointsForward(input_begin, prefix_size, input_end);
size_t prefix_bytes = prefix_end > input_end ? input_bytes : prefix_end - input_begin;
const auto * suffix_begin = UTF8StringSource::skipCodePointsBackward(input_end, suffix_size, input_begin);
const auto * suffix_begin = GatherUtils::UTF8StringSource::skipCodePointsBackward(input_end, suffix_size, input_begin);
size_t suffix_bytes = input_end - suffix_begin;
size_t new_res_size = res_data.size() + prefix_bytes + replace_bytes + suffix_bytes + 1; /// +1 for zero terminator
res_data.resize(new_res_size);

View File

@ -1,168 +1,62 @@
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark_SQL
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark CORE
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Spark ANSI SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Structured SQL
Negative test of overlay
Positive test 1 with various combinations of const/non-const columns
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Positive test 2 with various combinations of const/non-const columns
Spark_SQL Spark_SQL和CH
Spark_SQL Spark_SQL和CH
Spark_SQL Spark_SQL和CH
Spark_SQL Spark_SQL和CH
Spark_SQL Spark_SQL和CH
Spark_SQL Spark_SQL和CH
Spark_SQL Spark_SQL和CH
Spark_SQL Spark_SQL和CH
Positive test 3 with various combinations of const/non-const columns
Spark CORE Spark CORECH
Spark CORE Spark CORECH
Spark CORE Spark CORECH
Spark CORE Spark CORECH
Spark CORE Spark CORECH
Spark CORE Spark CORECH
Spark CORE Spark CORECH
Spark CORE Spark CORECH
Positive test 4 with various combinations of const/non-const columns
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Spark ANSI SQL Spark ANSI SQL和CH
Positive test 5 with various combinations of const/non-const columns
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH
Structured SQL Structured SQL和CH

View File

@ -1,60 +1,74 @@
SELECT overlay('Spark SQL', 'ANSI ', 7, 0) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', 7, 0) from numbers(3);
SELECT overlay('Spark SQL', materialize('ANSI '), 7, 0) from numbers(3);
SELECT overlay('Spark SQL', 'ANSI ', materialize(7), 0) from numbers(3);
SELECT overlay('Spark SQL', 'ANSI ', 7, materialize(0)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), 7, 0) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', materialize(7), 0) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', 7, materialize(0)) from numbers(3);
SELECT overlay('Spark SQL', materialize('ANSI '), materialize(7), 0) from numbers(3);
SELECT overlay('Spark SQL', materialize('ANSI '), 7, materialize(0)) from numbers(3);
SELECT overlay('Spark SQL', 'ANSI ', materialize(7), materialize(0)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), materialize(7), 0) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), 7, materialize(0)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', materialize(7), materialize(0)) from numbers(3);
SELECT overlay('Spark SQL', materialize('ANSI '), materialize(7), materialize(0)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), materialize(7), materialize(0)) from numbers(3);
SELECT 'Negative test of overlay';
SELECT overlay('hello', 2); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT overlay('hello', 'world'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT overlay('hello', 'world', 2, 3, 'extra'); -- { serverError NUMBER_OF_ARGUMENTS_DOESNT_MATCH }
SELECT overlay(123, 'world', 2, 3); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
SELECT overlay('hello', 456, 2, 3); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
SELECT overlay('hello', 'world', 'two', 3); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
SELECT overlay('hello', 'world', 2, 'three'); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
SELECT overlay('Spark SQL', '_', 6) from numbers(3);
SELECT overlay(materialize('Spark SQL'), '_', 6) from numbers(3);
SELECT overlay('Spark SQL', materialize('_'), 6) from numbers(3);
SELECT overlay('Spark SQL', '_', materialize(6)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('_'), 6) from numbers(3);
SELECT overlay(materialize('Spark SQL'), '_', materialize(6)) from numbers(3);
SELECT overlay('Spark SQL', materialize('_'), materialize(6)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('_'), materialize(6)) from numbers(3);
SELECT overlay('Spark SQL', 'CORE', 7) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'CORE', 7) from numbers(3);
SELECT overlay('Spark SQL', materialize('CORE'), 7) from numbers(3);
SELECT overlay('Spark SQL', 'CORE', materialize(7)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('CORE'), 7) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'CORE', materialize(7)) from numbers(3);
SELECT overlay('Spark SQL', materialize('CORE'), materialize(7)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('CORE'), materialize(7)) from numbers(3);
SELECT overlay('Spark SQL', 'ANSI ', 7, 0) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', 7, 0) from numbers(3);
SELECT overlay('Spark SQL', materialize('ANSI '), 7, 0) from numbers(3);
SELECT overlay('Spark SQL', 'ANSI ', materialize(7), 0) from numbers(3);
SELECT overlay('Spark SQL', 'ANSI ', 7, materialize(0)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), 7, 0) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', materialize(7), 0) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', 7, materialize(0)) from numbers(3);
SELECT overlay('Spark SQL', materialize('ANSI '), materialize(7), 0) from numbers(3);
SELECT overlay('Spark SQL', materialize('ANSI '), 7, materialize(0)) from numbers(3);
SELECT overlay('Spark SQL', 'ANSI ', materialize(7), materialize(0)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), materialize(7), materialize(0)) from numbers(3);
SELECT overlay('Spark SQL', 'tructured', 2, 4) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'tructured', 2, 4) from numbers(3);
SELECT overlay('Spark SQL', materialize('tructured'), 2, 4) from numbers(3);
SELECT overlay('Spark SQL', 'tructured', materialize(2), 4) from numbers(3);
SELECT overlay('Spark SQL', 'tructured', 2, materialize(4)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('tructured'), 2, 4) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'tructured', materialize(2), 4) from numbers(3);
SELECT overlay(materialize('Spark SQL'), 'tructured', 2, materialize(4)) from numbers(3);
SELECT overlay('Spark SQL', materialize('tructured'), materialize(2), 4) from numbers(3);
SELECT overlay('Spark SQL', materialize('tructured'), 2, materialize(4)) from numbers(3);
SELECT overlay('Spark SQL', 'tructured', materialize(2), materialize(4)) from numbers(3);
SELECT overlay(materialize('Spark SQL'), materialize('tructured'), materialize(2), materialize(4)) from numbers(3);
SELECT 'Positive test 1 with various combinations of const/non-const columns';
SELECT overlay('Spark SQL', 'ANSI ', 7, 0), overlayUTF8('Spark SQL和CH', 'ANSI ', 7, 0);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', 7, 0), overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', 7, 0);
SELECT overlay('Spark SQL', materialize('ANSI '), 7, 0), overlayUTF8('Spark SQL和CH', materialize('ANSI '), 7, 0);
SELECT overlay('Spark SQL', 'ANSI ', materialize(7), 0), overlayUTF8('Spark SQL和CH', 'ANSI ', materialize(7), 0);
SELECT overlay('Spark SQL', 'ANSI ', 7, materialize(0)), overlayUTF8('Spark SQL和CH', 'ANSI ', 7, materialize(0));
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), 7, 0), overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), 7, 0);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', materialize(7), 0), overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', materialize(7), 0);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', 7, materialize(0)), overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', 7, materialize(0));
SELECT overlay('Spark SQL', materialize('ANSI '), materialize(7), 0), overlayUTF8('Spark SQL和CH', materialize('ANSI '), materialize(7), 0);
SELECT overlay('Spark SQL', materialize('ANSI '), 7, materialize(0)), overlayUTF8('Spark SQL和CH', materialize('ANSI '), 7, materialize(0));
SELECT overlay('Spark SQL', 'ANSI ', materialize(7), materialize(0)), overlayUTF8('Spark SQL和CH', 'ANSI ', materialize(7), materialize(0));
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), materialize(7), 0), overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), materialize(7), 0);
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), 7, materialize(0)), overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), 7, materialize(0));
SELECT overlay(materialize('Spark SQL'), 'ANSI ', materialize(7), materialize(0)), overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', materialize(7), materialize(0));
SELECT overlay('Spark SQL', materialize('ANSI '), materialize(7), materialize(0)), overlayUTF8('Spark SQL和CH', materialize('ANSI '), materialize(7), materialize(0));
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), materialize(7), materialize(0)), overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), materialize(7), materialize(0));
SELECT 'Positive test 2 with various combinations of const/non-const columns';
SELECT overlay('Spark SQL', '_', 6), overlayUTF8('Spark SQL和CH', '_', 6);
SELECT overlay(materialize('Spark SQL'), '_', 6), overlayUTF8(materialize('Spark SQL和CH'), '_', 6);
SELECT overlay('Spark SQL', materialize('_'), 6), overlayUTF8('Spark SQL和CH', materialize('_'), 6);
SELECT overlay('Spark SQL', '_', materialize(6)), overlayUTF8('Spark SQL和CH', '_', materialize(6));
SELECT overlay(materialize('Spark SQL'), materialize('_'), 6), overlayUTF8(materialize('Spark SQL和CH'), materialize('_'), 6);
SELECT overlay(materialize('Spark SQL'), '_', materialize(6)), overlayUTF8(materialize('Spark SQL和CH'), '_', materialize(6));
SELECT overlay('Spark SQL', materialize('_'), materialize(6)), overlayUTF8('Spark SQL和CH', materialize('_'), materialize(6));
SELECT overlay(materialize('Spark SQL'), materialize('_'), materialize(6)), overlayUTF8(materialize('Spark SQL和CH'), materialize('_'), materialize(6));
SELECT 'Positive test 3 with various combinations of const/non-const columns';
SELECT overlay('Spark SQL', 'CORE', 7), overlayUTF8('Spark SQL和CH', 'CORE', 7);
SELECT overlay(materialize('Spark SQL'), 'CORE', 7), overlayUTF8(materialize('Spark SQL和CH'), 'CORE', 7);
SELECT overlay('Spark SQL', materialize('CORE'), 7), overlayUTF8('Spark SQL和CH', materialize('CORE'), 7);
SELECT overlay('Spark SQL', 'CORE', materialize(7)), overlayUTF8('Spark SQL和CH', 'CORE', materialize(7));
SELECT overlay(materialize('Spark SQL'), materialize('CORE'), 7), overlayUTF8(materialize('Spark SQL和CH'), materialize('CORE'), 7);
SELECT overlay(materialize('Spark SQL'), 'CORE', materialize(7)), overlayUTF8(materialize('Spark SQL和CH'), 'CORE', materialize(7));
SELECT overlay('Spark SQL', materialize('CORE'), materialize(7)), overlayUTF8('Spark SQL和CH', materialize('CORE'), materialize(7));
SELECT overlay(materialize('Spark SQL'), materialize('CORE'), materialize(7)), overlayUTF8(materialize('Spark SQL和CH'), materialize('CORE'), materialize(7));
SELECT 'Positive test 4 with various combinations of const/non-const columns';
SELECT overlay('Spark SQL', 'ANSI ', 7, 0), overlayUTF8('Spark SQL和CH', 'ANSI ', 7, 0);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', 7, 0), overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', 7, 0);
SELECT overlay('Spark SQL', materialize('ANSI '), 7, 0), overlayUTF8('Spark SQL和CH', materialize('ANSI '), 7, 0);
SELECT overlay('Spark SQL', 'ANSI ', materialize(7), 0), overlayUTF8('Spark SQL和CH', 'ANSI ', materialize(7), 0);
SELECT overlay('Spark SQL', 'ANSI ', 7, materialize(0)), overlayUTF8('Spark SQL和CH', 'ANSI ', 7, materialize(0));
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), 7, 0), overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), 7, 0);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', materialize(7), 0), overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', materialize(7), 0);
SELECT overlay(materialize('Spark SQL'), 'ANSI ', 7, materialize(0)), overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', 7, materialize(0));
SELECT overlay('Spark SQL', materialize('ANSI '), materialize(7), 0), overlayUTF8('Spark SQL和CH', materialize('ANSI '), materialize(7), 0);
SELECT overlay('Spark SQL', materialize('ANSI '), 7, materialize(0)), overlayUTF8('Spark SQL和CH', materialize('ANSI '), 7, materialize(0));
SELECT overlay('Spark SQL', 'ANSI ', materialize(7), materialize(0)), overlayUTF8('Spark SQL和CH', 'ANSI ', materialize(7), materialize(0));
SELECT overlay(materialize('Spark SQL'), materialize('ANSI '), materialize(7), materialize(0)), overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), materialize(7), materialize(0));
SELECT 'Positive test 5 with various combinations of const/non-const columns';
SELECT overlay('Spark SQL', 'tructured', 2, 4), overlayUTF8('Spark SQL和CH', 'tructured', 2, 4);
SELECT overlay(materialize('Spark SQL'), 'tructured', 2, 4), overlayUTF8(materialize('Spark SQL和CH'), 'tructured', 2, 4);
SELECT overlay('Spark SQL', materialize('tructured'), 2, 4), overlayUTF8('Spark SQL和CH', materialize('tructured'), 2, 4);
SELECT overlay('Spark SQL', 'tructured', materialize(2), 4), overlayUTF8('Spark SQL和CH', 'tructured', materialize(2), 4);
SELECT overlay('Spark SQL', 'tructured', 2, materialize(4)), overlayUTF8('Spark SQL和CH', 'tructured', 2, materialize(4));
SELECT overlay(materialize('Spark SQL'), materialize('tructured'), 2, 4), overlayUTF8(materialize('Spark SQL和CH'), materialize('tructured'), 2, 4);
SELECT overlay(materialize('Spark SQL'), 'tructured', materialize(2), 4), overlayUTF8(materialize('Spark SQL和CH'), 'tructured', materialize(2), 4);
SELECT overlay(materialize('Spark SQL'), 'tructured', 2, materialize(4)), overlayUTF8(materialize('Spark SQL和CH'), 'tructured', 2, materialize(4));
SELECT overlay('Spark SQL', materialize('tructured'), materialize(2), 4), overlayUTF8('Spark SQL和CH', materialize('tructured'), materialize(2), 4);
SELECT overlay('Spark SQL', materialize('tructured'), 2, materialize(4)), overlayUTF8('Spark SQL和CH', materialize('tructured'), 2, materialize(4));
SELECT overlay('Spark SQL', 'tructured', materialize(2), materialize(4)), overlayUTF8('Spark SQL和CH', 'tructured', materialize(2), materialize(4));
SELECT overlay(materialize('Spark SQL'), materialize('tructured'), materialize(2), materialize(4)), overlayUTF8(materialize('Spark SQL和CH'), materialize('tructured'), materialize(2), materialize(4));

View File

@ -1,168 +0,0 @@
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark_SQL和CH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark CORECH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Spark ANSI SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH
Structured SQL和CH

View File

@ -1,60 +0,0 @@
SELECT overlayUTF8('Spark SQL和CH', 'ANSI ', 7, 0) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', 7, 0) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('ANSI '), 7, 0) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'ANSI ', materialize(7), 0) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'ANSI ', 7, materialize(0)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), 7, 0) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', materialize(7), 0) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', 7, materialize(0)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('ANSI '), materialize(7), 0) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('ANSI '), 7, materialize(0)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'ANSI ', materialize(7), materialize(0)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), materialize(7), 0) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), 7, materialize(0)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', materialize(7), materialize(0)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('ANSI '), materialize(7), materialize(0)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), materialize(7), materialize(0)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', '_', 6) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), '_', 6) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('_'), 6) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', '_', materialize(6)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('_'), 6) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), '_', materialize(6)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('_'), materialize(6)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('_'), materialize(6)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'CORE', 7) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'CORE', 7) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('CORE'), 7) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'CORE', materialize(7)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('CORE'), 7) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'CORE', materialize(7)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('CORE'), materialize(7)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('CORE'), materialize(7)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'ANSI ', 7, 0) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', 7, 0) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('ANSI '), 7, 0) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'ANSI ', materialize(7), 0) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'ANSI ', 7, materialize(0)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), 7, 0) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', materialize(7), 0) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'ANSI ', 7, materialize(0)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('ANSI '), materialize(7), 0) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('ANSI '), 7, materialize(0)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'ANSI ', materialize(7), materialize(0)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('ANSI '), materialize(7), materialize(0)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'tructured', 2, 4) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'tructured', 2, 4) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('tructured'), 2, 4) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'tructured', materialize(2), 4) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'tructured', 2, materialize(4)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('tructured'), 2, 4) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'tructured', materialize(2), 4) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), 'tructured', 2, materialize(4)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('tructured'), materialize(2), 4) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', materialize('tructured'), 2, materialize(4)) from numbers(3);
SELECT overlayUTF8('Spark SQL和CH', 'tructured', materialize(2), materialize(4)) from numbers(3);
SELECT overlayUTF8(materialize('Spark SQL和CH'), materialize('tructured'), materialize(2), materialize(4)) from numbers(3);