Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
231 changes: 231 additions & 0 deletions mysql-test/main/regexp_instr_mysql8.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
#
# MDEV-39520: Improve REGEXP_INSTR for MySQL 8.0 compatibility
#
# 1. Basic 2-argument form
SELECT REGEXP_INSTR('abba', 'b{2}');
REGEXP_INSTR('abba', 'b{2}')
2
SELECT REGEXP_INSTR('abba', 'x');
REGEXP_INSTR('abba', 'x')
0
SELECT REGEXP_INSTR('hello world', 'world');
REGEXP_INSTR('hello world', 'world')
7
SELECT REGEXP_INSTR('hello', '');
REGEXP_INSTR('hello', '')
1
SELECT REGEXP_INSTR('', 'a');
REGEXP_INSTR('', 'a')
0
SELECT REGEXP_INSTR('', '');
REGEXP_INSTR('', '')
1
# 2. Three arguments: pos
SELECT REGEXP_INSTR('abba', 'b{2}', 2);
REGEXP_INSTR('abba', 'b{2}', 2)
2
SELECT REGEXP_INSTR('abba', 'b{2}', 3);
REGEXP_INSTR('abba', 'b{2}', 3)
0
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1);
REGEXP_INSTR('abbabba', 'b{2}', 1)
2
SELECT REGEXP_INSTR('aabba', 'b', 3);
REGEXP_INSTR('aabba', 'b', 3)
3
SELECT REGEXP_INSTR('xyzabc', 'abc', 4);
REGEXP_INSTR('xyzabc', 'abc', 4)
4
SELECT REGEXP_INSTR('abc', 'c', 3);
REGEXP_INSTR('abc', 'c', 3)
3
SELECT REGEXP_INSTR('abc', 'c', 4);
REGEXP_INSTR('abc', 'c', 4)
0
# 3. Four arguments: occurrence
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 1);
REGEXP_INSTR('abbabba', 'b{2}', 1, 1)
2
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 2);
REGEXP_INSTR('abbabba', 'b{2}', 1, 2)
5
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 3);
REGEXP_INSTR('abbabba', 'b{2}', 1, 3)
0
SELECT REGEXP_INSTR('abbabba', 'b{2}', 2, 1);
REGEXP_INSTR('abbabba', 'b{2}', 2, 1)
2
SELECT REGEXP_INSTR('abbabba', 'b{2}', 2, 2);
REGEXP_INSTR('abbabba', 'b{2}', 2, 2)
5
SELECT REGEXP_INSTR('abbabba', 'b{2}', 3, 2);
REGEXP_INSTR('abbabba', 'b{2}', 3, 2)
0
SELECT REGEXP_INSTR('aaa', 'a', 1, 1);
REGEXP_INSTR('aaa', 'a', 1, 1)
1
SELECT REGEXP_INSTR('aaa', 'a', 1, 2);
REGEXP_INSTR('aaa', 'a', 1, 2)
2
SELECT REGEXP_INSTR('aaa', 'a', 1, 3);
REGEXP_INSTR('aaa', 'a', 1, 3)
3
SELECT REGEXP_INSTR('aaa', 'a', 1, 4);
REGEXP_INSTR('aaa', 'a', 1, 4)
0
# 4. Five arguments: return_option
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 1, 0);
REGEXP_INSTR('abbabba', 'b{2}', 1, 1, 0)
2
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 1, 1);
REGEXP_INSTR('abbabba', 'b{2}', 1, 1, 1)
4
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 2, 0);
REGEXP_INSTR('abbabba', 'b{2}', 1, 2, 0)
5
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 2, 1);
REGEXP_INSTR('abbabba', 'b{2}', 1, 2, 1)
7
SELECT REGEXP_INSTR('abcabc', 'b', 1, 1, 0);
REGEXP_INSTR('abcabc', 'b', 1, 1, 0)
2
SELECT REGEXP_INSTR('abcabc', 'b', 1, 1, 1);
REGEXP_INSTR('abcabc', 'b', 1, 1, 1)
3
SELECT REGEXP_INSTR('abcabc', 'b', 1, 2, 0);
REGEXP_INSTR('abcabc', 'b', 1, 2, 0)
5
SELECT REGEXP_INSTR('abcabc', 'b', 1, 2, 1);
REGEXP_INSTR('abcabc', 'b', 1, 2, 1)
6
SELECT REGEXP_INSTR('abcabc', 'z', 1, 1, 1);
REGEXP_INSTR('abcabc', 'z', 1, 1, 1)
0
# 5. Six arguments: match_type
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'i');
REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'i')
1
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'c');
REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'c')
0
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'ci');
REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'ci')
1
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'ic');
REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'ic')
0
SELECT REGEXP_INSTR('a\nb\nc', '^b$', 1, 1, 0, 'm');
REGEXP_INSTR('a\nb\nc', '^b$', 1, 1, 0, 'm')
3
SELECT REGEXP_INSTR('a\nb\nc', '^b$', 1, 1, 0, '');
REGEXP_INSTR('a\nb\nc', '^b$', 1, 1, 0, '')
0
SELECT REGEXP_INSTR('a\nb\nc', 'a.b', 1, 1, 0, 'n');
REGEXP_INSTR('a\nb\nc', 'a.b', 1, 1, 0, 'n')
1
SELECT REGEXP_INSTR('a\nb\nc', 'a.b', 1, 1, 0, '');
REGEXP_INSTR('a\nb\nc', 'a.b', 1, 1, 0, '')
0
SELECT REGEXP_INSTR('a\nb', '^b$', 1, 1, 0, 'mu');
REGEXP_INSTR('a\nb', '^b$', 1, 1, 0, 'mu')
3
SELECT REGEXP_INSTR('a\nB\nc', '^b$', 1, 1, 0, 'im');
REGEXP_INSTR('a\nB\nc', '^b$', 1, 1, 0, 'im')
3
# 6. Multibyte characters
SET NAMES utf8mb4;
SELECT REGEXP_INSTR('áéí', 'é');
REGEXP_INSTR('áéí', 'é')
2
SELECT REGEXP_INSTR('áéí', 'í');
REGEXP_INSTR('áéí', 'í')
3
SELECT REGEXP_INSTR('αβγδ', 'γ');
REGEXP_INSTR('αβγδ', 'γ')
3
SELECT REGEXP_INSTR('áéíó', 'í', 2);
REGEXP_INSTR('áéíó', 'í', 2)
3
SELECT REGEXP_INSTR('αβγδ', 'β', 2);
REGEXP_INSTR('αβγδ', 'β', 2)
2
SELECT REGEXP_INSTR('αβγδ', 'β', 1, 1, 1);
REGEXP_INSTR('αβγδ', 'β', 1, 1, 1)
3
# 7. NULL propagation
SELECT REGEXP_INSTR(NULL, 'a');
REGEXP_INSTR(NULL, 'a')
NULL
SELECT REGEXP_INSTR('abc', NULL);
REGEXP_INSTR('abc', NULL)
NULL
SELECT REGEXP_INSTR('abc', 'a', NULL);
REGEXP_INSTR('abc', 'a', NULL)
NULL
SELECT REGEXP_INSTR('abc', 'a', 1, NULL);
REGEXP_INSTR('abc', 'a', 1, NULL)
NULL
SELECT REGEXP_INSTR('abc', 'a', 1, 1, NULL);
REGEXP_INSTR('abc', 'a', 1, 1, NULL)
NULL
SELECT REGEXP_INSTR('abc', 'a', 1, 1, 0, NULL);
REGEXP_INSTR('abc', 'a', 1, 1, 0, NULL)
NULL
# 8. Edge cases
SELECT REGEXP_INSTR('abc', '', 1, 1);
REGEXP_INSTR('abc', '', 1, 1)
1
SELECT REGEXP_INSTR('abc', '', 1, 2);
REGEXP_INSTR('abc', '', 1, 2)
2
SELECT REGEXP_INSTR('abc', '', 1, 3);
REGEXP_INSTR('abc', '', 1, 3)
3
SELECT REGEXP_INSTR('abc', '', 1, 4);
REGEXP_INSTR('abc', '', 1, 4)
4
SELECT REGEXP_INSTR('abc', '', 1, 5);
REGEXP_INSTR('abc', '', 1, 5)
0
SELECT REGEXP_INSTR('abcabc', '^abc');
REGEXP_INSTR('abcabc', '^abc')
1
SELECT REGEXP_INSTR('abcabc', 'abc$');
REGEXP_INSTR('abcabc', 'abc$')
4
SELECT REGEXP_INSTR('abcabc', '^abc$');
REGEXP_INSTR('abcabc', '^abc$')
0
SELECT REGEXP_INSTR('foo bar baz', 'bar|baz', 1, 1);
REGEXP_INSTR('foo bar baz', 'bar|baz', 1, 1)
5
SELECT REGEXP_INSTR('foo bar baz', 'bar|baz', 1, 2);
REGEXP_INSTR('foo bar baz', 'bar|baz', 1, 2)
9
SELECT REGEXP_INSTR('aabbaabb', '(a+)(b+)\\1', 1, 1);
REGEXP_INSTR('aabbaabb', '(a+)(b+)\\1', 1, 1)
1
SELECT REGEXP_INSTR('aabbaabb', '(a+)(b+)\\1', 1, 2);
REGEXP_INSTR('aabbaabb', '(a+)(b+)\\1', 1, 2)
0
SELECT REGEXP_INSTR(REPEAT('x', 1000), 'x{5}', 1, 1);
REGEXP_INSTR(REPEAT('x', 1000), 'x{5}', 1, 1)
1
SELECT REGEXP_INSTR(REPEAT('x', 1000), 'x{5}', 1, 200);
REGEXP_INSTR(REPEAT('x', 1000), 'x{5}', 1, 200)
996
SELECT REGEXP_INSTR('Test-abc-abc-abc', 'AB', 1, 3, 0);
REGEXP_INSTR('Test-abc-abc-abc', 'AB', 1, 3, 0)
14
SELECT REGEXP_INSTR('Test-abc-abc-abc', 'AB', 1, 3, 0, 'c');
REGEXP_INSTR('Test-abc-abc-abc', 'AB', 1, 3, 0, 'c')
0
# Non-constant match_type with constant pattern
CREATE TABLE foo (cond VARCHAR(50));
INSERT INTO foo VALUES ('c'), ('ic');
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, cond) FROM foo;
REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, cond)
0
0
DROP TABLE foo;
End of 13.0 tests
123 changes: 123 additions & 0 deletions mysql-test/main/regexp_instr_mysql8.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
--echo #
--echo # MDEV-39520: Improve REGEXP_INSTR for MySQL 8.0 compatibility
--echo #

