1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Disable the two-argument form of the fts3_tokenizer() SQL function unless the library is built with -DSQLITE_ENABLE_FTS3_TOKENIZER.

FossilOrigin-Name: e0eb217aca7e4aadf9c44ed20822b78139f7c83c
This commit is contained in:
dan
2016-02-08 19:40:17 +00:00
parent e96f361995
commit e064c4066c
6 changed files with 111 additions and 86 deletions

View File

@@ -67,6 +67,7 @@ static void scalarFunc(
nName = sqlite3_value_bytes(argv[0])+1; nName = sqlite3_value_bytes(argv[0])+1;
if( argc==2 ){ if( argc==2 ){
#ifdef SQLITE_ENABLE_FTS3_TOKENIZER
void *pOld; void *pOld;
int n = sqlite3_value_bytes(argv[1]); int n = sqlite3_value_bytes(argv[1]);
if( zName==0 || n!=sizeof(pPtr) ){ if( zName==0 || n!=sizeof(pPtr) ){
@@ -79,7 +80,14 @@ static void scalarFunc(
sqlite3_result_error(context, "out of memory", -1); sqlite3_result_error(context, "out of memory", -1);
return; return;
} }
}else{ #else
sqlite3_result_error(context, "fts3tokenize: "
"disabled - rebuild with -DSQLITE_ENABLE_FTS3_TOKENIZER", -1
);
return;
#endif /* SQLITE_ENABLE_FTS3_TOKENIZER */
}else
{
if( zName ){ if( zName ){
pPtr = sqlite3Fts3HashFind(pHash, zName, nName); pPtr = sqlite3Fts3HashFind(pHash, zName, nName);
} }
@@ -420,11 +428,13 @@ static void intTestFunc(
assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") );
/* Test the storage function */ /* Test the storage function */
#ifdef SQLITE_ENABLE_FTS3_TOKENIZER
rc = registerTokenizer(db, "nosuchtokenizer", p1); rc = registerTokenizer(db, "nosuchtokenizer", p1);
assert( rc==SQLITE_OK ); assert( rc==SQLITE_OK );
rc = queryTokenizer(db, "nosuchtokenizer", &p2); rc = queryTokenizer(db, "nosuchtokenizer", &p2);
assert( rc==SQLITE_OK ); assert( rc==SQLITE_OK );
assert( p2==p1 ); assert( p2==p1 );
#endif
sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); sqlite3_result_text(context, "ok", -1, SQLITE_STATIC);
} }

View File

@@ -1,5 +1,5 @@
C Changes\sto\shelp\sthe\stokenizer\srun\sabout\s33%\sfaster. C Disable\sthe\stwo-argument\sform\sof\sthe\sfts3_tokenizer()\sSQL\sfunction\sunless\sthe\slibrary\sis\sbuilt\swith\s-DSQLITE_ENABLE_FTS3_TOKENIZER.
D 2016-02-08T19:36:46.659 D 2016-02-08T19:40:17.991
F Makefile.in dac2776c84e0d533b158a9af6e57e05c4a6b19f3 F Makefile.in dac2776c84e0d533b158a9af6e57e05c4a6b19f3
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc fcf377286d910b47e072da1ac7945976337c0925 F Makefile.msc fcf377286d910b47e072da1ac7945976337c0925
@@ -83,7 +83,7 @@ F ext/fts3/fts3_snippet.c 68ae118b0f834ea53d2b89e4087fc0f0b8c4ee4e
F ext/fts3/fts3_term.c 88c55a6fa1a51ab494e33dced0401a6c28791fd7 F ext/fts3/fts3_term.c 88c55a6fa1a51ab494e33dced0401a6c28791fd7
F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038 F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038
F ext/fts3/fts3_tokenize_vtab.c a27593ab19657166f6fa5ec073b678cc29a75860 F ext/fts3/fts3_tokenize_vtab.c a27593ab19657166f6fa5ec073b678cc29a75860
F ext/fts3/fts3_tokenizer.c 50e7a69a549ac5882cc1971ee43f66aaabc11395 F ext/fts3/fts3_tokenizer.c 0d3a77bbdc6f394d302f24980fa80667371c6e68
F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3
F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004
F ext/fts3/fts3_unicode.c a93f5edc0aff44ef8b06d7cb55b52026541ca145 F ext/fts3/fts3_unicode.c a93f5edc0aff44ef8b06d7cb55b52026541ca145
@@ -372,7 +372,7 @@ F src/test_autoext.c dea8a01a7153b9adc97bd26161e4226329546e12
F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803 F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803
F src/test_blob.c e5a7a81d61a780da79101aeb1e60d300af169e07 F src/test_blob.c e5a7a81d61a780da79101aeb1e60d300af169e07
F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f
F src/test_config.c 0dee90328e3dedf8ba002ee94b6a7e7ea7726fe4 F src/test_config.c 7985332c806d1cece793475c75a6abcccde9d331
F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852 F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852
F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc
F src/test_fs.c a61f54247fdb843761d709879c3bcd1989b2050c F src/test_fs.c a61f54247fdb843761d709879c3bcd1989b2050c
@@ -697,7 +697,7 @@ F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f
F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8
F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18
F test/fts3ao.test 3e4e3d5e75c076520341d0bdf4eb17c00e8cbde2 F test/fts3ao.test 3e4e3d5e75c076520341d0bdf4eb17c00e8cbde2
F test/fts3atoken.test e3a126365131a6db52efc20a9a6053cd44e5f289 F test/fts3atoken.test 76262be798f23a390717d14266f0df551e52a7ee
F test/fts3auto.test b981fea19b132b4e6878f50d7c1f369b28f68eb9 F test/fts3auto.test b981fea19b132b4e6878f50d7c1f369b28f68eb9
F test/fts3aux1.test f8f287a4a73f381f8fa15b6a70f36245f903d221 F test/fts3aux1.test f8f287a4a73f381f8fa15b6a70f36245f903d221
F test/fts3aux2.test 7ae2b2c13aefdf4169279a27a5f51780ce57f6ba F test/fts3aux2.test 7ae2b2c13aefdf4169279a27a5f51780ce57f6ba
@@ -744,7 +744,7 @@ F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01
F test/fts4growth.test 60d6bb3f78e25b34f533797dd9f2f9402310a13a F test/fts4growth.test 60d6bb3f78e25b34f533797dd9f2f9402310a13a
F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269 F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269
F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d
F test/fts4langid.test 24a6e41063b416bbdf371ff6b4476fa41c194aa7 F test/fts4langid.test 8bd8759e0d4b04d71771544b861193a6841fee84
F test/fts4merge.test c424309743fdd203f8e56a1f1cd7872cd66cc0ee F test/fts4merge.test c424309743fdd203f8e56a1f1cd7872cd66cc0ee
F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891
F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7 F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7
@@ -1427,8 +1427,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 852a529a8b112049f67a3126f677c06ae4a22d73 04f7da77c13925c1f1e287f4579bb85518297d81 P a050e6f096d40aa5b6275797b96e62c228044f5a
R 64edf86f87d772039cf70265114474cb R b09b6ba902e95153c88d724675282802
T +closed 04f7da77c13925c1f1e287f4579bb85518297d81 U dan
U drh Z a5b8919de2cf0c2997cac75a4e3c3a2c
Z feb6daf33d3b967be60d8c209f5e5987

View File

@@ -1 +1 @@
a050e6f096d40aa5b6275797b96e62c228044f5a e0eb217aca7e4aadf9c44ed20822b78139f7c83c

View File

@@ -370,6 +370,12 @@ static void set_options(Tcl_Interp *interp){
Tcl_SetVar2(interp, "sqlite_options", "fts3", "0", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "fts3", "0", TCL_GLOBAL_ONLY);
#endif #endif
#ifdef SQLITE_ENABLE_FTS3_TOKENIZER
Tcl_SetVar2(interp, "sqlite_options", "fts3_tokenizer", "1", TCL_GLOBAL_ONLY);
#else
Tcl_SetVar2(interp, "sqlite_options", "fts3_tokenizer", "0", TCL_GLOBAL_ONLY);
#endif
#ifdef SQLITE_ENABLE_FTS5 #ifdef SQLITE_ENABLE_FTS5
Tcl_SetVar2(interp, "sqlite_options", "fts5", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "fts5", "1", TCL_GLOBAL_ONLY);
#else #else

View File

@@ -24,7 +24,7 @@ ifcapable !fts3 {
return return
} }
set ::testprefix fts3token set ::testprefix fts3atoken
proc escape_string {str} { proc escape_string {str} {
set out "" set out ""
@@ -40,7 +40,7 @@ proc escape_string {str} {
} }
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# Test cases fts3token-1.* are the warm-body test for the SQL scalar # Test cases fts3atoken-1.* are the warm-body test for the SQL scalar
# function fts3_tokenizer(). The procedure is as follows: # function fts3_tokenizer(). The procedure is as follows:
# #
# 1: Verify that there is no such fts3 tokenizer as 'blah'. # 1: Verify that there is no such fts3 tokenizer as 'blah'.
@@ -56,62 +56,68 @@ proc escape_string {str} {
# #
# 5: Test that the table created to use tokenizer 'blah' is usable. # 5: Test that the table created to use tokenizer 'blah' is usable.
# #
do_test fts3token-1.1 { ifcapable fts3_tokenizer {
catchsql { do_test fts3atoken-1.1 {
CREATE VIRTUAL TABLE t1 USING fts3(content, tokenize blah); catchsql {
} CREATE VIRTUAL TABLE t1 USING fts3(content, tokenize blah);
} {1 {unknown tokenizer: blah}} }
do_test fts3token-1.2 { } {1 {unknown tokenizer: blah}}
execsql { do_test fts3atoken-1.2 {
execsql {
SELECT fts3_tokenizer('blah', fts3_tokenizer('simple')) IS NULL;
}
} {0}
do_test fts3atoken-1.3 {
execsql {
SELECT fts3_tokenizer('blah') == fts3_tokenizer('simple');
}
} {1}
do_test fts3atoken-1.4 {
catchsql {
CREATE VIRTUAL TABLE t1 USING fts3(content, tokenize blah);
}
} {0 {}}
do_test fts3atoken-1.5 {
execsql {
INSERT INTO t1(content) VALUES('There was movement at the station');
INSERT INTO t1(content) VALUES('For the word has passed around');
INSERT INTO t1(content) VALUES('That the colt from ol regret had got');
SELECT content FROM t1 WHERE content MATCH 'movement'
}
} {{There was movement at the station}}
} else {
do_catchsql_test 1.6 {
SELECT fts3_tokenizer('blah', fts3_tokenizer('simple')) IS NULL; SELECT fts3_tokenizer('blah', fts3_tokenizer('simple')) IS NULL;
} } {1 {fts3tokenize: disabled - rebuild with -DSQLITE_ENABLE_FTS3_TOKENIZER}}
} {0} }
do_test fts3token-1.3 {
execsql {
SELECT fts3_tokenizer('blah') == fts3_tokenizer('simple');
}
} {1}
do_test fts3token-1.4 {
catchsql {
CREATE VIRTUAL TABLE t1 USING fts3(content, tokenize blah);
}
} {0 {}}
do_test fts3token-1.5 {
execsql {
INSERT INTO t1(content) VALUES('There was movement at the station');
INSERT INTO t1(content) VALUES('For the word has passed around');
INSERT INTO t1(content) VALUES('That the colt from ol regret had got away');
SELECT content FROM t1 WHERE content MATCH 'movement'
}
} {{There was movement at the station}}
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# Test cases fts3token-2.* test error cases in the scalar function based # Test cases fts3atoken-2.* test error cases in the scalar function based
# API for getting and setting tokenizers. # API for getting and setting tokenizers.
# #
do_test fts3token-2.1 { do_test fts3atoken-2.1 {
catchsql { catchsql {
SELECT fts3_tokenizer('nosuchtokenizer'); SELECT fts3_tokenizer('nosuchtokenizer');
} }
} {1 {unknown tokenizer: nosuchtokenizer}} } {1 {unknown tokenizer: nosuchtokenizer}}
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# Test cases fts3token-3.* test the three built-in tokenizers with a # Test cases fts3atoken-3.* test the three built-in tokenizers with a
# simple input string via the built-in test function. This is as much # simple input string via the built-in test function. This is as much
# to test the test function as the tokenizer implementations. # to test the test function as the tokenizer implementations.
# #
do_test fts3token-3.1 { do_test fts3atoken-3.1 {
execsql { execsql {
SELECT fts3_tokenizer_test('simple', 'I don''t see how'); SELECT fts3_tokenizer_test('simple', 'I don''t see how');
} }
} {{0 i I 1 don don 2 t t 3 see see 4 how how}} } {{0 i I 1 don don 2 t t 3 see see 4 how how}}
do_test fts3token-3.2 { do_test fts3atoken-3.2 {
execsql { execsql {
SELECT fts3_tokenizer_test('porter', 'I don''t see how'); SELECT fts3_tokenizer_test('porter', 'I don''t see how');
} }
} {{0 i I 1 don don 2 t t 3 see see 4 how how}} } {{0 i I 1 don don 2 t t 3 see see 4 how how}}
ifcapable icu { ifcapable icu {
do_test fts3token-3.3 { do_test fts3atoken-3.3 {
execsql { execsql {
SELECT fts3_tokenizer_test('icu', 'I don''t see how'); SELECT fts3_tokenizer_test('icu', 'I don''t see how');
} }
@@ -119,7 +125,7 @@ ifcapable icu {
} }
#-------------------------------------------------------------------------- #--------------------------------------------------------------------------
# Test cases fts3token-4.* test the ICU tokenizer. In practice, this # Test cases fts3atoken-4.* test the ICU tokenizer. In practice, this
# tokenizer only has two modes - "thai" and "everybody else". Some other # tokenizer only has two modes - "thai" and "everybody else". Some other
# Asian languages (Lao, Khmer etc.) require the same special treatment as # Asian languages (Lao, Khmer etc.) require the same special treatment as
# Thai, but ICU doesn't support them yet. # Thai, but ICU doesn't support them yet.
@@ -133,8 +139,8 @@ ifcapable icu {
} $output } $output
} }
do_icu_test fts3token-4.1 en_US {} {} do_icu_test fts3atoken-4.1 en_US {} {}
do_icu_test fts3token-4.2 en_US {Test cases fts3} [list \ do_icu_test fts3atoken-4.2 en_US {Test cases fts3} [list \
0 test Test 1 cases cases 2 fts3 fts3 0 test Test 1 cases cases 2 fts3 fts3
] ]
@@ -147,12 +153,12 @@ ifcapable icu {
append output "1 \u0e19\u0e30 \u0e19\u0e30 " append output "1 \u0e19\u0e30 \u0e19\u0e30 "
append output "2 \u0e04\u0e23\u0e31\u0e1a \u0e04\u0e23\u0e31\u0e1a" append output "2 \u0e04\u0e23\u0e31\u0e1a \u0e04\u0e23\u0e31\u0e1a"
do_icu_test fts3token-4.3 th_TH $input $output do_icu_test fts3atoken-4.3 th_TH $input $output
do_icu_test fts3token-4.4 en_US $input $output do_icu_test fts3atoken-4.4 en_US $input $output
# ICU handles an unknown locale by falling back to the default. # ICU handles an unknown locale by falling back to the default.
# So this is not an error. # So this is not an error.
do_icu_test fts3token-4.5 MiddleOfTheOcean $input $output do_icu_test fts3atoken-4.5 MiddleOfTheOcean $input $output
set longtoken "AReallyReallyLongTokenOneThatWillSurelyRequire" set longtoken "AReallyReallyLongTokenOneThatWillSurelyRequire"
append longtoken "AReallocInTheIcuTokenizerCode" append longtoken "AReallocInTheIcuTokenizerCode"
@@ -164,9 +170,9 @@ ifcapable icu {
append output "2 then then " append output "2 then then "
append output "3 [string tolower $longtoken] $longtoken" append output "3 [string tolower $longtoken] $longtoken"
do_icu_test fts3token-4.6 MiddleOfTheOcean $input $output do_icu_test fts3atoken-4.6 MiddleOfTheOcean $input $output
do_icu_test fts3token-4.7 th_TH $input $output do_icu_test fts3atoken-4.7 th_TH $input $output
do_icu_test fts3token-4.8 en_US $input $output do_icu_test fts3atoken-4.8 en_US $input $output
do_execsql_test 5.1 { do_execsql_test 5.1 {
CREATE VIRTUAL TABLE x1 USING fts3(name,TOKENIZE icu en_US); CREATE VIRTUAL TABLE x1 USING fts3(name,TOKENIZE icu en_US);
@@ -186,7 +192,7 @@ ifcapable icu {
} {} } {}
} }
do_test fts3token-internal { do_test fts3atoken-internal {
execsql { SELECT fts3_tokenizer_internal_test() } execsql { SELECT fts3_tokenizer_internal_test() }
} {ok} } {ok}
@@ -206,12 +212,14 @@ do_catchsql_test 6.1.3 {
do_catchsql_test 6.2.1 { do_catchsql_test 6.2.1 {
SELECT fts3_tokenizer(NULL); SELECT fts3_tokenizer(NULL);
} {1 {unknown tokenizer: }} } {1 {unknown tokenizer: }}
do_catchsql_test 6.2.2 { ifcapable fts3_tokenizer {
SELECT fts3_tokenizer(NULL, X'1234567812345678'); do_catchsql_test 6.2.2 {
} {1 {argument type mismatch}} SELECT fts3_tokenizer(NULL, X'1234567812345678');
do_catchsql_test 6.2.3 { } {1 {argument type mismatch}}
SELECT fts3_tokenizer(NULL, X'12345678'); do_catchsql_test 6.2.3 {
} {1 {argument type mismatch}} SELECT fts3_tokenizer(NULL, X'12345678');
} {1 {argument type mismatch}}
}
finish_test finish_test

View File

@@ -358,29 +358,31 @@ proc build_multilingual_db_2 {db} {
} }
} }
do_test 4.1.0 { ifcapable fts3_tokenizer {
reset_db do_test 4.1.0 {
set ptr [fts3_test_tokenizer] reset_db
execsql { SELECT fts3_tokenizer('testtokenizer', $ptr) } set ptr [fts3_test_tokenizer]
build_multilingual_db_2 db execsql { SELECT fts3_tokenizer('testtokenizer', $ptr) }
} {} build_multilingual_db_2 db
do_execsql_test 4.1.1 { } {}
SELECT docid FROM t4 WHERE t4 MATCH 'quick'; do_execsql_test 4.1.1 {
} {0} SELECT docid FROM t4 WHERE t4 MATCH 'quick';
do_execsql_test 4.1.2 { } {0}
SELECT docid FROM t4 WHERE t4 MATCH 'quick' AND lid=1; do_execsql_test 4.1.2 {
} {} SELECT docid FROM t4 WHERE t4 MATCH 'quick' AND lid=1;
do_execsql_test 4.1.3 { } {}
SELECT docid FROM t4 WHERE t4 MATCH 'Quick' AND lid=1; do_execsql_test 4.1.3 {
} {1} SELECT docid FROM t4 WHERE t4 MATCH 'Quick' AND lid=1;
for {set i 0} {$i < 50} {incr i} { } {1}
do_execsql_test 4.1.4.$i { for {set i 0} {$i < 50} {incr i} {
SELECT count(*) FROM t4 WHERE t4 MATCH 'fox' AND lid=$i; do_execsql_test 4.1.4.$i {
} [expr 0==($i%2)] SELECT count(*) FROM t4 WHERE t4 MATCH 'fox' AND lid=$i;
} [expr 0==($i%2)]
}
do_catchsql_test 4.1.5 {
INSERT INTO t4(content, lid) VALUES('hello world', 101)
} {1 {SQL logic error or missing database}}
} }
do_catchsql_test 4.1.5 {
INSERT INTO t4(content, lid) VALUES('hello world', 101)
} {1 {SQL logic error or missing database}}
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# Test cases 5.* # Test cases 5.*