make implementation clear and add more test

This commit is contained in:
RogerYK 2022-01-11 23:22:16 +08:00
parent 86db17e70f
commit 8707e3bea1
6 changed files with 795 additions and 589 deletions

View File

@ -135,7 +135,8 @@ bitSlice(s, offset[, length])
- `offset` — The start index with bit, A positive value indicates an offset on the left, and a negative value is an
indent on the right. Numbering of the bits begins with 1.
- `length` — The length of substring with bit. If you specify a negative value, the function returns an open substring [
offset, array_length - length). If you omit the value, the function returns the substring [offset, the_end_string]
offset, array_length - length). If you omit the value, the function returns the substring [offset, the_end_string].
If length exceeds s, it will be truncate.If length isn't multiple of 8, will fill 0 on the right.
**Returned value**
@ -147,6 +148,9 @@ Query:
``` sql
select bin('Hello'), bin(bitSlice('Hello', 1, 8))
select bin('Hello'), bin(bitSlice('Hello', 1, 2))
select bin('Hello'), bin(bitSlice('Hello', 1, 9))
select bin('Hello'), bin(bitSlice('Hello', -4, 8))
```
Result:
@ -155,6 +159,15 @@ Result:
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 8))─┐
│ 0100100001100101011011000110110001101111 │ 01001000 │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 2))─┐
│ 0100100001100101011011000110110001101111 │ 01000000 │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', 1, 9))─┐
│ 0100100001100101011011000110110001101111 │ 0100100000000000 │
└──────────────────────────────────────────┴──────────────────────────────┘
┌─bin('Hello')─────────────────────────────┬─bin(bitSlice('Hello', -4, 8))─┐
│ 0100100001100101011011000110110001101111 │ 11110000 │
└──────────────────────────────────────────┴───────────────────────────────┘
```
## bitTest {#bittest}

View File

@ -39,6 +39,8 @@ public:
bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo & /*arguments*/) const override { return true; }
bool useDefaultImplementationForConstants() const override { return true; }
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
{
const size_t number_of_arguments = arguments.size();
@ -76,62 +78,44 @@ public:
ColumnPtr column_start = arguments[1].column;
ColumnPtr column_length;
std::optional<Int64> start_const;
std::optional<Int64> length_const;
if (const auto *column_start_const = checkAndGetColumn<ColumnConst>(column_start.get())) {
start_const = column_start_const->getInt(0);
}
if (number_of_arguments == 3)
{
column_length = arguments[2].column;
if (const auto *column_length_const = checkAndGetColumn<ColumnConst>(column_length.get()))
length_const = column_length_const->getInt(0);
}
const ColumnConst * column_start_const = checkAndGetColumn<ColumnConst>(column_start.get());
const ColumnConst * column_length_const = nullptr;
if (number_of_arguments == 3)
column_length_const = checkAndGetColumn<ColumnConst>(column_length.get());
Int64 start_value = 0;
Int64 length_value = 0;
if (column_start_const)
start_value = column_start_const->getInt(0);
if (column_length_const)
length_value = column_length_const->getInt(0);
if (const ColumnString * col = checkAndGetColumn<ColumnString>(column_string.get()))
return executeForSource(
column_start,
column_length,
column_start_const,
column_length_const,
start_value,
length_value,
column_length, start_const, length_const,
StringSource(*col),
input_rows_count);
else if (const ColumnFixedString * col_fixed = checkAndGetColumn<ColumnFixedString>(column_string.get()))
return executeForSource(
column_start,
column_length,
column_start_const,
column_length_const,
start_value,
length_value,
column_length, start_const, length_const,
FixedStringSource(*col_fixed),
input_rows_count);
else if (const ColumnConst * col_const = checkAndGetColumnConst<ColumnString>(column_string.get()))
return executeForSource(
column_start,
column_length,
column_start_const,
column_length_const,
start_value,
length_value,
column_length, start_const, length_const,
ConstSource<StringSource>(*col_const),
input_rows_count);
else if (const ColumnConst * col_const_fixed = checkAndGetColumnConst<ColumnFixedString>(column_string.get()))
return executeForSource(
column_start,
column_length,
column_start_const,
column_length_const,
start_value,
length_value,
column_length, start_const, length_const,
ConstSource<FixedStringSource>(*col_const_fixed),
input_rows_count);
else
@ -144,10 +128,8 @@ public:
ColumnPtr executeForSource(
const ColumnPtr & column_start,
const ColumnPtr & column_length,
const ColumnConst * column_start_const,
const ColumnConst * column_length_const,
Int64 start_value,
Int64 length_value,
std::optional<Int64> start_const,
std::optional<Int64> length_const,
Source && source,
size_t input_rows_count) const
{
@ -155,14 +137,15 @@ public:
if (!column_length)
{
if (column_start_const)
if (start_const)
{
Int64 start_value = start_const.value();
if (start_value > 0)
bitSliceFromLeftConstantOffsetUnbounded(
source, StringSink(*col_res, input_rows_count), static_cast<size_t>(start_value - 1));
else if (start_value < 0)
bitSliceFromRightConstantOffsetUnbounded(
source, StringSink(*col_res, input_rows_count), -static_cast<size_t>(start_value));
source, StringSink(*col_res, input_rows_count), static_cast<size_t>(-start_value));
else
throw Exception("Indices in strings are 1-based", ErrorCodes::ZERO_ARRAY_OR_TUPLE_INDEX);
}
@ -171,14 +154,16 @@ public:
}
else
{
if (column_start_const && column_length_const)
if (start_const && length_const)
{
Int64 start_value = start_const.value();
Int64 length_value = length_const.value();
if (start_value > 0)
bitSliceFromLeftConstantOffsetBounded(
source, StringSink(*col_res, input_rows_count), static_cast<size_t>(start_value - 1), length_value);
else if (start_value < 0)
bitSliceFromRightConstantOffsetBounded(
source, StringSink(*col_res, input_rows_count), -static_cast<size_t>(start_value), length_value);
source, StringSink(*col_res, input_rows_count), static_cast<size_t>(-start_value), length_value);
else
throw Exception("Indices in strings are 1-based", ErrorCodes::ZERO_ARRAY_OR_TUPLE_INDEX);
}
@ -265,16 +250,10 @@ public:
template <class Source>
void bitSliceDynamicOffsetUnbounded(Source && src, StringSink && sink, const IColumn & offset_column) const
{
const bool is_null = offset_column.onlyNull();
const auto * nullable = typeid_cast<const ColumnNullable *>(&offset_column);
const ColumnUInt8::Container * null_map = nullable ? &nullable->getNullMapData() : nullptr;
const IColumn * nested_column = nullable ? &nullable->getNestedColumn() : &offset_column;
while (!src.isEnd())
{
auto row_num = src.rowNum();
bool has_offset = !is_null && (null_map && (*null_map)[row_num]);
Int64 start = has_offset ? nested_column->getInt(row_num) : 1;
Int64 start = offset_column.getInt(row_num);
if (start != 0)
{
typename std::decay_t<Source>::Slice slice;
@ -390,36 +369,21 @@ public:
template <class Source>
void bitSliceDynamicOffsetBounded(Source && src, StringSink && sink, const IColumn & offset_column, const IColumn & length_column) const
{
const bool is_offset_null = offset_column.onlyNull();
const auto * offset_nullable = typeid_cast<const ColumnNullable *>(&offset_column);
const ColumnUInt8::Container * offset_null_map = offset_nullable ? &offset_nullable->getNullMapData() : nullptr;
const IColumn * offset_nested_column = offset_nullable ? &offset_nullable->getNestedColumn() : &offset_column;
const bool is_length_null = length_column.onlyNull();
const auto * length_nullable = typeid_cast<const ColumnNullable *>(&length_column);
const ColumnUInt8::Container * length_null_map = length_nullable ? &length_nullable->getNullMapData() : nullptr;
const IColumn * length_nested_column = length_nullable ? &length_nullable->getNestedColumn() : &length_column;
while (!src.isEnd())
{
size_t row_num = src.rowNum();
bool has_offset = !is_offset_null && !(offset_null_map && (*offset_null_map)[row_num]);
bool has_length = !is_length_null && !(length_null_map && (*length_null_map)[row_num]);
Int64 start = has_offset ? offset_nested_column->getInt(row_num) : 1;
Int64 length = has_length ? length_nested_column->getInt(row_num) : static_cast<Int64>(src.getElementSize());
Int64 start = offset_column.getInt(row_num);
Int64 length = length_column.getInt(row_num);
if (start && length)
{
bool left_offset = start > 0;
size_t offset = left_offset ? start - 1 : -start;
size_t size = src.getElementSize();
size_t offset_byte;
size_t offset_bit;
size_t shift_bit;
size_t length_byte;
size_t over_bit;
size_t size = src.getElementSize();
if (left_offset)
{
offset_byte = offset / word_size;
@ -437,6 +401,9 @@ public:
}
ssize_t remain_byte = left_offset ? size - offset_byte : offset_byte;
size_t length_byte;
size_t over_bit;
if (length > 0)
{
length_byte = (length + offset_bit) / word_size;
@ -459,7 +426,6 @@ public:
writeSliceWithLeftShift(slice, sink, shift_bit, abandon_last_bit);
}
sink.next();
src.next();
}

View File

@ -1,163 +1,244 @@
Const Offset
1 01001000011001010110110001101100011011110000000000000000000000000000000000000000 01001000011001010110110001101100011011110000000000000000000000000000000000000000
2 1001000011001010110110001101100011011110000000000000000000000000000000000000000 10010000110010101101100011011000110111100000000000000000000000000000000000000000
3 001000011001010110110001101100011011110000000000000000000000000000000000000000 00100001100101011011000110110001101111000000000000000000000000000000000000000000
4 01000011001010110110001101100011011110000000000000000000000000000000000000000 01000011001010110110001101100011011110000000000000000000000000000000000000000000
5 1000011001010110110001101100011011110000000000000000000000000000000000000000 10000110010101101100011011000110111100000000000000000000000000000000000000000000
6 000011001010110110001101100011011110000000000000000000000000000000000000000 00001100101011011000110110001101111000000000000000000000000000000000000000000000
7 00011001010110110001101100011011110000000000000000000000000000000000000000 00011001010110110001101100011011110000000000000000000000000000000000000000000000
8 0011001010110110001101100011011110000000000000000000000000000000000000000 00110010101101100011011000110111100000000000000000000000000000000000000000000000
9 011001010110110001101100011011110000000000000000000000000000000000000000 011001010110110001101100011011110000000000000000000000000000000000000000
10 11001010110110001101100011011110000000000000000000000000000000000000000 110010101101100011011000110111100000000000000000000000000000000000000000
11 1001010110110001101100011011110000000000000000000000000000000000000000 100101011011000110110001101111000000000000000000000000000000000000000000
12 001010110110001101100011011110000000000000000000000000000000000000000 001010110110001101100011011110000000000000000000000000000000000000000000
13 01010110110001101100011011110000000000000000000000000000000000000000 010101101100011011000110111100000000000000000000000000000000000000000000
14 1010110110001101100011011110000000000000000000000000000000000000000 101011011000110110001101111000000000000000000000000000000000000000000000
15 010110110001101100011011110000000000000000000000000000000000000000 010110110001101100011011110000000000000000000000000000000000000000000000
16 10110110001101100011011110000000000000000000000000000000000000000 101101100011011000110111100000000000000000000000000000000000000000000000
-1 0 00000000
-2 00 00000000
-3 000 00000000
-4 0000 00000000
-5 00000 00000000
-6 000000 00000000
-7 0000000 00000000
-8 00000000 00000000
-9 000000000 0000000000000000
-10 0000000000 0000000000000000
-11 00000000000 0000000000000000
-12 000000000000 0000000000000000
-13 0000000000000 0000000000000000
-14 00000000000000 0000000000000000
-15 000000000000000 0000000000000000
-16 0000000000000000 0000000000000000
1 Hello\0 010010000110010101101100011011000110111100000000 010010000110010101101100011011000110111100000000
2 Hello\0 10010000110010101101100011011000110111100000000 100100001100101011011000110110001101111000000000
3 Hello\0 0010000110010101101100011011000110111100000000 001000011001010110110001101100011011110000000000
4 Hello\0 010000110010101101100011011000110111100000000 010000110010101101100011011000110111100000000000
5 Hello\0 10000110010101101100011011000110111100000000 100001100101011011000110110001101111000000000000
6 Hello\0 0000110010101101100011011000110111100000000 000011001010110110001101100011011110000000000000
7 Hello\0 000110010101101100011011000110111100000000 000110010101101100011011000110111100000000000000
8 Hello\0 00110010101101100011011000110111100000000 001100101011011000110110001101111000000000000000
9 Hello\0 0110010101101100011011000110111100000000 0110010101101100011011000110111100000000
10 Hello\0 110010101101100011011000110111100000000 1100101011011000110110001101111000000000
11 Hello\0 10010101101100011011000110111100000000 1001010110110001101100011011110000000000
12 Hello\0 0010101101100011011000110111100000000 0010101101100011011000110111100000000000
13 Hello\0 010101101100011011000110111100000000 0101011011000110110001101111000000000000
14 Hello\0 10101101100011011000110111100000000 1010110110001101100011011110000000000000
15 Hello\0 0101101100011011000110111100000000 0101101100011011000110111100000000000000
16 Hello\0 101101100011011000110111100000000 1011011000110110001101111000000000000000
-1 Hello\0 0 00000000
-2 Hello\0 00 00000000
-3 Hello\0 000 00000000
-4 Hello\0 0000 00000000
-5 Hello\0 00000 00000000
-6 Hello\0 000000 00000000
-7 Hello\0 0000000 00000000
-8 Hello\0 00000000 00000000
-9 Hello\0 100000000 1000000000000000
-10 Hello\0 1100000000 1100000000000000
-11 Hello\0 11100000000 1110000000000000
-12 Hello\0 111100000000 1111000000000000
-13 Hello\0 0111100000000 0111100000000000
-14 Hello\0 10111100000000 1011110000000000
-15 Hello\0 110111100000000 1101111000000000
-16 Hello\0 0110111100000000 0110111100000000
Const Truncate Offset
49 Hello\0
-49 Hello\0 010010000110010101101100011011000110111100000000 010010000110010101101100011011000110111100000000
Const Nullable Offset
1 \N \N \N
\N Hello\0 \N \N
\N \N \N \N
Const Offset, Const Length
1 1 0 00000000
2 2 10 10000000
3 3 001 00100000
4 4 0100 01000000
5 5 10000 10000000
6 6 000011 00001100
7 7 0001100 00011000
8 8 00110010 00110010
9 9 011001010 0110010100000000
10 10 1100101011 1100101011000000
11 11 10010101101 1001010110100000
12 12 001010110110 0010101101100000
13 13 0101011011000 0101011011000000
14 14 10101101100011 1010110110001100
15 15 010110110001101 0101101100011010
16 16 1011011000110110 1011011000110110
1 -1 0100100001100101011011000110110001101111000000000000000000000000000000000000000 01001000011001010110110001101100011011110000000000000000000000000000000000000000
2 -2 10010000110010101101100011011000110111100000000000000000000000000000000000000 10010000110010101101100011011000110111100000000000000000000000000000000000000000
3 -3 001000011001010110110001101100011011110000000000000000000000000000000000000 00100001100101011011000110110001101111000000000000000000000000000000000000000000
4 -4 0100001100101011011000110110001101111000000000000000000000000000000000000 01000011001010110110001101100011011110000000000000000000000000000000000000000000
5 -5 10000110010101101100011011000110111100000000000000000000000000000000000 100001100101011011000110110001101111000000000000000000000000000000000000
6 -6 000011001010110110001101100011011110000000000000000000000000000000000 000011001010110110001101100011011110000000000000000000000000000000000000
7 -7 0001100101011011000110110001101111000000000000000000000000000000000 000110010101101100011011000110111100000000000000000000000000000000000000
8 -8 00110010101101100011011000110111100000000000000000000000000000000 001100101011011000110110001101111000000000000000000000000000000000000000
9 -9 011001010110110001101100011011110000000000000000000000000000000 0110010101101100011011000110111100000000000000000000000000000000
10 -10 1100101011011000110110001101111000000000000000000000000000000 1100101011011000110110001101111000000000000000000000000000000000
11 -11 10010101101100011011000110111100000000000000000000000000000 1001010110110001101100011011110000000000000000000000000000000000
12 -12 001010110110001101100011011110000000000000000000000000000 0010101101100011011000110111100000000000000000000000000000000000
13 -13 0101011011000110110001101111000000000000000000000000000 01010110110001101100011011110000000000000000000000000000
14 -14 10101101100011011000110111100000000000000000000000000 10101101100011011000110111100000000000000000000000000000
15 -15 010110110001101100011011110000000000000000000000000 01011011000110110001101111000000000000000000000000000000
16 -16 1011011000110110001101111000000000000000000000000 10110110001101100011011110000000000000000000000000000000
-1 1 0 00000000
-2 2 00 00000000
-3 3 000 00000000
-4 4 0000 00000000
-5 5 00000 00000000
-6 6 000000 00000000
-7 7 0000000 00000000
-8 8 00000000 00000000
-9 9 000000000 0000000000000000
-10 10 0000000000 0000000000000000
-11 11 00000000000 0000000000000000
-12 12 000000000000 0000000000000000
-13 13 0000000000000 0000000000000000
-14 14 00000000000000 0000000000000000
-15 15 000000000000000 0000000000000000
-16 16 0000000000000000 0000000000000000
-1 -16
-2 -15
-3 -14
-4 -13
-5 -12
-6 -11
-7 -10
-8 -9
-9 -8 0 00000000
-10 -7 000 00000000
-11 -6 00000 00000000
-12 -5 0000000 00000000
-13 -4 000000000 0000000000000000
-14 -3 00000000000 0000000000000000
-15 -2 0000000000000 0000000000000000
-16 -1 000000000000000 0000000000000000
1 1 Hello\0 0 00000000
2 2 Hello\0 10 10000000
3 3 Hello\0 001 00100000
4 4 Hello\0 0100 01000000
5 5 Hello\0 10000 10000000
6 6 Hello\0 000011 00001100
7 7 Hello\0 0001100 00011000
8 8 Hello\0 00110010 00110010
9 9 Hello\0 011001010 0110010100000000
10 10 Hello\0 1100101011 1100101011000000
11 11 Hello\0 10010101101 1001010110100000
12 12 Hello\0 001010110110 0010101101100000
13 13 Hello\0 0101011011000 0101011011000000
14 14 Hello\0 10101101100011 1010110110001100
15 15 Hello\0 010110110001101 0101101100011010
16 16 Hello\0 1011011000110110 1011011000110110
1 -1 Hello\0 01001000011001010110110001101100011011110000000 010010000110010101101100011011000110111100000000
2 -2 Hello\0 100100001100101011011000110110001101111000000 100100001100101011011000110110001101111000000000
3 -3 Hello\0 0010000110010101101100011011000110111100000 001000011001010110110001101100011011110000000000
4 -4 Hello\0 01000011001010110110001101100011011110000 010000110010101101100011011000110111100000000000
5 -5 Hello\0 100001100101011011000110110001101111000 1000011001010110110001101100011011110000
6 -6 Hello\0 0000110010101101100011011000110111100 0000110010101101100011011000110111100000
7 -7 Hello\0 00011001010110110001101100011011110 0001100101011011000110110001101111000000
8 -8 Hello\0 001100101011011000110110001101111 0011001010110110001101100011011110000000
9 -9 Hello\0 0110010101101100011011000110111 01100101011011000110110001101110
10 -10 Hello\0 11001010110110001101100011011 11001010110110001101100011011000
11 -11 Hello\0 100101011011000110110001101 10010101101100011011000110100000
12 -12 Hello\0 0010101101100011011000110 00101011011000110110001100000000
13 -13 Hello\0 01010110110001101100011 010101101100011011000110
14 -14 Hello\0 101011011000110110001 101011011000110110001000
15 -15 Hello\0 0101101100011011000 010110110001101100000000
16 -16 Hello\0 10110110001101100 101101100011011000000000
-1 1 Hello\0 0 00000000
-2 2 Hello\0 00 00000000
-3 3 Hello\0 000 00000000
-4 4 Hello\0 0000 00000000
-5 5 Hello\0 00000 00000000
-6 6 Hello\0 000000 00000000
-7 7 Hello\0 0000000 00000000
-8 8 Hello\0 00000000 00000000
-9 9 Hello\0 100000000 1000000000000000
-10 10 Hello\0 1100000000 1100000000000000
-11 11 Hello\0 11100000000 1110000000000000
-12 12 Hello\0 111100000000 1111000000000000
-13 13 Hello\0 0111100000000 0111100000000000
-14 14 Hello\0 10111100000000 1011110000000000
-15 15 Hello\0 110111100000000 1101111000000000
-16 16 Hello\0 0110111100000000 0110111100000000
-1 -16 Hello\0
-2 -15 Hello\0
-3 -14 Hello\0
-4 -13 Hello\0
-5 -12 Hello\0
-6 -11 Hello\0
-7 -10 Hello\0
-8 -9 Hello\0
-9 -8 Hello\0 1 10000000
-10 -7 Hello\0 110 11000000
-11 -6 Hello\0 11100 11100000
-12 -5 Hello\0 1111000 11110000
-13 -4 Hello\0 011110000 0111100000000000
-14 -3 Hello\0 10111100000 1011110000000000
-15 -2 Hello\0 1101111000000 1101111000000000
-16 -1 Hello\0 011011110000000 0110111100000000
Const Truncate Offset, Const Truncate Length
36 16 Hello\0 0111100000000 0111100000000000
49 1 Hello\0
-52 -44 Hello\0 0100 01000000
-49 -48 Hello\0
-49 49 Hello\0 010010000110010101101100011011000110111100000000 010010000110010101101100011011000110111100000000
Const Nullable Offset, Const Nullable Length
1 1 \N \N \N
\N 1 Hello\0 \N \N
1 \N Hello\0 \N \N
\N \N \N \N \N
Dynamic Offset, Dynamic Length
0 0
1 1 0 00000000
2 2 10 10000000
3 3 001 00100000
4 4 0100 01000000
5 5 10000 10000000
6 6 000011 00001100
7 7 0001100 00011000
8 8 00110010 00110010
9 9 011001010 0110010100000000
10 10 1100101011 1100101011000000
11 11 10010101101 1001010110100000
12 12 001010110110 0010101101100000
13 13 0101011011000 0101011011000000
14 14 10101101100011 1010110110001100
15 15 010110110001101 0101101100011010
0 0
1 -1 0100100001100101011011000110110001101111000000000000000000000000000000000000000 01001000011001010110110001101100011011110000000000000000000000000000000000000000
2 -2 10010000110010101101100011011000110111100000000000000000000000000000000000000 10010000110010101101100011011000110111100000000000000000000000000000000000000000
3 -3 001000011001010110110001101100011011110000000000000000000000000000000000000 00100001100101011011000110110001101111000000000000000000000000000000000000000000
4 -4 0100001100101011011000110110001101111000000000000000000000000000000000000 01000011001010110110001101100011011110000000000000000000000000000000000000000000
5 -5 10000110010101101100011011000110111100000000000000000000000000000000000 100001100101011011000110110001101111000000000000000000000000000000000000
6 -6 000011001010110110001101100011011110000000000000000000000000000000000 000011001010110110001101100011011110000000000000000000000000000000000000
7 -7 0001100101011011000110110001101111000000000000000000000000000000000 000110010101101100011011000110111100000000000000000000000000000000000000
8 -8 00110010101101100011011000110111100000000000000000000000000000000 001100101011011000110110001101111000000000000000000000000000000000000000
9 -9 011001010110110001101100011011110000000000000000000000000000000 0110010101101100011011000110111100000000000000000000000000000000
10 -10 1100101011011000110110001101111000000000000000000000000000000 1100101011011000110110001101111000000000000000000000000000000000
11 -11 10010101101100011011000110111100000000000000000000000000000 1001010110110001101100011011110000000000000000000000000000000000
12 -12 001010110110001101100011011110000000000000000000000000000 0010101101100011011000110111100000000000000000000000000000000000
13 -13 0101011011000110110001101111000000000000000000000000000 01010110110001101100011011110000000000000000000000000000
14 -14 10101101100011011000110111100000000000000000000000000 10101101100011011000110111100000000000000000000000000000
15 -15 010110110001101100011011110000000000000000000000000 01011011000110110001101111000000000000000000000000000000
0 -16
-1 -15
-2 -14
-3 -13
-4 -12
-5 -11
-6 -10
-7 -9
-8 -8
-9 -7 00 00000000
-10 -6 0000 00000000
-11 -5 000000 00000000
-12 -4 00000000 00000000
-13 -3 0000000000 0000000000000000
-14 -2 000000000000 0000000000000000
-15 -1 00000000000000 0000000000000000
0 0
-1 1 0 00000000
-2 2 00 00000000
-3 3 000 00000000
-4 4 0000 00000000
-5 5 00000 00000000
-6 6 000000 00000000
-7 7 0000000 00000000
-8 8 00000000 00000000
-9 9 000000000 0000000000000000
-10 10 0000000000 0000000000000000
-11 11 00000000000 0000000000000000
-12 12 000000000000 0000000000000000
-13 13 0000000000000 0000000000000000
-14 14 00000000000000 0000000000000000
-15 15 000000000000000 0000000000000000
0 0 Hello\0
1 1 Hello\0 0 00000000
2 2 Hello\0 10 10000000
3 3 Hello\0 001 00100000
4 4 Hello\0 0100 01000000
5 5 Hello\0 10000 10000000
6 6 Hello\0 000011 00001100
7 7 Hello\0 0001100 00011000
8 8 Hello\0 00110010 00110010
9 9 Hello\0 011001010 0110010100000000
10 10 Hello\0 1100101011 1100101011000000
11 11 Hello\0 10010101101 1001010110100000
12 12 Hello\0 001010110110 0010101101100000
13 13 Hello\0 0101011011000 0101011011000000
14 14 Hello\0 10101101100011 1010110110001100
15 15 Hello\0 010110110001101 0101101100011010
0 0 Hello\0
1 -1 Hello\0 01001000011001010110110001101100011011110000000 010010000110010101101100011011000110111100000000
2 -2 Hello\0 100100001100101011011000110110001101111000000 100100001100101011011000110110001101111000000000
3 -3 Hello\0 0010000110010101101100011011000110111100000 001000011001010110110001101100011011110000000000
4 -4 Hello\0 01000011001010110110001101100011011110000 010000110010101101100011011000110111100000000000
5 -5 Hello\0 100001100101011011000110110001101111000 1000011001010110110001101100011011110000
6 -6 Hello\0 0000110010101101100011011000110111100 0000110010101101100011011000110111100000
7 -7 Hello\0 00011001010110110001101100011011110 0001100101011011000110110001101111000000
8 -8 Hello\0 001100101011011000110110001101111 0011001010110110001101100011011110000000
9 -9 Hello\0 0110010101101100011011000110111 01100101011011000110110001101110
10 -10 Hello\0 11001010110110001101100011011 11001010110110001101100011011000
11 -11 Hello\0 100101011011000110110001101 10010101101100011011000110100000
12 -12 Hello\0 0010101101100011011000110 00101011011000110110001100000000
13 -13 Hello\0 01010110110001101100011 010101101100011011000110
14 -14 Hello\0 101011011000110110001 101011011000110110001000
15 -15 Hello\0 0101101100011011000 010110110001101100000000
0 -16 Hello\0
-1 -15 Hello\0
-2 -14 Hello\0
-3 -13 Hello\0
-4 -12 Hello\0
-5 -11 Hello\0
-6 -10 Hello\0
-7 -9 Hello\0
-8 -8 Hello\0
-9 -7 Hello\0 10 10000000
-10 -6 Hello\0 1100 11000000
-11 -5 Hello\0 111000 11100000
-12 -4 Hello\0 11110000 11110000
-13 -3 Hello\0 0111100000 0111100000000000
-14 -2 Hello\0 101111000000 1011110000000000
-15 -1 Hello\0 11011110000000 1101111000000000
0 0 Hello\0
-1 1 Hello\0 0 00000000
-2 2 Hello\0 00 00000000
-3 3 Hello\0 000 00000000
-4 4 Hello\0 0000 00000000
-5 5 Hello\0 00000 00000000
-6 6 Hello\0 000000 00000000
-7 7 Hello\0 0000000 00000000
-8 8 Hello\0 00000000 00000000
-9 9 Hello\0 100000000 1000000000000000
-10 10 Hello\0 1100000000 1100000000000000
-11 11 Hello\0 11100000000 1110000000000000
-12 12 Hello\0 111100000000 1111000000000000
-13 13 Hello\0 0111100000000 0111100000000000
-14 14 Hello\0 10111100000000 1011110000000000
-15 15 Hello\0 110111100000000 1101111000000000
Dynamic Truncate Offset, Dynamic Truncate Length
-8 8 Hello\0 00000000 00000000
-7 8 Hello\0 0000000 00000000
-6 8 Hello\0 000000 00000000
-5 8 Hello\0 00000 00000000
-4 8 Hello\0 0000 00000000
-3 8 Hello\0 000 00000000
-2 8 Hello\0 00 00000000
-1 8 Hello\0 0 00000000
0 8 Hello\0
-4 0 Hello\0
-4 1 Hello\0 0 00000000
-4 2 Hello\0 00 00000000
-4 3 Hello\0 000 00000000
-4 4 Hello\0 0000 00000000
-4 5 Hello\0 0000 00000000
-4 6 Hello\0 0000 00000000
-4 7 Hello\0 0000 00000000
-4 8 Hello\0 0000 00000000
-44 8 Hello\0 10000110 10000110
-45 8 Hello\0 01000011 01000011
-46 8 Hello\0 00100001 00100001
-47 8 Hello\0 10010000 10010000
-48 8 Hello\0 01001000 01001000
-49 8 Hello\0 0100100 01001000
-50 8 Hello\0 010010 01001000
-51 8 Hello\0 01001 01001000
-52 8 Hello\0 0100 01000000
-52 0 Hello\0
-52 1 Hello\0
-52 2 Hello\0
-52 3 Hello\0
-52 4 Hello\0
-52 5 Hello\0 0 00000000
-52 6 Hello\0 01 01000000
-52 7 Hello\0 010 01000000
-52 8 Hello\0 0100 01000000
-52 48 Hello\0 01001000011001010110110001101100011011110000 010010000110010101101100011011000110111100000000
-52 49 Hello\0 010010000110010101101100011011000110111100000 010010000110010101101100011011000110111100000000
-52 50 Hello\0 0100100001100101011011000110110001101111000000 010010000110010101101100011011000110111100000000
-52 51 Hello\0 01001000011001010110110001101100011011110000000 010010000110010101101100011011000110111100000000
-52 52 Hello\0 010010000110010101101100011011000110111100000000 010010000110010101101100011011000110111100000000
-52 53 Hello\0 010010000110010101101100011011000110111100000000 010010000110010101101100011011000110111100000000
-52 54 Hello\0 010010000110010101101100011011000110111100000000 010010000110010101101100011011000110111100000000
-52 55 Hello\0 010010000110010101101100011011000110111100000000 010010000110010101101100011011000110111100000000
-52 56 Hello\0 010010000110010101101100011011000110111100000000 010010000110010101101100011011000110111100000000
Dynamic Nullable Offset, Dynamic Nullable Length
0 0 Hello\0
\N 1 Hello\0 \N \N
2 \N Hello\0 \N \N
3 3 \N \N \N
4 4 Hello\0 0100 01000000
\N 5 Hello\0 \N \N
6 \N Hello\0 \N \N
\N \N \N \N \N
8 8 Hello\0 00110010 00110010
\N 9 Hello\0 \N \N
10 \N Hello\0 \N \N
11 11 \N \N \N
12 12 Hello\0 001010110110 0010101101100000
\N 13 Hello\0 \N \N
14 \N Hello\0 \N \N
\N \N \N \N \N

View File

@ -1,111 +1,143 @@
SELECT 'Const Offset';
select 1, subString(bin(toFixedString('Hello', 10)), 1), bin(bitSlice(toFixedString('Hello', 10), 1));
select 2, subString(bin(toFixedString('Hello', 10)), 2), bin(bitSlice(toFixedString('Hello', 10), 2));
select 3, subString(bin(toFixedString('Hello', 10)), 3), bin(bitSlice(toFixedString('Hello', 10), 3));
select 4, subString(bin(toFixedString('Hello', 10)), 4), bin(bitSlice(toFixedString('Hello', 10), 4));
select 5, subString(bin(toFixedString('Hello', 10)), 5), bin(bitSlice(toFixedString('Hello', 10), 5));
select 6, subString(bin(toFixedString('Hello', 10)), 6), bin(bitSlice(toFixedString('Hello', 10), 6));
select 7, subString(bin(toFixedString('Hello', 10)), 7), bin(bitSlice(toFixedString('Hello', 10), 7));
select 8, subString(bin(toFixedString('Hello', 10)), 8), bin(bitSlice(toFixedString('Hello', 10), 8));
select 9, subString(bin(toFixedString('Hello', 10)), 9), bin(bitSlice(toFixedString('Hello', 10), 9));
select 10, subString(bin(toFixedString('Hello', 10)), 10), bin(bitSlice(toFixedString('Hello', 10), 10));
select 11, subString(bin(toFixedString('Hello', 10)), 11), bin(bitSlice(toFixedString('Hello', 10), 11));
select 12, subString(bin(toFixedString('Hello', 10)), 12), bin(bitSlice(toFixedString('Hello', 10), 12));
select 13, subString(bin(toFixedString('Hello', 10)), 13), bin(bitSlice(toFixedString('Hello', 10), 13));
select 14, subString(bin(toFixedString('Hello', 10)), 14), bin(bitSlice(toFixedString('Hello', 10), 14));
select 15, subString(bin(toFixedString('Hello', 10)), 15), bin(bitSlice(toFixedString('Hello', 10), 15));
select 16, subString(bin(toFixedString('Hello', 10)), 16), bin(bitSlice(toFixedString('Hello', 10), 16));
select 1 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 2 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 3 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 4 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 5 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 6 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 7 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 8 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 9 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 10 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 11 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 12 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 13 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 14 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 15 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 16 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -1, subString(bin(toFixedString('Hello', 10)), -1), bin(bitSlice(toFixedString('Hello', 10), -1));
select -2, subString(bin(toFixedString('Hello', 10)), -2), bin(bitSlice(toFixedString('Hello', 10), -2));
select -3, subString(bin(toFixedString('Hello', 10)), -3), bin(bitSlice(toFixedString('Hello', 10), -3));
select -4, subString(bin(toFixedString('Hello', 10)), -4), bin(bitSlice(toFixedString('Hello', 10), -4));
select -5, subString(bin(toFixedString('Hello', 10)), -5), bin(bitSlice(toFixedString('Hello', 10), -5));
select -6, subString(bin(toFixedString('Hello', 10)), -6), bin(bitSlice(toFixedString('Hello', 10), -6));
select -7, subString(bin(toFixedString('Hello', 10)), -7), bin(bitSlice(toFixedString('Hello', 10), -7));
select -8, subString(bin(toFixedString('Hello', 10)), -8), bin(bitSlice(toFixedString('Hello', 10), -8));
select -9, subString(bin(toFixedString('Hello', 10)), -9), bin(bitSlice(toFixedString('Hello', 10), -9));
select -10, subString(bin(toFixedString('Hello', 10)), -10), bin(bitSlice(toFixedString('Hello', 10), -10));
select -11, subString(bin(toFixedString('Hello', 10)), -11), bin(bitSlice(toFixedString('Hello', 10), -11));
select -12, subString(bin(toFixedString('Hello', 10)), -12), bin(bitSlice(toFixedString('Hello', 10), -12));
select -13, subString(bin(toFixedString('Hello', 10)), -13), bin(bitSlice(toFixedString('Hello', 10), -13));
select -14, subString(bin(toFixedString('Hello', 10)), -14), bin(bitSlice(toFixedString('Hello', 10), -14));
select -15, subString(bin(toFixedString('Hello', 10)), -15), bin(bitSlice(toFixedString('Hello', 10), -15));
select -16, subString(bin(toFixedString('Hello', 10)), -16), bin(bitSlice(toFixedString('Hello', 10), -16));
select -1 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -2 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -3 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -4 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -5 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -6 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -7 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -8 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -9 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -10 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -11 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -12 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -13 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -14 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -15 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -16 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
SELECT 'Const Truncate Offset';
select 49 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -49 as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
SELECT 'Const Nullable Offset';
select 1 as offset, null as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select null as offset, toFixedString('Hello', 6) as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select null as offset, null as s, subString(bin(s), offset), bin(bitSlice(s, offset));
SELECT 'Const Offset, Const Length';
select 1, 1, subString(bin(toFixedString('Hello', 10)), 1, 1), bin(bitSlice(toFixedString('Hello', 10), 1, 1));
select 2, 2, subString(bin(toFixedString('Hello', 10)), 2, 2), bin(bitSlice(toFixedString('Hello', 10), 2, 2));
select 3, 3, subString(bin(toFixedString('Hello', 10)), 3, 3), bin(bitSlice(toFixedString('Hello', 10), 3, 3));
select 4, 4, subString(bin(toFixedString('Hello', 10)), 4, 4), bin(bitSlice(toFixedString('Hello', 10), 4, 4));
select 5, 5, subString(bin(toFixedString('Hello', 10)), 5, 5), bin(bitSlice(toFixedString('Hello', 10), 5, 5));
select 6, 6, subString(bin(toFixedString('Hello', 10)), 6, 6), bin(bitSlice(toFixedString('Hello', 10), 6, 6));
select 7, 7, subString(bin(toFixedString('Hello', 10)), 7, 7), bin(bitSlice(toFixedString('Hello', 10), 7, 7));
select 8, 8, subString(bin(toFixedString('Hello', 10)), 8, 8), bin(bitSlice(toFixedString('Hello', 10), 8, 8));
select 9, 9, subString(bin(toFixedString('Hello', 10)), 9, 9), bin(bitSlice(toFixedString('Hello', 10), 9, 9));
select 10, 10, subString(bin(toFixedString('Hello', 10)), 10, 10), bin(bitSlice(toFixedString('Hello', 10), 10, 10));
select 11, 11, subString(bin(toFixedString('Hello', 10)), 11, 11), bin(bitSlice(toFixedString('Hello', 10), 11, 11));
select 12, 12, subString(bin(toFixedString('Hello', 10)), 12, 12), bin(bitSlice(toFixedString('Hello', 10), 12, 12));
select 13, 13, subString(bin(toFixedString('Hello', 10)), 13, 13), bin(bitSlice(toFixedString('Hello', 10), 13, 13));
select 14, 14, subString(bin(toFixedString('Hello', 10)), 14, 14), bin(bitSlice(toFixedString('Hello', 10), 14, 14));
select 15, 15, subString(bin(toFixedString('Hello', 10)), 15, 15), bin(bitSlice(toFixedString('Hello', 10), 15, 15));
select 16, 16, subString(bin(toFixedString('Hello', 10)), 16, 16), bin(bitSlice(toFixedString('Hello', 10), 16, 16));
select 1 as offset, 1 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 2 as offset, 2 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 3 as offset, 3 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 4 as offset, 4 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 5 as offset, 5 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 6 as offset, 6 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 7 as offset, 7 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 8 as offset, 8 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 9 as offset, 9 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 10 as offset, 10 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 11 as offset, 11 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 12 as offset, 12 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 13 as offset, 13 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 14 as offset, 14 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 15 as offset, 15 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 16 as offset, 16 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 1, -1, subString(bin(toFixedString('Hello', 10)), 1, -1), bin(bitSlice(toFixedString('Hello', 10), 1, -1));
select 2, -2, subString(bin(toFixedString('Hello', 10)), 2, -2), bin(bitSlice(toFixedString('Hello', 10), 2, -2));
select 3, -3, subString(bin(toFixedString('Hello', 10)), 3, -3), bin(bitSlice(toFixedString('Hello', 10), 3, -3));
select 4, -4, subString(bin(toFixedString('Hello', 10)), 4, -4), bin(bitSlice(toFixedString('Hello', 10), 4, -4));
select 5, -5, subString(bin(toFixedString('Hello', 10)), 5, -5), bin(bitSlice(toFixedString('Hello', 10), 5, -5));
select 6, -6, subString(bin(toFixedString('Hello', 10)), 6, -6), bin(bitSlice(toFixedString('Hello', 10), 6, -6));
select 7, -7, subString(bin(toFixedString('Hello', 10)), 7, -7), bin(bitSlice(toFixedString('Hello', 10), 7, -7));
select 8, -8, subString(bin(toFixedString('Hello', 10)), 8, -8), bin(bitSlice(toFixedString('Hello', 10), 8, -8));
select 9, -9, subString(bin(toFixedString('Hello', 10)), 9, -9), bin(bitSlice(toFixedString('Hello', 10), 9, -9));
select 10, -10, subString(bin(toFixedString('Hello', 10)), 10, -10), bin(bitSlice(toFixedString('Hello', 10), 10, -10));
select 11, -11, subString(bin(toFixedString('Hello', 10)), 11, -11), bin(bitSlice(toFixedString('Hello', 10), 11, -11));
select 12, -12, subString(bin(toFixedString('Hello', 10)), 12, -12), bin(bitSlice(toFixedString('Hello', 10), 12, -12));
select 13, -13, subString(bin(toFixedString('Hello', 10)), 13, -13), bin(bitSlice(toFixedString('Hello', 10), 13, -13));
select 14, -14, subString(bin(toFixedString('Hello', 10)), 14, -14), bin(bitSlice(toFixedString('Hello', 10), 14, -14));
select 15, -15, subString(bin(toFixedString('Hello', 10)), 15, -15), bin(bitSlice(toFixedString('Hello', 10), 15, -15));
select 16, -16, subString(bin(toFixedString('Hello', 10)), 16, -16), bin(bitSlice(toFixedString('Hello', 10), 16, -16));
select 1 as offset, -1 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 2 as offset, -2 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 3 as offset, -3 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 4 as offset, -4 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 5 as offset, -5 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 6 as offset, -6 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 7 as offset, -7 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 8 as offset, -8 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 9 as offset, -9 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 10 as offset, -10 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 11 as offset, -11 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 12 as offset, -12 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 13 as offset, -13 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 14 as offset, -14 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 15 as offset, -15 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 16 as offset, -16 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -1, 1, subString(bin(toFixedString('Hello', 10)), -1, 1), bin(bitSlice(toFixedString('Hello', 10), -1, 1));
select -2, 2, subString(bin(toFixedString('Hello', 10)), -2, 2), bin(bitSlice(toFixedString('Hello', 10), -2, 2));
select -3, 3, subString(bin(toFixedString('Hello', 10)), -3, 3), bin(bitSlice(toFixedString('Hello', 10), -3, 3));
select -4, 4, subString(bin(toFixedString('Hello', 10)), -4, 4), bin(bitSlice(toFixedString('Hello', 10), -4, 4));
select -5, 5, subString(bin(toFixedString('Hello', 10)), -5, 5), bin(bitSlice(toFixedString('Hello', 10), -5, 5));
select -6, 6, subString(bin(toFixedString('Hello', 10)), -6, 6), bin(bitSlice(toFixedString('Hello', 10), -6, 6));
select -7, 7, subString(bin(toFixedString('Hello', 10)), -7, 7), bin(bitSlice(toFixedString('Hello', 10), -7, 7));
select -8, 8, subString(bin(toFixedString('Hello', 10)), -8, 8), bin(bitSlice(toFixedString('Hello', 10), -8, 8));
select -9, 9, subString(bin(toFixedString('Hello', 10)), -9, 9), bin(bitSlice(toFixedString('Hello', 10), -9, 9));
select -10, 10, subString(bin(toFixedString('Hello', 10)), -10, 10), bin(bitSlice(toFixedString('Hello', 10), -10, 10));
select -11, 11, subString(bin(toFixedString('Hello', 10)), -11, 11), bin(bitSlice(toFixedString('Hello', 10), -11, 11));
select -12, 12, subString(bin(toFixedString('Hello', 10)), -12, 12), bin(bitSlice(toFixedString('Hello', 10), -12, 12));
select -13, 13, subString(bin(toFixedString('Hello', 10)), -13, 13), bin(bitSlice(toFixedString('Hello', 10), -13, 13));
select -14, 14, subString(bin(toFixedString('Hello', 10)), -14, 14), bin(bitSlice(toFixedString('Hello', 10), -14, 14));
select -15, 15, subString(bin(toFixedString('Hello', 10)), -15, 15), bin(bitSlice(toFixedString('Hello', 10), -15, 15));
select -16, 16, subString(bin(toFixedString('Hello', 10)), -16, 16), bin(bitSlice(toFixedString('Hello', 10), -16, 16));
select -1 as offset, 1 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -2 as offset, 2 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -3 as offset, 3 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -4 as offset, 4 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -5 as offset, 5 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -6 as offset, 6 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -7 as offset, 7 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -8 as offset, 8 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -9 as offset, 9 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -10 as offset, 10 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -11 as offset, 11 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -12 as offset, 12 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -13 as offset, 13 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -14 as offset, 14 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -15 as offset, 15 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -16 as offset, 16 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -1, -16, subString(bin(toFixedString('Hello', 10)), -1, -16), bin(bitSlice(toFixedString('Hello', 10), -1, -16));
select -2, -15, subString(bin(toFixedString('Hello', 10)), -2, -15), bin(bitSlice(toFixedString('Hello', 10), -2, -15));
select -3, -14, subString(bin(toFixedString('Hello', 10)), -3, -14), bin(bitSlice(toFixedString('Hello', 10), -3, -14));
select -4, -13, subString(bin(toFixedString('Hello', 10)), -4, -13), bin(bitSlice(toFixedString('Hello', 10), -4, -13));
select -5, -12, subString(bin(toFixedString('Hello', 10)), -5, -12), bin(bitSlice(toFixedString('Hello', 10), -5, -12));
select -6, -11, subString(bin(toFixedString('Hello', 10)), -6, -11), bin(bitSlice(toFixedString('Hello', 10), -6, -11));
select -7, -10, subString(bin(toFixedString('Hello', 10)), -7, -10), bin(bitSlice(toFixedString('Hello', 10), -7, -10));
select -8, -9, subString(bin(toFixedString('Hello', 10)), -8, -9), bin(bitSlice(toFixedString('Hello', 10), -8, -9));
select -9, -8, subString(bin(toFixedString('Hello', 10)), -9, -8), bin(bitSlice(toFixedString('Hello', 10), -9, -8));
select -10, -7, subString(bin(toFixedString('Hello', 10)), -10, -7), bin(bitSlice(toFixedString('Hello', 10), -10, -7));
select -11, -6, subString(bin(toFixedString('Hello', 10)), -11, -6), bin(bitSlice(toFixedString('Hello', 10), -11, -6));
select -12, -5, subString(bin(toFixedString('Hello', 10)), -12, -5), bin(bitSlice(toFixedString('Hello', 10), -12, -5));
select -13, -4, subString(bin(toFixedString('Hello', 10)), -13, -4), bin(bitSlice(toFixedString('Hello', 10), -13, -4));
select -14, -3, subString(bin(toFixedString('Hello', 10)), -14, -3), bin(bitSlice(toFixedString('Hello', 10), -14, -3));
select -15, -2, subString(bin(toFixedString('Hello', 10)), -15, -2), bin(bitSlice(toFixedString('Hello', 10), -15, -2));
select -16, -1, subString(bin(toFixedString('Hello', 10)), -16, -1), bin(bitSlice(toFixedString('Hello', 10), -16, -1));
select -1 as offset, -16 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -2 as offset, -15 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -3 as offset, -14 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -4 as offset, -13 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -5 as offset, -12 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -6 as offset, -11 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -7 as offset, -10 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -8 as offset, -9 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -9 as offset, -8 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -10 as offset, -7 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -11 as offset, -6 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -12 as offset, -5 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -13 as offset, -4 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -14 as offset, -3 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -15 as offset, -2 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -16 as offset, -1 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 'Const Truncate Offset, Const Truncate Length';
select 36 as offset, 16 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 49 as offset, 1 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -52 as offset, -44 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -49 as offset, -48 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -49 as offset, 49 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 'Const Nullable Offset, Const Nullable Length';
select 1 as offset, 1 as length, null as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length));
select null as offset, 1 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 1 as offset, null as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length));
select null as offset, null as length, null as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length));
select 'Dynamic Offset, Dynamic Length';
select number as offset, number as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(16);
select number as offset, -number as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(16);
select -number as offset, -16+number as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(16);
select -number as offset, number as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(16);
select number, number, subString(bin(toFixedString('Hello', 10)), number, number), bin(bitSlice(toFixedString('Hello', 10), number, number)) from numbers(16);
select number, -number, subString(bin(toFixedString('Hello', 10)), number, -number), bin(bitSlice(toFixedString('Hello', 10), number, -number)) from numbers(16);
select -number, -16+number, subString(bin(toFixedString('Hello', 10)), -number, -16+number), bin(bitSlice(toFixedString('Hello', 10), -number, -16+number)) from numbers(16);
select -number, number, subString(bin(toFixedString('Hello', 10)), -number, number), bin(bitSlice(toFixedString('Hello', 10), -number, number)) from numbers(16);
select 'Dynamic Truncate Offset, Dynamic Truncate Length';
select number-8 as offset, 8 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select -4 as offset, number as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select -44-number as offset, 8 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select -52 as offset, number as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select -52 as offset, number + 48 as length, toFixedString('Hello', 6) as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select 'Dynamic Nullable Offset, Dynamic Nullable Length';
select if(number%4 ==1 or number%8==7, null, number) as offset, if(number%4==2 or number%8==7, null, number) as length,if(number%4 ==3, null, toFixedString('Hello', 6)) as s,
subString(bin(s), offset, length), bin(bitSlice(s, offset , length))
from numbers(16);

View File

@ -1,163 +1,244 @@
Const Offset
1 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
2 100100001100101011011000110110001101111 1001000011001010110110001101100011011110
3 00100001100101011011000110110001101111 0010000110010101101100011011000110111100
4 0100001100101011011000110110001101111 0100001100101011011000110110001101111000
5 100001100101011011000110110001101111 1000011001010110110001101100011011110000
6 00001100101011011000110110001101111 0000110010101101100011011000110111100000
7 0001100101011011000110110001101111 0001100101011011000110110001101111000000
8 001100101011011000110110001101111 0011001010110110001101100011011110000000
9 01100101011011000110110001101111 01100101011011000110110001101111
10 1100101011011000110110001101111 11001010110110001101100011011110
11 100101011011000110110001101111 10010101101100011011000110111100
12 00101011011000110110001101111 00101011011000110110001101111000
13 0101011011000110110001101111 01010110110001101100011011110000
14 101011011000110110001101111 10101101100011011000110111100000
15 01011011000110110001101111 01011011000110110001101111000000
16 1011011000110110001101111 10110110001101100011011110000000
-1 1 10000000
-2 11 11000000
-3 111 11100000
-4 1111 11110000
-5 01111 01111000
-6 101111 10111100
-7 1101111 11011110
-8 01101111 01101111
-9 001101111 0011011110000000
-10 0001101111 0001101111000000
-11 10001101111 1000110111100000
-12 110001101111 1100011011110000
-13 0110001101111 0110001101111000
-14 10110001101111 1011000110111100
-15 110110001101111 1101100011011110
-16 0110110001101111 0110110001101111
1 Hello 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
2 Hello 100100001100101011011000110110001101111 1001000011001010110110001101100011011110
3 Hello 00100001100101011011000110110001101111 0010000110010101101100011011000110111100
4 Hello 0100001100101011011000110110001101111 0100001100101011011000110110001101111000
5 Hello 100001100101011011000110110001101111 1000011001010110110001101100011011110000
6 Hello 00001100101011011000110110001101111 0000110010101101100011011000110111100000
7 Hello 0001100101011011000110110001101111 0001100101011011000110110001101111000000
8 Hello 001100101011011000110110001101111 0011001010110110001101100011011110000000
9 Hello 01100101011011000110110001101111 01100101011011000110110001101111
10 Hello 1100101011011000110110001101111 11001010110110001101100011011110
11 Hello 100101011011000110110001101111 10010101101100011011000110111100
12 Hello 00101011011000110110001101111 00101011011000110110001101111000
13 Hello 0101011011000110110001101111 01010110110001101100011011110000
14 Hello 101011011000110110001101111 10101101100011011000110111100000
15 Hello 01011011000110110001101111 01011011000110110001101111000000
16 Hello 1011011000110110001101111 10110110001101100011011110000000
-1 Hello 1 10000000
-2 Hello 11 11000000
-3 Hello 111 11100000
-4 Hello 1111 11110000
-5 Hello 01111 01111000
-6 Hello 101111 10111100
-7 Hello 1101111 11011110
-8 Hello 01101111 01101111
-9 Hello 001101111 0011011110000000
-10 Hello 0001101111 0001101111000000
-11 Hello 10001101111 1000110111100000
-12 Hello 110001101111 1100011011110000
-13 Hello 0110001101111 0110001101111000
-14 Hello 10110001101111 1011000110111100
-15 Hello 110110001101111 1101100011011110
-16 Hello 0110110001101111 0110110001101111
Const Truncate Offset
41 Hello
-41 Hello 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
Const Nullable Offset
1 \N \N \N
\N Hello \N \N
\N \N \N \N
Const Offset, Const Length
1 1 0 00000000
2 2 10 10000000
3 3 001 00100000
4 4 0100 01000000
5 5 10000 10000000
6 6 000011 00001100
7 7 0001100 00011000
8 8 00110010 00110010
9 9 011001010 0110010100000000
10 10 1100101011 1100101011000000
11 11 10010101101 1001010110100000
12 12 001010110110 0010101101100000
13 13 0101011011000 0101011011000000
14 14 10101101100011 1010110110001100
15 15 010110110001101 0101101100011010
16 16 1011011000110110 1011011000110110
1 -1 010010000110010101101100011011000110111 0100100001100101011011000110110001101110
2 -2 1001000011001010110110001101100011011 1001000011001010110110001101100011011000
3 -3 00100001100101011011000110110001101 0010000110010101101100011011000110100000
4 -4 010000110010101101100011011000110 0100001100101011011000110110001100000000
5 -5 1000011001010110110001101100011 10000110010101101100011011000110
6 -6 00001100101011011000110110001 00001100101011011000110110001000
7 -7 000110010101101100011011000 00011001010110110001101100000000
8 -8 0011001010110110001101100 00110010101101100011011000000000
9 -9 01100101011011000110110 011001010110110001101100
10 -10 110010101101100011011 110010101101100011011000
11 -11 1001010110110001101 100101011011000110100000
12 -12 00101011011000110 001010110110001100000000
13 -13 010101101100011 0101011011000110
14 -14 1010110110001 1010110110001000
15 -15 01011011000 0101101100000000
16 -16 101101100 1011011000000000
-1 1 1 10000000
-2 2 11 11000000
-3 3 111 11100000
-4 4 1111 11110000
-5 5 01111 01111000
-6 6 101111 10111100
-7 7 1101111 11011110
-8 8 01101111 01101111
-9 9 001101111 0011011110000000
-10 10 0001101111 0001101111000000
-11 11 10001101111 1000110111100000
-12 12 110001101111 1100011011110000
-13 13 0110001101111 0110001101111000
-14 14 10110001101111 1011000110111100
-15 15 110110001101111 1101100011011110
-16 16 0110110001101111 0110110001101111
-1 -16
-2 -15
-3 -14
-4 -13
-5 -12
-6 -11
-7 -10
-8 -9
-9 -8 0 00000000
-10 -7 000 00000000
-11 -6 10001 10001000
-12 -5 1100011 11000110
-13 -4 011000110 0110001100000000
-14 -3 10110001101 1011000110100000
-15 -2 1101100011011 1101100011011000
-16 -1 011011000110111 0110110001101110
1 1 Hello 0 00000000
2 2 Hello 10 10000000
3 3 Hello 001 00100000
4 4 Hello 0100 01000000
5 5 Hello 10000 10000000
6 6 Hello 000011 00001100
7 7 Hello 0001100 00011000
8 8 Hello 00110010 00110010
9 9 Hello 011001010 0110010100000000
10 10 Hello 1100101011 1100101011000000
11 11 Hello 10010101101 1001010110100000
12 12 Hello 001010110110 0010101101100000
13 13 Hello 0101011011000 0101011011000000
14 14 Hello 10101101100011 1010110110001100
15 15 Hello 010110110001101 0101101100011010
16 16 Hello 1011011000110110 1011011000110110
1 -1 Hello 010010000110010101101100011011000110111 0100100001100101011011000110110001101110
2 -2 Hello 1001000011001010110110001101100011011 1001000011001010110110001101100011011000
3 -3 Hello 00100001100101011011000110110001101 0010000110010101101100011011000110100000
4 -4 Hello 010000110010101101100011011000110 0100001100101011011000110110001100000000
5 -5 Hello 1000011001010110110001101100011 10000110010101101100011011000110
6 -6 Hello 00001100101011011000110110001 00001100101011011000110110001000
7 -7 Hello 000110010101101100011011000 00011001010110110001101100000000
8 -8 Hello 0011001010110110001101100 00110010101101100011011000000000
9 -9 Hello 01100101011011000110110 011001010110110001101100
10 -10 Hello 110010101101100011011 110010101101100011011000
11 -11 Hello 1001010110110001101 100101011011000110100000
12 -12 Hello 00101011011000110 001010110110001100000000
13 -13 Hello 010101101100011 0101011011000110
14 -14 Hello 1010110110001 1010110110001000
15 -15 Hello 01011011000 0101101100000000
16 -16 Hello 101101100 1011011000000000
-1 1 Hello 1 10000000
-2 2 Hello 11 11000000
-3 3 Hello 111 11100000
-4 4 Hello 1111 11110000
-5 5 Hello 01111 01111000
-6 6 Hello 101111 10111100
-7 7 Hello 1101111 11011110
-8 8 Hello 01101111 01101111
-9 9 Hello 001101111 0011011110000000
-10 10 Hello 0001101111 0001101111000000
-11 11 Hello 10001101111 1000110111100000
-12 12 Hello 110001101111 1100011011110000
-13 13 Hello 0110001101111 0110001101111000
-14 14 Hello 10110001101111 1011000110111100
-15 15 Hello 110110001101111 1101100011011110
-16 16 Hello 0110110001101111 0110110001101111
-1 -16 Hello
-2 -15 Hello
-3 -14 Hello
-4 -13 Hello
-5 -12 Hello
-6 -11 Hello
-7 -10 Hello
-8 -9 Hello
-9 -8 Hello 0 00000000
-10 -7 Hello 000 00000000
-11 -6 Hello 10001 10001000
-12 -5 Hello 1100011 11000110
-13 -4 Hello 011000110 0110001100000000
-14 -3 Hello 10110001101 1011000110100000
-15 -2 Hello 1101100011011 1101100011011000
-16 -1 Hello 011011000110111 0110110001101110
Const Truncate Offset, Const Truncate Length
36 8 Hello 01111 01111000
41 1 Hello
-44 -36 Hello 0100 01000000
-41 -40 Hello
-41 41 Hello 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
Const Nullable Offset, Const Nullable Length
1 1 \N \N \N
\N 1 Hello \N \N
1 \N Hello \N \N
\N \N \N \N \N
Dynamic Offset, Dynamic Length
0 0
1 1 0 00000000
2 2 10 10000000
3 3 001 00100000
4 4 0100 01000000
5 5 10000 10000000
6 6 000011 00001100
7 7 0001100 00011000
8 8 00110010 00110010
9 9 011001010 0110010100000000
10 10 1100101011 1100101011000000
11 11 10010101101 1001010110100000
12 12 001010110110 0010101101100000
13 13 0101011011000 0101011011000000
14 14 10101101100011 1010110110001100
15 15 010110110001101 0101101100011010
0 0
1 -1 010010000110010101101100011011000110111 0100100001100101011011000110110001101110
2 -2 1001000011001010110110001101100011011 1001000011001010110110001101100011011000
3 -3 00100001100101011011000110110001101 0010000110010101101100011011000110100000
4 -4 010000110010101101100011011000110 0100001100101011011000110110001100000000
5 -5 1000011001010110110001101100011 10000110010101101100011011000110
6 -6 00001100101011011000110110001 00001100101011011000110110001000
7 -7 000110010101101100011011000 00011001010110110001101100000000
8 -8 0011001010110110001101100 00110010101101100011011000000000
9 -9 01100101011011000110110 011001010110110001101100
10 -10 110010101101100011011 110010101101100011011000
11 -11 1001010110110001101 100101011011000110100000
12 -12 00101011011000110 001010110110001100000000
13 -13 010101101100011 0101011011000110
14 -14 1010110110001 1010110110001000
15 -15 01011011000 0101101100000000
0 -16
-1 -15
-2 -14
-3 -13
-4 -12
-5 -11
-6 -10
-7 -9
-8 -8
-9 -7 00 00000000
-10 -6 0001 00010000
-11 -5 100011 10001100
-12 -4 11000110 11000110
-13 -3 0110001101 0110001101000000
-14 -2 101100011011 1011000110110000
-15 -1 11011000110111 1101100011011100
0 0
-1 1 1 10000000
-2 2 11 11000000
-3 3 111 11100000
-4 4 1111 11110000
-5 5 01111 01111000
-6 6 101111 10111100
-7 7 1101111 11011110
-8 8 01101111 01101111
-9 9 001101111 0011011110000000
-10 10 0001101111 0001101111000000
-11 11 10001101111 1000110111100000
-12 12 110001101111 1100011011110000
-13 13 0110001101111 0110001101111000
-14 14 10110001101111 1011000110111100
-15 15 110110001101111 1101100011011110
0 0 Hello
1 1 Hello 0 00000000
2 2 Hello 10 10000000
3 3 Hello 001 00100000
4 4 Hello 0100 01000000
5 5 Hello 10000 10000000
6 6 Hello 000011 00001100
7 7 Hello 0001100 00011000
8 8 Hello 00110010 00110010
9 9 Hello 011001010 0110010100000000
10 10 Hello 1100101011 1100101011000000
11 11 Hello 10010101101 1001010110100000
12 12 Hello 001010110110 0010101101100000
13 13 Hello 0101011011000 0101011011000000
14 14 Hello 10101101100011 1010110110001100
15 15 Hello 010110110001101 0101101100011010
0 0 Hello
1 -1 Hello 010010000110010101101100011011000110111 0100100001100101011011000110110001101110
2 -2 Hello 1001000011001010110110001101100011011 1001000011001010110110001101100011011000
3 -3 Hello 00100001100101011011000110110001101 0010000110010101101100011011000110100000
4 -4 Hello 010000110010101101100011011000110 0100001100101011011000110110001100000000
5 -5 Hello 1000011001010110110001101100011 10000110010101101100011011000110
6 -6 Hello 00001100101011011000110110001 00001100101011011000110110001000
7 -7 Hello 000110010101101100011011000 00011001010110110001101100000000
8 -8 Hello 0011001010110110001101100 00110010101101100011011000000000
9 -9 Hello 01100101011011000110110 011001010110110001101100
10 -10 Hello 110010101101100011011 110010101101100011011000
11 -11 Hello 1001010110110001101 100101011011000110100000
12 -12 Hello 00101011011000110 001010110110001100000000
13 -13 Hello 010101101100011 0101011011000110
14 -14 Hello 1010110110001 1010110110001000
15 -15 Hello 01011011000 0101101100000000
0 -16 Hello
-1 -15 Hello
-2 -14 Hello
-3 -13 Hello
-4 -12 Hello
-5 -11 Hello
-6 -10 Hello
-7 -9 Hello
-8 -8 Hello
-9 -7 Hello 00 00000000
-10 -6 Hello 0001 00010000
-11 -5 Hello 100011 10001100
-12 -4 Hello 11000110 11000110
-13 -3 Hello 0110001101 0110001101000000
-14 -2 Hello 101100011011 1011000110110000
-15 -1 Hello 11011000110111 1101100011011100
0 0 Hello
-1 1 Hello 1 10000000
-2 2 Hello 11 11000000
-3 3 Hello 111 11100000
-4 4 Hello 1111 11110000
-5 5 Hello 01111 01111000
-6 6 Hello 101111 10111100
-7 7 Hello 1101111 11011110
-8 8 Hello 01101111 01101111
-9 9 Hello 001101111 0011011110000000
-10 10 Hello 0001101111 0001101111000000
-11 11 Hello 10001101111 1000110111100000
-12 12 Hello 110001101111 1100011011110000
-13 13 Hello 0110001101111 0110001101111000
-14 14 Hello 10110001101111 1011000110111100
-15 15 Hello 110110001101111 1101100011011110
Dynamic Truncate Offset, Dynamic Truncate Length
-8 8 Hello 01101111 01101111
-7 8 Hello 1101111 11011110
-6 8 Hello 101111 10111100
-5 8 Hello 01111 01111000
-4 8 Hello 1111 11110000
-3 8 Hello 111 11100000
-2 8 Hello 11 11000000
-1 8 Hello 1 10000000
0 8 Hello
-4 0 Hello
-4 1 Hello 1 10000000
-4 2 Hello 11 11000000
-4 3 Hello 111 11100000
-4 4 Hello 1111 11110000
-4 5 Hello 1111 11110000
-4 6 Hello 1111 11110000
-4 7 Hello 1111 11110000
-4 8 Hello 1111 11110000
-36 8 Hello 10000110 10000110
-37 8 Hello 01000011 01000011
-38 8 Hello 00100001 00100001
-39 8 Hello 10010000 10010000
-40 8 Hello 01001000 01001000
-41 8 Hello 0100100 01001000
-42 8 Hello 010010 01001000
-43 8 Hello 01001 01001000
-44 8 Hello 0100 01000000
-44 0 Hello
-44 1 Hello
-44 2 Hello
-44 3 Hello
-44 4 Hello
-44 5 Hello 0 00000000
-44 6 Hello 01 01000000
-44 7 Hello 010 01000000
-44 8 Hello 0100 01000000
-44 40 Hello 010010000110010101101100011011000110 0100100001100101011011000110110001100000
-44 41 Hello 0100100001100101011011000110110001101 0100100001100101011011000110110001101000
-44 42 Hello 01001000011001010110110001101100011011 0100100001100101011011000110110001101100
-44 43 Hello 010010000110010101101100011011000110111 0100100001100101011011000110110001101110
-44 44 Hello 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
-44 45 Hello 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
-44 46 Hello 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
-44 47 Hello 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
-44 48 Hello 0100100001100101011011000110110001101111 0100100001100101011011000110110001101111
Dynamic Nullable Offset, Dynamic Nullable Length
0 0 Hello
\N 1 Hello \N \N
2 \N Hello \N \N
3 3 \N \N \N
4 4 Hello 0100 01000000
\N 5 Hello \N \N
6 \N Hello \N \N
\N \N \N \N \N
8 8 Hello 00110010 00110010
\N 9 Hello \N \N
10 \N Hello \N \N
11 11 \N \N \N
12 12 Hello 001010110110 0010101101100000
\N 13 Hello \N \N
14 \N Hello \N \N
\N \N \N \N \N

View File

@ -1,111 +1,144 @@
SELECT 'Const Offset';
select 1, subString(bin('Hello'), 1), bin(bitSlice('Hello', 1));
select 2, subString(bin('Hello'), 2), bin(bitSlice('Hello', 2));
select 3, subString(bin('Hello'), 3), bin(bitSlice('Hello', 3));
select 4, subString(bin('Hello'), 4), bin(bitSlice('Hello', 4));
select 5, subString(bin('Hello'), 5), bin(bitSlice('Hello', 5));
select 6, subString(bin('Hello'), 6), bin(bitSlice('Hello', 6));
select 7, subString(bin('Hello'), 7), bin(bitSlice('Hello', 7));
select 8, subString(bin('Hello'), 8), bin(bitSlice('Hello', 8));
select 9, subString(bin('Hello'), 9), bin(bitSlice('Hello', 9));
select 10, subString(bin('Hello'), 10), bin(bitSlice('Hello', 10));
select 11, subString(bin('Hello'), 11), bin(bitSlice('Hello', 11));
select 12, subString(bin('Hello'), 12), bin(bitSlice('Hello', 12));
select 13, subString(bin('Hello'), 13), bin(bitSlice('Hello', 13));
select 14, subString(bin('Hello'), 14), bin(bitSlice('Hello', 14));
select 15, subString(bin('Hello'), 15), bin(bitSlice('Hello', 15));
select 16, subString(bin('Hello'), 16), bin(bitSlice('Hello', 16));
select 1 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 2 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 3 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 4 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 5 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 6 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 7 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 8 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 9 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 10 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 11 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 12 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 13 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 14 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 15 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select 16 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -1, subString(bin('Hello'), -1), bin(bitSlice('Hello', -1));
select -2, subString(bin('Hello'), -2), bin(bitSlice('Hello', -2));
select -3, subString(bin('Hello'), -3), bin(bitSlice('Hello', -3));
select -4, subString(bin('Hello'), -4), bin(bitSlice('Hello', -4));
select -5, subString(bin('Hello'), -5), bin(bitSlice('Hello', -5));
select -6, subString(bin('Hello'), -6), bin(bitSlice('Hello', -6));
select -7, subString(bin('Hello'), -7), bin(bitSlice('Hello', -7));
select -8, subString(bin('Hello'), -8), bin(bitSlice('Hello', -8));
select -9, subString(bin('Hello'), -9), bin(bitSlice('Hello', -9));
select -10, subString(bin('Hello'), -10), bin(bitSlice('Hello', -10));
select -11, subString(bin('Hello'), -11), bin(bitSlice('Hello', -11));
select -12, subString(bin('Hello'), -12), bin(bitSlice('Hello', -12));
select -13, subString(bin('Hello'), -13), bin(bitSlice('Hello', -13));
select -14, subString(bin('Hello'), -14), bin(bitSlice('Hello', -14));
select -15, subString(bin('Hello'), -15), bin(bitSlice('Hello', -15));
select -16, subString(bin('Hello'), -16), bin(bitSlice('Hello', -16));
select -1 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -2 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -3 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -4 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -5 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -6 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -7 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -8 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -9 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -10 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -11 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -12 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -13 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -14 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -15 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -16 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
SELECT 'Const Truncate Offset';
select 41 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select -41 as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
SELECT 'Const Nullable Offset';
select 1 as offset, null as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select null as offset, 'Hello' as s, subString(bin(s), offset), bin(bitSlice(s, offset));
select null as offset, null as s, subString(bin(s), offset), bin(bitSlice(s, offset));
SELECT 'Const Offset, Const Length';
select 1, 1, subString(bin('Hello'), 1, 1), bin(bitSlice('Hello', 1, 1));
select 2, 2, subString(bin('Hello'), 2, 2), bin(bitSlice('Hello', 2, 2));
select 3, 3, subString(bin('Hello'), 3, 3), bin(bitSlice('Hello', 3, 3));
select 4, 4, subString(bin('Hello'), 4, 4), bin(bitSlice('Hello', 4, 4));
select 5, 5, subString(bin('Hello'), 5, 5), bin(bitSlice('Hello', 5, 5));
select 6, 6, subString(bin('Hello'), 6, 6), bin(bitSlice('Hello', 6, 6));
select 7, 7, subString(bin('Hello'), 7, 7), bin(bitSlice('Hello', 7, 7));
select 8, 8, subString(bin('Hello'), 8, 8), bin(bitSlice('Hello', 8, 8));
select 9, 9, subString(bin('Hello'), 9, 9), bin(bitSlice('Hello', 9, 9));
select 10, 10, subString(bin('Hello'), 10, 10), bin(bitSlice('Hello', 10, 10));
select 11, 11, subString(bin('Hello'), 11, 11), bin(bitSlice('Hello', 11, 11));
select 12, 12, subString(bin('Hello'), 12, 12), bin(bitSlice('Hello', 12, 12));
select 13, 13, subString(bin('Hello'), 13, 13), bin(bitSlice('Hello', 13, 13));
select 14, 14, subString(bin('Hello'), 14, 14), bin(bitSlice('Hello', 14, 14));
select 15, 15, subString(bin('Hello'), 15, 15), bin(bitSlice('Hello', 15, 15));
select 16, 16, subString(bin('Hello'), 16, 16), bin(bitSlice('Hello', 16, 16));
select 1 as offset, 1 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 2 as offset, 2 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 3 as offset, 3 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 4 as offset, 4 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 5 as offset, 5 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 6 as offset, 6 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 7 as offset, 7 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 8 as offset, 8 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 9 as offset, 9 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 10 as offset, 10 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 11 as offset, 11 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 12 as offset, 12 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 13 as offset, 13 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 14 as offset, 14 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 15 as offset, 15 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 16 as offset, 16 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 1, -1, subString(bin('Hello'), 1, -1), bin(bitSlice('Hello', 1, -1));
select 2, -2, subString(bin('Hello'), 2, -2), bin(bitSlice('Hello', 2, -2));
select 3, -3, subString(bin('Hello'), 3, -3), bin(bitSlice('Hello', 3, -3));
select 4, -4, subString(bin('Hello'), 4, -4), bin(bitSlice('Hello', 4, -4));
select 5, -5, subString(bin('Hello'), 5, -5), bin(bitSlice('Hello', 5, -5));
select 6, -6, subString(bin('Hello'), 6, -6), bin(bitSlice('Hello', 6, -6));
select 7, -7, subString(bin('Hello'), 7, -7), bin(bitSlice('Hello', 7, -7));
select 8, -8, subString(bin('Hello'), 8, -8), bin(bitSlice('Hello', 8, -8));
select 9, -9, subString(bin('Hello'), 9, -9), bin(bitSlice('Hello', 9, -9));
select 10, -10, subString(bin('Hello'), 10, -10), bin(bitSlice('Hello', 10, -10));
select 11, -11, subString(bin('Hello'), 11, -11), bin(bitSlice('Hello', 11, -11));
select 12, -12, subString(bin('Hello'), 12, -12), bin(bitSlice('Hello', 12, -12));
select 13, -13, subString(bin('Hello'), 13, -13), bin(bitSlice('Hello', 13, -13));
select 14, -14, subString(bin('Hello'), 14, -14), bin(bitSlice('Hello', 14, -14));
select 15, -15, subString(bin('Hello'), 15, -15), bin(bitSlice('Hello', 15, -15));
select 16, -16, subString(bin('Hello'), 16, -16), bin(bitSlice('Hello', 16, -16));
select 1 as offset, -1 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 2 as offset, -2 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 3 as offset, -3 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 4 as offset, -4 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 5 as offset, -5 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 6 as offset, -6 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 7 as offset, -7 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 8 as offset, -8 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 9 as offset, -9 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 10 as offset, -10 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 11 as offset, -11 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 12 as offset, -12 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 13 as offset, -13 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 14 as offset, -14 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 15 as offset, -15 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 16 as offset, -16 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -1, 1, subString(bin('Hello'), -1, 1), bin(bitSlice('Hello', -1, 1));
select -2, 2, subString(bin('Hello'), -2, 2), bin(bitSlice('Hello', -2, 2));
select -3, 3, subString(bin('Hello'), -3, 3), bin(bitSlice('Hello', -3, 3));
select -4, 4, subString(bin('Hello'), -4, 4), bin(bitSlice('Hello', -4, 4));
select -5, 5, subString(bin('Hello'), -5, 5), bin(bitSlice('Hello', -5, 5));
select -6, 6, subString(bin('Hello'), -6, 6), bin(bitSlice('Hello', -6, 6));
select -7, 7, subString(bin('Hello'), -7, 7), bin(bitSlice('Hello', -7, 7));
select -8, 8, subString(bin('Hello'), -8, 8), bin(bitSlice('Hello', -8, 8));
select -9, 9, subString(bin('Hello'), -9, 9), bin(bitSlice('Hello', -9, 9));
select -10, 10, subString(bin('Hello'), -10, 10), bin(bitSlice('Hello', -10, 10));
select -11, 11, subString(bin('Hello'), -11, 11), bin(bitSlice('Hello', -11, 11));
select -12, 12, subString(bin('Hello'), -12, 12), bin(bitSlice('Hello', -12, 12));
select -13, 13, subString(bin('Hello'), -13, 13), bin(bitSlice('Hello', -13, 13));
select -14, 14, subString(bin('Hello'), -14, 14), bin(bitSlice('Hello', -14, 14));
select -15, 15, subString(bin('Hello'), -15, 15), bin(bitSlice('Hello', -15, 15));
select -16, 16, subString(bin('Hello'), -16, 16), bin(bitSlice('Hello', -16, 16));
select -1 as offset, 1 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -2 as offset, 2 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -3 as offset, 3 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -4 as offset, 4 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -5 as offset, 5 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -6 as offset, 6 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -7 as offset, 7 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -8 as offset, 8 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -9 as offset, 9 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -10 as offset, 10 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -11 as offset, 11 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -12 as offset, 12 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -13 as offset, 13 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -14 as offset, 14 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -15 as offset, 15 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -16 as offset, 16 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -1, -16, subString(bin('Hello'), -1, -16), bin(bitSlice('Hello', -1, -16));
select -2, -15, subString(bin('Hello'), -2, -15), bin(bitSlice('Hello', -2, -15));
select -3, -14, subString(bin('Hello'), -3, -14), bin(bitSlice('Hello', -3, -14));
select -4, -13, subString(bin('Hello'), -4, -13), bin(bitSlice('Hello', -4, -13));
select -5, -12, subString(bin('Hello'), -5, -12), bin(bitSlice('Hello', -5, -12));
select -6, -11, subString(bin('Hello'), -6, -11), bin(bitSlice('Hello', -6, -11));
select -7, -10, subString(bin('Hello'), -7, -10), bin(bitSlice('Hello', -7, -10));
select -8, -9, subString(bin('Hello'), -8, -9), bin(bitSlice('Hello', -8, -9));
select -9, -8, subString(bin('Hello'), -9, -8), bin(bitSlice('Hello', -9, -8));
select -10, -7, subString(bin('Hello'), -10, -7), bin(bitSlice('Hello', -10, -7));
select -11, -6, subString(bin('Hello'), -11, -6), bin(bitSlice('Hello', -11, -6));
select -12, -5, subString(bin('Hello'), -12, -5), bin(bitSlice('Hello', -12, -5));
select -13, -4, subString(bin('Hello'), -13, -4), bin(bitSlice('Hello', -13, -4));
select -14, -3, subString(bin('Hello'), -14, -3), bin(bitSlice('Hello', -14, -3));
select -15, -2, subString(bin('Hello'), -15, -2), bin(bitSlice('Hello', -15, -2));
select -16, -1, subString(bin('Hello'), -16, -1), bin(bitSlice('Hello', -16, -1));
select -1 as offset, -16 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -2 as offset, -15 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -3 as offset, -14 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -4 as offset, -13 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -5 as offset, -12 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -6 as offset, -11 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -7 as offset, -10 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -8 as offset, -9 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -9 as offset, -8 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -10 as offset, -7 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -11 as offset, -6 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -12 as offset, -5 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -13 as offset, -4 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -14 as offset, -3 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -15 as offset, -2 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -16 as offset, -1 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 'Const Truncate Offset, Const Truncate Length';
select 36 as offset, 8 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 41 as offset, 1 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -44 as offset, -36 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -41 as offset, -40 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select -41 as offset, 41 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 'Const Nullable Offset, Const Nullable Length';
select 1 as offset, 1 as length, null as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length));
select null as offset, 1 as length, 'Hello' as s, subString(bin(s), offset, length), bin(bitSlice(s, offset, length));
select 1 as offset, null as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length));
select null as offset, null as length, null as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length));
select 'Dynamic Offset, Dynamic Length';
select number as offset, number as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(16);
select number as offset, -number as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(16);
select -number as offset, -16+number as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(16);
select -number as offset, number as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(16);
select number, number, subString(bin('Hello'), number, number), bin(bitSlice('Hello', number, number)) from numbers(16);
select number, -number, subString(bin('Hello'), number, -number), bin(bitSlice('Hello', number, -number)) from numbers(16);
select -number, -16+number, subString(bin('Hello'), -number, -16+number), bin(bitSlice('Hello', -number, -16+number)) from numbers(16);
select -number, number, subString(bin('Hello'), -number, number), bin(bitSlice('Hello', -number, number)) from numbers(16);
select 'Dynamic Truncate Offset, Dynamic Truncate Length';
select number-8 as offset, 8 as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select -4 as offset, number as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select -36-number as offset, 8 as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select -44 as offset, number as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select -44 as offset, number + 40 as length, 'Hello' as s, subString(bin(s), offset , length), bin(bitSlice(s, offset, length)) from numbers(9);
select 'Dynamic Nullable Offset, Dynamic Nullable Length';
select if(number%4 ==1 or number%8==7, null, number) as offset, if(number%4==2 or number%8==7, null, number) as length,if(number%4 ==3, null, 'Hello') as s,
subString(bin(s), offset, length), bin(bitSlice(s, offset , length))
from numbers(16);