Merge pull request #57821 from rschu1ze/consolidate-substring-tests

Dumb down `substring()` tests
This commit is contained in:
Robert Schulze 2023-12-18 12:32:20 +01:00 committed by GitHub
commit 414a2893d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 334 additions and 473 deletions

View File

@ -533,8 +533,8 @@ Result:
```result ```result
┌─concatWithSeparator('a', '1', '2', '3', '4')─┐ ┌─concatWithSeparator('a', '1', '2', '3', '4')─┐
│ 1a2a3a4 │ │ 1a2a3a4
└───────────────────────────────────┘ └──────────────────────────────────────────────
``` ```
## concatWithSeparatorAssumeInjective ## concatWithSeparatorAssumeInjective

View File

@ -56,23 +56,28 @@ public:
{ {
/// UTF8 variant is not available for FixedString and Enum arguments. /// UTF8 variant is not available for FixedString and Enum arguments.
if (!isString(arguments[0])) if (!isString(arguments[0]))
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of first argument of function {}", throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
arguments[0]->getName(), getName()); "Illegal type {} of first argument of function {}, expected String",
arguments[0]->getName(), getName());
} }
else else
{ {
if (!isStringOrFixedString(arguments[0]) && !isEnum(arguments[0])) if (!isStringOrFixedString(arguments[0]) && !isEnum(arguments[0]))
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of first argument of function {}", throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
arguments[0]->getName(), getName()); "Illegal type {} of first argument of function {}, expected String, FixedString or Enum",
arguments[0]->getName(), getName());
} }
if (!isNativeNumber(arguments[1])) if (!isNativeNumber(arguments[1]))
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of second argument of function {}", throw Exception(
arguments[1]->getName(), getName()); ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
"Illegal type {} of second argument of function {}, expected (U)Int*",
arguments[1]->getName(), getName());
if (number_of_arguments == 3 && !isNativeNumber(arguments[2])) if (number_of_arguments == 3 && !isNativeNumber(arguments[2]))
throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Illegal type {} of second argument of function {}", throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT,
arguments[2]->getName(), getName()); "Illegal type {} of second argument of function {}, expected (U)Int*",
arguments[2]->getName(), getName());
return std::make_shared<DataTypeString>(); return std::make_shared<DataTypeString>();
} }

View File

