--- /dev/null
+# 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
+