diff options
author | dan <Dan Kennedy> | 2025-01-31 14:52:36 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2025-01-31 14:52:36 +0000 |
commit | f6ca35d88cad6521ad06c6c9e1bfe0e3066d8cbb (patch) | |
tree | 3d9bb8c7ade44432f4beb24748cffbe93dbbb469 /test | |
parent | a0337903030a123f09eae41a5146993ff81d83e4 (diff) | |
download | sqlite-f6ca35d88cad6521ad06c6c9e1bfe0e3066d8cbb.tar.gz sqlite-f6ca35d88cad6521ad06c6c9e1bfe0e3066d8cbb.zip |
Fix a problem with LIKE and GLOB processing in utf-16be databases in cases where the utf-8 encoding of a character ends with the byte 0xBF.
FossilOrigin-Name: 4b4f33d791fe4318c4597bee7d2f9e486ed223e731982af470f5cc0dbdc600fc
Diffstat (limited to 'test')
-rw-r--r-- | test/like3.test | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/test/like3.test b/test/like3.test index a93e113d6..2987e0e0e 100644 --- a/test/like3.test +++ b/test/like3.test @@ -275,4 +275,84 @@ do_eqp_test like3-6.240 { } } +#------------------------------------------------------------------------- + +ifcapable utf16 { + reset_db + do_execsql_test like3-7.0 { + PRAGMA encoding = 'UTF-16be'; + + CREATE TABLE Example(word TEXT NOT NULL); + CREATE INDEX Example_word on Example(word); + + INSERT INTO Example VALUES(char(0x307F)); + } + + do_execsql_test like3-7.1 { + SELECT char(0x307F)=='み'; + } {1} + + do_execsql_test like3-7.1 { + SELECT * FROM Example WHERE word GLOB 'み*' + } {み} + + do_execsql_test like3-7.2 { + SELECT * FROM Example WHERE word >= char(0x307F) AND word < char(0x3080); + } {み} +} + +#------------------------------------------------------------------------- +reset_db + +foreach enc { + UTF-8 + UTF-16le + UTF-16be +} { + foreach {tn expr} { + 1 "CAST (X'FF' AS TEXT)" + 2 "CAST (X'FFBF' AS TEXT)" + 3 "CAST (X'FFBFBF' AS TEXT)" + 4 "CAST (X'FFBFBFBF' AS TEXT)" + + 5 "'abc' || CAST (X'FF' AS TEXT)" + 6 "'def' || CAST (X'FFBF' AS TEXT)" + 7 "'ghi' || CAST (X'FFBFBF' AS TEXT)" + 8 "'jkl' || CAST (X'FFBFBFBF' AS TEXT)" + } { + reset_db + execsql "PRAGMA encoding = '$enc'" + do_execsql_test like3-8.$tn.0 { + CREATE TABLE t1(x); + } + + do_execsql_test like3-8.$tn.1 { + PRAGMA encoding + } $enc + + do_execsql_test like3-8.$tn.1 " + INSERT INTO t1 VALUES( $expr ) + " + + do_execsql_test like3-8.$tn.2 { + SELECT typeof(x) FROM t1 + } {text} + + set x [db one {SELECT x || '%' FROM t1}] + + do_execsql_test like3-8.$tn.3 { + SELECT rowid FROM t1 WHERE x LIKE $x + } 1 + + do_execsql_test like3-8.$tn.4 { + CREATE INDEX i1 ON t1(x); + } + + do_execsql_test like3-8.$tn.5 { + SELECT rowid FROM t1 WHERE x LIKE $x + } 1 + } +} + finish_test + |