@ -1,155 +0,0 @@
-- Positive offsets (slice from left)
Offset: 1 Length: 1 hello shark h s
Offset: 1 Length: 2 hello shark he sh
Offset: 1 Length: 3 hello shark hel sha
Offset: 1 Length: 4 hello shark hell shar
Offset: 1 Length: 5 hello shark hello shark
Offset: 1 Length: 6 hello shark hello shark
Offset: 2 Length: 1 ello hark e h
Offset: 2 Length: 2 ello hark el ha
Offset: 2 Length: 3 ello hark ell har
Offset: 2 Length: 4 ello hark ello hark
Offset: 2 Length: 5 ello hark ello hark
Offset: 2 Length: 6 ello hark ello hark
Offset: 3 Length: 1 llo ark l a
Offset: 3 Length: 2 llo ark ll ar
Offset: 3 Length: 3 llo ark llo ark
Offset: 3 Length: 4 llo ark llo ark
Offset: 3 Length: 5 llo ark llo ark
Offset: 3 Length: 6 llo ark llo ark
Offset: 4 Length: 1 lo rk l r
Offset: 4 Length: 2 lo rk lo rk
Offset: 4 Length: 3 lo rk lo rk
Offset: 4 Length: 4 lo rk lo rk
Offset: 4 Length: 5 lo rk lo rk
Offset: 4 Length: 6 lo rk lo rk
Offset: 5 Length: 1 o k o k
Offset: 5 Length: 2 o k o k
Offset: 5 Length: 3 o k o k
Offset: 5 Length: 4 o k o k
Offset: 5 Length: 5 o k o k
Offset: 5 Length: 6 o k o k
Offset: 6 Length: 1
Offset: 6 Length: 2
Offset: 6 Length: 3
Offset: 6 Length: 4
Offset: 6 Length: 5
Offset: 6 Length: 6
Offset: 1 Length: 1 world eagle w e
Offset: 1 Length: 2 world eagle wo ea
Offset: 1 Length: 3 world eagle wor eag
Offset: 1 Length: 4 world eagle worl eagl
Offset: 1 Length: 5 world eagle world eagle
Offset: 1 Length: 6 world eagle world eagle
Offset: 2 Length: 1 orld agle o a
Offset: 2 Length: 2 orld agle or ag
Offset: 2 Length: 3 orld agle orl agl
Offset: 2 Length: 4 orld agle orld agle
Offset: 2 Length: 5 orld agle orld agle
Offset: 2 Length: 6 orld agle orld agle
Offset: 3 Length: 1 rld gle r g
Offset: 3 Length: 2 rld gle rl gl
Offset: 3 Length: 3 rld gle rld gle
Offset: 3 Length: 4 rld gle rld gle
Offset: 3 Length: 5 rld gle rld gle
Offset: 3 Length: 6 rld gle rld gle
Offset: 4 Length: 1 ld le l l
Offset: 4 Length: 2 ld le ld le
Offset: 4 Length: 3 ld le ld le
Offset: 4 Length: 4 ld le ld le
Offset: 4 Length: 5 ld le ld le
Offset: 4 Length: 6 ld le ld le
Offset: 5 Length: 1 d e d e
Offset: 5 Length: 2 d e d e
Offset: 5 Length: 3 d e d e
Offset: 5 Length: 4 d e d e
Offset: 5 Length: 5 d e d e
Offset: 5 Length: 6 d e d e
Offset: 6 Length: 1
Offset: 6 Length: 2
Offset: 6 Length: 3
Offset: 6 Length: 4
Offset: 6 Length: 5
Offset: 6 Length: 6
-- Negative offsets (slice from right)
Offset: -1 Length: 1 o k o k
Offset: -1 Length: 2 o k o k
Offset: -1 Length: 3 o k o k
Offset: -1 Length: 4 o k o k
Offset: -1 Length: 5 o k o k
Offset: -1 Length: 6 o k o k
Offset: -2 Length: 1 lo rk l r
Offset: -2 Length: 2 lo rk lo rk
Offset: -2 Length: 3 lo rk lo rk
Offset: -2 Length: 4 lo rk lo rk
Offset: -2 Length: 5 lo rk lo rk
Offset: -2 Length: 6 lo rk lo rk
Offset: -3 Length: 1 llo ark l a
Offset: -3 Length: 2 llo ark ll ar
Offset: -3 Length: 3 llo ark llo ark
Offset: -3 Length: 4 llo ark llo ark
Offset: -3 Length: 5 llo ark llo ark
Offset: -3 Length: 6 llo ark llo ark
Offset: -4 Length: 1 ello hark e h
Offset: -4 Length: 2 ello hark el ha
Offset: -4 Length: 3 ello hark ell har
Offset: -4 Length: 4 ello hark ello hark
Offset: -4 Length: 5 ello hark ello hark
Offset: -4 Length: 6 ello hark ello hark
Offset: -5 Length: 1 hello shark h s
Offset: -5 Length: 2 hello shark he sh
Offset: -5 Length: 3 hello shark hel sha
Offset: -5 Length: 4 hello shark hell shar
Offset: -5 Length: 5 hello shark hello shark
Offset: -5 Length: 6 hello shark hello shark
Offset: -6 Length: 1 hello shark
Offset: -6 Length: 2 hello shark h s
Offset: -6 Length: 3 hello shark he sh
Offset: -6 Length: 4 hello shark hel sha
Offset: -6 Length: 5 hello shark hell shar
Offset: -6 Length: 6 hello shark hello shark
Offset: -1 Length: 1 d e d e
Offset: -1 Length: 2 d e d e
Offset: -1 Length: 3 d e d e
Offset: -1 Length: 4 d e d e
Offset: -1 Length: 5 d e d e
Offset: -1 Length: 6 d e d e
Offset: -2 Length: 1 ld le l l
Offset: -2 Length: 2 ld le ld le
Offset: -2 Length: 3 ld le ld le
Offset: -2 Length: 4 ld le ld le
Offset: -2 Length: 5 ld le ld le
Offset: -2 Length: 6 ld le ld le
Offset: -3 Length: 1 rld gle r g
Offset: -3 Length: 2 rld gle rl gl
Offset: -3 Length: 3 rld gle rld gle
Offset: -3 Length: 4 rld gle rld gle
Offset: -3 Length: 5 rld gle rld gle
Offset: -3 Length: 6 rld gle rld gle
Offset: -4 Length: 1 orld agle o a
Offset: -4 Length: 2 orld agle or ag
Offset: -4 Length: 3 orld agle orl agl
Offset: -4 Length: 4 orld agle orld agle
Offset: -4 Length: 5 orld agle orld agle
Offset: -4 Length: 6 orld agle orld agle
Offset: -5 Length: 1 world eagle w e
Offset: -5 Length: 2 world eagle wo ea
Offset: -5 Length: 3 world eagle wor eag
Offset: -5 Length: 4 world eagle worl eagl
Offset: -5 Length: 5 world eagle world eagle
Offset: -5 Length: 6 world eagle world eagle
Offset: -6 Length: 1 world eagle
Offset: -6 Length: 2 world eagle w e
Offset: -6 Length: 3 world eagle wo ea
Offset: -6 Length: 4 world eagle wor eag
Offset: -6 Length: 5 world eagle worl eagl
Offset: -6 Length: 6 world eagle world eagle
-- Zero offset/length
Offset: 0 Length: 0
Offset: 0 Length: 1
Offset: 1 Length: 0 hello shark
Offset: 0 Length: 0
Offset: 0 Length: 1
Offset: 1 Length: 0 world eagle
-- Constant enums
f fo