--echo # 1. Basic 2-argument form

SELECT REGEXP_INSTR('abba', 'b{2}');
SELECT REGEXP_INSTR('abba', 'x');
SELECT REGEXP_INSTR('hello world', 'world');
SELECT REGEXP_INSTR('hello', '');
SELECT REGEXP_INSTR('', 'a');
SELECT REGEXP_INSTR('', '');

--echo # 2. Three arguments: pos

SELECT REGEXP_INSTR('abba', 'b{2}', 2);
SELECT REGEXP_INSTR('abba', 'b{2}', 3);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1);
SELECT REGEXP_INSTR('aabba', 'b', 3);
SELECT REGEXP_INSTR('xyzabc', 'abc', 4);
SELECT REGEXP_INSTR('abc', 'c', 3);
SELECT REGEXP_INSTR('abc', 'c', 4);

--echo # 3. Four arguments: occurrence

SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 1);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 2);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 3);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 2, 1);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 2, 2);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 3, 2);

# Repeating pattern
SELECT REGEXP_INSTR('aaa', 'a', 1, 1);
SELECT REGEXP_INSTR('aaa', 'a', 1, 2);
SELECT REGEXP_INSTR('aaa', 'a', 1, 3);
SELECT REGEXP_INSTR('aaa', 'a', 1, 4);

