mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
210 lines
7.9 KiB
Plaintext
210 lines
7.9 KiB
Plaintext
# 2014 Jan 08
|
|
#
|
|
# 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.
|
|
#
|
|
#***********************************************************************
|
|
#
|
|
# Tests focused on phrase queries.
|
|
#
|
|
|
|
source [file join [file dirname [info script]] fts5_common.tcl]
|
|
set testprefix fts5origintext6
|
|
|
|
# If SQLITE_ENABLE_FTS5 is not defined, omit this file.
|
|
ifcapable !fts5 {
|
|
finish_test
|
|
return
|
|
}
|
|
|
|
proc insert_data {tbl} {
|
|
db eval "
|
|
INSERT INTO $tbl (rowid, x, y) VALUES
|
|
(1, 'ChH BDd HhG efc BjJ BGi GBG FdD','ciJ AFf ADf fBJ fhC GFI JEH fcA'),
|
|
(2, 'deg AIG Fie jII cCd Hbf igF fEE','GeA Ija gJg EDc HFi DDI dCf aDd'),
|
|
(3, 'IJC hga deC Jfa Aeg hfh CcH dfb','ajD hgC Jaf IfH CHe jIG AjD adF'),
|
|
(4, 'FiH GJH IDA AiG bBc CGG Eih bIH','hHg JaH aii IHE Ggd gcH gji CGc'),
|
|
(5, 'ceg CAd jFI GAB BGg EeC IdH acG','bBC eIG ifH eDE Adj bjb GCj ebA'),
|
|
(6, 'Eac Fbh aFF Eea jeG EIj HCc JJH','hbd giE Gfe eiI dEF abE cJf cAb'),
|
|
(7, 'dic hAc jEC AiG FEF jHc HiD HBI','aEd ebE Gfi AJG EBA faj GiG jjE'),
|
|
(8, 'Fca iEe EgE jjJ gce ijf EGc EBi','gaI dhH bFg CFc HeC CjI Jfg ccH'),
|
|
(9, 'cfd iaa HCf iHJ HjG ffh ABb ibi','CfG bia Dai eii Ejg Jeg fCg hDb'),
|
|
(10, 'Jjf hJC IID HJj bGB EbJ cgg eBj','jci jhi JAF jIg Bei Bcd cAC AJd'),
|
|
(11, 'egG Cdi bFf fEB hfH jDH jia Efd','FAd eCg fAi aiC baC eJG acF iGE'),
|
|
(12, 'Ada Gde CJI ADG gJA Cbb ccF iAB','eAE ajC FBB ccd Jgh fJg ieg hGE'),
|
|
(13, 'gBb fDG Jdd HdD fiJ Bed Cig iGg','heC FeI iaj gdg ebB giC HaD FIe'),
|
|
(14, 'FiI iDd Ffe igI bgB EJf FHG hDF','cjC AeI abf Fah cbJ ffH jEb aib'),
|
|
(15, 'jaF hBI jIH Gdh FEc Fij hgj jFh','dGA ADH feh AAI AfJ DbC gBi hGH'),
|
|
(16, 'gjH BGg iGj aFE CAH edI idf HEH','hIf DDg fjB hGi cHF BCH FjG Bgd'),
|
|
(17, 'iaI JGH hji gcj Dda eeG jDd CBi','cHg jeh caG gIc feF ihG hgJ Abj'),
|
|
(18, 'jHI iDB eFf AiH EFB CDb IAj GbC','Ghe dEI gdI jai gib dAG BIa djb'),
|
|
(19, 'abI fHG Ccf aAc FDa fiC agF bdB','afi hde IgE bGF cfg DHD diE aca'),
|
|
(20, 'IFh eDJ jfh cDg dde JGJ GAf fIJ','IBa EfH faE aeI FIF baJ FGj EIH'),
|
|
(21, 'Dee bFC bBA dEI CEj aJI ghA dCH','hBA ddA HJh dfj egI Dij dFE bGE'),
|
|
(22, 'JFE BCj FgA afc Jda FGD iHJ HDh','eAI jHe BHD Gah bbD Bgj gbh eGB'),
|
|
(23, 'edE CJE FjG aFI edA Cea FId iFe','ABG jcA ddj EEc Dcg hAI agA biA'),
|
|
(24, 'AgE cfc eef cGh aFB DcH efJ hcH','eGF HaB diG fgi bdc iGJ FGJ fFB'),
|
|
(25, 'aCa AgI GhC DDI hGJ Hgc Gcg bbG','iID Fga jHa jIj idj DFD bAC AFJ'),
|
|
(26, 'gjC JGh Fge faa eCA iGG gHE Gai','bDi hFE BbI DHD Adb Fgi hCa Hij'),
|
|
(27, 'Eji jEI jhF DFC afH cDh AGc dHA','IDe GcA ChF DIb Bif HfH agD DGh'),
|
|
(28, 'gDD AEE Dfg ICf Cbi JdE jgH eEi','eEb dBG FDE jgf cAI FaJ jaA cDd'),
|
|
(29, 'cbe Gec hgB Egi bca dHg bAJ jBf','EFB DgD GJc fDb EeE bBA GFC Hbe'),
|
|
(30, 'Adc eHB afI hDc Bhh baE hcJ BBd','JAH deg bcF Dab Bgj Gbb JHi FIB'),
|
|
(31, 'agF dIj AJJ Hfg cCG hED Igc fHC','JEf eia dHf Ggc Agj geD bEE Gei'),
|
|
(32, 'DAd cCe cbJ FjG gJe gba dJA GCf','eAf hFc bGE ABI hHA IcE abF CCE'),
|
|
(33, 'fFh jJe DhJ cDJ EBi AfD eFI IhG','fEG GCc Bjd EFF ggg CFe EHd ciB'),
|
|
(34, 'Ejb BjI eAF HaD eEJ FaG Eda AHC','Iah hgD EJG fdD cIE Daj IFf eJh'),
|
|
(35, 'aHG eCe FjA djJ dAJ jiJ IaE GGB','Acg iEF JfB FIC Eei ggj dic Iii'),
|
|
(36, 'Fdb EDF GaF JjB ehH IgC hgi DCG','cag DHI Fah hAJ bbh egG Hia hgJ'),
|
|
(37, 'HGg icC JEC AFJ Ddh dhi hfC Ich','fEg bED Bff hCJ EiA cIf bfG cGA'),
|
|
(38, 'aEJ jGI BCi FaA ebA BHj cIJ GcC','dCH ADd bGB cFE AgF geD cbG jIc'),
|
|
(39, 'JFB bBi heA BFA hgB Ahj EIE CgI','EIJ JFG FJE GeA Hdg HeH ACh GiA'),
|
|
(40, 'agB DDC CED igC Dfc DhI eiC fHi','dAB dcg iJF cej Fcc cAc AfB Fdd'),
|
|
(41, 'BdF DHj Ege hcG DEd eFa dCf gBb','FBG ChB cej iGd Hbh fCc Ibe Abh'),
|
|
(42, 'Bgc DjI cbC jGD bdb hHB IJA IJH','heg cii abb IGf eDe hJc dii fcE'),
|
|
(43, 'fhf ECa FiA aDh Jbf CiB Jhe ajD','GFE bIF aeD gDE BIE Jea DfC BEc'),
|
|
(44, 'GjE dBj DbJ ICF aDh EEH Ejb jFb','dJj aEc IBg bEG Faf fjA hjf FAF'),
|
|
(45, 'BfA efd IIJ AHG dDF eGg dIJ Gcb','Bfj jeb Ahc dAE ACH Dfb ieb dhC'),
|
|
(46, 'Ibj ege geC dJh CIi hbD EAG fGA','DEb BFe Bjg FId Fhg HeF JAc BbE'),
|
|
(47, 'dhB afC hgG bEJ aIe Cbe iEE JCD','bdg Ajc FGA jbh Jge iAj fIA jbE'),
|
|
(48, 'egH iDi bfH iiI hGC jFF Hfd AHB','bjE Beb iCc haB gIH Dea bga dfd'),
|
|
(49, 'jgf chc jGc Baj HBb jdE hgh heI','FFB aBd iEB EIG HGf Bbj EIi JbI'),
|
|
(50, 'jhe EGi ajA fbH geh EHe FdC bij','jDE bBC gbH HeE dcH iBH IFE AHi'),
|
|
(51, 'aCb JiD cgJ Bjj iAI Hbe IAF FhH','ijf bhE Jdf FED dCH bbG HcJ ebH');
|
|
"
|
|
}
|
|
|
|
foreach_detail_mode $testprefix {
|
|
foreach external {0 1 2} {
|
|
reset_db
|
|
|
|
proc tokens {cmd} {
|
|
set ret [list]
|
|
for {set iTok 0} {$iTok < [$cmd xInstCount]} {incr iTok} {
|
|
set txt [$cmd xInstToken $iTok 0]
|
|
set txt [string map [list "\0" "."] $txt]
|
|
lappend ret $txt
|
|
}
|
|
set ret
|
|
}
|
|
sqlite3_fts5_create_function db tokens tokens
|
|
sqlite3_fts5_register_origintext db
|
|
|
|
set E(0) internal
|
|
set E(1) external
|
|
set E(2) contentless
|
|
set e $E($external)
|
|
|
|
db eval { CREATE TABLE ex(x, y) }
|
|
switch -- $external {
|
|
0 {
|
|
do_execsql_test 1.$e.0 {
|
|
CREATE VIRTUAL TABLE ft USING fts5(
|
|
x, y, tokenize="origintext unicode61", tokendata=1, detail=%DETAIL%
|
|
);
|
|
}
|
|
}
|
|
|
|
1 {
|
|
do_execsql_test 1.$e.0 {
|
|
CREATE VIRTUAL TABLE ft USING fts5(
|
|
x, y, tokenize="origintext unicode61", tokendata=1, detail=%DETAIL%,
|
|
content=ex
|
|
);
|
|
}
|
|
}
|
|
|
|
2 {
|
|
do_execsql_test 1.$e.0 {
|
|
CREATE VIRTUAL TABLE ft USING fts5(
|
|
x, y, tokenize="origintext unicode61", tokendata=1, detail=%DETAIL%,
|
|
content=
|
|
);
|
|
}
|
|
}
|
|
}
|
|
insert_data ex
|
|
insert_data ft
|
|
|
|
proc prefixquery {prefix bInst bYOnly} {
|
|
set ret [list]
|
|
db eval { SELECT rowid, x, y FROM ex ORDER BY rowid } {
|
|
set row [list]
|
|
set bSeen 0
|
|
|
|
set T [concat $x $y]
|
|
if {$bYOnly} { set T $y }
|
|
|
|
foreach w $T {
|
|
if {[string match -nocase $prefix $w]} {
|
|
set bSeen 1
|
|
if {$bInst} {
|
|
set v [string tolower $w]
|
|
if {$w != $v} { append v ".$w" }
|
|
lappend row $v
|
|
}
|
|
}
|
|
}
|
|
|
|
if {$bSeen} {
|
|
lappend ret $rowid
|
|
lappend ret $row
|
|
}
|
|
}
|
|
|
|
set ret
|
|
}
|
|
|
|
proc do_prefixquery_test {tn prefix} {
|
|
set bInst [expr {$::e!="contentless" || "%DETAIL%"=="full"}]
|
|
set expect [prefixquery $prefix $bInst 0]
|
|
set expect2 [prefixquery $prefix $bInst 1]
|
|
|
|
uplevel [list do_execsql_test $tn.1 "
|
|
SELECT rowid, tokens(ft) FROM ft('$prefix')
|
|
" $expect]
|
|
uplevel [list do_execsql_test $tn.2 "
|
|
SELECT rowid, tokens(ft) FROM ft(fts5_insttoken('$prefix'))
|
|
" $expect]
|
|
db eval { INSERT INTO ft(ft, rank) VALUES('insttoken', 1) }
|
|
uplevel [list do_execsql_test $tn.3 "
|
|
SELECT rowid, tokens(ft) FROM ft('$prefix')
|
|
" $expect]
|
|
db eval { INSERT INTO ft(ft, rank) VALUES('insttoken', 0) }
|
|
|
|
if {"%DETAIL%"!="none"} {
|
|
uplevel [list do_execsql_test $tn.4 "
|
|
SELECT rowid, tokens(ft) FROM ft('y: $prefix')
|
|
" $expect2]
|
|
uplevel [list do_execsql_test $tn.5 "
|
|
SELECT rowid, tokens(ft) FROM ft(fts5_insttoken('y: $prefix'))
|
|
" $expect2]
|
|
db eval { INSERT INTO ft(ft, rank) VALUES('insttoken', 1) }
|
|
uplevel [list do_execsql_test $tn.6 "
|
|
SELECT rowid, tokens(ft) FROM ft('y: $prefix')
|
|
" $expect2]
|
|
db eval { INSERT INTO ft(ft, rank) VALUES('insttoken', 0) }
|
|
}
|
|
}
|
|
|
|
do_prefixquery_test 1.$e.1 a*
|
|
do_prefixquery_test 1.$e.2 b*
|
|
do_prefixquery_test 1.$e.3 c*
|
|
do_prefixquery_test 1.$e.4 d*
|
|
do_prefixquery_test 1.$e.5 e*
|
|
do_prefixquery_test 1.$e.6 f*
|
|
do_prefixquery_test 1.$e.7 g*
|
|
do_prefixquery_test 1.$e.8 h*
|
|
do_prefixquery_test 1.$e.9 i*
|
|
do_prefixquery_test 1.$e.10 j*
|
|
}}
|
|
|
|
|
|
|
|
finish_test
|
|
|