View File

@ -1,32 +0,0 @@
DROP TABLE IF EXISTS tab;
CREATE TABLE tab(e8 Enum8('hello' = -5, 'world' = 15), e16 Enum16('shark' = -999, 'eagle' = 9999)) ENGINE MergeTree ORDER BY tuple();
INSERT INTO TABLE tab VALUES ('hello', 'shark'), ('world', 'eagle');
SELECT '-- Positive offsets (slice from left)';
WITH cte AS (SELECT number + 1 AS n FROM system.numbers LIMIT 6),
permutations AS (SELECT c1.n AS offset, c2.n AS length FROM cte AS c1 CROSS JOIN cte AS c2)
SELECT 'Offset: ', p.offset, 'Length: ', p.length,
substring(e8, p.offset) AS s1, substring(e16, p.offset) AS s2,
substring(e8, p.offset, p.length) AS s3, substring(e16, p.offset, p.length) AS s4
FROM tab LEFT JOIN permutations AS p ON true;
SELECT '-- Negative offsets (slice from right)';
WITH cte AS (SELECT number + 1 AS n FROM system.numbers LIMIT 6),
permutations AS (SELECT -c1.n AS offset, c2.n AS length FROM cte AS c1 CROSS JOIN cte AS c2)
SELECT 'Offset: ', p.offset, 'Length: ', p.length,
substring(e8, p.offset) AS s1, substring(e16, p.offset) AS s2,
substring(e8, p.offset, p.length) AS s3, substring(e16, p.offset, p.length) AS s4
FROM tab LEFT JOIN permutations AS p ON true;
SELECT '-- Zero offset/length';
WITH cte AS (SELECT number AS n FROM system.numbers LIMIT 2),
permutations AS (SELECT c1.n AS offset, c2.n AS length FROM cte AS c1 CROSS JOIN cte AS c2 LIMIT 3)
SELECT 'Offset: ', p.offset, 'Length: ', p.length,
substring(e8, p.offset) AS s1, substring(e16, p.offset) AS s2,
substring(e8, p.offset, p.length) AS s3, substring(e16, p.offset, p.length) AS s4
FROM tab LEFT JOIN permutations AS p ON true;
SELECT '-- Constant enums';
SELECT substring(CAST('foo', 'Enum8(\'foo\' = 1)'), 1, 1), substring(CAST('foo', 'Enum16(\'foo\' = 1111)'), 1, 2);
DROP TABLE tab;

