| # 2024 July 30 |
| # |
| # The author disclaims copyright to this source code. In place of |
| # a legal notice, here is a blessing: |
| # |
| # May you do good and not evil. |
| # May you find forgiveness for yourself and forgive others. |
| # May you share freely, never taking more than you give. |
| # |
| #*********************************************************************** |
| # |
| # This file verifies that: |
| # |
| # * blob values may be written to locale=0 tables. |
| # |
| # * blob values - other than fts5_locale() values - may not be written |
| # to locale=0 tables. This is an SQLITE_MISMATCH error |
| # |
| # * blob values may be returned by queries on the external-content table |
| # of a locale=0 table. |
| # |
| # * blob values not may be returned by queries on the external-content |
| # table of a locale=1 table, apart from fts5_locale() blobs. This is an |
| # SQLITE_MISMATCH error. |
| # |
| |
| source [file join [file dirname [info script]] fts5_common.tcl] |
| set testprefix fts5blob |
| |
| # If SQLITE_ENABLE_FTS5 is not defined, omit this file. |
| ifcapable !fts5 { |
| finish_test |
| return |
| } |
| |
| # Test that blobs may be stored in normal locale=0 tables. |
| # |
| foreach {tn enc} { |
| 1 utf8 |
| 2 utf16 |
| } { |
| reset_db |
| fts5_aux_test_functions db |
| |
| execsql "PRAGMA encoding = $enc" |
| |
| execsql " |
| CREATE VIRTUAL TABLE t1 USING fts5(x, y); |
| " |
| do_execsql_test 1.$tn.0 { |
| CREATE VIRTUAL TABLE tt USING fts5vocab('t1', 'instance'); |
| INSERT INTO t1(rowid, x, y) VALUES(1, 555, X'0000000041424320444546'); |
| INSERT INTO t1(rowid, x, y) VALUES(2, 666, X'41424300444546'); |
| INSERT INTO t1(rowid, x, y) VALUES(3, 777, 'xyz'); |
| } |
| |
| do_execsql_test 1.$tn.1 { |
| SELECT rowid, quote(x), quote(y) FROM t1 |
| } { |
| 1 555 X'0000000041424320444546' |
| 2 666 X'41424300444546' |
| 3 777 'xyz' |
| } |
| |
| do_execsql_test 1.$tn.2 { |
| DELETE FROM t1 WHERE rowid=2; |
| DELETE FROM t1 WHERE rowid=1; |
| } |
| |
| do_execsql_test 1.$tn.3 { |
| PRAGMA integrity_check; |
| } {ok} |
| } |
| |
| #-------------------------------------------------------------------------- |
| # Test that a blob may be stored and retrieved in an unindexed column of |
| # a regular table with locale=1. |
| # |
| reset_db |
| do_execsql_test 2.0 { |
| CREATE VIRTUAL TABLE t1 USING fts5(x, y UNINDEXED, locale=1); |
| INSERT INTO t1(rowid, x, y) VALUES(12, 'twelve', X'0000000041424320444546'); |
| } |
| |
| do_execsql_test 2.1 { |
| select rowid, x, quote(y) FROM t1 |
| } { |
| 12 twelve X'0000000041424320444546' |
| } |
| |
| #-------------------------------------------------------------------------- |
| # Test that blobs may not be written to any type of table with locale=1 |
| # set. Except, they may be written to UNINDEXED columns. |
| # |
| reset_db |
| do_execsql_test 3.0 { |
| CREATE TABLE t1(a, b); |
| |
| CREATE VIRTUAL TABLE x1 USING fts5(a, b, locale=1); |
| CREATE VIRTUAL TABLE x2 USING fts5(a, b, locale=1, content=t2); |
| CREATE VIRTUAL TABLE x3 USING fts5(a, b, locale=1, content=); |
| } |
| |
| do_catchsql_test 3.1 { |
| INSERT INTO x1(rowid, a, b) VALUES(113, 'hello world', X'123456'); |
| } {0 {}} |
| do_catchsql_test 3.2 { |
| INSERT INTO x2(rowid, a, b) VALUES(113, 'hello world', X'123456'); |
| } {0 {}} |
| do_catchsql_test 3.3 { |
| INSERT INTO x3(rowid, a, b) VALUES(113, 'hello world', X'123456'); |
| } {0 {}} |
| |
| |
| #-------------------------------------------------------------------------- |
| # Test that fts5_locale() values may not be written to any type of table |
| # without locale=1 set. Even to an UNINDEXED column. |
| # |
| reset_db |
| do_execsql_test 3.0 { |
| CREATE TABLE t1(a, b); |
| |
| CREATE VIRTUAL TABLE x1 USING fts5(a, b); |
| CREATE VIRTUAL TABLE x2 USING fts5(a, b, content=t2); |
| CREATE VIRTUAL TABLE x3 USING fts5(a, b, content=); |
| |
| CREATE VIRTUAL TABLE x4 USING fts5(a, b, c UNINDEXED); |
| } |
| |
| do_catchsql_test 3.1 { |
| INSERT INTO x1(rowid, a, b) |
| VALUES(113, 'hello world', fts5_locale('en_AU', 'abc')); |
| } {1 {fts5_locale() requires locale=1}} |
| do_catchsql_test 3.2 { |
| INSERT INTO x2(rowid, a, b) |
| VALUES(113, 'hello world', fts5_locale('en_AU', 'abc')); |
| } {1 {fts5_locale() requires locale=1}} |
| do_catchsql_test 3.3 { |
| INSERT INTO x3(rowid, a, b) |
| VALUES(113, 'hello world', fts5_locale('en_AU', 'abc')); |
| } {1 {fts5_locale() requires locale=1}} |
| do_catchsql_test 3.4 { |
| INSERT INTO x4(rowid, a, b, c) |
| VALUES(113, 'hello world', 'yesno', fts5_locale('en_AU', 'abc')); |
| } {1 {fts5_locale() requires locale=1}} |
| |
| |
| #------------------------------------------------------------------------- |
| # |
| reset_db |
| do_execsql_test 4.0 { |
| CREATE VIRTUAL TABLE x1 USING fts5(x); |
| } |
| |
| foreach {tn sql} { |
| 1 { INSERT INTO x1(rowid, x) VALUES(4.5, 'abcd') } |
| 2 { INSERT INTO x1(rowid, x) VALUES('xyz', 'abcd') } |
| 3 { INSERT INTO x1(rowid, x) VALUES(X'001122', 'abcd') } |
| } { |
| do_catchsql_test 4.1.$tn $sql {1 {datatype mismatch}} |
| } |
| |
| |
| finish_test |
| |
| |