177 lines
2.6 KiB
SQL
177 lines
2.6 KiB
SQL
# name: test/sql/collate/test_strpos_collate.test
|
|
# description: Test that strpos/instr/position functions properly support COLLATE NOCASE
|
|
# group: [collate]
|
|
|
|
# Test that strpos works with COLLATE NOCASE
|
|
query I
|
|
SELECT strpos('HELLO' COLLATE NOCASE, 'el')
|
|
----
|
|
2
|
|
|
|
# Test with different case combinations
|
|
query I
|
|
SELECT strpos('HELLO' COLLATE NOCASE, 'EL')
|
|
----
|
|
2
|
|
|
|
query I
|
|
SELECT strpos('hello' COLLATE NOCASE, 'EL')
|
|
----
|
|
2
|
|
|
|
query I
|
|
SELECT strpos('HeLLo' COLLATE NOCASE, 'el')
|
|
----
|
|
2
|
|
|
|
# Test instr function (alias for strpos)
|
|
query I
|
|
SELECT instr('HELLO' COLLATE NOCASE, 'el')
|
|
----
|
|
2
|
|
|
|
query I
|
|
SELECT instr('hello' COLLATE NOCASE, 'EL')
|
|
----
|
|
2
|
|
|
|
# Test position function (alias for strpos)
|
|
query I
|
|
SELECT position('el' IN ('HELLO' COLLATE NOCASE))
|
|
----
|
|
2
|
|
|
|
query I
|
|
SELECT position('EL' IN ('hello' COLLATE NOCASE))
|
|
----
|
|
2
|
|
|
|
# Test edge cases
|
|
query I
|
|
SELECT strpos('HELLO' COLLATE NOCASE, '')
|
|
----
|
|
1
|
|
|
|
query I
|
|
SELECT strpos('HELLO' COLLATE NOCASE, 'xyz')
|
|
----
|
|
0
|
|
|
|
query I
|
|
SELECT strpos('HELLO' COLLATE NOCASE, 'HELLO')
|
|
----
|
|
1
|
|
|
|
# Test with longer strings
|
|
query I
|
|
SELECT strpos('Hello World' COLLATE NOCASE, 'world')
|
|
----
|
|
7
|
|
|
|
query I
|
|
SELECT strpos('HELLO WORLD' COLLATE NOCASE, 'o w')
|
|
----
|
|
5
|
|
|
|
# Test that other string functions still work (regression test)
|
|
query T
|
|
SELECT contains('HELLO' COLLATE NOCASE, 'hEllO')
|
|
----
|
|
true
|
|
|
|
query T
|
|
SELECT starts_with('HELLO' COLLATE NOCASE, 'heL')
|
|
----
|
|
true
|
|
|
|
# Test with table data
|
|
statement ok
|
|
CREATE TABLE collate_test(s VARCHAR COLLATE NOCASE)
|
|
|
|
statement ok
|
|
INSERT INTO collate_test VALUES ('Hello World'), ('HELLO WORLD'), ('hElLo WoRlD')
|
|
|
|
# Test basic functionality
|
|
query I
|
|
SELECT strpos(s COLLATE NOCASE, 'hello') FROM collate_test ORDER BY s
|
|
----
|
|
1
|
|
1
|
|
1
|
|
|
|
query I
|
|
SELECT strpos(s COLLATE NOCASE, 'world') FROM collate_test ORDER BY s
|
|
----
|
|
7
|
|
7
|
|
7
|
|
|
|
# Test with mixed collations
|
|
query I
|
|
SELECT strpos('HELLO' COLLATE NOCASE, 'el' COLLATE NOCASE)
|
|
----
|
|
2
|
|
|
|
query I
|
|
SELECT strpos('HELLO' COLLATE NOCASE, 'EL')
|
|
----
|
|
2
|
|
|
|
# Test that non-collated versions still work
|
|
query I
|
|
SELECT strpos('HELLO', 'el')
|
|
----
|
|
0
|
|
|
|
query I
|
|
SELECT strpos('HELLO', 'EL')
|
|
----
|
|
2
|
|
|
|
# Test with empty strings and edge cases
|
|
query I
|
|
SELECT strpos('' COLLATE NOCASE, '')
|
|
----
|
|
1
|
|
|
|
query I
|
|
SELECT strpos('' COLLATE NOCASE, 'a')
|
|
----
|
|
0
|
|
|
|
query I
|
|
SELECT strpos('a' COLLATE NOCASE, '')
|
|
----
|
|
1
|
|
|
|
# Test with special characters
|
|
query I
|
|
SELECT strpos('HéLLO' COLLATE NOCASE, 'éll')
|
|
----
|
|
2
|
|
|
|
query I
|
|
SELECT strpos('HÉLLO' COLLATE NOCASE, 'éll')
|
|
----
|
|
2
|
|
|
|
# Test that the fix doesn't break existing behavior
|
|
query I
|
|
SELECT strpos('HELLO', 'HELLO')
|
|
----
|
|
1
|
|
|
|
query I
|
|
SELECT strpos('HELLO', '')
|
|
----
|
|
1
|
|
|
|
query I
|
|
SELECT strpos('HELLO', 'xyz')
|
|
----
|
|
0
|
|
|
|
# Clean up
|
|
statement ok
|
|
DROP TABLE collate_test
|