View File

@ -1,52 +0,0 @@
hello\0\0\0
hello\0\0\0
0\0\0\0\0\0\0\0
1\0\0\0\0\0\0\0
2\0\0\0\0\0\0\0
3\0\0\0\0\0\0\0
4\0\0\0\0\0\0\0
5\0\0\0\0\0\0\0
6\0\0\0\0\0\0\0
7\0\0\0\0\0\0\0
8\0\0\0\0\0\0\0
9\0\0\0\0\0\0\0
995
996
997
998
999
100
100
100
100
100
9
99
998
999\0
1
10
100
1004
995\0
96\0
7\0
\0
1000
001
02
3
995
9
7\0
\0
10
001
0
3

View File

@ -1,7 +0,0 @@
SELECT substring(toFixedString('hello', 16), 1, 8);
SELECT substring(toFixedString(materialize('hello'), 16), 1, 8);
SELECT substring(toFixedString(toString(number), 16), 1, 8) FROM system.numbers LIMIT 10;
SELECT substring(toFixedString(toString(number), 4), 1, 3) FROM system.numbers LIMIT 995, 10;
SELECT substring(toFixedString(toString(number), 4), 1, number % 5) FROM system.numbers LIMIT 995, 10;
SELECT substring(toFixedString(toString(number), 4), 1 + number % 5) FROM system.numbers LIMIT 995, 10;
SELECT substring(toFixedString(toString(number), 4), 1 + number % 5, 1 + number % 3) FROM system.numbers LIMIT 995, 10;

View File

@ -1,40 +0,0 @@
abc
abc
abc
bc
c
abc
bc
c
abc
abc
abc
bc
c
abc
bc
c
abc
abc
abc
bc
c
abc
bc
c
abc
abc
abc
bc
c
abc
bc
c

View File

@ -1,4 +0,0 @@
SELECT substring('abc', number - 5) FROM system.numbers LIMIT 10;
SELECT substring(materialize('abc'), number - 5) FROM system.numbers LIMIT 10;
SELECT substring(toFixedString('abc', 3), number - 5) FROM system.numbers LIMIT 10;
SELECT substring(materialize(toFixedString('abc', 3)), number - 5) FROM system.numbers LIMIT 10;

View File

@ -1,4 +0,0 @@
SELECT substring('hello', []); -- { serverError 43 }
SELECT substring('hello', 1, []); -- { serverError 43 }
SELECT substring(materialize('hello'), -1, -1);
SELECT substring(materialize('hello'), 0); -- { serverError 135 }

View File

@ -0,0 +1,173 @@
-- argument validation
-- FixedString arguments
hello\0\0\0
hello\0\0\0
0\0\0\0\0\0\0\0
1\0\0\0\0\0\0\0
2\0\0\0\0\0\0\0
3\0\0\0\0\0\0\0
4\0\0\0\0\0\0\0
5\0\0\0\0\0\0\0
6\0\0\0\0\0\0\0
7\0\0\0\0\0\0\0
8\0\0\0\0\0\0\0
9\0\0\0\0\0\0\0
995
996
997
998
999
100
100
100
100
100
9
99
998
999\0
1
10
100
1004
995\0
96\0
7\0
\0
1000
001
02
3
995
9
7\0
\0
10
001
0
3
-- Enum arguments
hello shark
world eagle
ello hark
orld agle
o k
d e
lo rk
ld le
-- Constant enums
f fo
-- negative offset argument
abc
abc
abc
bc
c
abc
bc
c
abc
abc
abc
bc
c
abc
bc
c
abc
abc
abc
bc
c
abc
bc
c
abc
abc
abc
bc
c
abc
bc
c
lickhou
lickhou
lickhou
lickhou
lickhou
lickhou
lickhou
lickhou
-- negative length argument
bcdef
bcdef
bcdef
bcdef
bcdef
bcdef
bcdef
bcdef
bcdef
23456
bcdef
3456
bcdef
2345
bcdef
345
bcdef
23456
bcdef
3456
bcdef
2345
bcdef
345
-- negative offset and size
g
g
g
g
g
g
6
-
6
UBSAN bug