--echo # 4. Five arguments: return_option

SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 1, 0);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 1, 1);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 2, 0);
SELECT REGEXP_INSTR('abbabba', 'b{2}', 1, 2, 1);

SELECT REGEXP_INSTR('abcabc', 'b', 1, 1, 0);
SELECT REGEXP_INSTR('abcabc', 'b', 1, 1, 1);
SELECT REGEXP_INSTR('abcabc', 'b', 1, 2, 0);
SELECT REGEXP_INSTR('abcabc', 'b', 1, 2, 1);
SELECT REGEXP_INSTR('abcabc', 'z', 1, 1, 1);

--echo # 5. Six arguments: match_type

SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'i');
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'c');
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'ci');
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, 'ic');
SELECT REGEXP_INSTR('a\nb\nc', '^b$', 1, 1, 0, 'm');
SELECT REGEXP_INSTR('a\nb\nc', '^b$', 1, 1, 0, '');
SELECT REGEXP_INSTR('a\nb\nc', 'a.b', 1, 1, 0, 'n');
SELECT REGEXP_INSTR('a\nb\nc', 'a.b', 1, 1, 0, '');
SELECT REGEXP_INSTR('a\nb', '^b$', 1, 1, 0, 'mu');
SELECT REGEXP_INSTR('a\nB\nc', '^b$', 1, 1, 0, 'im');

