mirror of
https://github.com/sqlite/sqlite.git
synced 2025-04-21 19:26:38 +03:00
167 lines
4.6 KiB
Plaintext
167 lines
4.6 KiB
Plaintext
# 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
|
|
|
|
|