View File

@ -0,0 +1,146 @@
SELECT '-- argument validation';
SELECT substring('hello', []); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
SELECT substring('hello', 1, []); -- { serverError ILLEGAL_TYPE_OF_ARGUMENT }
SELECT substring(materialize('hello'), -1, -1);
SELECT substring(materialize('hello'), 0); -- { serverError ZERO_ARRAY_OR_TUPLE_INDEX }
SELECT '-- FixedString arguments';
SELECT substring(toFixedString('hello', 16), 1, 8);
SELECT substring(toFixedString(materialize('hello'), 16), 1, 8);
SELECT substring(toFixedString(toString(number), 16), 1, 8) FROM system.numbers LIMIT 10;
SELECT substring(toFixedString(toString(number), 4), 1, 3) FROM system.numbers LIMIT 995, 10;
SELECT substring(toFixedString(toString(number), 4), 1, number % 5) FROM system.numbers LIMIT 995, 10;
SELECT substring(toFixedString(toString(number), 4), 1 + number % 5) FROM system.numbers LIMIT 995, 10;
SELECT substring(toFixedString(toString(number), 4), 1 + number % 5, 1 + number % 3) FROM system.numbers LIMIT 995, 10;
SELECT '-- Enum arguments';
DROP TABLE IF EXISTS tab;
CREATE TABLE tab(e8 Enum8('hello' = -5, 'world' = 15), e16 Enum16('shark' = -999, 'eagle' = 9999)) ENGINE MergeTree ORDER BY tuple();
INSERT INTO TABLE tab VALUES ('hello', 'shark'), ('world', 'eagle');
-- positive offsets (slice from left)
SELECT substring(e8, 1), substring (e16, 1) FROM tab;
SELECT substring(e8, 2, 10), substring (e16, 2, 10) FROM tab;
-- negative offsets (slice from right)
SELECT substring(e8, -1), substring (e16, -1) FROM tab;
SELECT substring(e8, -2, 10), substring (e16, -2, 10) FROM tab;
-- zero offset/length
SELECT substring(e8, 1, 0), substring (e16, 1, 0) FROM tab;
SELECT '-- Constant enums';
SELECT substring(CAST('foo', 'Enum8(\'foo\' = 1)'), 1, 1), substring(CAST('foo', 'Enum16(\'foo\' = 1111)'), 1, 2);
DROP TABLE tab;
SELECT '-- negative offset argument';
SELECT substring('abc', number - 5) FROM system.numbers LIMIT 10;
SELECT substring(materialize('abc'), number - 5) FROM system.numbers LIMIT 10;
SELECT substring(toFixedString('abc', 3), number - 5) FROM system.numbers LIMIT 10;
SELECT substring(materialize(toFixedString('abc', 3)), number - 5) FROM system.numbers LIMIT 10;
SELECT substring('clickhouse', 2, -2);
SELECT substring(materialize('clickhouse'), 2, -2);
SELECT substring('clickhouse', materialize(2), -2);
SELECT substring(materialize('clickhouse'), materialize(2), -2);
SELECT substring('clickhouse', 2, materialize(-2));
SELECT substring(materialize('clickhouse'), 2, materialize(-2));
SELECT substring('clickhouse', materialize(2), materialize(-2));
SELECT substring(materialize('clickhouse'), materialize(2), materialize(-2));
SELECT '-- negative length argument';
SELECT substring('abcdefgh', 2, -2);
SELECT substring('abcdefgh', materialize(2), -2);
SELECT substring('abcdefgh', 2, materialize(-2));
SELECT substring('abcdefgh', materialize(2), materialize(-2));
SELECT substring(cast('abcdefgh' AS FixedString(8)), 2, -2);
SELECT substring(cast('abcdefgh' AS FixedString(8)), materialize(2), -2);
SELECT substring(cast('abcdefgh' AS FixedString(8)), 2, materialize(-2));
SELECT substring(cast('abcdefgh' AS FixedString(8)), materialize(2), materialize(-2));
DROP TABLE IF EXISTS tab;
CREATE TABLE tab (s String, l Int8, r Int8) ENGINE = Memory;
INSERT INTO tab VALUES ('abcdefgh', 2, -2), ('12345678', 3, -3);
SELECT substring(s, 2, -2) FROM tab;
SELECT substring(s, l, -2) FROM tab;
SELECT substring(s, 2, r) FROM tab;
SELECT substring(s, l, r) FROM tab;
DROP TABLE IF EXISTS tab;
CREATE TABLE tab (s FixedString(8), l Int8, r Int8) ENGINE = Memory;
INSERT INTO tab VALUES ('abcdefgh', 2, -2), ('12345678', 3, -3);
SELECT substring(s, 2, -2) FROM tab;
SELECT substring(s, l, -2) FROM tab;
SELECT substring(s, 2, r) FROM tab;
SELECT substring(s, l, r) FROM tab;
DROP TABLE IF EXISTS tab;
SELECT '-- negative offset and size';
SELECT substring('abcdefgh', -2, -2);
SELECT substring(materialize('abcdefgh'), -2, -2);
SELECT substring(materialize('abcdefgh'), materialize(-2), materialize(-2));
SELECT substring('abcdefgh', -2, -1);
SELECT substring(materialize('abcdefgh'), -2, -1);
SELECT substring(materialize('abcdefgh'), materialize(-2), materialize(-1));
SELECT substring(cast('abcdefgh' AS FixedString(8)), -2, -2);
SELECT substring(materialize(cast('abcdefgh' AS FixedString(8))), -2, -2);
SELECT substring(materialize(cast('abcdefgh' AS FixedString(8))), materialize(-2), materialize(-2));
SELECT substring(cast('abcdefgh' AS FixedString(8)), -2, -1);
SELECT substring(materialize(cast('abcdefgh' AS FixedString(8))), -2, -1);
SELECT substring(materialize(cast('abcdefgh' AS FixedString(8))), materialize(-2), materialize(-1));
DROP TABLE IF EXISTS t;
CREATE TABLE t
(
s String,
l Int8,
r Int8
) ENGINE = Memory;
INSERT INTO t VALUES ('abcdefgh', -2, -2),('12345678', -3, -3);
SELECT substring(s, -2, -2) FROM t;
SELECT substring(s, l, -2) FROM t;
SELECT substring(s, -2, r) FROM t;
SELECT substring(s, l, r) FROM t;
SELECT '-';
DROP TABLE IF EXISTS t;
CREATE TABLE t(
s FixedString(8),
l Int8,
r Int8
) engine = Memory;
INSERT INTO t VALUES ('abcdefgh', -2, -2),('12345678', -3, -3);
SELECT substring(s, -2, -2) FROM t;
SELECT substring(s, l, -2) FROM t;
SELECT substring(s, -2, r) FROM t;
SELECT substring(s, l, r) FROM t;
DROP table if exists t;
SELECT 'UBSAN bug';
/** NOTE: The behaviour of substring and substringUTF8 is inconsistent when negative offset is greater than string size:
* substring:
* hello
* ^-----^ - offset -10, length 7, result: "he"
* substringUTF8:
* hello
* ^-----^ - offset -10, length 7, result: "hello"
* This may be subject for change.
*/
SELECT substringUTF8('hello, пÑ<C2BF>ивеÑ<C2B5>', -9223372036854775808, number) FROM numbers(16) FORMAT Null;