--echo # 6. Multibyte characters

SET NAMES utf8mb4;

SELECT REGEXP_INSTR('áéí', 'é');
SELECT REGEXP_INSTR('áéí', 'í');
SELECT REGEXP_INSTR('αβγδ', 'γ');

SELECT REGEXP_INSTR('áéíó', 'í', 2);
SELECT REGEXP_INSTR('αβγδ', 'β', 2);

SELECT REGEXP_INSTR('αβγδ', 'β', 1, 1, 1);

--echo # 7. NULL propagation

SELECT REGEXP_INSTR(NULL, 'a');
SELECT REGEXP_INSTR('abc', NULL);
SELECT REGEXP_INSTR('abc', 'a', NULL);
SELECT REGEXP_INSTR('abc', 'a', 1, NULL);
SELECT REGEXP_INSTR('abc', 'a', 1, 1, NULL);
SELECT REGEXP_INSTR('abc', 'a', 1, 1, 0, NULL);

--echo # 8. Edge cases

# Zero-length match
SELECT REGEXP_INSTR('abc', '', 1, 1);
SELECT REGEXP_INSTR('abc', '', 1, 2);
SELECT REGEXP_INSTR('abc', '', 1, 3);
SELECT REGEXP_INSTR('abc', '', 1, 4);
SELECT REGEXP_INSTR('abc', '', 1, 5);

# Anchored patterns
SELECT REGEXP_INSTR('abcabc', '^abc');
SELECT REGEXP_INSTR('abcabc', 'abc$');
SELECT REGEXP_INSTR('abcabc', '^abc$');

# Alternation
SELECT REGEXP_INSTR('foo bar baz', 'bar|baz', 1, 1);
SELECT REGEXP_INSTR('foo bar baz', 'bar|baz', 1, 2);

# Back-references
SELECT REGEXP_INSTR('aabbaabb', '(a+)(b+)\\1', 1, 1);
SELECT REGEXP_INSTR('aabbaabb', '(a+)(b+)\\1', 1, 2);

# Very long subject
SELECT REGEXP_INSTR(REPEAT('x', 1000), 'x{5}', 1, 1);
SELECT REGEXP_INSTR(REPEAT('x', 1000), 'x{5}', 1, 200);

# case-sensitive vs collation default
SELECT REGEXP_INSTR('Test-abc-abc-abc', 'AB', 1, 3, 0);
SELECT REGEXP_INSTR('Test-abc-abc-abc', 'AB', 1, 3, 0, 'c');

--echo # Non-constant match_type with constant pattern
CREATE TABLE foo (cond VARCHAR(50));
INSERT INTO foo VALUES ('c'), ('ic');
SELECT REGEXP_INSTR('Abba', 'ABBA', 1, 1, 0, cond) FROM foo;
DROP TABLE foo;

--echo End of 13.0 tests
Loading
Loading