View File

@ -1,8 +0,0 @@
lickhou
lickhou
lickhou
lickhou
lickhou
lickhou
lickhou
lickhou

View File

@ -1,8 +0,0 @@
SELECT substr('clickhouse', 2, -2);
SELECT substr(materialize('clickhouse'), 2, -2);
SELECT substr('clickhouse', materialize(2), -2);
SELECT substr(materialize('clickhouse'), materialize(2), -2);
SELECT substr('clickhouse', 2, materialize(-2));
SELECT substr(materialize('clickhouse'), 2, materialize(-2));
SELECT substr('clickhouse', materialize(2), materialize(-2));
SELECT substr(materialize('clickhouse'), materialize(2), materialize(-2));

View File

@ -1,27 +0,0 @@
bcdef
bcdef
bcdef
bcdef
-
bcdef
bcdef
bcdef
bcdef
-
bcdef
23456
bcdef
3456
bcdef
2345
bcdef
345
-
bcdef
23456
bcdef
3456
bcdef
2345
bcdef
345

View File

@ -1,36 +0,0 @@
select substring('abcdefgh', 2, -2);
select substring('abcdefgh', materialize(2), -2);
select substring('abcdefgh', 2, materialize(-2));
select substring('abcdefgh', materialize(2), materialize(-2));
select '-';
select substring(cast('abcdefgh' as FixedString(8)), 2, -2);
select substring(cast('abcdefgh' as FixedString(8)), materialize(2), -2);
select substring(cast('abcdefgh' as FixedString(8)), 2, materialize(-2));
select substring(cast('abcdefgh' as FixedString(8)), materialize(2), materialize(-2));
select '-';
drop table if exists t;
create table t (s String, l Int8, r Int8) engine = Memory;
insert into t values ('abcdefgh', 2, -2), ('12345678', 3, -3);
select substring(s, 2, -2) from t;
select substring(s, l, -2) from t;
select substring(s, 2, r) from t;
select substring(s, l, r) from t;
select '-';
drop table if exists t;
create table t (s FixedString(8), l Int8, r Int8) engine = Memory;
insert into t values ('abcdefgh', 2, -2), ('12345678', 3, -3);
select substring(s, 2, -2) from t;
select substring(s, l, -2) from t;
select substring(s, 2, r) from t;
select substring(s, l, r) from t;
drop table if exists t;

View File

@ -1,10 +0,0 @@
/** NOTE: The behaviour of substring and substringUTF8 is inconsistent when negative offset is greater than string size:
* substring:
* hello
* ^-----^ - offset -10, length 7, result: "he"
* substringUTF8:
* hello
* ^-----^ - offset -10, length 7, result: "hello"
* This may be subject for change.
*/
SELECT substringUTF8('hello, пÑ<C2BF>ивеÑ<C2B5>', -9223372036854775808, number) FROM numbers(16) FORMAT Null;

View File

@ -1,31 +0,0 @@
g
g
g
-
g
g
g
-
6
-
6

View File

@ -1,48 +0,0 @@
select substring('abcdefgh', -2, -2);
select substring(materialize('abcdefgh'), -2, -2);
select substring(materialize('abcdefgh'), materialize(-2), materialize(-2));
select substring('abcdefgh', -2, -1);
select substring(materialize('abcdefgh'), -2, -1);
select substring(materialize('abcdefgh'), materialize(-2), materialize(-1));
select '-';
select substring(cast('abcdefgh' as FixedString(8)), -2, -2);
select substring(materialize(cast('abcdefgh' as FixedString(8))), -2, -2);
select substring(materialize(cast('abcdefgh' as FixedString(8))), materialize(-2), materialize(-2));
select substring(cast('abcdefgh' as FixedString(8)), -2, -1);
select substring(materialize(cast('abcdefgh' as FixedString(8))), -2, -1);
select substring(materialize(cast('abcdefgh' as FixedString(8))), materialize(-2), materialize(-1));
select '-';
drop table if exists t;
create table t
(
s String,
l Int8,
r Int8
) engine = Memory;
insert into t values ('abcdefgh', -2, -2),('12345678', -3, -3);
select substring(s, -2, -2) from t;
select substring(s, l, -2) from t;
select substring(s, -2, r) from t;
select substring(s, l, r) from t;
select '-';
drop table if exists t;
create table t(
s FixedString(8),
l Int8,
r Int8
) engine = Memory;
insert into t values ('abcdefgh', -2, -2),('12345678', -3, -3);
select substring(s, -2, -2) from t;
select substring(s, l, -2) from t;
select substring(s, -2, r) from t;
select substring(s, l, r) from t;
drop table if exists t;