0000: 2f 2a 0a 2a 2a 20 32 30 30 39 20 4f 63 74 20 32 /*.** 2009 Oct 2
0010: 33 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 3.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 ource code. In
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 **.** May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 evil..** May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 thers..** May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 y, never taking
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 *****.**.** This
0180: 20 66 69 6c 65 20 69 73 20 70 61 72 74 20 6f 66 file is part of
0190: 20 74 68 65 20 53 51 4c 69 74 65 20 46 54 53 33 the SQLite FTS3
01a0: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 6f 64 75 6c extension modul
01b0: 65 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c e. Specifically,
01c0: 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 20 63 6f .** this file co
01d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69 ntains code to i
01e0: 6e 73 65 72 74 2c 20 75 70 64 61 74 65 20 61 6e nsert, update an
01f0: 64 20 64 65 6c 65 74 65 20 72 6f 77 73 20 66 72 d delete rows fr
0200: 6f 6d 20 46 54 53 33 0a 2a 2a 20 74 61 62 6c 65 om FTS3.** table
0210: 73 2e 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 s. It also conta
0220: 69 6e 73 20 63 6f 64 65 20 74 6f 20 6d 65 72 67 ins code to merg
0230: 65 20 46 54 53 33 20 62 2d 74 72 65 65 20 73 65 e FTS3 b-tree se
0240: 67 6d 65 6e 74 73 2e 20 53 6f 6d 65 0a 2a 2a 20 gments. Some.**
0250: 6f 66 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 of the sub-routi
0260: 6e 65 73 20 75 73 65 64 20 74 6f 20 6d 65 72 67 nes used to merg
0270: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 61 e segments are a
0280: 6c 73 6f 20 75 73 65 64 20 62 79 20 74 68 65 20 lso used by the
0290: 71 75 65 72 79 20 0a 2a 2a 20 63 6f 64 65 20 69 query .** code i
02a0: 6e 20 66 74 73 33 2e 63 2e 0a 2a 2f 0a 0a 23 69 n fts3.c..*/..#i
02b0: 6e 63 6c 75 64 65 20 22 66 74 73 33 49 6e 74 2e nclude "fts3Int.
02c0: 68 22 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 h".#if !defined(
02d0: 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 SQLITE_CORE) ||
02e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 defined(SQLITE_E
02f0: 4e 41 42 4c 45 5f 46 54 53 33 29 0a 0a 23 69 6e NABLE_FTS3)..#in
0300: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e clude <string.h>
0310: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 .#include <asser
0320: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 t.h>.#include <s
0330: 74 64 6c 69 62 2e 68 3e 0a 0a 0a 23 64 65 66 69 tdlib.h>...#defi
0340: 6e 65 20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e ne FTS_MAX_APPEN
0350: 44 41 42 4c 45 5f 48 45 49 47 48 54 20 31 36 0a DABLE_HEIGHT 16.
0360: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 66 75 6c 6c ./*.** When full
0370: 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64 65 -text index node
0380: 73 20 61 72 65 20 6c 6f 61 64 65 64 20 66 72 6f s are loaded fro
0390: 6d 20 64 69 73 6b 2c 20 74 68 65 20 62 75 66 66 m disk, the buff
03a0: 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 er that they.**
03b0: 61 72 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 are loaded into
03c0: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e has the followin
03d0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 g number of byte
03e0: 73 20 6f 66 20 70 61 64 64 69 6e 67 20 61 74 20 s of padding at
03f0: 74 68 65 20 65 6e 64 20 0a 2a 2a 20 6f 66 20 69 the end .** of i
0400: 74 2e 20 69 2e 65 2e 20 69 66 20 61 20 66 75 6c t. i.e. if a ful
0410: 6c 2d 74 65 78 74 20 69 6e 64 65 78 20 6e 6f 64 l-text index nod
0420: 65 20 69 73 20 39 30 30 20 62 79 74 65 73 20 69 e is 900 bytes i
0430: 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 61 20 62 n size, then a b
0440: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 39 32 30 20 uffer.** of 920
0450: 62 79 74 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 bytes is allocat
0460: 65 64 20 66 6f 72 20 69 74 2e 0a 2a 2a 0a 2a 2a ed for it..**.**
0470: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 This means that
0480: 20 69 66 20 77 65 20 68 61 76 65 20 61 20 70 6f if we have a po
0490: 69 6e 74 65 72 20 69 6e 74 6f 20 61 20 62 75 66 inter into a buf
04a0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e fer containing n
04b0: 6f 64 65 20 64 61 74 61 2c 0a 2a 2a 20 69 74 20 ode data,.** it
04c0: 69 73 20 61 6c 77 61 79 73 20 73 61 66 65 20 74 is always safe t
04d0: 6f 20 72 65 61 64 20 75 70 20 74 6f 20 74 77 6f o read up to two
04e0: 20 76 61 72 69 6e 74 73 20 66 72 6f 6d 20 69 74 varints from it
04f0: 20 77 69 74 68 6f 75 74 20 72 69 73 6b 69 6e 67 without risking
0500: 20 61 6e 0a 2a 2a 20 6f 76 65 72 72 65 61 64 2c an.** overread,
0510: 20 65 76 65 6e 20 69 66 20 74 68 65 20 6e 6f 64 even if the nod
0520: 65 20 64 61 74 61 20 69 73 20 63 6f 72 72 75 70 e data is corrup
0530: 74 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 ted..*/.#define
0540: 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 49 4e FTS3_NODE_PADDIN
0550: 47 20 28 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d G (FTS3_VARINT_M
0560: 41 58 2a 32 29 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 AX*2)../*.** Und
0570: 65 72 20 63 65 72 74 61 69 6e 20 63 69 72 63 75 er certain circu
0580: 6d 73 74 61 6e 63 65 73 2c 20 62 2d 74 72 65 65 mstances, b-tree
0590: 20 6e 6f 64 65 73 20 28 64 6f 63 6c 69 73 74 73 nodes (doclists
05a0: 29 20 63 61 6e 20 62 65 20 6c 6f 61 64 65 64 20 ) can be loaded
05b0: 69 6e 74 6f 0a 2a 2a 20 6d 65 6d 6f 72 79 20 69 into.** memory i
05c0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 69 6e 73 ncrementally ins
05d0: 74 65 61 64 20 6f 66 20 61 6c 6c 20 61 74 20 6f tead of all at o
05e0: 6e 63 65 2e 20 54 68 69 73 20 63 61 6e 20 62 65 nce. This can be
05f0: 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e a big performan
0600: 63 65 0a 2a 2a 20 77 69 6e 20 28 72 65 64 75 63 ce.** win (reduc
0610: 65 64 20 49 4f 20 61 6e 64 20 43 50 55 29 20 69 ed IO and CPU) i
0620: 66 20 53 51 4c 69 74 65 20 73 74 6f 70 73 20 63 f SQLite stops c
0630: 61 6c 6c 69 6e 67 20 74 68 65 20 76 69 72 74 75 alling the virtu
0640: 61 6c 20 74 61 62 6c 65 20 78 4e 65 78 74 28 29 al table xNext()
0650: 0a 2a 2a 20 6d 65 74 68 6f 64 20 62 65 66 6f 72 .** method befor
0660: 65 20 72 65 74 72 69 65 76 69 6e 67 20 61 6c 6c e retrieving all
0670: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 28 query results (
0680: 61 73 20 6d 61 79 20 68 61 70 70 65 6e 2c 20 66 as may happen, f
0690: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 69 or example,.** i
06a0: 66 20 61 20 71 75 65 72 79 20 68 61 73 20 61 20 f a query has a
06b0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 29 2e 0a 2a LIMIT clause)..*
06c0: 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c *.** Incremental
06d0: 20 6c 6f 61 64 69 6e 67 20 69 73 20 75 73 65 64 loading is used
06e0: 20 66 6f 72 20 62 2d 74 72 65 65 20 6e 6f 64 65 for b-tree node
06f0: 73 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e s FTS3_NODE_CHUN
0700: 4b 5f 54 48 52 45 53 48 4f 4c 44 20 0a 2a 2a 20 K_THRESHOLD .**
0710: 62 79 74 65 73 20 61 6e 64 20 6c 61 72 67 65 72 bytes and larger
0720: 2e 20 4e 6f 64 65 73 20 61 72 65 20 6c 6f 61 64 . Nodes are load
0730: 65 64 20 69 6e 20 63 68 75 6e 6b 73 20 6f 66 20 ed in chunks of
0740: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 FTS3_NODE_CHUNKS
0750: 49 5a 45 20 62 79 74 65 73 2e 0a 2a 2a 20 54 68 IZE bytes..** Th
0760: 65 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 e code is writte
0770: 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 68 61 n so that the ha
0780: 72 64 20 6c 6f 77 65 72 2d 6c 69 6d 69 74 20 66 rd lower-limit f
0790: 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 73 65 or each of these
07a0: 20 76 61 6c 75 65 73 20 0a 2a 2a 20 69 73 20 31 values .** is 1
07b0: 2e 20 43 6c 65 61 72 6c 79 20 73 75 63 68 20 73 . Clearly such s
07c0: 6d 61 6c 6c 20 76 61 6c 75 65 73 20 77 6f 75 6c mall values woul
07d0: 64 20 62 65 20 69 6e 65 66 66 69 63 69 65 6e 74 d be inefficient
07e0: 2c 20 62 75 74 20 63 61 6e 20 62 65 20 75 73 65 , but can be use
07f0: 66 75 6c 20 0a 2a 2a 20 66 6f 72 20 74 65 73 74 ful .** for test
0800: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a ing purposes..**
0810: 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 6f 64 75 .** If this modu
0820: 6c 65 20 69 73 20 62 75 69 6c 74 20 77 69 74 68 le is built with
0830: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 64 65 66 SQLITE_TEST def
0840: 69 6e 65 64 2c 20 74 68 65 73 65 20 63 6f 6e 73 ined, these cons
0850: 74 61 6e 74 73 20 6d 61 79 0a 2a 2a 20 62 65 20 tants may.** be
0860: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 overridden at ru
0870: 6e 74 69 6d 65 20 66 6f 72 20 74 65 73 74 69 6e ntime for testin
0880: 67 20 70 75 72 70 6f 73 65 73 2e 20 46 69 6c 65 g purposes. File
0890: 20 66 74 73 33 5f 74 65 73 74 2e 63 20 63 6f 6e fts3_test.c con
08a0: 74 61 69 6e 73 0a 2a 2a 20 61 20 54 63 6c 20 69 tains.** a Tcl i
08b0: 6e 74 65 72 66 61 63 65 20 74 6f 20 72 65 61 64 nterface to read
08c0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 76 and write the v
08d0: 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 alues..*/.#ifdef
08e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 SQLITE_TEST.int
08f0: 20 74 65 73 74 5f 66 74 73 33 5f 6e 6f 64 65 5f test_fts3_node_
0900: 63 68 75 6e 6b 73 69 7a 65 20 3d 20 28 34 2a 31 chunksize = (4*1
0910: 30 32 34 29 3b 0a 69 6e 74 20 74 65 73 74 5f 66 024);.int test_f
0920: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74 ts3_node_chunk_t
0930: 68 72 65 73 68 6f 6c 64 20 3d 20 28 34 2a 31 30 hreshold = (4*10
0940: 32 34 29 2a 34 3b 0a 23 20 64 65 66 69 6e 65 20 24)*4;.# define
0950: 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e 4b 53 FTS3_NODE_CHUNKS
0960: 49 5a 45 20 20 20 20 20 20 20 74 65 73 74 5f 66 IZE test_f
0970: 74 73 33 5f 6e 6f 64 65 5f 63 68 75 6e 6b 73 69 ts3_node_chunksi
0980: 7a 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33 ze.# define FTS3
0990: 5f 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 _NODE_CHUNK_THRE
09a0: 53 48 4f 4c 44 20 74 65 73 74 5f 66 74 73 33 5f SHOLD test_fts3_
09b0: 6e 6f 64 65 5f 63 68 75 6e 6b 5f 74 68 72 65 73 node_chunk_thres
09c0: 68 6f 6c 64 0a 23 65 6c 73 65 0a 23 20 64 65 66 hold.#else.# def
09d0: 69 6e 65 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 ine FTS3_NODE_CH
09e0: 55 4e 4b 53 49 5a 45 20 28 34 2a 31 30 32 34 29 UNKSIZE (4*1024)
09f0: 20 0a 23 20 64 65 66 69 6e 65 20 46 54 53 33 5f .# define FTS3_
0a00: 4e 4f 44 45 5f 43 48 55 4e 4b 5f 54 48 52 45 53 NODE_CHUNK_THRES
0a10: 48 4f 4c 44 20 28 46 54 53 33 5f 4e 4f 44 45 5f HOLD (FTS3_NODE_
0a20: 43 48 55 4e 4b 53 49 5a 45 2a 34 29 0a 23 65 6e CHUNKSIZE*4).#en
0a30: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 dif../*.** The t
0a40: 77 6f 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d wo values that m
0a50: 61 79 20 62 65 20 6d 65 61 6e 69 6e 67 66 75 6c ay be meaningful
0a60: 6c 79 20 62 6f 75 6e 64 20 74 6f 20 74 68 65 20 ly bound to the
0a70: 3a 31 20 70 61 72 61 6d 65 74 65 72 20 69 6e 0a :1 parameter in.
0a80: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 53 51 ** statements SQ
0a90: 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 20 61 L_REPLACE_STAT a
0aa0: 6e 64 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 nd SQL_SELECT_ST
0ab0: 41 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 AT..*/.#define F
0ac0: 54 53 5f 53 54 41 54 5f 44 4f 43 54 4f 54 41 4c TS_STAT_DOCTOTAL
0ad0: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 0.#define
0ae0: 46 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 FTS_STAT_INCRMER
0af0: 47 45 48 49 4e 54 20 31 0a 23 64 65 66 69 6e 65 GEHINT 1.#define
0b00: 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e FTS_STAT_AUTOIN
0b10: 43 52 4d 45 52 47 45 20 32 0a 0a 2f 2a 0a 2a 2a CRMERGE 2../*.**
0b20: 20 49 66 20 46 54 53 5f 4c 4f 47 5f 4d 45 52 47 If FTS_LOG_MERG
0b30: 45 53 20 69 73 20 64 65 66 69 6e 65 64 2c 20 63 ES is defined, c
0b40: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 all sqlite3_log(
0b50: 29 20 74 6f 20 72 65 70 6f 72 74 20 65 61 63 68 ) to report each
0b60: 20 61 75 74 6f 6d 61 74 69 63 0a 2a 2a 20 61 6e automatic.** an
0b70: 64 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 d incremental me
0b80: 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 rge operation th
0b90: 61 74 20 74 61 6b 65 73 20 70 6c 61 63 65 2e 20 at takes place.
0ba0: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 This is used for
0bb0: 20 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 46 .** debugging F
0bc0: 54 53 20 6f 6e 6c 79 2c 20 69 74 20 73 68 6f 75 TS only, it shou
0bd0: 6c 64 20 6e 6f 74 20 75 73 75 61 6c 6c 79 20 62 ld not usually b
0be0: 65 20 74 75 72 6e 65 64 20 6f 6e 20 69 6e 20 70 e turned on in p
0bf0: 72 6f 64 75 63 74 69 6f 6e 0a 2a 2a 20 73 79 73 roduction.** sys
0c00: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 tems..*/.#ifdef
0c10: 46 54 53 33 5f 4c 4f 47 5f 4d 45 52 47 45 53 0a FTS3_LOG_MERGES.
0c20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 static void fts3
0c30: 4c 6f 67 4d 65 72 67 65 28 69 6e 74 20 6e 4d 65 LogMerge(int nMe
0c40: 72 67 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 rge, sqlite3_int
0c50: 36 34 20 69 41 62 73 4c 65 76 65 6c 29 7b 0a 20 64 iAbsLevel){.
0c60: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c sqlite3_log(SQL
0c70: 49 54 45 5f 4f 4b 2c 20 22 25 64 2d 77 61 79 20 ITE_OK, "%d-way
0c80: 6d 65 72 67 65 20 66 72 6f 6d 20 6c 65 76 65 6c merge from level
0c90: 20 25 64 22 2c 20 6e 4d 65 72 67 65 2c 20 28 69 %d", nMerge, (i
0ca0: 6e 74 29 69 41 62 73 4c 65 76 65 6c 29 3b 0a 7d nt)iAbsLevel);.}
0cb0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 66 .#else.#define f
0cc0: 74 73 33 4c 6f 67 4d 65 72 67 65 28 78 2c 20 79 ts3LogMerge(x, y
0cd0: 29 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64 ).#endif...typed
0ce0: 65 66 20 73 74 72 75 63 74 20 50 65 6e 64 69 6e ef struct Pendin
0cf0: 67 4c 69 73 74 20 50 65 6e 64 69 6e 67 4c 69 73 gList PendingLis
0d00: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 t;.typedef struc
0d10: 74 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 53 65 t SegmentNode Se
0d20: 67 6d 65 6e 74 4e 6f 64 65 3b 0a 74 79 70 65 64 gmentNode;.typed
0d30: 65 66 20 73 74 72 75 63 74 20 53 65 67 6d 65 6e ef struct Segmen
0d40: 74 57 72 69 74 65 72 20 53 65 67 6d 65 6e 74 57 tWriter SegmentW
0d50: 72 69 74 65 72 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e riter;../*.** An
0d60: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 instance of the
0d70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61 20 following data
0d80: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 structure is use
0d90: 64 20 74 6f 20 62 75 69 6c 64 20 64 6f 63 6c 69 d to build docli
0da0: 73 74 73 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 sts.** increment
0db0: 61 6c 6c 79 2e 20 53 65 65 20 66 75 6e 63 74 69 ally. See functi
0dc0: 6f 6e 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 on fts3PendingLi
0dd0: 73 74 41 70 70 65 6e 64 28 29 20 66 6f 72 20 64 stAppend() for d
0de0: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63 etails..*/.struc
0df0: 74 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 7b 0a t PendingList {.
0e00: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 63 int nData;. c
0e10: 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e har *aData;. in
0e20: 74 20 6e 53 70 61 63 65 3b 0a 20 20 73 71 6c 69 t nSpace;. sqli
0e30: 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 44 te3_int64 iLastD
0e40: 6f 63 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f ocid;. sqlite3_
0e50: 69 6e 74 36 34 20 69 4c 61 73 74 43 6f 6c 3b 0a int64 iLastCol;.
0e60: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
0e70: 69 4c 61 73 74 50 6f 73 3b 0a 7d 3b 0a 0a 0a 2f iLastPos;.};.../
0e80: 2a 0a 2a 2a 20 45 61 63 68 20 63 75 72 73 6f 72 *.** Each cursor
0e90: 20 68 61 73 20 61 20 28 70 6f 73 73 69 62 6c 79 has a (possibly
0ea0: 20 65 6d 70 74 79 29 20 6c 69 6e 6b 65 64 20 6c empty) linked l
0eb0: 69 73 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f ist of the follo
0ec0: 77 69 6e 67 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f wing objects..*/
0ed0: 0a 73 74 72 75 63 74 20 46 74 73 33 44 65 66 65 .struct Fts3Defe
0ee0: 72 72 65 64 54 6f 6b 65 6e 20 7b 0a 20 20 46 74 rredToken {. Ft
0ef0: 73 33 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 s3PhraseToken *p
0f00: 54 6f 6b 65 6e 3b 20 20 20 20 20 20 20 20 2f 2a Token; /*
0f10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 6f 72 72 Pointer to corr
0f20: 65 73 70 6f 6e 64 69 6e 67 20 65 78 70 72 20 74 esponding expr t
0f30: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 oken */. int iC
0f40: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ol;
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c /* Col
0f60: 75 6d 6e 20 74 6f 6b 65 6e 20 6d 75 73 74 20 6f umn token must o
0f70: 63 63 75 72 20 69 6e 20 2a 2f 0a 20 20 46 74 73 ccur in */. Fts
0f80: 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 3DeferredToken *
0f90: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 pNext; /*
0fa0: 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 Next in list of
0fb0: 64 65 66 65 72 72 65 64 20 74 6f 6b 65 6e 73 20 deferred tokens
0fc0: 2a 2f 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 */. PendingList
0fd0: 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 *pList;
0fe0: 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 /* Doclist
0ff0: 69 73 20 61 73 73 65 6d 62 6c 65 64 20 68 65 72 is assembled her
1000: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 e */.};../*.** A
1010: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 n instance of th
1020: 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 is structure is
1030: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 used to iterate
1040: 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 72 6d through the term
1050: 73 20 6f 6e 0a 2a 2a 20 61 20 63 6f 6e 74 69 67 s on.** a contig
1060: 75 6f 75 73 20 73 65 74 20 6f 66 20 73 65 67 6d uous set of segm
1070: 65 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 ent b-tree leaf
1080: 6e 6f 64 65 73 2e 20 41 6c 74 68 6f 75 67 68 20 nodes. Although
1090: 74 68 65 20 64 65 74 61 69 6c 73 20 6f 66 0a 2a the details of.*
10a0: 2a 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 * this structure
10b0: 20 61 72 65 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 are only manipu
10c0: 6c 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e lated by code in
10d0: 20 74 68 69 73 20 66 69 6c 65 2c 20 6f 70 61 71 this file, opaq
10e0: 75 65 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 6f 66 ue handles.** of
10f0: 20 74 79 70 65 20 46 74 73 33 53 65 67 52 65 61 type Fts3SegRea
1100: 64 65 72 2a 20 61 72 65 20 61 6c 73 6f 20 75 73 der* are also us
1110: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20 66 74 ed by code in ft
1120: 73 33 2e 63 20 74 6f 20 69 74 65 72 61 74 65 20 s3.c to iterate
1130: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 65 72 6d 73 through.** terms
1140: 20 77 68 65 6e 20 71 75 65 72 79 69 6e 67 20 74 when querying t
1150: 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 he full-text ind
1160: 65 78 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e ex. See function
1170: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 71 6c 69 74 s:.**.** sqlit
1180: 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 4e e3Fts3SegReaderN
1190: 65 77 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 ew().** sqlite
11a0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 46 72 3Fts3SegReaderFr
11b0: 65 65 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 ee().** sqlite
11c0: 33 46 74 73 33 53 65 67 52 65 61 64 65 72 49 74 3Fts3SegReaderIt
11d0: 65 72 61 74 65 28 29 0a 2a 2a 0a 2a 2a 20 4d 65 erate().**.** Me
11e0: 74 68 6f 64 73 20 75 73 65 64 20 74 6f 20 6d 61 thods used to ma
11f0: 6e 69 70 75 6c 61 74 65 20 46 74 73 33 53 65 67 nipulate Fts3Seg
1200: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65 Reader structure
1210: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53 s:.**.** fts3S
1220: 65 67 52 65 61 64 65 72 4e 65 78 74 28 29 0a 2a egReaderNext().*
1230: 2a 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 * fts3SegReade
1240: 72 46 69 72 73 74 44 6f 63 69 64 28 29 0a 2a 2a rFirstDocid().**
1250: 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 fts3SegReader
1260: 4e 65 78 74 44 6f 63 69 64 28 29 0a 2a 2f 0a 73 NextDocid().*/.s
1270: 74 72 75 63 74 20 46 74 73 33 53 65 67 52 65 61 truct Fts3SegRea
1280: 64 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 der {. int iIdx
1290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 /* Index
12b0: 20 77 69 74 68 69 6e 20 6c 65 76 65 6c 2c 20 6f within level, o
12c0: 72 20 30 78 37 46 46 46 46 46 46 46 20 66 6f 72 r 0x7FFFFFFF for
12d0: 20 50 54 20 2a 2f 0a 20 20 75 38 20 62 4c 6f 6f PT */. u8 bLoo
12e0: 6b 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 kup;
12f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
1300: 20 66 6f 72 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e for a lookup on
1310: 6c 79 20 2a 2f 0a 20 20 75 38 20 72 6f 6f 74 4f ly */. u8 rootO
1320: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 nly;
1330: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
1340: 66 6f 72 20 61 20 72 6f 6f 74 2d 6f 6e 6c 79 20 for a root-only
1350: 72 65 61 64 65 72 20 2a 2f 0a 0a 20 20 73 71 6c reader */.. sql
1360: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 ite3_int64 iStar
1370: 74 42 6c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20 tBlock; /*
1380: 52 6f 77 69 64 20 6f 66 20 66 69 72 73 74 20 6c Rowid of first l
1390: 65 61 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 eaf block to tra
13a0: 76 65 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 verse */. sqlit
13b0: 65 33 5f 69 6e 74 36 34 20 69 4c 65 61 66 45 6e e3_int64 iLeafEn
13c0: 64 42 6c 6f 63 6b 3b 20 20 20 20 2f 2a 20 52 6f dBlock; /* Ro
13d0: 77 69 64 20 6f 66 20 66 69 6e 61 6c 20 6c 65 61 wid of final lea
13e0: 66 20 62 6c 6f 63 6b 20 74 6f 20 74 72 61 76 65 f block to trave
13f0: 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 rse */. sqlite3
1400: 5f 69 6e 74 36 34 20 69 45 6e 64 42 6c 6f 63 6b _int64 iEndBlock
1410: 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 ; /* Rowi
1420: 64 20 6f 66 20 66 69 6e 61 6c 20 62 6c 6f 63 6b d of final block
1430: 20 69 6e 20 73 65 67 6d 65 6e 74 20 28 6f 72 20 in segment (or
1440: 30 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 0) */. sqlite3_
1450: 69 6e 74 36 34 20 69 43 75 72 72 65 6e 74 42 6c int64 iCurrentBl
1460: 6f 63 6b 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 ock; /* Curre
1470: 6e 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 28 6f nt leaf block (o
1480: 72 20 30 29 20 2a 2f 0a 0a 20 20 63 68 61 72 20 r 0) */.. char
1490: 2a 61 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 *aNode;
14a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f /* Po
14b0: 69 6e 74 65 72 20 74 6f 20 6e 6f 64 65 20 64 61 inter to node da
14c0: 74 61 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a ta (or NULL) */.
14d0: 20 20 69 6e 74 20 6e 4e 6f 64 65 3b 20 20 20 20 int nNode;
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 /* Size of buf
1500: 66 65 72 20 61 74 20 61 4e 6f 64 65 20 28 6f 72 fer at aNode (or
1510: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 0) */. int nPo
1520: 70 75 6c 61 74 65 3b 20 20 20 20 20 20 20 20 20 pulate;
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 3e /* If >
1540: 30 2c 20 62 79 74 65 73 20 6f 66 20 62 75 66 66 0, bytes of buff
1550: 65 72 20 61 4e 6f 64 65 5b 5d 20 6c 6f 61 64 65 er aNode[] loade
1560: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 d */. sqlite3_b
1570: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 20 20 20 20 20 lob *pBlob;
1580: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 /* If not
1590: 20 4e 55 4c 4c 2c 20 62 6c 6f 62 20 68 61 6e 64 NULL, blob hand
15a0: 6c 65 20 74 6f 20 72 65 61 64 20 6e 6f 64 65 20 le to read node
15b0: 2a 2f 0a 0a 20 20 46 74 73 33 48 61 73 68 45 6c */.. Fts3HashEl
15c0: 65 6d 20 2a 2a 70 70 4e 65 78 74 45 6c 65 6d 3b em **ppNextElem;
15d0: 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 .. /* Variables
15e0: 20 73 65 74 20 62 79 20 66 74 73 33 53 65 67 52 set by fts3SegR
15f0: 65 61 64 65 72 4e 65 78 74 28 29 2e 20 54 68 65 eaderNext(). The
1600: 73 65 20 6d 61 79 20 62 65 20 72 65 61 64 20 64 se may be read d
1610: 69 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 irectly. ** by
1620: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 79 the caller. They
1630: 20 61 72 65 20 76 61 6c 69 64 20 66 72 6f 6d 20 are valid from
1640: 74 68 65 20 74 69 6d 65 20 53 65 67 6d 65 6e 74 the time Segment
1650: 52 65 61 64 65 72 4e 65 77 28 29 20 72 65 74 75 ReaderNew() retu
1660: 72 6e 73 0a 20 20 2a 2a 20 75 6e 74 69 6c 20 53 rns. ** until S
1670: 65 67 6d 65 6e 74 52 65 61 64 65 72 4e 65 78 74 egmentReaderNext
1680: 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 () returns somet
1690: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 hing other than
16a0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 2a 2a 20 28 SQLITE_OK. ** (
16b0: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 i.e. SQLITE_DONE
16c0: 29 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 ).. */. int nT
16d0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 erm;
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
16f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 ber of bytes in
1700: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a current term */.
1710: 20 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 char *zTerm;
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1730: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 /* Pointer to
1740: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a current term */.
1750: 20 20 69 6e 74 20 6e 54 65 72 6d 41 6c 6c 6f 63 int nTermAlloc
1760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1770: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 /* Allocated s
1780: 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 62 75 66 ize of zTerm buf
1790: 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 fer */. char *a
17a0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 Doclist;
17b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e /* Poin
17c0: 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 6f ter to doclist o
17d0: 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 f current entry
17e0: 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 */. int nDoclis
17f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
1800: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
1810: 64 6f 63 6c 69 73 74 20 69 6e 20 63 75 72 72 65 doclist in curre
1820: 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 0a 20 20 2f nt entry */.. /
1830: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
1840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 variables are us
1850: 65 64 20 62 79 20 66 74 73 33 53 65 67 52 65 61 ed by fts3SegRea
1860: 64 65 72 4e 65 78 74 44 6f 63 69 64 28 29 20 74 derNextDocid() t
1870: 6f 20 69 74 65 72 61 74 65 20 0a 20 20 2a 2a 20 o iterate . **
1880: 74 68 72 6f 75 67 68 20 74 68 65 20 63 75 72 72 through the curr
1890: 65 6e 74 20 64 6f 63 6c 69 73 74 20 28 61 44 6f ent doclist (aDo
18a0: 63 6c 69 73 74 2f 6e 44 6f 63 6c 69 73 74 29 2e clist/nDoclist).
18b0: 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4f . */. char *pO
18c0: 66 66 73 65 74 4c 69 73 74 3b 0a 20 20 69 6e 74 ffsetList;. int
18d0: 20 6e 4f 66 66 73 65 74 4c 69 73 74 3b 20 20 20 nOffsetList;
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
18f0: 46 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 70 For descending p
1900: 65 6e 64 69 6e 67 20 73 65 67 2d 72 65 61 64 65 ending seg-reade
1910: 72 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 71 6c rs only */. sql
1920: 69 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 ite3_int64 iDoci
1930: 64 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 66 d;.};..#define f
1940: 74 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 ts3SegReaderIsPe
1950: 6e 64 69 6e 67 28 70 29 20 28 28 70 29 2d 3e 70 nding(p) ((p)->p
1960: 70 4e 65 78 74 45 6c 65 6d 21 3d 30 29 0a 23 64 pNextElem!=0).#d
1970: 65 66 69 6e 65 20 66 74 73 33 53 65 67 52 65 61 efine fts3SegRea
1980: 64 65 72 49 73 52 6f 6f 74 4f 6e 6c 79 28 70 29 derIsRootOnly(p)
1990: 20 28 28 70 29 2d 3e 72 6f 6f 74 4f 6e 6c 79 21 ((p)->rootOnly!
19a0: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e =0)../*.** An in
19b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 stance of this s
19c0: 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65 64 tructure is used
19d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 73 65 67 to create a seg
19e0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 6e 20 74 ment b-tree in t
19f0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 he.** database.
1a00: 54 68 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 74 The internal det
1a10: 61 69 6c 73 20 6f 66 20 74 68 69 73 20 74 79 70 ails of this typ
1a20: 65 20 61 72 65 20 6f 6e 6c 79 20 61 63 63 65 73 e are only acces
1a30: 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 66 6f sed by the.** fo
1a40: 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e llowing function
1a50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 53 s:.**.** fts3S
1a60: 65 67 57 72 69 74 65 72 41 64 64 28 29 0a 2a 2a egWriterAdd().**
1a70: 20 20 20 66 74 73 33 53 65 67 57 72 69 74 65 72 fts3SegWriter
1a80: 46 6c 75 73 68 28 29 0a 2a 2a 20 20 20 66 74 73 Flush().** fts
1a90: 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 29 3SegWriterFree()
1aa0: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65 .*/.struct Segme
1ab0: 6e 74 57 72 69 74 65 72 20 7b 0a 20 20 53 65 67 ntWriter {. Seg
1ac0: 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 65 65 3b mentNode *pTree;
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 69 6e 74 65 72 Pointer to inter
1af0: 69 6f 72 20 74 72 65 65 20 73 74 72 75 63 74 75 ior tree structu
1b00: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f re */. sqlite3_
1b10: 69 6e 74 36 34 20 69 46 69 72 73 74 3b 20 20 20 int64 iFirst;
1b20: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 /* First
1b30: 20 73 6c 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 slot in %_segme
1b40: 6e 74 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 nts written */.
1b50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
1b60: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 Free;
1b70: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c /* Next free sl
1b80: 6f 74 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 ot in %_segments
1b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 72 */. char *zTer
1ba0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 m;
1bb0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 /* Pointer
1bc0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 72 to previous ter
1bd0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e m buffer */. in
1be0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 t nTerm;
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1c00: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
1c10: 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 in zTerm */. i
1c20: 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 nt nMalloc;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1c40: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f 63 * Size of malloc
1c50: 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d 61 'd buffer at zMa
1c60: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a lloc */. char *
1c70: 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 zMalloc;
1c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c /* Mal
1c90: 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f 73 loc'd space (pos
1ca0: 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 20 sibly) used for
1cb0: 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e zTerm */. int n
1cc0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 Size;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
1ce0: 7a 65 20 6f 66 20 61 6c 6c 6f 63 61 74 69 6f 6e ze of allocation
1cf0: 20 61 74 20 61 44 61 74 61 20 2a 2f 0a 20 20 69 at aData */. i
1d00: 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 nt nData;
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1d20: 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 * Bytes of data
1d30: 69 6e 20 61 44 61 74 61 20 2a 2f 0a 20 20 63 68 in aData */. ch
1d40: 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 ar *aData;
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1d60: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 6c 6f 63 Pointer to bloc
1d70: 6b 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 k from malloc()
1d80: 2a 2f 0a 20 20 69 36 34 20 6e 4c 65 61 66 44 61 */. i64 nLeafDa
1d90: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ta;
1da0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1db0: 66 20 62 79 74 65 73 20 6f 66 20 6c 65 61 66 20 f bytes of leaf
1dc0: 64 61 74 61 20 77 72 69 74 74 65 6e 20 2a 2f 0a data written */.
1dd0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 79 70 65 20 53 };../*.** Type S
1de0: 65 67 6d 65 6e 74 4e 6f 64 65 20 69 73 20 75 73 egmentNode is us
1df0: 65 64 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 ed by the follow
1e00: 69 6e 67 20 74 68 72 65 65 20 66 75 6e 63 74 69 ing three functi
1e10: 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a ons to create.**
1e20: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 70 61 the interior pa
1e30: 72 74 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e rt of the segmen
1e40: 74 20 62 2b 2d 74 72 65 65 20 73 74 72 75 63 74 t b+-tree struct
1e50: 75 72 65 73 20 28 65 76 65 72 79 74 68 69 6e 67 ures (everything
1e60: 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 65 20 6c except.** the l
1e70: 65 61 66 20 6e 6f 64 65 73 29 2e 20 54 68 65 73 eaf nodes). Thes
1e80: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 e functions and
1e90: 74 79 70 65 20 61 72 65 20 6f 6e 6c 79 20 65 76 type are only ev
1ea0: 65 72 20 75 73 65 64 20 62 79 20 63 6f 64 65 0a er used by code.
1eb0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 66 74 ** within the ft
1ec0: 73 33 53 65 67 57 72 69 74 65 72 58 58 58 28 29 s3SegWriterXXX()
1ed0: 20 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63 74 family of funct
1ee0: 69 6f 6e 73 20 64 65 73 63 72 69 62 65 64 20 61 ions described a
1ef0: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 74 bove..**.** ft
1f00: 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 29 0a s3NodeAddTerm().
1f10: 2a 2a 20 20 20 66 74 73 33 4e 6f 64 65 57 72 69 ** fts3NodeWri
1f20: 74 65 28 29 0a 2a 2a 20 20 20 66 74 73 33 4e 6f te().** fts3No
1f30: 64 65 46 72 65 65 28 29 0a 2a 2a 0a 2a 2a 20 57 deFree().**.** W
1f40: 68 65 6e 20 61 20 62 2b 74 72 65 65 20 69 73 20 hen a b+tree is
1f50: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 written to the d
1f60: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20 atabase (either
1f70: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 as a result of a
1f80: 20 6d 65 72 67 65 0a 2a 2a 20 6f 72 20 74 68 65 merge.** or the
1f90: 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 74 pending-terms t
1fa0: 61 62 6c 65 20 62 65 69 6e 67 20 66 6c 75 73 68 able being flush
1fb0: 65 64 29 2c 20 6c 65 61 76 65 73 20 61 72 65 20 ed), leaves are
1fc0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 written into the
1fd0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 .** database fi
1fe0: 6c 65 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 le as soon as th
1ff0: 65 79 20 61 72 65 20 63 6f 6d 70 6c 65 74 65 6c ey are completel
2000: 79 20 70 6f 70 75 6c 61 74 65 64 2e 20 54 68 65 y populated. The
2010: 20 69 6e 74 65 72 69 6f 72 20 6f 66 0a 2a 2a 20 interior of.**
2020: 74 68 65 20 74 72 65 65 20 69 73 20 61 73 73 65 the tree is asse
2030: 6d 62 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 mbled in memory
2040: 61 6e 64 20 77 72 69 74 74 65 6e 20 6f 75 74 20 and written out
2050: 6f 6e 6c 79 20 6f 6e 63 65 20 61 6c 6c 20 6c 65 only once all le
2060: 61 76 65 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 aves have.** bee
2070: 6e 20 70 6f 70 75 6c 61 74 65 64 20 61 6e 64 20 n populated and
2080: 73 74 6f 72 65 64 2e 20 54 68 69 73 20 69 73 20 stored. This is
2090: 4f 6b 2c 20 61 73 20 74 68 65 20 62 2b 2d 74 72 Ok, as the b+-tr
20a0: 65 65 20 66 61 6e 6f 75 74 20 69 73 20 75 73 75 ee fanout is usu
20b0: 61 6c 6c 79 0a 2a 2a 20 76 65 72 79 20 6c 61 72 ally.** very lar
20c0: 67 65 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 ge, meaning that
20d0: 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6f 66 the interior of
20e0: 20 74 68 65 20 74 72 65 65 20 63 6f 6e 73 75 6d the tree consum
20f0: 65 73 20 72 65 6c 61 74 69 76 65 6c 79 20 0a 2a es relatively .*
2100: 2a 20 6c 69 74 74 6c 65 20 6d 65 6d 6f 72 79 2e * little memory.
2110: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d 65 .*/.struct Segme
2120: 6e 74 4e 6f 64 65 20 7b 0a 20 20 53 65 67 6d 65 ntNode {. Segme
2130: 6e 74 4e 6f 64 65 20 2a 70 50 61 72 65 6e 74 3b ntNode *pParent;
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 /* Pa
2150: 72 65 6e 74 20 6e 6f 64 65 20 28 6f 72 20 4e 55 rent node (or NU
2160: 4c 4c 20 66 6f 72 20 72 6f 6f 74 20 6e 6f 64 65 LL for root node
2170: 29 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e 6f ) */. SegmentNo
2180: 64 65 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 de *pRight;
2190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
21a0: 72 20 74 6f 20 72 69 67 68 74 2d 73 69 62 6c 69 r to right-sibli
21b0: 6e 67 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 4e ng */. SegmentN
21c0: 6f 64 65 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 ode *pLeftmost;
21d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
21e0: 65 72 20 74 6f 20 6c 65 66 74 2d 6d 6f 73 74 20 er to left-most
21f0: 6e 6f 64 65 20 6f 66 20 74 68 69 73 20 64 65 70 node of this dep
2200: 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6e 74 th */. int nEnt
2210: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ry;
2220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
2230: 72 20 6f 66 20 74 65 72 6d 73 20 77 72 69 74 74 r of terms writt
2240: 65 6e 20 74 6f 20 6e 6f 64 65 20 73 6f 20 66 61 en to node so fa
2250: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 r */. char *zTe
2260: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rm;
2270: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
2280: 72 20 74 6f 20 70 72 65 76 69 6f 75 73 20 74 65 r to previous te
2290: 72 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 rm buffer */. i
22a0: 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 nt nTerm;
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
22c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
22d0: 73 20 69 6e 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 s in zTerm */.
22e0: 69 6e 74 20 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 int nMalloc;
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2300: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 6c 6c 6f /* Size of mallo
2310: 63 27 64 20 62 75 66 66 65 72 20 61 74 20 7a 4d c'd buffer at zM
2320: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 alloc */. char
2330: 2a 7a 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20 *zMalloc;
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 /* Ma
2350: 6c 6c 6f 63 27 64 20 73 70 61 63 65 20 28 70 6f lloc'd space (po
2360: 73 73 69 62 6c 79 29 20 75 73 65 64 20 66 6f 72 ssibly) used for
2370: 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 zTerm */. int
2380: 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 nData;
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 /* B
23a0: 79 74 65 73 20 6f 66 20 76 61 6c 69 64 20 64 61 ytes of valid da
23b0: 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 ta so far */. c
23c0: 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 har *aData;
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
23e0: 2a 20 4e 6f 64 65 20 64 61 74 61 20 2a 2f 0a 7d * Node data */.}
23f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 69 64 20 76 ;../*.** Valid v
2400: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 73 65 alues for the se
2410: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f cond argument to
2420: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e 0a fts3SqlStmt()..
2430: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 */.#define SQL_D
2440: 45 4c 45 54 45 5f 43 4f 4e 54 45 4e 54 20 20 20 ELETE_CONTENT
2450: 20 20 20 20 20 20 20 20 20 20 30 0a 23 64 65 66 0.#def
2460: 69 6e 65 20 53 51 4c 5f 49 53 5f 45 4d 50 54 59 ine SQL_IS_EMPTY
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2480: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 1.#define SQL
2490: 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f 4e 54 _DELETE_ALL_CONT
24a0: 45 4e 54 20 20 20 20 20 20 20 20 20 32 20 0a 23 ENT 2 .#
24b0: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 define SQL_DELET
24c0: 45 5f 41 4c 4c 5f 53 45 47 4d 45 4e 54 53 20 20 E_ALL_SEGMENTS
24d0: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 3.#define
24e0: 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 SQL_DELETE_ALL_S
24f0: 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20 34 EGDIR 4
2500: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c .#define SQL_DEL
2510: 45 54 45 5f 41 4c 4c 5f 44 4f 43 53 49 5a 45 20 ETE_ALL_DOCSIZE
2520: 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 5.#defin
2530: 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c e SQL_DELETE_ALL
2540: 5f 53 54 41 54 20 20 20 20 20 20 20 20 20 20 20 _STAT
2550: 20 36 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 6.#define SQL_S
2560: 45 4c 45 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 ELECT_CONTENT_BY
2570: 5f 52 4f 57 49 44 20 20 20 20 37 0a 23 64 65 66 _ROWID 7.#def
2580: 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 ine SQL_NEXT_SEG
2590: 4d 45 4e 54 5f 49 4e 44 45 58 20 20 20 20 20 20 MENT_INDEX
25a0: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 53 51 4c 8.#define SQL
25b0: 5f 49 4e 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 _INSERT_SEGMENTS
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 39 0a 23 64 9.#d
25d0: 65 66 69 6e 65 20 53 51 4c 5f 4e 45 58 54 5f 53 efine SQL_NEXT_S
25e0: 45 47 4d 45 4e 54 53 5f 49 44 20 20 20 20 20 20 EGMENTS_ID
25f0: 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53 10.#define S
2600: 51 4c 5f 49 4e 53 45 52 54 5f 53 45 47 44 49 52 QL_INSERT_SEGDIR
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 31 0a 11.
2620: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 #define SQL_SELE
2630: 43 54 5f 4c 45 56 45 4c 20 20 20 20 20 20 20 20 CT_LEVEL
2640: 20 20 20 20 20 20 31 32 0a 23 64 65 66 69 6e 65 12.#define
2650: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 SQL_SELECT_LEVE
2660: 4c 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 31 L_RANGE 1
2670: 33 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 3.#define SQL_SE
2680: 4c 45 43 54 5f 4c 45 56 45 4c 5f 43 4f 55 4e 54 LECT_LEVEL_COUNT
2690: 20 20 20 20 20 20 20 20 31 34 0a 23 64 65 66 69 14.#defi
26a0: 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 ne SQL_SELECT_SE
26b0: 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c 20 20 GDIR_MAX_LEVEL
26c0: 20 31 35 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 15.#define SQL_
26d0: 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 DELETE_SEGDIR_LE
26e0: 56 45 4c 20 20 20 20 20 20 20 31 36 0a 23 64 65 VEL 16.#de
26f0: 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 45 5f fine SQL_DELETE_
2700: 53 45 47 4d 45 4e 54 53 5f 52 41 4e 47 45 20 20 SEGMENTS_RANGE
2710: 20 20 20 31 37 0a 23 64 65 66 69 6e 65 20 53 51 17.#define SQ
2720: 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 L_CONTENT_INSERT
2730: 20 20 20 20 20 20 20 20 20 20 20 20 31 38 0a 23 18.#
2740: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 define SQL_DELET
2750: 45 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 20 20 E_DOCSIZE
2760: 20 20 20 20 20 31 39 0a 23 64 65 66 69 6e 65 20 19.#define
2770: 53 51 4c 5f 52 45 50 4c 41 43 45 5f 44 4f 43 53 SQL_REPLACE_DOCS
2780: 49 5a 45 20 20 20 20 20 20 20 20 20 20 20 32 30 IZE 20
2790: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c .#define SQL_SEL
27a0: 45 43 54 5f 44 4f 43 53 49 5a 45 20 20 20 20 20 ECT_DOCSIZE
27b0: 20 20 20 20 20 20 20 32 31 0a 23 64 65 66 69 6e 21.#defin
27c0: 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f 53 54 41 e SQL_SELECT_STA
27d0: 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 T
27e0: 32 32 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 52 22.#define SQL_R
27f0: 45 50 4c 41 43 45 5f 53 54 41 54 20 20 20 20 20 EPLACE_STAT
2800: 20 20 20 20 20 20 20 20 20 32 33 0a 0a 23 64 65 23..#de
2810: 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 43 54 5f fine SQL_SELECT_
2820: 41 4c 4c 5f 50 52 45 46 49 58 5f 4c 45 56 45 4c ALL_PREFIX_LEVEL
2830: 20 20 20 32 34 0a 23 64 65 66 69 6e 65 20 53 51 24.#define SQ
2840: 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 54 45 52 L_DELETE_ALL_TER
2850: 4d 53 5f 53 45 47 44 49 52 20 20 20 32 35 0a 23 MS_SEGDIR 25.#
2860: 64 65 66 69 6e 65 20 53 51 4c 5f 44 45 4c 45 54 define SQL_DELET
2870: 45 5f 53 45 47 44 49 52 5f 52 41 4e 47 45 20 20 E_SEGDIR_RANGE
2880: 20 20 20 20 20 32 36 0a 23 64 65 66 69 6e 65 20 26.#define
2890: 53 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c SQL_SELECT_ALL_L
28a0: 41 4e 47 49 44 20 20 20 20 20 20 20 20 20 32 37 ANGID 27
28b0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 46 49 4e .#define SQL_FIN
28c0: 44 5f 4d 45 52 47 45 5f 4c 45 56 45 4c 20 20 20 D_MERGE_LEVEL
28d0: 20 20 20 20 20 20 20 32 38 0a 23 64 65 66 69 6e 28.#defin
28e0: 65 20 53 51 4c 5f 4d 41 58 5f 4c 45 41 46 5f 4e e SQL_MAX_LEAF_N
28f0: 4f 44 45 5f 45 53 54 49 4d 41 54 45 20 20 20 20 ODE_ESTIMATE
2900: 32 39 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 44 29.#define SQL_D
2910: 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 4e 54 ELETE_SEGDIR_ENT
2920: 52 59 20 20 20 20 20 20 20 33 30 0a 23 64 65 66 RY 30.#def
2930: 69 6e 65 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 ine SQL_SHIFT_SE
2940: 47 44 49 52 5f 45 4e 54 52 59 20 20 20 20 20 20 GDIR_ENTRY
2950: 20 20 33 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 31.#define SQL
2960: 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 20 20 _SELECT_SEGDIR
2970: 20 20 20 20 20 20 20 20 20 20 20 33 32 0a 23 64 32.#d
2980: 65 66 69 6e 65 20 53 51 4c 5f 43 48 4f 4d 50 5f efine SQL_CHOMP_
2990: 53 45 47 44 49 52 20 20 20 20 20 20 20 20 20 20 SEGDIR
29a0: 20 20 20 20 33 33 0a 23 64 65 66 69 6e 65 20 53 33.#define S
29b0: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50 QL_SEGMENT_IS_AP
29c0: 50 45 4e 44 41 42 4c 45 20 20 20 20 20 33 34 0a PENDABLE 34.
29d0: 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 45 4c 45 #define SQL_SELE
29e0: 43 54 5f 49 4e 44 45 58 45 53 20 20 20 20 20 20 CT_INDEXES
29f0: 20 20 20 20 20 20 33 35 0a 23 64 65 66 69 6e 65 35.#define
2a00: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 4d 58 4c 45 SQL_SELECT_MXLE
2a10: 56 45 4c 20 20 20 20 20 20 20 20 20 20 20 20 33 VEL 3
2a20: 36 0a 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 53 6..#define SQL_S
2a30: 45 4c 45 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 ELECT_LEVEL_RANG
2a40: 45 32 20 20 20 20 20 20 20 33 37 0a 23 64 65 66 E2 37.#def
2a50: 69 6e 65 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c ine SQL_UPDATE_L
2a60: 45 56 45 4c 5f 49 44 58 20 20 20 20 20 20 20 20 EVEL_IDX
2a70: 20 20 33 38 0a 23 64 65 66 69 6e 65 20 53 51 4c 38.#define SQL
2a80: 5f 55 50 44 41 54 45 5f 4c 45 56 45 4c 20 20 20 _UPDATE_LEVEL
2a90: 20 20 20 20 20 20 20 20 20 20 20 33 39 0a 0a 2f 39../
2aa0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 *.** This functi
2ab0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6f 62 on is used to ob
2ac0: 74 61 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 70 tain an SQLite p
2ad0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
2ae0: 74 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 t handle.** for
2af0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 64 the statement id
2b00: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 entified by the
2b10: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e second argument.
2b20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a If successful,.
2b30: 2a 2a 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f ** *pp is set to
2b40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 the requested s
2b50: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 tatement handle
2b60: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 and SQLITE_OK re
2b70: 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72 turned..** Other
2b80: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 wise, an SQLite
2b90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 error code is re
2ba0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 turned and *pp i
2bb0: 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a s set to 0..**.*
2bc0: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 61 70 * If argument ap
2bd0: 56 61 6c 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c Val is not NULL,
2be0: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 70 6f then it must po
2bf0: 69 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 int to an array
2c00: 77 69 74 68 0a 2a 2a 20 61 74 20 6c 65 61 73 74 with.** at least
2c10: 20 61 73 20 6d 61 6e 79 20 65 6e 74 72 69 65 73 as many entries
2c20: 20 61 73 20 74 68 65 20 72 65 71 75 65 73 74 65 as the requeste
2c30: 64 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 d statement has
2c40: 62 6f 75 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 bound .** parame
2c50: 74 65 72 73 2e 20 54 68 65 20 76 61 6c 75 65 73 ters. The values
2c60: 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 74 68 are bound to th
2c70: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 70 61 72 e statements par
2c80: 61 6d 65 74 65 72 73 20 62 65 66 6f 72 65 0a 2a ameters before.*
2c90: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a * returning..*/.
2ca0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 static int fts3S
2cb0: 71 6c 53 74 6d 74 28 0a 20 20 46 74 73 33 54 61 qlStmt(. Fts3Ta
2cc0: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 ble *p,
2cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 /* Vir
2ce0: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c tual table handl
2cf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 e */. int eStmt
2d00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
2d10: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 /* One of
2d20: 20 74 68 65 20 53 51 4c 5f 58 58 58 20 63 6f 6e the SQL_XXX con
2d30: 73 74 61 6e 74 73 20 61 62 6f 76 65 20 2a 2f 0a stants above */.
2d40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a sqlite3_stmt *
2d50: 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *pp,
2d60: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61 74 65 6d /* OUT: Statem
2d70: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 ent handle */.
2d80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a sqlite3_value **
2d90: 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 apVal
2da0: 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20 62 69 6e /* Values to bin
2db0: 64 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 20 2a d to statement *
2dc0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 /.){. const cha
2dd0: 72 20 2a 61 7a 53 71 6c 5b 5d 20 3d 20 7b 0a 2f r *azSql[] = {./
2de0: 2a 20 30 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 * 0 */ "DELETE
2df0: 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f 6e FROM %Q.'%q_con
2e00: 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 69 tent' WHERE rowi
2e10: 64 20 3d 20 3f 22 2c 0a 2f 2a 20 31 20 20 2a 2f d = ?",./* 1 */
2e20: 20 20 22 53 45 4c 45 43 54 20 4e 4f 54 20 45 58 "SELECT NOT EX
2e30: 49 53 54 53 28 53 45 4c 45 43 54 20 64 6f 63 69 ISTS(SELECT doci
2e40: 64 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 63 6f d FROM %Q.'%q_co
2e50: 6e 74 65 6e 74 27 20 57 48 45 52 45 20 72 6f 77 ntent' WHERE row
2e60: 69 64 21 3d 3f 29 22 2c 0a 2f 2a 20 32 20 20 2a id!=?)",./* 2 *
2e70: 2f 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 / "DELETE FROM
2e80: 25 51 2e 27 25 71 5f 63 6f 6e 74 65 6e 74 27 22 %Q.'%q_content'"
2e90: 2c 0a 2f 2a 20 33 20 20 2a 2f 20 20 22 44 45 4c ,./* 3 */ "DEL
2ea0: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f ETE FROM %Q.'%q_
2eb0: 73 65 67 6d 65 6e 74 73 27 22 2c 0a 2f 2a 20 34 segments'",./* 4
2ec0: 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 52 */ "DELETE FR
2ed0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 OM %Q.'%q_segdir
2ee0: 27 22 2c 0a 2f 2a 20 35 20 20 2a 2f 20 20 22 44 '",./* 5 */ "D
2ef0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 ELETE FROM %Q.'%
2f00: 71 5f 64 6f 63 73 69 7a 65 27 22 2c 0a 2f 2a 20 q_docsize'",./*
2f10: 36 20 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 6 */ "DELETE F
2f20: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 74 61 74 27 ROM %Q.'%q_stat'
2f30: 22 2c 0a 2f 2a 20 37 20 20 2a 2f 20 20 22 53 45 ",./* 7 */ "SE
2f40: 4c 45 43 54 20 25 73 20 57 48 45 52 45 20 72 6f LECT %s WHERE ro
2f50: 77 69 64 3d 3f 22 2c 0a 2f 2a 20 38 20 20 2a 2f wid=?",./* 8 */
2f60: 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43 "SELECT (SELEC
2f70: 54 20 6d 61 78 28 69 64 78 29 20 46 52 4f 4d 20 T max(idx) FROM
2f80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 %Q.'%q_segdir' W
2f90: 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f 29 20 HERE level = ?)
2fa0: 2b 20 31 22 2c 0a 2f 2a 20 39 20 20 2a 2f 20 20 + 1",./* 9 */
2fb0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 "REPLACE INTO %Q
2fc0: 2e 27 25 71 5f 73 65 67 6d 65 6e 74 73 27 28 62 .'%q_segments'(b
2fd0: 6c 6f 63 6b 69 64 2c 20 62 6c 6f 63 6b 29 20 56 lockid, block) V
2fe0: 41 4c 55 45 53 28 3f 2c 20 3f 29 22 2c 0a 2f 2a ALUES(?, ?)",./*
2ff0: 20 31 30 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 10 */ "SELECT
3000: 63 6f 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 coalesce((SELECT
3010: 20 6d 61 78 28 62 6c 6f 63 6b 69 64 29 20 46 52 max(blockid) FR
3020: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 6d 65 6e OM %Q.'%q_segmen
3030: 74 73 27 29 20 2b 20 31 2c 20 31 29 22 2c 0a 2f ts') + 1, 1)",./
3040: 2a 20 31 31 20 2a 2f 20 20 22 52 45 50 4c 41 43 * 11 */ "REPLAC
3050: 45 20 49 4e 54 4f 20 25 51 2e 27 25 71 5f 73 65 E INTO %Q.'%q_se
3060: 67 64 69 72 27 20 56 41 4c 55 45 53 28 3f 2c 3f gdir' VALUES(?,?
3070: 2c 3f 2c 3f 2c 3f 2c 3f 29 22 2c 0a 0a 20 20 20 ,?,?,?,?)",..
3080: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e /* Return
3090: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 72 64 segments in ord
30a0: 65 72 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 er from oldest t
30b0: 6f 20 6e 65 77 65 73 74 2e 2a 2f 20 0a 2f 2a 20 o newest.*/ ./*
30c0: 31 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 12 */ "SELECT i
30d0: 64 78 2c 20 73 74 61 72 74 5f 62 6c 6f 63 6b 2c dx, start_block,
30e0: 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 leaves_end_bloc
30f0: 6b 2c 20 65 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f k, end_block, ro
3100: 6f 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 ot ".
3110: 20 22 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 "FROM %Q.'%q_se
3120: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 gdir' WHERE leve
3130: 6c 20 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 69 l = ? ORDER BY i
3140: 64 78 20 41 53 43 22 2c 0a 2f 2a 20 31 33 20 2a dx ASC",./* 13 *
3150: 2f 20 20 22 53 45 4c 45 43 54 20 69 64 78 2c 20 / "SELECT idx,
3160: 73 74 61 72 74 5f 62 6c 6f 63 6b 2c 20 6c 65 61 start_block, lea
3170: 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 2c 20 65 ves_end_block, e
3180: 6e 64 5f 62 6c 6f 63 6b 2c 20 72 6f 6f 74 20 22 nd_block, root "
3190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 46 52 . "FR
31a0: 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 OM %Q.'%q_segdir
31b0: 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45 ' WHERE level BE
31c0: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 22 0a 20 TWEEN ? AND ?".
31d0: 20 20 20 20 20 20 20 20 20 20 20 22 4f 52 44 45 "ORDE
31e0: 52 20 42 59 20 6c 65 76 65 6c 20 44 45 53 43 2c R BY level DESC,
31f0: 20 69 64 78 20 41 53 43 22 2c 0a 0a 2f 2a 20 31 idx ASC",../* 1
3200: 34 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 63 6f 4 */ "SELECT co
3210: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 51 2e 27 unt(*) FROM %Q.'
3220: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 %q_segdir' WHERE
3230: 20 6c 65 76 65 6c 20 3d 20 3f 22 2c 0a 2f 2a 20 level = ?",./*
3240: 31 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 6d 15 */ "SELECT m
3250: 61 78 28 6c 65 76 65 6c 29 20 46 52 4f 4d 20 25 ax(level) FROM %
3260: 51 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 Q.'%q_segdir' WH
3270: 45 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 ERE level BETWEE
3280: 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 0a 2f 2a 20 N ? AND ?",../*
3290: 31 36 20 2a 2f 20 20 22 44 45 4c 45 54 45 20 46 16 */ "DELETE F
32a0: 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 ROM %Q.'%q_segdi
32b0: 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d r' WHERE level =
32c0: 20 3f 22 2c 0a 2f 2a 20 31 37 20 2a 2f 20 20 22 ?",./* 17 */ "
32d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 DELETE FROM %Q.'
32e0: 25 71 5f 73 65 67 6d 65 6e 74 73 27 20 57 48 45 %q_segments' WHE
32f0: 52 45 20 62 6c 6f 63 6b 69 64 20 42 45 54 57 45 RE blockid BETWE
3300: 45 4e 20 3f 20 41 4e 44 20 3f 22 2c 0a 2f 2a 20 EN ? AND ?",./*
3310: 31 38 20 2a 2f 20 20 22 49 4e 53 45 52 54 20 49 18 */ "INSERT I
3320: 4e 54 4f 20 25 51 2e 27 25 71 5f 63 6f 6e 74 65 NTO %Q.'%q_conte
3330: 6e 74 27 20 56 41 4c 55 45 53 28 25 73 29 22 2c nt' VALUES(%s)",
3340: 0a 2f 2a 20 31 39 20 2a 2f 20 20 22 44 45 4c 45 ./* 19 */ "DELE
3350: 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 64 TE FROM %Q.'%q_d
3360: 6f 63 73 69 7a 65 27 20 57 48 45 52 45 20 64 6f ocsize' WHERE do
3370: 63 69 64 20 3d 20 3f 22 2c 0a 2f 2a 20 32 30 20 cid = ?",./* 20
3380: 2a 2f 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 */ "REPLACE INT
3390: 4f 20 25 51 2e 27 25 71 5f 64 6f 63 73 69 7a 65 O %Q.'%q_docsize
33a0: 27 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 0a ' VALUES(?,?)",.
33b0: 2f 2a 20 32 31 20 2a 2f 20 20 22 53 45 4c 45 43 /* 21 */ "SELEC
33c0: 54 20 73 69 7a 65 20 46 52 4f 4d 20 25 51 2e 27 T size FROM %Q.'
33d0: 25 71 5f 64 6f 63 73 69 7a 65 27 20 57 48 45 52 %q_docsize' WHER
33e0: 45 20 64 6f 63 69 64 3d 3f 22 2c 0a 2f 2a 20 32 E docid=?",./* 2
33f0: 32 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 76 61 2 */ "SELECT va
3400: 6c 75 65 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f lue FROM %Q.'%q_
3410: 73 74 61 74 27 20 57 48 45 52 45 20 69 64 3d 3f stat' WHERE id=?
3420: 22 2c 0a 2f 2a 20 32 33 20 2a 2f 20 20 22 52 45 ",./* 23 */ "RE
3430: 50 4c 41 43 45 20 49 4e 54 4f 20 25 51 2e 27 25 PLACE INTO %Q.'%
3440: 71 5f 73 74 61 74 27 20 56 41 4c 55 45 53 28 3f q_stat' VALUES(?
3450: 2c 3f 29 22 2c 0a 2f 2a 20 32 34 20 2a 2f 20 20 ,?)",./* 24 */
3460: 22 22 2c 0a 2f 2a 20 32 35 20 2a 2f 20 20 22 22 "",./* 25 */ ""
3470: 2c 0a 0a 2f 2a 20 32 36 20 2a 2f 20 22 44 45 4c ,../* 26 */ "DEL
3480: 45 54 45 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f ETE FROM %Q.'%q_
3490: 73 65 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 segdir' WHERE le
34a0: 76 65 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e vel BETWEEN ? AN
34b0: 44 20 3f 22 2c 0a 2f 2a 20 32 37 20 2a 2f 20 22 D ?",./* 27 */ "
34c0: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 SELECT DISTINCT
34d0: 6c 65 76 65 6c 20 2f 20 28 31 30 32 34 20 2a 20 level / (1024 *
34e0: 3f 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 ?) FROM %Q.'%q_s
34f0: 65 67 64 69 72 27 22 2c 0a 0a 2f 2a 20 54 68 69 egdir'",../* Thi
3500: 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 s statement is u
3510: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 sed to determine
3520: 20 77 68 69 63 68 20 6c 65 76 65 6c 20 74 6f 20 which level to
3530: 72 65 61 64 20 74 68 65 20 69 6e 70 75 74 20 66 read the input f
3540: 72 6f 6d 0a 2a 2a 20 77 68 65 6e 20 70 65 72 66 rom.** when perf
3550: 6f 72 6d 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d orming an increm
3560: 65 6e 74 61 6c 20 6d 65 72 67 65 2e 20 49 74 20 ental merge. It
3570: 72 65 74 75 72 6e 73 20 74 68 65 20 61 62 73 6f returns the abso
3580: 6c 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 lute level numbe
3590: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 6c 64 65 r.** of the olde
35a0: 73 74 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 st level in the
35b0: 64 62 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 db that contains
35c0: 20 61 74 20 6c 65 61 73 74 20 3f 20 73 65 67 6d at least ? segm
35d0: 65 6e 74 73 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 ents. Or,.** if
35e0: 6e 6f 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 no level in the
35f0: 46 54 53 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 FTS index contai
3600: 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 3f 20 73 ns more than ? s
3610: 65 67 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 61 egments, the sta
3620: 74 65 6d 65 6e 74 0a 2a 2a 20 72 65 74 75 72 6e tement.** return
3630: 73 20 7a 65 72 6f 20 72 6f 77 73 2e 20 20 2a 2f s zero rows. */
3640: 0a 2f 2a 20 32 38 20 2a 2f 20 22 53 45 4c 45 43 ./* 28 */ "SELEC
3650: 54 20 6c 65 76 65 6c 20 46 52 4f 4d 20 25 51 2e T level FROM %Q.
3660: 27 25 71 5f 73 65 67 64 69 72 27 20 47 52 4f 55 '%q_segdir' GROU
3670: 50 20 42 59 20 6c 65 76 65 6c 20 48 41 56 49 4e P BY level HAVIN
3680: 47 20 63 6f 75 6e 74 28 2a 29 3e 3d 3f 22 0a 20 G count(*)>=?".
3690: 20 20 20 20 20 20 20 20 22 20 20 4f 52 44 45 52 " ORDER
36a0: 20 42 59 20 28 6c 65 76 65 6c 20 25 25 20 31 30 BY (level %% 10
36b0: 32 34 29 20 41 53 43 20 4c 49 4d 49 54 20 31 22 24) ASC LIMIT 1"
36c0: 2c 0a 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 ,../* Estimate t
36d0: 68 65 20 75 70 70 65 72 20 6c 69 6d 69 74 20 6f he upper limit o
36e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
36f0: 6c 65 61 66 20 6e 6f 64 65 73 20 69 6e 20 61 20 leaf nodes in a
3700: 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 63 new segment.** c
3710: 72 65 61 74 65 64 20 62 79 20 6d 65 72 67 69 6e reated by mergin
3720: 67 20 74 68 65 20 6f 6c 64 65 73 74 20 3a 32 20 g the oldest :2
3730: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 segments from ab
3740: 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 3a 31 2e solute level :1.
3750: 20 53 65 65 20 0a 2a 2a 20 66 75 6e 63 74 69 6f See .** functio
3760: 6e 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 n sqlite3Fts3Inc
3770: 72 6d 65 72 67 65 28 29 20 66 6f 72 20 64 65 74 rmerge() for det
3780: 61 69 6c 73 2e 20 20 2a 2f 0a 2f 2a 20 32 39 20 ails. */./* 29
3790: 2a 2f 20 22 53 45 4c 45 43 54 20 32 20 2a 20 74 */ "SELECT 2 * t
37a0: 6f 74 61 6c 28 31 20 2b 20 6c 65 61 76 65 73 5f otal(1 + leaves_
37b0: 65 6e 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 end_block - star
37c0: 74 5f 62 6c 6f 63 6b 29 20 22 0a 20 20 20 20 20 t_block) ".
37d0: 20 20 20 20 22 20 20 46 52 4f 4d 20 25 51 2e 27 " FROM %Q.'
37e0: 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 45 %q_segdir' WHERE
37f0: 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 69 level = ? AND i
3800: 64 78 20 3c 20 3f 22 2c 0a 0a 2f 2a 20 53 51 4c dx < ?",../* SQL
3810: 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 45 _DELETE_SEGDIR_E
3820: 4e 54 52 59 0a 2a 2a 20 20 20 44 65 6c 65 74 65 NTRY.** Delete
3830: 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 65 6e the %_segdir en
3840: 74 72 79 20 6f 6e 20 61 62 73 6f 6c 75 74 65 20 try on absolute
3850: 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 6e level :1 with in
3860: 64 65 78 20 3a 32 2e 20 20 2a 2f 0a 2f 2a 20 33 dex :2. */./* 3
3870: 30 20 2a 2f 20 22 44 45 4c 45 54 45 20 46 52 4f 0 */ "DELETE FRO
3880: 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 M %Q.'%q_segdir'
3890: 20 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3f WHERE level = ?
38a0: 20 41 4e 44 20 69 64 78 20 3d 20 3f 22 2c 0a 0a AND idx = ?",..
38b0: 2f 2a 20 53 51 4c 5f 53 48 49 46 54 5f 53 45 47 /* SQL_SHIFT_SEG
38c0: 44 49 52 5f 45 4e 54 52 59 0a 2a 2a 20 20 20 4d DIR_ENTRY.** M
38d0: 6f 64 69 66 79 20 74 68 65 20 69 64 78 20 76 61 odify the idx va
38e0: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 65 67 6d lue for the segm
38f0: 65 6e 74 20 77 69 74 68 20 69 64 78 3d 3a 33 20 ent with idx=:3
3900: 6f 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 on absolute leve
3910: 6c 20 3a 32 0a 2a 2a 20 20 20 74 6f 20 3a 31 2e l :2.** to :1.
3920: 20 20 2a 2f 0a 2f 2a 20 33 31 20 2a 2f 20 22 55 */./* 31 */ "U
3930: 50 44 41 54 45 20 25 51 2e 27 25 71 5f 73 65 67 PDATE %Q.'%q_seg
3940: 64 69 72 27 20 53 45 54 20 69 64 78 20 3d 20 3f dir' SET idx = ?
3950: 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f 20 41 WHERE level=? A
3960: 4e 44 20 69 64 78 3d 3f 22 2c 0a 0a 2f 2a 20 53 ND idx=?",../* S
3970: 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 QL_SELECT_SEGDIR
3980: 0a 2a 2a 20 20 20 52 65 61 64 20 61 20 73 69 6e .** Read a sin
3990: 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 gle entry from t
39a0: 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c he %_segdir tabl
39b0: 65 2e 20 54 68 65 20 65 6e 74 72 79 20 66 72 6f e. The entry fro
39c0: 6d 20 61 62 73 6f 6c 75 74 65 20 0a 2a 2a 20 20 m absolute .**
39d0: 20 6c 65 76 65 6c 20 3a 31 20 77 69 74 68 20 69 level :1 with i
39e0: 6e 64 65 78 20 76 61 6c 75 65 20 3a 32 2e 20 20 ndex value :2.
39f0: 2a 2f 0a 2f 2a 20 33 32 20 2a 2f 20 20 22 53 45 */./* 32 */ "SE
3a00: 4c 45 43 54 20 69 64 78 2c 20 73 74 61 72 74 5f LECT idx, start_
3a10: 62 6c 6f 63 6b 2c 20 6c 65 61 76 65 73 5f 65 6e block, leaves_en
3a20: 64 5f 62 6c 6f 63 6b 2c 20 65 6e 64 5f 62 6c 6f d_block, end_blo
3a30: 63 6b 2c 20 72 6f 6f 74 20 22 0a 20 20 20 20 20 ck, root ".
3a40: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 2e "FROM %Q.
3a50: 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 52 '%q_segdir' WHER
3a60: 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 20 E level = ? AND
3a70: 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 51 idx = ?",../* SQ
3a80: 4c 5f 43 48 4f 4d 50 5f 53 45 47 44 49 52 0a 2a L_CHOMP_SEGDIR.*
3a90: 2a 20 20 20 55 70 64 61 74 65 20 74 68 65 20 73 * Update the s
3aa0: 74 61 72 74 5f 62 6c 6f 63 6b 20 28 3a 31 29 20 tart_block (:1)
3ab0: 61 6e 64 20 72 6f 6f 74 20 28 3a 32 29 20 66 69 and root (:2) fi
3ac0: 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f 73 65 elds of the %_se
3ad0: 67 64 69 72 0a 2a 2a 20 20 20 65 6e 74 72 79 20 gdir.** entry
3ae0: 6c 6f 63 61 74 65 64 20 6f 6e 20 61 62 73 6f 6c located on absol
3af0: 75 74 65 20 6c 65 76 65 6c 20 3a 33 20 77 69 74 ute level :3 wit
3b00: 68 20 69 6e 64 65 78 20 3a 34 2e 20 20 2a 2f 0a h index :4. */.
3b10: 2f 2a 20 33 33 20 2a 2f 20 20 22 55 50 44 41 54 /* 33 */ "UPDAT
3b20: 45 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 E %Q.'%q_segdir'
3b30: 20 53 45 54 20 73 74 61 72 74 5f 62 6c 6f 63 6b SET start_block
3b40: 20 3d 20 3f 2c 20 72 6f 6f 74 20 3d 20 3f 22 0a = ?, root = ?".
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45 "WHE
3b60: 52 45 20 6c 65 76 65 6c 20 3d 20 3f 20 41 4e 44 RE level = ? AND
3b70: 20 69 64 78 20 3d 20 3f 22 2c 0a 0a 2f 2a 20 53 idx = ?",../* S
3b80: 51 4c 5f 53 45 47 4d 45 4e 54 5f 49 53 5f 41 50 QL_SEGMENT_IS_AP
3b90: 50 45 4e 44 41 42 4c 45 0a 2a 2a 20 20 20 52 65 PENDABLE.** Re
3ba0: 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f turn a single ro
3bb0: 77 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 w if the segment
3bc0: 20 77 69 74 68 20 65 6e 64 5f 62 6c 6f 63 6b 3d with end_block=
3bd0: 3f 20 69 73 20 61 70 70 65 6e 64 61 62 6c 65 2e ? is appendable.
3be0: 20 4f 72 0a 2a 2a 20 20 20 6e 6f 20 72 6f 77 73 Or.** no rows
3bf0: 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f 0a otherwise. */.
3c00: 2f 2a 20 33 34 20 2a 2f 20 20 22 53 45 4c 45 43 /* 34 */ "SELEC
3c10: 54 20 31 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f T 1 FROM %Q.'%q_
3c20: 73 65 67 6d 65 6e 74 73 27 20 57 48 45 52 45 20 segments' WHERE
3c30: 62 6c 6f 63 6b 69 64 3d 3f 20 41 4e 44 20 62 6c blockid=? AND bl
3c40: 6f 63 6b 20 49 53 20 4e 55 4c 4c 22 2c 0a 0a 2f ock IS NULL",../
3c50: 2a 20 53 51 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 * SQL_SELECT_IND
3c60: 45 58 45 53 0a 2a 2a 20 20 20 52 65 74 75 72 6e EXES.** Return
3c70: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 76 61 6c the list of val
3c80: 69 64 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 id segment index
3c90: 65 73 20 66 6f 72 20 61 62 73 6f 6c 75 74 65 20 es for absolute
3ca0: 6c 65 76 65 6c 20 3f 20 20 2a 2f 0a 2f 2a 20 33 level ? */./* 3
3cb0: 35 20 2a 2f 20 20 22 53 45 4c 45 43 54 20 69 64 5 */ "SELECT id
3cc0: 78 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 x FROM %Q.'%q_se
3cd0: 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 gdir' WHERE leve
3ce0: 6c 3d 3f 20 4f 52 44 45 52 20 42 59 20 31 20 41 l=? ORDER BY 1 A
3cf0: 53 43 22 2c 0a 0a 2f 2a 20 53 51 4c 5f 53 45 4c SC",../* SQL_SEL
3d00: 45 43 54 5f 4d 58 4c 45 56 45 4c 0a 2a 2a 20 20 ECT_MXLEVEL.**
3d10: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 61 72 67 Return the larg
3d20: 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65 76 est relative lev
3d30: 65 6c 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e el in the FTS in
3d40: 64 65 78 20 6f 72 20 69 6e 64 65 78 65 73 2e 20 dex or indexes.
3d50: 20 2a 2f 0a 2f 2a 20 33 36 20 2a 2f 20 20 22 53 */./* 36 */ "S
3d60: 45 4c 45 43 54 20 6d 61 78 28 20 6c 65 76 65 6c ELECT max( level
3d70: 20 25 25 20 31 30 32 34 20 29 20 46 52 4f 4d 20 %% 1024 ) FROM
3d80: 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 22 2c %Q.'%q_segdir'",
3d90: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 .. /* R
3da0: 65 74 75 72 6e 20 73 65 67 6d 65 6e 74 73 20 69 eturn segments i
3db0: 6e 20 6f 72 64 65 72 20 66 72 6f 6d 20 6f 6c 64 n order from old
3dc0: 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e 2a 2f est to newest.*/
3dd0: 20 0a 2f 2a 20 33 37 20 2a 2f 20 20 22 53 45 4c ./* 37 */ "SEL
3de0: 45 43 54 20 6c 65 76 65 6c 2c 20 69 64 78 2c 20 ECT level, idx,
3df0: 65 6e 64 5f 62 6c 6f 63 6b 20 22 0a 20 20 20 20 end_block ".
3e00: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 25 51 "FROM %Q
3e10: 2e 27 25 71 5f 73 65 67 64 69 72 27 20 57 48 45 .'%q_segdir' WHE
3e20: 52 45 20 6c 65 76 65 6c 20 42 45 54 57 45 45 4e RE level BETWEEN
3e30: 20 3f 20 41 4e 44 20 3f 20 22 0a 20 20 20 20 20 ? AND ? ".
3e40: 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 "ORDER BY
3e50: 20 6c 65 76 65 6c 20 44 45 53 43 2c 20 69 64 78 level DESC, idx
3e60: 20 41 53 43 22 2c 0a 0a 20 20 20 20 20 20 20 20 ASC",..
3e70: 20 20 2f 2a 20 55 70 64 61 74 65 20 73 74 61 74 /* Update stat
3e80: 65 6d 65 6e 74 73 20 75 73 65 64 20 77 68 69 6c ements used whil
3e90: 65 20 70 72 6f 6d 6f 74 69 6e 67 20 73 65 67 6d e promoting segm
3ea0: 65 6e 74 73 20 2a 2f 0a 2f 2a 20 33 38 20 2a 2f ents */./* 38 */
3eb0: 20 20 22 55 50 44 41 54 45 20 4f 52 20 46 41 49 "UPDATE OR FAI
3ec0: 4c 20 25 51 2e 27 25 71 5f 73 65 67 64 69 72 27 L %Q.'%q_segdir'
3ed0: 20 53 45 54 20 6c 65 76 65 6c 3d 2d 31 2c 69 64 SET level=-1,id
3ee0: 78 3d 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20 x=? ".
3ef0: 20 20 22 57 48 45 52 45 20 6c 65 76 65 6c 3d 3f "WHERE level=?
3f00: 20 41 4e 44 20 69 64 78 3d 3f 22 2c 0a 2f 2a 20 AND idx=?",./*
3f10: 33 39 20 2a 2f 20 20 22 55 50 44 41 54 45 20 4f 39 */ "UPDATE O
3f20: 52 20 46 41 49 4c 20 25 51 2e 27 25 71 5f 73 65 R FAIL %Q.'%q_se
3f30: 67 64 69 72 27 20 53 45 54 20 6c 65 76 65 6c 3d gdir' SET level=
3f40: 3f 20 57 48 45 52 45 20 6c 65 76 65 6c 3d 2d 31 ? WHERE level=-1
3f50: 22 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 72 63 ".. };. int rc
3f60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
3f70: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 sqlite3_stmt *pS
3f80: 74 6d 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 tmt;.. assert(
3f90: 53 69 7a 65 6f 66 41 72 72 61 79 28 61 7a 53 71 SizeofArray(azSq
3fa0: 6c 29 3d 3d 53 69 7a 65 6f 66 41 72 72 61 79 28 l)==SizeofArray(
3fb0: 70 2d 3e 61 53 74 6d 74 29 20 29 3b 0a 20 20 61 p->aStmt) );. a
3fc0: 73 73 65 72 74 28 20 65 53 74 6d 74 3c 53 69 7a ssert( eStmt<Siz
3fd0: 65 6f 66 41 72 72 61 79 28 61 7a 53 71 6c 29 20 eofArray(azSql)
3fe0: 26 26 20 65 53 74 6d 74 3e 3d 30 20 29 3b 0a 20 && eStmt>=0 );.
3ff0: 20 0a 20 20 70 53 74 6d 74 20 3d 20 70 2d 3e 61 . pStmt = p->a
4000: 53 74 6d 74 5b 65 53 74 6d 74 5d 3b 0a 20 20 69 Stmt[eStmt];. i
4010: 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20 20 20 f( !pStmt ){.
4020: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 char *zSql;.
4030: 20 69 66 28 20 65 53 74 6d 74 3d 3d 53 51 4c 5f if( eStmt==SQL_
4040: 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 54 20 29 CONTENT_INSERT )
4050: 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 {. zSql = s
4060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 qlite3_mprintf(a
4070: 7a 53 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e zSql[eStmt], p->
4080: 7a 44 62 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 zDb, p->zName, p
4090: 2d 3e 7a 57 72 69 74 65 45 78 70 72 6c 69 73 74 ->zWriteExprlist
40a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 );. }else if(
40b0: 20 65 53 74 6d 74 3d 3d 53 51 4c 5f 53 45 4c 45 eStmt==SQL_SELE
40c0: 43 54 5f 43 4f 4e 54 45 4e 54 5f 42 59 5f 52 4f CT_CONTENT_BY_RO
40d0: 57 49 44 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 WID ){. zSq
40e0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
40f0: 6e 74 66 28 61 7a 53 71 6c 5b 65 53 74 6d 74 5d ntf(azSql[eStmt]
4100: 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 , p->zReadExprli
4110: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a st);. }else{.
4120: 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c zSql = sql
4130: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 7a 53 ite3_mprintf(azS
4140: 71 6c 5b 65 53 74 6d 74 5d 2c 20 70 2d 3e 7a 44 ql[eStmt], p->zD
4150: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 b, p->zName);.
4160: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 53 71 }. if( !zSq
4170: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 l ){. rc =
4180: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 SQLITE_NOMEM;.
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 }else{. r
41a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 c = sqlite3_prep
41b0: 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 are_v2(p->db, zS
41c0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 ql, -1, &pStmt,
41d0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c NULL);. sql
41e0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b ite3_free(zSql);
41f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 . assert( r
4200: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 c==SQLITE_OK ||
4210: 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 pStmt==0 );.
4220: 20 20 70 2d 3e 61 53 74 6d 74 5b 65 53 74 6d 74 p->aStmt[eStmt
4230: 5d 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 7d ] = pStmt;. }
4240: 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 56 61 6c . }. if( apVal
4250: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
4260: 20 20 20 69 6e 74 20 6e 50 61 72 61 6d 20 3d 20 int nParam =
4270: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 sqlite3_bind_par
4280: 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 ameter_count(pSt
4290: 6d 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 mt);. for(i=0
42a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ; rc==SQLITE_OK
42b0: 26 26 20 69 3c 6e 50 61 72 61 6d 3b 20 69 2b 2b && i<nParam; i++
42c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 ){. rc = sq
42d0: 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 lite3_bind_value
42e0: 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 61 70 56 (pStmt, i+1, apV
42f0: 61 6c 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 al[i]);. }.
4300: 7d 0a 20 20 2a 70 70 20 3d 20 70 53 74 6d 74 3b }. *pp = pStmt;
4310: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
4320: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 ..static int fts
4330: 33 53 65 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a 3SelectDocsize(.
4340: 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 54 61 Fts3Table *pTa
4350: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b,
4360: 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 /* FTS3 table
4370: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 handle */. sqli
4380: 74 65 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 te3_int64 iDocid
4390: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 , /* D
43a0: 6f 63 69 64 20 74 6f 20 62 69 6e 64 20 66 6f 72 ocid to bind for
43b0: 20 53 51 4c 5f 53 45 4c 45 43 54 5f 44 4f 43 53 SQL_SELECT_DOCS
43c0: 49 5a 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 IZE */. sqlite3
43d0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 _stmt **ppStmt
43e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
43f0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c Statement handl
4400: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 e */.){. sqlite
4410: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 3_stmt *pStmt =
4420: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 0; /* Sta
4430: 74 65 6d 65 6e 74 20 72 65 71 75 65 73 74 65 64 tement requested
4440: 20 66 72 6f 6d 20 66 74 73 33 53 71 6c 53 74 6d from fts3SqlStm
4450: 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b t() */. int rc;
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
4480: 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 72 63 rn code */.. rc
4490: 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 = fts3SqlStmt(p
44a0: 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f Tab, SQL_SELECT_
44b0: 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c DOCSIZE, &pStmt,
44c0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 0);. if( rc==S
44d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
44e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
44f0: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 44 6f 64(pStmt, 1, iDo
4500: 63 69 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 cid);. rc = s
4510: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d qlite3_step(pStm
4520: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d t);. if( rc!=
4530: 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 73 71 SQLITE_ROW || sq
4540: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 lite3_column_typ
4550: 65 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c e(pStmt, 0)!=SQL
4560: 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 ITE_BLOB ){.
4570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 rc = sqlite3_r
4580: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 eset(pStmt);.
4590: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
45a0: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46 54 53 5f E_OK ) rc = FTS_
45b0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 CORRUPT_VTAB;.
45c0: 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 pStmt = 0;.
45d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
45e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
45f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 }. }.. *pp
4600: 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 Stmt = pStmt;.
4610: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e return rc;.}..in
4620: 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 6c t sqlite3Fts3Sel
4630: 65 63 74 44 6f 63 74 6f 74 61 6c 28 0a 20 20 46 ectDoctotal(. F
4640: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 ts3Table *pTab,
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
4660: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e * Fts3 table han
4670: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 dle */. sqlite3
4680: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 20 20 _stmt **ppStmt
4690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
46a0: 20 53 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c Statement handl
46b0: 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 e */.){. sqlite
46c0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 3_stmt *pStmt =
46d0: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 0;. int rc;. r
46e0: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 c = fts3SqlStmt(
46f0: 70 54 61 62 2c 20 53 51 4c 5f 53 45 4c 45 43 54 pTab, SQL_SELECT
4700: 5f 53 54 41 54 2c 20 26 70 53 74 6d 74 2c 20 30 _STAT, &pStmt, 0
4710: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c );. if( rc==SQL
4720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 ITE_OK ){. sq
4730: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 lite3_bind_int(p
4740: 53 74 6d 74 2c 20 31 2c 20 46 54 53 5f 53 54 41 Stmt, 1, FTS_STA
4750: 54 5f 44 4f 43 54 4f 54 41 4c 29 3b 0a 20 20 20 T_DOCTOTAL);.
4760: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 if( sqlite3_ste
4770: 70 28 70 53 74 6d 74 29 21 3d 53 51 4c 49 54 45 p(pStmt)!=SQLITE
4780: 5f 52 4f 57 0a 20 20 20 20 20 7c 7c 20 73 71 6c _ROW. || sql
4790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 ite3_column_type
47a0: 28 70 53 74 6d 74 2c 20 30 29 21 3d 53 51 4c 49 (pStmt, 0)!=SQLI
47b0: 54 45 5f 42 4c 4f 42 0a 20 20 20 20 29 7b 0a 20 TE_BLOB. ){.
47c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
47d0: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 3_reset(pStmt);.
47e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
47f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 46 LITE_OK ) rc = F
4800: 54 53 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b TS_CORRUPT_VTAB;
4810: 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20 30 . pStmt = 0
4820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 ;. }. }. *p
4830: 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 pStmt = pStmt;.
4840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 return rc;.}..i
4850: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 nt sqlite3Fts3Se
4860: 6c 65 63 74 44 6f 63 73 69 7a 65 28 0a 20 20 46 lectDocsize(. F
4870: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 ts3Table *pTab,
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
4890: 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e * Fts3 table han
48a0: 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 dle */. sqlite3
48b0: 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 20 _int64 iDocid,
48c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 69 /* Doci
48d0: 64 20 74 6f 20 72 65 61 64 20 73 69 7a 65 20 64 d to read size d
48e0: 61 74 61 20 66 6f 72 20 2a 2f 0a 20 20 73 71 6c ata for */. sql
48f0: 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 ite3_stmt **ppSt
4900: 6d 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 mt /*
4910: 4f 55 54 3a 20 53 74 61 74 65 6d 65 6e 74 20 68 OUT: Statement h
4920: 61 6e 64 6c 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 andle */.){. re
4930: 74 75 72 6e 20 66 74 73 33 53 65 6c 65 63 74 44 turn fts3SelectD
4940: 6f 63 73 69 7a 65 28 70 54 61 62 2c 20 69 44 6f ocsize(pTab, iDo
4950: 63 69 64 2c 20 70 70 53 74 6d 74 29 3b 0a 7d 0a cid, ppStmt);.}.
4960: 0a 2f 2a 0a 2a 2a 20 53 69 6d 69 6c 61 72 20 74 ./*.** Similar t
4970: 6f 20 66 74 73 33 53 71 6c 53 74 6d 74 28 29 2e o fts3SqlStmt().
4980: 20 45 78 63 65 70 74 2c 20 61 66 74 65 72 20 62 Except, after b
4990: 69 6e 64 69 6e 67 20 74 68 65 20 70 61 72 61 6d inding the param
49a0: 65 74 65 72 73 20 69 6e 0a 2a 2a 20 61 72 72 61 eters in.** arra
49b0: 79 20 61 70 56 61 6c 5b 5d 20 74 6f 20 74 68 65 y apVal[] to the
49c0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 SQL statement i
49d0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 65 53 74 dentified by eSt
49e0: 6d 74 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e mt, the statemen
49f0: 74 0a 2a 2a 20 69 73 20 65 78 65 63 75 74 65 64 t.** is executed
4a00: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 ..**.** Returns
4a10: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 SQLITE_OK if the
4a20: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 75 statement is su
4a30: 63 63 65 73 73 66 75 6c 6c 79 20 65 78 65 63 75 ccessfully execu
4a40: 74 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 53 51 ted, or an.** SQ
4a50: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 Lite error code
4a60: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 otherwise..*/.st
4a70: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 71 atic void fts3Sq
4a80: 6c 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52 lExec(. int *pR
4a90: 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 C,
4aa0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 /* Result code
4ab0: 20 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 */. Fts3Table
4ac0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f *p, /
4ad0: 2a 20 54 68 65 20 46 54 53 33 20 74 61 62 6c 65 * The FTS3 table
4ae0: 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 6d 74 2c */. int eStmt,
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
4b00: 2a 20 49 6e 64 65 78 20 6f 66 20 73 74 61 74 65 * Index of state
4b10: 6d 65 6e 74 20 74 6f 20 65 76 61 6c 75 61 74 65 ment to evaluate
4b20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 */. sqlite3_va
4b30: 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 2f lue **apVal /
4b40: 2a 20 50 61 72 61 6d 65 74 65 72 73 20 74 6f 20 * Parameters to
4b50: 62 69 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c bind */.){. sql
4b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 ite3_stmt *pStmt
4b70: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 ;. int rc;. if
4b80: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b ( *pRC ) return;
4b90: 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 . rc = fts3SqlS
4ba0: 74 6d 74 28 70 2c 20 65 53 74 6d 74 2c 20 26 70 tmt(p, eStmt, &p
4bb0: 53 74 6d 74 2c 20 61 70 56 61 6c 29 3b 20 0a 20 Stmt, apVal); .
4bc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
4bd0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 OK ){. sqlite
4be0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 3_step(pStmt);.
4bf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f rc = sqlite3_
4c00: 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 reset(pStmt);.
4c10: 7d 0a 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 7d }. *pRC = rc;.}
4c20: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 .../*.** This fu
4c30: 6e 63 74 69 6f 6e 20 65 6e 73 75 72 65 73 20 74 nction ensures t
4c40: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 hat the caller h
4c50: 61 73 20 6f 62 74 61 69 6e 65 64 20 61 6e 20 65 as obtained an e
4c60: 78 63 6c 75 73 69 76 65 20 0a 2a 2a 20 73 68 61 xclusive .** sha
4c70: 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 2d red-cache table-
4c80: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 25 5f 73 65 lock on the %_se
4c90: 67 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73 gdir table. This
4ca0: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 is required bef
4cb0: 6f 72 65 20 0a 2a 2a 20 77 72 69 74 69 6e 67 20 ore .** writing
4cc0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 74 73 33 data to the fts3
4cd0: 20 74 61 62 6c 65 2e 20 49 66 20 74 68 69 73 20 table. If this
4ce0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 61 63 71 75 lock is not acqu
4cf0: 69 72 65 64 20 66 69 72 73 74 2c 20 74 68 65 6e ired first, then
4d00: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 6d .** the caller m
4d10: 61 79 20 65 6e 64 20 75 70 20 61 74 74 65 6d 70 ay end up attemp
4d20: 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 69 ting to take thi
4d30: 73 20 6c 6f 63 6b 20 61 73 20 70 61 72 74 20 6f s lock as part o
4d40: 66 20 63 6f 6d 6d 69 74 74 69 6e 67 0a 2a 2a 20 f committing.**
4d50: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 a transaction, c
4d60: 61 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f ausing SQLite to
4d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c return SQLITE_L
4d80: 4f 43 4b 45 44 20 6f 72 20 0a 2a 2a 20 4c 4f 43 OCKED or .** LOC
4d90: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 74 KED_SHAREDCACHEt
4da0: 6f 20 61 20 43 4f 4d 4d 49 54 20 63 6f 6d 6d 61 o a COMMIT comma
4db0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 nd..**.** It is
4dc0: 62 65 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 best to avoid th
4dd0: 69 73 20 62 65 63 61 75 73 65 20 69 66 20 46 54 is because if FT
4de0: 53 33 20 72 65 74 75 72 6e 73 20 61 6e 79 20 65 S3 returns any e
4df0: 72 72 6f 72 20 77 68 65 6e 20 0a 2a 2a 20 63 6f rror when .** co
4e00: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 mmitting a trans
4e10: 61 63 74 69 6f 6e 2c 20 74 68 65 20 77 68 6f 6c action, the whol
4e20: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 e transaction wi
4e30: 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 ll be rolled bac
4e40: 6b 2e 20 0a 2a 2a 20 41 6e 64 20 74 68 69 73 20 k. .** And this
4e50: 69 73 20 6e 6f 74 20 77 68 61 74 20 75 73 65 72 is not what user
4e60: 73 20 65 78 70 65 63 74 20 77 68 65 6e 20 74 68 s expect when th
4e70: 65 79 20 67 65 74 20 53 51 4c 49 54 45 5f 4c 4f ey get SQLITE_LO
4e80: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 CKED_SHAREDCACHE
4e90: 2e 20 0a 2a 2a 20 49 74 20 63 61 6e 20 73 74 69 . .** It can sti
4ea0: 6c 6c 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 ll happen if the
4eb0: 20 75 73 65 72 20 6c 6f 63 6b 73 20 74 68 65 20 user locks the
4ec0: 75 6e 64 65 72 6c 79 69 6e 67 20 74 61 62 6c 65 underlying table
4ed0: 73 20 64 69 72 65 63 74 6c 79 20 0a 2a 2a 20 69 s directly .** i
4ee0: 6e 73 74 65 61 64 20 6f 66 20 61 63 63 65 73 73 nstead of access
4ef0: 69 6e 67 20 74 68 65 6d 20 76 69 61 20 46 54 53 ing them via FTS
4f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
4f10: 66 74 73 33 57 72 69 74 65 6c 6f 63 6b 28 46 74 fts3Writelock(Ft
4f20: 73 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 s3Table *p){. i
4f30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
4f40: 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 2d 3e 6e K;. . if( p->n
4f50: 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 PendingData==0 )
4f60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 {. sqlite3_st
4f70: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72 mt *pStmt;. r
4f80: 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 28 c = fts3SqlStmt(
4f90: 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 53 45 p, SQL_DELETE_SE
4fa0: 47 44 49 52 5f 4c 45 56 45 4c 2c 20 26 70 53 74 GDIR_LEVEL, &pSt
4fb0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 mt, 0);. if(
4fc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
4fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 . sqlite3_b
4fe0: 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 ind_null(pStmt,
4ff0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 1);. sqlite
5000: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 3_step(pStmt);.
5010: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
5020: 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 3_reset(pStmt);.
5030: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 }. }.. ret
5040: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
5050: 20 46 54 53 20 6d 61 69 6e 74 61 69 6e 73 20 61 FTS maintains a
5060: 20 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 65 separate indexe
5070: 73 20 66 6f 72 20 65 61 63 68 20 6c 61 6e 67 75 s for each langu
5080: 61 67 65 2d 69 64 20 28 61 20 33 32 2d 62 69 74 age-id (a 32-bit
5090: 20 69 6e 74 65 67 65 72 29 2e 0a 2a 2a 20 57 69 integer)..** Wi
50a0: 74 68 69 6e 20 65 61 63 68 20 6c 61 6e 67 75 61 thin each langua
50b0: 67 65 20 69 64 2c 20 61 20 73 65 70 61 72 61 74 ge id, a separat
50c0: 65 20 69 6e 64 65 78 20 69 73 20 6d 61 69 6e 74 e index is maint
50d0: 61 69 6e 65 64 20 74 6f 20 73 74 6f 72 65 20 74 ained to store t
50e0: 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 74 he.** document t
50f0: 65 72 6d 73 2c 20 61 6e 64 20 65 61 63 68 20 63 erms, and each c
5100: 6f 6e 66 69 67 75 72 65 64 20 70 72 65 66 69 78 onfigured prefix
5110: 20 73 69 7a 65 20 28 63 6f 6e 66 69 67 75 72 65 size (configure
5120: 64 20 74 68 65 20 46 54 53 20 0a 2a 2a 20 22 70 d the FTS .** "p
5130: 72 65 66 69 78 3d 22 20 6f 70 74 69 6f 6e 29 2e refix=" option).
5140: 20 41 6e 64 20 65 61 63 68 20 69 6e 64 65 78 20 And each index
5150: 63 6f 6e 73 69 73 74 73 20 6f 66 20 6d 75 6c 74 consists of mult
5160: 69 70 6c 65 20 6c 65 76 65 6c 73 20 28 22 72 65 iple levels ("re
5170: 6c 61 74 69 76 65 0a 2a 2a 20 6c 65 76 65 6c 73 lative.** levels
5180: 22 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 ")..**.** All th
5190: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 6c ree of these val
51a0: 75 65 73 20 28 74 68 65 20 6c 61 6e 67 75 61 67 ues (the languag
51b0: 65 20 69 64 2c 20 74 68 65 20 73 70 65 63 69 66 e id, the specif
51c0: 69 63 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 ic index and the
51d0: 0a 2a 2a 20 6c 65 76 65 6c 20 77 69 74 68 69 6e .** level within
51e0: 20 74 68 65 20 69 6e 64 65 78 29 20 61 72 65 20 the index) are
51f0: 65 6e 63 6f 64 65 64 20 69 6e 20 36 34 2d 62 69 encoded in 64-bi
5200: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 t integer values
5210: 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 stored.** in th
5220: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 e %_segdir table
5230: 20 6f 6e 20 64 69 73 6b 2e 20 54 68 69 73 20 66 on disk. This f
5240: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 unction is used
5250: 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 72 65 65 to convert three
5260: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 63 6f 6d .** separate com
5270: 70 6f 6e 65 6e 74 20 76 61 6c 75 65 73 20 69 6e ponent values in
5280: 74 6f 20 74 68 65 20 73 69 6e 67 6c 65 20 36 34 to the single 64
5290: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c -bit integer val
52a0: 75 65 20 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 ue that.** can b
52b0: 65 20 75 73 65 64 20 74 6f 20 71 75 65 72 79 20 e used to query
52c0: 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 the %_segdir tab
52d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 le..**.** Specif
52e0: 69 63 61 6c 6c 79 2c 20 65 61 63 68 20 6c 61 6e ically, each lan
52f0: 67 75 61 67 65 2d 69 64 2f 69 6e 64 65 78 20 63 guage-id/index c
5300: 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 61 6c ombination is al
5310: 6c 6f 63 61 74 65 64 20 31 30 32 34 20 0a 2a 2a located 1024 .**
5320: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 64-bit integer
5330: 6c 65 76 65 6c 20 76 61 6c 75 65 73 20 28 22 61 level values ("a
5340: 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 73 22 29 bsolute levels")
5350: 2e 20 54 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 . The main terms
5360: 20 69 6e 64 65 78 0a 2a 2a 20 66 6f 72 20 6c 61 index.** for la
5370: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61 nguage-id 0 is a
5380: 6c 6c 6f 63 61 74 65 20 76 61 6c 75 65 73 20 30 llocate values 0
5390: 2d 31 30 32 33 2e 20 54 68 65 20 66 69 72 73 74 -1023. The first
53a0: 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 2a 2a prefix index.**
53b0: 20 28 69 66 20 61 6e 79 29 20 66 6f 72 20 6c 61 (if any) for la
53c0: 6e 67 75 61 67 65 2d 69 64 20 30 20 69 73 20 61 nguage-id 0 is a
53d0: 6c 6c 6f 63 61 74 65 64 20 76 61 6c 75 65 73 20 llocated values
53e0: 31 30 32 34 2d 32 30 34 37 2e 20 41 6e 64 20 73 1024-2047. And s
53f0: 6f 20 6f 6e 2e 0a 2a 2a 20 4c 61 6e 67 75 61 67 o on..** Languag
5400: 65 20 31 20 69 6e 64 65 78 65 73 20 61 72 65 20 e 1 indexes are
5410: 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 allocated immedi
5420: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 ately following
5430: 6c 61 6e 67 75 61 67 65 20 30 2e 0a 2a 2a 0a 2a language 0..**.*
5440: 2a 20 53 6f 2c 20 66 6f 72 20 61 20 73 79 73 74 * So, for a syst
5450: 65 6d 20 77 69 74 68 20 6e 50 72 65 66 69 78 20 em with nPrefix
5460: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 63 prefix indexes c
5470: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 65 20 62 onfigured, the b
5480: 6c 6f 63 6b 20 6f 66 0a 2a 2a 20 61 62 73 6f 6c lock of.** absol
5490: 75 74 65 20 6c 65 76 65 6c 73 20 74 68 61 74 20 ute levels that
54a0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 6c corresponds to l
54b0: 61 6e 67 75 61 67 65 2d 69 64 20 69 4c 61 6e 67 anguage-id iLang
54c0: 69 64 20 61 6e 64 20 69 6e 64 65 78 20 0a 2a 2a id and index .**
54d0: 20 69 49 6e 64 65 78 20 73 74 61 72 74 73 20 61 iIndex starts a
54e0: 74 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c t absolute level
54f0: 20 28 28 69 4c 61 6e 67 69 64 20 2a 20 28 6e 50 ((iLangid * (nP
5500: 72 65 66 69 78 2b 31 29 20 2b 20 69 49 6e 64 65 refix+1) + iInde
5510: 78 29 20 2a 20 31 30 32 34 29 2e 0a 2a 2f 0a 73 x) * 1024)..*/.s
5520: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e tatic sqlite3_in
5530: 74 36 34 20 67 65 74 41 62 73 6f 6c 75 74 65 4c t64 getAbsoluteL
5540: 65 76 65 6c 28 0a 20 20 46 74 73 33 54 61 62 6c evel(. Fts3Tabl
5550: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 e *p,
5560: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 /* FTS3
5570: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a table handle */.
5580: 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 int iLangid,
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
55a0: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 /* Language id
55b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 */. int iIndex
55c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
55d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 /* Index i
55e0: 6e 20 70 2d 3e 61 49 6e 64 65 78 5b 5d 20 2a 2f n p->aIndex[] */
55f0: 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 20 20 . int iLevel
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5610: 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 73 /* Level of s
5620: 65 67 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 egments */.){.
5630: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 sqlite3_int64 iB
5640: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 ase;
5650: 2f 2a 20 46 69 72 73 74 20 61 62 73 6f 6c 75 74 /* First absolut
5660: 65 20 6c 65 76 65 6c 20 66 6f 72 20 69 4c 61 6e e level for iLan
5670: 67 69 64 2f 69 49 6e 64 65 78 20 2a 2f 0a 20 20 gid/iIndex */.
5680: 61 73 73 65 72 74 28 20 69 4c 61 6e 67 69 64 3e assert( iLangid>
5690: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
56a0: 70 2d 3e 6e 49 6e 64 65 78 3e 30 20 29 3b 0a 20 p->nIndex>0 );.
56b0: 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 3e assert( iIndex>
56c0: 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 2d 3e =0 && iIndex<p->
56d0: 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 69 42 61 nIndex );.. iBa
56e0: 73 65 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 se = ((sqlite3_i
56f0: 6e 74 36 34 29 69 4c 61 6e 67 69 64 20 2a 20 70 nt64)iLangid * p
5700: 2d 3e 6e 49 6e 64 65 78 20 2b 20 69 49 6e 64 65 ->nIndex + iInde
5710: 78 29 20 2a 20 46 54 53 33 5f 53 45 47 44 49 52 x) * FTS3_SEGDIR
5720: 5f 4d 41 58 4c 45 56 45 4c 3b 0a 20 20 72 65 74 _MAXLEVEL;. ret
5730: 75 72 6e 20 69 42 61 73 65 20 2b 20 69 4c 65 76 urn iBase + iLev
5740: 65 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 el;.}../*.** Set
5750: 20 2a 70 70 53 74 6d 74 20 74 6f 20 61 20 73 74 *ppStmt to a st
5760: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 20 74 atement handle t
5770: 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 hat may be used
5780: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 to iterate throu
5790: 67 68 0a 2a 2a 20 61 6c 6c 20 72 6f 77 73 20 69 gh.** all rows i
57a0: 6e 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 74 n the %_segdir t
57b0: 61 62 6c 65 2c 20 66 72 6f 6d 20 6f 6c 64 65 73 able, from oldes
57c0: 74 20 74 6f 20 6e 65 77 65 73 74 2e 20 49 66 20 t to newest. If
57d0: 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 successful,.** r
57e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e eturn SQLITE_OK.
57f0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 If an error occ
5800: 75 72 73 20 77 68 69 6c 65 20 70 72 65 70 61 72 urs while prepar
5810: 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e ing the statemen
5820: 74 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e t, .** return an
5830: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f SQLite error co
5840: 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 de..**.** There
5850: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 is only ever one
5860: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 instance of thi
5870: 73 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 s SQL statement
5880: 63 6f 6d 70 69 6c 65 64 20 66 6f 72 0a 2a 2a 20 compiled for.**
5890: 65 61 63 68 20 46 54 53 33 20 74 61 62 6c 65 2e each FTS3 table.
58a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 .**.** The state
58b0: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65 ment returns the
58c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6c 75 6d following colum
58d0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 ns from the %_se
58e0: 67 64 69 72 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a gdir table:.**.*
58f0: 2a 20 20 20 30 3a 20 69 64 78 0a 2a 2a 20 20 20 * 0: idx.**
5900: 31 3a 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 1: start_block.*
5910: 2a 20 20 20 32 3a 20 6c 65 61 76 65 73 5f 65 6e * 2: leaves_en
5920: 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 33 3a 20 d_block.** 3:
5930: 65 6e 64 5f 62 6c 6f 63 6b 0a 2a 2a 20 20 20 34 end_block.** 4
5940: 3a 20 72 6f 6f 74 0a 2a 2f 0a 69 6e 74 20 73 71 : root.*/.int sq
5950: 6c 69 74 65 33 46 74 73 33 41 6c 6c 53 65 67 64 lite3Fts3AllSegd
5960: 69 72 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65 irs(. Fts3Table
5970: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *p,
5980: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 /* FTS3 t
5990: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c able */. int iL
59a0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 angid,
59b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e /* Lan
59c0: 67 75 61 67 65 20 62 65 69 6e 67 20 71 75 65 72 guage being quer
59d0: 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e ied */. int iIn
59e0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 dex,
59f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 /* Inde
5a00: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 5b x for p->aIndex[
5a10: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 ] */. int iLeve
5a20: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 l,
5a30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 /* Level
5a40: 74 6f 20 73 65 6c 65 63 74 20 28 72 65 6c 61 74 to select (relat
5a50: 69 76 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 20 ive level) */.
5a60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 sqlite3_stmt **p
5a70: 70 53 74 6d 74 20 20 20 20 20 20 20 20 20 20 20 pStmt
5a80: 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64 /* OUT: Compiled
5a90: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b statement */.){
5aa0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c . int rc;. sql
5ab0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 ite3_stmt *pStmt
5ac0: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 = 0;.. assert(
5ad0: 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 iLevel==FTS3_SE
5ae0: 47 43 55 52 53 4f 52 5f 41 4c 4c 20 7c 7c 20 69 GCURSOR_ALL || i
5af0: 4c 65 76 65 6c 3e 3d 30 20 29 3b 0a 20 20 61 73 Level>=0 );. as
5b00: 73 65 72 74 28 20 69 4c 65 76 65 6c 3c 46 54 53 sert( iLevel<FTS
5b10: 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 3_SEGDIR_MAXLEVE
5b20: 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 L );. assert( i
5b30: 49 6e 64 65 78 3e 3d 30 20 26 26 20 69 49 6e 64 Index>=0 && iInd
5b40: 65 78 3c 70 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a ex<p->nIndex );.
5b50: 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 . if( iLevel<0
5b60: 29 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c 45 43 ){. /* "SELEC
5b70: 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 T * FROM %_segdi
5b80: 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 42 45 r WHERE level BE
5b90: 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 20 4f 52 TWEEN ? AND ? OR
5ba0: 44 45 52 20 42 59 20 2e 2e 2e 22 20 2a 2f 0a 20 DER BY ..." */.
5bb0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 rc = fts3SqlS
5bc0: 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 tmt(p, SQL_SELEC
5bd0: 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 2c 20 26 T_LEVEL_RANGE, &
5be0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 pStmt, 0);. i
5bf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
5c00: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 ){ . sqlit
5c10: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 e3_bind_int64(pS
5c20: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c tmt, 1, getAbsol
5c30: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e uteLevel(p, iLan
5c40: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 29 gid, iIndex, 0))
5c50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
5c60: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 bind_int64(pStmt
5c70: 2c 20 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 , 2, .
5c80: 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c getAbsoluteLevel
5c90: 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e (p, iLangid, iIn
5ca0: 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52 dex, FTS3_SEGDIR
5cb0: 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 _MAXLEVEL-1).
5cc0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 );. }. }e
5cd0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 22 53 45 4c lse{. /* "SEL
5ce0: 45 43 54 20 2a 20 46 52 4f 4d 20 25 5f 73 65 67 ECT * FROM %_seg
5cf0: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 dir WHERE level
5d00: 3d 20 3f 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e = ? ORDER BY ...
5d10: 22 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 " */. rc = ft
5d20: 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c s3SqlStmt(p, SQL
5d30: 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c 2c 20 26 _SELECT_LEVEL, &
5d40: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 pStmt, 0);. i
5d50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
5d60: 20 29 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 ){ . sqlit
5d70: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 e3_bind_int64(pS
5d80: 74 6d 74 2c 20 31 2c 20 67 65 74 41 62 73 6f 6c tmt, 1, getAbsol
5d90: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e uteLevel(p, iLan
5da0: 67 69 64 2c 20 69 49 6e 64 65 78 2c 69 4c 65 76 gid, iIndex,iLev
5db0: 65 6c 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a el));. }. }.
5dc0: 20 20 2a 70 70 53 74 6d 74 20 3d 20 70 53 74 6d *ppStmt = pStm
5dd0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a t;. return rc;.
5de0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 }.../*.** Append
5df0: 20 61 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 a single varint
5e00: 20 74 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 to a PendingLis
5e10: 74 20 62 75 66 66 65 72 2e 20 53 51 4c 49 54 45 t buffer. SQLITE
5e20: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a _OK is returned.
5e30: 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c ** if successful
5e40: 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 , or an SQLite e
5e50: 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 rror code otherw
5e60: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 ise..**.** This
5e70: 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 73 65 function also se
5e80: 72 76 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 rves to allocate
5e90: 20 74 68 65 20 50 65 6e 64 69 6e 67 4c 69 73 74 the PendingList
5ea0: 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c structure itsel
5eb0: 66 2e 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c f..** For exampl
5ec0: 65 2c 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e e, to create a n
5ed0: 65 77 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 73 ew PendingList s
5ee0: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e tructure contain
5ef0: 69 6e 67 20 74 77 6f 0a 2a 2a 20 76 61 72 69 6e ing two.** varin
5f00: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 65 6e 64 ts:.**.** Pend
5f10: 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 30 3b 0a ingList *p = 0;.
5f20: 2a 2a 20 20 20 66 74 73 33 50 65 6e 64 69 6e 67 ** fts3Pending
5f30: 4c 69 73 74 41 70 70 65 6e 64 56 61 72 69 6e 74 ListAppendVarint
5f40: 28 26 70 2c 20 31 29 3b 0a 2a 2a 20 20 20 66 74 (&p, 1);.** ft
5f50: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 s3PendingListApp
5f60: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 32 29 endVarint(&p, 2)
5f70: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ;.*/.static int
5f80: 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 fts3PendingListA
5f90: 70 70 65 6e 64 56 61 72 69 6e 74 28 0a 20 20 50 ppendVarint(. P
5fa0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 2a 70 70 2c endingList **pp,
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
5fc0: 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 * IN/OUT: Pointe
5fd0: 72 20 74 6f 20 50 65 6e 64 69 6e 67 4c 69 73 74 r to PendingList
5fe0: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 73 71 6c struct */. sql
5ff0: 69 74 65 33 5f 69 6e 74 36 34 20 69 20 20 20 20 ite3_int64 i
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
6010: 56 61 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20 Value to append
6020: 74 6f 20 64 61 74 61 20 2a 2f 0a 29 7b 0a 20 20 to data */.){.
6030: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d PendingList *p =
6040: 20 2a 70 70 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f *pp;.. /* Allo
6050: 63 61 74 65 20 6f 72 20 67 72 6f 77 20 74 68 65 cate or grow the
6060: 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 61 73 20 PendingList as
6070: 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 required. */. i
6080: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 70 20 3d f( !p ){. p =
6090: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 sqlite3_malloc(
60a0: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 31 30 30 sizeof(*p) + 100
60b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 7b );. if( !p ){
60c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
60d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 LITE_NOMEM;.
60e0: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20 }. p->nSpace
60f0: 3d 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 61 44 = 100;. p->aD
6100: 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 70 ata = (char *)&p
6110: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 6e 44 61 74 [1];. p->nDat
6120: 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 a = 0;. }. els
6130: 65 20 69 66 28 20 70 2d 3e 6e 44 61 74 61 2b 46 e if( p->nData+F
6140: 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2b 31 TS3_VARINT_MAX+1
6150: 3e 70 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20 20 >p->nSpace ){.
6160: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 2d 3e int nNew = p->
6170: 6e 53 70 61 63 65 20 2a 20 32 3b 0a 20 20 20 20 nSpace * 2;.
6180: 70 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c p = sqlite3_real
6190: 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 2a 70 loc(p, sizeof(*p
61a0: 29 20 2b 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 ) + nNew);. i
61b0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 20 20 73 f( !p ){. s
61c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 29 qlite3_free(*pp)
61d0: 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 30 3b ;. *pp = 0;
61e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
61f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 LITE_NOMEM;.
6200: 7d 0a 20 20 20 20 70 2d 3e 6e 53 70 61 63 65 20 }. p->nSpace
6210: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61 = nNew;. p->a
6220: 44 61 74 61 20 3d 20 28 63 68 61 72 20 2a 29 26 Data = (char *)&
6230: 70 5b 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 p[1];. }.. /*
6240: 41 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 Append the new s
6250: 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 erialized varint
6260: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 to the end of t
6270: 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 2d he list. */. p-
6280: 3e 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 >nData += sqlite
6290: 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 3Fts3PutVarint(&
62a0: 70 2d 3e 61 44 61 74 61 5b 70 2d 3e 6e 44 61 74 p->aData[p->nDat
62b0: 61 5d 2c 20 69 29 3b 0a 20 20 70 2d 3e 61 44 61 a], i);. p->aDa
62c0: 74 61 5b 70 2d 3e 6e 44 61 74 61 5d 20 3d 20 27 ta[p->nData] = '
62d0: 5c 30 27 3b 0a 20 20 2a 70 70 20 3d 20 70 3b 0a \0';. *pp = p;.
62e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
62f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 OK;.}../*.** Add
6300: 20 61 20 64 6f 63 69 64 2f 63 6f 6c 75 6d 6e 2f a docid/column/
6310: 70 6f 73 69 74 69 6f 6e 20 65 6e 74 72 79 20 74 position entry t
6320: 6f 20 61 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 o a PendingList
6330: 73 74 72 75 63 74 75 72 65 2e 20 4e 6f 6e 2d 7a structure. Non-z
6340: 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e ero.** is return
6350: 65 64 20 69 66 20 74 68 65 20 73 74 72 75 63 74 ed if the struct
6360: 75 72 65 20 69 73 20 73 71 6c 69 74 65 33 5f 72 ure is sqlite3_r
6370: 65 61 6c 6c 6f 63 65 64 20 61 73 20 70 61 72 74 ealloced as part
6380: 20 6f 66 20 61 64 64 69 6e 67 0a 2a 2a 20 74 68 of adding.** th
6390: 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 e entry. Otherwi
63a0: 73 65 2c 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 se, zero..**.**
63b0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 If an OOM error
63c0: 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20 occurs, *pRc is
63d0: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f set to SQLITE_NO
63e0: 4d 45 4d 20 62 65 66 6f 72 65 20 72 65 74 75 72 MEM before retur
63f0: 6e 69 6e 67 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 ning..** Zero is
6400: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 65 64 always returned
6410: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 4f in this case. O
6420: 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 therwise, if no
6430: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 OOM error occurs
6440: 2c 0a 2a 2a 20 69 74 20 69 73 20 73 65 74 20 74 ,.** it is set t
6450: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a o SQLITE_OK..*/.
6460: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 50 static int fts3P
6470: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 endingListAppend
6480: 28 0a 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 (. PendingList
6490: 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 **pp,
64a0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 /* IN/OUT: P
64b0: 65 6e 64 69 6e 67 4c 69 73 74 20 73 74 72 75 63 endingList struc
64c0: 74 75 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 ture */. sqlite
64d0: 33 5f 69 6e 74 36 34 20 69 44 6f 63 69 64 2c 20 3_int64 iDocid,
64e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 /* Doc
64f0: 69 64 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20 id for entry to
6500: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 add */. sqlite3
6510: 5f 69 6e 74 36 34 20 69 43 6f 6c 2c 20 20 20 20 _int64 iCol,
6520: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 /* Colu
6530: 6d 6e 20 66 6f 72 20 65 6e 74 72 79 20 74 6f 20 mn for entry to
6540: 61 64 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 add */. sqlite3
6550: 5f 69 6e 74 36 34 20 69 50 6f 73 2c 20 20 20 20 _int64 iPos,
6560: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 /* Posi
6570: 74 69 6f 6e 20 6f 66 20 74 65 72 6d 20 66 6f 72 tion of term for
6580: 20 65 6e 74 72 79 20 74 6f 20 61 64 64 20 2a 2f entry to add */
6590: 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 . int *pRc
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
65b0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 /* OUT: Retur
65c0: 6e 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 50 n code */.){. P
65d0: 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 20 3d 20 endingList *p =
65e0: 2a 70 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 *pp;. int rc =
65f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 SQLITE_OK;.. as
6600: 73 65 72 74 28 20 21 70 20 7c 7c 20 70 2d 3e 69 sert( !p || p->i
6610: 4c 61 73 74 44 6f 63 69 64 3c 3d 69 44 6f 63 69 LastDocid<=iDoci
6620: 64 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 20 7c d );.. if( !p |
6630: 7c 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 64 21 | p->iLastDocid!
6640: 3d 69 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 73 =iDocid ){. s
6650: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 44 65 qlite3_int64 iDe
6660: 6c 74 61 20 3d 20 69 44 6f 63 69 64 20 2d 20 28 lta = iDocid - (
6670: 70 20 3f 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 p ? p->iLastDoci
6680: 64 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 d : 0);. if(
6690: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 p ){. asser
66a0: 74 28 20 70 2d 3e 6e 44 61 74 61 3c 70 2d 3e 6e t( p->nData<p->n
66b0: 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 61 Space );. a
66c0: 73 73 65 72 74 28 20 70 2d 3e 61 44 61 74 61 5b ssert( p->aData[
66d0: 70 2d 3e 6e 44 61 74 61 5d 3d 3d 30 20 29 3b 0a p->nData]==0 );.
66e0: 20 20 20 20 20 20 70 2d 3e 6e 44 61 74 61 2b 2b p->nData++
66f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
6700: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d SQLITE_OK!=(rc =
6710: 20 66 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 fts3PendingList
6720: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2c AppendVarint(&p,
6730: 20 69 44 65 6c 74 61 29 29 20 29 7b 0a 20 20 20 iDelta)) ){.
6740: 20 20 20 67 6f 74 6f 20 70 65 6e 64 69 6e 67 6c goto pendingl
6750: 69 73 74 61 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 istappend_out;.
6760: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 4c 61 73 }. p->iLas
6770: 74 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 70 tCol = -1;. p
6780: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a ->iLastPos = 0;.
6790: 20 20 20 20 70 2d 3e 69 4c 61 73 74 44 6f 63 69 p->iLastDoci
67a0: 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 7d 0a d = iDocid;. }.
67b0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 26 26 20 if( iCol>0 &&
67c0: 70 2d 3e 69 4c 61 73 74 43 6f 6c 21 3d 69 43 6f p->iLastCol!=iCo
67d0: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c l ){. if( SQL
67e0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 ITE_OK!=(rc = ft
67f0: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 s3PendingListApp
6800: 65 6e 64 56 61 72 69 6e 74 28 26 70 2c 20 31 29 endVarint(&p, 1)
6810: 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 ). || SQLITE
6820: 5f 4f 4b 21 3d 28 72 63 20 3d 20 66 74 73 33 50 _OK!=(rc = fts3P
6830: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 endingListAppend
6840: 56 61 72 69 6e 74 28 26 70 2c 20 69 43 6f 6c 29 Varint(&p, iCol)
6850: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 ). ){. g
6860: 6f 74 6f 20 70 65 6e 64 69 6e 67 6c 69 73 74 61 oto pendinglista
6870: 70 70 65 6e 64 5f 6f 75 74 3b 0a 20 20 20 20 7d ppend_out;. }
6880: 0a 20 20 20 20 70 2d 3e 69 4c 61 73 74 43 6f 6c . p->iLastCol
6890: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e = iCol;. p->
68a0: 69 4c 61 73 74 50 6f 73 20 3d 20 30 3b 0a 20 20 iLastPos = 0;.
68b0: 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 }. if( iCol>=0
68c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 ){. assert( i
68d0: 50 6f 73 3e 70 2d 3e 69 4c 61 73 74 50 6f 73 20 Pos>p->iLastPos
68e0: 7c 7c 20 28 69 50 6f 73 3d 3d 30 20 26 26 20 70 || (iPos==0 && p
68f0: 2d 3e 69 4c 61 73 74 50 6f 73 3d 3d 30 29 20 29 ->iLastPos==0) )
6900: 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 ;. rc = fts3P
6910: 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 endingListAppend
6920: 56 61 72 69 6e 74 28 26 70 2c 20 32 2b 69 50 6f Varint(&p, 2+iPo
6930: 73 2d 70 2d 3e 69 4c 61 73 74 50 6f 73 29 3b 0a s-p->iLastPos);.
6940: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
6950: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 TE_OK ){. p
6960: 2d 3e 69 4c 61 73 74 50 6f 73 20 3d 20 69 50 6f ->iLastPos = iPo
6970: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 70 s;. }. }.. p
6980: 65 6e 64 69 6e 67 6c 69 73 74 61 70 70 65 6e 64 endinglistappend
6990: 5f 6f 75 74 3a 0a 20 20 2a 70 52 63 20 3d 20 72 _out:. *pRc = r
69a0: 63 3b 0a 20 20 69 66 28 20 70 21 3d 2a 70 70 20 c;. if( p!=*pp
69b0: 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 3b 0a ){. *pp = p;.
69c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
69d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a }. return 0;.}.
69e0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 50 65 ./*.** Free a Pe
69f0: 6e 64 69 6e 67 4c 69 73 74 20 6f 62 6a 65 63 74 ndingList object
6a00: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 allocated by ft
6a10: 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 41 70 70 s3PendingListApp
6a20: 65 6e 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 end()..*/.static
6a30: 20 76 6f 69 64 20 66 74 73 33 50 65 6e 64 69 6e void fts3Pendin
6a40: 67 4c 69 73 74 44 65 6c 65 74 65 28 50 65 6e 64 gListDelete(Pend
6a50: 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b ingList *pList){
6a60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 . sqlite3_free(
6a70: 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a pList);.}../*.**
6a80: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f Add an entry to
6a90: 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 65 6e 64 one of the pend
6aa0: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 ing-terms hash t
6ab0: 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 ables..*/.static
6ac0: 20 69 6e 74 20 66 74 73 33 50 65 6e 64 69 6e 67 int fts3Pending
6ad0: 54 65 72 6d 73 41 64 64 4f 6e 65 28 0a 20 20 46 TermsAddOne(. F
6ae0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 0a 20 20 69 ts3Table *p,. i
6af0: 6e 74 20 69 43 6f 6c 2c 0a 20 20 69 6e 74 20 69 nt iCol,. int i
6b00: 50 6f 73 2c 0a 20 20 46 74 73 33 48 61 73 68 20 Pos,. Fts3Hash
6b10: 2a 70 48 61 73 68 2c 20 20 20 20 20 20 20 20 20 *pHash,
6b20: 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e /* Pendin
6b30: 67 20 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 g terms hash tab
6b40: 6c 65 20 74 6f 20 61 64 64 20 65 6e 74 72 79 20 le to add entry
6b50: 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 to */. const ch
6b60: 61 72 20 2a 7a 54 6f 6b 65 6e 2c 0a 20 20 69 6e ar *zToken,. in
6b70: 74 20 6e 54 6f 6b 65 6e 0a 29 7b 0a 20 20 50 65 t nToken.){. Pe
6b80: 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 73 74 ndingList *pList
6b90: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c ;. int rc = SQL
6ba0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 4c 69 73 74 ITE_OK;.. pList
6bb0: 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 74 20 = (PendingList
6bc0: 2a 29 66 74 73 33 48 61 73 68 46 69 6e 64 28 70 *)fts3HashFind(p
6bd0: 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 Hash, zToken, nT
6be0: 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 4c 69 oken);. if( pLi
6bf0: 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 50 65 st ){. p->nPe
6c00: 6e 64 69 6e 67 44 61 74 61 20 2d 3d 20 28 70 4c ndingData -= (pL
6c10: 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 6e 54 6f ist->nData + nTo
6c20: 6b 65 6e 20 2b 20 73 69 7a 65 6f 66 28 46 74 73 ken + sizeof(Fts
6c30: 33 48 61 73 68 45 6c 65 6d 29 29 3b 0a 20 20 7d 3HashElem));. }
6c40: 0a 20 20 69 66 28 20 66 74 73 33 50 65 6e 64 69 . if( fts3Pendi
6c50: 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 4c ngListAppend(&pL
6c60: 69 73 74 2c 20 70 2d 3e 69 50 72 65 76 44 6f 63 ist, p->iPrevDoc
6c70: 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 id, iCol, iPos,
6c80: 26 72 63 29 20 29 7b 0a 20 20 20 20 69 66 28 20 &rc) ){. if(
6c90: 70 4c 69 73 74 3d 3d 66 74 73 33 48 61 73 68 49 pList==fts3HashI
6ca0: 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a 54 6f nsert(pHash, zTo
6cb0: 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 4c 69 ken, nToken, pLi
6cc0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 st) ){. /*
6cd0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 77 68 Malloc failed wh
6ce0: 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68 ile inserting th
6cf0: 65 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 69 e new entry. Thi
6d00: 73 20 63 61 6e 20 6f 6e 6c 79 20 0a 20 20 20 20 s can only .
6d10: 20 20 2a 2a 20 68 61 70 70 65 6e 20 69 66 20 74 ** happen if t
6d20: 68 65 72 65 20 77 61 73 20 6e 6f 20 70 72 65 76 here was no prev
6d30: 69 6f 75 73 20 65 6e 74 72 79 20 66 6f 72 20 74 ious entry for t
6d40: 68 69 73 20 74 6f 6b 65 6e 2e 0a 20 20 20 20 20 his token..
6d50: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 */. assert
6d60: 28 20 30 3d 3d 66 74 73 33 48 61 73 68 46 69 6e ( 0==fts3HashFin
6d70: 64 28 70 48 61 73 68 2c 20 7a 54 6f 6b 65 6e 2c d(pHash, zToken,
6d80: 20 6e 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 nToken) );.
6d90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
6da0: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72 63 20 List);. rc
6db0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a = SQLITE_NOMEM;.
6dc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 }. }. if(
6dd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
6de0: 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 . p->nPending
6df0: 44 61 74 61 20 2b 3d 20 28 70 4c 69 73 74 2d 3e Data += (pList->
6e00: 6e 44 61 74 61 20 2b 20 6e 54 6f 6b 65 6e 20 2b nData + nToken +
6e10: 20 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 68 sizeof(Fts3Hash
6e20: 45 6c 65 6d 29 29 3b 0a 20 20 7d 0a 20 20 72 65 Elem));. }. re
6e30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
6e40: 2a 20 54 6f 6b 65 6e 69 7a 65 20 74 68 65 20 6e * Tokenize the n
6e50: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 ul-terminated st
6e60: 72 69 6e 67 20 7a 54 65 78 74 20 61 6e 64 20 61 ring zText and a
6e70: 64 64 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 74 6f dd all tokens to
6e80: 20 74 68 65 0a 2a 2a 20 70 65 6e 64 69 6e 67 2d the.** pending-
6e90: 74 65 72 6d 73 20 68 61 73 68 2d 74 61 62 6c 65 terms hash-table
6ea0: 2e 20 54 68 65 20 64 6f 63 69 64 20 75 73 65 64 . The docid used
6eb0: 20 69 73 20 74 68 61 74 20 63 75 72 72 65 6e 74 is that current
6ec0: 6c 79 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 ly stored in.**
6ed0: 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 2c 20 61 p->iPrevDocid, a
6ee0: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 nd the column is
6ef0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 61 72 specified by ar
6f00: 67 75 6d 65 6e 74 20 69 43 6f 6c 2e 0a 2a 2a 0a gument iCol..**.
6f10: 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c ** If successful
6f20: 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 , SQLITE_OK is r
6f30: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 eturned. Otherwi
6f40: 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 se, an SQLite er
6f50: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 ror code..*/.sta
6f60: 74 69 63 20 69 6e 74 20 66 74 73 33 50 65 6e 64 tic int fts3Pend
6f70: 69 6e 67 54 65 72 6d 73 41 64 64 28 0a 20 20 46 ingTermsAdd(. F
6f80: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 ts3Table *p,
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
6fa0: 2a 20 54 61 62 6c 65 20 69 6e 74 6f 20 77 68 69 * Table into whi
6fb0: 63 68 20 74 65 78 74 20 77 69 6c 6c 20 62 65 20 ch text will be
6fc0: 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e inserted */. in
6fd0: 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 20 20 20 t iLangid,
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
6ff0: 20 4c 61 6e 67 75 61 67 65 20 69 64 20 74 6f 20 Language id to
7000: 75 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 use */. const c
7010: 68 61 72 20 2a 7a 54 65 78 74 2c 20 20 20 20 20 har *zText,
7020: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 /* Text
7030: 20 6f 66 20 64 6f 63 75 6d 65 6e 74 20 74 6f 20 of document to
7040: 62 65 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 be inserted */.
7050: 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 int iCol,
7060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7070: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 74 6f 20 /* Column into
7080: 77 68 69 63 68 20 74 65 78 74 20 69 73 20 62 65 which text is be
7090: 69 6e 67 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a ing inserted */.
70a0: 20 20 75 33 32 20 2a 70 6e 57 6f 72 64 20 20 20 u32 *pnWord
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
70c0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 49 6e 63 /* IN/OUT: Inc
70d0: 72 2e 20 62 79 20 6e 75 6d 62 65 72 20 74 6f 6b r. by number tok
70e0: 65 6e 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a ens inserted */.
70f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 ){. int rc;. i
7100: 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 nt iStart = 0;.
7110: 20 69 6e 74 20 69 45 6e 64 20 3d 20 30 3b 0a 20 int iEnd = 0;.
7120: 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20 int iPos = 0;.
7130: 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 30 3b 0a int nWord = 0;.
7140: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a . char const *z
7150: 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 54 6f Token;. int nTo
7160: 6b 65 6e 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 ken = 0;.. sqli
7170: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 te3_tokenizer *p
7180: 54 6f 6b 65 6e 69 7a 65 72 20 3d 20 70 2d 3e 70 Tokenizer = p->p
7190: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71 6c Tokenizer;. sql
71a0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d ite3_tokenizer_m
71b0: 6f 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f odule const *pMo
71c0: 64 75 6c 65 20 3d 20 70 54 6f 6b 65 6e 69 7a 65 dule = pTokenize
71d0: 72 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 73 71 r->pModule;. sq
71e0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f lite3_tokenizer_
71f0: 63 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 cursor *pCsr;.
7200: 69 6e 74 20 28 2a 78 4e 65 78 74 29 28 73 71 6c int (*xNext)(sql
7210: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 ite3_tokenizer_c
7220: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 0a ursor *pCursor,.
7230: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 const char
7240: 2a 2a 2c 69 6e 74 2a 2c 69 6e 74 2a 2c 69 6e 74 **,int*,int*,int
7250: 2a 2c 69 6e 74 2a 29 3b 0a 0a 20 20 61 73 73 65 *,int*);.. asse
7260: 72 74 28 20 70 54 6f 6b 65 6e 69 7a 65 72 20 26 rt( pTokenizer &
7270: 26 20 70 4d 6f 64 75 6c 65 20 29 3b 0a 0a 20 20 & pModule );..
7280: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 /* If the user h
7290: 61 73 20 69 6e 73 65 72 74 65 64 20 61 20 4e 55 as inserted a NU
72a0: 4c 4c 20 76 61 6c 75 65 2c 20 74 68 69 73 20 66 LL value, this f
72b0: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 unction may be c
72c0: 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 alled with. **
72d0: 7a 54 65 78 74 3d 3d 30 2e 20 49 6e 20 74 68 69 zText==0. In thi
72e0: 73 20 63 61 73 65 2c 20 61 64 64 20 7a 65 72 6f s case, add zero
72f0: 20 74 6f 6b 65 6e 20 65 6e 74 72 69 65 73 20 74 token entries t
7300: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 o the hash table
7310: 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 74 75 72 and . ** retur
7320: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69 66 n early. */. if
7330: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 ( zText==0 ){.
7340: 20 20 2a 70 6e 57 6f 72 64 20 3d 20 30 3b 0a 20 *pnWord = 0;.
7350: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
7360: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d _OK;. }.. rc =
7370: 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e sqlite3Fts3Open
7380: 54 6f 6b 65 6e 69 7a 65 72 28 70 54 6f 6b 65 6e Tokenizer(pToken
7390: 69 7a 65 72 2c 20 69 4c 61 6e 67 69 64 2c 20 7a izer, iLangid, z
73a0: 54 65 78 74 2c 20 2d 31 2c 20 26 70 43 73 72 29 Text, -1, &pCsr)
73b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 ;. if( rc!=SQLI
73c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 TE_OK ){. ret
73d0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 78 urn rc;. }.. x
73e0: 4e 65 78 74 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e Next = pModule->
73f0: 78 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28 20 xNext;. while(
7400: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 SQLITE_OK==rc.
7410: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b && SQLITE_OK
7420: 3d 3d 28 72 63 20 3d 20 78 4e 65 78 74 28 70 43 ==(rc = xNext(pC
7430: 73 72 2c 20 26 7a 54 6f 6b 65 6e 2c 20 26 6e 54 sr, &zToken, &nT
7440: 6f 6b 65 6e 2c 20 26 69 53 74 61 72 74 2c 20 26 oken, &iStart, &
7450: 69 45 6e 64 2c 20 26 69 50 6f 73 29 29 0a 20 20 iEnd, &iPos)).
7460: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 ){. int i;.
7470: 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 57 6f 72 if( iPos>=nWor
7480: 64 20 29 20 6e 57 6f 72 64 20 3d 20 69 50 6f 73 d ) nWord = iPos
7490: 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 73 69 +1;.. /* Posi
74a0: 74 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 20 tions cannot be
74b0: 6e 65 67 61 74 69 76 65 3b 20 77 65 20 75 73 65 negative; we use
74c0: 20 2d 31 20 61 73 20 61 20 74 65 72 6d 69 6e 61 -1 as a termina
74d0: 74 6f 72 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a tor internally..
74e0: 20 20 20 20 2a 2a 20 54 6f 6b 65 6e 73 20 6d 75 ** Tokens mu
74f0: 73 74 20 68 61 76 65 20 61 20 6e 6f 6e 2d 7a 65 st have a non-ze
7500: 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a ro length.. *
7510: 2f 0a 20 20 20 20 69 66 28 20 69 50 6f 73 3c 30 /. if( iPos<0
7520: 20 7c 7c 20 21 7a 54 6f 6b 65 6e 20 7c 7c 20 6e || !zToken || n
7530: 54 6f 6b 65 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 Token<=0 ){.
7540: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 rc = SQLITE_ER
7550: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b ROR;. break
7560: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
7570: 41 64 64 20 74 68 65 20 74 65 72 6d 20 74 6f 20 Add the term to
7580: 74 68 65 20 74 65 72 6d 73 20 69 6e 64 65 78 20 the terms index
7590: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 */. rc = fts3
75a0: 50 65 6e 64 69 6e 67 54 65 72 6d 73 41 64 64 4f PendingTermsAddO
75b0: 6e 65 28 0a 20 20 20 20 20 20 20 20 70 2c 20 69 ne(. p, i
75c0: 43 6f 6c 2c 20 69 50 6f 73 2c 20 26 70 2d 3e 61 Col, iPos, &p->a
75d0: 49 6e 64 65 78 5b 30 5d 2e 68 50 65 6e 64 69 6e Index[0].hPendin
75e0: 67 2c 20 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 g, zToken, nToke
75f0: 6e 0a 20 20 20 20 29 3b 0a 20 20 20 20 0a 20 20 n. );. .
7600: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 65 72 /* Add the ter
7610: 6d 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 m to each of the
7620: 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 prefix indexes
7630: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 74 that it is not t
7640: 6f 6f 20 0a 20 20 20 20 2a 2a 20 73 68 6f 72 74 oo . ** short
7650: 20 66 6f 72 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 for. */. for
7660: 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 (i=1; rc==SQLITE
7670: 5f 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 _OK && i<p->nInd
7680: 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 ex; i++){.
7690: 73 74 72 75 63 74 20 46 74 73 33 49 6e 64 65 78 struct Fts3Index
76a0: 20 2a 70 49 6e 64 65 78 20 3d 20 26 70 2d 3e 61 *pIndex = &p->a
76b0: 49 6e 64 65 78 5b 69 5d 3b 0a 20 20 20 20 20 20 Index[i];.
76c0: 69 66 28 20 6e 54 6f 6b 65 6e 3c 70 49 6e 64 65 if( nToken<pInde
76d0: 78 2d 3e 6e 50 72 65 66 69 78 20 29 20 63 6f 6e x->nPrefix ) con
76e0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 63 20 tinue;. rc
76f0: 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 = fts3PendingTer
7700: 6d 73 41 64 64 4f 6e 65 28 0a 20 20 20 20 20 20 msAddOne(.
7710: 20 20 20 20 70 2c 20 69 43 6f 6c 2c 20 69 50 6f p, iCol, iPo
7720: 73 2c 20 26 70 49 6e 64 65 78 2d 3e 68 50 65 6e s, &pIndex->hPen
7730: 64 69 6e 67 2c 20 7a 54 6f 6b 65 6e 2c 20 70 49 ding, zToken, pI
7740: 6e 64 65 78 2d 3e 6e 50 72 65 66 69 78 0a 20 20 ndex->nPrefix.
7750: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d );. }. }
7760: 0a 0a 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c .. pModule->xCl
7770: 6f 73 65 28 70 43 73 72 29 3b 0a 20 20 2a 70 6e ose(pCsr);. *pn
7780: 57 6f 72 64 20 2b 3d 20 6e 57 6f 72 64 3b 0a 20 Word += nWord;.
7790: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c return (rc==SQL
77a0: 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 ITE_DONE ? SQLIT
77b0: 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f E_OK : rc);.}../
77c0: 2a 20 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 * .** Calling th
77d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 64 69 is function indi
77e0: 63 61 74 65 73 20 74 68 61 74 20 73 75 62 73 65 cates that subse
77f0: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 0a quent calls to .
7800: 2a 2a 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 ** fts3PendingTe
7810: 72 6d 73 41 64 64 28 29 20 61 72 65 20 74 6f 20 rmsAdd() are to
7820: 61 64 64 20 74 65 72 6d 2f 70 6f 73 69 74 69 6f add term/positio
7830: 6e 2d 6c 69 73 74 20 70 61 69 72 73 20 66 6f 72 n-list pairs for
7840: 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 the.** contents
7850: 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 of the document
7860: 20 77 69 74 68 20 64 6f 63 69 64 20 69 44 6f 63 with docid iDoc
7870: 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e id..*/.static in
7880: 74 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 t fts3PendingTer
7890: 6d 73 44 6f 63 69 64 28 0a 20 20 46 74 73 33 54 msDocid(. Fts3T
78a0: 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 able *p,
78b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 /* Fu
78c0: 6c 6c 2d 74 65 78 74 20 74 61 62 6c 65 20 68 61 ll-text table ha
78d0: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c ndle */. int iL
78e0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 angid,
78f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e /* Lan
7900: 67 75 61 67 65 20 69 64 20 6f 66 20 72 6f 77 20 guage id of row
7910: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f being written */
7920: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 . sqlite_int64
7930: 69 44 6f 63 69 64 20 20 20 20 20 20 20 20 20 20 iDocid
7940: 20 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 72 /* Docid of r
7950: 6f 77 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e ow being written
7960: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 */.){. assert(
7970: 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a 0a iLangid>=0 );..
7980: 20 20 2f 2a 20 54 4f 44 4f 28 73 68 65 73 73 29 /* TODO(shess)
7990: 20 45 78 70 6c 6f 72 65 20 77 68 65 74 68 65 72 Explore whether
79a0: 20 70 61 72 74 69 61 6c 6c 79 20 66 6c 75 73 68 partially flush
79b0: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 6f ing the buffer o
79c0: 6e 0a 20 20 2a 2a 20 66 6f 72 63 65 64 2d 66 6c n. ** forced-fl
79d0: 75 73 68 20 77 6f 75 6c 64 20 70 72 6f 76 69 64 ush would provid
79e0: 65 20 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d e better perform
79f0: 61 6e 63 65 2e 20 20 49 20 73 75 73 70 65 63 74 ance. I suspect
7a00: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 77 65 that if. ** we
7a10: 20 6f 72 64 65 72 65 64 20 74 68 65 20 64 6f 63 ordered the doc
7a20: 6c 69 73 74 73 20 62 79 20 73 69 7a 65 20 61 6e lists by size an
7a30: 64 20 66 6c 75 73 68 65 64 20 74 68 65 20 6c 61 d flushed the la
7a40: 72 67 65 73 74 20 75 6e 74 69 6c 20 74 68 65 0a rgest until the.
7a50: 20 20 2a 2a 20 62 75 66 66 65 72 20 77 61 73 20 ** buffer was
7a60: 68 61 6c 66 20 65 6d 70 74 79 2c 20 74 68 61 74 half empty, that
7a70: 20 77 6f 75 6c 64 20 6c 65 74 20 74 68 65 20 6c would let the l
7a80: 65 73 73 20 66 72 65 71 75 65 6e 74 20 74 65 72 ess frequent ter
7a90: 6d 73 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 ms. ** generate
7aa0: 20 6c 6f 6e 67 65 72 20 64 6f 63 6c 69 73 74 73 longer doclists
7ab0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 6f .. */. if( iDo
7ac0: 63 69 64 3c 3d 70 2d 3e 69 50 72 65 76 44 6f 63 cid<=p->iPrevDoc
7ad0: 69 64 20 0a 20 20 20 7c 7c 20 70 2d 3e 69 50 72 id . || p->iPr
7ae0: 65 76 4c 61 6e 67 69 64 21 3d 69 4c 61 6e 67 69 evLangid!=iLangi
7af0: 64 0a 20 20 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 d. || p->nPend
7b00: 69 6e 67 44 61 74 61 3e 70 2d 3e 6e 4d 61 78 50 ingData>p->nMaxP
7b10: 65 6e 64 69 6e 67 44 61 74 61 20 0a 20 20 29 7b endingData . ){
7b20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 . int rc = sq
7b30: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 lite3Fts3Pending
7b40: 54 65 72 6d 73 46 6c 75 73 68 28 70 29 3b 0a 20 TermsFlush(p);.
7b50: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
7b60: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 E_OK ) return rc
7b70: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 50 72 65 76 ;. }. p->iPrev
7b80: 44 6f 63 69 64 20 3d 20 69 44 6f 63 69 64 3b 0a Docid = iDocid;.
7b90: 20 20 70 2d 3e 69 50 72 65 76 4c 61 6e 67 69 64 p->iPrevLangid
7ba0: 20 3d 20 69 4c 61 6e 67 69 64 3b 0a 20 20 72 65 = iLangid;. re
7bb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
7bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 }../*.** Discard
7bd0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 the contents of
7be0: 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 the pending-ter
7bf0: 6d 73 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 ms hash tables.
7c00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
7c10: 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 Fts3PendingTerms
7c20: 43 6c 65 61 72 28 46 74 73 33 54 61 62 6c 65 20 Clear(Fts3Table
7c30: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 *p){. int i;.
7c40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 for(i=0; i<p->nI
7c50: 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 ndex; i++){.
7c60: 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 Fts3HashElem *pE
7c70: 6c 65 6d 3b 0a 20 20 20 20 46 74 73 33 48 61 73 lem;. Fts3Has
7c80: 68 20 2a 70 48 61 73 68 20 3d 20 26 70 2d 3e 61 h *pHash = &p->a
7c90: 49 6e 64 65 78 5b 69 5d 2e 68 50 65 6e 64 69 6e Index[i].hPendin
7ca0: 67 3b 0a 20 20 20 20 66 6f 72 28 70 45 6c 65 6d g;. for(pElem
7cb0: 3d 66 74 73 33 48 61 73 68 46 69 72 73 74 28 70 =fts3HashFirst(p
7cc0: 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 Hash); pElem; pE
7cd0: 6c 65 6d 3d 66 74 73 33 48 61 73 68 4e 65 78 74 lem=fts3HashNext
7ce0: 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 20 20 (pElem)){.
7cf0: 50 65 6e 64 69 6e 67 4c 69 73 74 20 2a 70 4c 69 PendingList *pLi
7d00: 73 74 20 3d 20 28 50 65 6e 64 69 6e 67 4c 69 73 st = (PendingLis
7d10: 74 20 2a 29 66 74 73 33 48 61 73 68 44 61 74 61 t *)fts3HashData
7d20: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 66 (pElem);. f
7d30: 74 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 ts3PendingListDe
7d40: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 lete(pList);.
7d50: 20 7d 0a 20 20 20 20 66 74 73 33 48 61 73 68 43 }. fts3HashC
7d60: 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 7d lear(pHash);. }
7d70: 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 . p->nPendingDa
7d80: 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ta = 0;.}../*.**
7d90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 This function i
7da0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 s called by the
7db0: 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 xUpdate() method
7dc0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49 as part of an I
7dd0: 4e 53 45 52 54 0a 2a 2a 20 6f 70 65 72 61 74 69 NSERT.** operati
7de0: 6f 6e 2e 20 49 74 20 61 64 64 73 20 65 6e 74 72 on. It adds entr
7df0: 69 65 73 20 66 6f 72 20 65 61 63 68 20 74 65 72 ies for each ter
7e00: 6d 20 69 6e 20 74 68 65 20 6e 65 77 20 72 65 63 m in the new rec
7e10: 6f 72 64 20 74 6f 20 74 68 65 0a 2a 2a 20 70 65 ord to the.** pe
7e20: 6e 64 69 6e 67 54 65 72 6d 73 20 68 61 73 68 20 ndingTerms hash
7e30: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 table..**.** Arg
7e40: 75 6d 65 6e 74 20 61 70 56 61 6c 20 69 73 20 74 ument apVal is t
7e50: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73 he same as the s
7e60: 69 6d 69 6c 61 72 6c 79 20 6e 61 6d 65 64 20 61 imilarly named a
7e70: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 rgument passed t
7e80: 6f 0a 2a 2a 20 66 74 73 33 49 6e 73 65 72 74 44 o.** fts3InsertD
7e90: 61 74 61 28 29 2e 20 50 61 72 61 6d 65 74 65 72 ata(). Parameter
7ea0: 20 69 44 6f 63 69 64 20 69 73 20 74 68 65 20 64 iDocid is the d
7eb0: 6f 63 69 64 20 6f 66 20 74 68 65 20 6e 65 77 20 ocid of the new
7ec0: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 row..*/.static i
7ed0: 6e 74 20 66 74 73 33 49 6e 73 65 72 74 54 65 72 nt fts3InsertTer
7ee0: 6d 73 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 ms(. Fts3Table
7ef0: 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 *p, . int iLang
7f00: 69 64 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 id, . sqlite3_v
7f10: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 0a 20 alue **apVal, .
7f20: 20 75 33 32 20 2a 61 53 7a 0a 29 7b 0a 20 20 69 u32 *aSz.){. i
7f30: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 nt i;
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
7f50: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 * Iterator varia
7f60: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 32 ble */. for(i=2
7f70: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 ; i<p->nColumn+2
7f80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 ; i++){. int
7f90: 69 43 6f 6c 20 3d 20 69 2d 32 3b 0a 20 20 20 20 iCol = i-2;.
7fa0: 69 66 28 20 70 2d 3e 61 62 4e 6f 74 69 6e 64 65 if( p->abNotinde
7fb0: 78 65 64 5b 69 43 6f 6c 5d 3d 3d 30 20 29 7b 0a xed[iCol]==0 ){.
7fc0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 const char
7fd0: 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e 73 74 *zText = (const
7fe0: 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f char *)sqlite3_
7ff0: 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c value_text(apVal
8000: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 [i]);. int
8010: 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 rc = fts3Pending
8020: 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e TermsAdd(p, iLan
8030: 67 69 64 2c 20 7a 54 65 78 74 2c 20 69 43 6f 6c gid, zText, iCol
8040: 2c 20 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 , &aSz[iCol]);.
8050: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c if( rc!=SQL
8060: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
8070: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 return rc;.
8080: 20 20 20 7d 0a 20 20 20 20 20 20 61 53 7a 5b 70 }. aSz[p
8090: 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 ->nColumn] += sq
80a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 lite3_value_byte
80b0: 73 28 61 70 56 61 6c 5b 69 5d 29 3b 0a 20 20 20 s(apVal[i]);.
80c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 }. }. return
80d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a SQLITE_OK;.}../*
80e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
80f0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 n is called by t
8100: 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 he xUpdate() met
8110: 68 6f 64 20 66 6f 72 20 61 6e 20 49 4e 53 45 52 hod for an INSER
8120: 54 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 T operation..**
8130: 54 68 65 20 61 70 56 61 6c 20 70 61 72 61 6d 65 The apVal parame
8140: 74 65 72 20 69 73 20 70 61 73 73 65 64 20 61 20 ter is passed a
8150: 63 6f 70 79 20 6f 66 20 74 68 65 20 61 70 56 61 copy of the apVa
8160: 6c 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 l argument passe
8170: 64 20 62 79 0a 2a 2a 20 53 51 4c 69 74 65 20 74 d by.** SQLite t
8180: 6f 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20 o the xUpdate()
8190: 6d 65 74 68 6f 64 2e 20 69 2e 65 3a 0a 2a 2a 0a method. i.e:.**.
81a0: 2a 2a 20 20 20 61 70 56 61 6c 5b 30 5d 20 20 20 ** apVal[0]
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 6f 74 Not
81c0: 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45 52 54 used for INSERT
81d0: 2e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b 31 5d 20 ..** apVal[1]
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 r
81f0: 6f 77 69 64 0a 2a 2a 20 20 20 61 70 56 61 6c 5b owid.** apVal[
8200: 32 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2]
8210: 20 20 4c 65 66 74 2d 6d 6f 73 74 20 75 73 65 72 Left-most user
8220: 2d 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 0a -defined column.
8230: 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 61 70 ** ....** ap
8240: 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 Val[p->nColumn+1
8250: 5d 20 20 20 20 20 52 69 67 68 74 2d 6d 6f 73 74 ] Right-most
8260: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 63 6f user-defined co
8270: 6c 75 6d 6e 0a 2a 2a 20 20 20 61 70 56 61 6c 5b lumn.** apVal[
8280: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d 20 20 20 p->nColumn+2]
8290: 20 20 48 69 64 64 65 6e 20 63 6f 6c 75 6d 6e 20 Hidden column
82a0: 77 69 74 68 20 73 61 6d 65 20 6e 61 6d 65 20 61 with same name a
82b0: 73 20 74 61 62 6c 65 0a 2a 2a 20 20 20 61 70 56 s table.** apV
82c0: 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d al[p->nColumn+3]
82d0: 20 20 20 20 20 48 69 64 64 65 6e 20 22 64 6f 63 Hidden "doc
82e0: 69 64 22 20 63 6f 6c 75 6d 6e 20 28 61 6c 69 61 id" column (alia
82f0: 73 20 66 6f 72 20 72 6f 77 69 64 29 0a 2a 2a 20 s for rowid).**
8300: 20 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 apVal[p->nColu
8310: 6d 6e 2b 34 5d 20 20 20 20 20 48 69 64 64 65 6e mn+4] Hidden
8320: 20 6c 61 6e 67 75 61 67 65 69 64 20 63 6f 6c 75 languageid colu
8330: 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 mn.*/.static int
8340: 20 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 fts3InsertData(
8350: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c . Fts3Table *p,
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8370: 20 20 20 2f 2a 20 46 75 6c 6c 2d 74 65 78 74 20 /* Full-text
8380: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 table */. sqlit
8390: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c e3_value **apVal
83a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 , /* Ar
83b0: 72 61 79 20 6f 66 20 76 61 6c 75 65 73 20 74 6f ray of values to
83c0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 73 71 6c insert */. sql
83d0: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 44 6f ite3_int64 *piDo
83e0: 63 69 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 cid /*
83f0: 4f 55 54 3a 20 44 6f 63 69 64 20 66 6f 72 20 72 OUT: Docid for r
8400: 6f 77 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 ow just inserted
8410: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b */.){. int rc;
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8430: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
8440: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c rn code */. sql
8450: 69 74 65 33 5f 73 74 6d 74 20 2a 70 43 6f 6e 74 ite3_stmt *pCont
8460: 65 6e 74 49 6e 73 65 72 74 3b 20 20 20 2f 2a 20 entInsert; /*
8470: 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 5f 63 6f INSERT INTO %_co
8480: 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 2e 2e 2e ntent VALUES(...
8490: 29 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 7a ) */.. if( p->z
84a0: 43 6f 6e 74 65 6e 74 54 62 6c 20 29 7b 0a 20 20 ContentTbl ){.
84b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 sqlite3_value
84c0: 2a 70 52 6f 77 69 64 20 3d 20 61 70 56 61 6c 5b *pRowid = apVal[
84d0: 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 33 5d 3b 0a 20 p->nColumn+3];.
84e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 if( sqlite3_v
84f0: 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 69 64 alue_type(pRowid
8500: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 )==SQLITE_NULL )
8510: 7b 0a 20 20 20 20 20 20 70 52 6f 77 69 64 20 3d {. pRowid =
8520: 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 20 7d apVal[1];. }
8530: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 . if( sqlite3
8540: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 52 6f 77 _value_type(pRow
8550: 69 64 29 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 id)!=SQLITE_INTE
8560: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74 GER ){. ret
8570: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 urn SQLITE_CONST
8580: 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 20 RAINT;. }.
8590: 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 *piDocid = sqli
85a0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 te3_value_int64(
85b0: 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 72 65 74 pRowid);. ret
85c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
85d0: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 }.. /* Locate
85e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 the statement ha
85f0: 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 69 6e 73 ndle used to ins
8600: 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 ert data into th
8610: 65 20 25 5f 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a e %_content. **
8620: 20 74 61 62 6c 65 2e 20 54 68 65 20 53 51 4c 20 table. The SQL
8630: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 for this stateme
8640: 6e 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a nt is:. **. **
8650: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 INSERT INTO %
8660: 5f 63 6f 6e 74 65 6e 74 20 56 41 4c 55 45 53 28 _content VALUES(
8670: 3f 2c 20 3f 2c 20 3f 2c 20 2e 2e 2e 29 0a 20 20 ?, ?, ?, ...).
8680: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 74 **. ** The stat
8690: 65 6d 65 6e 74 20 66 65 61 74 75 72 65 73 20 4e ement features N
86a0: 20 27 3f 27 20 76 61 72 69 61 62 6c 65 73 2c 20 '?' variables,
86b0: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e where N is the n
86c0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 0a 20 20 umber of user.
86d0: 2a 2a 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d ** defined colum
86e0: 6e 73 20 69 6e 20 74 68 65 20 46 54 53 33 20 74 ns in the FTS3 t
86f0: 61 62 6c 65 2c 20 70 6c 75 73 20 6f 6e 65 20 66 able, plus one f
8700: 6f 72 20 74 68 65 20 64 6f 63 69 64 20 66 69 65 or the docid fie
8710: 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 ld.. */. rc =
8720: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 fts3SqlStmt(p, S
8730: 51 4c 5f 43 4f 4e 54 45 4e 54 5f 49 4e 53 45 52 QL_CONTENT_INSER
8740: 54 2c 20 26 70 43 6f 6e 74 65 6e 74 49 6e 73 65 T, &pContentInse
8750: 72 74 2c 20 26 61 70 56 61 6c 5b 31 5d 29 3b 0a rt, &apVal[1]);.
8760: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
8770: 5f 4f 4b 20 26 26 20 70 2d 3e 7a 4c 61 6e 67 75 _OK && p->zLangu
8780: 61 67 65 69 64 20 29 7b 0a 20 20 20 20 72 63 20 ageid ){. rc
8790: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 = sqlite3_bind_i
87a0: 6e 74 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e nt(. pCon
87b0: 74 65 6e 74 49 6e 73 65 72 74 2c 20 70 2d 3e 6e tentInsert, p->n
87c0: 43 6f 6c 75 6d 6e 2b 32 2c 20 0a 20 20 20 20 20 Column+2, .
87d0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 sqlite3_value
87e0: 5f 69 6e 74 28 61 70 56 61 6c 5b 70 2d 3e 6e 43 _int(apVal[p->nC
87f0: 6f 6c 75 6d 6e 2b 34 5d 29 0a 20 20 20 20 29 3b olumn+4]). );
8800: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 . }. if( rc!=S
8810: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 QLITE_OK ) retur
8820: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 n rc;.. /* Ther
8830: 65 20 69 73 20 61 20 71 75 69 72 6b 20 68 65 72 e is a quirk her
8840: 65 2e 20 54 68 65 20 75 73 65 72 73 20 49 4e 53 e. The users INS
8850: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 ERT statement ma
8860: 79 20 68 61 76 65 20 73 70 65 63 69 66 69 65 64 y have specified
8870: 0a 20 20 2a 2a 20 61 20 76 61 6c 75 65 20 66 6f . ** a value fo
8880: 72 20 74 68 65 20 22 72 6f 77 69 64 22 20 66 69 r the "rowid" fi
8890: 65 6c 64 2c 20 66 6f 72 20 74 68 65 20 22 64 6f eld, for the "do
88a0: 63 69 64 22 20 66 69 65 6c 64 2c 20 6f 72 20 66 cid" field, or f
88b0: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 20 57 68 or both.. ** Wh
88c0: 69 63 68 20 69 73 20 61 20 70 72 6f 62 6c 65 6d ich is a problem
88d0: 2c 20 73 69 6e 63 65 20 22 72 6f 77 69 64 22 20 , since "rowid"
88e0: 61 6e 64 20 22 64 6f 63 69 64 22 20 61 72 65 20 and "docid" are
88f0: 61 6c 69 61 73 65 73 20 66 6f 72 20 74 68 65 0a aliases for the.
8900: 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e ** same value.
8910: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 For example:.
8920: 2a 2a 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 **. ** INSERT
8930: 20 49 4e 54 4f 20 66 74 73 33 74 62 6c 28 72 6f INTO fts3tbl(ro
8940: 77 69 64 2c 20 64 6f 63 69 64 29 20 56 41 4c 55 wid, docid) VALU
8950: 45 53 28 31 2c 20 32 29 3b 0a 20 20 2a 2a 0a 20 ES(1, 2);. **.
8960: 20 2a 2a 20 49 6e 20 46 54 53 33 2c 20 74 68 69 ** In FTS3, thi
8970: 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 49 s is an error. I
8980: 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f t is an error to
8990: 20 73 70 65 63 69 66 79 20 6e 6f 6e 2d 4e 55 4c specify non-NUL
89a0: 4c 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 66 6f L values. ** fo
89b0: 72 20 62 6f 74 68 20 64 6f 63 69 64 20 61 6e 64 r both docid and
89c0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 6f 77 69 some other rowi
89d0: 64 20 61 6c 69 61 73 2e 0a 20 20 2a 2f 0a 20 20 d alias.. */.
89e0: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 if( SQLITE_NULL!
89f0: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 =sqlite3_value_t
8a00: 79 70 65 28 61 70 56 61 6c 5b 33 2b 70 2d 3e 6e ype(apVal[3+p->n
8a10: 43 6f 6c 75 6d 6e 5d 29 20 29 7b 0a 20 20 20 20 Column]) ){.
8a20: 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3d if( SQLITE_NULL=
8a30: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 =sqlite3_value_t
8a40: 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 0a 20 20 ype(apVal[0]).
8a50: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4e 55 4c && SQLITE_NUL
8a60: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 L!=sqlite3_value
8a70: 5f 74 79 70 65 28 61 70 56 61 6c 5b 31 5d 29 0a _type(apVal[1]).
8a80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 ){. /*
8a90: 41 20 72 6f 77 69 64 2f 64 6f 63 69 64 20 63 6f A rowid/docid co
8aa0: 6e 66 6c 69 63 74 2e 20 2a 2f 0a 20 20 20 20 20 nflict. */.
8ab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 return SQLITE_E
8ac0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
8ad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e rc = sqlite3_bin
8ae0: 64 5f 76 61 6c 75 65 28 70 43 6f 6e 74 65 6e 74 d_value(pContent
8af0: 49 6e 73 65 72 74 2c 20 31 2c 20 61 70 56 61 6c Insert, 1, apVal
8b00: 5b 33 2b 70 2d 3e 6e 43 6f 6c 75 6d 6e 5d 29 3b [3+p->nColumn]);
8b10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
8b20: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 ITE_OK ) return
8b30: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 rc;. }.. /* Ex
8b40: 65 63 75 74 65 20 74 68 65 20 73 74 61 74 65 6d ecute the statem
8b50: 65 6e 74 20 74 6f 20 69 6e 73 65 72 74 20 74 68 ent to insert th
8b60: 65 20 72 65 63 6f 72 64 2e 20 53 65 74 20 2a 70 e record. Set *p
8b70: 69 44 6f 63 69 64 20 74 6f 20 74 68 65 20 0a 20 iDocid to the .
8b80: 20 2a 2a 20 6e 65 77 20 64 6f 63 69 64 20 76 61 ** new docid va
8b90: 6c 75 65 2e 20 0a 20 20 2a 2f 0a 20 20 73 71 6c lue. . */. sql
8ba0: 69 74 65 33 5f 73 74 65 70 28 70 43 6f 6e 74 65 ite3_step(pConte
8bb0: 6e 74 49 6e 73 65 72 74 29 3b 0a 20 20 72 63 20 ntInsert);. rc
8bc0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 = sqlite3_reset(
8bd0: 70 43 6f 6e 74 65 6e 74 49 6e 73 65 72 74 29 3b pContentInsert);
8be0: 0a 0a 20 20 2a 70 69 44 6f 63 69 64 20 3d 20 73 .. *piDocid = s
8bf0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 qlite3_last_inse
8c00: 72 74 5f 72 6f 77 69 64 28 70 2d 3e 64 62 29 3b rt_rowid(p->db);
8c10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
8c20: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 .../*.** Remove
8c30: 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 all data from th
8c40: 65 20 46 54 53 33 20 74 61 62 6c 65 2e 20 43 6c e FTS3 table. Cl
8c50: 65 61 72 20 74 68 65 20 68 61 73 68 20 74 61 62 ear the hash tab
8c60: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a le containing.**
8c70: 20 70 65 6e 64 69 6e 67 20 74 65 72 6d 73 2e 0a pending terms..
8c80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 */.static int ft
8c90: 73 33 44 65 6c 65 74 65 41 6c 6c 28 46 74 73 33 s3DeleteAll(Fts3
8ca0: 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 62 43 Table *p, int bC
8cb0: 6f 6e 74 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 ontent){. int r
8cc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 c = SQLITE_OK;
8cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
8ce0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 turn code */..
8cf0: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 63 /* Discard the c
8d00: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 ontents of the p
8d10: 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 ending-terms has
8d20: 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 h table. */. sq
8d30: 6c 69 74 65 33 46 74 73 33 50 65 6e 64 69 6e 67 lite3Fts3Pending
8d40: 54 65 72 6d 73 43 6c 65 61 72 28 70 29 3b 0a 0a TermsClear(p);..
8d50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 /* Delete ever
8d60: 79 74 68 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 ything from the
8d70: 73 68 61 64 6f 77 20 74 61 62 6c 65 73 2e 20 45 shadow tables. E
8d80: 78 63 65 70 74 2c 20 6c 65 61 76 65 20 25 5f 63 xcept, leave %_c
8d90: 6f 6e 74 65 6e 74 20 61 73 0a 20 20 2a 2a 20 69 ontent as. ** i
8da0: 73 20 69 66 20 62 43 6f 6e 74 65 6e 74 20 69 73 s if bContent is
8db0: 20 66 61 6c 73 65 2e 20 20 2a 2f 0a 20 20 61 73 false. */. as
8dc0: 73 65 72 74 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e sert( p->zConten
8dd0: 74 54 62 6c 3d 3d 30 20 7c 7c 20 62 43 6f 6e 74 tTbl==0 || bCont
8de0: 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 ent==0 );. if(
8df0: 62 43 6f 6e 74 65 6e 74 20 29 20 66 74 73 33 53 bContent ) fts3S
8e00: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 qlExec(&rc, p, S
8e10: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 43 4f QL_DELETE_ALL_CO
8e20: 4e 54 45 4e 54 2c 20 30 29 3b 0a 20 20 66 74 73 NTENT, 0);. fts
8e30: 33 53 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 3SqlExec(&rc, p,
8e40: 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f SQL_DELETE_ALL_
8e50: 53 45 47 4d 45 4e 54 53 2c 20 30 29 3b 0a 20 20 SEGMENTS, 0);.
8e60: 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c fts3SqlExec(&rc,
8e70: 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 41 p, SQL_DELETE_A
8e80: 4c 4c 5f 53 45 47 44 49 52 2c 20 30 29 3b 0a 20 LL_SEGDIR, 0);.
8e90: 20 69 66 28 20 70 2d 3e 62 48 61 73 44 6f 63 73 if( p->bHasDocs
8ea0: 69 7a 65 20 29 7b 0a 20 20 20 20 66 74 73 33 53 ize ){. fts3S
8eb0: 71 6c 45 78 65 63 28 26 72 63 2c 20 70 2c 20 53 qlExec(&rc, p, S
8ec0: 51 4c 5f 44 45 4c 45 54 45 5f 41 4c 4c 5f 44 4f QL_DELETE_ALL_DO
8ed0: 43 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 CSIZE, 0);. }.
8ee0: 20 69 66 28 20 70 2d 3e 62 48 61 73 53 74 61 74 if( p->bHasStat
8ef0: 20 29 7b 0a 20 20 20 20 66 74 73 33 53 71 6c 45 ){. fts3SqlE
8f00: 78 65 63 28 26 72 63 2c 20 70 2c 20 53 51 4c 5f xec(&rc, p, SQL_
8f10: 44 45 4c 45 54 45 5f 41 4c 4c 5f 53 54 41 54 2c DELETE_ALL_STAT,
8f20: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 0);. }. retur
8f30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a n rc;.}../*.**.*
8f40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 61 6e /.static int lan
8f50: 67 69 64 46 72 6f 6d 53 65 6c 65 63 74 28 46 74 gidFromSelect(Ft
8f60: 73 33 54 61 62 6c 65 20 2a 70 2c 20 73 71 6c 69 s3Table *p, sqli
8f70: 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 te3_stmt *pSelec
8f80: 74 29 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 t){. int iLangi
8f90: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e d = 0;. if( p->
8fa0: 7a 4c 61 6e 67 75 61 67 65 69 64 20 29 20 69 4c zLanguageid ) iL
8fb0: 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 5f angid = sqlite3_
8fc0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 65 6c 65 column_int(pSele
8fd0: 63 74 2c 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 ct, p->nColumn+1
8fe0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 4c 61 6e );. return iLan
8ff0: 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 gid;.}../*.** Th
9000: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 e first element
9010: 69 6e 20 74 68 65 20 61 70 56 61 6c 5b 5d 20 61 in the apVal[] a
9020: 72 72 61 79 20 69 73 20 61 73 73 75 6d 65 64 20 rray is assumed
9030: 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 64 to contain the d
9040: 6f 63 69 64 0a 2a 2a 20 28 61 6e 20 69 6e 74 65 ocid.** (an inte
9050: 67 65 72 29 20 6f 66 20 61 20 72 6f 77 20 61 62 ger) of a row ab
9060: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 out to be delete
9070: 64 2e 20 52 65 6d 6f 76 65 20 61 6c 6c 20 74 65 d. Remove all te
9080: 72 6d 73 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 rms from the.**
9090: 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 2e full-text index.
90a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
90b0: 66 74 73 33 44 65 6c 65 74 65 54 65 72 6d 73 28 fts3DeleteTerms(
90c0: 20 0a 20 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 . int *pRC,
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
90e0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 esult code */.
90f0: 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 Fts3Table *p,
9100: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 /* The F
9110: 54 53 20 74 61 62 6c 65 20 74 6f 20 64 65 6c 65 TS table to dele
9120: 74 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 73 71 6c te from */. sql
9130: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 ite3_value *pRow
9140: 69 64 2c 20 20 2f 2a 20 54 68 65 20 64 6f 63 69 id, /* The doci
9150: 64 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 d to be deleted
9160: 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 2c 20 20 */. u32 *aSz,
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
9180: 53 69 7a 65 73 20 6f 66 20 64 65 6c 65 74 65 64 Sizes of deleted
9190: 20 64 6f 63 75 6d 65 6e 74 20 77 72 69 74 74 65 document writte
91a0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 n here */. int
91b0: 2a 70 62 46 6f 75 6e 64 20 20 20 20 20 20 20 20 *pbFound
91c0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 /* OUT: Set
91d0: 74 6f 20 74 72 75 65 20 69 66 20 72 6f 77 20 72 to true if row r
91e0: 65 61 6c 6c 79 20 64 6f 65 73 20 65 78 69 73 74 eally does exist
91f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b */.){. int rc;
9200: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 . sqlite3_stmt
9210: 2a 70 53 65 6c 65 63 74 3b 0a 0a 20 20 61 73 73 *pSelect;.. ass
9220: 65 72 74 28 20 2a 70 62 46 6f 75 6e 64 3d 3d 30 ert( *pbFound==0
9230: 20 29 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 );. if( *pRC )
9240: 20 72 65 74 75 72 6e 3b 0a 20 20 72 63 20 3d 20 return;. rc =
9250: 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 fts3SqlStmt(p, S
9260: 51 4c 5f 53 45 4c 45 43 54 5f 43 4f 4e 54 45 4e QL_SELECT_CONTEN
9270: 54 5f 42 59 5f 52 4f 57 49 44 2c 20 26 70 53 65 T_BY_ROWID, &pSe
9280: 6c 65 63 74 2c 20 26 70 52 6f 77 69 64 29 3b 0a lect, &pRowid);.
9290: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
92a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 _OK ){. if( S
92b0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 QLITE_ROW==sqlit
92c0: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 e3_step(pSelect)
92d0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b ){. int i;
92e0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 . int iLang
92f0: 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53 id = langidFromS
9300: 65 6c 65 63 74 28 70 2c 20 70 53 65 6c 65 63 74 elect(p, pSelect
9310: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 );. rc = ft
9320: 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f s3PendingTermsDo
9330: 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 cid(p, iLangid,
9340: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 sqlite3_column_i
9350: 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 30 29 nt64(pSelect, 0)
9360: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 );. for(i=1
9370: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ; rc==SQLITE_OK
9380: 26 26 20 69 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e && i<=p->nColumn
9390: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; i++){.
93a0: 69 6e 74 20 69 43 6f 6c 20 3d 20 69 2d 31 3b 0a int iCol = i-1;.
93b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 if( p->a
93c0: 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 43 6f 6c bNotindexed[iCol
93d0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 ]==0 ){.
93e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 const char *zT
93f0: 65 78 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ext = (const cha
9400: 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 r *)sqlite3_colu
9410: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c mn_text(pSelect,
9420: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 i);. r
9430: 63 20 3d 20 66 74 73 33 50 65 6e 64 69 6e 67 54 c = fts3PendingT
9440: 65 72 6d 73 41 64 64 28 70 2c 20 69 4c 61 6e 67 ermsAdd(p, iLang
9450: 69 64 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 26 id, zText, -1, &
9460: 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 aSz[iCol]);.
9470: 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 6f aSz[p->nCo
9480: 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 33 lumn] += sqlite3
9490: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 _column_bytes(pS
94a0: 65 6c 65 63 74 2c 20 69 29 3b 0a 20 20 20 20 20 elect, i);.
94b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
94c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
94d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
94e0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 sqlite3_reset(pS
94f0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 elect);.
9500: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 *pRC = rc;.
9510: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 return;.
9520: 20 7d 0a 20 20 20 20 20 20 2a 70 62 46 6f 75 6e }. *pbFoun
9530: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 d = 1;. }.
9540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 rc = sqlite3_re
9550: 73 65 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 set(pSelect);.
9560: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 }else{. sqlit
9570: 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 74 e3_reset(pSelect
9580: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 43 20 3d 20 );. }. *pRC =
9590: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 rc;.}../*.** For
95a0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e ward declaration
95b0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 to account for
95c0: 74 68 65 20 63 69 72 63 75 6c 61 72 20 64 65 70 the circular dep
95d0: 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 0a endency between.
95e0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 66 74 73 ** functions fts
95f0: 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 29 20 3SegmentMerge()
9600: 61 6e 64 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 and fts3Allocate
9610: 53 65 67 64 69 72 49 64 78 28 29 2e 0a 2a 2f 0a SegdirIdx()..*/.
9620: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 static int fts3S
9630: 65 67 6d 65 6e 74 4d 65 72 67 65 28 46 74 73 33 egmentMerge(Fts3
9640: 54 61 62 6c 65 20 2a 2c 20 69 6e 74 2c 20 69 6e Table *, int, in
9650: 74 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 20 0a 2a 2a t, int);../* .**
9660: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 This function a
9670: 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 20 6c llocates a new l
9680: 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 64 65 evel iLevel inde
9690: 78 20 69 6e 20 74 68 65 20 73 65 67 64 69 72 20 x in the segdir
96a0: 74 61 62 6c 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c table..** Usuall
96b0: 79 2c 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 y, indexes are a
96c0: 6c 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 llocated within
96d0: 61 20 6c 65 76 65 6c 20 73 65 71 75 65 6e 74 69 a level sequenti
96e0: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 0a 2a 2a ally starting.**
96f0: 20 77 69 74 68 20 30 2c 20 73 6f 20 74 68 65 20 with 0, so the
9700: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 allocated index
9710: 69 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 is one greater t
9720: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 han the value re
9730: 74 75 72 6e 65 64 0a 2a 2a 20 62 79 3a 0a 2a 2a turned.** by:.**
9740: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 .** SELECT max
9750: 28 69 64 78 29 20 46 52 4f 4d 20 25 5f 73 65 67 (idx) FROM %_seg
9760: 64 69 72 20 57 48 45 52 45 20 6c 65 76 65 6c 20 dir WHERE level
9770: 3d 20 3a 69 4c 65 76 65 6c 0a 2a 2a 0a 2a 2a 20 = :iLevel.**.**
9780: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 72 However, if ther
9790: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 46 54 e are already FT
97a0: 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 69 S3_MERGE_COUNT i
97b0: 6e 64 65 78 65 73 20 61 74 20 74 68 65 20 72 65 ndexes at the re
97c0: 71 75 65 73 74 65 64 0a 2a 2a 20 6c 65 76 65 6c quested.** level
97d0: 2c 20 74 68 65 79 20 61 72 65 20 6d 65 72 67 65 , they are merge
97e0: 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 d into a single
97f0: 6c 65 76 65 6c 20 28 69 4c 65 76 65 6c 2b 31 29 level (iLevel+1)
9800: 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 74 68 65 segment and the
9810: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 69 .** allocated i
9820: 6e 64 65 78 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a ndex is 0..**.**
9830: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 If successful,
9840: 2a 70 69 49 64 78 20 69 73 20 73 65 74 20 74 6f *piIdx is set to
9850: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 69 the allocated i
9860: 6e 64 65 78 20 73 6c 6f 74 20 61 6e 64 20 53 51 ndex slot and SQ
9870: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 72 65 74 75 72 LITE_OK.** retur
9880: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 ned. Otherwise,
9890: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 an SQLite error
98a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 code is returned
98b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
98c0: 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 67 64 fts3AllocateSegd
98d0: 69 72 49 64 78 28 0a 20 20 46 74 73 33 54 61 62 irIdx(. Fts3Tab
98e0: 6c 65 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 4c le *p, . int iL
98f0: 61 6e 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 angid,
9900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e /* Lan
9910: 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e guage id */. in
9920: 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 20 t iIndex,
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
9940: 20 49 6e 64 65 78 20 66 6f 72 20 70 2d 3e 61 49 Index for p->aI
9950: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c ndex */. int iL
9960: 65 76 65 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 69 evel, . int *pi
9970: 49 64 78 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b Idx.){. int rc;
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9990: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
99a0: 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71 6c rn Code */. sql
99b0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 78 74 ite3_stmt *pNext
99c0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 Idx; /*
99d0: 51 75 65 72 79 20 66 6f 72 20 6e 65 78 74 20 69 Query for next i
99e0: 64 78 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 dx at level iLev
99f0: 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 78 el */. int iNex
9a00: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 t = 0;
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c /* Resul
9a20: 74 20 6f 66 20 71 75 65 72 79 20 70 4e 65 78 74 t of query pNext
9a30: 49 64 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 Idx */.. assert
9a40: 28 20 69 4c 61 6e 67 69 64 3e 3d 30 20 29 3b 0a ( iLangid>=0 );.
9a50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 49 6e assert( p->nIn
9a60: 64 65 78 3e 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 dex>=1 );.. /*
9a70: 53 65 74 20 76 61 72 69 61 62 6c 65 20 69 4e 65 Set variable iNe
9a80: 78 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 61 xt to the next a
9a90: 76 61 69 6c 61 62 6c 65 20 73 65 67 64 69 72 20 vailable segdir
9aa0: 69 6e 64 65 78 20 61 74 20 6c 65 76 65 6c 20 69 index at level i
9ab0: 4c 65 76 65 6c 2e 20 2a 2f 0a 20 20 72 63 20 3d Level. */. rc =
9ac0: 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 fts3SqlStmt(p,
9ad0: 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 SQL_NEXT_SEGMENT
9ae0: 5f 49 4e 44 45 58 2c 20 26 70 4e 65 78 74 49 64 _INDEX, &pNextId
9af0: 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d x, 0);. if( rc=
9b00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
9b10: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 sqlite3_bind_i
9b20: 6e 74 36 34 28 0a 20 20 20 20 20 20 20 20 70 4e nt64(. pN
9b30: 65 78 74 49 64 78 2c 20 31 2c 20 67 65 74 41 62 extIdx, 1, getAb
9b40: 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 soluteLevel(p, i
9b50: 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 Langid, iIndex,
9b60: 69 4c 65 76 65 6c 29 0a 20 20 20 20 29 3b 0a 20 iLevel). );.
9b70: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f if( SQLITE_RO
9b80: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 W==sqlite3_step(
9b90: 70 4e 65 78 74 49 64 78 29 20 29 7b 0a 20 20 20 pNextIdx) ){.
9ba0: 20 20 20 69 4e 65 78 74 20 3d 20 73 71 6c 69 74 iNext = sqlit
9bb0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 4e e3_column_int(pN
9bc0: 65 78 74 49 64 78 2c 20 30 29 3b 0a 20 20 20 20 extIdx, 0);.
9bd0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 }. rc = sqlit
9be0: 65 33 5f 72 65 73 65 74 28 70 4e 65 78 74 49 64 e3_reset(pNextId
9bf0: 78 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 x);. }.. if( r
9c00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
9c10: 20 20 20 20 2f 2a 20 49 66 20 69 4e 65 78 74 20 /* If iNext
9c20: 69 73 20 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f is FTS3_MERGE_CO
9c30: 55 4e 54 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 UNT, indicating
9c40: 74 68 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 that level iLeve
9c50: 6c 20 69 73 20 61 6c 72 65 61 64 79 0a 20 20 20 l is already.
9c60: 20 2a 2a 20 66 75 6c 6c 2c 20 6d 65 72 67 65 20 ** full, merge
9c70: 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 all segments in
9c80: 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 69 6e 74 level iLevel int
9c90: 6f 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 65 o a single iLeve
9ca0: 6c 2b 31 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 l+1. ** segme
9cb0: 6e 74 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 nt and allocate
9cc0: 28 6e 65 77 6c 79 20 66 72 65 65 64 29 20 69 6e (newly freed) in
9cd0: 64 65 78 20 30 20 61 74 20 6c 65 76 65 6c 20 69 dex 0 at level i
9ce0: 4c 65 76 65 6c 2e 20 4f 74 68 65 72 77 69 73 65 Level. Otherwise
9cf0: 2c 0a 20 20 20 20 2a 2a 20 69 66 20 69 4e 65 78 ,. ** if iNex
9d00: 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 46 t is less than F
9d10: 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 2c TS3_MERGE_COUNT,
9d20: 20 61 6c 6c 6f 63 61 74 65 20 69 6e 64 65 78 20 allocate index
9d30: 69 4e 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 iNext.. */.
9d40: 20 20 69 66 28 20 69 4e 65 78 74 3e 3d 46 54 53 if( iNext>=FTS
9d50: 33 5f 4d 45 52 47 45 5f 43 4f 55 4e 54 20 29 7b 3_MERGE_COUNT ){
9d60: 0a 20 20 20 20 20 20 66 74 73 33 4c 6f 67 4d 65 . fts3LogMe
9d70: 72 67 65 28 31 36 2c 20 67 65 74 41 62 73 6f 6c rge(16, getAbsol
9d80: 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e uteLevel(p, iLan
9d90: 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 gid, iIndex, iLe
9da0: 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 72 63 20 vel));. rc
9db0: 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 = fts3SegmentMer
9dc0: 67 65 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 ge(p, iLangid, i
9dd0: 49 6e 64 65 78 2c 20 69 4c 65 76 65 6c 29 3b 0a Index, iLevel);.
9de0: 20 20 20 20 20 20 2a 70 69 49 64 78 20 3d 20 30 *piIdx = 0
9df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
9e00: 20 20 20 2a 70 69 49 64 78 20 3d 20 69 4e 65 78 *piIdx = iNex
9e10: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 t;. }. }..
9e20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
9e30: 0a 2a 2a 20 54 68 65 20 25 5f 73 65 67 6d 65 6e .** The %_segmen
9e40: 74 73 20 74 61 62 6c 65 20 69 73 20 64 65 63 6c ts table is decl
9e50: 61 72 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a ared as follows:
9e60: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 .**.** CREATE
9e70: 54 41 42 4c 45 20 25 5f 73 65 67 6d 65 6e 74 73 TABLE %_segments
9e80: 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 (blockid INTEGER
9e90: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c PRIMARY KEY, bl
9ea0: 6f 63 6b 20 42 4c 4f 42 29 0a 2a 2a 0a 2a 2a 20 ock BLOB).**.**
9eb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 This function re
9ec0: 61 64 73 20 64 61 74 61 20 66 72 6f 6d 20 61 20 ads data from a
9ed0: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 single row of th
9ee0: 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 62 e %_segments tab
9ef0: 6c 65 2e 20 54 68 65 0a 2a 2a 20 73 70 65 63 69 le. The.** speci
9f00: 66 69 63 20 72 6f 77 20 69 73 20 69 64 65 6e 74 fic row is ident
9f10: 69 66 69 65 64 20 62 79 20 74 68 65 20 69 42 6c ified by the iBl
9f20: 6f 63 6b 69 64 20 70 61 72 61 6d 65 74 65 72 2e ockid parameter.
9f30: 20 49 66 20 70 61 42 6c 6f 62 20 69 73 20 6e 6f If paBlob is no
9f40: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 t.** NULL, then
9f50: 61 20 62 75 66 66 65 72 20 69 73 20 61 6c 6c 6f a buffer is allo
9f60: 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 cated using sqli
9f70: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 te3_malloc() and
9f80: 20 70 6f 70 75 6c 61 74 65 64 0a 2a 2a 20 77 69 populated.** wi
9f90: 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 th the contents
9fa0: 6f 66 20 74 68 65 20 62 6c 6f 62 20 73 74 6f 72 of the blob stor
9fb0: 65 64 20 69 6e 20 74 68 65 20 22 62 6c 6f 63 6b ed in the "block
9fc0: 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 " column of the
9fd0: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 74 .** identified t
9fe0: 61 62 6c 65 20 72 6f 77 20 69 73 2e 20 57 68 65 able row is. Whe
9ff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 42 6c ther or not paBl
a000: 6f 62 20 69 73 20 4e 55 4c 4c 2c 20 2a 70 6e 42 ob is NULL, *pnB
a010: 6c 6f 62 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f lob is set.** to
a020: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 the size of the
a030: 20 62 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 62 blob in bytes b
a040: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e efore returning.
a050: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 .**.** If an err
a060: 6f 72 20 6f 63 63 75 72 73 2c 20 6f 72 20 74 68 or occurs, or th
a070: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74 e table does not
a080: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 70 65 contain the spe
a090: 63 69 66 69 65 64 20 72 6f 77 2c 0a 2a 2a 20 61 cified row,.** a
a0a0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 n SQLite error c
a0b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e ode is returned.
a0c0: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 Otherwise, SQLI
a0d0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 TE_OK is returne
a0e0: 64 2e 20 49 66 0a 2a 2a 20 70 61 42 6c 6f 62 20 d. If.** paBlob
a0f0: 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 is non-NULL, the
a100: 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 n it is the resp
a110: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 onsibility of th
a120: 65 20 63 61 6c 6c 65 72 20 74 6f 0a 2a 2a 20 65 e caller to.** e
a130: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 ventually free t
a140: 68 65 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 he returned buff
a150: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 er..**.** This f
a160: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6c 65 61 76 unction may leav
a170: 65 20 61 6e 20 6f 70 65 6e 20 73 71 6c 69 74 65 e an open sqlite
a180: 33 5f 62 6c 6f 62 2a 20 68 61 6e 64 6c 65 20 69 3_blob* handle i
a190: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 33 54 61 62 n the.** Fts3Tab
a1a0: 6c 65 2e 70 53 65 67 6d 65 6e 74 73 20 76 61 72 le.pSegments var
a1b0: 69 61 62 6c 65 2e 20 54 68 69 73 20 68 61 6e 64 iable. This hand
a1c0: 6c 65 20 69 73 20 72 65 75 73 65 64 20 62 79 20 le is reused by
a1d0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 subsequent calls
a1e0: 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 .** to this func
a1f0: 74 69 6f 6e 2e 20 54 68 65 20 68 61 6e 64 6c 65 tion. The handle
a200: 20 6d 61 79 20 62 65 20 63 6c 6f 73 65 64 20 62 may be closed b
a210: 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a y calling the.**
a220: 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d sqlite3Fts3Segm
a230: 65 6e 74 73 43 6c 6f 73 65 28 29 20 66 75 6e 63 entsClose() func
a240: 74 69 6f 6e 2e 20 52 65 75 73 69 6e 67 20 61 20 tion. Reusing a
a250: 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 61 blob handle is a
a260: 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 handy.** perfor
a270: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e mance improvemen
a280: 74 2c 20 62 75 74 20 74 68 65 20 62 6c 6f 62 20 t, but the blob
a290: 68 61 6e 64 6c 65 20 73 68 6f 75 6c 64 20 61 6c handle should al
a2a0: 77 61 79 73 20 62 65 20 63 6c 6f 73 65 64 0a 2a ways be closed.*
a2b0: 2a 20 62 65 66 6f 72 65 20 63 6f 6e 74 72 6f 6c * before control
a2c0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 is returned to
a2d0: 74 68 65 20 75 73 65 72 20 28 74 6f 20 70 72 65 the user (to pre
a2e0: 76 65 6e 74 20 61 20 6c 6f 63 6b 20 62 65 69 6e vent a lock bein
a2f0: 67 20 68 65 6c 64 0a 2a 2a 20 6f 6e 20 74 68 65 g held.** on the
a300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 database file f
a310: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e or longer than n
a320: 65 63 65 73 73 61 72 79 29 2e 20 54 68 75 73 2c ecessary). Thus,
a330: 20 61 6e 79 20 76 69 72 74 75 61 6c 20 74 61 62 any virtual tab
a340: 6c 65 0a 2a 2a 20 6d 65 74 68 6f 64 20 28 78 46 le.** method (xF
a350: 69 6c 74 65 72 20 65 74 63 2e 29 20 74 68 61 74 ilter etc.) that
a360: 20 6d 61 79 20 64 69 72 65 63 74 6c 79 20 6f 72 may directly or
a370: 20 69 6e 64 69 72 65 63 74 6c 79 20 63 61 6c 6c indirectly call
a380: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a this function.*
a390: 2a 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 * must call sqli
a3a0: 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 te3Fts3SegmentsC
a3b0: 6c 6f 73 65 28 29 20 62 65 66 6f 72 65 20 72 65 lose() before re
a3c0: 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 turning..*/.int
a3d0: 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 sqlite3Fts3ReadB
a3e0: 6c 6f 63 6b 28 0a 20 20 46 74 73 33 54 61 62 6c lock(. Fts3Tabl
a3f0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 e *p,
a400: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 /* FTS3
a410: 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a table handle */.
a420: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
a430: 69 42 6c 6f 63 6b 69 64 2c 20 20 20 20 20 20 20 iBlockid,
a440: 20 20 2f 2a 20 41 63 63 65 73 73 20 74 68 65 20 /* Access the
a450: 72 6f 77 20 77 69 74 68 20 62 6c 6f 63 6b 69 64 row with blockid
a460: 3d 24 69 42 6c 6f 63 6b 69 64 20 2a 2f 0a 20 20 =$iBlockid */.
a470: 63 68 61 72 20 2a 2a 70 61 42 6c 6f 62 2c 20 20 char **paBlob,
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a490: 2f 2a 20 4f 55 54 3a 20 42 6c 6f 62 20 64 61 74 /* OUT: Blob dat
a4a0: 61 20 69 6e 20 6d 61 6c 6c 6f 63 27 64 20 62 75 a in malloc'd bu
a4b0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 ffer */. int *p
a4c0: 6e 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 20 nBlob,
a4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 /* OUT
a4e0: 3a 20 53 69 7a 65 20 6f 66 20 62 6c 6f 62 20 64 : Size of blob d
a4f0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e ata */. int *pn
a500: 4c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 20 Load
a510: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
a520: 20 42 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 Bytes actually
a530: 6c 6f 61 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 loaded */.){. i
a540: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 nt rc;
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
a560: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f * Return code */
a570: 0a 0a 20 20 2f 2a 20 70 6e 42 6c 6f 62 20 6d 75 .. /* pnBlob mu
a580: 73 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 st be non-NULL.
a590: 70 61 42 6c 6f 62 20 6d 61 79 20 62 65 20 4e 55 paBlob may be NU
a5a0: 4c 4c 20 6f 72 20 6e 6f 6e 2d 4e 55 4c 4c 2e 20 LL or non-NULL.
a5b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 6e 42 */. assert( pnB
a5c0: 6c 6f 62 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d lob );.. if( p-
a5d0: 3e 70 53 65 67 6d 65 6e 74 73 20 29 7b 0a 20 20 >pSegments ){.
a5e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 rc = sqlite3_b
a5f0: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 53 lob_reopen(p->pS
a600: 65 67 6d 65 6e 74 73 2c 20 69 42 6c 6f 63 6b 69 egments, iBlocki
a610: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 d);. }else{.
a620: 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 67 6d if( 0==p->zSegm
a630: 65 6e 74 73 54 62 6c 20 29 7b 0a 20 20 20 20 20 entsTbl ){.
a640: 20 70 2d 3e 7a 53 65 67 6d 65 6e 74 73 54 62 6c p->zSegmentsTbl
a650: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
a660: 74 66 28 22 25 73 5f 73 65 67 6d 65 6e 74 73 22 tf("%s_segments"
a670: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 , p->zName);.
a680: 20 20 20 69 66 28 20 30 3d 3d 70 2d 3e 7a 53 65 if( 0==p->zSe
a690: 67 6d 65 6e 74 73 54 62 6c 20 29 20 72 65 74 75 gmentsTbl ) retu
a6a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b rn SQLITE_NOMEM;
a6b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 . }. rc =
a6c0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 sqlite3_blob_ope
a6d0: 6e 28 0a 20 20 20 20 20 20 20 70 2d 3e 64 62 2c n(. p->db,
a6e0: 20 70 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 53 65 67 p->zDb, p->zSeg
a6f0: 6d 65 6e 74 73 54 62 6c 2c 20 22 62 6c 6f 63 6b mentsTbl, "block
a700: 22 2c 20 69 42 6c 6f 63 6b 69 64 2c 20 30 2c 20 ", iBlockid, 0,
a710: 26 70 2d 3e 70 53 65 67 6d 65 6e 74 73 0a 20 20 &p->pSegments.
a720: 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 );. }.. if(
a730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
a740: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d . int nByte =
a750: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 sqlite3_blob_by
a760: 74 65 73 28 70 2d 3e 70 53 65 67 6d 65 6e 74 73 tes(p->pSegments
a770: 29 3b 0a 20 20 20 20 2a 70 6e 42 6c 6f 62 20 3d );. *pnBlob =
a780: 20 6e 42 79 74 65 3b 0a 20 20 20 20 69 66 28 20 nByte;. if(
a790: 70 61 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 paBlob ){.
a7a0: 63 68 61 72 20 2a 61 42 79 74 65 20 3d 20 73 71 char *aByte = sq
a7b0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 lite3_malloc(nBy
a7c0: 74 65 20 2b 20 46 54 53 33 5f 4e 4f 44 45 5f 50 te + FTS3_NODE_P
a7d0: 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 20 20 69 ADDING);. i
a7e0: 66 28 20 21 61 42 79 74 65 20 29 7b 0a 20 20 20 f( !aByte ){.
a7f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
a800: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 _NOMEM;. }e
a810: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 lse{. if(
a820: 20 70 6e 4c 6f 61 64 20 26 26 20 6e 42 79 74 65 pnLoad && nByte
a830: 3e 28 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e >(FTS3_NODE_CHUN
a840: 4b 5f 54 48 52 45 53 48 4f 4c 44 29 20 29 7b 0a K_THRESHOLD) ){.
a850: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 nByte
a860: 3d 20 46 54 53 33 5f 4e 4f 44 45 5f 43 48 55 4e = FTS3_NODE_CHUN
a870: 4b 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 KSIZE;.
a880: 20 2a 70 6e 4c 6f 61 64 20 3d 20 6e 42 79 74 65 *pnLoad = nByte
a890: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
a8a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
a8b0: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 53 _blob_read(p->pS
a8c0: 65 67 6d 65 6e 74 73 2c 20 61 42 79 74 65 2c 20 egments, aByte,
a8d0: 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 nByte, 0);.
a8e0: 20 20 20 6d 65 6d 73 65 74 28 26 61 42 79 74 65 memset(&aByte
a8f0: 5b 6e 42 79 74 65 5d 2c 20 30 2c 20 46 54 53 33 [nByte], 0, FTS3
a900: 5f 4e 4f 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a _NODE_PADDING);.
a910: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d if( rc!=
a920: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
a930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 sqlite3_f
a940: 72 65 65 28 61 42 79 74 65 29 3b 0a 20 20 20 20 ree(aByte);.
a950: 20 20 20 20 20 20 61 42 79 74 65 20 3d 20 30 3b aByte = 0;
a960: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
a970: 20 7d 0a 20 20 20 20 20 20 2a 70 61 42 6c 6f 62 }. *paBlob
a980: 20 3d 20 61 42 79 74 65 3b 0a 20 20 20 20 7d 0a = aByte;. }.
a990: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 }.. return rc
a9a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 ;.}../*.** Close
a9b0: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 the blob handle
a9c0: 20 61 74 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 at p->pSegments
a9d0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e , if it is open.
a9e0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 See comments ab
a9f0: 6f 76 65 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 ove.** the sqlit
aa00: 65 33 46 74 73 33 52 65 61 64 42 6c 6f 63 6b 28 e3Fts3ReadBlock(
aa10: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 ) function for d
aa20: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 etails..*/.void
aa30: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 sqlite3Fts3Segme
aa40: 6e 74 73 43 6c 6f 73 65 28 46 74 73 33 54 61 62 ntsClose(Fts3Tab
aa50: 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 le *p){. sqlite
aa60: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 3_blob_close(p->
aa70: 70 53 65 67 6d 65 6e 74 73 29 3b 0a 20 20 70 2d pSegments);. p-
aa80: 3e 70 53 65 67 6d 65 6e 74 73 20 3d 20 30 3b 0a >pSegments = 0;.
aa90: 7d 0a 20 20 20 20 0a 73 74 61 74 69 63 20 69 6e }. .static in
aaa0: 74 20 66 74 73 33 53 65 67 52 65 61 64 65 72 49 t fts3SegReaderI
aab0: 6e 63 72 52 65 61 64 28 46 74 73 33 53 65 67 52 ncrRead(Fts3SegR
aac0: 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 29 7b eader *pReader){
aad0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 . int nRead;
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
aaf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
ab00: 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f bytes to read */
ab10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 . int rc;
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ab30: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 /* Return cod
ab40: 65 20 2a 2f 0a 0a 20 20 6e 52 65 61 64 20 3d 20 e */.. nRead =
ab50: 4d 49 4e 28 70 52 65 61 64 65 72 2d 3e 6e 4e 6f MIN(pReader->nNo
ab60: 64 65 20 2d 20 70 52 65 61 64 65 72 2d 3e 6e 50 de - pReader->nP
ab70: 6f 70 75 6c 61 74 65 2c 20 46 54 53 33 5f 4e 4f opulate, FTS3_NO
ab80: 44 45 5f 43 48 55 4e 4b 53 49 5a 45 29 3b 0a 20 DE_CHUNKSIZE);.
ab90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c rc = sqlite3_bl
aba0: 6f 62 5f 72 65 61 64 28 0a 20 20 20 20 20 20 70 ob_read(. p
abb0: 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 2c 20 0a Reader->pBlob, .
abc0: 20 20 20 20 20 20 26 70 52 65 61 64 65 72 2d 3e &pReader->
abd0: 61 4e 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e aNode[pReader->n
abe0: 50 6f 70 75 6c 61 74 65 5d 2c 0a 20 20 20 20 20 Populate],.
abf0: 20 6e 52 65 61 64 2c 0a 20 20 20 20 20 20 70 52 nRead,. pR
ac00: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 eader->nPopulate
ac10: 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d . );.. if( rc=
ac20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
ac30: 20 20 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 75 pReader->nPopu
ac40: 6c 61 74 65 20 2b 3d 20 6e 52 65 61 64 3b 0a 20 late += nRead;.
ac50: 20 20 20 6d 65 6d 73 65 74 28 26 70 52 65 61 64 memset(&pRead
ac60: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 er->aNode[pReade
ac70: 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 5d 2c 20 30 r->nPopulate], 0
ac80: 2c 20 46 54 53 33 5f 4e 4f 44 45 5f 50 41 44 44 , FTS3_NODE_PADD
ac90: 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 52 ING);. if( pR
aca0: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 eader->nPopulate
acb0: 3d 3d 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 ==pReader->nNode
acc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
acd0: 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 3_blob_close(pRe
ace0: 61 64 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 ader->pBlob);.
acf0: 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c pReader->pBl
ad00: 6f 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 52 ob = 0;. pR
ad10: 65 61 64 65 72 2d 3e 6e 50 6f 70 75 6c 61 74 65 eader->nPopulate
ad20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a = 0;. }. }.
ad30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
ad40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 static int fts3S
ad50: 65 67 52 65 61 64 65 72 52 65 71 75 69 72 65 28 egReaderRequire(
ad60: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 Fts3SegReader *p
ad70: 52 65 61 64 65 72 2c 20 63 68 61 72 20 2a 70 46 Reader, char *pF
ad80: 72 6f 6d 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b rom, int nByte){
ad90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
ada0: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 TE_OK;. assert(
adb0: 20 21 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 !pReader->pBlob
adc0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 46 72 . || (pFr
add0: 6f 6d 3e 3d 70 52 65 61 64 65 72 2d 3e 61 4e 6f om>=pReader->aNo
ade0: 64 65 20 26 26 20 70 46 72 6f 6d 3c 26 70 52 65 de && pFrom<&pRe
adf0: 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 ader->aNode[pRea
ae00: 64 65 72 2d 3e 6e 4e 6f 64 65 5d 29 0a 20 20 29 der->nNode]). )
ae10: 3b 0a 20 20 77 68 69 6c 65 28 20 70 52 65 61 64 ;. while( pRead
ae20: 65 72 2d 3e 70 42 6c 6f 62 20 26 26 20 72 63 3d er->pBlob && rc=
ae30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 =SQLITE_OK .
ae40: 20 26 26 20 20 28 70 46 72 6f 6d 20 2d 20 70 52 && (pFrom - pR
ae50: 65 61 64 65 72 2d 3e 61 4e 6f 64 65 20 2b 20 6e eader->aNode + n
ae60: 42 79 74 65 29 3e 70 52 65 61 64 65 72 2d 3e 6e Byte)>pReader->n
ae70: 50 6f 70 75 6c 61 74 65 0a 20 20 29 7b 0a 20 20 Populate. ){.
ae80: 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 rc = fts3SegRe
ae90: 61 64 65 72 49 6e 63 72 52 65 61 64 28 70 52 65 aderIncrRead(pRe
aea0: 61 64 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 ader);. }. ret
aeb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
aec0: 20 53 65 74 20 61 6e 20 46 74 73 33 53 65 67 52 Set an Fts3SegR
aed0: 65 61 64 65 72 20 63 75 72 73 6f 72 20 74 6f 20 eader cursor to
aee0: 70 6f 69 6e 74 20 61 74 20 45 4f 46 2e 0a 2a 2f point at EOF..*/
aef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 .static void fts
af00: 33 53 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 3SegReaderSetEof
af10: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a (Fts3SegReader *
af20: 70 53 65 67 29 7b 0a 20 20 69 66 28 20 21 66 74 pSeg){. if( !ft
af30: 73 33 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f s3SegReaderIsRoo
af40: 74 4f 6e 6c 79 28 70 53 65 67 29 20 29 7b 0a 20 tOnly(pSeg) ){.
af50: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
af60: 70 53 65 67 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 pSeg->aNode);.
af70: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 sqlite3_blob_c
af80: 6c 6f 73 65 28 70 53 65 67 2d 3e 70 42 6c 6f 62 lose(pSeg->pBlob
af90: 29 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 42 6c );. pSeg->pBl
afa0: 6f 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 ob = 0;. }. pS
afb0: 65 67 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 7d eg->aNode = 0;.}
afc0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 ../*.** Move the
afd0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 iterator passed
afe0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 as the first ar
aff0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 gument to the ne
b000: 78 74 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a xt term in the.*
b010: 2a 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 73 75 * segment. If su
b020: 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 ccessful, SQLITE
b030: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e _OK is returned.
b040: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 If there is no
b050: 6e 65 78 74 20 74 65 72 6d 2c 0a 2a 2a 20 53 51 next term,.** SQ
b060: 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 74 68 65 72 LITE_DONE. Other
b070: 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 wise, an SQLite
b080: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 error code..*/.s
b090: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 tatic int fts3Se
b0a0: 67 52 65 61 64 65 72 4e 65 78 74 28 0a 20 20 46 gReaderNext(. F
b0b0: 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a 20 20 ts3Table *p, .
b0c0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 Fts3SegReader *p
b0d0: 52 65 61 64 65 72 2c 0a 20 20 69 6e 74 20 62 49 Reader,. int bI
b0e0: 6e 63 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b ncr.){. int rc;
b0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b100: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
b110: 72 6e 20 63 6f 64 65 20 6f 66 20 76 61 72 69 6f rn code of vario
b120: 75 73 20 73 75 62 2d 72 6f 75 74 69 6e 65 73 20 us sub-routines
b130: 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4e 65 78 74 */. char *pNext
b140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
b150: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 76 /* Cursor v
b160: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 ariable */. int
b170: 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 nPrefix;
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
b190: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
b1a0: 69 6e 20 74 65 72 6d 20 70 72 65 66 69 78 20 2a in term prefix *
b1b0: 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b /. int nSuffix;
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b1d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
b1e0: 20 62 79 74 65 73 20 69 6e 20 74 65 72 6d 20 73 bytes in term s
b1f0: 75 66 66 69 78 20 2a 2f 0a 0a 20 20 69 66 28 20 uffix */.. if(
b200: 21 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 !pReader->aDocli
b210: 73 74 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 st ){. pNext
b220: 3d 20 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 = pReader->aNode
b230: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 ;. }else{. p
b240: 4e 65 78 74 20 3d 20 26 70 52 65 61 64 65 72 2d Next = &pReader-
b250: 3e 61 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 >aDoclist[pReade
b260: 72 2d 3e 6e 44 6f 63 6c 69 73 74 5d 3b 0a 20 20 r->nDoclist];.
b270: 7d 0a 0a 20 20 69 66 28 20 21 70 4e 65 78 74 20 }.. if( !pNext
b280: 7c 7c 20 70 4e 65 78 74 3e 3d 26 70 52 65 61 64 || pNext>=&pRead
b290: 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 65 er->aNode[pReade
b2a0: 72 2d 3e 6e 4e 6f 64 65 5d 20 29 7b 0a 0a 20 20 r->nNode] ){..
b2b0: 20 20 69 66 28 20 66 74 73 33 53 65 67 52 65 61 if( fts3SegRea
b2c0: 64 65 72 49 73 50 65 6e 64 69 6e 67 28 70 52 65 derIsPending(pRe
b2d0: 61 64 65 72 29 20 29 7b 0a 20 20 20 20 20 20 46 ader) ){. F
b2e0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c ts3HashElem *pEl
b2f0: 65 6d 20 3d 20 2a 28 70 52 65 61 64 65 72 2d 3e em = *(pReader->
b300: 70 70 4e 65 78 74 45 6c 65 6d 29 3b 0a 20 20 20 ppNextElem);.
b310: 20 20 20 69 66 28 20 70 45 6c 65 6d 3d 3d 30 20 if( pElem==0
b320: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 ){. pRead
b330: 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 er->aNode = 0;.
b340: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
b350: 20 20 20 20 50 65 6e 64 69 6e 67 4c 69 73 74 20 PendingList
b360: 2a 70 4c 69 73 74 20 3d 20 28 50 65 6e 64 69 6e *pList = (Pendin
b370: 67 4c 69 73 74 20 2a 29 66 74 73 33 48 61 73 68 gList *)fts3Hash
b380: 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 Data(pElem);.
b390: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 7a 54 pReader->zT
b3a0: 65 72 6d 20 3d 20 28 63 68 61 72 20 2a 29 66 74 erm = (char *)ft
b3b0: 73 33 48 61 73 68 4b 65 79 28 70 45 6c 65 6d 29 s3HashKey(pElem)
b3c0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 ;. pReade
b3d0: 72 2d 3e 6e 54 65 72 6d 20 3d 20 66 74 73 33 48 r->nTerm = fts3H
b3e0: 61 73 68 4b 65 79 73 69 7a 65 28 70 45 6c 65 6d ashKeysize(pElem
b3f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 );. pRead
b400: 65 72 2d 3e 6e 4e 6f 64 65 20 3d 20 70 52 65 61 er->nNode = pRea
b410: 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 der->nDoclist =
b420: 70 4c 69 73 74 2d 3e 6e 44 61 74 61 20 2b 20 31 pList->nData + 1
b430: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 ;. pReade
b440: 72 2d 3e 61 4e 6f 64 65 20 3d 20 70 52 65 61 64 r->aNode = pRead
b450: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 70 er->aDoclist = p
b460: 4c 69 73 74 2d 3e 61 44 61 74 61 3b 0a 20 20 20 List->aData;.
b470: 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 70 pReader->pp
b480: 4e 65 78 74 45 6c 65 6d 2b 2b 3b 0a 20 20 20 20 NextElem++;.
b490: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 61 assert( pRea
b4a0: 64 65 72 2d 3e 61 4e 6f 64 65 20 29 3b 0a 20 20 der->aNode );.
b4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 }. retu
b4c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 rn SQLITE_OK;.
b4d0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 33 53 65 67 }.. fts3Seg
b4e0: 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 52 65 ReaderSetEof(pRe
b4f0: 61 64 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 ader);.. /* I
b500: 66 20 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e f iCurrentBlock>
b510: 3d 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 2c 20 =iLeafEndBlock,
b520: 74 68 69 73 20 69 73 20 61 6e 20 45 4f 46 20 63 this is an EOF c
b530: 6f 6e 64 69 74 69 6f 6e 2e 20 41 6c 6c 20 6c 65 ondition. All le
b540: 61 66 20 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b af . ** block
b550: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 s have already b
b560: 65 65 6e 20 74 72 61 76 65 72 73 65 64 2e 20 20 een traversed.
b570: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 */. assert( p
b580: 52 65 61 64 65 72 2d 3e 69 43 75 72 72 65 6e 74 Reader->iCurrent
b590: 42 6c 6f 63 6b 3c 3d 70 52 65 61 64 65 72 2d 3e Block<=pReader->
b5a0: 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 29 3b iLeafEndBlock );
b5b0: 0a 20 20 20 20 69 66 28 20 70 52 65 61 64 65 72 . if( pReader
b5c0: 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b 3e ->iCurrentBlock>
b5d0: 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 61 66 45 =pReader->iLeafE
b5e0: 6e 64 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 ndBlock ){.
b5f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
b600: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 K;. }.. rc
b610: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 = sqlite3Fts3Re
b620: 61 64 42 6c 6f 63 6b 28 0a 20 20 20 20 20 20 20 adBlock(.
b630: 20 70 2c 20 2b 2b 70 52 65 61 64 65 72 2d 3e 69 p, ++pReader->i
b640: 43 75 72 72 65 6e 74 42 6c 6f 63 6b 2c 20 26 70 CurrentBlock, &p
b650: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 2c 20 26 Reader->aNode, &
b660: 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 2c 20 pReader->nNode,
b670: 0a 20 20 20 20 20 20 20 20 28 62 49 6e 63 72 20 . (bIncr
b680: 3f 20 26 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 ? &pReader->nPop
b690: 75 6c 61 74 65 20 3a 20 30 29 0a 20 20 20 20 29 ulate : 0). )
b6a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 ;. if( rc!=SQ
b6b0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e LITE_OK ) return
b6c0: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 rc;. assert(
b6d0: 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 3d pReader->pBlob=
b6e0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 62 49 =0 );. if( bI
b6f0: 6e 63 72 20 26 26 20 70 52 65 61 64 65 72 2d 3e ncr && pReader->
b700: 6e 50 6f 70 75 6c 61 74 65 3c 70 52 65 61 64 65 nPopulate<pReade
b710: 72 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 r->nNode ){.
b720: 20 20 70 52 65 61 64 65 72 2d 3e 70 42 6c 6f 62 pReader->pBlob
b730: 20 3d 20 70 2d 3e 70 53 65 67 6d 65 6e 74 73 3b = p->pSegments;
b740: 0a 20 20 20 20 20 20 70 2d 3e 70 53 65 67 6d 65 . p->pSegme
b750: 6e 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 nts = 0;. }.
b760: 20 20 20 70 4e 65 78 74 20 3d 20 70 52 65 61 64 pNext = pRead
b770: 65 72 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a 0a er->aNode;. }..
b780: 20 20 61 73 73 65 72 74 28 20 21 66 74 73 33 53 assert( !fts3S
b790: 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e egReaderIsPendin
b7a0: 67 28 70 52 65 61 64 65 72 29 20 29 3b 0a 0a 20 g(pReader) );..
b7b0: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 rc = fts3SegRea
b7c0: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64 derRequire(pRead
b7d0: 65 72 2c 20 70 4e 65 78 74 2c 20 46 54 53 33 5f er, pNext, FTS3_
b7e0: 56 41 52 49 4e 54 5f 4d 41 58 2a 32 29 3b 0a 20 VARINT_MAX*2);.
b7f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
b800: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a OK ) return rc;.
b810: 20 20 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20 . /* Because
b820: 6f 66 20 74 68 65 20 46 54 53 33 5f 4e 4f 44 45 of the FTS3_NODE
b830: 5f 50 41 44 44 49 4e 47 20 62 79 74 65 73 20 6f _PADDING bytes o
b840: 66 20 70 61 64 64 69 6e 67 2c 20 74 68 65 20 66 f padding, the f
b850: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 0a 20 20 2a ollowing is . *
b860: 2a 20 73 61 66 65 20 28 6e 6f 20 72 69 73 6b 20 * safe (no risk
b870: 6f 66 20 6f 76 65 72 72 65 61 64 29 20 65 76 65 of overread) eve
b880: 6e 20 69 66 20 74 68 65 20 6e 6f 64 65 20 64 61 n if the node da
b890: 74 61 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e ta is corrupted.
b8a0: 20 2a 2f 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66 */. pNext += f
b8b0: 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 ts3GetVarint32(p
b8c0: 4e 65 78 74 2c 20 26 6e 50 72 65 66 69 78 29 3b Next, &nPrefix);
b8d0: 0a 20 20 70 4e 65 78 74 20 2b 3d 20 66 74 73 33 . pNext += fts3
b8e0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 4e 65 78 GetVarint32(pNex
b8f0: 74 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a 20 20 t, &nSuffix);.
b900: 69 66 28 20 6e 50 72 65 66 69 78 3c 30 20 7c 7c if( nPrefix<0 ||
b910: 20 6e 53 75 66 66 69 78 3c 3d 30 20 0a 20 20 20 nSuffix<=0 .
b920: 7c 7c 20 26 70 4e 65 78 74 5b 6e 53 75 66 66 69 || &pNext[nSuffi
b930: 78 5d 3e 26 70 52 65 61 64 65 72 2d 3e 61 4e 6f x]>&pReader->aNo
b940: 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 de[pReader->nNod
b950: 65 5d 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 e] . ){. ret
b960: 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f urn FTS_CORRUPT_
b970: 56 54 41 42 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 VTAB;. }.. if(
b980: 20 6e 50 72 65 66 69 78 2b 6e 53 75 66 66 69 78 nPrefix+nSuffix
b990: 3e 70 52 65 61 64 65 72 2d 3e 6e 54 65 72 6d 41 >pReader->nTermA
b9a0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 lloc ){. int
b9b0: 6e 4e 65 77 20 3d 20 28 6e 50 72 65 66 69 78 2b nNew = (nPrefix+
b9c0: 6e 53 75 66 66 69 78 29 2a 32 3b 0a 20 20 20 20 nSuffix)*2;.
b9d0: 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c char *zNew = sql
b9e0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 52 65 ite3_realloc(pRe
b9f0: 61 64 65 72 2d 3e 7a 54 65 72 6d 2c 20 6e 4e 65 ader->zTerm, nNe
ba00: 77 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4e 65 w);. if( !zNe
ba10: 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 w ){. retur
ba20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a n SQLITE_NOMEM;.
ba30: 20 20 20 20 7d 0a 20 20 20 20 70 52 65 61 64 65 }. pReade
ba40: 72 2d 3e 7a 54 65 72 6d 20 3d 20 7a 4e 65 77 3b r->zTerm = zNew;
ba50: 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 . pReader->nT
ba60: 65 72 6d 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b ermAlloc = nNew;
ba70: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 66 74 73 . }.. rc = fts
ba80: 33 53 65 67 52 65 61 64 65 72 52 65 71 75 69 72 3SegReaderRequir
ba90: 65 28 70 52 65 61 64 65 72 2c 20 70 4e 65 78 74 e(pReader, pNext
baa0: 2c 20 6e 53 75 66 66 69 78 2b 46 54 53 33 5f 56 , nSuffix+FTS3_V
bab0: 41 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 69 66 ARINT_MAX);. if
bac0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
bad0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 ) return rc;..
bae0: 6d 65 6d 63 70 79 28 26 70 52 65 61 64 65 72 2d memcpy(&pReader-
baf0: 3e 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c >zTerm[nPrefix],
bb00: 20 70 4e 65 78 74 2c 20 6e 53 75 66 66 69 78 29 pNext, nSuffix)
bb10: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 6e 54 65 ;. pReader->nTe
bb20: 72 6d 20 3d 20 6e 50 72 65 66 69 78 2b 6e 53 75 rm = nPrefix+nSu
bb30: 66 66 69 78 3b 0a 20 20 70 4e 65 78 74 20 2b 3d ffix;. pNext +=
bb40: 20 6e 53 75 66 66 69 78 3b 0a 20 20 70 4e 65 78 nSuffix;. pNex
bb50: 74 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 69 t += fts3GetVari
bb60: 6e 74 33 32 28 70 4e 65 78 74 2c 20 26 70 52 65 nt32(pNext, &pRe
bb70: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 3b ader->nDoclist);
bb80: 0a 20 20 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 . pReader->aDoc
bb90: 6c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 list = pNext;.
bba0: 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 pReader->pOffset
bbb0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 List = 0;.. /*
bbc0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 64 Check that the d
bbd0: 6f 63 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 20 oclist does not
bbe0: 61 70 70 65 61 72 20 74 6f 20 65 78 74 65 6e 64 appear to extend
bbf0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 past the end of
bc00: 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 the. ** b-tree
bc10: 20 6e 6f 64 65 2e 20 41 6e 64 20 74 68 61 74 20 node. And that
bc20: 74 68 65 20 66 69 6e 61 6c 20 62 79 74 65 20 6f the final byte o
bc30: 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 f the doclist is
bc40: 20 30 78 30 30 2e 20 49 66 20 65 69 74 68 65 72 0x00. If either
bc50: 20 0a 20 20 2a 2a 20 6f 66 20 74 68 65 73 65 20 . ** of these
bc60: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 75 6e statements is un
bc70: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 true, then the d
bc80: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73 ata structure is
bc90: 20 63 6f 72 72 75 70 74 2e 0a 20 20 2a 2f 0a 20 corrupt.. */.
bca0: 20 69 66 28 20 26 70 52 65 61 64 65 72 2d 3e 61 if( &pReader->a
bcb0: 44 6f 63 6c 69 73 74 5b 70 52 65 61 64 65 72 2d Doclist[pReader-
bcc0: 3e 6e 44 6f 63 6c 69 73 74 5d 3e 26 70 52 65 61 >nDoclist]>&pRea
bcd0: 64 65 72 2d 3e 61 4e 6f 64 65 5b 70 52 65 61 64 der->aNode[pRead
bce0: 65 72 2d 3e 6e 4e 6f 64 65 5d 20 0a 20 20 20 7c er->nNode] . |
bcf0: 7c 20 28 70 52 65 61 64 65 72 2d 3e 6e 50 6f 70 | (pReader->nPop
bd00: 75 6c 61 74 65 3d 3d 30 20 26 26 20 70 52 65 61 ulate==0 && pRea
bd10: 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 70 52 der->aDoclist[pR
bd20: 65 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2d eader->nDoclist-
bd30: 31 5d 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 1]). ){. ret
bd40: 75 72 6e 20 46 54 53 5f 43 4f 52 52 55 50 54 5f urn FTS_CORRUPT_
bd50: 56 54 41 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 VTAB;. }. retu
bd60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
bd70: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53 ./*.** Set the S
bd80: 65 67 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e egReader to poin
bd90: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 64 t to the first d
bda0: 6f 63 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c ocid in the docl
bdb0: 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 0a 2a ist associated.*
bdc0: 2a 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 * with the curre
bdd0: 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 nt term..*/.stat
bde0: 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 52 65 ic int fts3SegRe
bdf0: 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 46 aderFirstDocid(F
be00: 74 73 33 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 ts3Table *pTab,
be10: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 Fts3SegReader *p
be20: 52 65 61 64 65 72 29 7b 0a 20 20 69 6e 74 20 72 Reader){. int r
be30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 c = SQLITE_OK;.
be40: 20 61 73 73 65 72 74 28 20 70 52 65 61 64 65 72 assert( pReader
be50: 2d 3e 61 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 ->aDoclist );.
be60: 61 73 73 65 72 74 28 20 21 70 52 65 61 64 65 72 assert( !pReader
be70: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 29 3b ->pOffsetList );
be80: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 62 44 65 . if( pTab->bDe
be90: 73 63 49 64 78 20 26 26 20 66 74 73 33 53 65 67 scIdx && fts3Seg
bea0: 52 65 61 64 65 72 49 73 50 65 6e 64 69 6e 67 28 ReaderIsPending(
beb0: 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 20 20 pReader) ){.
bec0: 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20 u8 bEof = 0;.
bed0: 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 pReader->iDocid
bee0: 20 3d 20 30 3b 0a 20 20 20 20 70 52 65 61 64 65 = 0;. pReade
bef0: 72 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d r->nOffsetList =
bf00: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 0;. sqlite3F
bf10: 74 73 33 44 6f 63 6c 69 73 74 50 72 65 76 28 30 ts3DoclistPrev(0
bf20: 2c 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 ,. pReade
bf30: 72 2d 3e 61 44 6f 63 6c 69 73 74 2c 20 70 52 65 r->aDoclist, pRe
bf40: 61 64 65 72 2d 3e 6e 44 6f 63 6c 69 73 74 2c 20 ader->nDoclist,
bf50: 26 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 &pReader->pOffse
bf60: 74 4c 69 73 74 2c 20 0a 20 20 20 20 20 20 20 20 tList, .
bf70: 26 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 &pReader->iDocid
bf80: 2c 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66 66 , &pReader->nOff
bf90: 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a 20 setList, &bEof.
bfa0: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 );. }else{.
bfb0: 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 rc = fts3SegR
bfc0: 65 61 64 65 72 52 65 71 75 69 72 65 28 70 52 65 eaderRequire(pRe
bfd0: 61 64 65 72 2c 20 70 52 65 61 64 65 72 2d 3e 61 ader, pReader->a
bfe0: 44 6f 63 6c 69 73 74 2c 20 46 54 53 33 5f 56 41 Doclist, FTS3_VA
bff0: 52 49 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 69 RINT_MAX);. i
c000: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
c010: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 ){. int n
c020: 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 = sqlite3Fts3Get
c030: 56 61 72 69 6e 74 28 70 52 65 61 64 65 72 2d 3e Varint(pReader->
c040: 61 44 6f 63 6c 69 73 74 2c 20 26 70 52 65 61 64 aDoclist, &pRead
c050: 65 72 2d 3e 69 44 6f 63 69 64 29 3b 0a 20 20 20 er->iDocid);.
c060: 20 20 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 pReader->pOff
c070: 73 65 74 4c 69 73 74 20 3d 20 26 70 52 65 61 64 setList = &pRead
c080: 65 72 2d 3e 61 44 6f 63 6c 69 73 74 5b 6e 5d 3b er->aDoclist[n];
c090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
c0a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
c0b0: 20 41 64 76 61 6e 63 65 20 74 68 65 20 53 65 67 Advance the Seg
c0c0: 52 65 61 64 65 72 20 74 6f 20 70 6f 69 6e 74 20 Reader to point
c0d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 6f 63 69 to the next doci
c0e0: 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 d in the doclist
c0f0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 .** associated w
c100: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 ith the current
c110: 74 65 72 6d 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 term..** .** If
c120: 61 72 67 75 6d 65 6e 74 73 20 70 70 4f 66 66 73 arguments ppOffs
c130: 65 74 4c 69 73 74 20 61 6e 64 20 70 6e 4f 66 66 etList and pnOff
c140: 73 65 74 4c 69 73 74 20 61 72 65 20 6e 6f 74 20 setList are not
c150: 4e 55 4c 4c 2c 20 74 68 65 6e 20 0a 2a 2a 20 2a NULL, then .** *
c160: 70 70 4f 66 66 73 65 74 4c 69 73 74 20 69 73 20 ppOffsetList is
c170: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 set to point to
c180: 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e the first column
c190: 2d 6f 66 66 73 65 74 20 6c 69 73 74 0a 2a 2a 20 -offset list.**
c1a0: 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 65 in the doclist e
c1b0: 6e 74 72 79 20 28 69 2e 65 2e 20 69 6d 6d 65 64 ntry (i.e. immed
c1c0: 69 61 74 65 6c 79 20 70 61 73 74 20 74 68 65 20 iately past the
c1d0: 64 6f 63 69 64 20 76 61 72 69 6e 74 29 2e 0a 2a docid varint)..*
c1e0: 2a 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 74 20 * *pnOffsetList
c1f0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 65 is set to the le
c200: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 65 74 20 ngth of the set
c210: 6f 66 20 63 6f 6c 75 6d 6e 2d 6f 66 66 73 65 74 of column-offset
c220: 0a 2a 2a 20 6c 69 73 74 73 2c 20 6e 6f 74 20 69 .** lists, not i
c230: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 75 6c ncluding the nul
c240: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 -terminator byte
c250: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a . For example:.*
c260: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 /.static int fts
c270: 33 53 65 67 52 65 61 64 65 72 4e 65 78 74 44 6f 3SegReaderNextDo
c280: 63 69 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 cid(. Fts3Table
c290: 20 2a 70 54 61 62 2c 0a 20 20 46 74 73 33 53 65 *pTab,. Fts3Se
c2a0: 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 72 gReader *pReader
c2b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 , /* Rea
c2c0: 64 65 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 der to advance t
c2d0: 6f 20 6e 65 78 74 20 64 6f 63 69 64 20 2a 2f 0a o next docid */.
c2e0: 20 20 63 68 61 72 20 2a 2a 70 70 4f 66 66 73 65 char **ppOffse
c2f0: 74 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 tList,
c300: 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 /* OUT: Pointe
c310: 72 20 74 6f 20 63 75 72 72 65 6e 74 20 70 6f 73 r to current pos
c320: 69 74 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 20 20 ition-list */.
c330: 69 6e 74 20 2a 70 6e 4f 66 66 73 65 74 4c 69 73 int *pnOffsetLis
c340: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t
c350: 2f 2a 20 4f 55 54 3a 20 4c 65 6e 67 74 68 20 6f /* OUT: Length o
c360: 66 20 2a 70 70 4f 66 66 73 65 74 4c 69 73 74 20 f *ppOffsetList
c370: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 in bytes */.){.
c380: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
c390: 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d _OK;. char *p =
c3a0: 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 73 65 pReader->pOffse
c3b0: 74 4c 69 73 74 3b 0a 20 20 63 68 61 72 20 63 20 tList;. char c
c3c0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 = 0;.. assert(
c3d0: 70 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 p );.. if( pTab
c3e0: 2d 3e 62 44 65 73 63 49 64 78 20 26 26 20 66 74 ->bDescIdx && ft
c3f0: 73 33 53 65 67 52 65 61 64 65 72 49 73 50 65 6e s3SegReaderIsPen
c400: 64 69 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b ding(pReader) ){
c410: 0a 20 20 20 20 2f 2a 20 41 20 70 65 6e 64 69 6e . /* A pendin
c420: 67 2d 74 65 72 6d 73 20 73 65 67 2d 72 65 61 64 g-terms seg-read
c430: 65 72 20 66 6f 72 20 61 6e 20 46 54 53 34 20 74 er for an FTS4 t
c440: 61 62 6c 65 20 74 68 61 74 20 75 73 65 73 20 6f able that uses o
c450: 72 64 65 72 3d 64 65 73 63 2e 0a 20 20 20 20 2a rder=desc.. *
c460: 2a 20 50 65 6e 64 69 6e 67 2d 74 65 72 6d 73 20 * Pending-terms
c470: 64 6f 63 6c 69 73 74 73 20 61 72 65 20 61 6c 77 doclists are alw
c480: 61 79 73 20 62 75 69 6c 74 20 75 70 20 69 6e 20 ays built up in
c490: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2c ascending order,
c4a0: 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 so. ** we ha
c4b0: 76 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 ve to iterate th
c4c0: 72 6f 75 67 68 20 74 68 65 6d 20 62 61 63 6b 77 rough them backw
c4d0: 61 72 64 73 20 68 65 72 65 2e 20 2a 2f 0a 20 20 ards here. */.
c4e0: 20 20 75 38 20 62 45 6f 66 20 3d 20 30 3b 0a 20 u8 bEof = 0;.
c4f0: 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c if( ppOffsetL
c500: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 ist ){. *pp
c510: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65 OffsetList = pRe
c520: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 ader->pOffsetLis
c530: 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73 t;. *pnOffs
c540: 65 74 4c 69 73 74 20 3d 20 70 52 65 61 64 65 72 etList = pReader
c550: 2d 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 2d 20 ->nOffsetList -
c560: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 1;. }. sql
c570: 69 74 65 33 46 74 73 33 44 6f 63 6c 69 73 74 50 ite3Fts3DoclistP
c580: 72 65 76 28 30 2c 0a 20 20 20 20 20 20 20 20 70 rev(0,. p
c590: 52 65 61 64 65 72 2d 3e 61 44 6f 63 6c 69 73 74 Reader->aDoclist
c5a0: 2c 20 70 52 65 61 64 65 72 2d 3e 6e 44 6f 63 6c , pReader->nDocl
c5b0: 69 73 74 2c 20 26 70 2c 20 26 70 52 65 61 64 65 ist, &p, &pReade
c5c0: 72 2d 3e 69 44 6f 63 69 64 2c 0a 20 20 20 20 20 r->iDocid,.
c5d0: 20 20 20 26 70 52 65 61 64 65 72 2d 3e 6e 4f 66 &pReader->nOf
c5e0: 66 73 65 74 4c 69 73 74 2c 20 26 62 45 6f 66 0a fsetList, &bEof.
c5f0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 62 );. if( b
c600: 45 6f 66 20 29 7b 0a 20 20 20 20 20 20 70 52 65 Eof ){. pRe
c610: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 ader->pOffsetLis
c620: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 t = 0;. }else
c630: 7b 0a 20 20 20 20 20 20 70 52 65 61 64 65 72 2d {. pReader-
c640: 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 >pOffsetList = p
c650: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b ;. }. }else{
c660: 0a 20 20 20 20 63 68 61 72 20 2a 70 45 6e 64 20 . char *pEnd
c670: 3d 20 26 70 52 65 61 64 65 72 2d 3e 61 44 6f 63 = &pReader->aDoc
c680: 6c 69 73 74 5b 70 52 65 61 64 65 72 2d 3e 6e 44 list[pReader->nD
c690: 6f 63 6c 69 73 74 5d 3b 0a 0a 20 20 20 20 2f 2a oclist];.. /*
c6a0: 20 50 6f 69 6e 74 65 72 20 70 20 63 75 72 72 65 Pointer p curre
c6b0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 61 74 20 74 ntly points at t
c6c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 he first byte of
c6d0: 20 61 6e 20 6f 66 66 73 65 74 20 6c 69 73 74 2e an offset list.
c6e0: 20 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c The. ** foll
c6f0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 61 64 76 61 owing block adva
c700: 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e 74 nces it to point
c710: 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20 74 one byte past t
c720: 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a he end of. **
c730: 20 74 68 65 20 73 61 6d 65 20 6f 66 66 73 65 74 the same offset
c740: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 77 68 list. */. wh
c750: 69 6c 65 28 20 31 20 29 7b 0a 20 20 0a 20 20 20 ile( 1 ){. .
c760: 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 /* The follow
c770: 69 6e 67 20 6c 69 6e 65 20 6f 66 20 63 6f 64 65 ing line of code
c780: 20 28 61 6e 64 20 74 68 65 20 22 70 2b 2b 22 20 (and the "p++"
c790: 62 65 6c 6f 77 20 74 68 65 20 77 68 69 6c 65 28 below the while(
c7a0: 29 20 6c 6f 6f 70 29 20 69 73 0a 20 20 20 20 20 ) loop) is.
c7b0: 20 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 6c 6c ** normally all
c7c0: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 that is require
c7d0: 64 20 74 6f 20 6d 6f 76 65 20 70 6f 69 6e 74 65 d to move pointe
c7e0: 72 20 70 20 74 6f 20 74 68 65 20 64 65 73 69 72 r p to the desir
c7f0: 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 ed . ** pos
c800: 69 74 69 6f 6e 2e 20 54 68 65 20 65 78 63 65 70 ition. The excep
c810: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 69 73 20 tion is if this
c820: 6e 6f 64 65 20 69 73 20 62 65 69 6e 67 20 6c 6f node is being lo
c830: 61 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 0a 20 aded from disk.
c840: 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e ** incremen
c850: 74 61 6c 6c 79 20 61 6e 64 20 70 6f 69 6e 74 65 tally and pointe
c860: 72 20 22 70 22 20 6e 6f 77 20 70 6f 69 6e 74 73 r "p" now points
c870: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 to the first by
c880: 74 65 20 70 61 73 74 0a 20 20 20 20 20 20 2a 2a te past. **
c890: 20 74 68 65 20 70 6f 70 75 6c 61 74 65 64 20 70 the populated p
c8a0: 61 72 74 20 6f 66 20 70 52 65 61 64 65 72 2d 3e art of pReader->
c8b0: 61 4e 6f 64 65 5b 5d 2e 0a 20 20 20 20 20 20 2a aNode[].. *
c8c0: 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a /. while( *
c8d0: 70 20 7c 20 63 20 29 20 63 20 3d 20 2a 70 2b 2b p | c ) c = *p++
c8e0: 20 26 20 30 78 38 30 3b 0a 20 20 20 20 20 20 61 & 0x80;. a
c8f0: 73 73 65 72 74 28 20 2a 70 3d 3d 30 20 29 3b 0a ssert( *p==0 );.
c900: 20 20 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 . if( pRe
c910: 61 64 65 72 2d 3e 70 42 6c 6f 62 3d 3d 30 20 7c ader->pBlob==0 |
c920: 7c 20 70 3c 26 70 52 65 61 64 65 72 2d 3e 61 4e | p<&pReader->aN
c930: 6f 64 65 5b 70 52 65 61 64 65 72 2d 3e 6e 50 6f ode[pReader->nPo
c940: 70 75 6c 61 74 65 5d 20 29 20 62 72 65 61 6b 3b pulate] ) break;
c950: 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 . rc = fts3
c960: 53 65 67 52 65 61 64 65 72 49 6e 63 72 52 65 61 SegReaderIncrRea
c970: 64 28 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 d(pReader);.
c980: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
c990: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b _OK ) return rc;
c9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2b 2b 3b 0a . }. p++;.
c9b0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 72 65 71 . /* If req
c9c0: 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 uired, populate
c9d0: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 the output varia
c9e0: 62 6c 65 73 20 77 69 74 68 20 61 20 70 6f 69 6e bles with a poin
c9f0: 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65 0a 20 ter to and the.
ca00: 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 ** size of th
ca10: 65 20 70 72 65 76 69 6f 75 73 20 6f 66 66 73 65 e previous offse
ca20: 74 2d 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 t-list.. */.
ca30: 20 20 20 69 66 28 20 70 70 4f 66 66 73 65 74 4c if( ppOffsetL
ca40: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 ist ){. *pp
ca50: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 70 52 65 OffsetList = pRe
ca60: 61 64 65 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 ader->pOffsetLis
ca70: 74 3b 0a 20 20 20 20 20 20 2a 70 6e 4f 66 66 73 t;. *pnOffs
ca80: 65 74 4c 69 73 74 20 3d 20 28 69 6e 74 29 28 70 etList = (int)(p
ca90: 20 2d 20 70 52 65 61 64 65 72 2d 3e 70 4f 66 66 - pReader->pOff
caa0: 73 65 74 4c 69 73 74 20 2d 20 31 29 3b 0a 20 20 setList - 1);.
cab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 73 74 }.. /* List
cac0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 65 may have been e
cad0: 64 69 74 65 64 20 69 6e 20 70 6c 61 63 65 20 62 dited in place b
cae0: 79 20 66 74 73 33 45 76 61 6c 4e 65 61 72 54 72 y fts3EvalNearTr
caf0: 69 6d 28 29 20 2a 2f 0a 20 20 20 20 77 68 69 6c im() */. whil
cb00: 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70 3d e( p<pEnd && *p=
cb10: 3d 30 20 29 20 70 2b 2b 3b 0a 20 20 0a 20 20 20 =0 ) p++;. .
cb20: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 /* If there are
cb30: 20 6e 6f 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 no more entries
cb40: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c in the doclist,
cb50: 20 73 65 74 20 70 4f 66 66 73 65 74 4c 69 73 74 set pOffsetList
cb60: 20 74 6f 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e to. ** NULL.
cb70: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 Otherwise, set
cb80: 46 74 73 33 53 65 67 52 65 61 64 65 72 2e 69 44 Fts3SegReader.iD
cb90: 6f 63 69 64 20 74 6f 20 74 68 65 20 6e 65 78 74 ocid to the next
cba0: 20 64 6f 63 69 64 20 61 6e 64 0a 20 20 20 20 2a docid and. *
cbb0: 2a 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e * Fts3SegReader.
cbc0: 70 4f 66 66 73 65 74 4c 69 73 74 20 74 6f 20 70 pOffsetList to p
cbd0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 oint to the next
cbe0: 20 6f 66 66 73 65 74 20 6c 69 73 74 20 62 65 66 offset list bef
cbf0: 6f 72 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 ore. ** retur
cc00: 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 ning.. */.
cc10: 20 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 7b 0a if( p>=pEnd ){.
cc20: 20 20 20 20 20 20 70 52 65 61 64 65 72 2d 3e 70 pReader->p
cc30: 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 3b 0a OffsetList = 0;.
cc40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
cc50: 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 rc = fts3SegRea
cc60: 64 65 72 52 65 71 75 69 72 65 28 70 52 65 61 64 derRequire(pRead
cc70: 65 72 2c 20 70 2c 20 46 54 53 33 5f 56 41 52 49 er, p, FTS3_VARI
cc80: 4e 54 5f 4d 41 58 29 3b 0a 20 20 20 20 20 20 69 NT_MAX);. i
cc90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
cca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
ccb0: 74 65 33 5f 69 6e 74 36 34 20 69 44 65 6c 74 61 te3_int64 iDelta
ccc0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 61 64 65 ;. pReade
ccd0: 72 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 20 3d r->pOffsetList =
cce0: 20 70 20 2b 20 73 71 6c 69 74 65 33 46 74 73 33 p + sqlite3Fts3
ccf0: 47 65 74 56 61 72 69 6e 74 28 70 2c 20 26 69 44 GetVarint(p, &iD
cd00: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 elta);. i
cd10: 66 28 20 70 54 61 62 2d 3e 62 44 65 73 63 49 64 f( pTab->bDescId
cd20: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 x ){. p
cd30: 52 65 61 64 65 72 2d 3e 69 44 6f 63 69 64 20 2d Reader->iDocid -
cd40: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 = iDelta;.
cd50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
cd60: 20 20 20 70 52 65 61 64 65 72 2d 3e 69 44 6f 63 pReader->iDoc
cd70: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 id += iDelta;.
cd80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
cd90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 }. }.. ret
cda0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
cdb0: 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 ...int sqlite3Ft
cdc0: 73 33 4d 73 72 4f 76 66 6c 28 0a 20 20 46 74 73 s3MsrOvfl(. Fts
cdd0: 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 3Cursor *pCsr, .
cde0: 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 Fts3MultiSegRe
cdf0: 61 64 65 72 20 2a 70 4d 73 72 2c 0a 20 20 69 6e ader *pMsr,. in
ce00: 74 20 2a 70 6e 4f 76 66 6c 0a 29 7b 0a 20 20 46 t *pnOvfl.){. F
ce10: 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 ts3Table *p = (F
ce20: 74 73 33 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e ts3Table*)pCsr->
ce30: 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 69 6e base.pVtab;. in
ce40: 74 20 6e 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 t nOvfl = 0;. i
ce50: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 20 nt ii;. int rc
ce60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 = SQLITE_OK;. i
ce70: 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 6e 50 67 nt pgsz = p->nPg
ce80: 73 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 sz;.. assert( p
ce90: 2d 3e 62 46 74 73 34 20 29 3b 0a 20 20 61 73 73 ->bFts4 );. ass
cea0: 65 72 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 0a ert( pgsz>0 );..
ceb0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d for(ii=0; rc==
cec0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c SQLITE_OK && ii<
ced0: 70 4d 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 pMsr->nSegment;
cee0: 69 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 33 53 ii++){. Fts3S
cef0: 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 65 egReader *pReade
cf00: 72 20 3d 20 70 4d 73 72 2d 3e 61 70 53 65 67 6d r = pMsr->apSegm
cf10: 65 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 ent[ii];. if(
cf20: 20 21 66 74 73 33 53 65 67 52 65 61 64 65 72 49 !fts3SegReaderI
cf30: 73 50 65 6e 64 69 6e 67 28 70 52 65 61 64 65 72 sPending(pReader
cf40: 29 20 0a 20 20 20 20 20 26 26 20 21 66 74 73 33 ) . && !fts3
cf50: 53 65 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f SegReaderIsRootO
cf60: 6e 6c 79 28 70 52 65 61 64 65 72 29 20 0a 20 20 nly(pReader) .
cf70: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
cf80: 65 33 5f 69 6e 74 36 34 20 6a 6a 3b 0a 20 20 20 e3_int64 jj;.
cf90: 20 20 20 66 6f 72 28 6a 6a 3d 70 52 65 61 64 65 for(jj=pReade
cfa0: 72 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 3b 20 r->iStartBlock;
cfb0: 6a 6a 3c 3d 70 52 65 61 64 65 72 2d 3e 69 4c 65 jj<=pReader->iLe
cfc0: 61 66 45 6e 64 42 6c 6f 63 6b 3b 20 6a 6a 2b 2b afEndBlock; jj++
cfd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e ){. int n
cfe0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 72 63 Blob;. rc
cff0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 = sqlite3Fts3Re
d000: 61 64 42 6c 6f 63 6b 28 70 2c 20 6a 6a 2c 20 30 adBlock(p, jj, 0
d010: 2c 20 26 6e 42 6c 6f 62 2c 20 30 29 3b 0a 20 20 , &nBlob, 0);.
d020: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
d030: 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b LITE_OK ) break;
d040: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 42 . if( (nB
d050: 6c 6f 62 2b 33 35 29 3e 70 67 73 7a 20 29 7b 0a lob+35)>pgsz ){.
d060: 20 20 20 20 20 20 20 20 20 20 6e 4f 76 66 6c 20 nOvfl
d070: 2b 3d 20 28 6e 42 6c 6f 62 20 2b 20 33 34 29 2f += (nBlob + 34)/
d080: 70 67 73 7a 3b 0a 20 20 20 20 20 20 20 20 7d 0a pgsz;. }.
d090: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
d0a0: 7d 0a 20 20 2a 70 6e 4f 76 66 6c 20 3d 20 6e 4f }. *pnOvfl = nO
d0b0: 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 vfl;. return rc
d0c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 ;.}../*.** Free
d0d0: 61 6c 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 all allocations
d0e0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
d0f0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 the iterator pas
d100: 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 73 sed as the .** s
d110: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a econd argument..
d120: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 */.void sqlite3F
d130: 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65 ts3SegReaderFree
d140: 28 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a (Fts3SegReader *
d150: 70 52 65 61 64 65 72 29 7b 0a 20 20 69 66 28 20 pReader){. if(
d160: 70 52 65 61 64 65 72 20 26 26 20 21 66 74 73 33 pReader && !fts3
d170: 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 SegReaderIsPendi
d180: 6e 67 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 ng(pReader) ){.
d190: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
d1a0: 70 52 65 61 64 65 72 2d 3e 7a 54 65 72 6d 29 3b pReader->zTerm);
d1b0: 0a 20 20 20 20 69 66 28 20 21 66 74 73 33 53 65 . if( !fts3Se
d1c0: 67 52 65 61 64 65 72 49 73 52 6f 6f 74 4f 6e 6c gReaderIsRootOnl
d1d0: 79 28 70 52 65 61 64 65 72 29 20 29 7b 0a 20 20 y(pReader) ){.
d1e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
d1f0: 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 29 (pReader->aNode)
d200: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
d210: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 blob_close(pRead
d220: 65 72 2d 3e 70 42 6c 6f 62 29 3b 0a 20 20 20 20 er->pBlob);.
d230: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f }. }. sqlite3_
d240: 66 72 65 65 28 70 52 65 61 64 65 72 29 3b 0a 7d free(pReader);.}
d250: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 ../*.** Allocate
d260: 20 61 20 6e 65 77 20 53 65 67 52 65 61 64 65 72 a new SegReader
d270: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20 object..*/.int
d280: 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 sqlite3Fts3SegRe
d290: 61 64 65 72 4e 65 77 28 0a 20 20 69 6e 74 20 69 aderNew(. int i
d2a0: 41 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 Age,
d2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 /* Se
d2c0: 67 6d 65 6e 74 20 22 61 67 65 22 2e 20 2a 2f 0a gment "age". */.
d2d0: 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70 2c 20 20 int bLookup,
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d2f0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 /* True for a
d300: 6c 6f 6f 6b 75 70 20 6f 6e 6c 79 20 2a 2f 0a 20 lookup only */.
d310: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
d320: 53 74 61 72 74 4c 65 61 66 2c 20 20 20 20 20 20 StartLeaf,
d330: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 74 /* First leaf t
d340: 6f 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 o traverse */.
d350: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 sqlite3_int64 iE
d360: 6e 64 4c 65 61 66 2c 20 20 20 20 20 20 20 20 20 ndLeaf,
d370: 2f 2a 20 46 69 6e 61 6c 20 6c 65 61 66 20 74 6f /* Final leaf to
d380: 20 74 72 61 76 65 72 73 65 20 2a 2f 0a 20 20 73 traverse */. s
d390: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e qlite3_int64 iEn
d3a0: 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 2f dBlock, /
d3b0: 2a 20 46 69 6e 61 6c 20 62 6c 6f 63 6b 20 6f 66 * Final block of
d3c0: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f segment */. co
d3d0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 2c nst char *zRoot,
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
d3f0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 Buffer containi
d400: 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a ng root node */.
d410: 20 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 int nRoot,
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d430: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 /* Size of buf
d440: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 fer containing r
d450: 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 oot node */. Ft
d460: 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 70 70 s3SegReader **pp
d470: 52 65 61 64 65 72 20 20 20 20 20 20 20 20 2f 2a Reader /*
d480: 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 64 20 OUT: Allocated
d490: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2f Fts3SegReader */
d4a0: 0a 29 7b 0a 20 20 46 74 73 33 53 65 67 52 65 61 .){. Fts3SegRea
d4b0: 64 65 72 20 2a 70 52 65 61 64 65 72 3b 20 20 20 der *pReader;
d4c0: 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 /* Newly a
d4d0: 6c 6c 6f 63 61 74 65 64 20 53 65 67 52 65 61 64 llocated SegRead
d4e0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 er object */. i
d4f0: 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 nt nExtra = 0;
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
d510: 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 * Bytes to alloc
d520: 61 74 65 20 73 65 67 6d 65 6e 74 20 72 6f 6f 74 ate segment root
d530: 20 6e 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 node */.. asse
d540: 72 74 28 20 69 53 74 61 72 74 4c 65 61 66 3c 3d rt( iStartLeaf<=
d550: 69 45 6e 64 4c 65 61 66 20 29 3b 0a 20 20 69 66 iEndLeaf );. if
d560: 28 20 69 53 74 61 72 74 4c 65 61 66 3d 3d 30 20 ( iStartLeaf==0
d570: 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 ){. nExtra =
d580: 6e 52 6f 6f 74 20 2b 20 46 54 53 33 5f 4e 4f 44 nRoot + FTS3_NOD
d590: 45 5f 50 41 44 44 49 4e 47 3b 0a 20 20 7d 0a 0a E_PADDING;. }..
d5a0: 20 20 70 52 65 61 64 65 72 20 3d 20 28 46 74 73 pReader = (Fts
d5b0: 33 53 65 67 52 65 61 64 65 72 20 2a 29 73 71 6c 3SegReader *)sql
d5c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 ite3_malloc(size
d5d0: 6f 66 28 46 74 73 33 53 65 67 52 65 61 64 65 72 of(Fts3SegReader
d5e0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 ) + nExtra);. i
d5f0: 66 28 20 21 70 52 65 61 64 65 72 20 29 7b 0a 20 f( !pReader ){.
d600: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
d610: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 _NOMEM;. }. me
d620: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c mset(pReader, 0,
d630: 20 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 sizeof(Fts3SegR
d640: 65 61 64 65 72 29 29 3b 0a 20 20 70 52 65 61 64 eader));. pRead
d650: 65 72 2d 3e 69 49 64 78 20 3d 20 69 41 67 65 3b er->iIdx = iAge;
d660: 0a 20 20 70 52 65 61 64 65 72 2d 3e 62 4c 6f 6f . pReader->bLoo
d670: 6b 75 70 20 3d 20 62 4c 6f 6f 6b 75 70 21 3d 30 kup = bLookup!=0
d680: 3b 0a 20 20 70 52 65 61 64 65 72 2d 3e 69 53 74 ;. pReader->iSt
d690: 61 72 74 42 6c 6f 63 6b 20 3d 20 69 53 74 61 72 artBlock = iStar
d6a0: 74 4c 65 61 66 3b 0a 20 20 70 52 65 61 64 65 72 tLeaf;. pReader
d6b0: 2d 3e 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 20 ->iLeafEndBlock
d6c0: 3d 20 69 45 6e 64 4c 65 61 66 3b 0a 20 20 70 52 = iEndLeaf;. pR
d6d0: 65 61 64 65 72 2d 3e 69 45 6e 64 42 6c 6f 63 6b eader->iEndBlock
d6e0: 20 3d 20 69 45 6e 64 42 6c 6f 63 6b 3b 0a 0a 20 = iEndBlock;..
d6f0: 20 69 66 28 20 6e 45 78 74 72 61 20 29 7b 0a 20 if( nExtra ){.
d700: 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 /* The entire
d710: 20 73 65 67 6d 65 6e 74 20 69 73 20 73 74 6f 72 segment is stor
d720: 65 64 20 69 6e 20 74 68 65 20 72 6f 6f 74 20 6e ed in the root n
d730: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 52 65 61 ode. */. pRea
d740: 64 65 72 2d 3e 61 4e 6f 64 65 20 3d 20 28 63 68 der->aNode = (ch
d750: 61 72 20 2a 29 26 70 52 65 61 64 65 72 5b 31 5d ar *)&pReader[1]
d760: 3b 0a 20 20 20 20 70 52 65 61 64 65 72 2d 3e 72 ;. pReader->r
d770: 6f 6f 74 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 ootOnly = 1;.
d780: 20 70 52 65 61 64 65 72 2d 3e 6e 4e 6f 64 65 20 pReader->nNode
d790: 3d 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 6d 65 6d = nRoot;. mem
d7a0: 63 70 79 28 70 52 65 61 64 65 72 2d 3e 61 4e 6f cpy(pReader->aNo
d7b0: 64 65 2c 20 7a 52 6f 6f 74 2c 20 6e 52 6f 6f 74 de, zRoot, nRoot
d7c0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 );. memset(&p
d7d0: 52 65 61 64 65 72 2d 3e 61 4e 6f 64 65 5b 6e 52 Reader->aNode[nR
d7e0: 6f 6f 74 5d 2c 20 30 2c 20 46 54 53 33 5f 4e 4f oot], 0, FTS3_NO
d7f0: 44 45 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d DE_PADDING);. }
d800: 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 61 64 65 else{. pReade
d810: 72 2d 3e 69 43 75 72 72 65 6e 74 42 6c 6f 63 6b r->iCurrentBlock
d820: 20 3d 20 69 53 74 61 72 74 4c 65 61 66 2d 31 3b = iStartLeaf-1;
d830: 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 72 . }. *ppReader
d840: 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 65 = pReader;. re
d850: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
d860: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 }../*.** This is
d870: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 a comparison fu
d880: 6e 63 74 69 6f 6e 20 75 73 65 64 20 61 73 20 61 nction used as a
d890: 20 71 73 6f 72 74 28 29 20 63 61 6c 6c 62 61 63 qsort() callbac
d8a0: 6b 20 77 68 65 6e 20 73 6f 72 74 69 6e 67 0a 2a k when sorting.*
d8b0: 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 65 * an array of pe
d8c0: 6e 64 69 6e 67 20 74 65 72 6d 73 20 62 79 20 74 nding terms by t
d8d0: 65 72 6d 2e 20 54 68 69 73 20 6f 63 63 75 72 73 erm. This occurs
d8e0: 20 61 73 20 70 61 72 74 20 6f 66 20 66 6c 75 73 as part of flus
d8f0: 68 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 hing.** the cont
d900: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 65 6e 64 ents of the pend
d910: 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 ing-terms hash t
d920: 61 62 6c 65 20 74 6f 20 74 68 65 20 64 61 74 61 able to the data
d930: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 base..*/.static
d940: 69 6e 74 20 66 74 73 33 43 6f 6d 70 61 72 65 45 int fts3CompareE
d950: 6c 65 6d 42 79 54 65 72 6d 28 63 6f 6e 73 74 20 lemByTerm(const
d960: 76 6f 69 64 20 2a 6c 68 73 2c 20 63 6f 6e 73 74 void *lhs, const
d970: 20 76 6f 69 64 20 2a 72 68 73 29 7b 0a 20 20 63 void *rhs){. c
d980: 68 61 72 20 2a 7a 31 20 3d 20 66 74 73 33 48 61 har *z1 = fts3Ha
d990: 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 68 shKey(*(Fts3Hash
d9a0: 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 3b 0a 20 20 Elem **)lhs);.
d9b0: 63 68 61 72 20 2a 7a 32 20 3d 20 66 74 73 33 48 char *z2 = fts3H
d9c0: 61 73 68 4b 65 79 28 2a 28 46 74 73 33 48 61 73 ashKey(*(Fts3Has
d9d0: 68 45 6c 65 6d 20 2a 2a 29 72 68 73 29 3b 0a 20 hElem **)rhs);.
d9e0: 20 69 6e 74 20 6e 31 20 3d 20 66 74 73 33 48 61 int n1 = fts3Ha
d9f0: 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 74 73 33 shKeysize(*(Fts3
da00: 48 61 73 68 45 6c 65 6d 20 2a 2a 29 6c 68 73 29 HashElem **)lhs)
da10: 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 66 74 73 ;. int n2 = fts
da20: 33 48 61 73 68 4b 65 79 73 69 7a 65 28 2a 28 46 3HashKeysize(*(F
da30: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 72 ts3HashElem **)r
da40: 68 73 29 3b 0a 0a 20 20 69 6e 74 20 6e 20 3d 20 hs);.. int n =
da50: 28 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32 (n1<n2 ? n1 : n2
da60: 29 3b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d );. int c = mem
da70: 63 6d 70 28 7a 31 2c 20 7a 32 2c 20 6e 29 3b 0a cmp(z1, z2, n);.
da80: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 if( c==0 ){.
da90: 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32 3b 0a 20 c = n1 - n2;.
daa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d }. return c;.}
dab0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e ../*.** This fun
dac0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f ction is used to
dad0: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 20 46 74 73 allocate an Fts
dae0: 33 53 65 67 52 65 61 64 65 72 20 74 68 61 74 20 3SegReader that
daf0: 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 iterates through
db00: 0a 2a 2a 20 61 20 73 75 62 73 65 74 20 6f 66 20 .** a subset of
db10: 74 68 65 20 74 65 72 6d 73 20 73 74 6f 72 65 64 the terms stored
db20: 20 69 6e 20 74 68 65 20 46 74 73 33 54 61 62 6c in the Fts3Tabl
db30: 65 2e 70 65 6e 64 69 6e 67 54 65 72 6d 73 20 61 e.pendingTerms a
db40: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 rray..**.** If t
db50: 68 65 20 69 73 50 72 65 66 69 78 49 74 65 72 20 he isPrefixIter
db60: 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72 parameter is zer
db70: 6f 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 o, then the retu
db80: 72 6e 65 64 20 53 65 67 52 65 61 64 65 72 20 69 rned SegReader i
db90: 74 65 72 61 74 65 73 0a 2a 2a 20 74 68 72 6f 75 terates.** throu
dba0: 67 68 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 gh each term in
dbb0: 74 68 65 20 70 65 6e 64 69 6e 67 2d 74 65 72 6d the pending-term
dbc0: 73 20 74 61 62 6c 65 2e 20 4f 72 2c 20 69 66 20 s table. Or, if
dbd0: 69 73 50 72 65 66 69 78 49 74 65 72 20 69 73 0a isPrefixIter is.
dbe0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 ** non-zero, it
dbf0: 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 iterates through
dc00: 20 65 61 63 68 20 74 65 72 6d 20 61 6e 64 20 69 each term and i
dc10: 74 73 20 70 72 65 66 69 78 65 73 2e 20 46 6f 72 ts prefixes. For
dc20: 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 example, if.**
dc30: 74 68 65 20 70 65 6e 64 69 6e 67 20 74 65 72 6d the pending term
dc40: 73 20 68 61 73 68 20 74 61 62 6c 65 20 63 6f 6e s hash table con
dc50: 74 61 69 6e 73 20 74 68 65 20 74 65 72 6d 73 20 tains the terms
dc60: 22 73 71 6c 69 74 65 22 2c 20 22 6d 79 73 71 6c "sqlite", "mysql
dc70: 22 20 61 6e 64 0a 2a 2a 20 22 66 69 72 65 62 69 " and.** "firebi
dc80: 72 64 22 2c 20 74 68 65 6e 20 74 68 65 20 69 74 rd", then the it
dc90: 65 72 61 74 6f 72 20 76 69 73 69 74 73 20 74 68 erator visits th
dca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 27 74 65 72 e following 'ter
dcb0: 6d 73 27 20 28 69 6e 20 74 68 65 20 6f 72 64 65 ms' (in the orde
dcc0: 72 0a 2a 2a 20 73 68 6f 77 6e 29 3a 0a 2a 2a 0a r.** shown):.**.
dcd0: 2a 2a 20 20 20 66 20 66 69 20 66 69 72 20 66 69 ** f fi fir fi
dce0: 72 65 20 66 69 72 65 62 20 66 69 72 65 62 69 20 re fireb firebi
dcf0: 66 69 72 65 62 69 72 20 66 69 72 65 62 69 72 64 firebir firebird
dd00: 0a 2a 2a 20 20 20 6d 20 6d 79 20 6d 79 73 20 6d .** m my mys m
dd10: 79 73 71 20 6d 79 73 71 6c 0a 2a 2a 20 20 20 73 ysq mysql.** s
dd20: 20 73 71 20 73 71 6c 20 73 71 6c 69 20 73 71 6c sq sql sqli sql
dd30: 69 74 20 73 71 6c 69 74 65 0a 2a 2a 0a 2a 2a 20 it sqlite.**.**
dd40: 57 68 65 72 65 61 73 20 69 66 20 69 73 50 72 65 Whereas if isPre
dd50: 66 69 78 49 74 65 72 20 69 73 20 7a 65 72 6f 2c fixIter is zero,
dd60: 20 74 68 65 20 74 65 72 6d 73 20 76 69 73 69 74 the terms visit
dd70: 65 64 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 ed are:.**.**
dd80: 66 69 72 65 62 69 72 64 20 6d 79 73 71 6c 20 73 firebird mysql s
dd90: 71 6c 69 74 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c qlite.*/.int sql
dda0: 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 ite3Fts3SegReade
ddb0: 72 50 65 6e 64 69 6e 67 28 0a 20 20 46 74 73 33 rPending(. Fts3
ddc0: 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 Table *p,
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 /* V
dde0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e irtual table han
ddf0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e dle */. int iIn
de00: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 dex,
de10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 /* Inde
de20: 78 20 66 6f 72 20 70 2d 3e 61 49 6e 64 65 78 20 x for p->aIndex
de30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
de40: 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 *zTerm,
de50: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 /* Term to
de60: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 search for */.
de70: 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 int nTerm,
de80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
de90: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 /* Size of buffe
dea0: 72 20 7a 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 r zTerm */. int
deb0: 20 62 50 72 65 66 69 78 2c 20 20 20 20 20 20 20 bPrefix,
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
ded0: 54 72 75 65 20 66 6f 72 20 61 20 70 72 65 66 69 True for a prefi
dee0: 78 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 x iterator */.
def0: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a Fts3SegReader **
df00: 70 70 52 65 61 64 65 72 20 20 20 20 20 20 20 20 ppReader
df10: 2f 2a 20 4f 55 54 3a 20 53 65 67 52 65 61 64 65 /* OUT: SegReade
df20: 72 20 66 6f 72 20 70 65 6e 64 69 6e 67 2d 74 65 r for pending-te
df30: 72 6d 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 33 rms */.){. Fts3
df40: 53 65 67 52 65 61 64 65 72 20 2a 70 52 65 61 64 SegReader *pRead
df50: 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 er = 0; /* F
df60: 74 73 33 53 65 67 52 65 61 64 65 72 20 6f 62 6a ts3SegReader obj
df70: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f ect to return */
df80: 0a 20 20 46 74 73 33 48 61 73 68 45 6c 65 6d 20 . Fts3HashElem
df90: 2a 70 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 *pE;
dfa0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 /* Iterator v
dfb0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46 74 73 ariable */. Fts
dfc0: 33 48 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 3HashElem **aEle
dfd0: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 m = 0; /*
dfe0: 41 72 72 61 79 20 6f 66 20 74 65 72 6d 20 68 61 Array of term ha
dff0: 73 68 20 65 6e 74 72 69 65 73 20 74 6f 20 73 63 sh entries to sc
e000: 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6c 65 an */. int nEle
e010: 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 m = 0;
e020: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 /* Size
e030: 6f 66 20 61 72 72 61 79 20 61 74 20 61 45 6c 65 of array at aEle
e040: 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 m */. int rc =
e050: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 SQLITE_OK;
e060: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e /* Return
e070: 20 43 6f 64 65 20 2a 2f 0a 20 20 46 74 73 33 48 Code */. Fts3H
e080: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 ash *pHash;.. p
e090: 48 61 73 68 20 3d 20 26 70 2d 3e 61 49 6e 64 65 Hash = &p->aInde
e0a0: 78 5b 69 49 6e 64 65 78 5d 2e 68 50 65 6e 64 69 x[iIndex].hPendi
e0b0: 6e 67 3b 0a 20 20 69 66 28 20 62 50 72 65 66 69 ng;. if( bPrefi
e0c0: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 6c x ){. int nAl
e0d0: 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 loc = 0;
e0e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f /* Size o
e0f0: 66 20 61 6c 6c 6f 63 61 74 65 64 20 61 72 72 61 f allocated arra
e100: 79 20 61 74 20 61 45 6c 65 6d 20 2a 2f 0a 0a 20 y at aElem */..
e110: 20 20 20 66 6f 72 28 70 45 3d 66 74 73 33 48 61 for(pE=fts3Ha
e120: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 shFirst(pHash);
e130: 70 45 3b 20 70 45 3d 66 74 73 33 48 61 73 68 4e pE; pE=fts3HashN
e140: 65 78 74 28 70 45 29 29 7b 0a 20 20 20 20 20 20 ext(pE)){.
e150: 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 28 63 68 char *zKey = (ch
e160: 61 72 20 2a 29 66 74 73 33 48 61 73 68 4b 65 79 ar *)fts3HashKey
e170: 28 70 45 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 (pE);. int
e180: 6e 4b 65 79 20 3d 20 66 74 73 33 48 61 73 68 4b nKey = fts3HashK
e190: 65 79 73 69 7a 65 28 70 45 29 3b 0a 20 20 20 20 eysize(pE);.
e1a0: 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 30 20 7c if( nTerm==0 |
e1b0: 7c 20 28 6e 4b 65 79 3e 3d 6e 54 65 72 6d 20 26 | (nKey>=nTerm &
e1c0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4b 65 79 & 0==memcmp(zKey
e1d0: 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 29 , zTerm, nTerm))
e1e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
e1f0: 6e 45 6c 65 6d 3d 3d 6e 41 6c 6c 6f 63 20 29 7b nElem==nAlloc ){
e200: 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 33 48 . Fts3H
e210: 61 73 68 45 6c 65 6d 20 2a 2a 61 45 6c 65 6d 32 ashElem **aElem2
e220: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c ;. nAll
e230: 6f 63 20 2b 3d 20 31 36 3b 0a 20 20 20 20 20 20 oc += 16;.
e240: 20 20 20 20 61 45 6c 65 6d 32 20 3d 20 28 46 74 aElem2 = (Ft
e250: 73 33 48 61 73 68 45 6c 65 6d 20 2a 2a 29 73 71 s3HashElem **)sq
e260: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 lite3_realloc(.
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 45 6c aEl
e280: 65 6d 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f em, nAlloc*sizeo
e290: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a f(Fts3HashElem *
e2a0: 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 ). );.
e2b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61 45 if( !aE
e2c0: 6c 65 6d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 lem2 ){.
e2d0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
e2e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 NOMEM;.
e2f0: 20 20 20 6e 45 6c 65 6d 20 3d 20 30 3b 0a 20 20 nElem = 0;.
e300: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
e310: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
e320: 20 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 61 aElem = a
e330: 45 6c 65 6d 32 3b 0a 20 20 20 20 20 20 20 20 7d Elem2;. }
e340: 0a 0a 20 20 20 20 20 20 20 20 61 45 6c 65 6d 5b .. aElem[
e350: 6e 45 6c 65 6d 2b 2b 5d 20 3d 20 70 45 3b 0a 20 nElem++] = pE;.
e360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 }. }..
e370: 20 20 2f 2a 20 49 66 20 6d 6f 72 65 20 74 68 61 /* If more tha
e380: 6e 20 6f 6e 65 20 74 65 72 6d 20 6d 61 74 63 68 n one term match
e390: 65 73 20 74 68 65 20 70 72 65 66 69 78 2c 20 73 es the prefix, s
e3a0: 6f 72 74 20 74 68 65 20 46 74 73 33 48 61 73 68 ort the Fts3Hash
e3b0: 45 6c 65 6d 0a 20 20 20 20 2a 2a 20 6f 62 6a 65 Elem. ** obje
e3c0: 63 74 73 20 69 6e 20 74 65 72 6d 20 6f 72 64 65 cts in term orde
e3d0: 72 20 75 73 69 6e 67 20 71 73 6f 72 74 28 29 2e r using qsort().
e3e0: 20 54 68 69 73 20 75 73 65 73 20 74 68 65 20 73 This uses the s
e3f0: 61 6d 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 ame comparison.
e400: 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 61 ** callback a
e410: 73 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 66 s is used when f
e420: 6c 75 73 68 69 6e 67 20 74 65 72 6d 73 20 74 6f lushing terms to
e430: 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 disk.. */.
e440: 20 20 69 66 28 20 6e 45 6c 65 6d 3e 31 20 29 7b if( nElem>1 ){
e450: 0a 20 20 20 20 20 20 71 73 6f 72 74 28 61 45 6c . qsort(aEl
e460: 65 6d 2c 20 6e 45 6c 65 6d 2c 20 73 69 7a 65 6f em, nElem, sizeo
e470: 66 28 46 74 73 33 48 61 73 68 45 6c 65 6d 20 2a f(Fts3HashElem *
e480: 29 2c 20 66 74 73 33 43 6f 6d 70 61 72 65 45 6c ), fts3CompareEl
e490: 65 6d 42 79 54 65 72 6d 29 3b 0a 20 20 20 20 7d emByTerm);. }
e4a0: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f .. }else{. /
e4b0: 2a 20 54 68 65 20 71 75 65 72 79 20 69 73 20 61 * The query is a
e4c0: 20 73 69 6d 70 6c 65 20 74 65 72 6d 20 6c 6f 6f simple term loo
e4d0: 6b 75 70 20 74 68 61 74 20 6d 61 74 63 68 65 73 kup that matches
e4e0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 74 65 72 at most one ter
e4f0: 6d 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 m in. ** the
e500: 69 6e 64 65 78 2e 20 41 6c 6c 20 74 68 61 74 20 index. All that
e510: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 61 is required is a
e520: 20 73 74 72 61 69 67 68 74 20 68 61 73 68 2d 6c straight hash-l
e530: 6f 6f 6b 75 70 2e 20 0a 20 20 20 20 2a 2a 0a 20 ookup. . **.
e540: 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 ** Because th
e550: 65 20 73 74 61 63 6b 20 61 64 64 72 65 73 73 20 e stack address
e560: 6f 66 20 70 45 20 6d 61 79 20 62 65 20 61 63 63 of pE may be acc
e570: 65 73 73 65 64 20 76 69 61 20 74 68 65 20 61 45 essed via the aE
e580: 6c 65 6d 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 lem pointer.
e590: 2a 2a 20 62 65 6c 6f 77 2c 20 74 68 65 20 22 46 ** below, the "F
e5a0: 74 73 33 48 61 73 68 45 6c 65 6d 20 2a 70 45 22 ts3HashElem *pE"
e5b0: 20 6d 75 73 74 20 62 65 20 64 65 63 6c 61 72 65 must be declare
e5c0: 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 d so that it is
e5d0: 76 61 6c 69 64 0a 20 20 20 20 2a 2a 20 77 69 74 valid. ** wit
e5e0: 68 69 6e 20 74 68 69 73 20 65 6e 74 69 72 65 20 hin this entire
e5f0: 66 75 6e 63 74 69 6f 6e 2c 20 6e 6f 74 20 6a 75 function, not ju
e600: 73 74 20 74 68 69 73 20 22 65 6c 73 65 7b 2e 2e st this "else{..
e610: 2e 7d 22 20 62 6c 6f 63 6b 2e 0a 20 20 20 20 2a .}" block.. *
e620: 2f 0a 20 20 20 20 70 45 20 3d 20 66 74 73 33 48 /. pE = fts3H
e630: 61 73 68 46 69 6e 64 45 6c 65 6d 28 70 48 61 73 ashFindElem(pHas
e640: 68 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 h, zTerm, nTerm)
e650: 3b 0a 20 20 20 20 69 66 28 20 70 45 20 29 7b 0a ;. if( pE ){.
e660: 20 20 20 20 20 20 61 45 6c 65 6d 20 3d 20 26 70 aElem = &p
e670: 45 3b 0a 20 20 20 20 20 20 6e 45 6c 65 6d 20 3d E;. nElem =
e680: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 1;. }. }..
e690: 20 69 66 28 20 6e 45 6c 65 6d 3e 30 20 29 7b 0a if( nElem>0 ){.
e6a0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 int nByte =
e6b0: 73 69 7a 65 6f 66 28 46 74 73 33 53 65 67 52 65 sizeof(Fts3SegRe
e6c0: 61 64 65 72 29 20 2b 20 28 6e 45 6c 65 6d 2b 31 ader) + (nElem+1
e6d0: 29 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 61 73 )*sizeof(Fts3Has
e6e0: 68 45 6c 65 6d 20 2a 29 3b 0a 20 20 20 20 70 52 hElem *);. pR
e6f0: 65 61 64 65 72 20 3d 20 28 46 74 73 33 53 65 67 eader = (Fts3Seg
e700: 52 65 61 64 65 72 20 2a 29 73 71 6c 69 74 65 33 Reader *)sqlite3
e710: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a _malloc(nByte);.
e720: 20 20 20 20 69 66 28 20 21 70 52 65 61 64 65 72 if( !pReader
e730: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 ){. rc = S
e740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 QLITE_NOMEM;.
e750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 }else{. me
e760: 6d 73 65 74 28 70 52 65 61 64 65 72 2c 20 30 2c mset(pReader, 0,
e770: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 nByte);. p
e780: 52 65 61 64 65 72 2d 3e 69 49 64 78 20 3d 20 30 Reader->iIdx = 0
e790: 78 37 46 46 46 46 46 46 46 3b 0a 20 20 20 20 20 x7FFFFFFF;.
e7a0: 20 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 74 pReader->ppNext
e7b0: 45 6c 65 6d 20 3d 20 28 46 74 73 33 48 61 73 68 Elem = (Fts3Hash
e7c0: 45 6c 65 6d 20 2a 2a 29 26 70 52 65 61 64 65 72 Elem **)&pReader
e7d0: 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 [1];. memcp
e7e0: 79 28 70 52 65 61 64 65 72 2d 3e 70 70 4e 65 78 y(pReader->ppNex
e7f0: 74 45 6c 65 6d 2c 20 61 45 6c 65 6d 2c 20 6e 45 tElem, aElem, nE
e800: 6c 65 6d 2a 73 69 7a 65 6f 66 28 46 74 73 33 48 lem*sizeof(Fts3H
e810: 61 73 68 45 6c 65 6d 20 2a 29 29 3b 0a 20 20 20 ashElem *));.
e820: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 50 }. }.. if( bP
e830: 72 65 66 69 78 20 29 7b 0a 20 20 20 20 73 71 6c refix ){. sql
e840: 69 74 65 33 5f 66 72 65 65 28 61 45 6c 65 6d 29 ite3_free(aElem)
e850: 3b 0a 20 20 7d 0a 20 20 2a 70 70 52 65 61 64 65 ;. }. *ppReade
e860: 72 20 3d 20 70 52 65 61 64 65 72 3b 0a 20 20 72 r = pReader;. r
e870: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
e880: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 65 ** Compare the e
e890: 6e 74 72 69 65 73 20 70 6f 69 6e 74 65 64 20 74 ntries pointed t
e8a0: 6f 20 62 79 20 74 77 6f 20 46 74 73 33 53 65 67 o by two Fts3Seg
e8b0: 52 65 61 64 65 72 20 73 74 72 75 63 74 75 72 65 Reader structure
e8c0: 73 2e 20 0a 2a 2a 20 43 6f 6d 70 61 72 69 73 6f s. .** Compariso
e8d0: 6e 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a n is as follows:
e8e0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 45 4f 46 20 .**.** 1) EOF
e8f0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 is greater than
e900: 6e 6f 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 20 not EOF..**.**
e910: 20 32 29 20 54 68 65 20 63 75 72 72 65 6e 74 20 2) The current
e920: 74 65 72 6d 73 20 28 69 66 20 61 6e 79 29 20 61 terms (if any) a
e930: 72 65 20 63 6f 6d 70 61 72 65 64 20 75 73 69 6e re compared usin
e940: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f g memcmp(). If o
e950: 6e 65 0a 2a 2a 20 20 20 20 20 20 74 65 72 6d 20 ne.** term
e960: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 is a prefix of a
e970: 6e 6f 74 68 65 72 2c 20 74 68 65 20 6c 6f 6e 67 nother, the long
e980: 65 72 20 74 65 72 6d 20 69 73 20 63 6f 6e 73 69 er term is consi
e990: 64 65 72 65 64 20 74 68 65 0a 2a 2a 20 20 20 20 dered the.**
e9a0: 20 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 larger..**.**
e9b0: 20 20 33 29 20 42 79 20 73 65 67 6d 65 6e 74 20 3) By segment
e9c0: 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 20 73 65 age. An older se
e9d0: 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 69 64 65 gment is conside
e9e0: 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a 2f 0a 73 red larger..*/.s
e9f0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 tatic int fts3Se
ea00: 67 52 65 61 64 65 72 43 6d 70 28 46 74 73 33 53 gReaderCmp(Fts3S
ea10: 65 67 52 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 egReader *pLhs,
ea20: 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 Fts3SegReader *p
ea30: 52 68 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a Rhs){. int rc;.
ea40: 20 20 69 66 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 if( pLhs->aNod
ea50: 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 e && pRhs->aNode
ea60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 ){. int rc2
ea70: 3d 20 70 4c 68 73 2d 3e 6e 54 65 72 6d 20 2d 20 = pLhs->nTerm -
ea80: 70 52 68 73 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 pRhs->nTerm;.
ea90: 20 69 66 28 20 72 63 32 3c 30 20 29 7b 0a 20 20 if( rc2<0 ){.
eaa0: 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 rc = memcmp(
eab0: 70 4c 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 52 68 pLhs->zTerm, pRh
eac0: 73 2d 3e 7a 54 65 72 6d 2c 20 70 4c 68 73 2d 3e s->zTerm, pLhs->
ead0: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 nTerm);. }els
eae0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 e{. rc = me
eaf0: 6d 63 6d 70 28 70 4c 68 73 2d 3e 7a 54 65 72 6d mcmp(pLhs->zTerm
eb00: 2c 20 70 52 68 73 2d 3e 7a 54 65 72 6d 2c 20 70 , pRhs->zTerm, p
eb10: 52 68 73 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20 Rhs->nTerm);.
eb20: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 }. if( rc==0
eb30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 ){. rc = r
eb40: 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 c2;. }. }els
eb50: 65 7b 0a 20 20 20 20 72 63 20 3d 20 28 70 4c 68 e{. rc = (pLh
eb60: 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 20 2d 20 28 s->aNode==0) - (
eb70: 70 52 68 73 2d 3e 61 4e 6f 64 65 3d 3d 30 29 3b pRhs->aNode==0);
eb80: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 . }. if( rc==0
eb90: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 52 68 ){. rc = pRh
eba0: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e s->iIdx - pLhs->
ebb0: 69 49 64 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 iIdx;. }. asse
ebc0: 72 74 28 20 72 63 21 3d 30 20 29 3b 0a 20 20 72 rt( rc!=0 );. r
ebd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
ebe0: 2a 2a 20 41 20 64 69 66 66 65 72 65 6e 74 20 63 ** A different c
ebf0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 omparison functi
ec00: 6f 6e 20 66 6f 72 20 53 65 67 52 65 61 64 65 72 on for SegReader
ec10: 20 73 74 72 75 63 74 75 72 65 73 2e 20 49 6e 20 structures. In
ec20: 74 68 69 73 0a 2a 2a 20 76 65 72 73 69 6f 6e 2c this.** version,
ec30: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 it is assumed t
ec40: 68 61 74 20 65 61 63 68 20 53 65 67 52 65 61 64 hat each SegRead
ec50: 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 er points to an
ec60: 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 61 20 64 6f entry in.** a do
ec70: 63 6c 69 73 74 20 66 6f 72 20 69 64 65 6e 74 69 clist for identi
ec80: 63 61 6c 20 74 65 72 6d 73 2e 20 43 6f 6d 70 61 cal terms. Compa
ec90: 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 73 rison is made as
eca0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 follows:.**.**
ecb0: 20 20 31 29 20 45 4f 46 20 28 65 6e 64 20 6f 66 1) EOF (end of
ecc0: 20 64 6f 63 6c 69 73 74 20 69 6e 20 74 68 69 73 doclist in this
ecd0: 20 63 61 73 65 29 20 69 73 20 67 72 65 61 74 65 case) is greate
ece0: 72 20 74 68 61 6e 20 6e 6f 74 20 45 4f 46 2e 0a r than not EOF..
ecf0: 2a 2a 0a 2a 2a 20 20 20 32 29 20 42 79 20 63 75 **.** 2) By cu
ed00: 72 72 65 6e 74 20 64 6f 63 69 64 2e 0a 2a 2a 0a rrent docid..**.
ed10: 2a 2a 20 20 20 33 29 20 42 79 20 73 65 67 6d 65 ** 3) By segme
ed20: 6e 74 20 61 67 65 2e 20 41 6e 20 6f 6c 64 65 72 nt age. An older
ed30: 20 73 65 67 6d 65 6e 74 20 69 73 20 63 6f 6e 73 segment is cons
ed40: 69 64 65 72 65 64 20 6c 61 72 67 65 72 2e 0a 2a idered larger..*
ed50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 /.static int fts
ed60: 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 3SegReaderDoclis
ed70: 74 43 6d 70 28 46 74 73 33 53 65 67 52 65 61 64 tCmp(Fts3SegRead
ed80: 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 33 53 65 er *pLhs, Fts3Se
ed90: 67 52 65 61 64 65 72 20 2a 70 52 68 73 29 7b 0a gReader *pRhs){.
eda0: 20 20 69 6e 74 20 72 63 20 3d 20 28 70 4c 68 73 int rc = (pLhs
edb0: 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 ->pOffsetList==0
edc0: 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 73 65 74 )-(pRhs->pOffset
edd0: 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 List==0);. if(
ede0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 rc==0 ){. if(
edf0: 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 3d 3d 70 pLhs->iDocid==p
ee00: 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 7b 0a 20 Rhs->iDocid ){.
ee10: 20 20 20 20 20 72 63 20 3d 20 70 52 68 73 2d 3e rc = pRhs->
ee20: 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e 69 49 64 iIdx - pLhs->iId
ee30: 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 x;. }else{.
ee40: 20 20 20 20 72 63 20 3d 20 28 70 4c 68 73 2d 3e rc = (pLhs->
ee50: 69 44 6f 63 69 64 20 3e 20 70 52 68 73 2d 3e 69 iDocid > pRhs->i
ee60: 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 2d 31 3b Docid) ? 1 : -1;
ee70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 . }. }. ass
ee80: 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e 6f 64 65 ert( pLhs->aNode
ee90: 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f 64 65 20 && pRhs->aNode
eea0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a );. return rc;.
eeb0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 }.static int fts
eec0: 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 3SegReaderDoclis
eed0: 74 43 6d 70 52 65 76 28 46 74 73 33 53 65 67 52 tCmpRev(Fts3SegR
eee0: 65 61 64 65 72 20 2a 70 4c 68 73 2c 20 46 74 73 eader *pLhs, Fts
eef0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 52 68 73 3SegReader *pRhs
ef00: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 28 70 ){. int rc = (p
ef10: 4c 68 73 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 Lhs->pOffsetList
ef20: 3d 3d 30 29 2d 28 70 52 68 73 2d 3e 70 4f 66 66 ==0)-(pRhs->pOff
ef30: 73 65 74 4c 69 73 74 3d 3d 30 29 3b 0a 20 20 69 setList==0);. i
ef40: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 f( rc==0 ){.
ef50: 69 66 28 20 70 4c 68 73 2d 3e 69 44 6f 63 69 64 if( pLhs->iDocid
ef60: 3d 3d 70 52 68 73 2d 3e 69 44 6f 63 69 64 20 29 ==pRhs->iDocid )
ef70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 52 68 {. rc = pRh
ef80: 73 2d 3e 69 49 64 78 20 2d 20 70 4c 68 73 2d 3e s->iIdx - pLhs->
ef90: 69 49 64 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b iIdx;. }else{
efa0: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 70 4c 68 . rc = (pLh
efb0: 73 2d 3e 69 44 6f 63 69 64 20 3c 20 70 52 68 73 s->iDocid < pRhs
efc0: 2d 3e 69 44 6f 63 69 64 29 20 3f 20 31 20 3a 20 ->iDocid) ? 1 :
efd0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 -1;. }. }.
efe0: 61 73 73 65 72 74 28 20 70 4c 68 73 2d 3e 61 4e assert( pLhs->aN
eff0: 6f 64 65 20 26 26 20 70 52 68 73 2d 3e 61 4e 6f ode && pRhs->aNo
f000: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 de );. return r
f010: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 c;.}../*.** Comp
f020: 61 72 65 20 74 68 65 20 74 65 72 6d 20 74 68 61 are the term tha
f030: 74 20 74 68 65 20 46 74 73 33 53 65 67 52 65 61 t the Fts3SegRea
f040: 64 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 der object passe
f050: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 d as the first a
f060: 72 67 75 6d 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 rgument.** point
f070: 73 20 74 6f 20 77 69 74 68 20 74 68 65 20 74 65 s to with the te
f080: 72 6d 20 73 70 65 63 69 66 69 65 64 20 62 79 20 rm specified by
f090: 61 72 67 75 6d 65 6e 74 73 20 7a 54 65 72 6d 20 arguments zTerm
f0a0: 61 6e 64 20 6e 54 65 72 6d 2e 20 0a 2a 2a 0a 2a and nTerm. .**.*
f0b0: 2a 20 49 66 20 74 68 65 20 70 53 65 67 20 69 74 * If the pSeg it
f0c0: 65 72 61 74 6f 72 20 69 73 20 61 6c 72 65 61 64 erator is alread
f0d0: 79 20 61 74 20 45 4f 46 2c 20 72 65 74 75 72 6e y at EOF, return
f0e0: 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 0. Otherwise, r
f0f0: 65 74 75 72 6e 0a 2a 2a 20 2d 76 65 20 69 66 20 eturn.** -ve if
f100: 74 68 65 20 70 53 65 67 20 74 65 72 6d 20 69 73 the pSeg term is
f110: 20 6c 65 73 73 20 74 68 61 6e 20 7a 54 65 72 6d less than zTerm
f120: 2f 6e 54 65 72 6d 2c 20 30 20 69 66 20 74 68 65 /nTerm, 0 if the
f130: 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65 0a 2a two terms are.*
f140: 2a 20 65 71 75 61 6c 2c 20 6f 72 20 2b 76 65 20 * equal, or +ve
f150: 69 66 20 74 68 65 20 70 53 65 67 20 74 65 72 6d if the pSeg term
f160: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e is greater than
f170: 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 0a 2a 2f zTerm/nTerm..*/
f180: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 .static int fts3
f190: 53 65 67 52 65 61 64 65 72 54 65 72 6d 43 6d 70 SegReaderTermCmp
f1a0: 28 0a 20 20 46 74 73 33 53 65 67 52 65 61 64 65 (. Fts3SegReade
f1b0: 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 r *pSeg,
f1c0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 72 /* Segment r
f1d0: 65 61 64 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a eader object */.
f1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 const char *zT
f1f0: 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 erm,
f200: 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 63 6f 6d /* Term to com
f210: 70 61 72 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 pare to */. int
f220: 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 nTerm
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
f240: 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 7a 54 65 Size of term zTe
f250: 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 rm in bytes */.)
f260: 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b {. int res = 0;
f270: 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 61 4e 6f . if( pSeg->aNo
f280: 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 de ){. if( pS
f290: 65 67 2d 3e 6e 54 65 72 6d 3e 6e 54 65 72 6d 20 eg->nTerm>nTerm
f2a0: 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d ){. res = m
f2b0: 65 6d 63 6d 70 28 70 53 65 67 2d 3e 7a 54 65 72 emcmp(pSeg->zTer
f2c0: 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 m, zTerm, nTerm)
f2d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
f2e0: 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 res = memcmp(
f2f0: 70 53 65 67 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 pSeg->zTerm, zTe
f300: 72 6d 2c 20 70 53 65 67 2d 3e 6e 54 65 72 6d 29 rm, pSeg->nTerm)
f310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
f320: 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 res==0 ){.
f330: 72 65 73 20 3d 20 70 53 65 67 2d 3e 6e 54 65 72 res = pSeg->nTer
f340: 6d 2d 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 m-nTerm;. }.
f350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b }. return res;
f360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 .}../*.** Argume
f370: 6e 74 20 61 70 53 65 67 6d 65 6e 74 20 69 73 20 nt apSegment is
f380: 61 6e 20 61 72 72 61 79 20 6f 66 20 6e 53 65 67 an array of nSeg
f390: 6d 65 6e 74 20 65 6c 65 6d 65 6e 74 73 2e 20 49 ment elements. I
f3a0: 74 20 69 73 20 6b 6e 6f 77 6e 20 74 68 61 74 0a t is known that.
f3b0: 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 28 6e 53 ** the final (nS
f3c0: 65 67 6d 65 6e 74 2d 6e 53 75 73 70 65 63 74 29 egment-nSuspect)
f3d0: 20 6d 65 6d 62 65 72 73 20 61 72 65 20 61 6c 72 members are alr
f3e0: 65 61 64 79 20 69 6e 20 73 6f 72 74 65 64 20 6f eady in sorted o
f3f0: 72 64 65 72 0a 2a 2a 20 28 61 63 63 6f 72 64 69 rder.** (accordi
f400: 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 ng to the compar
f410: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 72 ison function pr
f420: 6f 76 69 64 65 64 29 2e 20 54 68 69 73 20 66 75 ovided). This fu
f430: 6e 63 74 69 6f 6e 20 73 68 75 66 66 6c 65 73 0a nction shuffles.
f440: 2a 2a 20 74 68 65 20 61 72 72 61 79 20 61 72 6f ** the array aro
f450: 75 6e 64 20 75 6e 74 69 6c 20 61 6c 6c 20 65 6e und until all en
f460: 74 72 69 65 73 20 61 72 65 20 69 6e 20 73 6f 72 tries are in sor
f470: 74 65 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 ted order..*/.st
f480: 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 atic void fts3Se
f490: 67 52 65 61 64 65 72 53 6f 72 74 28 0a 20 20 46 gReaderSort(. F
f4a0: 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 ts3SegReader **a
f4b0: 70 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 pSegment,
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
f4d0: 20 41 72 72 61 79 20 74 6f 20 73 6f 72 74 20 65 Array to sort e
f4e0: 6e 74 72 69 65 73 20 6f 66 20 2a 2f 0a 20 20 69 ntries of */. i
f4f0: 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 nt nSegment,
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
f520: 20 53 69 7a 65 20 6f 66 20 61 70 53 65 67 6d 65 Size of apSegme
f530: 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e nt array */. in
f540: 74 20 6e 53 75 73 70 65 63 74 2c 20 20 20 20 20 t nSuspect,
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
f570: 55 6e 73 6f 72 74 65 64 20 65 6e 74 72 79 20 63 Unsorted entry c
f580: 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a ount */. int (*
f590: 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 xCmp)(Fts3SegRea
f5a0: 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 der *, Fts3SegRe
f5b0: 61 64 65 72 20 2a 29 20 20 2f 2a 20 43 6f 6d 70 ader *) /* Comp
f5c0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 arison function
f5d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 */.){. int i;
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 /* Itera
f600: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a tor variable */.
f610: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 75 73 70 . assert( nSusp
f620: 65 63 74 3c 3d 6e 53 65 67 6d 65 6e 74 20 29 3b ect<=nSegment );
f630: 0a 0a 20 20 69 66 28 20 6e 53 75 73 70 65 63 74 .. if( nSuspect
f640: 3d 3d 6e 53 65 67 6d 65 6e 74 20 29 20 6e 53 75 ==nSegment ) nSu
f650: 73 70 65 63 74 2d 2d 3b 0a 20 20 66 6f 72 28 69 spect--;. for(i
f660: 3d 6e 53 75 73 70 65 63 74 2d 31 3b 20 69 3e 3d =nSuspect-1; i>=
f670: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 0; i--){. int
f680: 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b j;. for(j=i;
f690: 20 6a 3c 28 6e 53 65 67 6d 65 6e 74 2d 31 29 3b j<(nSegment-1);
f6a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 j++){. Fts
f6b0: 33 53 65 67 52 65 61 64 65 72 20 2a 70 54 6d 70 3SegReader *pTmp
f6c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 43 6d 70 ;. if( xCmp
f6d0: 28 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c 20 61 (apSegment[j], a
f6e0: 70 53 65 67 6d 65 6e 74 5b 6a 2b 31 5d 29 3c 30 pSegment[j+1])<0
f6f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 ) break;.
f700: 70 54 6d 70 20 3d 20 61 70 53 65 67 6d 65 6e 74 pTmp = apSegment
f710: 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20 61 70 53 [j+1];. apS
f720: 65 67 6d 65 6e 74 5b 6a 2b 31 5d 20 3d 20 61 70 egment[j+1] = ap
f730: 53 65 67 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 Segment[j];.
f740: 20 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 20 3d apSegment[j] =
f750: 20 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 7d pTmp;. }. }
f760: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 ..#ifndef NDEBUG
f770: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 . /* Check that
f780: 20 74 68 65 20 6c 69 73 74 20 72 65 61 6c 6c 79 the list really
f790: 20 69 73 20 73 6f 72 74 65 64 20 6e 6f 77 2e 20 is sorted now.
f7a0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c */. for(i=0; i<
f7b0: 28 6e 53 75 73 70 65 63 74 2d 31 29 3b 20 69 2b (nSuspect-1); i+
f7c0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 +){. assert(
f7d0: 78 43 6d 70 28 61 70 53 65 67 6d 65 6e 74 5b 69 xCmp(apSegment[i
f7e0: 5d 2c 20 61 70 53 65 67 6d 65 6e 74 5b 69 2b 31 ], apSegment[i+1
f7f0: 5d 29 3c 30 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 ])<0 );. }.#end
f800: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 if.}../* .** Ins
f810: 65 72 74 20 61 20 72 65 63 6f 72 64 20 69 6e 74 ert a record int
f820: 6f 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 o the %_segments
f830: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 table..*/.stati
f840: 63 20 69 6e 74 20 66 74 73 33 57 72 69 74 65 53 c int fts3WriteS
f850: 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 33 54 61 egment(. Fts3Ta
f860: 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 ble *p,
f870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 /* Vir
f880: 74 75 61 6c 20 74 61 62 6c 65 20 68 61 6e 64 6c tual table handl
f890: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 e */. sqlite3_i
f8a0: 6e 74 36 34 20 69 42 6c 6f 63 6b 2c 20 20 20 20 nt64 iBlock,
f8b0: 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 /* Block
f8c0: 69 64 20 66 6f 72 20 6e 65 77 20 62 6c 6f 63 6b id for new block
f8d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 2c 20 20 */. char *z,
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f8f0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 /* Pointer
f900: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 to buffer conta
f910: 69 6e 69 6e 67 20 62 6c 6f 63 6b 20 64 61 74 61 ining block data
f920: 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 */. int n
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f940: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 /* Size of
f950: 20 62 75 66 66 65 72 20 7a 20 69 6e 20 62 79 74 buffer z in byt
f960: 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 es */.){. sqlit
f970: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a e3_stmt *pStmt;.
f980: 20 20 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 int rc = fts3S
f990: 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e qlStmt(p, SQL_IN
f9a0: 53 45 52 54 5f 53 45 47 4d 45 4e 54 53 2c 20 26 SERT_SEGMENTS, &
f9b0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 pStmt, 0);. if(
f9c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
f9d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 {. sqlite3_bi
f9e0: 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 nd_int64(pStmt,
f9f0: 31 2c 20 69 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 1, iBlock);.
fa00: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f sqlite3_bind_blo
fa10: 62 28 70 53 74 6d 74 2c 20 32 2c 20 7a 2c 20 6e b(pStmt, 2, z, n
fa20: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 , SQLITE_STATIC)
fa30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 ;. sqlite3_st
fa40: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 ep(pStmt);. r
fa50: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 c = sqlite3_rese
fa60: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 t(pStmt);. }.
fa70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
fa80: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6c 61 72 .** Find the lar
fa90: 67 65 73 74 20 72 65 6c 61 74 69 76 65 20 6c 65 gest relative le
faa0: 76 65 6c 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 vel number in th
fab0: 65 20 74 61 62 6c 65 2e 20 49 66 20 73 75 63 63 e table. If succ
fac0: 65 73 73 66 75 6c 2c 20 73 65 74 0a 2a 2a 20 2a essful, set.** *
fad0: 70 6e 4d 61 78 20 74 6f 20 74 68 69 73 20 76 61 pnMax to this va
fae0: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 lue and return S
faf0: 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 QLITE_OK. Otherw
fb00: 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 ise, if an error
fb10: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 65 74 20 occurs,.** set
fb20: 2a 70 6e 4d 61 78 20 74 6f 20 7a 65 72 6f 20 61 *pnMax to zero a
fb30: 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c nd return an SQL
fb40: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a ite error code..
fb50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 */.int sqlite3Ft
fb60: 73 33 4d 61 78 4c 65 76 65 6c 28 46 74 73 33 54 s3MaxLevel(Fts3T
fb70: 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e able *p, int *pn
fb80: 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a Max){. int rc;.
fb90: 20 20 69 6e 74 20 6d 78 4c 65 76 65 6c 20 3d 20 int mxLevel =
fba0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 0;. sqlite3_stm
fbb0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 t *pStmt = 0;..
fbc0: 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d rc = fts3SqlStm
fbd0: 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f t(p, SQL_SELECT_
fbe0: 4d 58 4c 45 56 45 4c 2c 20 26 70 53 74 6d 74 2c MXLEVEL, &pStmt,
fbf0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 0);. if( rc==S
fc00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
fc10: 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d if( SQLITE_ROW==
fc20: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 sqlite3_step(pSt
fc30: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 6d 78 4c mt) ){. mxL
fc40: 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 evel = sqlite3_c
fc50: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c olumn_int(pStmt,
fc60: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 0);. }. r
fc70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 c = sqlite3_rese
fc80: 74 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 t(pStmt);. }.
fc90: 2a 70 6e 4d 61 78 20 3d 20 6d 78 4c 65 76 65 6c *pnMax = mxLevel
fca0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d ;. return rc;.}
fcb0: 0a 0a 2f 2a 20 0a 2a 2a 20 49 6e 73 65 72 74 20 ../* .** Insert
fcc0: 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 a record into th
fcd0: 65 20 25 5f 73 65 67 64 69 72 20 74 61 62 6c 65 e %_segdir table
fce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
fcf0: 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 fts3WriteSegdir(
fd00: 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c . Fts3Table *p,
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
fd20: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 /* Virtual ta
fd30: 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 ble handle */.
fd40: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c sqlite3_int64 iL
fd50: 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 evel,
fd60: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 6c 65 /* Value for "le
fd70: 76 65 6c 22 20 66 69 65 6c 64 20 28 61 62 73 6f vel" field (abso
fd80: 6c 75 74 65 20 6c 65 76 65 6c 29 20 2a 2f 0a 20 lute level) */.
fd90: 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 int iIdx,
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
fdb0: 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 69 /* Value for "i
fdc0: 64 78 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 73 dx" field */. s
fdd0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 qlite3_int64 iSt
fde0: 61 72 74 42 6c 6f 63 6b 2c 20 20 20 20 20 20 2f artBlock, /
fdf0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 73 74 61 * Value for "sta
fe00: 72 74 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 rt_block" field
fe10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 */. sqlite3_int
fe20: 36 34 20 69 4c 65 61 66 45 6e 64 42 6c 6f 63 6b 64 iLeafEndBlock
fe30: 2c 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f , /* Value fo
fe40: 72 20 22 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c r "leaves_end_bl
fe50: 6f 63 6b 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 ock" field */.
fe60: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 sqlite3_int64 iE
fe70: 6e 64 42 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 ndBlock,
fe80: 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 22 65 6e /* Value for "en
fe90: 64 5f 62 6c 6f 63 6b 22 20 66 69 65 6c 64 20 2a d_block" field *
fea0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 /. sqlite3_int6
feb0: 34 20 6e 4c 65 61 66 44 61 74 61 2c 20 20 20 20 4 nLeafData,
fec0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 /* Bytes of
fed0: 6c 65 61 66 20 64 61 74 61 20 69 6e 20 73 65 67 leaf data in seg
fee0: 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a ment */. char *
fef0: 7a 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 zRoot,
ff00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f /* Blo
ff10: 62 20 76 61 6c 75 65 20 66 6f 72 20 22 72 6f 6f b value for "roo
ff20: 74 22 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e t" field */. in
ff30: 74 20 6e 52 6f 6f 74 20 20 20 20 20 20 20 20 20 t nRoot
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
ff50: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 Number of bytes
ff60: 20 69 6e 20 62 75 66 66 65 72 20 7a 52 6f 6f 74 in buffer zRoot
ff70: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 */.){. sqlite3
ff80: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 _stmt *pStmt;.
ff90: 69 6e 74 20 72 63 20 3d 20 66 74 73 33 53 71 6c int rc = fts3Sql
ffa0: 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 4e 53 45 Stmt(p, SQL_INSE
ffb0: 52 54 5f 53 45 47 44 49 52 2c 20 26 70 53 74 6d RT_SEGDIR, &pStm
ffc0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d t, 0);. if( rc=
ffd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
ffe0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 sqlite3_bind_i
fff0: 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 nt64(pStmt, 1, i
10000 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69 Level);. sqli
10010 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 te3_bind_int(pSt
10020 6d 74 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 mt, 2, iIdx);.
10030 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 sqlite3_bind_i
10040 6e 74 36 34 28 70 53 74 6d 74 2c 20 33 2c 20 69 nt64(pStmt, 3, i
10050 53 74 61 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 StartBlock);.
10060 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
10070 74 36 34 28 70 53 74 6d 74 2c 20 34 2c 20 69 4c t64(pStmt, 4, iL
10080 65 61 66 45 6e 64 42 6c 6f 63 6b 29 3b 0a 20 20 eafEndBlock);.
10090 20 20 69 66 28 20 6e 4c 65 61 66 44 61 74 61 3d if( nLeafData=
100a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 =0 ){. sqli
100b0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 te3_bind_int64(p
100c0 53 74 6d 74 2c 20 35 2c 20 69 45 6e 64 42 6c 6f Stmt, 5, iEndBlo
100d0 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a ck);. }else{.
100e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 char *zEnd
100f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e = sqlite3_mprin
10100 74 66 28 22 25 6c 6c 64 20 25 6c 6c 64 22 2c 20 tf("%lld %lld",
10110 69 45 6e 64 42 6c 6f 63 6b 2c 20 6e 4c 65 61 66 iEndBlock, nLeaf
10120 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 Data);. if(
10130 20 21 7a 45 6e 64 20 29 20 72 65 74 75 72 6e 20 !zEnd ) return
10140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 SQLITE_NOMEM;.
10150 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
10160 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 35 2c 20 _text(pStmt, 5,
10170 7a 45 6e 64 2c 20 2d 31 2c 20 73 71 6c 69 74 65 zEnd, -1, sqlite
10180 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 3_free);. }.
10190 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
101a0 62 6c 6f 62 28 70 53 74 6d 74 2c 20 36 2c 20 7a blob(pStmt, 6, z
101b0 52 6f 6f 74 2c 20 6e 52 6f 6f 74 2c 20 53 51 4c Root, nRoot, SQL
101c0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 ITE_STATIC);.
101d0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 sqlite3_step(pS
101e0 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 tmt);. rc = s
101f0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 qlite3_reset(pSt
10200 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 mt);. }. retur
10210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 n rc;.}../*.** R
10220 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f eturn the size o
10230 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 f the common pre
10240 66 69 78 20 28 69 66 20 61 6e 79 29 20 73 68 61 fix (if any) sha
10250 72 65 64 20 62 79 20 7a 50 72 65 76 20 61 6e 64 red by zPrev and
10260 0a 2a 2a 20 7a 4e 65 78 74 2c 20 69 6e 20 62 79 .** zNext, in by
10270 74 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 tes. For example
10280 2c 20 0a 2a 2a 0a 2a 2a 20 20 20 66 74 73 33 50 , .**.** fts3P
10290 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 refixCompress("a
102a0 62 63 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22 bc", 3, "abcdef"
102b0 2c 20 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e , 6) // return
102c0 73 20 33 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 s 3.** fts3Pre
102d0 66 69 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58 fixCompress("abX
102e0 22 2c 20 33 2c 20 22 61 62 63 64 65 66 22 2c 20 ", 3, "abcdef",
102f0 36 29 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 6) // returns
10300 32 0a 2a 2a 20 20 20 66 74 73 33 50 72 65 66 69 2.** fts3Prefi
10310 78 43 6f 6d 70 72 65 73 73 28 22 61 62 58 22 2c xCompress("abX",
10320 20 33 2c 20 22 58 62 63 64 65 66 22 2c 20 36 29 3, "Xbcdef", 6)
10330 20 20 20 2f 2f 20 72 65 74 75 72 6e 73 20 30 0a // returns 0.
10340 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 */.static int ft
10350 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 s3PrefixCompress
10360 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a (. const char *
10370 7a 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 zPrev,
10380 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f /* Buffer co
10390 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 ntaining previou
103a0 73 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 s term */. int
103b0 6e 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 nPrev,
103c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
103d0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 50 ize of buffer zP
103e0 72 65 76 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a rev in bytes */.
103f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e const char *zN
10400 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 ext,
10410 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 /* Buffer cont
10420 61 69 6e 69 6e 67 20 6e 65 78 74 20 74 65 72 6d aining next term
10430 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 78 74 20 */. int nNext
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10450 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 /* Size of
10460 20 62 75 66 66 65 72 20 7a 4e 65 78 74 20 69 6e buffer zNext in
10470 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 bytes */.){. i
10480 6e 74 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 nt n;. UNUSED_P
10490 41 52 41 4d 45 54 45 52 28 6e 4e 65 78 74 29 3b ARAMETER(nNext);
104a0 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 50 . for(n=0; n<nP
104b0 72 65 76 20 26 26 20 7a 50 72 65 76 5b 6e 5d 3d rev && zPrev[n]=
104c0 3d 7a 4e 65 78 74 5b 6e 5d 3b 20 6e 2b 2b 29 3b =zNext[n]; n++);
104d0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a . return n;.}..
104e0 2f 2a 0a 2a 2a 20 41 64 64 20 74 65 72 6d 20 7a /*.** Add term z
104f0 54 65 72 6d 20 74 6f 20 74 68 65 20 53 65 67 6d Term to the Segm
10500 65 6e 74 4e 6f 64 65 2e 20 49 74 20 69 73 20 67 entNode. It is g
10510 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 7a uaranteed that z
10520 54 65 72 6d 20 69 73 20 6c 61 72 67 65 72 0a 2a Term is larger.*
10530 2a 20 28 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 * (according to
10540 6d 65 6d 63 6d 70 29 20 74 68 61 6e 20 74 68 65 memcmp) than the
10550 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 0a previous term..
10560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 */.static int ft
10570 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 0a 20 s3NodeAddTerm(.
10580 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 Fts3Table *p,
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
105a0 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c /* Virtual tabl
105b0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 e handle */. Se
105c0 67 6d 65 6e 74 4e 6f 64 65 20 2a 2a 70 70 54 72 gmentNode **ppTr
105d0 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a ee, /*
105e0 20 49 4e 2f 4f 55 54 3a 20 53 65 67 6d 65 6e 74 IN/OUT: Segment
105f0 4e 6f 64 65 20 68 61 6e 64 6c 65 20 2a 2f 20 0a Node handle */ .
10600 20 20 69 6e 74 20 69 73 43 6f 70 79 54 65 72 6d int isCopyTerm
10610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
10620 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 54 65 /* True if zTe
10630 72 6d 2f 6e 54 65 72 6d 20 69 73 20 74 72 61 6e rm/nTerm is tran
10640 73 69 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 sient */. const
10650 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 char *zTerm,
10660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f /* Po
10670 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 inter to buffer
10680 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 containing term
10690 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 */. int nTerm
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
106b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
106c0 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f term in bytes */
106d0 0a 29 7b 0a 20 20 53 65 67 6d 65 6e 74 4e 6f 64 .){. SegmentNod
106e0 65 20 2a 70 54 72 65 65 20 3d 20 2a 70 70 54 72 e *pTree = *ppTr
106f0 65 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 ee;. int rc;.
10700 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 4e 65 SegmentNode *pNe
10710 77 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 74 w;.. /* First t
10720 72 79 20 74 6f 20 61 70 70 65 6e 64 20 74 68 65 ry to append the
10730 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 75 72 term to the cur
10740 72 65 6e 74 20 6e 6f 64 65 2e 20 52 65 74 75 72 rent node. Retur
10750 6e 20 65 61 72 6c 79 20 69 66 20 0a 20 20 2a 2a n early if . **
10760 20 74 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c this is possibl
10770 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 e.. */. if( pT
10780 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e ree ){. int n
10790 44 61 74 61 20 3d 20 70 54 72 65 65 2d 3e 6e 44 Data = pTree->nD
107a0 61 74 61 3b 20 20 20 20 20 2f 2a 20 43 75 72 72 ata; /* Curr
107b0 65 6e 74 20 73 69 7a 65 20 6f 66 20 6e 6f 64 65 ent size of node
107c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 in bytes */.
107d0 20 69 6e 74 20 6e 52 65 71 20 3d 20 6e 44 61 74 int nReq = nDat
107e0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f a; /
107f0 2a 20 52 65 71 75 69 72 65 64 20 73 70 61 63 65 * Required space
10800 20 61 66 74 65 72 20 61 64 64 69 6e 67 20 7a 54 after adding zT
10810 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e erm */. int n
10820 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 Prefix;
10830 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
10840 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 er of bytes of p
10850 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f refix compressio
10860 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 75 n */. int nSu
10870 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 ffix;
10880 20 20 20 20 20 20 20 2f 2a 20 53 75 66 66 69 78 /* Suffix
10890 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 20 20 20 20 length */..
108a0 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 72 nPrefix = fts3Pr
108b0 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 54 72 efixCompress(pTr
108c0 65 65 2d 3e 7a 54 65 72 6d 2c 20 70 54 72 65 65 ee->zTerm, pTree
108d0 2d 3e 6e 54 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 ->nTerm, zTerm,
108e0 6e 54 65 72 6d 29 3b 0a 20 20 20 20 6e 53 75 66 nTerm);. nSuf
108f0 66 69 78 20 3d 20 6e 54 65 72 6d 2d 6e 50 72 65 fix = nTerm-nPre
10900 66 69 78 3b 0a 0a 20 20 20 20 6e 52 65 71 20 2b fix;.. nReq +
10910 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 = sqlite3Fts3Var
10920 69 6e 74 4c 65 6e 28 6e 50 72 65 66 69 78 29 2b intLen(nPrefix)+
10930 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e sqlite3Fts3Varin
10940 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 2b 6e 53 tLen(nSuffix)+nS
10950 75 66 66 69 78 3b 0a 20 20 20 20 69 66 28 20 6e uffix;. if( n
10960 52 65 71 3c 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a Req<=p->nNodeSiz
10970 65 20 7c 7c 20 21 70 54 72 65 65 2d 3e 7a 54 65 e || !pTree->zTe
10980 72 6d 20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28 rm ){.. if(
10990 20 6e 52 65 71 3e 70 2d 3e 6e 4e 6f 64 65 53 69 nReq>p->nNodeSi
109a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a ze ){. /*
109b0 20 41 6e 20 75 6e 75 73 75 61 6c 20 63 61 73 65 An unusual case
109c0 3a 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 : this is the fi
109d0 72 73 74 20 74 65 72 6d 20 74 6f 20 62 65 20 61 rst term to be a
109e0 64 64 65 64 20 74 6f 20 74 68 65 20 6e 6f 64 65 dded to the node
109f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 . ** and
10a00 74 68 65 20 73 74 61 74 69 63 20 6e 6f 64 65 20 the static node
10a10 62 75 66 66 65 72 20 28 70 2d 3e 6e 4e 6f 64 65 buffer (p->nNode
10a20 53 69 7a 65 20 62 79 74 65 73 29 20 69 73 20 6e Size bytes) is n
10a30 6f 74 20 6c 61 72 67 65 0a 20 20 20 20 20 20 20 ot large.
10a40 20 2a 2a 20 65 6e 6f 75 67 68 2e 20 55 73 65 20 ** enough. Use
10a50 61 20 73 65 70 61 72 61 74 65 6c 79 20 6d 61 6c a separately mal
10a60 6c 6f 63 65 64 20 62 75 66 66 65 72 20 69 6e 73 loced buffer ins
10a70 74 65 61 64 20 54 68 69 73 20 77 61 73 74 65 73 tead This wastes
10a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 6e . ** p->n
10a90 4e 6f 64 65 53 69 7a 65 20 62 79 74 65 73 2c 20 NodeSize bytes,
10aa0 62 75 74 20 73 69 6e 63 65 20 74 68 69 73 20 73 but since this s
10ab0 63 65 6e 61 72 69 6f 20 6f 6e 6c 79 20 63 6f 6d cenario only com
10ac0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 0a 20 20 es about when.
10ad0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 ** the dat
10ae0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 20 74 77 abase contain tw
10af0 6f 20 74 65 72 6d 73 20 74 68 61 74 20 73 68 61 o terms that sha
10b00 72 65 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 re a prefix of a
10b10 6c 6d 6f 73 74 20 32 4b 42 2c 20 0a 20 20 20 20 lmost 2KB, .
10b20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e ** this is n
10b30 6f 74 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 ot expected to b
10b40 65 20 61 20 73 65 72 69 6f 75 73 20 70 72 6f 62 e a serious prob
10b50 6c 65 6d 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f lem. . */
10b60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
10b70 20 70 54 72 65 65 2d 3e 61 44 61 74 61 3d 3d 28 pTree->aData==(
10b80 63 68 61 72 20 2a 29 26 70 54 72 65 65 5b 31 5d char *)&pTree[1]
10b90 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 72 65 );. pTre
10ba0 65 2d 3e 61 44 61 74 61 20 3d 20 28 63 68 61 72 e->aData = (char
10bb0 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f *)sqlite3_mallo
10bc0 63 28 6e 52 65 71 29 3b 0a 20 20 20 20 20 20 20 c(nReq);.
10bd0 20 69 66 28 20 21 70 54 72 65 65 2d 3e 61 44 61 if( !pTree->aDa
10be0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 ta ){.
10bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f return SQLITE_NO
10c00 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 MEM;. }.
10c10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 }.. if
10c20 28 20 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 29 ( pTree->zTerm )
10c30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 {. /* The
10c40 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 2d re is no prefix-
10c50 6c 65 6e 67 74 68 20 66 69 65 6c 64 20 66 6f 72 length field for
10c60 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20 61 first term in a
10c70 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 node */.
10c80 20 6e 44 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 nData += sqlite
10c90 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 3Fts3PutVarint(&
10ca0 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 pTree->aData[nDa
10cb0 74 61 5d 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 ta], nPrefix);.
10cc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6e 44 }.. nD
10cd0 61 74 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 ata += sqlite3Ft
10ce0 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 54 72 s3PutVarint(&pTr
10cf0 65 65 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d ee->aData[nData]
10d00 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 , nSuffix);.
10d10 20 20 6d 65 6d 63 70 79 28 26 70 54 72 65 65 2d memcpy(&pTree-
10d20 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 26 >aData[nData], &
10d30 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 zTerm[nPrefix],
10d40 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 nSuffix);.
10d50 70 54 72 65 65 2d 3e 6e 44 61 74 61 20 3d 20 6e pTree->nData = n
10d60 44 61 74 61 20 2b 20 6e 53 75 66 66 69 78 3b 0a Data + nSuffix;.
10d70 20 20 20 20 20 20 70 54 72 65 65 2d 3e 6e 45 6e pTree->nEn
10d80 74 72 79 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 try++;.. if
10d90 28 20 69 73 43 6f 70 79 54 65 72 6d 20 29 7b 0a ( isCopyTerm ){.
10da0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 72 65 if( pTre
10db0 65 2d 3e 6e 4d 61 6c 6c 6f 63 3c 6e 54 65 72 6d e->nMalloc<nTerm
10dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 ){. ch
10dd0 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 ar *zNew = sqlit
10de0 65 33 5f 72 65 61 6c 6c 6f 63 28 70 54 72 65 65 e3_realloc(pTree
10df0 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 6d ->zMalloc, nTerm
10e00 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 *2);. i
10e10 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 f( !zNew ){.
10e20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
10e30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 QLITE_NOMEM;.
10e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
10e50 20 20 20 70 54 72 65 65 2d 3e 6e 4d 61 6c 6c 6f pTree->nMallo
10e60 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a 20 20 20 c = nTerm*2;.
10e70 20 20 20 20 20 20 20 70 54 72 65 65 2d 3e 7a 4d pTree->zM
10e80 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 20 alloc = zNew;.
10e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
10ea0 70 54 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 70 pTree->zTerm = p
10eb0 54 72 65 65 2d 3e 7a 4d 61 6c 6c 6f 63 3b 0a 20 Tree->zMalloc;.
10ec0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 memcpy(pT
10ed0 72 65 65 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 72 ree->zTerm, zTer
10ee0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 m, nTerm);.
10ef0 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d 20 pTree->nTerm
10f00 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d = nTerm;. }
10f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 else{. pT
10f20 72 65 65 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 ree->zTerm = (ch
10f30 61 72 20 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20 ar *)zTerm;.
10f40 20 20 20 20 70 54 72 65 65 2d 3e 6e 54 65 72 6d pTree->nTerm
10f50 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 = nTerm;.
10f60 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 }. return S
10f70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a QLITE_OK;. }.
10f80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e }.. /* If con
10f90 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 68 65 trol flows to he
10fa0 72 65 2c 20 69 74 20 77 61 73 20 6e 6f 74 20 70 re, it was not p
10fb0 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70 65 6e ossible to appen
10fc0 64 20 7a 54 65 72 6d 20 74 6f 20 74 68 65 0a 20 d zTerm to the.
10fd0 20 2a 2a 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 ** current node
10fe0 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6e . Create a new n
10ff0 6f 64 65 20 28 61 20 72 69 67 68 74 2d 73 69 62 ode (a right-sib
11000 6c 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 ling of the curr
11010 65 6e 74 20 6e 6f 64 65 29 2e 0a 20 20 2a 2a 20 ent node).. **
11020 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 If this is the f
11030 69 72 73 74 20 6e 6f 64 65 20 69 6e 20 74 68 65 irst node in the
11040 20 74 72 65 65 2c 20 74 68 65 20 74 65 72 6d 20 tree, the term
11050 69 73 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a is added to it..
11060 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 **. ** Otherw
11070 69 73 65 2c 20 74 68 65 20 74 65 72 6d 20 69 73 ise, the term is
11080 20 6e 6f 74 20 61 64 64 65 64 20 74 6f 20 74 68 not added to th
11090 65 20 6e 65 77 20 6e 6f 64 65 2c 20 69 74 20 69 e new node, it i
110a0 73 20 6c 65 66 74 20 65 6d 70 74 79 20 66 6f 72 s left empty for
110b0 0a 20 20 2a 2a 20 6e 6f 77 2e 20 49 6e 73 74 65 . ** now. Inste
110c0 61 64 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 ad, the term is
110d0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 inserted into th
110e0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 54 72 65 e parent of pTre
110f0 65 2e 20 49 66 20 70 54 72 65 65 20 0a 20 20 2a e. If pTree . *
11100 2a 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 2c * has no parent,
11110 20 6f 6e 65 20 69 73 20 63 72 65 61 74 65 64 20 one is created
11120 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65 here.. */. pNe
11130 77 20 3d 20 28 53 65 67 6d 65 6e 74 4e 6f 64 65 w = (SegmentNode
11140 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f *)sqlite3_mallo
11150 63 28 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 c(sizeof(Segment
11160 4e 6f 64 65 29 20 2b 20 70 2d 3e 6e 4e 6f 64 65 Node) + p->nNode
11170 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 70 4e Size);. if( !pN
11180 65 77 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e ew ){. return
11190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 SQLITE_NOMEM;.
111a0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 }. memset(pNew
111b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d , 0, sizeof(Segm
111c0 65 6e 74 4e 6f 64 65 29 29 3b 0a 20 20 70 4e 65 entNode));. pNe
111d0 77 2d 3e 6e 44 61 74 61 20 3d 20 31 20 2b 20 46 w->nData = 1 + F
111e0 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 3b 0a TS3_VARINT_MAX;.
111f0 20 20 70 4e 65 77 2d 3e 61 44 61 74 61 20 3d 20 pNew->aData =
11200 28 63 68 61 72 20 2a 29 26 70 4e 65 77 5b 31 5d (char *)&pNew[1]
11210 3b 0a 0a 20 20 69 66 28 20 70 54 72 65 65 20 29 ;.. if( pTree )
11220 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 {. SegmentNod
11230 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 54 72 e *pParent = pTr
11240 65 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 ee->pParent;.
11250 20 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 41 64 rc = fts3NodeAd
11260 64 54 65 72 6d 28 70 2c 20 26 70 50 61 72 65 6e dTerm(p, &pParen
11270 74 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c 20 7a t, isCopyTerm, z
11280 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 Term, nTerm);.
11290 20 20 69 66 28 20 70 54 72 65 65 2d 3e 70 50 61 if( pTree->pPa
112a0 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 rent==0 ){.
112b0 20 70 54 72 65 65 2d 3e 70 50 61 72 65 6e 74 20 pTree->pParent
112c0 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 7d = pParent;. }
112d0 0a 20 20 20 20 70 54 72 65 65 2d 3e 70 52 69 67 . pTree->pRig
112e0 68 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 ht = pNew;. p
112f0 4e 65 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d New->pLeftmost =
11300 20 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 pTree->pLeftmos
11310 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 t;. pNew->pPa
11320 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a rent = pParent;.
11330 20 20 20 20 70 4e 65 77 2d 3e 7a 4d 61 6c 6c 6f pNew->zMallo
11340 63 20 3d 20 70 54 72 65 65 2d 3e 7a 4d 61 6c 6c c = pTree->zMall
11350 6f 63 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4d oc;. pNew->nM
11360 61 6c 6c 6f 63 20 3d 20 70 54 72 65 65 2d 3e 6e alloc = pTree->n
11370 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 70 54 72 65 Malloc;. pTre
11380 65 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a e->zMalloc = 0;.
11390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 }else{. pNe
113a0 77 2d 3e 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 w->pLeftmost = p
113b0 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 New;. rc = ft
113c0 73 33 4e 6f 64 65 41 64 64 54 65 72 6d 28 70 2c s3NodeAddTerm(p,
113d0 20 26 70 4e 65 77 2c 20 69 73 43 6f 70 79 54 65 &pNew, isCopyTe
113e0 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d rm, zTerm, nTerm
113f0 29 3b 20 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 72 ); . }.. *ppTr
11400 65 65 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 ee = pNew;. ret
11410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
11420 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e Helper function
11430 20 66 6f 72 20 66 74 73 33 4e 6f 64 65 57 72 69 for fts3NodeWri
11440 74 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 te()..*/.static
11450 69 6e 74 20 66 74 73 33 54 72 65 65 46 69 6e 69 int fts3TreeFini
11460 73 68 4e 6f 64 65 28 0a 20 20 53 65 67 6d 65 6e shNode(. Segmen
11470 74 4e 6f 64 65 20 2a 70 54 72 65 65 2c 20 0a 20 tNode *pTree, .
11480 20 69 6e 74 20 69 48 65 69 67 68 74 2c 20 0a 20 int iHeight, .
11490 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
114a0 4c 65 66 74 43 68 69 6c 64 0a 29 7b 0a 20 20 69 LeftChild.){. i
114b0 6e 74 20 6e 53 74 61 72 74 3b 0a 20 20 61 73 73 nt nStart;. ass
114c0 65 72 74 28 20 69 48 65 69 67 68 74 3e 3d 31 20 ert( iHeight>=1
114d0 26 26 20 69 48 65 69 67 68 74 3c 31 32 38 20 29 && iHeight<128 )
114e0 3b 0a 20 20 6e 53 74 61 72 74 20 3d 20 46 54 53 ;. nStart = FTS
114f0 33 5f 56 41 52 49 4e 54 5f 4d 41 58 20 2d 20 73 3_VARINT_MAX - s
11500 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 6e 74 qlite3Fts3Varint
11510 4c 65 6e 28 69 4c 65 66 74 43 68 69 6c 64 29 3b Len(iLeftChild);
11520 0a 20 20 70 54 72 65 65 2d 3e 61 44 61 74 61 5b . pTree->aData[
11530 6e 53 74 61 72 74 5d 20 3d 20 28 63 68 61 72 29 nStart] = (char)
11540 69 48 65 69 67 68 74 3b 0a 20 20 73 71 6c 69 74 iHeight;. sqlit
11550 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 e3Fts3PutVarint(
11560 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 &pTree->aData[nS
11570 74 61 72 74 2b 31 5d 2c 20 69 4c 65 66 74 43 68 tart+1], iLeftCh
11580 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e ild);. return n
11590 53 74 61 72 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 Start;.}../*.**
115a0 57 72 69 74 65 20 74 68 65 20 62 75 66 66 65 72 Write the buffer
115b0 20 66 6f 72 20 74 68 65 20 73 65 67 6d 65 6e 74 for the segment
115c0 20 6e 6f 64 65 20 70 54 72 65 65 20 61 6e 64 20 node pTree and
115d0 61 6c 6c 20 6f 66 20 69 74 73 20 70 65 65 72 73 all of its peers
115e0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 to the.** datab
115f0 61 73 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 74 ase. Then call t
11600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 63 his function rec
11610 75 72 73 69 76 65 6c 79 20 74 6f 20 77 72 69 74 ursively to writ
11620 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 e the parent of
11630 0a 2a 2a 20 70 54 72 65 65 20 61 6e 64 20 69 74 .** pTree and it
11640 73 20 70 65 65 72 73 20 74 6f 20 74 68 65 20 64 s peers to the d
11650 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 atabase. .**.**
11660 45 78 63 65 70 74 2c 20 69 66 20 70 54 72 65 65 Except, if pTree
11670 20 69 73 20 61 20 72 6f 6f 74 20 6e 6f 64 65 2c is a root node,
11680 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 do not write it
11690 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 to the database
116a0 2e 20 49 6e 73 74 65 61 64 2c 0a 2a 2a 20 73 65 . Instead,.** se
116b0 74 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c t output variabl
116c0 65 73 20 2a 70 61 52 6f 6f 74 20 61 6e 64 20 2a es *paRoot and *
116d0 70 6e 52 6f 6f 74 20 74 6f 20 63 6f 6e 74 61 69 pnRoot to contai
116e0 6e 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e n the root node.
116f0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 .**.** If succes
11700 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 sful, SQLITE_OK
11710 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 is returned and
11720 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 output variable
11730 2a 70 69 4c 61 73 74 20 69 73 0a 2a 2a 20 73 65 *piLast is.** se
11740 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 t to the largest
11750 20 62 6c 6f 63 6b 69 64 20 77 72 69 74 74 65 6e blockid written
11760 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 to the database
11770 20 28 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 0a (or zero if no.
11780 2a 2a 20 62 6c 6f 63 6b 73 20 77 65 72 65 20 77 ** blocks were w
11790 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 62 ritten to the db
117a0 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e ). Otherwise, an
117b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f SQLite error co
117c0 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e de is .** return
117d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ed..*/.static in
117e0 74 20 66 74 73 33 4e 6f 64 65 57 72 69 74 65 28 t fts3NodeWrite(
117f0 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c . Fts3Table *p,
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11810 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 /* Virtual ta
11820 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 ble handle */.
11830 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 SegmentNode *pTr
11840 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ee,
11850 2f 2a 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 68 /* SegmentNode h
11860 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 andle */. int i
11870 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 Height,
11880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 /* He
11890 69 67 68 74 20 6f 66 20 74 68 69 73 20 6e 6f 64 ight of this nod
118a0 65 20 69 6e 20 74 72 65 65 20 2a 2f 0a 20 20 73 e in tree */. s
118b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 65 qlite3_int64 iLe
118c0 61 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f af, /
118d0 2a 20 42 6c 6f 63 6b 20 69 64 20 6f 66 20 66 69 * Block id of fi
118e0 72 73 74 20 6c 65 61 66 20 6e 6f 64 65 20 2a 2f rst leaf node */
118f0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 . sqlite3_int64
11900 20 69 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 iFree,
11910 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 64 20 6f /* Block id o
11920 66 20 6e 65 78 74 20 66 72 65 65 20 73 6c 6f 74 f next free slot
11930 20 69 6e 20 25 5f 73 65 67 6d 65 6e 74 73 20 2a in %_segments *
11940 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 /. sqlite3_int6
11950 34 20 2a 70 69 4c 61 73 74 2c 20 20 20 20 20 20 4 *piLast,
11960 20 20 20 20 2f 2a 20 4f 55 54 3a 20 42 6c 6f 63 /* OUT: Bloc
11970 6b 20 69 64 20 6f 66 20 6c 61 73 74 20 65 6e 74 k id of last ent
11980 72 79 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 ry written */.
11990 63 68 61 72 20 2a 2a 70 61 52 6f 6f 74 2c 20 20 char **paRoot,
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
119b0 2f 2a 20 4f 55 54 3a 20 44 61 74 61 20 66 6f 72 /* OUT: Data for
119c0 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 root node */.
119d0 69 6e 74 20 2a 70 6e 52 6f 6f 74 20 20 20 20 20 int *pnRoot
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
119f0 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 /* OUT: Size of
11a00 72 6f 6f 74 20 6e 6f 64 65 20 69 6e 20 62 79 74 root node in byt
11a10 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 es */.){. int r
11a20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a c = SQLITE_OK;..
11a30 20 20 69 66 28 20 21 70 54 72 65 65 2d 3e 70 50 if( !pTree->pP
11a40 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 arent ){. /*
11a50 52 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 74 68 65 Root node of the
11a60 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e tree. */. in
11a70 74 20 6e 53 74 61 72 74 20 3d 20 66 74 73 33 54 t nStart = fts3T
11a80 72 65 65 46 69 6e 69 73 68 4e 6f 64 65 28 70 54 reeFinishNode(pT
11a90 72 65 65 2c 20 69 48 65 69 67 68 74 2c 20 69 4c ree, iHeight, iL
11aa0 65 61 66 29 3b 0a 20 20 20 20 2a 70 69 4c 61 73 eaf);. *piLas
11ab0 74 20 3d 20 69 46 72 65 65 2d 31 3b 0a 20 20 20 t = iFree-1;.
11ac0 20 2a 70 6e 52 6f 6f 74 20 3d 20 70 54 72 65 65 *pnRoot = pTree
11ad0 2d 3e 6e 44 61 74 61 20 2d 20 6e 53 74 61 72 74 ->nData - nStart
11ae0 3b 0a 20 20 20 20 2a 70 61 52 6f 6f 74 20 3d 20 ;. *paRoot =
11af0 26 70 54 72 65 65 2d 3e 61 44 61 74 61 5b 6e 53 &pTree->aData[nS
11b00 74 61 72 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a tart];. }else{.
11b10 20 20 20 20 53 65 67 6d 65 6e 74 4e 6f 64 65 20 SegmentNode
11b20 2a 70 49 74 65 72 3b 0a 20 20 20 20 73 71 6c 69 *pIter;. sqli
11b30 74 65 33 5f 69 6e 74 36 34 20 69 4e 65 78 74 46 te3_int64 iNextF
11b40 72 65 65 20 3d 20 69 46 72 65 65 3b 0a 20 20 20 ree = iFree;.
11b50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
11b60 4e 65 78 74 4c 65 61 66 20 3d 20 69 4c 65 61 66 NextLeaf = iLeaf
11b70 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d ;. for(pIter=
11b80 70 54 72 65 65 2d 3e 70 4c 65 66 74 6d 6f 73 74 pTree->pLeftmost
11b90 3b 20 70 49 74 65 72 20 26 26 20 72 63 3d 3d 53 ; pIter && rc==S
11ba0 51 4c 49 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d QLITE_OK; pIter=
11bb0 70 49 74 65 72 2d 3e 70 52 69 67 68 74 29 7b 0a pIter->pRight){.
11bc0 20 20 20 20 20 20 69 6e 74 20 6e 53 74 61 72 74 int nStart
11bd0 20 3d 20 66 74 73 33 54 72 65 65 46 69 6e 69 73 = fts3TreeFinis
11be0 68 4e 6f 64 65 28 70 49 74 65 72 2c 20 69 48 65 hNode(pIter, iHe
11bf0 69 67 68 74 2c 20 69 4e 65 78 74 4c 65 61 66 29 ight, iNextLeaf)
11c00 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 ;. int nWri
11c10 74 65 20 3d 20 70 49 74 65 72 2d 3e 6e 44 61 74 te = pIter->nDat
11c20 61 20 2d 20 6e 53 74 61 72 74 3b 0a 20 20 0a 20 a - nStart;. .
11c30 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 rc = fts3Wr
11c40 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e iteSegment(p, iN
11c50 65 78 74 46 72 65 65 2c 20 26 70 49 74 65 72 2d extFree, &pIter-
11c60 3e 61 44 61 74 61 5b 6e 53 74 61 72 74 5d 2c 20 >aData[nStart],
11c70 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 nWrite);. i
11c80 4e 65 78 74 46 72 65 65 2b 2b 3b 0a 20 20 20 20 NextFree++;.
11c90 20 20 69 4e 65 78 74 4c 65 61 66 20 2b 3d 20 28 iNextLeaf += (
11ca0 70 49 74 65 72 2d 3e 6e 45 6e 74 72 79 2b 31 29 pIter->nEntry+1)
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
11cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
11cd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 . assert( i
11ce0 4e 65 78 74 4c 65 61 66 3d 3d 69 46 72 65 65 20 NextLeaf==iFree
11cf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 );. rc = ft
11d00 73 33 4e 6f 64 65 57 72 69 74 65 28 0a 20 20 20 s3NodeWrite(.
11d10 20 20 20 20 20 20 20 70 2c 20 70 54 72 65 65 2d p, pTree-
11d20 3e 70 50 61 72 65 6e 74 2c 20 69 48 65 69 67 68 >pParent, iHeigh
11d30 74 2b 31 2c 20 69 46 72 65 65 2c 20 69 4e 65 78 t+1, iFree, iNex
11d40 74 46 72 65 65 2c 20 70 69 4c 61 73 74 2c 20 70 tFree, piLast, p
11d50 61 52 6f 6f 74 2c 20 70 6e 52 6f 6f 74 0a 20 20 aRoot, pnRoot.
11d60 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d );. }. }
11d70 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d .. return rc;.}
11d80 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c ../*.** Free all
11d90 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 memory allocati
11da0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 ons associated w
11db0 69 74 68 20 74 68 65 20 74 72 65 65 20 70 54 72 ith the tree pTr
11dc0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ee..*/.static vo
11dd0 69 64 20 66 74 73 33 4e 6f 64 65 46 72 65 65 28 id fts3NodeFree(
11de0 53 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 54 72 SegmentNode *pTr
11df0 65 65 29 7b 0a 20 20 69 66 28 20 70 54 72 65 65 ee){. if( pTree
11e00 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 4e ){. SegmentN
11e10 6f 64 65 20 2a 70 20 3d 20 70 54 72 65 65 2d 3e ode *p = pTree->
11e20 70 4c 65 66 74 6d 6f 73 74 3b 0a 20 20 20 20 66 pLeftmost;. f
11e30 74 73 33 4e 6f 64 65 46 72 65 65 28 70 2d 3e 70 ts3NodeFree(p->p
11e40 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 77 68 69 Parent);. whi
11e50 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 53 le( p ){. S
11e60 65 67 6d 65 6e 74 4e 6f 64 65 20 2a 70 52 69 67 egmentNode *pRig
11e70 68 74 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a ht = p->pRight;.
11e80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 44 61 if( p->aDa
11e90 74 61 21 3d 28 63 68 61 72 20 2a 29 26 70 5b 31 ta!=(char *)&p[1
11ea0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c ] ){. sql
11eb0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 44 61 ite3_free(p->aDa
11ec0 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ta);. }.
11ed0 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 assert( pRigh
11ee0 74 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 4d 61 6c 6c t==0 || p->zMall
11ef0 6f 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 oc==0 );. s
11f00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a qlite3_free(p->z
11f10 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 73 Malloc);. s
11f20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a qlite3_free(p);.
11f30 20 20 20 20 20 20 70 20 3d 20 70 52 69 67 68 74 p = pRight
11f40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f ;. }. }.}../
11f50 2a 0a 2a 2a 20 41 64 64 20 61 20 74 65 72 6d 20 *.** Add a term
11f60 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 to the segment b
11f70 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 eing constructed
11f80 20 62 79 20 74 68 65 20 53 65 67 6d 65 6e 74 57 by the SegmentW
11f90 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 riter object.**
11fa0 2a 70 70 57 72 69 74 65 72 2e 20 57 68 65 6e 20 *ppWriter. When
11fb0 61 64 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 adding the first
11fc0 20 74 65 72 6d 20 74 6f 20 61 20 73 65 67 6d 65 term to a segme
11fd0 6e 74 2c 20 2a 70 70 57 72 69 74 65 72 20 73 68 nt, *ppWriter sh
11fe0 6f 75 6c 64 0a 2a 2a 20 62 65 20 70 61 73 73 65 ould.** be passe
11ff0 64 20 4e 55 4c 4c 2e 20 54 68 69 73 20 66 75 6e d NULL. This fun
12000 63 74 69 6f 6e 20 77 69 6c 6c 20 61 6c 6c 6f 63 ction will alloc
12010 61 74 65 20 61 20 6e 65 77 20 53 65 67 6d 65 6e ate a new Segmen
12020 74 57 72 69 74 65 72 20 6f 62 6a 65 63 74 0a 2a tWriter object.*
12030 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 20 * and return it
12040 76 69 61 20 74 68 65 20 69 6e 70 75 74 2f 6f 75 via the input/ou
12050 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 tput variable *p
12060 70 57 72 69 74 65 72 20 69 6e 20 74 68 69 73 20 pWriter in this
12070 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 case..**.** If s
12080 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 uccessful, SQLIT
12090 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 E_OK is returned
120a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 . Otherwise, an
120b0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 SQLite error cod
120c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 e..*/.static int
120d0 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41 64 fts3SegWriterAd
120e0 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a d(. Fts3Table *
120f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p,
12100 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 /* Virtual
12110 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a table handle */.
12120 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 SegmentWriter
12130 2a 2a 70 70 57 72 69 74 65 72 2c 20 20 20 20 20 **ppWriter,
12140 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 67 /* IN/OUT: Seg
12150 6d 65 6e 74 57 72 69 74 65 72 20 68 61 6e 64 6c mentWriter handl
12160 65 20 2a 2f 20 0a 20 20 69 6e 74 20 69 73 43 6f e */ . int isCo
12170 70 79 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 pyTerm,
12180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
12190 69 66 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20 if buffer zTerm
121a0 6d 75 73 74 20 62 65 20 63 6f 70 69 65 64 20 2a must be copied *
121b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
121c0 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 zTerm,
121d0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 /* Pointer t
121e0 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e o buffer contain
121f0 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e ing term */. in
12200 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 20 20 20 t nTerm,
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
12220 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e Size of term in
12230 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 bytes */. cons
12240 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 t char *aDoclist
12250 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 , /* P
12260 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 ointer to buffer
12270 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 6f 63 6c containing docl
12280 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 6f ist */. int nDo
12290 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 clist
122a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
122b0 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 of doclist in b
122c0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 ytes */.){. int
122d0 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 nPrefix;
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
122f0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 70 72 65 Size of term pre
12300 66 69 78 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a fix in bytes */.
12310 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 int nSuffix;
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12330 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 /* Size of ter
12340 6d 20 73 75 66 66 69 78 20 69 6e 20 62 79 74 65 m suffix in byte
12350 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 71 3b s */. int nReq;
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12370 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
12380 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 of bytes requir
12390 65 64 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 ed on leaf page
123a0 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a */. int nData;.
123b0 20 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 SegmentWriter
123c0 2a 70 57 72 69 74 65 72 20 3d 20 2a 70 70 57 72 *pWriter = *ppWr
123d0 69 74 65 72 3b 0a 0a 20 20 69 66 28 20 21 70 57 iter;.. if( !pW
123e0 72 69 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 riter ){. int
123f0 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 rc;. sqlite3
12400 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 _stmt *pStmt;..
12410 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 /* Allocate t
12420 68 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 he SegmentWriter
12430 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 structure */.
12440 20 20 70 57 72 69 74 65 72 20 3d 20 28 53 65 67 pWriter = (Seg
12450 6d 65 6e 74 57 72 69 74 65 72 20 2a 29 73 71 6c mentWriter *)sql
12460 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 ite3_malloc(size
12470 6f 66 28 53 65 67 6d 65 6e 74 57 72 69 74 65 72 of(SegmentWriter
12480 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 72 ));. if( !pWr
12490 69 74 65 72 20 29 20 72 65 74 75 72 6e 20 53 51 iter ) return SQ
124a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 LITE_NOMEM;.
124b0 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 memset(pWriter,
124c0 30 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 0, sizeof(Segmen
124d0 74 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 2a tWriter));. *
124e0 70 70 57 72 69 74 65 72 20 3d 20 70 57 72 69 74 ppWriter = pWrit
124f0 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f er;.. /* Allo
12500 63 61 74 65 20 61 20 62 75 66 66 65 72 20 69 6e cate a buffer in
12510 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75 which to accumu
12520 6c 61 74 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 late data */.
12530 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20 pWriter->aData
12540 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 = (char *)sqlite
12550 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 4e 6f 64 3_malloc(p->nNod
12560 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 eSize);. if(
12570 21 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 20 !pWriter->aData
12580 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f ) return SQLITE_
12590 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 57 72 69 74 NOMEM;. pWrit
125a0 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 70 2d 3e 6e er->nSize = p->n
125b0 4e 6f 64 65 53 69 7a 65 3b 0a 0a 20 20 20 20 2f NodeSize;.. /
125c0 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 * Find the next
125d0 66 72 65 65 20 62 6c 6f 63 6b 69 64 20 69 6e 20 free blockid in
125e0 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 the %_segments t
125f0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d able */. rc =
12600 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 fts3SqlStmt(p,
12610 53 51 4c 5f 4e 45 58 54 5f 53 45 47 4d 45 4e 54 SQL_NEXT_SEGMENT
12620 53 5f 49 44 2c 20 26 70 53 74 6d 74 2c 20 30 29 S_ID, &pStmt, 0)
12630 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 ;. if( rc!=SQ
12640 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e LITE_OK ) return
12650 20 72 63 3b 0a 20 20 20 20 69 66 28 20 53 51 4c rc;. if( SQL
12660 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 ITE_ROW==sqlite3
12670 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a _step(pStmt) ){.
12680 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 pWriter->i
12690 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 Free = sqlite3_c
126a0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d olumn_int64(pStm
126b0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 72 t, 0);. pWr
126c0 69 74 65 72 2d 3e 69 46 69 72 73 74 20 3d 20 70 iter->iFirst = p
126d0 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b 0a 20 Writer->iFree;.
126e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 }. rc = sq
126f0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d lite3_reset(pStm
12700 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d t);. if( rc!=
12710 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 SQLITE_OK ) retu
12720 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 44 61 rn rc;. }. nDa
12730 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 44 ta = pWriter->nD
12740 61 74 61 3b 0a 0a 20 20 6e 50 72 65 66 69 78 20 ata;.. nPrefix
12750 3d 20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 = fts3PrefixComp
12760 72 65 73 73 28 70 57 72 69 74 65 72 2d 3e 7a 54 ress(pWriter->zT
12770 65 72 6d 2c 20 70 57 72 69 74 65 72 2d 3e 6e 54 erm, pWriter->nT
12780 65 72 6d 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 erm, zTerm, nTer
12790 6d 29 3b 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 m);. nSuffix =
127a0 6e 54 65 72 6d 2d 6e 50 72 65 66 69 78 3b 0a 0a nTerm-nPrefix;..
127b0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 /* Figure out
127c0 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 61 how many bytes a
127d0 72 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 re required by t
127e0 68 69 73 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f his new entry */
127f0 0a 20 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 . nReq = sqlite
12800 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 3Fts3VarintLen(n
12810 50 72 65 66 69 78 29 20 2b 20 20 20 20 2f 2a 20 Prefix) + /*
12820 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e varint containin
12830 67 20 70 72 65 66 69 78 20 73 69 7a 65 20 2a 2f g prefix size */
12840 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 . sqlite3Fts3
12850 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 VarintLen(nSuffi
12860 78 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 x) + /*
12870 76 61 72 69 6e 74 20 63 6f 6e 74 61 69 6e 69 6e varint containin
12880 67 20 73 75 66 66 69 78 20 73 69 7a 65 20 2a 2f g suffix size */
12890 0a 20 20 20 20 6e 53 75 66 66 69 78 20 2b 20 20 . nSuffix +
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
128c0 54 65 72 6d 20 73 75 66 66 69 78 20 2a 2f 0a 20 Term suffix */.
128d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 sqlite3Fts3Va
128e0 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 rintLen(nDoclist
128f0 29 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 ) + /* Si
12900 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f ze of doclist */
12910 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 3b 20 20 . nDoclist;
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
12940 44 6f 63 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a Doclist data */.
12950 0a 20 20 69 66 28 20 6e 44 61 74 61 3e 30 20 26 . if( nData>0 &
12960 26 20 6e 44 61 74 61 2b 6e 52 65 71 3e 70 2d 3e & nData+nReq>p->
12970 6e 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 nNodeSize ){.
12980 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 2f 2a int rc;.. /*
12990 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 The current lea
129a0 66 20 6e 6f 64 65 20 69 73 20 66 75 6c 6c 2e 20 f node is full.
129b0 57 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 Write it out to
129c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f the database. */
129d0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 . rc = fts3Wr
129e0 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 iteSegment(p, pW
129f0 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 riter->iFree++,
12a00 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 pWriter->aData,
12a10 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 nData);. if(
12a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 rc!=SQLITE_OK )
12a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 return rc;. p
12a40 2d 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 0a 20 ->nLeafAdd++;..
12a50 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 75 /* Add the cu
12a60 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74 68 rrent term to th
12a70 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 e interior node
12a80 74 72 65 65 2e 20 54 68 65 20 74 65 72 6d 20 61 tree. The term a
12a90 64 64 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 74 dded to. ** t
12aa0 68 65 20 69 6e 74 65 72 69 6f 72 20 74 72 65 65 he interior tree
12ab0 20 6d 75 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 must:. **.
12ac0 20 20 2a 2a 20 20 20 61 29 20 62 65 20 67 72 65 ** a) be gre
12ad0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 ater than the la
12ae0 72 67 65 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 rgest term on th
12af0 65 20 6c 65 61 66 20 6e 6f 64 65 20 6a 75 73 74 e leaf node just
12b00 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 written. **
12b10 20 20 20 20 20 74 6f 20 74 68 65 20 64 61 74 61 to the data
12b20 62 61 73 65 20 28 73 74 69 6c 6c 20 61 76 61 69 base (still avai
12b30 6c 61 62 6c 65 20 69 6e 20 70 57 72 69 74 65 72 lable in pWriter
12b40 2d 3e 7a 54 65 72 6d 29 2c 20 61 6e 64 0a 20 20 ->zTerm), and.
12b50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29 **. ** b)
12b60 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 be less than or
12b70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65 equal to the te
12b80 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61 rm about to be a
12b90 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a dded to the new.
12ba0 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66 ** leaf
12bb0 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65 node (zTerm/nTe
12bc0 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 rm).. **.
12bd0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 ** In other word
12be0 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 s, it must be th
12bf0 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72 e prefix of zTer
12c00 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 m 1 byte longer
12c10 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 than. ** the
12c20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 common prefix (i
12c30 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20 f any) of zTerm
12c40 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 and pWriter->zTe
12c50 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 rm.. */. a
12c60 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 3c 6e ssert( nPrefix<n
12c70 54 65 72 6d 20 29 3b 0a 20 20 20 20 72 63 20 3d Term );. rc =
12c80 20 66 74 73 33 4e 6f 64 65 41 64 64 54 65 72 6d fts3NodeAddTerm
12c90 28 70 2c 20 26 70 57 72 69 74 65 72 2d 3e 70 54 (p, &pWriter->pT
12ca0 72 65 65 2c 20 69 73 43 6f 70 79 54 65 72 6d 2c ree, isCopyTerm,
12cb0 20 7a 54 65 72 6d 2c 20 6e 50 72 65 66 69 78 2b zTerm, nPrefix+
12cc0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 1);. if( rc!=
12cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 SQLITE_OK ) retu
12ce0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 6e 44 61 74 rn rc;.. nDat
12cf0 61 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 a = 0;. pWrit
12d00 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 0a er->nTerm = 0;..
12d10 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b nPrefix = 0;
12d20 0a 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e . nSuffix = n
12d30 54 65 72 6d 3b 0a 20 20 20 20 6e 52 65 71 20 3d Term;. nReq =
12d40 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 1 +
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12d60 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 /* varint cont
12d70 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 73 69 aining prefix si
12d80 7a 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 ze */. sqli
12d90 74 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e te3Fts3VarintLen
12da0 28 6e 54 65 72 6d 29 20 2b 20 20 20 20 20 20 20 (nTerm) +
12db0 20 20 2f 2a 20 76 61 72 69 6e 74 20 63 6f 6e 74 /* varint cont
12dc0 61 69 6e 69 6e 67 20 73 75 66 66 69 78 20 73 69 aining suffix si
12dd0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 6e 54 65 72 ze */. nTer
12de0 6d 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 m +
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e00 20 20 2f 2a 20 54 65 72 6d 20 73 75 66 66 69 78 /* Term suffix
12e10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 */. sqlite
12e20 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 3Fts3VarintLen(n
12e30 44 6f 63 6c 69 73 74 29 20 2b 20 20 20 20 20 20 Doclist) +
12e40 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 /* Size of docli
12e50 73 74 20 2a 2f 0a 20 20 20 20 20 20 6e 44 6f 63 st */. nDoc
12e60 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 list;
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e80 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 64 61 74 /* Doclist dat
12e90 61 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 a */. }.. /* I
12ea0 6e 63 72 65 61 73 65 20 74 68 65 20 74 6f 74 61 ncrease the tota
12eb0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 l number of byte
12ec0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 61 63 63 s written to acc
12ed0 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 6e 65 77 ount for the new
12ee0 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 70 57 72 entry. */. pWr
12ef0 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 74 61 20 iter->nLeafData
12f00 2b 3d 20 6e 52 65 71 3b 0a 0a 20 20 2f 2a 20 49 += nReq;.. /* I
12f10 66 20 74 68 65 20 62 75 66 66 65 72 20 63 75 72 f the buffer cur
12f20 72 65 6e 74 6c 79 20 61 6c 6c 6f 63 61 74 65 64 rently allocated
12f30 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f is too small fo
12f40 72 20 74 68 69 73 20 65 6e 74 72 79 2c 20 72 65 r this entry, re
12f50 61 6c 6c 6f 63 0a 20 20 2a 2a 20 74 68 65 20 62 alloc. ** the b
12f60 75 66 66 65 72 20 74 6f 20 6d 61 6b 65 20 69 74 uffer to make it
12f70 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 0a 20 large enough..
12f80 20 2a 2f 0a 20 20 69 66 28 20 6e 52 65 71 3e 70 */. if( nReq>p
12f90 57 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 7b Writer->nSize ){
12fa0 0a 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 20 . char *aNew
12fb0 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f = sqlite3_reallo
12fc0 63 28 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 c(pWriter->aData
12fd0 2c 20 6e 52 65 71 29 3b 0a 20 20 20 20 69 66 28 , nReq);. if(
12fe0 20 21 61 4e 65 77 20 29 20 72 65 74 75 72 6e 20 !aNew ) return
12ff0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 SQLITE_NOMEM;.
13000 20 20 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 pWriter->aData
13010 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 57 72 = aNew;. pWr
13020 69 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 6e 52 iter->nSize = nR
13030 65 71 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 eq;. }. assert
13040 28 20 6e 44 61 74 61 2b 6e 52 65 71 3c 3d 70 57 ( nData+nReq<=pW
13050 72 69 74 65 72 2d 3e 6e 53 69 7a 65 20 29 3b 0a riter->nSize );.
13060 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 . /* Append the
13070 20 70 72 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 prefix-compress
13080 65 64 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 6c ed term and docl
13090 69 73 74 20 74 6f 20 74 68 65 20 62 75 66 66 65 ist to the buffe
130a0 72 2e 20 2a 2f 0a 20 20 6e 44 61 74 61 20 2b 3d r. */. nData +=
130b0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 sqlite3Fts3PutV
130c0 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 2d 3e arint(&pWriter->
130d0 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 6e 50 aData[nData], nP
130e0 72 65 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 refix);. nData
130f0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 += sqlite3Fts3Pu
13100 74 56 61 72 69 6e 74 28 26 70 57 72 69 74 65 72 tVarint(&pWriter
13110 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 ->aData[nData],
13120 6e 53 75 66 66 69 78 29 3b 0a 20 20 6d 65 6d 63 nSuffix);. memc
13130 70 79 28 26 70 57 72 69 74 65 72 2d 3e 61 44 61 py(&pWriter->aDa
13140 74 61 5b 6e 44 61 74 61 5d 2c 20 26 7a 54 65 72 ta[nData], &zTer
13150 6d 5b 6e 50 72 65 66 69 78 5d 2c 20 6e 53 75 66 m[nPrefix], nSuf
13160 66 69 78 29 3b 0a 20 20 6e 44 61 74 61 20 2b 3d fix);. nData +=
13170 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 44 61 74 nSuffix;. nDat
13180 61 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 a += sqlite3Fts3
13190 50 75 74 56 61 72 69 6e 74 28 26 70 57 72 69 74 PutVarint(&pWrit
131a0 65 72 2d 3e 61 44 61 74 61 5b 6e 44 61 74 61 5d er->aData[nData]
131b0 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 6d , nDoclist);. m
131c0 65 6d 63 70 79 28 26 70 57 72 69 74 65 72 2d 3e emcpy(&pWriter->
131d0 61 44 61 74 61 5b 6e 44 61 74 61 5d 2c 20 61 44 aData[nData], aD
131e0 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 oclist, nDoclist
131f0 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 );. pWriter->nD
13200 61 74 61 20 3d 20 6e 44 61 74 61 20 2b 20 6e 44 ata = nData + nD
13210 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 53 61 oclist;.. /* Sa
13220 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 ve the current t
13230 65 72 6d 20 73 6f 20 74 68 61 74 20 69 74 20 63 erm so that it c
13240 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 72 an be used to pr
13250 65 66 69 78 2d 63 6f 6d 70 72 65 73 73 20 74 68 efix-compress th
13260 65 20 6e 65 78 74 2e 0a 20 20 2a 2a 20 49 66 20 e next.. ** If
13270 74 68 65 20 69 73 43 6f 70 79 54 65 72 6d 20 70 the isCopyTerm p
13280 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 arameter is true
13290 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 , then the buffe
132a0 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a r pointed to by.
132b0 20 20 2a 2a 20 7a 54 65 72 6d 20 69 73 20 74 72 ** zTerm is tr
132c0 61 6e 73 69 65 6e 74 2c 20 73 6f 20 74 61 6b 65 ansient, so take
132d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74 a copy of the t
132e0 65 72 6d 20 64 61 74 61 2e 20 4f 74 68 65 72 77 erm data. Otherw
132f0 69 73 65 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 73 ise, just. ** s
13300 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20 74 tore a copy of t
13310 68 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f he pointer.. */
13320 0a 20 20 69 66 28 20 69 73 43 6f 70 79 54 65 72 . if( isCopyTer
13330 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 65 m ){. if( nTe
13340 72 6d 3e 70 57 72 69 74 65 72 2d 3e 6e 4d 61 6c rm>pWriter->nMal
13350 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 63 68 61 loc ){. cha
13360 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 r *zNew = sqlite
13370 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 3_realloc(pWrite
13380 72 2d 3e 7a 4d 61 6c 6c 6f 63 2c 20 6e 54 65 72 r->zMalloc, nTer
13390 6d 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 m*2);. if(
133a0 21 7a 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 !zNew ){.
133b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e return SQLITE_N
133c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 OMEM;. }.
133d0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 4d 61 pWriter->nMa
133e0 6c 6c 6f 63 20 3d 20 6e 54 65 72 6d 2a 32 3b 0a lloc = nTerm*2;.
133f0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a pWriter->z
13400 4d 61 6c 6c 6f 63 20 3d 20 7a 4e 65 77 3b 0a 20 Malloc = zNew;.
13410 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 7a 54 pWriter->zT
13420 65 72 6d 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 erm = zNew;.
13430 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 }. assert( pW
13440 72 69 74 65 72 2d 3e 7a 54 65 72 6d 3d 3d 70 57 riter->zTerm==pW
13450 72 69 74 65 72 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 riter->zMalloc )
13460 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 57 72 ;. memcpy(pWr
13470 69 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 7a 54 65 iter->zTerm, zTe
13480 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 65 rm, nTerm);. }e
13490 6c 73 65 7b 0a 20 20 20 20 70 57 72 69 74 65 72 lse{. pWriter
134a0 2d 3e 7a 54 65 72 6d 20 3d 20 28 63 68 61 72 20 ->zTerm = (char
134b0 2a 29 7a 54 65 72 6d 3b 0a 20 20 7d 0a 20 20 70 *)zTerm;. }. p
134c0 57 72 69 74 65 72 2d 3e 6e 54 65 72 6d 20 3d 20 Writer->nTerm =
134d0 6e 54 65 72 6d 3b 0a 0a 20 20 72 65 74 75 72 6e nTerm;.. return
134e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f SQLITE_OK;.}../
134f0 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 64 *.** Flush all d
13500 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 ata associated w
13510 69 74 68 20 74 68 65 20 53 65 67 6d 65 6e 74 57 ith the SegmentW
13520 72 69 74 65 72 20 6f 62 6a 65 63 74 20 70 57 72 riter object pWr
13530 69 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 64 iter to the.** d
13540 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75 atabase. This fu
13550 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 63 nction must be c
13560 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c 20 alled after all
13570 74 65 72 6d 73 20 68 61 76 65 20 62 65 65 6e 20 terms have been
13580 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 added.** to the
13590 73 65 67 6d 65 6e 74 20 75 73 69 6e 67 20 66 74 segment using ft
135a0 73 33 53 65 67 57 72 69 74 65 72 41 64 64 28 29 s3SegWriterAdd()
135b0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c . If successful,
135c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a SQLITE_OK is.**
135d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 returned. Other
135e0 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 wise, an SQLite
135f0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 error code..*/.s
13600 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 tatic int fts3Se
13610 67 57 72 69 74 65 72 46 6c 75 73 68 28 0a 20 20 gWriterFlush(.
13620 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 Fts3Table *p,
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13640 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 /* Virtual table
13650 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 handle */. Seg
13660 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 mentWriter *pWri
13670 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 ter, /*
13680 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 74 6f SegmentWriter to
13690 20 66 6c 75 73 68 20 74 6f 20 74 68 65 20 64 62 flush to the db
136a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e */. sqlite3_in
136b0 74 36 34 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 t64 iLevel,
136c0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 /* Value f
136d0 6f 72 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d or 'level' colum
136e0 6e 20 6f 66 20 25 5f 73 65 67 64 69 72 20 2a 2f n of %_segdir */
136f0 0a 20 20 69 6e 74 20 69 49 64 78 20 20 20 20 20 . int iIdx
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13710 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 /* Value for
13720 27 69 64 78 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 'idx' column of
13730 25 5f 73 65 67 64 69 72 20 2a 2f 0a 29 7b 0a 20 %_segdir */.){.
13740 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 int rc;
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13760 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 /* Return code
13770 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 */. if( pWriter
13780 2d 3e 70 54 72 65 65 20 29 7b 0a 20 20 20 20 73 ->pTree ){. s
13790 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 qlite3_int64 iLa
137a0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 st = 0; /*
137b0 4c 61 72 67 65 73 74 20 62 6c 6f 63 6b 20 69 64 Largest block id
137c0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 written to data
137d0 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 base */. sqli
137e0 74 65 33 5f 69 6e 74 36 34 20 69 4c 61 73 74 4c te3_int64 iLastL
137f0 65 61 66 3b 20 20 20 20 20 20 2f 2a 20 4c 61 72 eaf; /* Lar
13800 67 65 73 74 20 6c 65 61 66 20 62 6c 6f 63 6b 20 gest leaf block
13810 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 64 62 id written to db
13820 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 */. char *zR
13830 6f 6f 74 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 oot = NULL;
13840 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 /* Pointer
13850 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 to buffer conta
13860 69 6e 69 6e 67 20 72 6f 6f 74 20 6e 6f 64 65 20 ining root node
13870 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 */. int nRoot
13880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
13890 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
138a0 62 75 66 66 65 72 20 7a 52 6f 6f 74 20 2a 2f 0a buffer zRoot */.
138b0 0a 20 20 20 20 69 4c 61 73 74 4c 65 61 66 20 3d . iLastLeaf =
138c0 20 70 57 72 69 74 65 72 2d 3e 69 46 72 65 65 3b pWriter->iFree;
138d0 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 . rc = fts3Wr
138e0 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 57 iteSegment(p, pW
138f0 72 69 74 65 72 2d 3e 69 46 72 65 65 2b 2b 2c 20 riter->iFree++,
13900 70 57 72 69 74 65 72 2d 3e 61 44 61 74 61 2c 20 pWriter->aData,
13910 70 57 72 69 74 65 72 2d 3e 6e 44 61 74 61 29 3b pWriter->nData);
13920 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c . if( rc==SQL
13930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
13940 72 63 20 3d 20 66 74 73 33 4e 6f 64 65 57 72 69 rc = fts3NodeWri
13950 74 65 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 70 te(p, pWriter->p
13960 54 72 65 65 2c 20 31 2c 0a 20 20 20 20 20 20 20 Tree, 1,.
13970 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 pWriter->iFir
13980 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 69 46 72 st, pWriter->iFr
13990 65 65 2c 20 26 69 4c 61 73 74 2c 20 26 7a 52 6f ee, &iLast, &zRo
139a0 6f 74 2c 20 26 6e 52 6f 6f 74 29 3b 0a 20 20 20 ot, &nRoot);.
139b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 }. if( rc==S
139c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
139d0 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 rc = fts3Write
139e0 53 65 67 64 69 72 28 70 2c 20 69 4c 65 76 65 6c Segdir(p, iLevel
139f0 2c 20 69 49 64 78 2c 20 0a 20 20 20 20 20 20 20 , iIdx, .
13a00 20 20 20 70 57 72 69 74 65 72 2d 3e 69 46 69 72 pWriter->iFir
13a10 73 74 2c 20 69 4c 61 73 74 4c 65 61 66 2c 20 69 st, iLastLeaf, i
13a20 4c 61 73 74 2c 20 70 57 72 69 74 65 72 2d 3e 6e Last, pWriter->n
13a30 4c 65 61 66 44 61 74 61 2c 20 7a 52 6f 6f 74 2c LeafData, zRoot,
13a40 20 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 7d 0a 20 nRoot);. }.
13a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 }else{. /* T
13a60 68 65 20 65 6e 74 69 72 65 20 74 72 65 65 20 66 he entire tree f
13a70 69 74 73 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 its on the root
13a80 6e 6f 64 65 2e 20 57 72 69 74 65 20 69 74 20 74 node. Write it t
13a90 6f 20 74 68 65 20 73 65 67 64 69 72 20 74 61 62 o the segdir tab
13aa0 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 le. */. rc =
13ab0 66 74 73 33 57 72 69 74 65 53 65 67 64 69 72 28 fts3WriteSegdir(
13ac0 70 2c 20 69 4c 65 76 65 6c 2c 20 69 49 64 78 2c p, iLevel, iIdx,
13ad0 20 0a 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 . 0, 0,
13ae0 30 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 0, pWriter->nLea
13af0 66 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e fData, pWriter->
13b00 61 44 61 74 61 2c 20 70 57 72 69 74 65 72 2d 3e aData, pWriter->
13b10 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 2d nData);. }. p-
13b20 3e 6e 4c 65 61 66 41 64 64 2b 2b 3b 0a 20 20 72 >nLeafAdd++;. r
13b30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
13b40 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6d ** Release all m
13b50 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 emory held by th
13b60 65 20 53 65 67 6d 65 6e 74 57 72 69 74 65 72 20 e SegmentWriter
13b70 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 object passed as
13b80 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 61 the .** first a
13b90 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 rgument..*/.stat
13ba0 69 63 20 76 6f 69 64 20 66 74 73 33 53 65 67 57 ic void fts3SegW
13bb0 72 69 74 65 72 46 72 65 65 28 53 65 67 6d 65 6e riterFree(Segmen
13bc0 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 tWriter *pWriter
13bd0 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 ){. if( pWriter
13be0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
13bf0 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 free(pWriter->aD
13c00 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 ata);. sqlite
13c10 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 3_free(pWriter->
13c20 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 66 74 zMalloc);. ft
13c30 73 33 4e 6f 64 65 46 72 65 65 28 70 57 72 69 74 s3NodeFree(pWrit
13c40 65 72 2d 3e 70 54 72 65 65 29 3b 0a 20 20 20 20 er->pTree);.
13c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72 sqlite3_free(pWr
13c60 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a iter);. }.}../*
13c70 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 76 61 .** The first va
13c80 6c 75 65 20 69 6e 20 74 68 65 20 61 70 56 61 6c lue in the apVal
13c90 5b 5d 20 61 72 72 61 79 20 69 73 20 61 73 73 75 [] array is assu
13ca0 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 med to contain a
13cb0 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 20 54 68 n integer..** Th
13cc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 is function test
13cd0 73 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 s if there exist
13ce0 20 61 6e 79 20 64 6f 63 75 6d 65 6e 74 73 20 77 any documents w
13cf0 69 74 68 20 64 6f 63 69 64 20 76 61 6c 75 65 73 ith docid values
13d00 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 64 69 66 that.** are dif
13d10 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 61 74 ferent from that
13d20 20 69 6e 74 65 67 65 72 2e 20 69 2e 65 2e 20 69 integer. i.e. i
13d30 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 64 f deleting the d
13d40 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 64 6f 63 ocument with doc
13d50 69 64 0a 2a 2a 20 70 52 6f 77 69 64 20 77 6f 75 id.** pRowid wou
13d60 6c 64 20 6d 65 61 6e 20 74 68 65 20 46 54 53 33 ld mean the FTS3
13d70 20 74 61 62 6c 65 20 77 65 72 65 20 65 6d 70 74 table were empt
13d80 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 y..**.** If succ
13d90 65 73 73 66 75 6c 2c 20 2a 70 69 73 45 6d 70 74 essful, *pisEmpt
13da0 79 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 y is set to true
13db0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 if the table is
13dc0 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f empty except fo
13dd0 72 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 20 70 52 r.** document pR
13de0 6f 77 69 64 2c 20 6f 72 20 66 61 6c 73 65 20 6f owid, or false o
13df0 74 68 65 72 77 69 73 65 2c 20 61 6e 64 20 53 51 therwise, and SQ
13e00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 LITE_OK is retur
13e10 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 ned. If an.** er
13e20 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 ror occurs, an S
13e30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 QLite error code
13e40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f is returned..*/
13e50 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 .static int fts3
13e60 49 73 45 6d 70 74 79 28 46 74 73 33 54 61 62 6c IsEmpty(Fts3Tabl
13e70 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 e *p, sqlite3_va
13e80 6c 75 65 20 2a 70 52 6f 77 69 64 2c 20 69 6e 74 lue *pRowid, int
13e90 20 2a 70 69 73 45 6d 70 74 79 29 7b 0a 20 20 73 *pisEmpty){. s
13ea0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 qlite3_stmt *pSt
13eb0 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 mt;. int rc;.
13ec0 69 66 28 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 if( p->zContentT
13ed0 62 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 bl ){. /* If
13ee0 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e using the conten
13ef0 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 61 73 t=xxx option, as
13f00 73 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 69 sume the table i
13f10 73 20 6e 65 76 65 72 20 65 6d 70 74 79 20 2a 2f s never empty */
13f20 0a 20 20 20 20 2a 70 69 73 45 6d 70 74 79 20 3d . *pisEmpty =
13f30 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 0;. rc = SQL
13f40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b ITE_OK;. }else{
13f50 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 . rc = fts3Sq
13f60 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 49 53 5f lStmt(p, SQL_IS_
13f70 45 4d 50 54 59 2c 20 26 70 53 74 6d 74 2c 20 26 EMPTY, &pStmt, &
13f80 70 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 pRowid);. if(
13f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
13fa0 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 {. if( SQLI
13fb0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f TE_ROW==sqlite3_
13fc0 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 step(pStmt) ){.
13fd0 20 20 20 20 20 20 20 2a 70 69 73 45 6d 70 74 79 *pisEmpty
13fe0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d = sqlite3_colum
13ff0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b n_int(pStmt, 0);
14000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 . }. r
14010 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 c = sqlite3_rese
14020 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a t(pStmt);. }.
14030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b }. return rc;
14040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 .}../*.** Set *p
14050 6e 4d 61 78 20 74 6f 20 74 68 65 20 6c 61 72 67 nMax to the larg
14060 65 73 74 20 73 65 67 6d 65 6e 74 20 6c 65 76 65 est segment leve
14070 6c 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 l in the databas
14080 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a e for the index.
14090 2a 2a 20 69 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a ** iIndex..**.**
140a0 20 53 65 67 6d 65 6e 74 20 6c 65 76 65 6c 73 20 Segment levels
140b0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 are stored in th
140c0 65 20 27 6c 65 76 65 6c 27 20 63 6f 6c 75 6d 6e e 'level' column
140d0 20 6f 66 20 74 68 65 20 25 5f 73 65 67 64 69 72 of the %_segdir
140e0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 table..**.** Re
140f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 turn SQLITE_OK i
14100 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 f successful, or
14110 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 an SQLite error
14120 20 63 6f 64 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f code if not..*/
14130 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 .static int fts3
14140 53 65 67 6d 65 6e 74 4d 61 78 4c 65 76 65 6c 28 SegmentMaxLevel(
14150 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c . Fts3Table *p,
14160 20 0a 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c . int iLangid,
14170 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c 20 0a . int iIndex, .
14180 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
14190 2a 70 6e 4d 61 78 0a 29 7b 0a 20 20 73 71 6c 69 *pnMax.){. sqli
141a0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b te3_stmt *pStmt;
141b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 . int rc;. ass
141c0 65 72 74 28 20 69 49 6e 64 65 78 3e 3d 30 20 26 ert( iIndex>=0 &
141d0 26 20 69 49 6e 64 65 78 3c 70 2d 3e 6e 49 6e 64 & iIndex<p->nInd
141e0 65 78 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 ex );.. /* Set
141f0 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63 6f 6d pStmt to the com
14200 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 piled version of
14210 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 53 45 :. **. ** SE
14220 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c 29 20 LECT max(level)
14230 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 67 64 FROM %Q.'%q_segd
14240 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 6c 20 ir' WHERE level
14250 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 0a BETWEEN ? AND ?.
14260 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 34 20 **. ** (1024
14270 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 65 20 is actually the
14280 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f 20 46 value of macro F
14290 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45 46 49 TS3_SEGDIR_PREFI
142a0 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 20 2a XLEVEL_STR).. *
142b0 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c /. rc = fts3Sql
142c0 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 Stmt(p, SQL_SELE
142d0 43 54 5f 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 CT_SEGDIR_MAX_LE
142e0 56 45 4c 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b VEL, &pStmt, 0);
142f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 . if( rc!=SQLIT
14300 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 E_OK ) return rc
14310 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 ;. sqlite3_bind
14320 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 2c _int64(pStmt, 1,
14330 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 getAbsoluteLeve
14340 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 l(p, iLangid, iI
14350 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 73 71 6c ndex, 0));. sql
14360 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 ite3_bind_int64(
14370 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 20 pStmt, 2, .
14380 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 getAbsoluteLeve
14390 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 l(p, iLangid, iI
143a0 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 44 49 ndex, FTS3_SEGDI
143b0 52 5f 4d 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 R_MAXLEVEL-1).
143c0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f );. if( SQLITE_
143d0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 ROW==sqlite3_ste
143e0 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 p(pStmt) ){.
143f0 2a 70 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 *pnMax = sqlite3
14400 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 _column_int64(pS
14410 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 tmt, 0);. }. r
14420 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 72 65 eturn sqlite3_re
14430 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f set(pStmt);.}../
14440 2a 0a 2a 2a 20 69 41 62 73 4c 65 76 65 6c 20 69 *.** iAbsLevel i
14450 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6c 65 s an absolute le
14460 76 65 6c 20 74 68 61 74 20 6d 61 79 20 62 65 20 vel that may be
14470 61 73 73 75 6d 65 64 20 74 6f 20 65 78 69 73 74 assumed to exist
14480 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 64 within.** the d
14490 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 66 75 atabase. This fu
144a0 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 nction checks if
144b0 20 69 74 20 69 73 20 74 68 65 20 6c 61 72 67 65 it is the large
144c0 73 74 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 0a st level number.
144d0 2a 2a 20 77 69 74 68 69 6e 20 69 74 73 20 69 6e ** within its in
144e0 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f dex. Assuming no
144f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a error occurs, *
14500 70 62 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 pbMax is set to
14510 31 20 69 66 0a 2a 2a 20 69 41 62 73 4c 65 76 65 1 if.** iAbsLeve
14520 6c 20 69 73 20 69 6e 64 65 65 64 20 74 68 65 20 l is indeed the
14530 6c 61 72 67 65 73 74 20 6c 65 76 65 6c 2c 20 6f largest level, o
14540 72 20 30 20 6f 74 68 65 72 77 69 73 65 2c 20 61 r 0 otherwise, a
14550 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 nd SQLITE_OK.**
14560 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 is returned. If
14570 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c an error occurs,
14580 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 an error code i
14590 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 s returned and t
145a0 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 76 61 6c 75 he.** final valu
145b0 65 20 6f 66 20 2a 70 62 4d 61 78 20 69 73 20 75 e of *pbMax is u
145c0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 ndefined..*/.sta
145d0 74 69 63 20 69 6e 74 20 66 74 73 33 53 65 67 6d tic int fts3Segm
145e0 65 6e 74 49 73 4d 61 78 4c 65 76 65 6c 28 46 74 entIsMaxLevel(Ft
145f0 73 33 54 61 62 6c 65 20 2a 70 2c 20 69 36 34 20 s3Table *p, i64
14600 69 41 62 73 4c 65 76 65 6c 2c 20 69 6e 74 20 2a iAbsLevel, int *
14610 70 62 4d 61 78 29 7b 0a 0a 20 20 2f 2a 20 53 65 pbMax){.. /* Se
14620 74 20 70 53 74 6d 74 20 74 6f 20 74 68 65 20 63 t pStmt to the c
14630 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 ompiled version
14640 6f 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 of:. **. **
14650 53 45 4c 45 43 54 20 6d 61 78 28 6c 65 76 65 6c SELECT max(level
14660 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 73 65 ) FROM %Q.'%q_se
14670 67 64 69 72 27 20 57 48 45 52 45 20 6c 65 76 65 gdir' WHERE leve
14680 6c 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 l BETWEEN ? AND
14690 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 31 30 32 ?. **. ** (102
146a0 34 20 69 73 20 61 63 74 75 61 6c 6c 79 20 74 68 4 is actually th
146b0 65 20 76 61 6c 75 65 20 6f 66 20 6d 61 63 72 6f e value of macro
146c0 20 46 54 53 33 5f 53 45 47 44 49 52 5f 50 52 45 FTS3_SEGDIR_PRE
146d0 46 49 58 4c 45 56 45 4c 5f 53 54 52 29 2e 0a 20 FIXLEVEL_STR)..
146e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 */. sqlite3_st
146f0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 mt *pStmt;. int
14700 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d rc = fts3SqlStm
14710 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 43 54 5f t(p, SQL_SELECT_
14720 53 45 47 44 49 52 5f 4d 41 58 5f 4c 45 56 45 4c SEGDIR_MAX_LEVEL
14730 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 , &pStmt, 0);.
14740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
14750 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 K ) return rc;.
14760 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
14770 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 41 t64(pStmt, 1, iA
14780 62 73 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 73 71 bsLevel+1);. sq
14790 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 lite3_bind_int64
147a0 28 70 53 74 6d 74 2c 20 32 2c 20 0a 20 20 20 20 (pStmt, 2, .
147b0 20 20 28 28 69 41 62 73 4c 65 76 65 6c 2f 46 54 ((iAbsLevel/FT
147c0 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 S3_SEGDIR_MAXLEV
147d0 45 4c 29 2b 31 29 20 2a 20 46 54 53 33 5f 53 45 EL)+1) * FTS3_SE
147e0 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 0a 20 20 GDIR_MAXLEVEL.
147f0 29 3b 0a 0a 20 20 2a 70 62 4d 61 78 20 3d 20 30 );.. *pbMax = 0
14800 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 ;. if( SQLITE_R
14810 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 OW==sqlite3_step
14820 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 2a (pStmt) ){. *
14830 70 62 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 5f pbMax = sqlite3_
14840 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d column_type(pStm
14850 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 t, 0)==SQLITE_NU
14860 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e LL;. }. return
14870 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 sqlite3_reset(p
14880 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 Stmt);.}../*.**
14890 44 65 6c 65 74 65 20 61 6c 6c 20 65 6e 74 72 69 Delete all entri
148a0 65 73 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d es in the %_segm
148b0 65 6e 74 73 20 74 61 62 6c 65 20 61 73 73 6f 63 ents table assoc
148c0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 iated with the s
148d0 65 67 6d 65 6e 74 0a 2a 2a 20 6f 70 65 6e 65 64 egment.** opened
148e0 20 77 69 74 68 20 73 65 67 2d 72 65 61 64 65 72 with seg-reader
148f0 20 70 53 65 67 2e 20 54 68 69 73 20 66 75 6e 63 pSeg. This func
14900 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 66 tion does not af
14910 66 65 63 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 fect the content
14920 73 0a 2a 2a 20 6f 66 20 74 68 65 20 25 5f 73 65 s.** of the %_se
14930 67 64 69 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 gdir table..*/.s
14940 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 44 65 tatic int fts3De
14950 6c 65 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 46 leteSegment(. F
14960 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 ts3Table *p,
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
14980 2a 20 46 54 53 20 74 61 62 6c 65 20 68 61 6e 64 * FTS table hand
14990 6c 65 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 52 le */. Fts3SegR
149a0 65 61 64 65 72 20 2a 70 53 65 67 20 20 20 20 20 eader *pSeg
149b0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 /* Segme
149c0 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a nt to delete */.
149d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 ){. int rc = SQ
149e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 LITE_OK;
149f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 /* Return c
14a00 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 ode */. if( pSe
14a10 67 2d 3e 69 53 74 61 72 74 42 6c 6f 63 6b 20 29 g->iStartBlock )
14a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 {. sqlite3_st
14a30 6d 74 20 2a 70 44 65 6c 65 74 65 3b 20 20 20 20 mt *pDelete;
14a40 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 /* SQL state
14a50 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 72 ment to delete r
14a60 6f 77 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 ows */. rc =
14a70 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 fts3SqlStmt(p, S
14a80 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 4d 45 4e QL_DELETE_SEGMEN
14a90 54 53 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 TS_RANGE, &pDele
14aa0 74 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 te, 0);. if(
14ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
14ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 . sqlite3_b
14ad0 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 ind_int64(pDelet
14ae0 65 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 74 61 e, 1, pSeg->iSta
14af0 72 74 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 rtBlock);.
14b00 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
14b10 36 34 28 70 44 65 6c 65 74 65 2c 20 32 2c 20 70 64(pDelete, 2, p
14b20 53 65 67 2d 3e 69 45 6e 64 42 6c 6f 63 6b 29 3b Seg->iEndBlock);
14b30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 . sqlite3_s
14b40 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 tep(pDelete);.
14b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
14b60 5f 72 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b _reset(pDelete);
14b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
14b80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
14b90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 This function i
14ba0 73 20 75 73 65 64 20 61 66 74 65 72 20 6d 65 72 s used after mer
14bb0 67 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 73 65 ging multiple se
14bc0 67 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 73 69 gments into a si
14bd0 6e 67 6c 65 20 6c 61 72 67 65 0a 2a 2a 20 73 65 ngle large.** se
14be0 67 6d 65 6e 74 20 74 6f 20 64 65 6c 65 74 65 20 gment to delete
14bf0 74 68 65 20 6f 6c 64 2c 20 6e 6f 77 20 72 65 64 the old, now red
14c00 75 6e 64 61 6e 74 2c 20 73 65 67 6d 65 6e 74 20 undant, segment
14c10 62 2d 74 72 65 65 73 2e 20 53 70 65 63 69 66 69 b-trees. Specifi
14c20 63 61 6c 6c 79 2c 0a 2a 2a 20 69 74 3a 0a 2a 2a cally,.** it:.**
14c30 20 0a 2a 2a 20 20 20 31 29 20 44 65 6c 65 74 65 .** 1) Delete
14c40 73 20 61 6c 6c 20 25 5f 73 65 67 6d 65 6e 74 73 s all %_segments
14c50 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 entries for the
14c60 20 73 65 67 6d 65 6e 74 73 20 61 73 73 6f 63 69 segments associ
14c70 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 ated with .**
14c80 20 20 20 65 61 63 68 20 6f 66 20 74 68 65 20 53 each of the S
14c90 65 67 52 65 61 64 65 72 20 6f 62 6a 65 63 74 73 egReader objects
14ca0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 70 61 in the array pa
14cb0 73 73 65 64 20 61 73 20 74 68 65 20 74 68 69 72 ssed as the thir
14cc0 64 20 0a 2a 2a 20 20 20 20 20 20 61 72 67 75 6d d .** argum
14cd0 65 6e 74 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 ent, and.**.**
14ce0 20 32 29 20 64 65 6c 65 74 65 73 20 61 6c 6c 20 2) deletes all
14cf0 25 5f 73 65 67 64 69 72 20 65 6e 74 72 69 65 73 %_segdir entries
14d00 20 77 69 74 68 20 6c 65 76 65 6c 20 69 4c 65 76 with level iLev
14d10 65 6c 2c 20 6f 72 20 61 6c 6c 20 25 5f 73 65 67 el, or all %_seg
14d20 64 69 72 0a 2a 2a 20 20 20 20 20 20 65 6e 74 72 dir.** entr
14d30 69 65 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f ies regardless o
14d40 66 20 6c 65 76 65 6c 20 69 66 20 28 69 4c 65 76 f level if (iLev
14d50 65 6c 3c 30 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c el<0)..**.** SQL
14d60 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e ITE_OK is return
14d70 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c ed if successful
14d80 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 53 , otherwise an S
14d90 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 QLite error code
14da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
14db0 66 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72 fts3DeleteSegdir
14dc0 28 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 (. Fts3Table *p
14dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
14de0 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 /* Virtual t
14df0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 able handle */.
14e00 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 int iLangid,
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14e20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 /* Language id
14e30 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c */. int iIndex,
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14e50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f /* Index fo
14e60 72 20 70 2d 3e 61 49 6e 64 65 78 20 2a 2f 0a 20 r p->aIndex */.
14e70 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 int iLevel,
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14e90 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 25 5f 73 /* Level of %_s
14ea0 65 67 64 69 72 20 65 6e 74 72 69 65 73 20 74 6f egdir entries to
14eb0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 46 74 73 delete */. Fts
14ec0 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 3SegReader **apS
14ed0 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 2f 2a 20 egment, /*
14ee0 41 72 72 61 79 20 6f 66 20 53 65 67 52 65 61 64 Array of SegRead
14ef0 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 er objects */.
14f00 69 6e 74 20 6e 52 65 61 64 65 72 20 20 20 20 20 int nReader
14f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14f20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 /* Size of array
14f30 20 61 70 53 65 67 6d 65 6e 74 20 2a 2f 0a 29 7b apSegment */.){
14f40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
14f50 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 TE_OK;
14f60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 /* Return Cod
14f70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 e */. int i;
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14f90 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 /* Iterat
14fa0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 or variable */.
14fb0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 sqlite3_stmt *p
14fc0 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 Delete = 0;
14fd0 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e /* SQL statemen
14fe0 74 20 74 6f 20 64 65 6c 65 74 65 20 72 6f 77 73 t to delete rows
14ff0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 */.. for(i=0;
15000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
15010 20 69 3c 6e 52 65 61 64 65 72 3b 20 69 2b 2b 29 i<nReader; i++)
15020 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 {. rc = fts3D
15030 65 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 eleteSegment(p,
15040 61 70 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 apSegment[i]);.
15050 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c }. if( rc!=SQL
15060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 ITE_OK ){. re
15070 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 turn rc;. }..
15080 61 73 73 65 72 74 28 20 69 4c 65 76 65 6c 3e 3d assert( iLevel>=
15090 30 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 46 54 53 0 || iLevel==FTS
150a0 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 20 3_SEGCURSOR_ALL
150b0 29 3b 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3d );. if( iLevel=
150c0 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f 52 5f =FTS3_SEGCURSOR_
150d0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 ALL ){. rc =
150e0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 fts3SqlStmt(p, S
150f0 51 4c 5f 44 45 4c 45 54 45 5f 53 45 47 44 49 52 QL_DELETE_SEGDIR
15100 5f 52 41 4e 47 45 2c 20 26 70 44 65 6c 65 74 65 _RANGE, &pDelete
15110 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 , 0);. if( rc
15120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 ==SQLITE_OK ){.
15130 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e sqlite3_bin
15140 64 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c d_int64(pDelete,
15150 20 31 2c 20 67 65 74 41 62 73 6f 6c 75 74 65 4c 1, getAbsoluteL
15160 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 64 2c evel(p, iLangid,
15170 20 69 49 6e 64 65 78 2c 20 30 29 29 3b 0a 20 20 iIndex, 0));.
15180 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
15190 5f 69 6e 74 36 34 28 70 44 65 6c 65 74 65 2c 20 _int64(pDelete,
151a0 32 2c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 2, . ge
151b0 74 41 62 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 tAbsoluteLevel(p
151c0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 , iLangid, iInde
151d0 78 2c 20 46 54 53 33 5f 53 45 47 44 49 52 5f 4d x, FTS3_SEGDIR_M
151e0 41 58 4c 45 56 45 4c 2d 31 29 0a 20 20 20 20 20 AXLEVEL-1).
151f0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 );. }. }els
15200 65 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 e{. rc = fts3
15210 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 SqlStmt(p, SQL_D
15220 45 4c 45 54 45 5f 53 45 47 44 49 52 5f 4c 45 56 ELETE_SEGDIR_LEV
15230 45 4c 2c 20 26 70 44 65 6c 65 74 65 2c 20 30 29 EL, &pDelete, 0)
15240 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 ;. if( rc==SQ
15250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
15260 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
15270 74 36 34 28 0a 20 20 20 20 20 20 20 20 20 20 70 t64(. p
15280 44 65 6c 65 74 65 2c 20 31 2c 20 67 65 74 41 62 Delete, 1, getAb
15290 73 6f 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 soluteLevel(p, i
152a0 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 Langid, iIndex,
152b0 69 4c 65 76 65 6c 29 0a 20 20 20 20 20 20 29 3b iLevel). );
152c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 . }. }.. if
152d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
152e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 ){. sqlite3_s
152f0 74 65 70 28 70 44 65 6c 65 74 65 29 3b 0a 20 20 tep(pDelete);.
15300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 rc = sqlite3_r
15310 65 73 65 74 28 70 44 65 6c 65 74 65 29 3b 0a 20 eset(pDelete);.
15320 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b }.. return rc;
15330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 .}../*.** When t
15340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
15350 63 61 6c 6c 65 64 2c 20 62 75 66 66 65 72 20 2a called, buffer *
15360 70 70 4c 69 73 74 20 28 73 69 7a 65 20 2a 70 6e ppList (size *pn
15370 4c 69 73 74 20 62 79 74 65 73 29 20 63 6f 6e 74 List bytes) cont
15380 61 69 6e 73 20 0a 2a 2a 20 61 20 70 6f 73 69 74 ains .** a posit
15390 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20 6d 61 ion list that ma
153a0 79 20 28 6f 72 20 6d 61 79 20 6e 6f 74 29 20 66 y (or may not) f
153b0 65 61 74 75 72 65 20 6d 75 6c 74 69 70 6c 65 20 eature multiple
153c0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 0a 2a 2a columns. This.**
153d0 20 66 75 6e 63 74 69 6f 6e 20 61 64 6a 75 73 74 function adjust
153e0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 2a 70 s the pointer *p
153f0 70 4c 69 73 74 20 61 6e 64 20 74 68 65 20 6c 65 pList and the le
15400 6e 67 74 68 20 2a 70 6e 4c 69 73 74 20 73 6f 20 ngth *pnList so
15410 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 69 64 65 that they.** ide
15420 6e 74 69 66 79 20 74 68 65 20 73 75 62 73 65 74 ntify the subset
15430 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e of the position
15440 20 6c 69 73 74 20 74 68 61 74 20 63 6f 72 72 65 list that corre
15450 73 70 6f 6e 64 73 20 74 6f 20 63 6f 6c 75 6d 6e sponds to column
15460 20 69 43 6f 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 iCol..**.** If
15470 74 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6e 74 there are no ent
15480 72 69 65 73 20 69 6e 20 74 68 65 20 69 6e 70 75 ries in the inpu
15490 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 t position list
154a0 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c for column iCol,
154b0 20 74 68 65 6e 0a 2a 2a 20 2a 70 6e 4c 69 73 74 then.** *pnList
154c0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 is set to zero
154d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 before returning
154e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d ..**.** If param
154f0 65 74 65 72 20 62 5a 65 72 6f 20 69 73 20 6e 6f eter bZero is no
15500 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 n-zero, then any
15510 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 70 part of the inp
15520 75 74 20 6c 69 73 74 20 66 6f 6c 6c 6f 77 69 6e ut list followin
15530 67 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 g.** the end of
15540 74 68 65 20 6f 75 74 70 75 74 20 6c 69 73 74 20 the output list
15550 69 73 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 is zeroed before
15560 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 returning..*/.s
15570 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 43 tatic void fts3C
15580 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 0a 20 20 69 olumnFilter(. i
15590 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 nt iCol,
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
155b0 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 66 69 6c 74 * Column to filt
155c0 65 72 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 er on */. int b
155d0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 Zero,
155e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 /* Ze
155f0 72 6f 20 6f 75 74 20 61 6e 79 74 68 69 6e 67 20 ro out anything
15600 66 6f 6c 6c 6f 77 69 6e 67 20 2a 70 70 4c 69 73 following *ppLis
15610 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 t */. char **pp
15620 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 List,
15630 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 /* IN/OUT
15640 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 : Pointer to pos
15650 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 ition list */.
15660 69 6e 74 20 2a 70 6e 4c 69 73 74 20 20 20 20 20 int *pnList
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15680 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 69 7a 65 20 /* IN/OUT: Size
15690 6f 66 20 62 75 66 66 65 72 20 2a 70 70 4c 69 73 of buffer *ppLis
156a0 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b t in bytes */.){
156b0 0a 20 20 63 68 61 72 20 2a 70 4c 69 73 74 20 3d . char *pList =
156c0 20 2a 70 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 *ppList;. int
156d0 6e 4c 69 73 74 20 3d 20 2a 70 6e 4c 69 73 74 3b nList = *pnList;
156e0 0a 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 . char *pEnd =
156f0 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 3b 0a 20 &pList[nList];.
15700 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 int iCurrent =
15710 30 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 70 0;. char *p = p
15720 4c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 List;.. assert(
15730 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 77 68 iCol>=0 );. wh
15740 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 63 68 ile( 1 ){. ch
15750 61 72 20 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 ar c = 0;. wh
15760 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28 ile( p<pEnd && (
15770 63 20 7c 20 2a 70 29 26 30 78 46 45 20 29 20 63 c | *p)&0xFE ) c
15780 20 3d 20 2a 70 2b 2b 20 26 20 30 78 38 30 3b 0a = *p++ & 0x80;.
15790 20 20 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d . if( iCol=
157a0 3d 69 43 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 =iCurrent ){.
157b0 20 20 20 6e 4c 69 73 74 20 3d 20 28 69 6e 74 29 nList = (int)
157c0 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a 20 20 20 (p - pList);.
157d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
157e0 0a 20 20 20 20 6e 4c 69 73 74 20 2d 3d 20 28 69 . nList -= (i
157f0 6e 74 29 28 70 20 2d 20 70 4c 69 73 74 29 3b 0a nt)(p - pList);.
15800 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 pList = p;.
15810 20 20 20 69 66 28 20 6e 4c 69 73 74 3d 3d 30 20 if( nList==0
15820 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a ){. break;.
15830 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 26 70 }. p = &p
15840 4c 69 73 74 5b 31 5d 3b 0a 20 20 20 20 70 20 2b List[1];. p +
15850 3d 20 66 74 73 33 47 65 74 56 61 72 69 6e 74 33 = fts3GetVarint3
15860 32 28 70 2c 20 26 69 43 75 72 72 65 6e 74 29 3b 2(p, &iCurrent);
15870 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 5a 65 72 . }.. if( bZer
15880 6f 20 26 26 20 26 70 4c 69 73 74 5b 6e 4c 69 73 o && &pList[nLis
15890 74 5d 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 t]!=pEnd ){.
158a0 6d 65 6d 73 65 74 28 26 70 4c 69 73 74 5b 6e 4c memset(&pList[nL
158b0 69 73 74 5d 2c 20 30 2c 20 70 45 6e 64 20 2d 20 ist], 0, pEnd -
158c0 26 70 4c 69 73 74 5b 6e 4c 69 73 74 5d 29 3b 0a &pList[nList]);.
158d0 20 20 7d 0a 20 20 2a 70 70 4c 69 73 74 20 3d 20 }. *ppList =
158e0 70 4c 69 73 74 3b 0a 20 20 2a 70 6e 4c 69 73 74 pList;. *pnList
158f0 20 3d 20 6e 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a = nList;.}../*.
15900 2a 2a 20 43 61 63 68 65 20 64 61 74 61 20 69 6e ** Cache data in
15910 20 74 68 65 20 46 74 73 33 4d 75 6c 74 69 53 65 the Fts3MultiSe
15920 67 52 65 61 64 65 72 2e 61 42 75 66 66 65 72 5b gReader.aBuffer[
15930 5d 20 62 75 66 66 65 72 20 28 6f 76 65 72 77 72 ] buffer (overwr
15940 69 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 65 78 69 iting any.** exi
15950 73 74 69 6e 67 20 64 61 74 61 29 2e 20 47 72 6f sting data). Gro
15960 77 20 74 68 65 20 62 75 66 66 65 72 20 69 66 20 w the buffer if
15970 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 required..**.**
15980 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 If successful, r
15990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e eturn SQLITE_OK.
159a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 Otherwise, if a
159b0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 n OOM error is e
159c0 6e 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 74 72 ncountered.** tr
159d0 79 69 6e 67 20 74 6f 20 72 65 73 69 7a 65 20 74 ying to resize t
159e0 68 65 20 62 75 66 66 65 72 2c 20 72 65 74 75 72 he buffer, retur
159f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a n SQLITE_NOMEM..
15a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 */.static int ft
15a10 73 33 4d 73 72 42 75 66 66 65 72 44 61 74 61 28 s3MsrBufferData(
15a20 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 . Fts3MultiSegR
15a30 65 61 64 65 72 20 2a 70 4d 73 72 2c 20 20 20 20 eader *pMsr,
15a40 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 6d /* Multi-segm
15a50 65 6e 74 2d 72 65 61 64 65 72 20 68 61 6e 64 6c ent-reader handl
15a60 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4c 69 e */. char *pLi
15a70 73 74 2c 0a 20 20 69 6e 74 20 6e 4c 69 73 74 0a st,. int nList.
15a80 29 7b 0a 20 20 69 66 28 20 6e 4c 69 73 74 3e 70 ){. if( nList>p
15a90 4d 73 72 2d 3e 6e 42 75 66 66 65 72 20 29 7b 0a Msr->nBuffer ){.
15aa0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 3b 0a char *pNew;.
15ab0 20 20 20 20 70 4d 73 72 2d 3e 6e 42 75 66 66 65 pMsr->nBuffe
15ac0 72 20 3d 20 6e 4c 69 73 74 2a 32 3b 0a 20 20 20 r = nList*2;.
15ad0 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 pNew = (char *)
15ae0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 sqlite3_realloc(
15af0 70 4d 73 72 2d 3e 61 42 75 66 66 65 72 2c 20 70 pMsr->aBuffer, p
15b00 4d 73 72 2d 3e 6e 42 75 66 66 65 72 29 3b 0a 20 Msr->nBuffer);.
15b10 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 if( !pNew ) r
15b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d eturn SQLITE_NOM
15b30 45 4d 3b 0a 20 20 20 20 70 4d 73 72 2d 3e 61 42 EM;. pMsr->aB
15b40 75 66 66 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 uffer = pNew;.
15b50 7d 0a 0a 20 20 6d 65 6d 63 70 79 28 70 4d 73 72 }.. memcpy(pMsr
15b60 2d 3e 61 42 75 66 66 65 72 2c 20 70 4c 69 73 74 ->aBuffer, pList
15b70 2c 20 6e 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 , nList);. retu
15b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
15b90 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 .int sqlite3Fts3
15ba0 4d 73 72 49 6e 63 72 4e 65 78 74 28 0a 20 20 46 MsrIncrNext(. F
15bb0 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 ts3Table *p,
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15bd0 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 * Virtual table
15be0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 handle */. Fts3
15bf0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a MultiSegReader *
15c00 70 4d 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 4d pMsr, /* M
15c10 75 6c 74 69 2d 73 65 67 6d 65 6e 74 2d 72 65 61 ulti-segment-rea
15c20 64 65 72 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 der handle */.
15c30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 sqlite3_int64 *p
15c40 69 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 iDocid,
15c50 2f 2a 20 4f 55 54 3a 20 44 6f 63 69 64 20 76 61 /* OUT: Docid va
15c60 6c 75 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a lue */. char **
15c70 70 61 50 6f 73 6c 69 73 74 2c 20 20 20 20 20 20 paPoslist,
15c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
15c90 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 Pointer to posi
15ca0 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 tion list */. i
15cb0 6e 74 20 2a 70 6e 50 6f 73 6c 69 73 74 20 20 20 nt *pnPoslist
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
15cd0 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 * OUT: Size of p
15ce0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 osition list in
15cf0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e bytes */.){. in
15d00 74 20 6e 4d 65 72 67 65 20 3d 20 70 4d 73 72 2d t nMerge = pMsr-
15d10 3e 6e 41 64 76 61 6e 63 65 3b 0a 20 20 46 74 73 >nAdvance;. Fts
15d20 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 53 3SegReader **apS
15d30 65 67 6d 65 6e 74 20 3d 20 70 4d 73 72 2d 3e 61 egment = pMsr->a
15d40 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 20 pSegment;. int
15d50 28 2a 78 43 6d 70 29 28 46 74 73 33 53 65 67 52 (*xCmp)(Fts3SegR
15d60 65 61 64 65 72 20 2a 2c 20 46 74 73 33 53 65 67 eader *, Fts3Seg
15d70 52 65 61 64 65 72 20 2a 29 20 3d 20 28 0a 20 20 Reader *) = (.
15d80 20 20 70 2d 3e 62 44 65 73 63 49 64 78 20 3f 20 p->bDescIdx ?
15d90 66 74 73 33 53 65 67 52 65 61 64 65 72 44 6f 63 fts3SegReaderDoc
15da0 6c 69 73 74 43 6d 70 52 65 76 20 3a 20 66 74 73 listCmpRev : fts
15db0 33 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 3SegReaderDoclis
15dc0 74 43 6d 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 tCmp. );.. if(
15dd0 20 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 nMerge==0 ){.
15de0 20 20 2a 70 61 50 6f 73 6c 69 73 74 20 3d 20 30 *paPoslist = 0
15df0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c ;. return SQL
15e00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 77 ITE_OK;. }.. w
15e10 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 46 hile( 1 ){. F
15e20 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 ts3SegReader *pS
15e30 65 67 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 70 eg;. pSeg = p
15e40 4d 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 30 Msr->apSegment[0
15e50 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 ];.. if( pSeg
15e60 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 3d 3d 30 ->pOffsetList==0
15e70 20 29 7b 0a 20 20 20 20 20 20 2a 70 61 50 6f 73 ){. *paPos
15e80 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 list = 0;.
15e90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 break;. }else
15ea0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a {. int rc;.
15eb0 20 20 20 20 20 20 63 68 61 72 20 2a 70 4c 69 73 char *pLis
15ec0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 t;. int nLi
15ed0 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b st;. int j;
15ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 . sqlite3_i
15ef0 6e 74 36 34 20 69 44 6f 63 69 64 20 3d 20 61 70 nt64 iDocid = ap
15f00 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 69 44 6f 63 Segment[0]->iDoc
15f10 69 64 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 id;.. rc =
15f20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 78 fts3SegReaderNex
15f30 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 6d tDocid(p, apSegm
15f40 65 6e 74 5b 30 5d 2c 20 26 70 4c 69 73 74 2c 20 ent[0], &pList,
15f50 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 6a &nList);. j
15f60 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c = 1;. whil
15f70 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b e( rc==SQLITE_OK
15f80 20 0a 20 20 20 20 20 20 20 20 26 26 20 6a 3c 6e . && j<n
15f90 4d 65 72 67 65 0a 20 20 20 20 20 20 20 20 26 26 Merge. &&
15fa0 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 70 apSegment[j]->p
15fb0 4f 66 66 73 65 74 4c 69 73 74 0a 20 20 20 20 20 OffsetList.
15fc0 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b && apSegment[
15fd0 6a 5d 2d 3e 69 44 6f 63 69 64 3d 3d 69 44 6f 63 j]->iDocid==iDoc
15fe0 69 64 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 id. ){.
15ff0 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 rc = fts3Seg
16000 52 65 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 ReaderNextDocid(
16010 70 2c 20 61 70 53 65 67 6d 65 6e 74 5b 6a 5d 2c p, apSegment[j],
16020 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 0, 0);.
16030 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 j++;. }.
16040 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
16050 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 E_OK ) return rc
16060 3b 0a 20 20 20 20 20 20 66 74 73 33 53 65 67 52 ;. fts3SegR
16070 65 61 64 65 72 53 6f 72 74 28 70 4d 73 72 2d 3e eaderSort(pMsr->
16080 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 apSegment, nMerg
16090 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 0a 20 20 e, j, xCmp);..
160a0 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e 30 20 if( nList>0
160b0 26 26 20 66 74 73 33 53 65 67 52 65 61 64 65 72 && fts3SegReader
160c0 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d IsPending(apSegm
160d0 65 6e 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 ent[0]) ){.
160e0 20 20 20 72 63 20 3d 20 66 74 73 33 4d 73 72 42 rc = fts3MsrB
160f0 75 66 66 65 72 44 61 74 61 28 70 4d 73 72 2c 20 ufferData(pMsr,
16100 70 4c 69 73 74 2c 20 6e 4c 69 73 74 2b 31 29 3b pList, nList+1);
16110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 . if( rc!
16120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 =SQLITE_OK ) ret
16130 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 urn rc;.
16140 61 73 73 65 72 74 28 20 28 70 4d 73 72 2d 3e 61 assert( (pMsr->a
16150 42 75 66 66 65 72 5b 6e 4c 69 73 74 5d 20 26 20 Buffer[nList] &
16160 30 78 46 45 29 3d 3d 30 78 30 30 20 29 3b 0a 20 0xFE)==0x00 );.
16170 20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 pList = p
16180 4d 73 72 2d 3e 61 42 75 66 66 65 72 3b 0a 20 20 Msr->aBuffer;.
16190 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 }.. if(
161a0 20 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 pMsr->iColFilte
161b0 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 r>=0 ){.
161c0 66 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 fts3ColumnFilter
161d0 28 70 4d 73 72 2d 3e 69 43 6f 6c 46 69 6c 74 65 (pMsr->iColFilte
161e0 72 2c 20 31 2c 20 26 70 4c 69 73 74 2c 20 26 6e r, 1, &pList, &n
161f0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a List);. }..
16200 20 20 20 20 20 20 69 66 28 20 6e 4c 69 73 74 3e if( nList>
16210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 61 0 ){. *pa
16220 50 6f 73 6c 69 73 74 20 3d 20 70 4c 69 73 74 3b Poslist = pList;
16230 0a 20 20 20 20 20 20 20 20 2a 70 69 44 6f 63 69 . *piDoci
16240 64 20 3d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 d = iDocid;.
16250 20 20 20 20 2a 70 6e 50 6f 73 6c 69 73 74 20 3d *pnPoslist =
16260 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 nList;.
16270 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
16280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 }. }.. retu
16290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
162a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 .static int fts3
162b0 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 0a SegReaderStart(.
162c0 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 Fts3Table *p,
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
162e0 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 /* Virtual tab
162f0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 le handle */. F
16300 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 ts3MultiSegReade
16310 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f r *pCsr, /
16320 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 * Cursor object
16330 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
16340 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 20 *zTerm,
16350 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 73 65 61 /* Term sea
16360 72 63 68 65 64 20 66 6f 72 20 28 6f 72 20 4e 55 rched for (or NU
16370 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 LL) */. int nTe
16380 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 rm
16390 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 /* Leng
163a0 74 68 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 th of zTerm in b
163b0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 ytes */.){. int
163c0 20 69 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d i;. int nSeg =
163d0 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 3b pCsr->nSegment;
163e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 74 .. /* If the Ft
163f0 73 33 53 65 67 46 69 6c 74 65 72 20 64 65 66 69 s3SegFilter defi
16400 6e 65 73 20 61 20 73 70 65 63 69 66 69 63 20 74 nes a specific t
16410 65 72 6d 20 28 6f 72 20 74 65 72 6d 20 70 72 65 erm (or term pre
16420 66 69 78 29 20 74 6f 20 73 65 61 72 63 68 20 0a fix) to search .
16430 20 20 2a 2a 20 66 6f 72 2c 20 74 68 65 6e 20 61 ** for, then a
16440 64 76 61 6e 63 65 20 65 61 63 68 20 73 65 67 6d dvance each segm
16450 65 6e 74 20 69 74 65 72 61 74 6f 72 20 75 6e 74 ent iterator unt
16460 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 il it points to
16470 61 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 65 a term of. ** e
16480 71 75 61 6c 20 6f 72 20 67 72 65 61 74 65 72 20 qual or greater
16490 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65 20 73 value than the s
164a0 70 65 63 69 66 69 65 64 20 74 65 72 6d 2e 20 54 pecified term. T
164b0 68 69 73 20 70 72 65 76 65 6e 74 73 20 6d 61 6e his prevents man
164c0 79 0a 20 20 2a 2a 20 75 6e 6e 65 63 65 73 73 61 y. ** unnecessa
164d0 72 79 20 6d 65 72 67 65 2f 73 6f 72 74 20 6f 70 ry merge/sort op
164e0 65 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 65 erations for the
164f0 20 63 61 73 65 20 77 68 65 72 65 20 73 69 6e 67 case where sing
16500 6c 65 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20 le segment. **
16510 62 2d 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 b-tree leaf node
16520 73 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 s contain more t
16530 68 61 6e 20 6f 6e 65 20 74 65 72 6d 2e 0a 20 20 han one term..
16540 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 43 */. for(i=0; pC
16550 73 72 2d 3e 62 52 65 73 74 61 72 74 3d 3d 30 20 sr->bRestart==0
16560 26 26 20 69 3c 70 43 73 72 2d 3e 6e 53 65 67 6d && i<pCsr->nSegm
16570 65 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 ent; i++){. i
16580 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 nt res = 0;.
16590 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 Fts3SegReader *p
165a0 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 Seg = pCsr->apSe
165b0 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 64 6f gment[i];. do
165c0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 {. int rc
165d0 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e = fts3SegReaderN
165e0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b ext(p, pSeg, 0);
165f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 . if( rc!=S
16600 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 QLITE_OK ) retur
16610 6e 20 72 63 3b 0a 20 20 20 20 7d 77 68 69 6c 65 n rc;. }while
16620 28 20 7a 54 65 72 6d 20 26 26 20 28 72 65 73 20 ( zTerm && (res
16630 3d 20 66 74 73 33 53 65 67 52 65 61 64 65 72 54 = fts3SegReaderT
16640 65 72 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 ermCmp(pSeg, zTe
16650 72 6d 2c 20 6e 54 65 72 6d 29 29 3c 30 20 29 3b rm, nTerm))<0 );
16660 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e .. if( pSeg->
16670 62 4c 6f 6f 6b 75 70 20 26 26 20 72 65 73 21 3d bLookup && res!=
16680 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 33 53 0 ){. fts3S
16690 65 67 52 65 61 64 65 72 53 65 74 45 6f 66 28 70 egReaderSetEof(p
166a0 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a Seg);. }. }.
166b0 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 fts3SegReaderS
166c0 6f 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d ort(pCsr->apSegm
166d0 65 6e 74 2c 20 6e 53 65 67 2c 20 6e 53 65 67 2c ent, nSeg, nSeg,
166e0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 6d fts3SegReaderCm
166f0 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 p);.. return SQ
16700 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 LITE_OK;.}..int
16710 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 sqlite3Fts3SegRe
16720 61 64 65 72 53 74 61 72 74 28 0a 20 20 46 74 73 aderStart(. Fts
16730 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 3Table *p,
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
16750 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 68 61 Virtual table ha
16760 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 ndle */. Fts3Mu
16770 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 ltiSegReader *pC
16780 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 sr, /* Cur
16790 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 sor object */.
167a0 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 Fts3SegFilter *p
167b0 46 69 6c 74 65 72 20 20 20 20 20 20 20 20 20 20 Filter
167c0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 /* Restrictions
167d0 6f 6e 20 72 61 6e 67 65 20 6f 66 20 69 74 65 72 on range of iter
167e0 61 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 70 43 ation */.){. pC
167f0 73 72 2d 3e 70 46 69 6c 74 65 72 20 3d 20 70 46 sr->pFilter = pF
16800 69 6c 74 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 ilter;. return
16810 66 74 73 33 53 65 67 52 65 61 64 65 72 53 74 61 fts3SegReaderSta
16820 72 74 28 70 2c 20 70 43 73 72 2c 20 70 46 69 6c rt(p, pCsr, pFil
16830 74 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c ter->zTerm, pFil
16840 74 65 72 2d 3e 6e 54 65 72 6d 29 3b 0a 7d 0a 0a ter->nTerm);.}..
16850 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d int sqlite3Fts3M
16860 73 72 49 6e 63 72 53 74 61 72 74 28 0a 20 20 46 srIncrStart(. F
16870 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 ts3Table *p,
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
16890 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 * Virtual table
168a0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 46 74 73 33 handle */. Fts3
168b0 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 2a MultiSegReader *
168c0 70 43 73 72 2c 20 20 20 20 20 20 20 2f 2a 20 43 pCsr, /* C
168d0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a ursor object */.
168e0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 int iCol,
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16900 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 6d /* Column to m
16910 61 74 63 68 20 6f 6e 2e 20 2a 2f 0a 20 20 63 6f atch on. */. co
16920 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c nst char *zTerm,
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
16940 20 54 65 72 6d 20 74 6f 20 69 74 65 72 61 74 65 Term to iterate
16950 20 74 68 72 6f 75 67 68 20 61 20 64 6f 63 6c 69 through a docli
16960 73 74 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 st for */. int
16970 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 nTerm
16980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
16990 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 umber of bytes i
169a0 6e 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 n zTerm */.){.
169b0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b int i;. int rc;
169c0 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 . int nSegment
169d0 3d 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 = pCsr->nSegment
169e0 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 ;. int (*xCmp)(
169f0 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a 2c Fts3SegReader *,
16a00 20 46 74 73 33 53 65 67 52 65 61 64 65 72 20 2a Fts3SegReader *
16a10 29 20 3d 20 28 0a 20 20 20 20 70 2d 3e 62 44 65 ) = (. p->bDe
16a20 73 63 49 64 78 20 3f 20 66 74 73 33 53 65 67 52 scIdx ? fts3SegR
16a30 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 52 eaderDoclistCmpR
16a40 65 76 20 3a 20 66 74 73 33 53 65 67 52 65 61 64 ev : fts3SegRead
16a50 65 72 44 6f 63 6c 69 73 74 43 6d 70 0a 20 20 29 erDoclistCmp. )
16a60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 ;.. assert( pCs
16a70 72 2d 3e 70 46 69 6c 74 65 72 3d 3d 30 20 29 3b r->pFilter==0 );
16a80 0a 20 20 61 73 73 65 72 74 28 20 7a 54 65 72 6d . assert( zTerm
16a90 20 26 26 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a && nTerm>0 );..
16aa0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 /* Advance eac
16ab0 68 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 h segment iterat
16ac0 6f 72 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e or until it poin
16ad0 74 73 20 74 6f 20 74 68 65 20 74 65 72 6d 20 7a ts to the term z
16ae0 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 Term/nTerm. */.
16af0 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 rc = fts3SegRea
16b00 64 65 72 53 74 61 72 74 28 70 2c 20 70 43 73 72 derStart(p, pCsr
16b10 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b , zTerm, nTerm);
16b20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 . if( rc!=SQLIT
16b30 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 E_OK ) return rc
16b40 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e ;.. /* Determin
16b50 65 20 68 6f 77 20 6d 61 6e 79 20 6f 66 20 74 68 e how many of th
16b60 65 20 73 65 67 6d 65 6e 74 73 20 61 63 74 75 61 e segments actua
16b70 6c 6c 79 20 70 6f 69 6e 74 20 74 6f 20 7a 54 65 lly point to zTe
16b80 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 0a 20 20 66 rm/nTerm. */. f
16b90 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 65 67 6d 65 or(i=0; i<nSegme
16ba0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 nt; i++){. Ft
16bb0 73 33 53 65 67 52 65 61 64 65 72 20 2a 70 53 65 s3SegReader *pSe
16bc0 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 6d g = pCsr->apSegm
16bd0 65 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 ent[i];. if(
16be0 21 70 53 65 67 2d 3e 61 4e 6f 64 65 20 7c 7c 20 !pSeg->aNode ||
16bf0 66 74 73 33 53 65 67 52 65 61 64 65 72 54 65 72 fts3SegReaderTer
16c00 6d 43 6d 70 28 70 53 65 67 2c 20 7a 54 65 72 6d mCmp(pSeg, zTerm
16c10 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 , nTerm) ){.
16c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
16c30 20 7d 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 }. pCsr->nAdva
16c40 6e 63 65 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 41 nce = i;.. /* A
16c50 64 76 61 6e 63 65 20 65 61 63 68 20 6f 66 20 74 dvance each of t
16c60 68 65 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 70 he segments to p
16c70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 oint to the firs
16c80 74 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 66 6f t docid. */. fo
16c90 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e r(i=0; i<pCsr->n
16ca0 41 64 76 61 6e 63 65 3b 20 69 2b 2b 29 7b 0a 20 Advance; i++){.
16cb0 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 52 rc = fts3SegR
16cc0 65 61 64 65 72 46 69 72 73 74 44 6f 63 69 64 28 eaderFirstDocid(
16cd0 70 2c 20 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 p, pCsr->apSegme
16ce0 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 nt[i]);. if(
16cf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 rc!=SQLITE_OK )
16d00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 return rc;. }.
16d10 20 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f fts3SegReaderSo
16d20 72 74 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 rt(pCsr->apSegme
16d30 6e 74 2c 20 69 2c 20 69 2c 20 78 43 6d 70 29 3b nt, i, i, xCmp);
16d40 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c .. assert( iCol
16d50 3c 30 20 7c 7c 20 69 43 6f 6c 3c 70 2d 3e 6e 43 <0 || iCol<p->nC
16d60 6f 6c 75 6d 6e 20 29 3b 0a 20 20 70 43 73 72 2d olumn );. pCsr-
16d70 3e 69 43 6f 6c 46 69 6c 74 65 72 20 3d 20 69 43 >iColFilter = iC
16d80 6f 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 ol;.. return SQ
16d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
16da0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
16db0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 4d is called on a M
16dc0 75 6c 74 69 53 65 67 52 65 61 64 65 72 20 74 68 ultiSegReader th
16dd0 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 61 72 at has been star
16de0 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c ted using.** sql
16df0 69 74 65 33 46 74 73 33 4d 73 72 49 6e 63 72 53 ite3Fts3MsrIncrS
16e00 74 61 72 74 28 29 2e 20 4f 6e 65 20 6f 72 20 6d tart(). One or m
16e10 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 4d 73 72 ore calls to Msr
16e20 49 6e 63 72 4e 65 78 74 28 29 20 6d 61 79 20 61 IncrNext() may a
16e30 6c 73 6f 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e lso.** have been
16e40 20 6d 61 64 65 2e 20 43 61 6c 6c 69 6e 67 20 74 made. Calling t
16e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 75 74 his function put
16e60 73 20 74 68 65 20 4d 75 6c 74 69 53 65 67 52 65 s the MultiSegRe
16e70 61 64 65 72 20 69 6e 20 73 75 63 68 0a 2a 2a 20 ader in such.**
16e80 61 20 73 74 61 74 65 20 74 68 61 74 20 69 66 20 a state that if
16e90 74 68 65 20 6e 65 78 74 20 74 77 6f 20 63 61 6c the next two cal
16ea0 6c 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 ls are:.**.**
16eb0 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 sqlite3Fts3SegRe
16ec0 61 64 65 72 53 74 61 72 74 28 29 0a 2a 2a 20 20 aderStart().**
16ed0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 sqlite3Fts3SegR
16ee0 65 61 64 65 72 53 74 65 70 28 29 0a 2a 2a 0a 2a eaderStep().**.*
16ef0 2a 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 * then the entir
16f00 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 e doclist for th
16f10 65 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 e term is availa
16f20 62 6c 65 20 69 6e 20 0a 2a 2a 20 4d 75 6c 74 69 ble in .** Multi
16f30 53 65 67 52 65 61 64 65 72 2e 61 44 6f 63 6c 69 SegReader.aDocli
16f40 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 0a 2a 2f 0a st/nDoclist..*/.
16f50 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 4d int sqlite3Fts3M
16f60 73 72 49 6e 63 72 52 65 73 74 61 72 74 28 46 74 srIncrRestart(Ft
16f70 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 s3MultiSegReader
16f80 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 *pCsr){. int i
16f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
16fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 /* Us
16fb0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 ed to iterate th
16fc0 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 2d 72 65 rough segment-re
16fd0 61 64 65 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 aders */.. asse
16fe0 72 74 28 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3d rt( pCsr->zTerm=
16ff0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
17000 70 43 73 72 2d 3e 6e 54 65 72 6d 3d 3d 30 20 29 pCsr->nTerm==0 )
17010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 ;. assert( pCsr
17020 2d 3e 61 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b ->aDoclist==0 );
17030 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d . assert( pCsr-
17040 3e 6e 44 6f 63 6c 69 73 74 3d 3d 30 20 29 3b 0a >nDoclist==0 );.
17050 0a 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 . pCsr->nAdvanc
17060 65 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 62 e = 0;. pCsr->b
17070 52 65 73 74 61 72 74 20 3d 20 31 3b 0a 20 20 66 Restart = 1;. f
17080 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e or(i=0; i<pCsr->
17090 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 7b 0a nSegment; i++){.
170a0 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 67 6d pCsr->apSegm
170b0 65 6e 74 5b 69 5d 2d 3e 70 4f 66 66 73 65 74 4c ent[i]->pOffsetL
170c0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 ist = 0;. pCs
170d0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 69 5d 2d r->apSegment[i]-
170e0 3e 6e 4f 66 66 73 65 74 4c 69 73 74 20 3d 20 30 >nOffsetList = 0
170f0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 70 53 65 ;. pCsr->apSe
17100 67 6d 65 6e 74 5b 69 5d 2d 3e 69 44 6f 63 69 64 gment[i]->iDocid
17110 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 = 0;. }.. ret
17120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
17130 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 ...int sqlite3Ft
17140 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 s3SegReaderStep(
17150 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c . Fts3Table *p,
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17170 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 /* Virtual ta
17180 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 ble handle */.
17190 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 Fts3MultiSegRead
171a0 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 er *pCsr
171b0 2f 2a 20 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 /* Cursor object
171c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 */.){. int rc
171d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 = SQLITE_OK;..
171e0 69 6e 74 20 69 73 49 67 6e 6f 72 65 45 6d 70 74 int isIgnoreEmpt
171f0 79 20 3d 20 20 28 70 43 73 72 2d 3e 70 46 69 6c y = (pCsr->pFil
17200 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 ter->flags & FTS
17210 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 45 3_SEGMENT_IGNORE
17220 5f 45 4d 50 54 59 29 3b 0a 20 20 69 6e 74 20 69 _EMPTY);. int i
17230 73 52 65 71 75 69 72 65 50 6f 73 20 3d 20 20 20 sRequirePos =
17240 28 70 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e (pCsr->pFilter->
17250 66 6c 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 flags & FTS3_SEG
17260 4d 45 4e 54 5f 52 45 51 55 49 52 45 5f 50 4f 53 MENT_REQUIRE_POS
17270 29 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6c 46 69 );. int isColFi
17280 6c 74 65 72 20 3d 20 20 20 20 28 70 43 73 72 2d lter = (pCsr-
17290 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 >pFilter->flags
172a0 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 43 & FTS3_SEGMENT_C
172b0 4f 4c 55 4d 4e 5f 46 49 4c 54 45 52 29 3b 0a 20 OLUMN_FILTER);.
172c0 20 69 6e 74 20 69 73 50 72 65 66 69 78 20 3d 20 int isPrefix =
172d0 20 20 20 20 20 20 28 70 43 73 72 2d 3e 70 46 69 (pCsr->pFi
172e0 6c 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 lter->flags & FT
172f0 53 33 5f 53 45 47 4d 45 4e 54 5f 50 52 45 46 49 S3_SEGMENT_PREFI
17300 58 29 3b 0a 20 20 69 6e 74 20 69 73 53 63 61 6e X);. int isScan
17310 20 3d 20 20 20 20 20 20 20 20 20 28 70 43 73 72 = (pCsr
17320 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 73 ->pFilter->flags
17330 20 26 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f & FTS3_SEGMENT_
17340 53 43 41 4e 29 3b 0a 20 20 69 6e 74 20 69 73 46 SCAN);. int isF
17350 69 72 73 74 20 3d 20 20 20 20 20 20 20 20 28 70 irst = (p
17360 43 73 72 2d 3e 70 46 69 6c 74 65 72 2d 3e 66 6c Csr->pFilter->fl
17370 61 67 73 20 26 20 46 54 53 33 5f 53 45 47 4d 45 ags & FTS3_SEGME
17380 4e 54 5f 46 49 52 53 54 29 3b 0a 0a 20 20 46 74 NT_FIRST);.. Ft
17390 73 33 53 65 67 52 65 61 64 65 72 20 2a 2a 61 70 s3SegReader **ap
173a0 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 2d 3e Segment = pCsr->
173b0 61 70 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e 74 apSegment;. int
173c0 20 6e 53 65 67 6d 65 6e 74 20 3d 20 70 43 73 72 nSegment = pCsr
173d0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 46 74 ->nSegment;. Ft
173e0 73 33 53 65 67 46 69 6c 74 65 72 20 2a 70 46 69 s3SegFilter *pFi
173f0 6c 74 65 72 20 3d 20 70 43 73 72 2d 3e 70 46 69 lter = pCsr->pFi
17400 6c 74 65 72 3b 0a 20 20 69 6e 74 20 28 2a 78 43 lter;. int (*xC
17410 6d 70 29 28 46 74 73 33 53 65 67 52 65 61 64 65 mp)(Fts3SegReade
17420 72 20 2a 2c 20 46 74 73 33 53 65 67 52 65 61 64 r *, Fts3SegRead
17430 65 72 20 2a 29 20 3d 20 28 0a 20 20 20 20 70 2d er *) = (. p-
17440 3e 62 44 65 73 63 49 64 78 20 3f 20 66 74 73 33 >bDescIdx ? fts3
17450 53 65 67 52 65 61 64 65 72 44 6f 63 6c 69 73 74 SegReaderDoclist
17460 43 6d 70 52 65 76 20 3a 20 66 74 73 33 53 65 67 CmpRev : fts3Seg
17470 52 65 61 64 65 72 44 6f 63 6c 69 73 74 43 6d 70 ReaderDoclistCmp
17480 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 . );.. if( pCs
17490 72 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 r->nSegment==0 )
174a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
174b0 4b 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 K;.. do {. i
174c0 6e 74 20 6e 4d 65 72 67 65 3b 0a 20 20 20 20 69 nt nMerge;. i
174d0 6e 74 20 69 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 nt i;. . /*
174e0 41 64 76 61 6e 63 65 20 74 68 65 20 66 69 72 73 Advance the firs
174f0 74 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 t pCsr->nAdvance
17500 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 entries in the
17510 61 70 53 65 67 6d 65 6e 74 5b 5d 20 61 72 72 61 apSegment[] arra
17520 79 0a 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 y. ** forward
17530 2e 20 54 68 65 6e 20 73 6f 72 74 20 74 68 65 20 . Then sort the
17540 6c 69 73 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 list in order of
17550 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 61 67 current term ag
17560 61 69 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 ain. . */.
17570 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 for(i=0; i<pCs
17580 72 2d 3e 6e 41 64 76 61 6e 63 65 3b 20 69 2b 2b r->nAdvance; i++
17590 29 7b 0a 20 20 20 20 20 20 46 74 73 33 53 65 67 ){. Fts3Seg
175a0 52 65 61 64 65 72 20 2a 70 53 65 67 20 3d 20 61 Reader *pSeg = a
175b0 70 53 65 67 6d 65 6e 74 5b 69 5d 3b 0a 20 20 20 pSegment[i];.
175c0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 62 4c 6f if( pSeg->bLo
175d0 6f 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 okup ){.
175e0 66 74 73 33 53 65 67 52 65 61 64 65 72 53 65 74 fts3SegReaderSet
175f0 45 6f 66 28 70 53 65 67 29 3b 0a 20 20 20 20 20 Eof(pSeg);.
17600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
17610 72 63 20 3d 20 66 74 73 33 53 65 67 52 65 61 64 rc = fts3SegRead
17620 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 erNext(p, pSeg,
17630 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0);. }.
17640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
17650 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b _OK ) return rc;
17660 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 33 53 . }. fts3S
17670 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 egReaderSort(apS
17680 65 67 6d 65 6e 74 2c 20 6e 53 65 67 6d 65 6e 74 egment, nSegment
17690 2c 20 70 43 73 72 2d 3e 6e 41 64 76 61 6e 63 65 , pCsr->nAdvance
176a0 2c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 43 , fts3SegReaderC
176b0 6d 70 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e mp);. pCsr->n
176c0 41 64 76 61 6e 63 65 20 3d 20 30 3b 0a 0a 20 20 Advance = 0;..
176d0 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 /* If all the
176e0 73 65 67 2d 72 65 61 64 65 72 73 20 61 72 65 20 seg-readers are
176f0 61 74 20 45 4f 46 2c 20 77 65 27 72 65 20 66 69 at EOF, we're fi
17700 6e 69 73 68 65 64 2e 20 72 65 74 75 72 6e 20 53 nished. return S
17710 51 4c 49 54 45 5f 4f 4b 2e 20 2a 2f 0a 20 20 20 QLITE_OK. */.
17720 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c assert( rc==SQL
17730 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 ITE_OK );. if
17740 28 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e ( apSegment[0]->
17750 61 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b aNode==0 ) break
17760 3b 0a 0a 20 20 20 20 70 43 73 72 2d 3e 6e 54 65 ;.. pCsr->nTe
17770 72 6d 20 3d 20 61 70 53 65 67 6d 65 6e 74 5b 30 rm = apSegment[0
17780 5d 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 70 43 ]->nTerm;. pC
17790 73 72 2d 3e 7a 54 65 72 6d 20 3d 20 61 70 53 65 sr->zTerm = apSe
177a0 67 6d 65 6e 74 5b 30 5d 2d 3e 7a 54 65 72 6d 3b gment[0]->zTerm;
177b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 .. /* If this
177c0 20 69 73 20 61 20 70 72 65 66 69 78 2d 73 65 61 is a prefix-sea
177d0 72 63 68 2c 20 61 6e 64 20 69 66 20 74 68 65 20 rch, and if the
177e0 74 65 72 6d 20 74 68 61 74 20 61 70 53 65 67 6d term that apSegm
177f0 65 6e 74 5b 30 5d 20 70 6f 69 6e 74 73 0a 20 20 ent[0] points.
17800 20 20 2a 2a 20 74 6f 20 64 6f 65 73 20 6e 6f 74 ** to does not
17810 20 73 68 61 72 65 20 61 20 73 75 66 66 69 78 20 share a suffix
17820 77 69 74 68 20 70 46 69 6c 74 65 72 2d 3e 7a 54 with pFilter->zT
17830 65 72 6d 2f 6e 54 65 72 6d 2c 20 74 68 65 6e 20 erm/nTerm, then
17840 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 all . ** requ
17850 69 72 65 64 20 63 61 6c 6c 62 61 63 6b 73 20 68 ired callbacks h
17860 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2e 20 49 ave been made. I
17870 6e 20 74 68 69 73 20 63 61 73 65 20 65 78 69 74 n this case exit
17880 20 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2a 0a 20 early.. **.
17890 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c ** Similarly,
178a0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 65 if this is a se
178b0 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 61 63 arch for an exac
178c0 74 20 6d 61 74 63 68 2c 20 61 6e 64 20 74 68 65 t match, and the
178d0 20 66 69 72 73 74 20 74 65 72 6d 0a 20 20 20 20 first term.
178e0 2a 2a 20 6f 66 20 73 65 67 6d 65 6e 74 20 61 70 ** of segment ap
178f0 53 65 67 6d 65 6e 74 5b 30 5d 20 69 73 20 6e 6f Segment[0] is no
17900 74 20 61 20 6d 61 74 63 68 2c 20 65 78 69 74 20 t a match, exit
17910 65 61 72 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 early.. */.
17920 20 20 69 66 28 20 70 46 69 6c 74 65 72 2d 3e 7a if( pFilter->z
17930 54 65 72 6d 20 26 26 20 21 69 73 53 63 61 6e 20 Term && !isScan
17940 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 ){. if( pCs
17950 72 2d 3e 6e 54 65 72 6d 3c 70 46 69 6c 74 65 72 r->nTerm<pFilter
17960 2d 3e 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 ->nTerm .
17970 7c 7c 20 28 21 69 73 50 72 65 66 69 78 20 26 26 || (!isPrefix &&
17980 20 70 43 73 72 2d 3e 6e 54 65 72 6d 3e 70 46 69 pCsr->nTerm>pFi
17990 6c 74 65 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 20 lter->nTerm).
179a0 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 43 || memcmp(pC
179b0 73 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 sr->zTerm, pFilt
179c0 65 72 2d 3e 7a 54 65 72 6d 2c 20 70 46 69 6c 74 er->zTerm, pFilt
179d0 65 72 2d 3e 6e 54 65 72 6d 29 20 0a 20 20 20 20 er->nTerm) .
179e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 ){. bre
179f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
17a00 7d 0a 0a 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 }.. nMerge =
17a10 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4d 1;. while( nM
17a20 65 72 67 65 3c 6e 53 65 67 6d 65 6e 74 20 0a 20 erge<nSegment .
17a30 20 20 20 20 20 20 20 26 26 20 61 70 53 65 67 6d && apSegm
17a40 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d 3e 61 4e 6f ent[nMerge]->aNo
17a50 64 65 0a 20 20 20 20 20 20 20 20 26 26 20 61 70 de. && ap
17a60 53 65 67 6d 65 6e 74 5b 6e 4d 65 72 67 65 5d 2d Segment[nMerge]-
17a70 3e 6e 54 65 72 6d 3d 3d 70 43 73 72 2d 3e 6e 54 >nTerm==pCsr->nT
17a80 65 72 6d 20 0a 20 20 20 20 20 20 20 20 26 26 20 erm . &&
17a90 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 73 72 2d 3e 0==memcmp(pCsr->
17aa0 7a 54 65 72 6d 2c 20 61 70 53 65 67 6d 65 6e 74 zTerm, apSegment
17ab0 5b 6e 4d 65 72 67 65 5d 2d 3e 7a 54 65 72 6d 2c [nMerge]->zTerm,
17ac0 20 70 43 73 72 2d 3e 6e 54 65 72 6d 29 0a 20 20 pCsr->nTerm).
17ad0 20 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 72 67 ){. nMerg
17ae0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 e++;. }..
17af0 61 73 73 65 72 74 28 20 69 73 49 67 6e 6f 72 65 assert( isIgnore
17b00 45 6d 70 74 79 20 7c 7c 20 28 69 73 52 65 71 75 Empty || (isRequ
17b10 69 72 65 50 6f 73 20 26 26 20 21 69 73 43 6f 6c irePos && !isCol
17b20 46 69 6c 74 65 72 29 20 29 3b 0a 20 20 20 20 69 Filter) );. i
17b30 66 28 20 6e 4d 65 72 67 65 3d 3d 31 20 0a 20 20 f( nMerge==1 .
17b40 20 20 20 26 26 20 21 69 73 49 67 6e 6f 72 65 45 && !isIgnoreE
17b50 6d 70 74 79 20 0a 20 20 20 20 20 26 26 20 21 69 mpty . && !i
17b60 73 46 69 72 73 74 20 0a 20 20 20 20 20 26 26 20 sFirst . &&
17b70 28 70 2d 3e 62 44 65 73 63 49 64 78 3d 3d 30 20 (p->bDescIdx==0
17b80 7c 7c 20 66 74 73 33 53 65 67 52 65 61 64 65 72 || fts3SegReader
17b90 49 73 50 65 6e 64 69 6e 67 28 61 70 53 65 67 6d IsPending(apSegm
17ba0 65 6e 74 5b 30 5d 29 3d 3d 30 29 0a 20 20 20 20 ent[0])==0).
17bb0 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 6e ){. pCsr->n
17bc0 44 6f 63 6c 69 73 74 20 3d 20 61 70 53 65 67 6d Doclist = apSegm
17bd0 65 6e 74 5b 30 5d 2d 3e 6e 44 6f 63 6c 69 73 74 ent[0]->nDoclist
17be0 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 33 ;. if( fts3
17bf0 53 65 67 52 65 61 64 65 72 49 73 50 65 6e 64 69 SegReaderIsPendi
17c00 6e 67 28 61 70 53 65 67 6d 65 6e 74 5b 30 5d 29 ng(apSegment[0])
17c10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){. rc =
17c20 20 66 74 73 33 4d 73 72 42 75 66 66 65 72 44 61 fts3MsrBufferDa
17c30 74 61 28 70 43 73 72 2c 20 61 70 53 65 67 6d 65 ta(pCsr, apSegme
17c40 6e 74 5b 30 5d 2d 3e 61 44 6f 63 6c 69 73 74 2c nt[0]->aDoclist,
17c50 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 29 pCsr->nDoclist)
17c60 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e ;. pCsr->
17c70 61 44 6f 63 6c 69 73 74 20 3d 20 70 43 73 72 2d aDoclist = pCsr-
17c80 3e 61 42 75 66 66 65 72 3b 0a 20 20 20 20 20 20 >aBuffer;.
17c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 }else{. p
17ca0 43 73 72 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 Csr->aDoclist =
17cb0 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2d 3e 61 44 apSegment[0]->aD
17cc0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a oclist;. }.
17cd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
17ce0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 LITE_OK ) rc = S
17cf0 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 7d QLITE_ROW;. }
17d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 else{. int
17d10 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 20 20 20 nDoclist = 0;
17d20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 /* Size
17d30 6f 66 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 of doclist */.
17d40 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 sqlite3_int6
17d50 34 20 69 50 72 65 76 20 3d 20 30 3b 20 20 20 20 4 iPrev = 0;
17d60 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 /* Previous doci
17d70 64 20 73 74 6f 72 65 64 20 69 6e 20 64 6f 63 6c d stored in docl
17d80 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a ist */.. /*
17d90 20 54 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 The current ter
17da0 6d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e m of the first n
17db0 4d 65 72 67 65 20 65 6e 74 72 69 65 73 20 69 6e Merge entries in
17dc0 20 74 68 65 20 61 72 72 61 79 0a 20 20 20 20 20 the array.
17dd0 20 2a 2a 20 6f 66 20 46 74 73 33 53 65 67 52 65 ** of Fts3SegRe
17de0 61 64 65 72 20 6f 62 6a 65 63 74 73 20 69 73 20 ader objects is
17df0 74 68 65 20 73 61 6d 65 2e 20 54 68 65 20 64 6f the same. The do
17e00 63 6c 69 73 74 73 20 6d 75 73 74 20 62 65 20 6d clists must be m
17e10 65 72 67 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 erged. ** a
17e20 6e 64 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d nd a single term
17e30 20 72 65 74 75 72 6e 65 64 20 77 69 74 68 20 74 returned with t
17e40 68 65 20 6d 65 72 67 65 64 20 64 6f 63 6c 69 73 he merged doclis
17e50 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 t.. */.
17e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4d 65 for(i=0; i<nMe
17e70 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 rge; i++){.
17e80 20 20 20 66 74 73 33 53 65 67 52 65 61 64 65 72 fts3SegReader
17e90 46 69 72 73 74 44 6f 63 69 64 28 70 2c 20 61 70 FirstDocid(p, ap
17ea0 53 65 67 6d 65 6e 74 5b 69 5d 29 3b 0a 20 20 20 Segment[i]);.
17eb0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 53 }. fts3S
17ec0 65 67 52 65 61 64 65 72 53 6f 72 74 28 61 70 53 egReaderSort(apS
17ed0 65 67 6d 65 6e 74 2c 20 6e 4d 65 72 67 65 2c 20 egment, nMerge,
17ee0 6e 4d 65 72 67 65 2c 20 78 43 6d 70 29 3b 0a 20 nMerge, xCmp);.
17ef0 20 20 20 20 20 77 68 69 6c 65 28 20 61 70 53 65 while( apSe
17f00 67 6d 65 6e 74 5b 30 5d 2d 3e 70 4f 66 66 73 65 gment[0]->pOffse
17f10 74 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 tList ){.
17f20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 int j;
17f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
17f40 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 mber of segments
17f50 20 74 68 61 74 20 73 68 61 72 65 20 61 20 64 6f that share a do
17f60 63 69 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 cid */. c
17f70 68 61 72 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a har *pList = 0;.
17f80 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 int nLis
17f90 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 t = 0;. i
17fa0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 nt nByte;.
17fb0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
17fc0 69 44 6f 63 69 64 20 3d 20 61 70 53 65 67 6d 65 iDocid = apSegme
17fd0 6e 74 5b 30 5d 2d 3e 69 44 6f 63 69 64 3b 0a 20 nt[0]->iDocid;.
17fe0 20 20 20 20 20 20 20 66 74 73 33 53 65 67 52 65 fts3SegRe
17ff0 61 64 65 72 4e 65 78 74 44 6f 63 69 64 28 70 2c aderNextDocid(p,
18000 20 61 70 53 65 67 6d 65 6e 74 5b 30 5d 2c 20 26 apSegment[0], &
18010 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a pList, &nList);.
18020 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 j = 1;.
18030 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c while( j<
18040 6e 4d 65 72 67 65 0a 20 20 20 20 20 20 20 20 20 nMerge.
18050 20 20 20 26 26 20 61 70 53 65 67 6d 65 6e 74 5b && apSegment[
18060 6a 5d 2d 3e 70 4f 66 66 73 65 74 4c 69 73 74 0a j]->pOffsetList.
18070 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 61 && a
18080 70 53 65 67 6d 65 6e 74 5b 6a 5d 2d 3e 69 44 6f pSegment[j]->iDo
18090 63 69 64 3d 3d 69 44 6f 63 69 64 0a 20 20 20 20 cid==iDocid.
180a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ){.
180b0 20 66 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 fts3SegReaderNe
180c0 78 74 44 6f 63 69 64 28 70 2c 20 61 70 53 65 67 xtDocid(p, apSeg
180d0 6d 65 6e 74 5b 6a 5d 2c 20 30 2c 20 30 29 3b 0a ment[j], 0, 0);.
180e0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 j++;.
180f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 }..
18100 20 20 69 66 28 20 69 73 43 6f 6c 46 69 6c 74 65 if( isColFilte
18110 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 r ){. f
18120 74 73 33 43 6f 6c 75 6d 6e 46 69 6c 74 65 72 28 ts3ColumnFilter(
18130 70 46 69 6c 74 65 72 2d 3e 69 43 6f 6c 2c 20 30 pFilter->iCol, 0
18140 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 , &pList, &nList
18150 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 );. }..
18160 20 20 20 20 20 20 69 66 28 20 21 69 73 49 67 6e if( !isIgn
18170 6f 72 65 45 6d 70 74 79 20 7c 7c 20 6e 4c 69 73 oreEmpty || nLis
18180 74 3e 30 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 t>0 ){..
18190 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 /* Calculate t
181a0 68 65 20 27 64 6f 63 69 64 27 20 64 65 6c 74 61 he 'docid' delta
181b0 20 76 61 6c 75 65 20 74 6f 20 77 72 69 74 65 20 value to write
181c0 69 6e 74 6f 20 74 68 65 20 6d 65 72 67 65 64 20 into the merged
181d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 6f . ** do
181e0 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 clist. */.
181f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 sqlite3_int6
18200 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 4 iDelta;.
18210 20 20 20 20 69 66 28 20 70 2d 3e 62 44 65 73 63 if( p->bDesc
18220 49 64 78 20 26 26 20 6e 44 6f 63 6c 69 73 74 3e Idx && nDoclist>
18230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0 ){.
18240 20 69 44 65 6c 74 61 20 3d 20 69 50 72 65 76 20 iDelta = iPrev
18250 2d 20 69 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 - iDocid;.
18260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
18270 20 20 20 20 20 20 20 69 44 65 6c 74 61 20 3d 20 iDelta =
18280 69 44 6f 63 69 64 20 2d 20 69 50 72 65 76 3b 0a iDocid - iPrev;.
18290 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
182a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 assert( iD
182b0 65 6c 74 61 3e 30 20 7c 7c 20 28 6e 44 6f 63 6c elta>0 || (nDocl
182c0 69 73 74 3d 3d 30 20 26 26 20 69 44 65 6c 74 61 ist==0 && iDelta
182d0 3d 3d 69 44 6f 63 69 64 29 20 29 3b 0a 20 20 20 ==iDocid) );.
182e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e assert( n
182f0 44 6f 63 6c 69 73 74 3e 30 20 7c 7c 20 69 44 65 Doclist>0 || iDe
18300 6c 74 61 3d 3d 69 44 6f 63 69 64 20 29 3b 0a 0a lta==iDocid );..
18310 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 nByte
18320 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 = sqlite3Fts3Var
18330 69 6e 74 4c 65 6e 28 69 44 65 6c 74 61 29 20 2b intLen(iDelta) +
18340 20 28 69 73 52 65 71 75 69 72 65 50 6f 73 3f 6e (isRequirePos?n
18350 4c 69 73 74 2b 31 3a 30 29 3b 0a 20 20 20 20 20 List+1:0);.
18360 20 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69 73 if( nDoclis
18370 74 2b 6e 42 79 74 65 3e 70 43 73 72 2d 3e 6e 42 t+nByte>pCsr->nB
18380 75 66 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20 uffer ){.
18390 20 20 20 20 20 63 68 61 72 20 2a 61 4e 65 77 3b char *aNew;
183a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 . pCs
183b0 72 2d 3e 6e 42 75 66 66 65 72 20 3d 20 28 6e 44 r->nBuffer = (nD
183c0 6f 63 6c 69 73 74 2b 6e 42 79 74 65 29 2a 32 3b oclist+nByte)*2;
183d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4e 65 . aNe
183e0 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c w = sqlite3_real
183f0 6c 6f 63 28 70 43 73 72 2d 3e 61 42 75 66 66 65 loc(pCsr->aBuffe
18400 72 2c 20 70 43 73 72 2d 3e 6e 42 75 66 66 65 72 r, pCsr->nBuffer
18410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 );. i
18420 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 f( !aNew ){.
18430 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
18440 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 SQLITE_NOMEM;.
18450 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
18460 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 pCsr->a
18470 42 75 66 66 65 72 20 3d 20 61 4e 65 77 3b 0a 20 Buffer = aNew;.
18480 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 }..
18490 20 20 20 20 20 20 69 66 28 20 69 73 46 69 72 73 if( isFirs
184a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 t ){.
184b0 20 63 68 61 72 20 2a 61 20 3d 20 26 70 43 73 72 char *a = &pCsr
184c0 2d 3e 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 ->aBuffer[nDocli
184d0 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 st];.
184e0 20 69 6e 74 20 6e 57 72 69 74 65 3b 0a 20 20 20 int nWrite;.
184f0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 .
18500 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 71 nWrite = sq
18510 6c 69 74 65 33 46 74 73 33 46 69 72 73 74 46 69 lite3Fts3FirstFi
18520 6c 74 65 72 28 69 44 65 6c 74 61 2c 20 70 4c 69 lter(iDelta, pLi
18530 73 74 2c 20 6e 4c 69 73 74 2c 20 61 29 3b 0a 20 st, nList, a);.
18540 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e if( n
18550 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 Write ){.
18560 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 iPrev = i
18570 44 6f 63 69 64 3b 0a 20 20 20 20 20 20 20 20 20 Docid;.
18580 20 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d nDoclist +=
18590 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 nWrite;.
185a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
185b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
185c0 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 nDoclist +=
185d0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 sqlite3Fts3PutVa
185e0 72 69 6e 74 28 26 70 43 73 72 2d 3e 61 42 75 66 rint(&pCsr->aBuf
185f0 66 65 72 5b 6e 44 6f 63 6c 69 73 74 5d 2c 20 69 fer[nDoclist], i
18600 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 Delta);.
18610 20 20 20 20 69 50 72 65 76 20 3d 20 69 44 6f 63 iPrev = iDoc
18620 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 id;.
18630 69 66 28 20 69 73 52 65 71 75 69 72 65 50 6f 73 if( isRequirePos
18640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
18650 20 20 6d 65 6d 63 70 79 28 26 70 43 73 72 2d 3e memcpy(&pCsr->
18660 61 42 75 66 66 65 72 5b 6e 44 6f 63 6c 69 73 74 aBuffer[nDoclist
18670 5d 2c 20 70 4c 69 73 74 2c 20 6e 4c 69 73 74 29 ], pList, nList)
18680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
18690 6e 44 6f 63 6c 69 73 74 20 2b 3d 20 6e 4c 69 73 nDoclist += nLis
186a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 t;.
186b0 20 70 43 73 72 2d 3e 61 42 75 66 66 65 72 5b 6e pCsr->aBuffer[n
186c0 44 6f 63 6c 69 73 74 2b 2b 5d 20 3d 20 27 5c 30 Doclist++] = '\0
186d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d ';. }
186e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
186f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 }..
18700 66 74 73 33 53 65 67 52 65 61 64 65 72 53 6f 72 fts3SegReaderSor
18710 74 28 61 70 53 65 67 6d 65 6e 74 2c 20 6e 4d 65 t(apSegment, nMe
18720 72 67 65 2c 20 6a 2c 20 78 43 6d 70 29 3b 0a 20 rge, j, xCmp);.
18730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 }. if(
18740 20 6e 44 6f 63 6c 69 73 74 3e 30 20 29 7b 0a 20 nDoclist>0 ){.
18750 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 44 6f pCsr->aDo
18760 63 6c 69 73 74 20 3d 20 70 43 73 72 2d 3e 61 42 clist = pCsr->aB
18770 75 66 66 65 72 3b 0a 20 20 20 20 20 20 20 20 70 uffer;. p
18780 43 73 72 2d 3e 6e 44 6f 63 6c 69 73 74 20 3d 20 Csr->nDoclist =
18790 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 nDoclist;.
187a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f rc = SQLITE_RO
187b0 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d W;. }. }
187c0 0a 20 20 20 20 70 43 73 72 2d 3e 6e 41 64 76 61 . pCsr->nAdva
187d0 6e 63 65 20 3d 20 6e 4d 65 72 67 65 3b 0a 20 20 nce = nMerge;.
187e0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 }while( rc==SQLI
187f0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 72 65 74 75 TE_OK );.. retu
18800 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 76 6f 69 64 20 rn rc;.}...void
18810 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 sqlite3Fts3SegRe
18820 61 64 65 72 46 69 6e 69 73 68 28 0a 20 20 46 74 aderFinish(. Ft
18830 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 72 s3MultiSegReader
18840 20 2a 70 43 73 72 20 20 20 20 20 20 20 2f 2a 20 *pCsr /*
18850 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f Cursor object */
18860 0a 29 7b 0a 20 20 69 66 28 20 70 43 73 72 20 29 .){. if( pCsr )
18870 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 {. int i;.
18880 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 for(i=0; i<pCsr
18890 2d 3e 6e 53 65 67 6d 65 6e 74 3b 20 69 2b 2b 29 ->nSegment; i++)
188a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 {. sqlite3F
188b0 74 73 33 53 65 67 52 65 61 64 65 72 46 72 65 65 ts3SegReaderFree
188c0 28 70 43 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 (pCsr->apSegment
188d0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 [i]);. }.
188e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 73 sqlite3_free(pCs
188f0 72 2d 3e 61 70 53 65 67 6d 65 6e 74 29 3b 0a 20 r->apSegment);.
18900 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
18910 70 43 73 72 2d 3e 61 42 75 66 66 65 72 29 3b 0a pCsr->aBuffer);.
18920 0a 20 20 20 20 70 43 73 72 2d 3e 6e 53 65 67 6d . pCsr->nSegm
18930 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 ent = 0;. pCs
18940 72 2d 3e 61 70 53 65 67 6d 65 6e 74 20 3d 20 30 r->apSegment = 0
18950 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 42 75 66 ;. pCsr->aBuf
18960 66 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a fer = 0;. }.}..
18970 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 /*.** Decode the
18980 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 "end_block" fie
18990 6c 64 2c 20 73 65 6c 65 63 74 65 64 20 62 79 20 ld, selected by
189a0 63 6f 6c 75 6d 6e 20 69 43 6f 6c 20 6f 66 20 74 column iCol of t
189b0 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 he SELECT .** st
189c0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 atement passed a
189d0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 s the first argu
189e0 6d 65 6e 74 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 ment. .**.** The
189f0 20 22 65 6e 64 5f 62 6c 6f 63 6b 22 20 66 69 65 "end_block" fie
18a00 6c 64 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 ld may contain e
18a10 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72 ither an integer
18a20 2c 20 6f 72 20 61 20 74 65 78 74 20 66 69 65 6c , or a text fiel
18a30 64 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 d.** containing
18a40 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 the text represe
18a50 6e 74 61 74 69 6f 6e 20 6f 66 20 74 77 6f 20 6e ntation of two n
18a60 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 on-negative inte
18a70 67 65 72 73 20 73 65 70 61 72 61 74 65 64 20 0a gers separated .
18a80 2a 2a 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 ** by one or mor
18a90 65 20 73 70 61 63 65 20 28 30 78 32 30 29 20 63 e space (0x20) c
18aa0 68 61 72 61 63 74 65 72 73 2e 20 49 6e 20 74 68 haracters. In th
18ab0 65 20 66 69 72 73 74 20 63 61 73 65 2c 20 73 65 e first case, se
18ac0 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 0a 2a t *piEndBlock .*
18ad0 2a 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72 * to the integer
18ae0 20 76 61 6c 75 65 20 61 6e 64 20 2a 70 6e 42 79 value and *pnBy
18af0 74 65 20 74 6f 20 7a 65 72 6f 20 62 65 66 6f 72 te to zero befor
18b00 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 6e 20 e returning. In
18b10 74 68 65 20 73 65 63 6f 6e 64 2c 20 0a 2a 2a 20 the second, .**
18b20 73 65 74 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 set *piEndBlock
18b30 74 6f 20 74 68 65 20 66 69 72 73 74 20 76 61 6c to the first val
18b40 75 65 20 61 6e 64 20 2a 70 6e 42 79 74 65 20 74 ue and *pnByte t
18b50 6f 20 74 68 65 20 73 65 63 6f 6e 64 2e 0a 2a 2f o the second..*/
18b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 .static void fts
18b70 33 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65 3ReadEndBlockFie
18b80 6c 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 ld(. sqlite3_st
18b90 6d 74 20 2a 70 53 74 6d 74 2c 20 0a 20 20 69 6e mt *pStmt, . in
18ba0 74 20 69 43 6f 6c 2c 20 0a 20 20 69 36 34 20 2a t iCol, . i64 *
18bb0 70 69 45 6e 64 42 6c 6f 63 6b 2c 0a 20 20 69 36 piEndBlock,. i6
18bc0 34 20 2a 70 6e 42 79 74 65 0a 29 7b 0a 20 20 63 4 *pnByte.){. c
18bd0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
18be0 61 72 20 2a 7a 54 65 78 74 20 3d 20 73 71 6c 69 ar *zText = sqli
18bf0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 te3_column_text(
18c00 70 53 74 6d 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 pStmt, iCol);.
18c10 69 66 28 20 7a 54 65 78 74 20 29 7b 0a 20 20 20 if( zText ){.
18c20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 int i;. int
18c30 69 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 36 iMul = 1;. i6
18c40 34 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 4 iVal = 0;.
18c50 66 6f 72 28 69 3d 30 3b 20 7a 54 65 78 74 5b 69 for(i=0; zText[i
18c60 5d 3e 3d 27 30 27 20 26 26 20 7a 54 65 78 74 5b ]>='0' && zText[
18c70 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 0a 20 i]<='9'; i++){.
18c80 20 20 20 20 20 69 56 61 6c 20 3d 20 69 56 61 6c iVal = iVal
18c90 2a 31 30 20 2b 20 28 7a 54 65 78 74 5b 69 5d 20 *10 + (zText[i]
18ca0 2d 20 27 30 27 29 3b 0a 20 20 20 20 7d 0a 20 20 - '0');. }.
18cb0 20 20 2a 70 69 45 6e 64 42 6c 6f 63 6b 20 3d 20 *piEndBlock =
18cc0 69 56 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 iVal;. while(
18cd0 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 20 27 20 29 zText[i]==' ' )
18ce0 20 69 2b 2b 3b 0a 20 20 20 20 69 56 61 6c 20 3d i++;. iVal =
18cf0 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 78 0;. if( zTex
18d00 74 5b 69 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 t[i]=='-' ){.
18d10 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 4d i++;. iM
18d20 75 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 ul = -1;. }.
18d30 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20 for(/* no-op
18d40 2a 2f 3b 20 7a 54 65 78 74 5b 69 5d 3e 3d 27 30 */; zText[i]>='0
18d50 27 20 26 26 20 7a 54 65 78 74 5b 69 5d 3c 3d 27 ' && zText[i]<='
18d60 39 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 9'; i++){.
18d70 69 56 61 6c 20 3d 20 69 56 61 6c 2a 31 30 20 2b iVal = iVal*10 +
18d80 20 28 7a 54 65 78 74 5b 69 5d 20 2d 20 27 30 27 (zText[i] - '0'
18d90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e );. }. *pn
18da0 42 79 74 65 20 3d 20 28 69 56 61 6c 20 2a 20 28 Byte = (iVal * (
18db0 69 36 34 29 69 4d 75 6c 29 3b 0a 20 20 7d 0a 7d i64)iMul);. }.}
18dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 65 67 6d 65 .../*.** A segme
18dd0 6e 74 20 6f 66 20 73 69 7a 65 20 6e 42 79 74 65 nt of size nByte
18de0 20 62 79 74 65 73 20 68 61 73 20 6a 75 73 74 20 bytes has just
18df0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 been written to
18e00 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 0a 2a absolute level.*
18e10 2a 20 69 41 62 73 4c 65 76 65 6c 2e 20 50 72 6f * iAbsLevel. Pro
18e20 6d 6f 74 65 20 61 6e 79 20 73 65 67 6d 65 6e 74 mote any segment
18e30 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 s that should be
18e40 20 70 72 6f 6d 6f 74 65 64 20 61 73 20 61 20 72 promoted as a r
18e50 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 esult..*/.static
18e60 20 69 6e 74 20 66 74 73 33 50 72 6f 6d 6f 74 65 int fts3Promote
18e70 53 65 67 6d 65 6e 74 73 28 0a 20 20 46 74 73 33 Segments(. Fts3
18e80 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 Table *p,
18e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
18ea0 54 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 TS table handle
18eb0 2a 2f 0a 20 20 69 6e 74 20 69 41 62 73 4c 65 76 */. int iAbsLev
18ec0 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 el,
18ed0 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 /* Absolute
18ee0 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 level just upda
18ef0 74 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ted */. sqlite3
18f00 5f 69 6e 74 36 34 20 6e 42 79 74 65 20 20 20 20 _int64 nByte
18f10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
18f20 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 of new segment
18f30 61 74 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a at iAbsLevel */.
18f40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 ){. int rc = SQ
18f50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 LITE_OK;. sqlit
18f60 65 33 5f 73 74 6d 74 20 2a 70 52 61 6e 67 65 3b e3_stmt *pRange;
18f70 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c .. rc = fts3Sql
18f80 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 Stmt(p, SQL_SELE
18f90 43 54 5f 4c 45 56 45 4c 5f 52 41 4e 47 45 32 2c CT_LEVEL_RANGE2,
18fa0 20 26 70 52 61 6e 67 65 2c 20 30 29 3b 0a 0a 20 &pRange, 0);..
18fb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
18fc0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f OK ){. int bO
18fd0 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 k = 0;. int i
18fe0 4c 61 73 74 20 3d 20 28 69 41 62 73 4c 65 76 65 Last = (iAbsLeve
18ff0 6c 2f 46 54 53 33 5f 53 45 47 44 49 52 5f 4d 41 l/FTS3_SEGDIR_MA
19000 58 4c 45 56 45 4c 20 2b 20 31 29 20 2a 20 46 54 XLEVEL + 1) * FT
19010 53 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 S3_SEGDIR_MAXLEV
19020 45 4c 20 2d 20 31 3b 0a 20 20 20 20 69 36 34 20 EL - 1;. i64
19030 6e 4c 69 6d 69 74 20 3d 20 28 6e 42 79 74 65 2a nLimit = (nByte*
19040 33 29 2f 32 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 3)/2;.. /* Lo
19050 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 op through all e
19060 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 25 5f ntries in the %_
19070 73 65 67 64 69 72 20 74 61 62 6c 65 20 63 6f 72 segdir table cor
19080 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 0a 20 responding to .
19090 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 ** segments i
190a0 6e 20 74 68 69 73 20 69 6e 64 65 78 20 6f 6e 20 n this index on
190b0 6c 65 76 65 6c 73 20 67 72 65 61 74 65 72 20 74 levels greater t
190c0 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e 20 49 han iAbsLevel. I
190d0 66 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 2a f there is. *
190e0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73 * at least one s
190f0 75 63 68 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 uch segment, and
19100 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 it is possible
19110 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 61 to determine tha
19120 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 73 75 t all . ** su
19130 63 68 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 ch segments are
19140 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 4c 69 smaller than nLi
19150 6d 69 74 20 62 79 74 65 73 20 69 6e 20 73 69 7a mit bytes in siz
19160 65 2c 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 e, they will be
19170 0a 20 20 20 20 2a 2a 20 70 72 6f 6d 6f 74 65 64 . ** promoted
19180 20 74 6f 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 to level iAbsLe
19190 76 65 6c 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c vel. */. sql
191a0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 52 ite3_bind_int(pR
191b0 61 6e 67 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 ange, 1, iAbsLev
191c0 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 el+1);. sqlit
191d0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 52 61 6e e3_bind_int(pRan
191e0 67 65 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20 ge, 2, iLast);.
191f0 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 while( SQLITE
19200 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 _ROW==sqlite3_st
19210 65 70 28 70 52 61 6e 67 65 29 20 29 7b 0a 20 20 ep(pRange) ){.
19220 20 20 20 20 69 36 34 20 6e 53 69 7a 65 2c 20 64 i64 nSize, d
19230 75 6d 6d 79 3b 0a 20 20 20 20 20 20 66 74 73 33 ummy;. fts3
19240 52 65 61 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c ReadEndBlockFiel
19250 64 28 70 52 61 6e 67 65 2c 20 32 2c 20 26 64 75 d(pRange, 2, &du
19260 6d 6d 79 2c 20 26 6e 53 69 7a 65 29 3b 0a 20 20 mmy, &nSize);.
19270 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 30 if( nSize<=0
19280 20 7c 7c 20 6e 53 69 7a 65 3e 6e 4c 69 6d 69 74 || nSize>nLimit
19290 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 ){. /* I
192a0 66 20 6e 53 69 7a 65 3d 3d 30 2c 20 74 68 65 6e f nSize==0, then
192b0 20 74 68 65 20 25 5f 73 65 67 64 69 72 2e 65 6e the %_segdir.en
192c0 64 5f 62 6c 6f 63 6b 20 66 69 65 6c 64 20 64 6f d_block field do
192d0 65 73 20 6e 6f 74 20 6e 6f 74 20 0a 20 20 20 20 es not not .
192e0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 ** contain a
192f0 20 73 69 7a 65 20 76 61 6c 75 65 2e 20 54 68 69 size value. Thi
19300 73 20 68 61 70 70 65 6e 73 20 69 66 20 69 74 20 s happens if it
19310 77 61 73 20 77 72 69 74 74 65 6e 20 62 79 20 61 was written by a
19320 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6c 64 n. ** old
19330 20 76 65 72 73 69 6f 6e 20 6f 66 20 46 54 53 2e version of FTS.
19340 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 In this case it
19350 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 is not possible
19360 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 to determine.
19370 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 7a ** the siz
19380 65 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 e of the segment
19390 2c 20 61 6e 64 20 73 6f 20 73 65 67 6d 65 6e 74 , and so segment
193a0 20 70 72 6f 6d 6f 74 69 6f 6e 20 64 6f 65 73 20 promotion does
193b0 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 not. ** t
193c0 61 6b 65 20 70 6c 61 63 65 2e 20 20 2a 2f 0a 20 ake place. */.
193d0 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 30 3b 0a bOk = 0;.
193e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
193f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 4f 6b }. bOk
19400 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 = 1;. }.
19410 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 rc = sqlite3_res
19420 65 74 28 70 52 61 6e 67 65 29 3b 0a 0a 20 20 20 et(pRange);..
19430 20 69 66 28 20 62 4f 6b 20 29 7b 0a 20 20 20 20 if( bOk ){.
19440 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a int iIdx = 0;.
19450 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 sqlite3_st
19460 6d 74 20 2a 70 55 70 64 61 74 65 31 3b 0a 20 20 mt *pUpdate1;.
19470 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 sqlite3_stmt
19480 20 2a 70 55 70 64 61 74 65 32 3b 0a 0a 20 20 20 *pUpdate2;..
19490 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
194a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
194b0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 rc = fts3SqlStmt
194c0 28 70 2c 20 53 51 4c 5f 55 50 44 41 54 45 5f 4c (p, SQL_UPDATE_L
194d0 45 56 45 4c 5f 49 44 58 2c 20 26 70 55 70 64 61 EVEL_IDX, &pUpda
194e0 74 65 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d te1, 0);. }
194f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 . if( rc==S
19500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
19510 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c rc = fts3Sql
19520 53 74 6d 74 28 70 2c 20 53 51 4c 5f 55 50 44 41 Stmt(p, SQL_UPDA
19530 54 45 5f 4c 45 56 45 4c 2c 20 26 70 55 70 64 61 TE_LEVEL, &pUpda
19540 74 65 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d te2, 0);. }
19550 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d .. if( rc==
19560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 SQLITE_OK ){..
19570 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 /* Loop th
19580 72 6f 75 67 68 20 61 6c 6c 20 25 5f 73 65 67 64 rough all %_segd
19590 69 72 20 65 6e 74 72 69 65 73 20 66 6f 72 20 73 ir entries for s
195a0 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 egments in this
195b0 69 6e 64 65 78 20 77 69 74 68 0a 20 20 20 20 20 index with.
195c0 20 20 20 2a 2a 20 6c 65 76 65 6c 73 20 65 71 75 ** levels equ
195d0 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 al to or greater
195e0 20 74 68 61 6e 20 69 41 62 73 4c 65 76 65 6c 2e than iAbsLevel.
195f0 20 41 73 20 65 61 63 68 20 65 6e 74 72 79 20 69 As each entry i
19600 73 20 76 69 73 69 74 65 64 2c 0a 20 20 20 20 20 s visited,.
19610 20 20 20 2a 2a 20 75 70 64 61 74 65 64 20 69 74 ** updated it
19620 20 74 6f 20 73 65 74 20 28 6c 65 76 65 6c 20 3d to set (level =
19630 20 2d 31 29 20 61 6e 64 20 28 69 64 78 20 3d 20 -1) and (idx =
19640 4e 29 2c 20 77 68 65 72 65 20 4e 20 69 73 20 30 N), where N is 0
19650 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20 20 20 for the.
19660 20 2a 2a 20 6f 6c 64 65 73 74 20 73 65 67 6d 65 ** oldest segme
19670 6e 74 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2c nt in the range,
19680 20 31 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 1 for the next
19690 6f 6c 64 65 73 74 2c 20 61 6e 64 20 73 6f 20 6f oldest, and so o
196a0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 n.. **.
196b0 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 ** In othe
196c0 72 20 77 6f 72 64 73 2c 20 6d 6f 76 65 20 61 6c r words, move al
196d0 6c 20 73 65 67 6d 65 6e 74 73 20 62 65 69 6e 67 l segments being
196e0 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 6c 65 76 promoted to lev
196f0 65 6c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 2a el -1,. *
19700 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 22 69 * setting the "i
19710 64 78 22 20 66 69 65 6c 64 73 20 61 73 20 61 70 dx" fields as ap
19720 70 72 6f 70 72 69 61 74 65 20 74 6f 20 6b 65 65 propriate to kee
19730 70 20 74 68 65 6d 20 69 6e 20 74 68 65 20 73 61 p them in the sa
19740 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 me. ** or
19750 64 65 72 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 der. The content
19760 73 20 6f 66 20 6c 65 76 65 6c 20 2d 31 20 28 77 s of level -1 (w
19770 68 69 63 68 20 69 73 20 6e 65 76 65 72 20 75 73 hich is never us
19780 65 64 2c 20 65 78 63 65 70 74 0a 20 20 20 20 20 ed, except.
19790 20 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 6c ** transientl
197a0 79 20 68 65 72 65 29 2c 20 77 69 6c 6c 20 62 65 y here), will be
197b0 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 6c moved back to l
197c0 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c 20 62 evel iAbsLevel b
197d0 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 elow. */.
197e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 sqlite3_bind_i
197f0 6e 74 28 70 52 61 6e 67 65 2c 20 31 2c 20 69 41 nt(pRange, 1, iA
19800 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 bsLevel);.
19810 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f while( SQLITE_
19820 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 ROW==sqlite3_ste
19830 70 28 70 52 61 6e 67 65 29 20 29 7b 0a 20 20 20 p(pRange) ){.
19840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 sqlite3_b
19850 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 31 ind_int(pUpdate1
19860 2c 20 31 2c 20 69 49 64 78 2b 2b 29 3b 0a 20 20 , 1, iIdx++);.
19870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
19880 62 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 bind_int(pUpdate
19890 31 2c 20 32 2c 20 73 71 6c 69 74 65 33 5f 63 6f 1, 2, sqlite3_co
198a0 6c 75 6d 6e 5f 69 6e 74 28 70 52 61 6e 67 65 2c lumn_int(pRange,
198b0 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0));.
198c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 sqlite3_bind_int
198d0 28 70 55 70 64 61 74 65 31 2c 20 33 2c 20 73 71 (pUpdate1, 3, sq
198e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 lite3_column_int
198f0 28 70 52 61 6e 67 65 2c 20 31 29 29 3b 0a 20 20 (pRange, 1));.
19900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
19910 73 74 65 70 28 70 55 70 64 61 74 65 31 29 3b 0a step(pUpdate1);.
19920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 rc = s
19930 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 55 70 qlite3_reset(pUp
19940 64 61 74 65 31 29 3b 0a 20 20 20 20 20 20 20 20 date1);.
19950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
19960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 _OK ){.
19970 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 sqlite3_reset
19980 28 70 52 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 (pRange);.
19990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
199a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
199b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }. }.
199c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
199d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 OK ){. rc
199e0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 = sqlite3_reset
199f0 28 70 52 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 (pRange);.
19a00 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 }.. /* Move
19a10 20 6c 65 76 65 6c 20 2d 31 20 74 6f 20 6c 65 76 level -1 to lev
19a20 65 6c 20 69 41 62 73 4c 65 76 65 6c 20 2a 2f 0a el iAbsLevel */.
19a30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
19a40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
19a50 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f sqlite3_bind_
19a60 69 6e 74 28 70 55 70 64 61 74 65 32 2c 20 31 2c int(pUpdate2, 1,
19a70 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 iAbsLevel);.
19a80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 sqlite3_ste
19a90 70 28 70 55 70 64 61 74 65 32 29 3b 0a 20 20 20 p(pUpdate2);.
19aa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
19ab0 33 5f 72 65 73 65 74 28 70 55 70 64 61 74 65 32 3_reset(pUpdate2
19ac0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
19ad0 0a 20 20 7d 0a 0a 0a 20 20 72 65 74 75 72 6e 20 . }... return
19ae0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 rc;.}../*.** Mer
19af0 67 65 20 61 6c 6c 20 6c 65 76 65 6c 20 69 4c 65 ge all level iLe
19b00 76 65 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 vel segments in
19b10 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 74 the database int
19b20 6f 20 61 20 73 69 6e 67 6c 65 20 0a 2a 2a 20 69 o a single .** i
19b30 4c 65 76 65 6c 2b 31 20 73 65 67 6d 65 6e 74 2e Level+1 segment.
19b40 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 3c 30 Or, if iLevel<0
19b50 2c 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d , merge all segm
19b60 65 6e 74 73 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 ents into a.** s
19b70 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 20 77 69 ingle segment wi
19b80 74 68 20 61 20 6c 65 76 65 6c 20 65 71 75 61 6c th a level equal
19b90 20 74 6f 20 74 68 65 20 6e 75 6d 65 72 69 63 61 to the numerica
19ba0 6c 6c 79 20 6c 61 72 67 65 73 74 20 6c 65 76 65 lly largest leve
19bb0 6c 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 l .** currently
19bc0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 64 present in the d
19bd0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 atabase..**.** I
19be0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 f this function
19bf0 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 69 is called with i
19c00 4c 65 76 65 6c 3c 30 2c 20 62 75 74 20 74 68 65 Level<0, but the
19c10 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 0a 2a re is only one.*
19c20 2a 20 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 * segment in the
19c30 20 64 61 74 61 62 61 73 65 2c 20 53 51 4c 49 54 database, SQLIT
19c40 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e E_DONE is return
19c50 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 ed immediately.
19c60 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 .** Otherwise, i
19c70 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 f successful, SQ
19c80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 LITE_OK is retur
19c90 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 ned. If an error
19ca0 20 6f 63 63 75 72 73 2c 20 0a 2a 2a 20 61 6e 20 occurs, .** an
19cb0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 SQLite error cod
19cc0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a e is returned..*
19cd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 /.static int fts
19ce0 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 0a 20 3SegmentMerge(.
19cf0 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 0a Fts3Table *p, .
19d00 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 int iLangid,
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19d20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 /* Language id
19d30 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 to merge */. i
19d40 6e 74 20 69 49 6e 64 65 78 2c 20 20 20 20 20 20 nt iIndex,
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
19d60 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 61 49 * Index in p->aI
19d70 6e 64 65 78 5b 5d 20 74 6f 20 6d 65 72 67 65 20 ndex[] to merge
19d80 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 */. int iLevel
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19da0 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f /* Level to
19db0 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 merge */.){. i
19dc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 nt rc;
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
19de0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f * Return code */
19df0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b . int iIdx = 0;
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19e10 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e /* Index of n
19e20 65 77 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 ew segment */.
19e30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e sqlite3_int64 iN
19e40 65 77 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 ewLevel = 0;
19e50 2f 2a 20 4c 65 76 65 6c 2f 69 6e 64 65 78 20 74 /* Level/index t
19e60 6f 20 63 72 65 61 74 65 20 6e 65 77 20 73 65 67 o create new seg
19e70 6d 65 6e 74 20 61 74 20 2a 2f 0a 20 20 53 65 67 ment at */. Seg
19e80 6d 65 6e 74 57 72 69 74 65 72 20 2a 70 57 72 69 mentWriter *pWri
19e90 74 65 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 ter = 0; /*
19ea0 55 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 68 Used to write th
19eb0 65 20 6e 65 77 2c 20 6d 65 72 67 65 64 2c 20 73 e new, merged, s
19ec0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 33 egment */. Fts3
19ed0 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 72 SegFilter filter
19ee0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 ; /* S
19ef0 65 67 6d 65 6e 74 20 74 65 72 6d 20 66 69 6c 74 egment term filt
19f00 65 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a er condition */.
19f10 20 20 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 Fts3MultiSegRe
19f20 61 64 65 72 20 63 73 72 3b 20 20 20 20 20 20 20 ader csr;
19f30 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 69 /* Cursor to i
19f40 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c terate through l
19f50 65 76 65 6c 28 73 29 20 2a 2f 0a 20 20 69 6e 74 evel(s) */. int
19f60 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d 20 bIgnoreEmpty =
19f70 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 0; /*
19f80 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65 20 65 True to ignore e
19f90 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 20 2a 2f mpty segments */
19fa0 0a 20 20 69 36 34 20 69 4d 61 78 4c 65 76 65 6c . i64 iMaxLevel
19fb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
19fc0 20 20 20 2f 2a 20 4d 61 78 20 6c 65 76 65 6c 20 /* Max level
19fd0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 number for this
19fe0 69 6e 64 65 78 2f 6c 61 6e 67 69 64 20 2a 2f 0a index/langid */.
19ff0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 76 65 . assert( iLeve
1a000 6c 3d 3d 46 54 53 33 5f 53 45 47 43 55 52 53 4f l==FTS3_SEGCURSO
1a010 52 5f 41 4c 4c 0a 20 20 20 20 20 20 20 7c 7c 20 R_ALL. ||
1a020 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 iLevel==FTS3_SEG
1a030 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 0a 20 CURSOR_PENDING.
1a040 20 20 20 20 20 20 7c 7c 20 69 4c 65 76 65 6c 3e || iLevel>
1a050 3d 30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 =0. );. assert
1a060 28 20 69 4c 65 76 65 6c 3c 46 54 53 33 5f 53 45 ( iLevel<FTS3_SE
1a070 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 20 29 3b GDIR_MAXLEVEL );
1a080 0a 20 20 61 73 73 65 72 74 28 20 69 49 6e 64 65 . assert( iInde
1a090 78 3e 3d 30 20 26 26 20 69 49 6e 64 65 78 3c 70 x>=0 && iIndex<p
1a0a0 2d 3e 6e 49 6e 64 65 78 20 29 3b 0a 0a 20 20 72 ->nIndex );.. r
1a0b0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 53 c = sqlite3Fts3S
1a0c0 65 67 52 65 61 64 65 72 43 75 72 73 6f 72 28 70 egReaderCursor(p
1a0d0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 , iLangid, iInde
1a0e0 78 2c 20 69 4c 65 76 65 6c 2c 20 30 2c 20 30 2c x, iLevel, 0, 0,
1a0f0 20 31 2c 20 30 2c 20 26 63 73 72 29 3b 0a 20 20 1, 0, &csr);.
1a100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
1a110 4b 20 7c 7c 20 63 73 72 2e 6e 53 65 67 6d 65 6e K || csr.nSegmen
1a120 74 3d 3d 30 20 29 20 67 6f 74 6f 20 66 69 6e 69 t==0 ) goto fini
1a130 73 68 65 64 3b 0a 0a 20 20 69 66 28 20 69 4c 65 shed;.. if( iLe
1a140 76 65 6c 21 3d 46 54 53 33 5f 53 45 47 43 55 52 vel!=FTS3_SEGCUR
1a150 53 4f 52 5f 50 45 4e 44 49 4e 47 20 29 7b 0a 20 SOR_PENDING ){.
1a160 20 20 20 72 63 20 3d 20 66 74 73 33 53 65 67 6d rc = fts3Segm
1a170 65 6e 74 4d 61 78 4c 65 76 65 6c 28 70 2c 20 69 entMaxLevel(p, i
1a180 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 Langid, iIndex,
1a190 26 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20 20 &iMaxLevel);.
1a1a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
1a1b0 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 68 OK ) goto finish
1a1c0 65 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 ed;. }.. if( i
1a1d0 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 47 43 Level==FTS3_SEGC
1a1e0 55 52 53 4f 52 5f 41 4c 4c 20 29 7b 0a 20 20 20 URSOR_ALL ){.
1a1f0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 /* This call is
1a200 20 74 6f 20 6d 65 72 67 65 20 61 6c 6c 20 73 65 to merge all se
1a210 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 gments in the da
1a220 74 61 62 61 73 65 20 74 6f 20 61 20 73 69 6e 67 tabase to a sing
1a230 6c 65 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e le. ** segmen
1a240 74 2e 20 54 68 65 20 6c 65 76 65 6c 20 6f 66 20 t. The level of
1a250 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 the new segment
1a260 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 is equal to the
1a270 6e 75 6d 65 72 69 63 61 6c 6c 79 0a 20 20 20 20 numerically.
1a280 2a 2a 20 67 72 65 61 74 65 73 74 20 73 65 67 6d ** greatest segm
1a290 65 6e 74 20 6c 65 76 65 6c 20 63 75 72 72 65 6e ent level curren
1a2a0 74 6c 79 20 70 72 65 73 65 6e 74 20 69 6e 20 74 tly present in t
1a2b0 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 he database for
1a2c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 this. ** inde
1a2d0 78 2e 20 54 68 65 20 69 64 78 20 6f 66 20 74 68 x. The idx of th
1a2e0 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 69 73 e new segment is
1a2f0 20 61 6c 77 61 79 73 20 30 2e 20 20 2a 2f 0a 20 always 0. */.
1a300 20 20 20 69 66 28 20 63 73 72 2e 6e 53 65 67 6d if( csr.nSegm
1a310 65 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 ent==1 ){.
1a320 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 rc = SQLITE_DONE
1a330 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e ;. goto fin
1a340 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 ished;. }.
1a350 20 69 4e 65 77 4c 65 76 65 6c 20 3d 20 69 4d 61 iNewLevel = iMa
1a360 78 4c 65 76 65 6c 3b 0a 20 20 20 20 62 49 67 6e xLevel;. bIgn
1a370 6f 72 65 45 6d 70 74 79 20 3d 20 31 3b 0a 0a 20 oreEmpty = 1;..
1a380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 }else{. /* T
1a390 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d his call is to m
1a3a0 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e 74 erge all segment
1a3b0 73 20 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 s at level iLeve
1a3c0 6c 2e 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 l. find the next
1a3d0 0a 20 20 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c . ** availabl
1a3e0 65 20 73 65 67 6d 65 6e 74 20 69 6e 64 65 78 20 e segment index
1a3f0 61 74 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 2b at level iLevel+
1a400 31 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 0a 20 1. The call to.
1a410 20 20 20 2a 2a 20 66 74 73 33 41 6c 6c 6f 63 61 ** fts3Alloca
1a420 74 65 53 65 67 64 69 72 49 64 78 28 29 20 77 69 teSegdirIdx() wi
1a430 6c 6c 20 6d 65 72 67 65 20 74 68 65 20 73 65 67 ll merge the seg
1a440 6d 65 6e 74 73 20 61 74 20 6c 65 76 65 6c 20 69 ments at level i
1a450 4c 65 76 65 6c 2b 31 20 74 6f 20 0a 20 20 20 20 Level+1 to .
1a460 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69 4c 65 76 ** a single iLev
1a470 65 6c 2b 32 20 73 65 67 6d 65 6e 74 20 69 66 20 el+2 segment if
1a480 6e 65 63 65 73 73 61 72 79 2e 20 20 2a 2f 0a 20 necessary. */.
1a490 20 20 20 61 73 73 65 72 74 28 20 46 54 53 33 5f assert( FTS3_
1a4a0 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e SEGCURSOR_PENDIN
1a4b0 47 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 69 4e 65 G==-1 );. iNe
1a4c0 77 4c 65 76 65 6c 20 3d 20 67 65 74 41 62 73 6f wLevel = getAbso
1a4d0 6c 75 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 luteLevel(p, iLa
1a4e0 6e 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c ngid, iIndex, iL
1a4f0 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 72 63 20 evel+1);. rc
1a500 3d 20 66 74 73 33 41 6c 6c 6f 63 61 74 65 53 65 = fts3AllocateSe
1a510 67 64 69 72 49 64 78 28 70 2c 20 69 4c 61 6e 67 gdirIdx(p, iLang
1a520 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 76 id, iIndex, iLev
1a530 65 6c 2b 31 2c 20 26 69 49 64 78 29 3b 0a 20 20 el+1, &iIdx);.
1a540 20 20 62 49 67 6e 6f 72 65 45 6d 70 74 79 20 3d bIgnoreEmpty =
1a550 20 28 69 4c 65 76 65 6c 21 3d 46 54 53 33 5f 53 (iLevel!=FTS3_S
1a560 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 EGCURSOR_PENDING
1a570 29 20 26 26 20 28 69 4e 65 77 4c 65 76 65 6c 3e ) && (iNewLevel>
1a580 69 4d 61 78 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a iMaxLevel);. }.
1a590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
1a5a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 6e 69 73 _OK ) goto finis
1a5b0 68 65 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 hed;.. assert(
1a5c0 63 73 72 2e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 csr.nSegment>0 )
1a5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65 77 ;. assert( iNew
1a5e0 4c 65 76 65 6c 3e 3d 67 65 74 41 62 73 6f 6c 75 Level>=getAbsolu
1a5f0 74 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 teLevel(p, iLang
1a600 69 64 2c 20 69 49 6e 64 65 78 2c 20 30 29 20 29 id, iIndex, 0) )
1a610 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4e 65 77 ;. assert( iNew
1a620 4c 65 76 65 6c 3c 67 65 74 41 62 73 6f 6c 75 74 Level<getAbsolut
1a630 65 4c 65 76 65 6c 28 70 2c 20 69 4c 61 6e 67 69 eLevel(p, iLangi
1a640 64 2c 20 69 49 6e 64 65 78 2c 46 54 53 33 5f 53 d, iIndex,FTS3_S
1a650 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 4c 29 20 EGDIR_MAXLEVEL)
1a660 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 );.. memset(&fi
1a670 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 lter, 0, sizeof(
1a680 46 74 73 33 53 65 67 46 69 6c 74 65 72 29 29 3b Fts3SegFilter));
1a690 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 73 20 . filter.flags
1a6a0 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 = FTS3_SEGMENT_R
1a6b0 45 51 55 49 52 45 5f 50 4f 53 3b 0a 20 20 66 69 EQUIRE_POS;. fi
1a6c0 6c 74 65 72 2e 66 6c 61 67 73 20 7c 3d 20 28 62 lter.flags |= (b
1a6d0 49 67 6e 6f 72 65 45 6d 70 74 79 20 3f 20 46 54 IgnoreEmpty ? FT
1a6e0 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e 4f 52 S3_SEGMENT_IGNOR
1a6f0 45 5f 45 4d 50 54 59 20 3a 20 30 29 3b 0a 0a 20 E_EMPTY : 0);..
1a700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 rc = sqlite3Fts
1a710 33 53 65 67 52 65 61 64 65 72 53 74 61 72 74 28 3SegReaderStart(
1a720 70 2c 20 26 63 73 72 2c 20 26 66 69 6c 74 65 72 p, &csr, &filter
1a730 29 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 );. while( SQLI
1a740 54 45 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 TE_OK==rc ){.
1a750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 rc = sqlite3Fts
1a760 33 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70 3SegReaderStep(p
1a770 2c 20 26 63 73 72 29 3b 0a 20 20 20 20 69 66 28 , &csr);. if(
1a780 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 rc!=SQLITE_ROW
1a790 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 ) break;. rc
1a7a0 3d 20 66 74 73 33 53 65 67 57 72 69 74 65 72 41 = fts3SegWriterA
1a7b0 64 64 28 70 2c 20 26 70 57 72 69 74 65 72 2c 20 dd(p, &pWriter,
1a7c0 31 2c 20 0a 20 20 20 20 20 20 20 20 63 73 72 2e 1, . csr.
1a7d0 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d zTerm, csr.nTerm
1a7e0 2c 20 63 73 72 2e 61 44 6f 63 6c 69 73 74 2c 20 , csr.aDoclist,
1a7f0 63 73 72 2e 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 csr.nDoclist);.
1a800 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c }. if( rc!=SQL
1a810 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 66 69 ITE_OK ) goto fi
1a820 6e 69 73 68 65 64 3b 0a 20 20 61 73 73 65 72 74 nished;. assert
1a830 28 20 70 57 72 69 74 65 72 20 7c 7c 20 62 49 67 ( pWriter || bIg
1a840 6e 6f 72 65 45 6d 70 74 79 20 29 3b 0a 0a 20 20 noreEmpty );..
1a850 69 66 28 20 69 4c 65 76 65 6c 21 3d 46 54 53 33 if( iLevel!=FTS3
1a860 5f 53 45 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 _SEGCURSOR_PENDI
1a870 4e 47 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 NG ){. rc = f
1a880 74 73 33 44 65 6c 65 74 65 53 65 67 64 69 72 28 ts3DeleteSegdir(
1a890 0a 20 20 20 20 20 20 20 20 70 2c 20 69 4c 61 6e . p, iLan
1a8a0 67 69 64 2c 20 69 49 6e 64 65 78 2c 20 69 4c 65 gid, iIndex, iLe
1a8b0 76 65 6c 2c 20 63 73 72 2e 61 70 53 65 67 6d 65 vel, csr.apSegme
1a8c0 6e 74 2c 20 63 73 72 2e 6e 53 65 67 6d 65 6e 74 nt, csr.nSegment
1a8d0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 . );. if(
1a8e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 rc!=SQLITE_OK )
1a8f0 67 6f 74 6f 20 66 69 6e 69 73 68 65 64 3b 0a 20 goto finished;.
1a900 20 7d 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 }. if( pWriter
1a910 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 ){. rc = fts
1a920 33 53 65 67 57 72 69 74 65 72 46 6c 75 73 68 28 3SegWriterFlush(
1a930 70 2c 20 70 57 72 69 74 65 72 2c 20 69 4e 65 77 p, pWriter, iNew
1a940 4c 65 76 65 6c 2c 20 69 49 64 78 29 3b 0a 20 20 Level, iIdx);.
1a950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
1a960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 _OK ){. if(
1a970 20 69 4c 65 76 65 6c 3d 3d 46 54 53 33 5f 53 45 iLevel==FTS3_SE
1a980 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 20 GCURSOR_PENDING
1a990 7c 7c 20 69 4e 65 77 4c 65 76 65 6c 3c 69 4d 61 || iNewLevel<iMa
1a9a0 78 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 20 20 xLevel ){.
1a9b0 20 20 72 63 20 3d 20 66 74 73 33 50 72 6f 6d 6f rc = fts3Promo
1a9c0 74 65 53 65 67 6d 65 6e 74 73 28 70 2c 20 69 4e teSegments(p, iN
1a9d0 65 77 4c 65 76 65 6c 2c 20 70 57 72 69 74 65 72 ewLevel, pWriter
1a9e0 2d 3e 6e 4c 65 61 66 44 61 74 61 29 3b 0a 20 20 ->nLeafData);.
1a9f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a }. }. }.
1aa00 0a 20 66 69 6e 69 73 68 65 64 3a 0a 20 20 66 74 . finished:. ft
1aa10 73 33 53 65 67 57 72 69 74 65 72 46 72 65 65 28 s3SegWriterFree(
1aa20 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 pWriter);. sqli
1aa30 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 te3Fts3SegReader
1aa40 46 69 6e 69 73 68 28 26 63 73 72 29 3b 0a 20 20 Finish(&csr);.
1aa50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f return rc;.}.../
1aa60 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 * .** Flush the
1aa70 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 65 6e 64 contents of pend
1aa80 69 6e 67 54 65 72 6d 73 20 74 6f 20 6c 65 76 65 ingTerms to leve
1aa90 6c 20 30 20 73 65 67 6d 65 6e 74 73 2e 20 0a 2a l 0 segments. .*
1aaa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 /.int sqlite3Fts
1aab0 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 46 6c 75 3PendingTermsFlu
1aac0 73 68 28 46 74 73 33 54 61 62 6c 65 20 2a 70 29 sh(Fts3Table *p)
1aad0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c {. int rc = SQL
1aae0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b ITE_OK;. int i;
1aaf0 0a 20 20 20 20 20 20 20 20 0a 20 20 66 6f 72 28 . . for(
1ab00 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f i=0; rc==SQLITE_
1ab10 4f 4b 20 26 26 20 69 3c 70 2d 3e 6e 49 6e 64 65 OK && i<p->nInde
1ab20 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 x; i++){. rc
1ab30 3d 20 66 74 73 33 53 65 67 6d 65 6e 74 4d 65 72 = fts3SegmentMer
1ab40 67 65 28 70 2c 20 70 2d 3e 69 50 72 65 76 4c 61 ge(p, p->iPrevLa
1ab50 6e 67 69 64 2c 20 69 2c 20 46 54 53 33 5f 53 45 ngid, i, FTS3_SE
1ab60 47 43 55 52 53 4f 52 5f 50 45 4e 44 49 4e 47 29 GCURSOR_PENDING)
1ab70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 ;. if( rc==SQ
1ab80 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d LITE_DONE ) rc =
1ab90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a SQLITE_OK;. }.
1aba0 20 20 73 71 6c 69 74 65 33 46 74 73 33 50 65 6e sqlite3Fts3Pen
1abb0 64 69 6e 67 54 65 72 6d 73 43 6c 65 61 72 28 70 dingTermsClear(p
1abc0 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 );.. /* Determi
1abd0 6e 65 20 74 68 65 20 61 75 74 6f 2d 69 6e 63 72 ne the auto-incr
1abe0 2d 6d 65 72 67 65 20 73 65 74 74 69 6e 67 20 69 -merge setting i
1abf0 66 20 75 6e 6b 6e 6f 77 6e 2e 20 20 49 66 20 65 f unknown. If e
1ac00 6e 61 62 6c 65 64 2c 0a 20 20 2a 2a 20 65 73 74 nabled,. ** est
1ac10 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 imate the number
1ac20 20 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 of leaf blocks
1ac30 6f 66 20 63 6f 6e 74 65 6e 74 20 74 6f 20 62 65 of content to be
1ac40 20 77 72 69 74 74 65 6e 0a 20 20 2a 2f 0a 20 20 written. */.
1ac50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
1ac60 4b 20 26 26 20 70 2d 3e 62 48 61 73 53 74 61 74 K && p->bHasStat
1ac70 0a 20 20 20 26 26 20 70 2d 3e 6e 41 75 74 6f 69 . && p->nAutoi
1ac80 6e 63 72 6d 65 72 67 65 3d 3d 30 78 66 66 20 26 ncrmerge==0xff &
1ac90 26 20 70 2d 3e 6e 4c 65 61 66 41 64 64 3e 30 0a & p->nLeafAdd>0.
1aca0 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
1acb0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 _stmt *pStmt = 0
1acc0 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 ;. rc = fts3S
1acd0 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 qlStmt(p, SQL_SE
1ace0 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d LECT_STAT, &pStm
1acf0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 t, 0);. if( r
1ad00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
1ad10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 sqlite3_bi
1ad20 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c nd_int(pStmt, 1,
1ad30 20 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e FTS_STAT_AUTOIN
1ad40 43 52 4d 45 52 47 45 29 3b 0a 20 20 20 20 20 20 CRMERGE);.
1ad50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 rc = sqlite3_ste
1ad60 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 p(pStmt);.
1ad70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 if( rc==SQLITE_R
1ad80 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d OW ){. p-
1ad90 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 20 >nAutoincrmerge
1ada0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e = sqlite3_column
1adb0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a _int(pStmt, 0);.
1adc0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e if( p->n
1add0 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 3d 3d 31 Autoincrmerge==1
1ade0 20 29 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d ) p->nAutoincrm
1adf0 65 72 67 65 20 3d 20 38 3b 0a 20 20 20 20 20 20 erge = 8;.
1ae00 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 }else if( rc==SQ
1ae10 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 LITE_DONE ){.
1ae20 20 20 20 20 20 70 2d 3e 6e 41 75 74 6f 69 6e 63 p->nAutoinc
1ae30 72 6d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 rmerge = 0;.
1ae40 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 }. rc = s
1ae50 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 qlite3_reset(pSt
1ae60 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 mt);. }. }.
1ae70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
1ae80 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20 4e 20 69 6e *.** Encode N in
1ae90 74 65 67 65 72 73 20 61 73 20 76 61 72 69 6e 74 tegers as varint
1aea0 73 20 69 6e 74 6f 20 61 20 62 6c 6f 62 2e 0a 2a s into a blob..*
1aeb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 /.static void ft
1aec0 73 33 45 6e 63 6f 64 65 49 6e 74 41 72 72 61 79 s3EncodeIntArray
1aed0 28 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 (. int N,
1aee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 /* The nu
1aef0 6d 62 65 72 20 6f 66 20 69 6e 74 65 67 65 72 73 mber of integers
1af00 20 74 6f 20 65 6e 63 6f 64 65 20 2a 2f 0a 20 20 to encode */.
1af10 75 33 32 20 2a 61 2c 20 20 20 20 20 20 20 20 20 u32 *a,
1af20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 /* The intege
1af30 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 68 r values */. ch
1af40 61 72 20 2a 7a 42 75 66 2c 20 20 20 20 20 20 20 ar *zBuf,
1af50 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 42 4c /* Write the BL
1af60 4f 42 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 OB here */. int
1af70 20 2a 70 4e 42 75 66 20 20 20 20 20 20 20 20 20 *pNBuf
1af80 2f 2a 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20 /* Write number
1af90 6f 66 20 62 79 74 65 73 20 69 66 20 7a 42 75 66 of bytes if zBuf
1afa0 5b 5d 20 75 73 65 64 20 68 65 72 65 20 2a 2f 0a [] used here */.
1afb0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 ){. int i, j;.
1afc0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b for(i=j=0; i<N;
1afd0 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 20 2b 3d 20 i++){. j +=
1afe0 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 sqlite3Fts3PutVa
1aff0 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c 20 28 rint(&zBuf[j], (
1b000 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 61 5b sqlite3_int64)a[
1b010 69 5d 29 3b 0a 20 20 7d 0a 20 20 2a 70 4e 42 75 i]);. }. *pNBu
1b020 66 20 3d 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 f = j;.}../*.**
1b030 44 65 63 6f 64 65 20 61 20 62 6c 6f 62 20 6f 66 Decode a blob of
1b040 20 76 61 72 69 6e 74 73 20 69 6e 74 6f 20 4e 20 varints into N
1b050 69 6e 74 65 67 65 72 73 0a 2a 2f 0a 73 74 61 74 integers.*/.stat
1b060 69 63 20 76 6f 69 64 20 66 74 73 33 44 65 63 6f ic void fts3Deco
1b070 64 65 49 6e 74 41 72 72 61 79 28 0a 20 20 69 6e deIntArray(. in
1b080 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 t N,
1b090 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f /* The number o
1b0a0 66 20 69 6e 74 65 67 65 72 73 20 74 6f 20 64 65 f integers to de
1b0b0 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 code */. u32 *a
1b0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 , /*
1b0d0 57 72 69 74 65 20 74 68 65 20 69 6e 74 65 67 65 Write the intege
1b0e0 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 63 6f r values */. co
1b0f0 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 nst char *zBuf,
1b100 20 2f 2a 20 54 68 65 20 42 4c 4f 42 20 63 6f 6e /* The BLOB con
1b110 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 72 69 taining the vari
1b120 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 nts */. int nBu
1b130 66 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 f /* s
1b140 69 7a 65 20 6f 66 20 74 68 65 20 42 4c 4f 42 20 ize of the BLOB
1b150 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a */.){. int i, j
1b160 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d ;. UNUSED_PARAM
1b170 45 54 45 52 28 6e 42 75 66 29 3b 0a 20 20 66 6f ETER(nBuf);. fo
1b180 72 28 69 3d 6a 3d 30 3b 20 69 3c 4e 3b 20 69 2b r(i=j=0; i<N; i+
1b190 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f +){. sqlite3_
1b1a0 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 6a 20 2b int64 x;. j +
1b1b0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 = sqlite3Fts3Get
1b1c0 56 61 72 69 6e 74 28 26 7a 42 75 66 5b 6a 5d 2c Varint(&zBuf[j],
1b1d0 20 26 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 &x);. assert
1b1e0 28 6a 3c 3d 6e 42 75 66 29 3b 0a 20 20 20 20 61 (j<=nBuf);. a
1b1f0 5b 69 5d 20 3d 20 28 75 33 32 29 28 78 20 26 20 [i] = (u32)(x &
1b200 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 0xffffffff);. }
1b210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 .}../*.** Insert
1b220 20 74 68 65 20 73 69 7a 65 73 20 28 69 6e 20 74 the sizes (in t
1b230 6f 6b 65 6e 73 29 20 66 6f 72 20 65 61 63 68 20 okens) for each
1b240 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 64 6f column of the do
1b250 63 75 6d 65 6e 74 0a 2a 2a 20 77 69 74 68 20 64 cument.** with d
1b260 6f 63 69 64 20 65 71 75 61 6c 20 74 6f 20 70 2d ocid equal to p-
1b270 3e 69 50 72 65 76 44 6f 63 69 64 2e 20 20 54 68 >iPrevDocid. Th
1b280 65 20 73 69 7a 65 73 20 61 72 65 20 65 6e 63 6f e sizes are enco
1b290 64 65 64 20 61 73 0a 2a 2a 20 61 20 62 6c 6f 62 ded as.** a blob
1b2a0 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a of varints..*/.
1b2b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 33 static void fts3
1b2c0 49 6e 73 65 72 74 44 6f 63 73 69 7a 65 28 0a 20 InsertDocsize(.
1b2d0 20 69 6e 74 20 2a 70 52 43 2c 20 20 20 20 20 20 int *pRC,
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b2f0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 /* Result code
1b300 2a 2f 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a */. Fts3Table *
1b310 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p,
1b320 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 69 6e /* Table in
1b330 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 to which to inse
1b340 72 74 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a rt */. u32 *aSz
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b360 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 /* Sizes
1b370 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c of each column,
1b380 20 69 6e 20 74 6f 6b 65 6e 73 20 2a 2f 0a 29 7b in tokens */.){
1b390 0a 20 20 63 68 61 72 20 2a 70 42 6c 6f 62 3b 20 . char *pBlob;
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
1b3b0 68 65 20 42 4c 4f 42 20 65 6e 63 6f 64 69 6e 67 he BLOB encoding
1b3c0 20 6f 66 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 of the document
1b3d0 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 6e size */. int n
1b3e0 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 Blob;
1b3f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
1b400 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 42 4c bytes in the BL
1b410 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f OB */. sqlite3_
1b420 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 stmt *pStmt;
1b430 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 /* Statement us
1b440 65 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 ed to insert the
1b450 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 encoding */. i
1b460 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 nt rc;
1b470 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c /* Resul
1b480 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 t code from subf
1b490 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 unctions */.. i
1b4a0 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e f( *pRC ) return
1b4b0 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 ;. pBlob = sqli
1b4c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 31 30 2a 70 te3_malloc( 10*p
1b4d0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 ->nColumn );. i
1b4e0 66 28 20 70 42 6c 6f 62 3d 3d 30 20 29 7b 0a 20 f( pBlob==0 ){.
1b4f0 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 *pRC = SQLITE
1b500 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 _NOMEM;. retu
1b510 72 6e 3b 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e rn;. }. fts3En
1b520 63 6f 64 65 49 6e 74 41 72 72 61 79 28 70 2d 3e codeIntArray(p->
1b530 6e 43 6f 6c 75 6d 6e 2c 20 61 53 7a 2c 20 70 42 nColumn, aSz, pB
1b540 6c 6f 62 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 lob, &nBlob);.
1b550 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 rc = fts3SqlStmt
1b560 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 5f (p, SQL_REPLACE_
1b570 44 4f 43 53 49 5a 45 2c 20 26 70 53 74 6d 74 2c DOCSIZE, &pStmt,
1b580 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0);. if( rc ){
1b590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
1b5a0 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 2a 70 e(pBlob);. *p
1b5b0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 RC = rc;. ret
1b5c0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 urn;. }. sqlit
1b5d0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 e3_bind_int64(pS
1b5e0 74 6d 74 2c 20 31 2c 20 70 2d 3e 69 50 72 65 76 tmt, 1, p->iPrev
1b5f0 44 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 Docid);. sqlite
1b600 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 3_bind_blob(pStm
1b610 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c t, 2, pBlob, nBl
1b620 6f 62 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 ob, sqlite3_free
1b630 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 );. sqlite3_ste
1b640 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 52 43 p(pStmt);. *pRC
1b650 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 = sqlite3_reset
1b660 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a (pStmt);.}../*.*
1b670 2a 20 52 65 63 6f 72 64 20 30 20 6f 66 20 74 68 * Record 0 of th
1b680 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 20 63 e %_stat table c
1b690 6f 6e 74 61 69 6e 73 20 61 20 62 6c 6f 62 20 63 ontains a blob c
1b6a0 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 4e 20 76 onsisting of N v
1b6b0 61 72 69 6e 74 73 2c 0a 2a 2a 20 77 68 65 72 65 arints,.** where
1b6c0 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 N is the number
1b6d0 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64 of user defined
1b6e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 columns in the
1b6f0 66 74 73 33 20 74 61 62 6c 65 20 70 6c 75 73 0a fts3 table plus.
1b700 2a 2a 20 74 77 6f 2e 20 49 66 20 6e 43 6f 6c 20 ** two. If nCol
1b710 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 is the number of
1b720 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 6f user defined co
1b730 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 76 61 6c 75 lumns, then valu
1b740 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 76 61 es of the .** va
1b750 72 69 6e 74 73 20 61 72 65 20 73 65 74 20 61 73 rints are set as
1b760 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 follows:.**.**
1b770 20 20 56 61 72 69 6e 74 20 30 3a 20 20 20 20 20 Varint 0:
1b780 20 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f Total number o
1b790 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 f rows in the ta
1b7a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 ble..**.** Var
1b7b0 69 6e 74 20 31 2e 2e 6e 43 6f 6c 3a 20 46 6f 72 int 1..nCol: For
1b7c0 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2c 20 74 68 each column, th
1b7d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f e total number o
1b7e0 66 20 74 6f 6b 65 6e 73 20 73 74 6f 72 65 64 20 f tokens stored
1b7f0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 in.**
1b800 20 20 20 20 20 20 20 20 74 68 65 20 63 6f 6c 75 the colu
1b810 6d 6e 20 66 6f 72 20 61 6c 6c 20 72 6f 77 73 20 mn for all rows
1b820 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a of the table..**
1b830 0a 2a 2a 20 20 20 56 61 72 69 6e 74 20 31 2b 6e .** Varint 1+n
1b840 43 6f 6c 3a 20 20 54 68 65 20 74 6f 74 61 6c 20 Col: The total
1b850 73 69 7a 65 2c 20 69 6e 20 62 79 74 65 73 2c 20 size, in bytes,
1b860 6f 66 20 61 6c 6c 20 74 65 78 74 20 76 61 6c 75 of all text valu
1b870 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 es in all.**
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 c
1b890 6f 6c 75 6d 6e 73 20 6f 66 20 61 6c 6c 20 72 6f olumns of all ro
1b8a0 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e ws of the table.
1b8b0 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f .**.*/.static vo
1b8c0 69 64 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 id fts3UpdateDoc
1b8d0 54 6f 74 61 6c 73 28 0a 20 20 69 6e 74 20 2a 70 Totals(. int *p
1b8e0 52 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 RC,
1b8f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
1b900 20 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a result code */.
1b910 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 Fts3Table *p,
1b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b930 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 /* Table being
1b940 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 75 33 updated */. u3
1b950 32 20 2a 61 53 7a 49 6e 73 2c 20 20 20 20 20 20 2 *aSzIns,
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1b970 20 53 69 7a 65 20 69 6e 63 72 65 61 73 65 73 20 Size increases
1b980 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 6c */. u32 *aSzDel
1b990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
1b9a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 64 65 63 /* Size dec
1b9b0 72 65 61 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 reases */. int
1b9c0 6e 43 68 6e 67 20 20 20 20 20 20 20 20 20 20 20 nChng
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 /* C
1b9e0 68 61 6e 67 65 20 69 6e 20 74 68 65 20 6e 75 6d hange in the num
1b9f0 62 65 72 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 ber of documents
1ba00 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 */.){. char *p
1ba10 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 Blob;
1ba20 20 20 2f 2a 20 53 74 6f 72 61 67 65 20 66 6f 72 /* Storage for
1ba30 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 69 6e BLOB written in
1ba40 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 20 69 to %_stat */. i
1ba50 6e 74 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 nt nBlob;
1ba60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 /* Size
1ba70 6f 66 20 42 4c 4f 42 20 77 72 69 74 74 65 6e 20 of BLOB written
1ba80 69 6e 74 6f 20 25 5f 73 74 61 74 20 2a 2f 0a 20 into %_stat */.
1ba90 20 75 33 32 20 2a 61 3b 20 20 20 20 20 20 20 20 u32 *a;
1baa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 /* Arr
1bab0 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 ay of integers t
1bac0 68 61 74 20 62 65 63 6f 6d 65 73 20 74 68 65 20 hat becomes the
1bad0 42 4c 4f 42 20 2a 2f 0a 20 20 73 71 6c 69 74 65 BLOB */. sqlite
1bae0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 3_stmt *pStmt;
1baf0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 /* Statement
1bb00 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e 64 20 for reading and
1bb10 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 writing */. int
1bb20 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 i;
1bb30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f /* Loop co
1bb40 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 unter */. int r
1bb50 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 c;
1bb60 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f /* Result co
1bb70 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 de from subfunct
1bb80 69 6f 6e 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 ions */.. const
1bb90 20 69 6e 74 20 6e 53 74 61 74 20 3d 20 70 2d 3e int nStat = p->
1bba0 6e 43 6f 6c 75 6d 6e 2b 32 3b 0a 0a 20 20 69 66 nColumn+2;.. if
1bbb0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b ( *pRC ) return;
1bbc0 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d . a = sqlite3_m
1bbd0 61 6c 6c 6f 63 28 20 28 73 69 7a 65 6f 66 28 75 alloc( (sizeof(u
1bbe0 33 32 29 2b 31 30 29 2a 6e 53 74 61 74 20 29 3b 32)+10)*nStat );
1bbf0 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 . if( a==0 ){.
1bc00 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 *pRC = SQLITE
1bc10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 _NOMEM;. retu
1bc20 72 6e 3b 0a 20 20 7d 0a 20 20 70 42 6c 6f 62 20 rn;. }. pBlob
1bc30 3d 20 28 63 68 61 72 2a 29 26 61 5b 6e 53 74 61 = (char*)&a[nSta
1bc40 74 5d 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 t];. rc = fts3S
1bc50 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 qlStmt(p, SQL_SE
1bc60 4c 45 43 54 5f 53 54 41 54 2c 20 26 70 53 74 6d LECT_STAT, &pStm
1bc70 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 t, 0);. if( rc
1bc80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 ){. sqlite3_f
1bc90 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 43 ree(a);. *pRC
1bca0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 = rc;. retur
1bcb0 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 n;. }. sqlite3
1bcc0 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c _bind_int(pStmt,
1bcd0 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f 43 1, FTS_STAT_DOC
1bce0 54 4f 54 41 4c 29 3b 0a 20 20 69 66 28 20 73 71 TOTAL);. if( sq
1bcf0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 lite3_step(pStmt
1bd00 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b )==SQLITE_ROW ){
1bd10 0a 20 20 20 20 66 74 73 33 44 65 63 6f 64 65 49 . fts3DecodeI
1bd20 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c 20 61 ntArray(nStat, a
1bd30 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 ,. sqlit
1bd40 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 e3_column_blob(p
1bd50 53 74 6d 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 Stmt, 0),.
1bd60 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d sqlite3_colum
1bd70 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 n_bytes(pStmt, 0
1bd80 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ));. }else{.
1bd90 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 memset(a, 0, si
1bda0 7a 65 6f 66 28 75 33 32 29 2a 28 6e 53 74 61 74 zeof(u32)*(nStat
1bdb0 29 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 ) );. }. rc =
1bdc0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 sqlite3_reset(pS
1bdd0 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d tmt);. if( rc!=
1bde0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
1bdf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 sqlite3_free(a)
1be00 3b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b ;. *pRC = rc;
1be10 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d . return;. }
1be20 0a 20 20 69 66 28 20 6e 43 68 6e 67 3c 30 20 26 . if( nChng<0 &
1be30 26 20 61 5b 30 5d 3c 28 75 33 32 29 28 2d 6e 43 & a[0]<(u32)(-nC
1be40 68 6e 67 29 20 29 7b 0a 20 20 20 20 61 5b 30 5d hng) ){. a[0]
1be50 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 = 0;. }else{.
1be60 20 20 20 61 5b 30 5d 20 2b 3d 20 6e 43 68 6e 67 a[0] += nChng
1be70 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b ;. }. for(i=0;
1be80 20 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 3b i<p->nColumn+1;
1be90 20 69 2b 2b 29 7b 0a 20 20 20 20 75 33 32 20 78 i++){. u32 x
1bea0 20 3d 20 61 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 = a[i+1];. i
1beb0 66 28 20 78 2b 61 53 7a 49 6e 73 5b 69 5d 20 3c f( x+aSzIns[i] <
1bec0 20 61 53 7a 44 65 6c 5b 69 5d 20 29 7b 0a 20 20 aSzDel[i] ){.
1bed0 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 20 20 7d x = 0;. }
1bee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 20 3d 20 else{. x =
1bef0 78 20 2b 20 61 53 7a 49 6e 73 5b 69 5d 20 2d 20 x + aSzIns[i] -
1bf00 61 53 7a 44 65 6c 5b 69 5d 3b 0a 20 20 20 20 7d aSzDel[i];. }
1bf10 0a 20 20 20 20 61 5b 69 2b 31 5d 20 3d 20 78 3b . a[i+1] = x;
1bf20 0a 20 20 7d 0a 20 20 66 74 73 33 45 6e 63 6f 64 . }. fts3Encod
1bf30 65 49 6e 74 41 72 72 61 79 28 6e 53 74 61 74 2c eIntArray(nStat,
1bf40 20 61 2c 20 70 42 6c 6f 62 2c 20 26 6e 42 6c 6f a, pBlob, &nBlo
1bf50 62 29 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 b);. rc = fts3S
1bf60 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 52 45 qlStmt(p, SQL_RE
1bf70 50 4c 41 43 45 5f 53 54 41 54 2c 20 26 70 53 74 PLACE_STAT, &pSt
1bf80 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 mt, 0);. if( rc
1bf90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
1bfa0 66 72 65 65 28 61 29 3b 0a 20 20 20 20 2a 70 52 free(a);. *pR
1bfb0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 C = rc;. retu
1bfc0 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 rn;. }. sqlite
1bfd0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 3_bind_int(pStmt
1bfe0 2c 20 31 2c 20 46 54 53 5f 53 54 41 54 5f 44 4f , 1, FTS_STAT_DO
1bff0 43 54 4f 54 41 4c 29 3b 0a 20 20 73 71 6c 69 74 CTOTAL);. sqlit
1c000 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 e3_bind_blob(pSt
1c010 6d 74 2c 20 32 2c 20 70 42 6c 6f 62 2c 20 6e 42 mt, 2, pBlob, nB
1c020 6c 6f 62 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 lob, SQLITE_STAT
1c030 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 IC);. sqlite3_s
1c040 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 tep(pStmt);. *p
1c050 52 43 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 RC = sqlite3_res
1c060 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c et(pStmt);. sql
1c070 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 7d 0a ite3_free(a);.}.
1c080 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 68 65 ./*.** Merge the
1c090 20 65 6e 74 69 72 65 20 64 61 74 61 62 61 73 65 entire database
1c0a0 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 so that there i
1c0b0 73 20 6f 6e 65 20 73 65 67 6d 65 6e 74 20 66 6f s one segment fo
1c0c0 72 20 65 61 63 68 20 0a 2a 2a 20 69 49 6e 64 65 r each .** iInde
1c0d0 78 2f 69 4c 61 6e 67 69 64 20 63 6f 6d 62 69 6e x/iLangid combin
1c0e0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 ation..*/.static
1c0f0 20 69 6e 74 20 66 74 73 33 44 6f 4f 70 74 69 6d int fts3DoOptim
1c100 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 ize(Fts3Table *p
1c110 2c 20 69 6e 74 20 62 52 65 74 75 72 6e 44 6f 6e , int bReturnDon
1c120 65 29 7b 0a 20 20 69 6e 74 20 62 53 65 65 6e 44 e){. int bSeenD
1c130 6f 6e 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 one = 0;. int r
1c140 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d c;. sqlite3_stm
1c150 74 20 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 t *pAllLangid =
1c160 30 3b 0a 0a 20 20 72 63 20 3d 20 66 74 73 33 53 0;.. rc = fts3S
1c170 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 qlStmt(p, SQL_SE
1c180 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 44 2c LECT_ALL_LANGID,
1c190 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 29 &pAllLangid, 0)
1c1a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 ;. if( rc==SQLI
1c1b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 TE_OK ){. int
1c1c0 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 rc2;. sqlite
1c1d0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c 6c 4c 3_bind_int(pAllL
1c1e0 61 6e 67 69 64 2c 20 31 2c 20 70 2d 3e 6e 49 6e angid, 1, p->nIn
1c1f0 64 65 78 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 dex);. while(
1c200 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 41 sqlite3_step(pA
1c210 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51 4c 49 54 llLangid)==SQLIT
1c220 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 E_ROW ){. i
1c230 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 nt i;. int
1c240 69 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 iLangid = sqlite
1c250 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 41 6c 3_column_int(pAl
1c260 6c 4c 61 6e 67 69 64 2c 20 30 29 3b 0a 20 20 20 lLangid, 0);.
1c270 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d for(i=0; rc==
1c280 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 SQLITE_OK && i<p
1c290 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 7b 0a ->nIndex; i++){.
1c2a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 rc = fts
1c2b0 33 53 65 67 6d 65 6e 74 4d 65 72 67 65 28 70 2c 3SegmentMerge(p,
1c2c0 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 46 54 53 iLangid, i, FTS
1c2d0 33 5f 53 45 47 43 55 52 53 4f 52 5f 41 4c 4c 29 3_SEGCURSOR_ALL)
1c2e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 ;. if( rc
1c2f0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b ==SQLITE_DONE ){
1c300 0a 20 20 20 20 20 20 20 20 20 20 62 53 65 65 6e . bSeen
1c310 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 Done = 1;.
1c320 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
1c330 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 OK;. }.
1c340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }. }.
1c350 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 rc2 = sqlite3_re
1c360 73 65 74 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3b set(pAllLangid);
1c370 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c . if( rc==SQL
1c380 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 ITE_OK ) rc = rc
1c390 32 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 2;. }.. sqlite
1c3a0 33 46 74 73 33 53 65 67 6d 65 6e 74 73 43 6c 6f 3Fts3SegmentsClo
1c3b0 73 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 se(p);. sqlite3
1c3c0 46 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d 73 Fts3PendingTerms
1c3d0 43 6c 65 61 72 28 70 29 3b 0a 0a 20 20 72 65 74 Clear(p);.. ret
1c3e0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f urn (rc==SQLITE_
1c3f0 4f 4b 20 26 26 20 62 52 65 74 75 72 6e 44 6f 6e OK && bReturnDon
1c400 65 20 26 26 20 62 53 65 65 6e 44 6f 6e 65 29 20 e && bSeenDone)
1c410 3f 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3a 20 ? SQLITE_DONE :
1c420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 rc;.}../*.** Thi
1c430 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 s function is ca
1c440 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 lled when the us
1c450 65 72 20 65 78 65 63 75 74 65 73 20 74 68 65 20 er executes the
1c460 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d following statem
1c470 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 ent:.**.** I
1c480 4e 53 45 52 54 20 49 4e 54 4f 20 3c 74 62 6c 3e NSERT INTO <tbl>
1c490 28 3c 74 62 6c 3e 29 20 56 41 4c 55 45 53 28 27 (<tbl>) VALUES('
1c4a0 72 65 62 75 69 6c 64 27 29 3b 0a 2a 2a 0a 2a 2a rebuild');.**.**
1c4b0 20 54 68 65 20 65 6e 74 69 72 65 20 46 54 53 20 The entire FTS
1c4c0 69 6e 64 65 78 20 69 73 20 64 69 73 63 61 72 64 index is discard
1c4d0 65 64 20 61 6e 64 20 72 65 62 75 69 6c 74 2e 20 ed and rebuilt.
1c4e0 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 If the table is
1c4f0 6f 6e 65 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 one .** created
1c500 75 73 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e using the conten
1c510 74 3d 78 78 78 20 6f 70 74 69 6f 6e 2c 20 74 68 t=xxx option, th
1c520 65 6e 20 74 68 65 20 6e 65 77 20 69 6e 64 65 78 en the new index
1c530 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 is based on.**
1c540 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 the current cont
1c550 65 6e 74 73 20 6f 66 20 74 68 65 20 78 78 78 20 ents of the xxx
1c560 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 table. Otherwise
1c570 2c 20 69 74 20 69 73 20 72 65 62 75 69 6c 74 20 , it is rebuilt
1c580 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 based.** on the
1c590 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
1c5a0 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 2e %_content table.
1c5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 .*/.static int f
1c5c0 74 73 33 44 6f 52 65 62 75 69 6c 64 28 46 74 73 ts3DoRebuild(Fts
1c5d0 33 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 3Table *p){. in
1c5e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 t rc;
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1c600 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a Return Code */.
1c610 0a 20 20 72 63 20 3d 20 66 74 73 33 44 65 6c 65 . rc = fts3Dele
1c620 74 65 41 6c 6c 28 70 2c 20 30 29 3b 0a 20 20 69 teAll(p, 0);. i
1c630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
1c640 20 29 7b 0a 20 20 20 20 75 33 32 20 2a 61 53 7a ){. u32 *aSz
1c650 20 3d 20 30 3b 0a 20 20 20 20 75 33 32 20 2a 61 = 0;. u32 *a
1c660 53 7a 49 6e 73 20 3d 20 30 3b 0a 20 20 20 20 75 SzIns = 0;. u
1c670 33 32 20 2a 61 53 7a 44 65 6c 20 3d 20 30 3b 0a 32 *aSzDel = 0;.
1c680 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 sqlite3_stmt
1c690 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 *pStmt = 0;.
1c6a0 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 30 3b int nEntry = 0;
1c6b0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 6f 73 65 .. /* Compose
1c6c0 20 61 6e 64 20 70 72 65 70 61 72 65 20 61 6e 20 and prepare an
1c6d0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f SQL statement to
1c6e0 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 loop through th
1c6f0 65 20 63 6f 6e 74 65 6e 74 20 74 61 62 6c 65 20 e content table
1c700 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 */. char *zSq
1c710 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 l = sqlite3_mpri
1c720 6e 74 66 28 22 53 45 4c 45 43 54 20 25 73 22 20 ntf("SELECT %s"
1c730 2c 20 70 2d 3e 7a 52 65 61 64 45 78 70 72 6c 69 , p->zReadExprli
1c740 73 74 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 53 st);. if( !zS
1c750 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d ql ){. rc =
1c760 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 SQLITE_NOMEM;.
1c770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1c780 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 rc = sqlite3_pre
1c790 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a pare_v2(p->db, z
1c7a0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c Sql, -1, &pStmt,
1c7b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 0);. sqlit
1c7c0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 e3_free(zSql);.
1c7d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 }.. if( rc
1c7e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 ==SQLITE_OK ){.
1c7f0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d int nByte =
1c800 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2a 20 28 sizeof(u32) * (
1c810 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 2a 33 3b p->nColumn+1)*3;
1c820 0a 20 20 20 20 20 20 61 53 7a 20 3d 20 28 75 33 . aSz = (u3
1c830 32 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 2 *)sqlite3_mall
1c840 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 oc(nByte);.
1c850 20 69 66 28 20 61 53 7a 3d 3d 30 20 29 7b 0a 20 if( aSz==0 ){.
1c860 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 rc = SQLI
1c870 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 TE_NOMEM;.
1c880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d }else{. m
1c890 65 6d 73 65 74 28 61 53 7a 2c 20 30 2c 20 6e 42 emset(aSz, 0, nB
1c8a0 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 61 53 yte);. aS
1c8b0 7a 49 6e 73 20 3d 20 26 61 53 7a 5b 70 2d 3e 6e zIns = &aSz[p->n
1c8c0 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 20 20 20 Column+1];.
1c8d0 20 20 20 61 53 7a 44 65 6c 20 3d 20 26 61 53 7a aSzDel = &aSz
1c8e0 49 6e 73 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 Ins[p->nColumn+1
1c8f0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d ];. }. }
1c900 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d .. while( rc=
1c910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 =SQLITE_OK && SQ
1c920 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 LITE_ROW==sqlite
1c930 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 3_step(pStmt) ){
1c940 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b . int iCol;
1c950 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 . int iLang
1c960 69 64 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d 53 id = langidFromS
1c970 65 6c 65 63 74 28 70 2c 20 70 53 74 6d 74 29 3b elect(p, pStmt);
1c980 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 . rc = fts3
1c990 50 65 6e 64 69 6e 67 54 65 72 6d 73 44 6f 63 69 PendingTermsDoci
1c9a0 64 28 70 2c 20 69 4c 61 6e 67 69 64 2c 20 73 71 d(p, iLangid, sq
1c9b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 lite3_column_int
1c9c0 36 34 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a 20 64(pStmt, 0));.
1c9d0 20 20 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 2c memset(aSz,
1c9e0 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 7a 5b 30 0, sizeof(aSz[0
1c9f0 5d 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e ]) * (p->nColumn
1ca00 2b 31 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 +1));. for(
1ca10 69 43 6f 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 iCol=0; rc==SQLI
1ca20 54 45 5f 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d TE_OK && iCol<p-
1ca30 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b >nColumn; iCol++
1ca40 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 ){. if( p
1ca50 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 ->abNotindexed[i
1ca60 43 6f 6c 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 Col]==0 ){.
1ca70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 const char
1ca80 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 *z = (const char
1ca90 20 2a 29 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 *) sqlite3_colu
1caa0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 mn_text(pStmt, i
1cab0 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 Col+1);.
1cac0 20 20 72 63 20 3d 20 66 74 73 33 50 65 6e 64 69 rc = fts3Pendi
1cad0 6e 67 54 65 72 6d 73 41 64 64 28 70 2c 20 69 4c ngTermsAdd(p, iL
1cae0 61 6e 67 69 64 2c 20 7a 2c 20 69 43 6f 6c 2c 20 angid, z, iCol,
1caf0 26 61 53 7a 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 &aSz[iCol]);.
1cb00 20 20 20 20 20 20 20 61 53 7a 5b 70 2d 3e 6e 43 aSz[p->nC
1cb10 6f 6c 75 6d 6e 5d 20 2b 3d 20 73 71 6c 69 74 65 olumn] += sqlite
1cb20 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 3_column_bytes(p
1cb30 53 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 Stmt, iCol+1);.
1cb40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
1cb50 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 48 . if( p->bH
1cb60 61 73 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 asDocsize ){.
1cb70 20 20 20 20 20 66 74 73 33 49 6e 73 65 72 74 44 fts3InsertD
1cb80 6f 63 73 69 7a 65 28 26 72 63 2c 20 70 2c 20 61 ocsize(&rc, p, a
1cb90 53 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 Sz);. }.
1cba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
1cbb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
1cbc0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 sqlite3_finalize
1cbd0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 (pStmt);.
1cbe0 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 pStmt = 0;.
1cbf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
1cc00 20 6e 45 6e 74 72 79 2b 2b 3b 0a 20 20 20 20 20 nEntry++;.
1cc10 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 for(iCol=0; i
1cc20 43 6f 6c 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 3b Col<=p->nColumn;
1cc30 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 iCol++){.
1cc40 20 20 20 20 61 53 7a 49 6e 73 5b 69 43 6f 6c 5d aSzIns[iCol]
1cc50 20 2b 3d 20 61 53 7a 5b 69 43 6f 6c 5d 3b 0a 20 += aSz[iCol];.
1cc60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
1cc70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 . }. if( p
1cc80 2d 3e 62 46 74 73 34 20 29 7b 0a 20 20 20 20 20 ->bFts4 ){.
1cc90 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54 6f fts3UpdateDocTo
1cca0 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53 7a tals(&rc, p, aSz
1ccb0 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 45 6e Ins, aSzDel, nEn
1ccc0 74 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 try);. }.
1ccd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 53 7a sqlite3_free(aSz
1cce0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 74 6d );.. if( pStm
1ccf0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 t ){. int r
1cd00 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e c2 = sqlite3_fin
1cd10 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 alize(pStmt);.
1cd20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
1cd30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 TE_OK ){.
1cd40 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 rc = rc2;.
1cd50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 }. }. }..
1cd60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f return rc;.}.../
1cd70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 *.** This functi
1cd80 6f 6e 20 6f 70 65 6e 73 20 61 20 63 75 72 73 6f on opens a curso
1cd90 72 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 74 r used to read t
1cda0 68 65 20 69 6e 70 75 74 20 64 61 74 61 20 66 6f he input data fo
1cdb0 72 20 61 6e 20 0a 2a 2a 20 69 6e 63 72 65 6d 65 r an .** increme
1cdc0 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 ntal merge opera
1cdd0 74 69 6f 6e 2e 20 53 70 65 63 69 66 69 63 61 6c tion. Specifical
1cde0 6c 79 2c 20 69 74 20 6f 70 65 6e 73 20 61 20 63 ly, it opens a c
1cdf0 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 0a 2a 2a ursor to scan.**
1ce00 20 74 68 65 20 6f 6c 64 65 73 74 20 6e 53 65 67 the oldest nSeg
1ce10 20 73 65 67 6d 65 6e 74 73 20 28 69 64 78 3d 30 segments (idx=0
1ce20 20 74 68 72 6f 75 67 68 20 69 64 78 3d 28 6e 53 through idx=(nS
1ce30 65 67 2d 31 29 29 20 69 6e 20 61 62 73 6f 6c 75 eg-1)) in absolu
1ce40 74 65 20 0a 2a 2a 20 6c 65 76 65 6c 20 69 41 62 te .** level iAb
1ce50 73 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 sLevel..*/.stati
1ce60 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 c int fts3Incrme
1ce70 72 67 65 43 73 72 28 0a 20 20 46 74 73 33 54 61 rgeCsr(. Fts3Ta
1ce80 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 ble *p,
1ce90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 /* FTS
1cea0 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 3 table handle *
1ceb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 /. sqlite3_int6
1cec0 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 4 iAbsLevel,
1ced0 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 /* Absolute
1cee0 6c 65 76 65 6c 20 74 6f 20 6f 70 65 6e 20 2a 2f level to open */
1cef0 0a 20 20 69 6e 74 20 6e 53 65 67 2c 20 20 20 20 . int nSeg,
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cf10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
1cf20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 segments to merg
1cf30 65 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 69 e */. Fts3Multi
1cf40 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 20 SegReader *pCsr
1cf50 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 /* Cursor
1cf60 20 6f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c object to popul
1cf70 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 ate */.){. int
1cf80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rc;
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
1cfa0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 eturn Code */.
1cfb0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 sqlite3_stmt *pS
1cfc0 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 tmt = 0;
1cfd0 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 75 73 65 /* Statement use
1cfe0 64 20 74 6f 20 72 65 61 64 20 25 5f 73 65 67 64 d to read %_segd
1cff0 69 72 20 65 6e 74 72 79 20 2a 2f 20 20 0a 20 20 ir entry */ .
1d000 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 int nByte;
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d020 2f 2a 20 42 79 74 65 73 20 61 6c 6c 6f 63 61 74 /* Bytes allocat
1d030 65 64 20 61 74 20 70 43 73 72 2d 3e 61 70 53 65 ed at pCsr->apSe
1d040 67 6d 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a gment[] */.. /*
1d050 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 Allocate space
1d060 66 6f 72 20 74 68 65 20 46 74 73 33 4d 75 6c 74 for the Fts3Mult
1d070 69 53 65 67 52 65 61 64 65 72 2e 61 43 73 72 5b iSegReader.aCsr[
1d080 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 6d 65 6d ] array */. mem
1d090 73 65 74 28 70 43 73 72 2c 20 30 2c 20 73 69 7a set(pCsr, 0, siz
1d0a0 65 6f 66 28 2a 70 43 73 72 29 29 3b 0a 20 20 6e eof(*pCsr));. n
1d0b0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 Byte = sizeof(Ft
1d0c0 73 33 53 65 67 52 65 61 64 65 72 20 2a 29 20 2a s3SegReader *) *
1d0d0 20 6e 53 65 67 3b 0a 20 20 70 43 73 72 2d 3e 61 nSeg;. pCsr->a
1d0e0 70 53 65 67 6d 65 6e 74 20 3d 20 28 46 74 73 33 pSegment = (Fts3
1d0f0 53 65 67 52 65 61 64 65 72 20 2a 2a 29 73 71 6c SegReader **)sql
1d100 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 ite3_malloc(nByt
1d110 65 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d e);.. if( pCsr-
1d120 3e 61 70 53 65 67 6d 65 6e 74 3d 3d 30 20 29 7b >apSegment==0 ){
1d130 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
1d140 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b _NOMEM;. }else{
1d150 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 43 73 72 . memset(pCsr
1d160 2d 3e 61 70 53 65 67 6d 65 6e 74 2c 20 30 2c 20 ->apSegment, 0,
1d170 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 63 20 3d nByte);. rc =
1d180 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 fts3SqlStmt(p,
1d190 53 51 4c 5f 53 45 4c 45 43 54 5f 4c 45 56 45 4c SQL_SELECT_LEVEL
1d1a0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 , &pStmt, 0);.
1d1b0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 }. if( rc==SQLI
1d1c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 TE_OK ){. int
1d1d0 20 69 3b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b i;. int rc2;
1d1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e . sqlite3_bin
1d1f0 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 d_int64(pStmt, 1
1d200 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 , iAbsLevel);.
1d210 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e assert( pCsr->
1d220 6e 53 65 67 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 nSegment==0 );.
1d230 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d for(i=0; rc==
1d240 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c SQLITE_OK && sql
1d250 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 ite3_step(pStmt)
1d260 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 ==SQLITE_ROW &&
1d270 69 3c 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 i<nSeg; i++){.
1d280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
1d290 46 74 73 33 53 65 67 52 65 61 64 65 72 4e 65 77 Fts3SegReaderNew
1d2a0 28 69 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 (i, 0,.
1d2b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
1d2c0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 31 29 2c int64(pStmt, 1),
1d2d0 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 69 /* segdi
1d2e0 72 2e 73 74 61 72 74 5f 62 6c 6f 63 6b 20 2a 2f r.start_block */
1d2f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
1d300 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 e3_column_int64(
1d310 70 53 74 6d 74 2c 20 32 29 2c 20 20 20 20 20 20 pStmt, 2),
1d320 20 20 2f 2a 20 73 65 67 64 69 72 2e 6c 65 61 76 /* segdir.leav
1d330 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a es_end_block */.
1d340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
1d350 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 3_column_int64(p
1d360 53 74 6d 74 2c 20 33 29 2c 20 20 20 20 20 20 20 Stmt, 3),
1d370 20 2f 2a 20 73 65 67 64 69 72 2e 65 6e 64 5f 62 /* segdir.end_b
1d380 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 lock */.
1d390 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e sqlite3_column
1d3a0 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 34 29 2c _blob(pStmt, 4),
1d3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 64 /* segd
1d3c0 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 ir.root */.
1d3d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c sqlite3_col
1d3e0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c umn_bytes(pStmt,
1d3f0 20 34 29 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 4), /* s
1d400 65 67 64 69 72 2e 72 6f 6f 74 20 2a 2f 0a 20 20 egdir.root */.
1d410 20 20 20 20 20 20 20 20 26 70 43 73 72 2d 3e 61 &pCsr->a
1d420 70 53 65 67 6d 65 6e 74 5b 69 5d 0a 20 20 20 20 pSegment[i].
1d430 20 20 29 3b 0a 20 20 20 20 20 20 70 43 73 72 2d );. pCsr-
1d440 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 >nSegment++;.
1d450 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c }. rc2 = sql
1d460 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 ite3_reset(pStmt
1d470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 );. if( rc==S
1d480 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 QLITE_OK ) rc =
1d490 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 rc2;. }.. retu
1d4a0 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 rn rc;.}..typede
1d4b0 66 20 73 74 72 75 63 74 20 49 6e 63 72 6d 65 72 f struct Incrmer
1d4c0 67 65 57 72 69 74 65 72 20 49 6e 63 72 6d 65 72 geWriter Incrmer
1d4d0 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 geWriter;.typede
1d4e0 66 20 73 74 72 75 63 74 20 4e 6f 64 65 57 72 69 f struct NodeWri
1d4f0 74 65 72 20 4e 6f 64 65 57 72 69 74 65 72 3b 0a ter NodeWriter;.
1d500 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 42 typedef struct B
1d510 6c 6f 62 20 42 6c 6f 62 3b 0a 74 79 70 65 64 65 lob Blob;.typede
1d520 66 20 73 74 72 75 63 74 20 4e 6f 64 65 52 65 61 f struct NodeRea
1d530 64 65 72 20 4e 6f 64 65 52 65 61 64 65 72 3b 0a der NodeReader;.
1d540 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e ./*.** An instan
1d550 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ce of the follow
1d560 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 ing structure is
1d570 20 75 73 65 64 20 61 73 20 61 20 64 79 6e 61 6d used as a dynam
1d580 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 74 6f 20 ic buffer.** to
1d590 62 75 69 6c 64 20 75 70 20 6e 6f 64 65 73 20 6f build up nodes o
1d5a0 72 20 6f 74 68 65 72 20 62 6c 6f 62 73 20 6f 66 r other blobs of
1d5b0 20 64 61 74 61 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 data in..**.**
1d5c0 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f The function blo
1d5d0 62 47 72 6f 77 42 75 66 66 65 72 28 29 20 69 73 bGrowBuffer() is
1d5e0 20 75 73 65 64 20 74 6f 20 65 78 74 65 6e 64 20 used to extend
1d5f0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a the allocation..
1d600 2a 2f 0a 73 74 72 75 63 74 20 42 6c 6f 62 20 7b */.struct Blob {
1d610 0a 20 20 63 68 61 72 20 2a 61 3b 20 20 20 20 20 . char *a;
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d630 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f /* Pointer to
1d640 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 allocation */.
1d650 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 int n;
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d670 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 /* Number of va
1d680 6c 69 64 20 62 79 74 65 73 20 6f 66 20 64 61 74 lid bytes of dat
1d690 61 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e a in a[] */. in
1d6a0 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 t nAlloc;
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1d6c0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 Allocated size
1d6d0 6f 66 20 61 5b 5d 20 28 6e 41 6c 6c 6f 63 3e 3d of a[] (nAlloc>=
1d6e0 6e 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 n) */.};../*.**
1d6f0 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 This structure i
1d700 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 s used to build
1d710 75 70 20 62 75 66 66 65 72 73 20 63 6f 6e 74 61 up buffers conta
1d720 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 20 62 2d ining segment b-
1d730 74 72 65 65 20 0a 2a 2a 20 6e 6f 64 65 73 20 28 tree .** nodes (
1d740 62 6c 6f 63 6b 73 29 2e 0a 2a 2f 0a 73 74 72 75 blocks)..*/.stru
1d750 63 74 20 4e 6f 64 65 57 72 69 74 65 72 20 7b 0a ct NodeWriter {.
1d760 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
1d770 69 42 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 iBlock;
1d780 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 6c 6f /* Current blo
1d790 63 6b 20 69 64 20 2a 2f 0a 20 20 42 6c 6f 62 20 ck id */. Blob
1d7a0 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 key;
1d7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 /* La
1d7c0 73 74 20 6b 65 79 20 77 72 69 74 74 65 6e 20 74 st key written t
1d7d0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 6c o the current bl
1d7e0 6f 63 6b 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c ock */. Blob bl
1d7f0 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 ock;
1d800 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 /* Curr
1d810 65 6e 74 20 62 6c 6f 63 6b 20 69 6d 61 67 65 20 ent block image
1d820 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 */.};../*.** An
1d830 6f 62 6a 65 63 74 20 6f 66 20 74 68 69 73 20 74 object of this t
1d840 79 70 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 ype contains the
1d850 20 73 74 61 74 65 20 72 65 71 75 69 72 65 64 20 state required
1d860 74 6f 20 63 72 65 61 74 65 20 6f 72 20 61 70 70 to create or app
1d870 65 6e 64 0a 2a 2a 20 74 6f 20 61 6e 20 61 70 70 end.** to an app
1d880 65 6e 64 61 62 6c 65 20 62 2d 74 72 65 65 20 73 endable b-tree s
1d890 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 egment..*/.struc
1d8a0 74 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 t IncrmergeWrite
1d8b0 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 65 61 66 45 r {. int nLeafE
1d8c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 st;
1d8d0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 /* Space a
1d8e0 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6c 65 61 llocated for lea
1d8f0 66 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 6e f blocks */. in
1d900 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 t nWork;
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1d920 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 Number of leaf
1d930 70 61 67 65 73 20 66 6c 75 73 68 65 64 20 2a 2f pages flushed */
1d940 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 . sqlite3_int64
1d950 20 69 41 62 73 4c 65 76 65 6c 3b 20 20 20 20 20 iAbsLevel;
1d960 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c /* Absolute l
1d970 65 76 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65 evel of input se
1d980 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 gments */. int
1d990 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 iIdx;
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
1d9b0 6e 64 65 78 20 6f 66 20 2a 6f 75 74 70 75 74 2a ndex of *output*
1d9c0 20 73 65 67 6d 65 6e 74 20 69 6e 20 69 41 62 73 segment in iAbs
1d9d0 4c 65 76 65 6c 2b 31 20 2a 2f 0a 20 20 73 71 6c Level+1 */. sql
1d9e0 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74 61 72 ite3_int64 iStar
1d9f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 t; /*
1da00 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20 Block number of
1da10 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 first allocated
1da20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 block */. sqlit
1da30 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 3b 20 20 e3_int64 iEnd;
1da40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c /* Bl
1da50 6f 63 6b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 61 ock number of la
1da60 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 6c 6f st allocated blo
1da70 63 6b 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f ck */. sqlite3_
1da80 69 6e 74 36 34 20 6e 4c 65 61 66 44 61 74 61 3b int64 nLeafData;
1da90 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 /* Bytes
1daa0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 64 61 of leaf page da
1dab0 74 61 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 4e ta so far */. N
1dac0 6f 64 65 57 72 69 74 65 72 20 61 4e 6f 64 65 57 odeWriter aNodeW
1dad0 72 69 74 65 72 5b 46 54 53 5f 4d 41 58 5f 41 50 riter[FTS_MAX_AP
1dae0 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 5d PENDABLE_HEIGHT]
1daf0 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f ;.};../*.** An o
1db00 62 6a 65 63 74 20 6f 66 20 74 68 65 20 66 6f 6c bject of the fol
1db10 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20 75 lowing type is u
1db20 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 sed to read data
1db30 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 0a 2a from a single.*
1db40 2a 20 46 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f * FTS segment no
1db50 64 65 2e 20 53 65 65 20 74 68 65 20 66 6f 6c 6c de. See the foll
1db60 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a owing functions:
1db70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 .**.** nodeR
1db80 65 61 64 65 72 49 6e 69 74 28 29 0a 2a 2a 20 20 eaderInit().**
1db90 20 20 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 nodeReaderNex
1dba0 74 28 29 0a 2a 2a 20 20 20 20 20 6e 6f 64 65 52 t().** nodeR
1dbb0 65 61 64 65 72 52 65 6c 65 61 73 65 28 29 0a 2a eaderRelease().*
1dbc0 2f 0a 73 74 72 75 63 74 20 4e 6f 64 65 52 65 61 /.struct NodeRea
1dbd0 64 65 72 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 der {. const ch
1dbe0 61 72 20 2a 61 4e 6f 64 65 3b 0a 20 20 69 6e 74 ar *aNode;. int
1dbf0 20 6e 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 69 4f nNode;. int iO
1dc00 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ff;
1dc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 /* Cur
1dc20 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 rent offset with
1dc30 69 6e 20 61 4e 6f 64 65 5b 5d 20 2a 2f 0a 0a 20 in aNode[] */..
1dc40 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 /* Output varia
1dc50 62 6c 65 73 2e 20 43 6f 6e 74 61 69 6e 69 6e 67 bles. Containing
1dc60 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 the current nod
1dc70 65 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 73 71 e entry. */. sq
1dc80 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 68 69 lite3_int64 iChi
1dc90 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a ld; /*
1dca0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68 69 6c Pointer to chil
1dcb0 64 20 6e 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 d node */. Blob
1dcc0 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 term;
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 /* C
1dce0 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 urrent term */.
1dcf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 6f const char *aDo
1dd00 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 clist;
1dd10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 /* Pointer to d
1dd20 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 oclist */. int
1dd30 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 nDoclist;
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
1dd50 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 ize of doclist i
1dd60 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f n bytes */.};../
1dd70 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 *.** If *pRc is
1dd80 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 not SQLITE_OK wh
1dd90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e en this function
1dda0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 is called, it i
1ddb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 s a no-op..** Ot
1ddc0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 herwise, if the
1ddd0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 20 70 42 allocation at pB
1dde0 6c 6f 62 2d 3e 61 20 69 73 20 6e 6f 74 20 61 6c lob->a is not al
1ddf0 72 65 61 64 79 20 61 74 20 6c 65 61 73 74 20 6e ready at least n
1de00 4d 69 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 Min.** bytes in
1de10 73 69 7a 65 2c 20 65 78 74 65 6e 64 20 28 72 65 size, extend (re
1de20 61 6c 6c 6f 63 29 20 69 74 20 74 6f 20 62 65 20 alloc) it to be
1de30 73 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 so..**.** If an
1de40 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 OOM error occurs
1de50 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20 53 51 , set *pRc to SQ
1de60 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 6c LITE_NOMEM and l
1de70 65 61 76 65 20 70 42 6c 6f 62 2d 3e 61 0a 2a 2a eave pBlob->a.**
1de80 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 4f 74 68 unmodified. Oth
1de90 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 61 erwise, if the a
1dea0 6c 6c 6f 63 61 74 69 6f 6e 20 73 75 63 63 65 65 llocation succee
1deb0 64 73 2c 20 75 70 64 61 74 65 20 70 42 6c 6f 62 ds, update pBlob
1dec0 2d 3e 6e 41 6c 6c 6f 63 0a 2a 2a 20 74 6f 20 72 ->nAlloc.** to r
1ded0 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 eflect the new s
1dee0 69 7a 65 20 6f 66 20 74 68 65 20 70 42 6c 6f 62 ize of the pBlob
1def0 2d 3e 61 5b 5d 20 62 75 66 66 65 72 2e 0a 2a 2f ->a[] buffer..*/
1df00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 6c 6f .static void blo
1df10 62 47 72 6f 77 42 75 66 66 65 72 28 42 6c 6f 62 bGrowBuffer(Blob
1df20 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 4d 69 *pBlob, int nMi
1df30 6e 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 n, int *pRc){.
1df40 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 if( *pRc==SQLITE
1df50 5f 4f 4b 20 26 26 20 6e 4d 69 6e 3e 70 42 6c 6f _OK && nMin>pBlo
1df60 62 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 b->nAlloc ){.
1df70 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 6e 4d int nAlloc = nM
1df80 69 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 61 20 in;. char *a
1df90 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 = (char *)sqlite
1dfa0 33 5f 72 65 61 6c 6c 6f 63 28 70 42 6c 6f 62 2d 3_realloc(pBlob-
1dfb0 3e 61 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 >a, nAlloc);.
1dfc0 20 69 66 28 20 61 20 29 7b 0a 20 20 20 20 20 20 if( a ){.
1dfd0 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 pBlob->nAlloc =
1dfe0 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20 70 42 nAlloc;. pB
1dff0 6c 6f 62 2d 3e 61 20 3d 20 61 3b 0a 20 20 20 20 lob->a = a;.
1e000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 }else{. *pR
1e010 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d c = SQLITE_NOMEM
1e020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f ;. }. }.}../
1e030 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 *.** Attempt to
1e040 61 64 76 61 6e 63 65 20 74 68 65 20 6e 6f 64 65 advance the node
1e050 2d 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 70 -reader object p
1e060 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 assed as the fir
1e070 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a st argument to.*
1e080 2a 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 * the next entry
1e090 20 6f 6e 20 74 68 65 20 6e 6f 64 65 2e 20 0a 2a on the node. .*
1e0a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 *.** Return an e
1e0b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 rror code if an
1e0c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 53 51 error occurs (SQ
1e0d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 70 6f LITE_NOMEM is po
1e0e0 73 73 69 62 6c 65 29 2e 20 0a 2a 2a 20 4f 74 68 ssible). .** Oth
1e0f0 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 53 51 erwise return SQ
1e100 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 LITE_OK. If ther
1e110 65 20 69 73 20 6e 6f 20 6e 65 78 74 20 65 6e 74 e is no next ent
1e120 72 79 20 6f 6e 20 74 68 65 20 6e 6f 64 65 0a 2a ry on the node.*
1e130 2a 20 28 65 2e 67 2e 20 62 65 63 61 75 73 65 20 * (e.g. because
1e140 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 the current entr
1e150 79 20 69 73 20 74 68 65 20 6c 61 73 74 29 20 73 y is the last) s
1e160 65 74 20 4e 6f 64 65 52 65 61 64 65 72 2d 3e 61 et NodeReader->a
1e170 4e 6f 64 65 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 20 Node to.** NULL
1e180 74 6f 20 69 6e 64 69 63 61 74 65 20 45 4f 46 2e to indicate EOF.
1e190 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 Otherwise, popu
1e1a0 6c 61 74 65 20 74 68 65 20 4e 6f 64 65 52 65 61 late the NodeRea
1e1b0 64 65 72 20 73 74 72 75 63 74 75 72 65 20 6f 75 der structure ou
1e1c0 74 70 75 74 20 0a 2a 2a 20 76 61 72 69 61 62 6c tput .** variabl
1e1d0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 es for the new e
1e1e0 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ntry..*/.static
1e1f0 69 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 int nodeReaderNe
1e200 78 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 xt(NodeReader *p
1e210 29 7b 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20 ){. int bFirst
1e220 3d 20 28 70 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 29 = (p->term.n==0)
1e230 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 ; /* True for
1e240 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 first term on t
1e250 68 65 20 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 he node */. int
1e260 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 20 20 20 nPrefix = 0;
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1e280 42 79 74 65 73 20 74 6f 20 63 6f 70 79 20 66 72 Bytes to copy fr
1e290 6f 6d 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d om previous term
1e2a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 */. int nSuffi
1e2b0 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 x = 0;
1e2c0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 /* Bytes t
1e2d0 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20 o append to the
1e2e0 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 prefix */. int
1e2f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 rc = SQLITE_OK;
1e300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
1e310 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 eturn code */..
1e320 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4e 6f 64 assert( p->aNod
1e330 65 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 43 e );. if( p->iC
1e340 68 69 6c 64 20 26 26 20 62 46 69 72 73 74 3d 3d hild && bFirst==
1e350 30 20 29 20 70 2d 3e 69 43 68 69 6c 64 2b 2b 3b 0 ) p->iChild++;
1e360 0a 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 3e 3d . if( p->iOff>=
1e370 70 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 20 p->nNode ){.
1e380 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20 20 70 2d /* EOF */. p-
1e390 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 65 >aNode = 0;. }e
1e3a0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 46 69 lse{. if( bFi
1e3b0 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 rst==0 ){.
1e3c0 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 33 47 p->iOff += fts3G
1e3d0 65 74 56 61 72 69 6e 74 33 32 28 26 70 2d 3e 61 etVarint32(&p->a
1e3e0 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d 2c 20 26 Node[p->iOff], &
1e3f0 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a nPrefix);. }.
1e400 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 66 p->iOff += f
1e410 74 73 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 ts3GetVarint32(&
1e420 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 p->aNode[p->iOff
1e430 5d 2c 20 26 6e 53 75 66 66 69 78 29 3b 0a 0a 20 ], &nSuffix);..
1e440 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 blobGrowBuffe
1e450 72 28 26 70 2d 3e 74 65 72 6d 2c 20 6e 50 72 65 r(&p->term, nPre
1e460 66 69 78 2b 6e 53 75 66 66 69 78 2c 20 26 72 63 fix+nSuffix, &rc
1e470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 );. if( rc==S
1e480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
1e490 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 74 65 72 memcpy(&p->ter
1e4a0 6d 2e 61 5b 6e 50 72 65 66 69 78 5d 2c 20 26 70 m.a[nPrefix], &p
1e4b0 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 5d ->aNode[p->iOff]
1e4c0 2c 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 20 20 , nSuffix);.
1e4d0 20 20 70 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 p->term.n = nP
1e4e0 72 65 66 69 78 2b 6e 53 75 66 66 69 78 3b 0a 20 refix+nSuffix;.
1e4f0 20 20 20 20 20 70 2d 3e 69 4f 66 66 20 2b 3d 20 p->iOff +=
1e500 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 20 20 69 nSuffix;. i
1e510 66 28 20 70 2d 3e 69 43 68 69 6c 64 3d 3d 30 20 f( p->iChild==0
1e520 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f ){. p->iO
1e530 66 66 20 2b 3d 20 66 74 73 33 47 65 74 56 61 72 ff += fts3GetVar
1e540 69 6e 74 33 32 28 26 70 2d 3e 61 4e 6f 64 65 5b int32(&p->aNode[
1e550 70 2d 3e 69 4f 66 66 5d 2c 20 26 70 2d 3e 6e 44 p->iOff], &p->nD
1e560 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 oclist);.
1e570 20 70 2d 3e 61 44 6f 63 6c 69 73 74 20 3d 20 26 p->aDoclist = &
1e580 70 2d 3e 61 4e 6f 64 65 5b 70 2d 3e 69 4f 66 66 p->aNode[p->iOff
1e590 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f ];. p->iO
1e5a0 66 66 20 2b 3d 20 70 2d 3e 6e 44 6f 63 6c 69 73 ff += p->nDoclis
1e5b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d t;. }. }
1e5c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 . }.. assert(
1e5d0 70 2d 3e 69 4f 66 66 3c 3d 70 2d 3e 6e 4e 6f 64 p->iOff<=p->nNod
1e5e0 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 e );.. return r
1e5f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 c;.}../*.** Rele
1e600 61 73 65 20 61 6c 6c 20 64 79 6e 61 6d 69 63 20 ase all dynamic
1e610 72 65 73 6f 75 72 63 65 73 20 68 65 6c 64 20 62 resources held b
1e620 79 20 6e 6f 64 65 2d 72 65 61 64 65 72 20 6f 62 y node-reader ob
1e630 6a 65 63 74 20 2a 70 2e 0a 2a 2f 0a 73 74 61 74 ject *p..*/.stat
1e640 69 63 20 76 6f 69 64 20 6e 6f 64 65 52 65 61 64 ic void nodeRead
1e650 65 72 52 65 6c 65 61 73 65 28 4e 6f 64 65 52 65 erRelease(NodeRe
1e660 61 64 65 72 20 2a 70 29 7b 0a 20 20 73 71 6c 69 ader *p){. sqli
1e670 74 65 33 5f 66 72 65 65 28 70 2d 3e 74 65 72 6d te3_free(p->term
1e680 2e 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e .a);.}../*.** In
1e690 69 74 69 61 6c 69 7a 65 20 61 20 6e 6f 64 65 2d itialize a node-
1e6a0 72 65 61 64 65 72 20 6f 62 6a 65 63 74 20 74 6f reader object to
1e6b0 20 72 65 61 64 20 74 68 65 20 6e 6f 64 65 20 69 read the node i
1e6c0 6e 20 62 75 66 66 65 72 20 61 4e 6f 64 65 2f 6e n buffer aNode/n
1e6d0 4e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 Node..**.** If s
1e6e0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 uccessful, SQLIT
1e6f0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 E_OK is returned
1e700 20 61 6e 64 20 74 68 65 20 4e 6f 64 65 52 65 61 and the NodeRea
1e710 64 65 72 20 6f 62 6a 65 63 74 20 73 65 74 20 74 der object set t
1e720 6f 20 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 o .** point to t
1e730 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 6f he first entry o
1e740 6e 20 74 68 65 20 6e 6f 64 65 20 28 69 66 20 61 n the node (if a
1e750 6e 79 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 ny). Otherwise,
1e760 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 an SQLite.** err
1e770 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 or code is retur
1e780 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ned..*/.static i
1e790 6e 74 20 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 nt nodeReaderIni
1e7a0 74 28 4e 6f 64 65 52 65 61 64 65 72 20 2a 70 2c t(NodeReader *p,
1e7b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f const char *aNo
1e7c0 64 65 2c 20 69 6e 74 20 6e 4e 6f 64 65 29 7b 0a de, int nNode){.
1e7d0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 memset(p, 0, s
1e7e0 69 7a 65 6f 66 28 4e 6f 64 65 52 65 61 64 65 72 izeof(NodeReader
1e7f0 29 29 3b 0a 20 20 70 2d 3e 61 4e 6f 64 65 20 3d ));. p->aNode =
1e800 20 61 4e 6f 64 65 3b 0a 20 20 70 2d 3e 6e 4e 6f aNode;. p->nNo
1e810 64 65 20 3d 20 6e 4e 6f 64 65 3b 0a 0a 20 20 2f de = nNode;.. /
1e820 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 * Figure out if
1e830 74 68 69 73 20 69 73 20 61 20 6c 65 61 66 20 6f this is a leaf o
1e840 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f r an internal no
1e850 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e de. */. if( p->
1e860 61 4e 6f 64 65 5b 30 5d 20 29 7b 0a 20 20 20 20 aNode[0] ){.
1e870 2f 2a 20 41 6e 20 69 6e 74 65 72 6e 61 6c 20 6e /* An internal n
1e880 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 ode. */. p->i
1e890 4f 66 66 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 Off = 1 + sqlite
1e8a0 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 26 3Fts3GetVarint(&
1e8b0 70 2d 3e 61 4e 6f 64 65 5b 31 5d 2c 20 26 70 2d p->aNode[1], &p-
1e8c0 3e 69 43 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73 >iChild);. }els
1e8d0 65 7b 0a 20 20 20 20 70 2d 3e 69 4f 66 66 20 3d e{. p->iOff =
1e8e0 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 1;. }.. retur
1e8f0 6e 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 n nodeReaderNext
1e900 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 (p);.}../*.** Th
1e910 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 is function is c
1e920 61 6c 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 alled while writ
1e930 69 6e 67 20 61 6e 20 46 54 53 20 73 65 67 6d 65 ing an FTS segme
1e940 6e 74 20 65 61 63 68 20 74 69 6d 65 20 61 20 6c nt each time a l
1e950 65 61 66 20 6f 0a 2a 2a 20 6e 6f 64 65 20 69 73 eaf o.** node is
1e960 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 77 72 finished and wr
1e970 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 itten to disk. T
1e980 68 65 20 6b 65 79 20 28 7a 54 65 72 6d 2f 6e 54 he key (zTerm/nT
1e990 65 72 6d 29 20 69 73 20 67 75 61 72 61 6e 74 65 erm) is guarante
1e9a0 65 64 0a 2a 2a 20 74 6f 20 62 65 20 67 72 65 61 ed.** to be grea
1e9b0 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 ter than the lar
1e9c0 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68 65 20 gest key on the
1e9d0 6e 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 node just writte
1e9e0 6e 2c 20 62 75 74 20 73 6d 61 6c 6c 65 72 0a 2a n, but smaller.*
1e9f0 2a 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 * than or equal
1ea00 74 6f 20 74 68 65 20 66 69 72 73 74 20 6b 65 79 to the first key
1ea10 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 77 72 that will be wr
1ea20 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6e 65 78 itten to the nex
1ea30 74 20 6c 65 61 66 0a 2a 2a 20 6e 6f 64 65 2e 0a t leaf.** node..
1ea40 2a 2a 0a 2a 2a 20 54 68 65 20 62 6c 6f 63 6b 20 **.** The block
1ea50 69 64 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e id of the leaf n
1ea60 6f 64 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e ode just written
1ea70 20 74 6f 20 64 69 73 6b 20 6d 61 79 20 62 65 20 to disk may be
1ea80 66 6f 75 6e 64 20 69 6e 0a 2a 2a 20 28 70 57 72 found in.** (pWr
1ea90 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 iter->aNodeWrite
1eaa0 72 5b 30 5d 2e 69 42 6c 6f 63 6b 29 20 77 68 65 r[0].iBlock) whe
1eab0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 n this function
1eac0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 is called..*/.st
1ead0 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 atic int fts3Inc
1eae0 72 6d 65 72 67 65 50 75 73 68 28 0a 20 20 46 74 rmergePush(. Ft
1eaf0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 s3Table *p,
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1eb10 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 6e 64 Fts3 table hand
1eb20 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 le */. Incrmerg
1eb30 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 eWriter *pWriter
1eb40 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 , /* Write
1eb50 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f r object */. co
1eb60 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c nst char *zTerm,
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1eb80 20 54 65 72 6d 20 74 6f 20 77 72 69 74 65 20 74 Term to write t
1eb90 6f 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 o internal node
1eba0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 20 20 */. int nTerm
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ebc0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 61 74 /* Bytes at
1ebd0 20 7a 54 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 73 zTerm */.){. s
1ebe0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 50 74 qlite3_int64 iPt
1ebf0 72 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f r = pWriter->aNo
1ec00 64 65 57 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f deWriter[0].iBlo
1ec10 63 6b 3b 0a 20 20 69 6e 74 20 69 4c 61 79 65 72 ck;. int iLayer
1ec20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 ;.. assert( nTe
1ec30 72 6d 3e 30 20 29 3b 0a 20 20 66 6f 72 28 69 4c rm>0 );. for(iL
1ec40 61 79 65 72 3d 31 3b 20 41 4c 57 41 59 53 28 69 ayer=1; ALWAYS(i
1ec50 4c 61 79 65 72 3c 46 54 53 5f 4d 41 58 5f 41 50 Layer<FTS_MAX_AP
1ec60 50 45 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 29 PENDABLE_HEIGHT)
1ec70 3b 20 69 4c 61 79 65 72 2b 2b 29 7b 0a 20 20 20 ; iLayer++){.
1ec80 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
1ec90 4e 65 78 74 50 74 72 20 3d 20 30 3b 0a 20 20 20 NextPtr = 0;.
1eca0 20 4e 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f NodeWriter *pNo
1ecb0 64 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 de = &pWriter->a
1ecc0 4e 6f 64 65 57 72 69 74 65 72 5b 69 4c 61 79 65 NodeWriter[iLaye
1ecd0 72 5d 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d r];. int rc =
1ece0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 SQLITE_OK;.
1ecf0 69 6e 74 20 6e 50 72 65 66 69 78 3b 0a 20 20 20 int nPrefix;.
1ed00 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 0a 20 20 int nSuffix;.
1ed10 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 0a 0a 20 int nSpace;..
1ed20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 /* Figure out
1ed30 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 how much space
1ed40 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 63 6f 6e the key will con
1ed50 73 75 6d 65 20 69 66 20 69 74 20 69 73 20 77 72 sume if it is wr
1ed60 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 itten to. **
1ed70 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 the current node
1ed80 20 6f 66 20 6c 61 79 65 72 20 69 4c 61 79 65 72 of layer iLayer
1ed90 2e 20 44 75 65 20 74 6f 20 74 68 65 20 70 72 65 . Due to the pre
1eda0 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 2c fix compression,
1edb0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 70 61 . ** the spa
1edc0 63 65 20 72 65 71 75 69 72 65 64 20 63 68 61 6e ce required chan
1edd0 67 65 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e ges depending on
1ede0 20 77 68 69 63 68 20 6e 6f 64 65 20 74 68 65 20 which node the
1edf0 6b 65 79 20 69 73 20 74 6f 0a 20 20 20 20 2a 2a key is to. **
1ee00 20 62 65 20 61 64 64 65 64 20 74 6f 2e 20 20 2a be added to. *
1ee10 2f 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 /. nPrefix =
1ee20 66 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 fts3PrefixCompre
1ee30 73 73 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c ss(pNode->key.a,
1ee40 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 2c 20 7a pNode->key.n, z
1ee50 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 Term, nTerm);.
1ee60 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 nSuffix = nTer
1ee70 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20 20 m - nPrefix;.
1ee80 20 6e 53 70 61 63 65 20 20 3d 20 73 71 6c 69 74 nSpace = sqlit
1ee90 65 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 e3Fts3VarintLen(
1eea0 6e 50 72 65 66 69 78 29 3b 0a 20 20 20 20 6e 53 nPrefix);. nS
1eeb0 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 pace += sqlite3F
1eec0 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 53 75 ts3VarintLen(nSu
1eed0 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 78 3b ffix) + nSuffix;
1eee0 0a 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d .. if( pNode-
1eef0 3e 6b 65 79 2e 6e 3d 3d 30 20 7c 7c 20 28 70 4e >key.n==0 || (pN
1ef00 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 2b 20 6e ode->block.n + n
1ef10 53 70 61 63 65 29 3c 3d 70 2d 3e 6e 4e 6f 64 65 Space)<=p->nNode
1ef20 53 69 7a 65 20 29 7b 20 0a 20 20 20 20 20 20 2f Size ){ . /
1ef30 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 * If the current
1ef40 20 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69 node of layer i
1ef50 4c 61 79 65 72 20 63 6f 6e 74 61 69 6e 73 20 7a Layer contains z
1ef60 65 72 6f 20 6b 65 79 73 2c 20 6f 72 20 69 66 20 ero keys, or if
1ef70 61 64 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 adding. **
1ef80 74 68 65 20 6b 65 79 20 74 6f 20 69 74 20 77 69 the key to it wi
1ef90 6c 6c 20 6e 6f 74 20 63 61 75 73 65 20 69 74 20 ll not cause it
1efa0 74 6f 20 67 72 6f 77 20 74 6f 20 6c 61 72 67 65 to grow to large
1efb0 72 20 74 68 61 6e 20 6e 4e 6f 64 65 53 69 7a 65 r than nNodeSize
1efc0 20 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 . ** bytes
1efd0 20 69 6e 20 73 69 7a 65 2c 20 77 72 69 74 65 20 in size, write
1efe0 74 68 65 20 6b 65 79 20 68 65 72 65 2e 20 20 2a the key here. *
1eff0 2f 0a 0a 20 20 20 20 20 20 42 6c 6f 62 20 2a 70 /.. Blob *p
1f000 42 6c 6b 20 3d 20 26 70 4e 6f 64 65 2d 3e 62 6c Blk = &pNode->bl
1f010 6f 63 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 ock;. if( p
1f020 42 6c 6b 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 Blk->n==0 ){.
1f030 20 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 blobGrowBuf
1f040 66 65 72 28 70 42 6c 6b 2c 20 70 2d 3e 6e 4e 6f fer(pBlk, p->nNo
1f050 64 65 53 69 7a 65 2c 20 26 72 63 29 3b 0a 20 20 deSize, &rc);.
1f060 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
1f070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
1f080 20 20 20 20 20 70 42 6c 6b 2d 3e 61 5b 30 5d 20 pBlk->a[0]
1f090 3d 20 28 63 68 61 72 29 69 4c 61 79 65 72 3b 0a = (char)iLayer;.
1f0a0 20 20 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e pBlk->
1f0b0 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 n = 1 + sqlite3F
1f0c0 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 ts3PutVarint(&pB
1f0d0 6c 6b 2d 3e 61 5b 31 5d 2c 20 69 50 74 72 29 3b lk->a[1], iPtr);
1f0e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
1f0f0 20 7d 0a 20 20 20 20 20 20 62 6c 6f 62 47 72 6f }. blobGro
1f100 77 42 75 66 66 65 72 28 70 42 6c 6b 2c 20 70 42 wBuffer(pBlk, pB
1f110 6c 6b 2d 3e 6e 20 2b 20 6e 53 70 61 63 65 2c 20 lk->n + nSpace,
1f120 26 72 63 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 &rc);. blob
1f130 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 GrowBuffer(&pNod
1f140 65 2d 3e 6b 65 79 2c 20 6e 54 65 72 6d 2c 20 26 e->key, nTerm, &
1f150 72 63 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 rc);.. if(
1f160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
1f170 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f . if( pNo
1f180 64 65 2d 3e 6b 65 79 2e 6e 20 29 7b 0a 20 20 20 de->key.n ){.
1f190 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b pBlk->n +
1f1a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 = sqlite3Fts3Put
1f1b0 56 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b Varint(&pBlk->a[
1f1c0 70 42 6c 6b 2d 3e 6e 5d 2c 20 6e 50 72 65 66 69 pBlk->n], nPrefi
1f1d0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 x);. }.
1f1e0 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 2b 3d pBlk->n +=
1f1f0 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 sqlite3Fts3PutV
1f200 61 72 69 6e 74 28 26 70 42 6c 6b 2d 3e 61 5b 70 arint(&pBlk->a[p
1f210 42 6c 6b 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 Blk->n], nSuffix
1f220 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 );. memcp
1f230 79 28 26 70 42 6c 6b 2d 3e 61 5b 70 42 6c 6b 2d y(&pBlk->a[pBlk-
1f240 3e 6e 5d 2c 20 26 7a 54 65 72 6d 5b 6e 50 72 65 >n], &zTerm[nPre
1f250 66 69 78 5d 2c 20 6e 53 75 66 66 69 78 29 3b 0a fix], nSuffix);.
1f260 20 20 20 20 20 20 20 20 70 42 6c 6b 2d 3e 6e 20 pBlk->n
1f270 2b 3d 20 6e 53 75 66 66 69 78 3b 0a 0a 20 20 20 += nSuffix;..
1f280 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 memcpy(pNod
1f290 65 2d 3e 6b 65 79 2e 61 2c 20 7a 54 65 72 6d 2c e->key.a, zTerm,
1f2a0 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 nTerm);.
1f2b0 20 70 4e 6f 64 65 2d 3e 6b 65 79 2e 6e 20 3d 20 pNode->key.n =
1f2c0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 nTerm;. }.
1f2d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1f2e0 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6c /* Otherwise, fl
1f2f0 75 73 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 ush the current
1f300 6e 6f 64 65 20 6f 66 20 6c 61 79 65 72 20 69 4c node of layer iL
1f310 61 79 65 72 20 74 6f 20 64 69 73 6b 2e 0a 20 20 ayer to disk..
1f320 20 20 20 20 2a 2a 20 54 68 65 6e 20 61 6c 6c 6f ** Then allo
1f330 63 61 74 65 20 61 20 6e 65 77 2c 20 65 6d 70 74 cate a new, empt
1f340 79 20 73 69 62 6c 69 6e 67 20 6e 6f 64 65 2e 20 y sibling node.
1f350 54 68 65 20 6b 65 79 20 77 69 6c 6c 20 62 65 20 The key will be
1f360 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 2a 2a written. **
1f370 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 into the parent
1f380 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 2e 20 2a of this node. *
1f390 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 /. rc = fts
1f3a0 33 57 72 69 74 65 53 65 67 6d 65 6e 74 28 70 2c 3WriteSegment(p,
1f3b0 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2c 20 pNode->iBlock,
1f3c0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 pNode->block.a,
1f3d0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b pNode->block.n);
1f3e0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 .. assert(
1f3f0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c pNode->block.nAl
1f400 6c 6f 63 3e 3d 70 2d 3e 6e 4e 6f 64 65 53 69 7a loc>=p->nNodeSiz
1f410 65 20 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 e );. pNode
1f420 2d 3e 62 6c 6f 63 6b 2e 61 5b 30 5d 20 3d 20 28 ->block.a[0] = (
1f430 63 68 61 72 29 69 4c 61 79 65 72 3b 0a 20 20 20 char)iLayer;.
1f440 20 20 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e pNode->block.
1f450 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 46 n = 1 + sqlite3F
1f460 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e ts3PutVarint(&pN
1f470 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 5b 31 5d 2c ode->block.a[1],
1f480 20 69 50 74 72 2b 31 29 3b 0a 0a 20 20 20 20 20 iPtr+1);..
1f490 20 69 4e 65 78 74 50 74 72 20 3d 20 70 4e 6f 64 iNextPtr = pNod
1f4a0 65 2d 3e 69 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 e->iBlock;.
1f4b0 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b 2b 2b pNode->iBlock++
1f4c0 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6b ;. pNode->k
1f4d0 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a ey.n = 0;. }.
1f4e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
1f4f0 49 54 45 5f 4f 4b 20 7c 7c 20 69 4e 65 78 74 50 ITE_OK || iNextP
1f500 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 tr==0 ) return r
1f510 63 3b 0a 20 20 20 20 69 50 74 72 20 3d 20 69 4e c;. iPtr = iN
1f520 65 78 74 50 74 72 3b 0a 20 20 7d 0a 0a 20 20 61 extPtr;. }.. a
1f530 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 72 65 ssert( 0 );. re
1f540 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
1f550 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 61 Append a term a
1f560 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 nd (optionally)
1f570 64 6f 63 6c 69 73 74 20 74 6f 20 74 68 65 20 46 doclist to the F
1f580 54 53 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 TS segment node
1f590 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 73 74 6f currently.** sto
1f5a0 72 65 64 20 69 6e 20 62 6c 6f 62 20 2a 70 4e 6f red in blob *pNo
1f5b0 64 65 2e 20 54 68 65 20 6e 6f 64 65 20 6e 65 65 de. The node nee
1f5c0 64 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e d not contain an
1f5d0 79 20 74 65 72 6d 73 2c 20 62 75 74 20 74 68 65 y terms, but the
1f5e0 0a 2a 2a 20 68 65 61 64 65 72 20 6d 75 73 74 20 .** header must
1f5f0 62 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 be written befor
1f600 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 e this function
1f610 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a is called..**.**
1f620 20 41 20 6e 6f 64 65 20 68 65 61 64 65 72 20 69 A node header i
1f630 73 20 61 20 73 69 6e 67 6c 65 20 30 78 30 30 20 s a single 0x00
1f640 62 79 74 65 20 66 6f 72 20 61 20 6c 65 61 66 20 byte for a leaf
1f650 6e 6f 64 65 2c 20 6f 72 20 61 20 68 65 69 67 68 node, or a heigh
1f660 74 20 76 61 72 69 6e 74 0a 2a 2a 20 66 6f 6c 6c t varint.** foll
1f670 6f 77 65 64 20 62 79 20 74 68 65 20 6c 65 66 74 owed by the left
1f680 2d 68 61 6e 64 2d 63 68 69 6c 64 20 76 61 72 69 -hand-child vari
1f690 6e 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 72 6e nt for an intern
1f6a0 61 6c 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 al node..**.** T
1f6b0 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 70 he term to be ap
1f6c0 70 65 6e 64 65 64 20 69 73 20 70 61 73 73 65 64 pended is passed
1f6d0 20 76 69 61 20 61 72 67 75 6d 65 6e 74 73 20 7a via arguments z
1f6e0 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 46 6f 72 20 Term/nTerm. For
1f6f0 61 20 0a 2a 2a 20 6c 65 61 66 20 6e 6f 64 65 2c a .** leaf node,
1f700 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 73 20 the doclist is
1f710 70 61 73 73 65 64 20 61 73 20 61 44 6f 63 6c 69 passed as aDocli
1f720 73 74 2f 6e 44 6f 63 6c 69 73 74 2e 20 46 6f 72 st/nDoclist. For
1f730 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 an internal.**
1f740 6e 6f 64 65 2c 20 62 6f 74 68 20 61 44 6f 63 6c node, both aDocl
1f750 69 73 74 20 61 6e 64 20 6e 44 6f 63 6c 69 73 74 ist and nDoclist
1f760 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20 must be passed
1f770 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 0..**.** If the
1f780 73 69 7a 65 20 6f 66 20 74 68 65 20 76 61 6c 75 size of the valu
1f790 65 20 69 6e 20 62 6c 6f 62 20 70 50 72 65 76 20 e in blob pPrev
1f7a0 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 is zero, then th
1f7b0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 0a is is the first.
1f7c0 2a 2a 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 ** term written
1f7d0 74 6f 20 74 68 65 20 6e 6f 64 65 2e 20 4f 74 68 to the node. Oth
1f7e0 65 72 77 69 73 65 2c 20 70 50 72 65 76 20 63 6f erwise, pPrev co
1f7f0 6e 74 61 69 6e 73 20 61 20 63 6f 70 79 20 6f 66 ntains a copy of
1f800 20 74 68 65 20 0a 2a 2a 20 70 72 65 76 69 6f 75 the .** previou
1f810 73 20 74 65 72 6d 2e 20 42 65 66 6f 72 65 20 74 s term. Before t
1f820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 his function ret
1f830 75 72 6e 73 2c 20 69 74 20 69 73 20 75 70 64 61 urns, it is upda
1f840 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 ted to contain a
1f850 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 7a 54 65 72 .** copy of zTer
1f860 6d 2f 6e 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 49 m/nTerm..**.** I
1f870 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 t is assumed tha
1f880 74 20 74 68 65 20 62 75 66 66 65 72 20 61 73 73 t the buffer ass
1f890 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 4e 6f ociated with pNo
1f8a0 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 6c 61 de is already la
1f8b0 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f rge.** enough to
1f8c0 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 accommodate the
1f8d0 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 68 65 20 new entry. The
1f8e0 62 75 66 66 65 72 20 61 73 73 6f 63 69 61 74 65 buffer associate
1f8f0 64 20 77 69 74 68 20 70 50 72 65 76 0a 2a 2a 20 d with pPrev.**
1f900 69 73 20 65 78 74 65 6e 64 65 64 20 62 79 20 74 is extended by t
1f910 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 his function if
1f920 72 65 71 75 72 69 72 65 64 2e 0a 2a 2a 0a 2a 2a requrired..**.**
1f930 20 49 66 20 61 6e 20 65 72 72 6f 72 20 28 69 2e If an error (i.
1f940 65 2e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e e. OOM condition
1f950 29 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c ) occurs, an SQL
1f960 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 ite error code i
1f970 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f s.** returned. O
1f980 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 therwise, SQLITE
1f990 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 _OK..*/.static i
1f9a0 6e 74 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e nt fts3AppendToN
1f9b0 6f 64 65 28 0a 20 20 42 6c 6f 62 20 2a 70 4e 6f ode(. Blob *pNo
1f9c0 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 de,
1f9d0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e /* Curren
1f9e0 74 20 6e 6f 64 65 20 69 6d 61 67 65 20 74 6f 20 t node image to
1f9f0 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 20 20 42 append to */. B
1fa00 6c 6f 62 20 2a 70 50 72 65 76 2c 20 20 20 20 20 lob *pPrev,
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1fa20 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e * Buffer contain
1fa30 69 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 ing previous ter
1fa40 6d 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 63 m written */. c
1fa50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d onst char *zTerm
1fa60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
1fa70 2a 20 4e 65 77 20 74 65 72 6d 20 74 6f 20 77 72 * New term to wr
1fa80 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 ite */. int nTe
1fa90 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 rm,
1faa0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
1fab0 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 of zTerm in byt
1fac0 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 es */. const ch
1fad0 61 72 20 2a 61 44 6f 63 6c 69 73 74 2c 20 20 20 ar *aDoclist,
1fae0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 /* Docli
1faf0 73 74 20 28 6f 72 20 4e 55 4c 4c 29 20 74 6f 20 st (or NULL) to
1fb00 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e write */. int n
1fb10 44 6f 63 6c 69 73 74 20 20 20 20 20 20 20 20 20 Doclist
1fb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
1fb30 7a 65 20 6f 66 20 61 44 6f 63 6c 69 73 74 20 69 ze of aDoclist i
1fb40 6e 20 62 79 74 65 73 20 2a 2f 20 0a 29 7b 0a 20 n bytes */ .){.
1fb50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
1fb60 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 _OK;
1fb70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 /* Return code
1fb80 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73 74 20 */. int bFirst
1fb90 3d 20 28 70 50 72 65 76 2d 3e 6e 3d 3d 30 29 3b = (pPrev->n==0);
1fba0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
1fbb0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 this is the firs
1fbc0 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 2a t term written *
1fbd0 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b /. int nPrefix;
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fbf0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 /* Size of t
1fc00 65 72 6d 20 70 72 65 66 69 78 20 69 6e 20 62 79 erm prefix in by
1fc10 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 tes */. int nSu
1fc20 66 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 ffix;
1fc30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
1fc40 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69 78 20 of term suffix
1fc50 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f in bytes */.. /
1fc60 2a 20 4e 6f 64 65 20 6d 75 73 74 20 68 61 76 65 * Node must have
1fc70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 already been st
1fc80 61 72 74 65 64 2e 20 54 68 65 72 65 20 6d 75 73 arted. There mus
1fc90 74 20 62 65 20 61 20 64 6f 63 6c 69 73 74 20 66 t be a doclist f
1fca0 6f 72 20 61 0a 20 20 2a 2a 20 6c 65 61 66 20 6e or a. ** leaf n
1fcb0 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 6d ode, and there m
1fcc0 75 73 74 20 6e 6f 74 20 62 65 20 61 20 64 6f 63 ust not be a doc
1fcd0 6c 69 73 74 20 66 6f 72 20 61 6e 20 69 6e 74 65 list for an inte
1fce0 72 6e 61 6c 20 6e 6f 64 65 2e 20 20 2a 2f 0a 20 rnal node. */.
1fcf0 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e assert( pNode->
1fd00 6e 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 n>0 );. assert(
1fd10 20 28 70 4e 6f 64 65 2d 3e 61 5b 30 5d 3d 3d 27 (pNode->a[0]=='
1fd20 5c 30 27 29 3d 3d 28 61 44 6f 63 6c 69 73 74 21 \0')==(aDoclist!
1fd30 3d 30 29 20 29 3b 0a 0a 20 20 62 6c 6f 62 47 72 =0) );.. blobGr
1fd40 6f 77 42 75 66 66 65 72 28 70 50 72 65 76 2c 20 owBuffer(pPrev,
1fd50 6e 54 65 72 6d 2c 20 26 72 63 29 3b 0a 20 20 69 nTerm, &rc);. i
1fd60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
1fd70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 ) return rc;..
1fd80 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 33 50 nPrefix = fts3P
1fd90 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 refixCompress(pP
1fda0 72 65 76 2d 3e 61 2c 20 70 50 72 65 76 2d 3e 6e rev->a, pPrev->n
1fdb0 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b , zTerm, nTerm);
1fdc0 0a 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 . nSuffix = nTe
1fdd0 72 6d 20 2d 20 6e 50 72 65 66 69 78 3b 0a 20 20 rm - nPrefix;.
1fde0 6d 65 6d 63 70 79 28 70 50 72 65 76 2d 3e 61 2c memcpy(pPrev->a,
1fdf0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a zTerm, nTerm);.
1fe00 20 20 70 50 72 65 76 2d 3e 6e 20 3d 20 6e 54 65 pPrev->n = nTe
1fe10 72 6d 3b 0a 0a 20 20 69 66 28 20 62 46 69 72 73 rm;.. if( bFirs
1fe20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 6f 64 t==0 ){. pNod
1fe30 65 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 e->n += sqlite3F
1fe40 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 4e ts3PutVarint(&pN
1fe50 6f 64 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d ode->a[pNode->n]
1fe60 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a , nPrefix);. }.
1fe70 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 73 71 pNode->n += sq
1fe80 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 69 lite3Fts3PutVari
1fe90 6e 74 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 4e 6f nt(&pNode->a[pNo
1fea0 64 65 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 29 de->n], nSuffix)
1feb0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 4e 6f 64 ;. memcpy(&pNod
1fec0 65 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 e->a[pNode->n],
1fed0 26 7a 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 2c &zTerm[nPrefix],
1fee0 20 6e 53 75 66 66 69 78 29 3b 0a 20 20 70 4e 6f nSuffix);. pNo
1fef0 64 65 2d 3e 6e 20 2b 3d 20 6e 53 75 66 66 69 78 de->n += nSuffix
1ff00 3b 0a 0a 20 20 69 66 28 20 61 44 6f 63 6c 69 73 ;.. if( aDoclis
1ff10 74 20 29 7b 0a 20 20 20 20 70 4e 6f 64 65 2d 3e t ){. pNode->
1ff20 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 n += sqlite3Fts3
1ff30 50 75 74 56 61 72 69 6e 74 28 26 70 4e 6f 64 65 PutVarint(&pNode
1ff40 2d 3e 61 5b 70 4e 6f 64 65 2d 3e 6e 5d 2c 20 6e ->a[pNode->n], n
1ff50 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 6d 65 Doclist);. me
1ff60 6d 63 70 79 28 26 70 4e 6f 64 65 2d 3e 61 5b 70 mcpy(&pNode->a[p
1ff70 4e 6f 64 65 2d 3e 6e 5d 2c 20 61 44 6f 63 6c 69 Node->n], aDocli
1ff80 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 st, nDoclist);.
1ff90 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 2b 3d 20 6e pNode->n += n
1ffa0 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 Doclist;. }..
1ffb0 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e assert( pNode->n
1ffc0 3c 3d 70 4e 6f 64 65 2d 3e 6e 41 6c 6c 6f 63 20 <=pNode->nAlloc
1ffd0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c );.. return SQL
1ffe0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ITE_OK;.}../*.**
1fff0 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72 Append the curr
20000 65 6e 74 20 74 65 72 6d 20 61 6e 64 20 64 6f 63 ent term and doc
20010 6c 69 73 74 20 70 6f 69 6e 74 65 64 20 74 6f 20 list pointed to
20020 62 79 20 63 75 72 73 6f 72 20 70 43 73 72 20 74 by cursor pCsr t
20030 6f 20 74 68 65 0a 2a 2a 20 61 70 70 65 6e 64 61 o the.** appenda
20040 62 6c 65 20 62 2d 74 72 65 65 20 73 65 67 6d 65 ble b-tree segme
20050 6e 74 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 nt opened for wr
20060 69 74 69 6e 67 20 62 79 20 70 57 72 69 74 65 72 iting by pWriter
20070 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 ..**.** Return S
20080 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 QLITE_OK if succ
20090 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 essful, or an SQ
200a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 Lite error code
200b0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 otherwise..*/.st
200c0 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 atic int fts3Inc
200d0 72 6d 65 72 67 65 41 70 70 65 6e 64 28 0a 20 20 rmergeAppend(.
200e0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 Fts3Table *p,
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20100 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 61 /* Fts3 table ha
20110 6e 64 6c 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 ndle */. Incrme
20120 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 69 74 rgeWriter *pWrit
20130 65 72 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 er, /* Wri
20140 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 ter object */.
20150 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 Fts3MultiSegRead
20160 65 72 20 2a 70 43 73 72 20 20 20 20 20 20 20 20 er *pCsr
20170 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 61 69 /* Cursor contai
20180 6e 69 6e 67 20 74 65 72 6d 20 61 6e 64 20 64 6f ning term and do
20190 63 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 63 6f clist */.){. co
201a0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 nst char *zTerm
201b0 3d 20 70 43 73 72 2d 3e 7a 54 65 72 6d 3b 0a 20 = pCsr->zTerm;.
201c0 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 43 73 int nTerm = pCs
201d0 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 63 6f 6e 73 r->nTerm;. cons
201e0 74 20 63 68 61 72 20 2a 61 44 6f 63 6c 69 73 74 t char *aDoclist
201f0 20 3d 20 70 43 73 72 2d 3e 61 44 6f 63 6c 69 73 = pCsr->aDoclis
20200 74 3b 0a 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 t;. int nDoclis
20210 74 20 3d 20 70 43 73 72 2d 3e 6e 44 6f 63 6c 69 t = pCsr->nDocli
20220 73 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 st;. int rc = S
20230 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 QLITE_OK;
20240 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f /* Return co
20250 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 de */. int nSpa
20260 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ce;
20270 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 /* Total s
20280 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65 pace in bytes re
20290 71 75 69 72 65 64 20 6f 6e 20 6c 65 61 66 20 2a quired on leaf *
202a0 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b /. int nPrefix;
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
202c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 72 65 /* Size of pre
202d0 66 69 78 20 73 68 61 72 65 64 20 77 69 74 68 20 fix shared with
202e0 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f previous term */
202f0 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 . int nSuffix;
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20310 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 75 66 66 /* Size of suff
20320 69 78 20 28 6e 54 65 72 6d 20 2d 20 6e 50 72 65 ix (nTerm - nPre
20330 66 69 78 29 20 2a 2f 0a 20 20 4e 6f 64 65 57 72 fix) */. NodeWr
20340 69 74 65 72 20 2a 70 4c 65 61 66 3b 20 20 20 20 iter *pLeaf;
20350 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 /* Objec
20360 74 20 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 t used to write
20370 6c 65 61 66 20 6e 6f 64 65 73 20 2a 2f 0a 0a 20 leaf nodes */..
20380 20 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 pLeaf = &pWrite
20390 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 30 r->aNodeWriter[0
203a0 5d 3b 0a 20 20 6e 50 72 65 66 69 78 20 3d 20 66 ];. nPrefix = f
203b0 74 73 33 50 72 65 66 69 78 43 6f 6d 70 72 65 73 ts3PrefixCompres
203c0 73 28 70 4c 65 61 66 2d 3e 6b 65 79 2e 61 2c 20 s(pLeaf->key.a,
203d0 70 4c 65 61 66 2d 3e 6b 65 79 2e 6e 2c 20 7a 54 pLeaf->key.n, zT
203e0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 6e erm, nTerm);. n
203f0 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d Suffix = nTerm -
20400 20 6e 50 72 65 66 69 78 3b 0a 0a 20 20 6e 53 70 nPrefix;.. nSp
20410 61 63 65 20 20 3d 20 73 71 6c 69 74 65 33 46 74 ace = sqlite3Ft
20420 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 50 72 65 s3VarintLen(nPre
20430 66 69 78 29 3b 0a 20 20 6e 53 70 61 63 65 20 2b fix);. nSpace +
20440 3d 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 = sqlite3Fts3Var
20450 69 6e 74 4c 65 6e 28 6e 53 75 66 66 69 78 29 20 intLen(nSuffix)
20460 2b 20 6e 53 75 66 66 69 78 3b 0a 20 20 6e 53 70 + nSuffix;. nSp
20470 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 ace += sqlite3Ft
20480 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 44 6f 63 s3VarintLen(nDoc
20490 6c 69 73 74 29 20 2b 20 6e 44 6f 63 6c 69 73 74 list) + nDoclist
204a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 ;.. /* If the c
204b0 75 72 72 65 6e 74 20 62 6c 6f 63 6b 20 69 73 20 urrent block is
204c0 6e 6f 74 20 65 6d 70 74 79 2c 20 61 6e 64 20 69 not empty, and i
204d0 66 20 61 64 64 69 6e 67 20 74 68 69 73 20 74 65 f adding this te
204e0 72 6d 2f 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 rm/doclist. **
204f0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 62 to the current b
20500 6c 6f 63 6b 20 77 6f 75 6c 64 20 6d 61 6b 65 20 lock would make
20510 69 74 20 6c 61 72 67 65 72 20 74 68 61 6e 20 46 it larger than F
20520 74 73 33 54 61 62 6c 65 2e 6e 4e 6f 64 65 53 69 ts3Table.nNodeSi
20530 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c 20 77 ze. ** bytes, w
20540 72 69 74 65 20 74 68 69 73 20 62 6c 6f 63 6b 20 rite this block
20550 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 out to the datab
20560 61 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4c ase. */. if( pL
20570 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 26 eaf->block.n>0 &
20580 26 20 28 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e & (pLeaf->block.
20590 6e 20 2b 20 6e 53 70 61 63 65 29 3e 70 2d 3e 6e n + nSpace)>p->n
205a0 4e 6f 64 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 NodeSize ){.
205b0 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 rc = fts3WriteSe
205c0 67 6d 65 6e 74 28 70 2c 20 70 4c 65 61 66 2d 3e gment(p, pLeaf->
205d0 69 42 6c 6f 63 6b 2c 20 70 4c 65 61 66 2d 3e 62 iBlock, pLeaf->b
205e0 6c 6f 63 6b 2e 61 2c 20 70 4c 65 61 66 2d 3e 62 lock.a, pLeaf->b
205f0 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 70 57 72 lock.n);. pWr
20600 69 74 65 72 2d 3e 6e 57 6f 72 6b 2b 2b 3b 0a 0a iter->nWork++;..
20610 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 63 /* Add the c
20620 75 72 72 65 6e 74 20 74 65 72 6d 20 74 6f 20 74 urrent term to t
20630 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 he parent node.
20640 54 68 65 20 74 65 72 6d 20 61 64 64 65 64 20 74 The term added t
20650 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 o the . ** pa
20660 72 65 6e 74 20 6d 75 73 74 3a 0a 20 20 20 20 2a rent must:. *
20670 2a 0a 20 20 20 20 2a 2a 20 20 20 61 29 20 62 65 *. ** a) be
20680 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 greater than th
20690 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 6f e largest term o
206a0 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 n the leaf node
206b0 6a 75 73 74 20 77 72 69 74 74 65 6e 0a 20 20 20 just written.
206c0 20 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 ** to the
206d0 64 61 74 61 62 61 73 65 20 28 73 74 69 6c 6c 20 database (still
206e0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 4c 65 available in pLe
206f0 61 66 2d 3e 6b 65 79 29 2c 20 61 6e 64 0a 20 20 af->key), and.
20700 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 62 29 **. ** b)
20710 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 be less than or
20720 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 65 equal to the te
20730 72 6d 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61 rm about to be a
20740 64 64 65 64 20 74 6f 20 74 68 65 20 6e 65 77 0a dded to the new.
20750 20 20 20 20 2a 2a 20 20 20 20 20 20 6c 65 61 66 ** leaf
20760 20 6e 6f 64 65 20 28 7a 54 65 72 6d 2f 6e 54 65 node (zTerm/nTe
20770 72 6d 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 rm).. **.
20780 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 ** In other word
20790 73 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 s, it must be th
207a0 65 20 70 72 65 66 69 78 20 6f 66 20 7a 54 65 72 e prefix of zTer
207b0 6d 20 31 20 62 79 74 65 20 6c 6f 6e 67 65 72 20 m 1 byte longer
207c0 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 than. ** the
207d0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 28 69 common prefix (i
207e0 66 20 61 6e 79 29 20 6f 66 20 7a 54 65 72 6d 20 f any) of zTerm
207f0 61 6e 64 20 70 57 72 69 74 65 72 2d 3e 7a 54 65 and pWriter->zTe
20800 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 rm.. */. i
20810 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
20820 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 ){. rc = f
20830 74 73 33 49 6e 63 72 6d 65 72 67 65 50 75 73 68 ts3IncrmergePush
20840 28 70 2c 20 70 57 72 69 74 65 72 2c 20 7a 54 65 (p, pWriter, zTe
20850 72 6d 2c 20 6e 50 72 65 66 69 78 2b 31 29 3b 0a rm, nPrefix+1);.
20860 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 }.. /* Ad
20870 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 vance to the nex
20880 74 20 6f 75 74 70 75 74 20 62 6c 6f 63 6b 20 2a t output block *
20890 2f 0a 20 20 20 20 70 4c 65 61 66 2d 3e 69 42 6c /. pLeaf->iBl
208a0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66 ock++;. pLeaf
208b0 2d 3e 6b 65 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 ->key.n = 0;.
208c0 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 pLeaf->block.n
208d0 3d 20 30 3b 0a 0a 20 20 20 20 6e 53 75 66 66 69 = 0;.. nSuffi
208e0 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 6e x = nTerm;. n
208f0 53 70 61 63 65 20 20 3d 20 31 3b 0a 20 20 20 20 Space = 1;.
20900 6e 53 70 61 63 65 20 2b 3d 20 73 71 6c 69 74 65 nSpace += sqlite
20910 33 46 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 6e 3Fts3VarintLen(n
20920 53 75 66 66 69 78 29 20 2b 20 6e 53 75 66 66 69 Suffix) + nSuffi
20930 78 3b 0a 20 20 20 20 6e 53 70 61 63 65 20 2b 3d x;. nSpace +=
20940 20 73 71 6c 69 74 65 33 46 74 73 33 56 61 72 69 sqlite3Fts3Vari
20950 6e 74 4c 65 6e 28 6e 44 6f 63 6c 69 73 74 29 20 ntLen(nDoclist)
20960 2b 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a + nDoclist;. }.
20970 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 . pWriter->nLea
20980 66 44 61 74 61 20 2b 3d 20 6e 53 70 61 63 65 3b fData += nSpace;
20990 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 . blobGrowBuffe
209a0 72 28 26 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2c r(&pLeaf->block,
209b0 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 20 pLeaf->block.n
209c0 2b 20 6e 53 70 61 63 65 2c 20 26 72 63 29 3b 0a + nSpace, &rc);.
209d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
209e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 _OK ){. if( p
209f0 4c 65 61 66 2d 3e 62 6c 6f 63 6b 2e 6e 3d 3d 30 Leaf->block.n==0
20a00 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 2d ){. pLeaf-
20a10 3e 62 6c 6f 63 6b 2e 6e 20 3d 20 31 3b 0a 20 20 >block.n = 1;.
20a20 20 20 20 20 70 4c 65 61 66 2d 3e 62 6c 6f 63 6b pLeaf->block
20a30 2e 61 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 .a[0] = '\0';.
20a40 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 74 73 }. rc = fts
20a50 33 41 70 70 65 6e 64 54 6f 4e 6f 64 65 28 0a 20 3AppendToNode(.
20a60 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 62 &pLeaf->b
20a70 6c 6f 63 6b 2c 20 26 70 4c 65 61 66 2d 3e 6b 65 lock, &pLeaf->ke
20a80 79 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c y, zTerm, nTerm,
20a90 20 61 44 6f 63 6c 69 73 74 2c 20 6e 44 6f 63 6c aDoclist, nDocl
20aa0 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a ist. );. }..
20ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
20ac0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 /*.** This funct
20ad0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f ion is called to
20ae0 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 64 79 6e release all dyn
20af0 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 20 68 amic resources h
20b00 65 6c 64 20 62 79 20 74 68 65 0a 2a 2a 20 6d 65 eld by the.** me
20b10 72 67 65 2d 77 72 69 74 65 72 20 6f 62 6a 65 63 rge-writer objec
20b20 74 20 70 57 72 69 74 65 72 2c 20 61 6e 64 20 69 t pWriter, and i
20b30 66 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f f no error has o
20b40 63 63 75 72 72 65 64 2c 20 74 6f 20 66 6c 75 73 ccurred, to flus
20b50 68 0a 2a 2a 20 61 6c 6c 20 6f 75 74 73 74 61 6e h.** all outstan
20b60 64 69 6e 67 20 6e 6f 64 65 20 62 75 66 66 65 72 ding node buffer
20b70 73 20 68 65 6c 64 20 62 79 20 70 57 72 69 74 65 s held by pWrite
20b80 72 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a r to disk..**.**
20b90 20 49 66 20 2a 70 52 63 20 69 73 20 6e 6f 74 20 If *pRc is not
20ba0 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 SQLITE_OK when t
20bb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
20bc0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 6e 6f 20 called, then no
20bd0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 attempt.** is ma
20be0 64 65 20 74 6f 20 77 72 69 74 65 20 61 6e 79 20 de to write any
20bf0 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 20 49 6e data to disk. In
20c00 73 74 65 61 64 2c 20 74 68 69 73 20 66 75 6e 63 stead, this func
20c10 74 69 6f 6e 20 73 65 72 76 65 73 20 6f 6e 6c 79 tion serves only
20c20 0a 2a 2a 20 74 6f 20 72 65 6c 65 61 73 65 20 6f .** to release o
20c30 75 74 73 74 61 6e 64 69 6e 67 20 72 65 73 6f 75 utstanding resou
20c40 72 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 rces..**.** Othe
20c50 72 77 69 73 65 2c 20 69 66 20 2a 70 52 63 20 69 rwise, if *pRc i
20c60 73 20 69 6e 69 74 69 61 6c 6c 79 20 53 51 4c 49 s initially SQLI
20c70 54 45 5f 4f 4b 20 61 6e 64 20 61 6e 20 65 72 72 TE_OK and an err
20c80 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a or occurs while.
20c90 2a 2a 20 66 6c 75 73 68 69 6e 67 20 62 75 66 66 ** flushing buff
20ca0 65 72 73 20 74 6f 20 64 69 73 6b 2c 20 2a 70 52 ers to disk, *pR
20cb0 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 53 c is set to an S
20cc0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 QLite error code
20cd0 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 before.** retur
20ce0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ning..*/.static
20cf0 76 6f 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72 void fts3Incrmer
20d00 67 65 52 65 6c 65 61 73 65 28 0a 20 20 46 74 73 geRelease(. Fts
20d10 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 3Table *p,
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
20d30 46 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c FTS3 table handl
20d40 65 20 2a 2f 0a 20 20 49 6e 63 72 6d 65 72 67 65 e */. Incrmerge
20d50 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c Writer *pWriter,
20d60 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 2d /* Merge-
20d70 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f writer object */
20d80 0a 20 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 . int *pRc
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20da0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 /* IN/OUT: Er
20db0 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 ror code */.){.
20dc0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 int i;
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20de0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 /* Used to iter
20df0 61 74 65 20 74 68 72 6f 75 67 68 20 6e 6f 6e 2d ate through non-
20e00 72 6f 6f 74 20 6c 61 79 65 72 73 20 2a 2f 0a 20 root layers */.
20e10 20 69 6e 74 20 69 52 6f 6f 74 3b 20 20 20 20 20 int iRoot;
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20e30 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 6f 6f /* Index of roo
20e40 74 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 4e t in pWriter->aN
20e50 6f 64 65 57 72 69 74 65 72 20 2a 2f 0a 20 20 4e odeWriter */. N
20e60 6f 64 65 57 72 69 74 65 72 20 2a 70 52 6f 6f 74 odeWriter *pRoot
20e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f ; /
20e80 2a 20 4e 6f 64 65 57 72 69 74 65 72 20 66 6f 72 * NodeWriter for
20e90 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 root node */.
20ea0 69 6e 74 20 72 63 20 3d 20 2a 70 52 63 3b 20 20 int rc = *pRc;
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20ec0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f /* Error code */
20ed0 0a 0a 20 20 2f 2a 20 53 65 74 20 69 52 6f 6f 74 .. /* Set iRoot
20ee0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 69 6e to the index in
20ef0 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 pWriter->aNodeW
20f00 72 69 74 65 72 5b 5d 20 6f 66 20 74 68 65 20 6f riter[] of the o
20f10 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 0a 20 utput segment .
20f20 20 2a 2a 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 49 ** root node. I
20f30 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 66 69 f the segment fi
20f40 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 61 ts entirely on a
20f50 20 73 69 6e 67 6c 65 20 6c 65 61 66 20 6e 6f 64 single leaf nod
20f60 65 2c 20 69 52 6f 6f 74 0a 20 20 2a 2a 20 77 69 e, iRoot. ** wi
20f70 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 30 2e 20 ll be set to 0.
20f80 49 66 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 If the root node
20f90 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f is the parent o
20fa0 66 20 74 68 65 20 6c 65 61 76 65 73 2c 20 69 52 f the leaves, iR
20fb0 6f 6f 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 oot. ** will be
20fc0 20 31 2e 20 41 6e 64 20 73 6f 20 6f 6e 2e 20 20 1. And so on.
20fd0 2a 2f 0a 20 20 66 6f 72 28 69 52 6f 6f 74 3d 46 */. for(iRoot=F
20fe0 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c TS_MAX_APPENDABL
20ff0 45 5f 48 45 49 47 48 54 2d 31 3b 20 69 52 6f 6f E_HEIGHT-1; iRoo
21000 74 3e 3d 30 3b 20 69 52 6f 6f 74 2d 2d 29 7b 0a t>=0; iRoot--){.
21010 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a NodeWriter *
21020 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 pNode = &pWriter
21030 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 52 ->aNodeWriter[iR
21040 6f 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 4e oot];. if( pN
21050 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 3e 30 20 29 ode->block.n>0 )
21060 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 break;. asse
21070 72 74 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64 rt( *pRc || pNod
21080 65 2d 3e 62 6c 6f 63 6b 2e 6e 41 6c 6c 6f 63 3d e->block.nAlloc=
21090 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 =0 );. assert
210a0 28 20 2a 70 52 63 20 7c 7c 20 70 4e 6f 64 65 2d ( *pRc || pNode-
210b0 3e 6b 65 79 2e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 >key.nAlloc==0 )
210c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
210d0 65 65 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e ee(pNode->block.
210e0 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f a);. sqlite3_
210f0 66 72 65 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e free(pNode->key.
21100 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6d a);. }.. /* Em
21110 70 74 79 20 6f 75 74 70 75 74 20 73 65 67 6d 65 pty output segme
21120 6e 74 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f nt. This is a no
21130 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 69 52 -op. */. if( iR
21140 6f 6f 74 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a oot<0 ) return;.
21150 0a 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 . /* The entire
21160 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 output segment
21170 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 fits on a single
21180 20 6e 6f 64 65 2e 20 4e 6f 72 6d 61 6c 6c 79 2c node. Normally,
21190 20 74 68 69 73 20 6d 65 61 6e 73 0a 20 20 2a 2a this means. **
211a0 20 74 68 65 20 6e 6f 64 65 20 77 6f 75 6c 64 20 the node would
211b0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 62 be stored as a b
211c0 6c 6f 62 20 69 6e 20 74 68 65 20 22 72 6f 6f 74 lob in the "root
211d0 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 " column of the
211e0 25 5f 73 65 67 64 69 72 0a 20 20 2a 2a 20 74 61 %_segdir. ** ta
211f0 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 ble. However, th
21200 69 73 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 is is not permit
21210 74 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 ted in this case
21220 2e 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 . The problem is
21230 20 74 68 61 74 20 0a 20 20 2a 2a 20 73 70 61 63 that . ** spac
21240 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 e has already be
21250 65 6e 20 72 65 73 65 72 76 65 64 20 69 6e 20 74 en reserved in t
21260 68 65 20 25 5f 73 65 67 6d 65 6e 74 73 20 74 61 he %_segments ta
21270 62 6c 65 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 ble, and so the
21280 0a 20 20 2a 2a 20 73 74 61 72 74 5f 62 6c 6f 63 . ** start_bloc
21290 6b 20 61 6e 64 20 65 6e 64 5f 62 6c 6f 63 6b 20 k and end_block
212a0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 25 5f fields of the %_
212b0 73 65 67 64 69 72 20 74 61 62 6c 65 20 6d 75 73 segdir table mus
212c0 74 20 62 65 20 70 6f 70 75 6c 61 74 65 64 2e 20 t be populated.
212d0 0a 20 20 2a 2a 20 41 6e 64 2c 20 62 79 20 64 65 . ** And, by de
212e0 73 69 67 6e 20 6f 72 20 62 79 20 61 63 63 69 64 sign or by accid
212f0 65 6e 74 2c 20 72 65 6c 65 61 73 65 64 20 76 65 ent, released ve
21300 72 73 69 6f 6e 73 20 6f 66 20 46 54 53 20 63 61 rsions of FTS ca
21310 6e 6e 6f 74 20 68 61 6e 64 6c 65 20 0a 20 20 2a nnot handle . *
21320 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 * segments that
21330 66 69 74 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 fit entirely on
21340 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 77 69 the root node wi
21350 74 68 20 73 74 61 72 74 5f 62 6c 6f 63 6b 21 3d th start_block!=
21360 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 73 0.. **. ** Ins
21370 74 65 61 64 2c 20 63 72 65 61 74 65 20 61 20 73 tead, create a s
21380 79 6e 74 68 65 74 69 63 20 72 6f 6f 74 20 6e 6f ynthetic root no
21390 64 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 de that contains
213a0 20 6e 6f 74 68 69 6e 67 20 62 75 74 20 61 20 0a nothing but a .
213b0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 ** pointer to
213c0 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6e 74 65 the single conte
213d0 6e 74 20 6e 6f 64 65 2e 20 53 6f 20 74 68 61 74 nt node. So that
213e0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 63 6f 6e the segment con
213f0 73 69 73 74 73 20 6f 66 20 61 0a 20 20 2a 2a 20 sists of a. **
21400 73 69 6e 67 6c 65 20 6c 65 61 66 20 61 6e 64 20 single leaf and
21410 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 69 6f a single interio
21420 72 20 28 72 6f 6f 74 29 20 6e 6f 64 65 2e 0a 20 r (root) node..
21430 20 2a 2a 0a 20 20 2a 2a 20 54 6f 64 6f 3a 20 42 **. ** Todo: B
21440 65 74 74 65 72 20 6d 69 67 68 74 20 62 65 20 74 etter might be t
21450 6f 20 64 65 66 65 72 20 61 6c 6c 6f 63 61 74 69 o defer allocati
21460 6e 67 20 73 70 61 63 65 20 69 6e 20 74 68 65 20 ng space in the
21470 25 5f 73 65 67 6d 65 6e 74 73 20 0a 20 20 2a 2a %_segments . **
21480 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 77 65 20 table until we
21490 61 72 65 20 73 75 72 65 20 69 74 20 69 73 20 6e are sure it is n
214a0 65 65 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 eeded.. */. if
214b0 28 20 69 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 ( iRoot==0 ){.
214c0 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 63 6b 20 3d Blob *pBlock =
214d0 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 &pWriter->aNode
214e0 57 72 69 74 65 72 5b 31 5d 2e 62 6c 6f 63 6b 3b Writer[1].block;
214f0 0a 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 . blobGrowBuf
21500 66 65 72 28 70 42 6c 6f 63 6b 2c 20 31 20 2b 20 fer(pBlock, 1 +
21510 46 54 53 33 5f 56 41 52 49 4e 54 5f 4d 41 58 2c FTS3_VARINT_MAX,
21520 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 &rc);. if( r
21530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
21540 20 20 20 20 20 20 70 42 6c 6f 63 6b 2d 3e 61 5b pBlock->a[
21550 30 5d 20 3d 20 30 78 30 31 3b 0a 20 20 20 20 20 0] = 0x01;.
21560 20 70 42 6c 6f 63 6b 2d 3e 6e 20 3d 20 31 20 2b pBlock->n = 1 +
21570 20 73 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 sqlite3Fts3PutV
21580 61 72 69 6e 74 28 0a 20 20 20 20 20 20 20 20 20 arint(.
21590 20 26 70 42 6c 6f 63 6b 2d 3e 61 5b 31 5d 2c 20 &pBlock->a[1],
215a0 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 pWriter->aNodeWr
215b0 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 0a 20 iter[0].iBlock.
215c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 );. }.
215d0 20 20 69 52 6f 6f 74 20 3d 20 31 3b 0a 20 20 7d iRoot = 1;. }
215e0 0a 20 20 70 52 6f 6f 74 20 3d 20 26 70 57 72 69 . pRoot = &pWri
215f0 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 ter->aNodeWriter
21600 5b 69 52 6f 6f 74 5d 3b 0a 0a 20 20 2f 2a 20 46 [iRoot];.. /* F
21610 6c 75 73 68 20 61 6c 6c 20 63 75 72 72 65 6e 74 lush all current
21620 6c 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6e ly outstanding n
21630 6f 64 65 73 20 74 6f 20 64 69 73 6b 2e 20 2a 2f odes to disk. */
21640 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 69 52 . for(i=0; i<iR
21650 6f 6f 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4e oot; i++){. N
21660 6f 64 65 57 72 69 74 65 72 20 2a 70 4e 6f 64 65 odeWriter *pNode
21670 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 4e 6f = &pWriter->aNo
21680 64 65 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 deWriter[i];.
21690 20 69 66 28 20 70 4e 6f 64 65 2d 3e 62 6c 6f 63 if( pNode->bloc
216a0 6b 2e 6e 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c k.n>0 && rc==SQL
216b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
216c0 72 63 20 3d 20 66 74 73 33 57 72 69 74 65 53 65 rc = fts3WriteSe
216d0 67 6d 65 6e 74 28 70 2c 20 70 4e 6f 64 65 2d 3e gment(p, pNode->
216e0 69 42 6c 6f 63 6b 2c 20 70 4e 6f 64 65 2d 3e 62 iBlock, pNode->b
216f0 6c 6f 63 6b 2e 61 2c 20 70 4e 6f 64 65 2d 3e 62 lock.a, pNode->b
21700 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 lock.n);. }.
21710 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
21720 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 29 3b pNode->block.a);
21730 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 . sqlite3_fre
21740 65 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 29 3b e(pNode->key.a);
21750 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 . }.. /* Write
21760 20 74 68 65 20 25 5f 73 65 67 64 69 72 20 72 65 the %_segdir re
21770 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 cord. */. if( r
21780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
21790 20 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 rc = fts3Wri
217a0 74 65 53 65 67 64 69 72 28 70 2c 20 0a 20 20 20 teSegdir(p, .
217b0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 41 pWriter->iA
217c0 62 73 4c 65 76 65 6c 2b 31 2c 20 20 20 20 20 20 bsLevel+1,
217d0 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 65 76 65 /* leve
217e0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 57 72 l */. pWr
217f0 69 74 65 72 2d 3e 69 49 64 78 2c 20 20 20 20 20 iter->iIdx,
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21810 20 2f 2a 20 69 64 78 20 2a 2f 0a 20 20 20 20 20 /* idx */.
21820 20 20 20 70 57 72 69 74 65 72 2d 3e 69 53 74 61 pWriter->iSta
21830 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 rt,
21840 20 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74 5f /* start_
21850 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 block */.
21860 20 70 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 pWriter->aNodeW
21870 72 69 74 65 72 5b 30 5d 2e 69 42 6c 6f 63 6b 2c riter[0].iBlock,
21880 20 20 20 20 20 2f 2a 20 6c 65 61 76 65 73 5f 65 /* leaves_e
21890 6e 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 nd_block */.
218a0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e pWriter->iEn
218b0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 d,
218c0 20 20 20 20 20 20 20 20 2f 2a 20 65 6e 64 5f 62 /* end_b
218d0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 lock */.
218e0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 pWriter->nLeafDa
218f0 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ta,
21900 20 20 20 20 2f 2a 20 65 6e 64 5f 62 6c 6f 63 6b /* end_block
21910 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52 6f 6f */. pRoo
21920 74 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 52 6f 6f t->block.a, pRoo
21930 74 2d 3e 62 6c 6f 63 6b 2e 6e 20 20 20 20 20 20 t->block.n
21940 2f 2a 20 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 29 /* root */. )
21950 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f ;. }. sqlite3_
21960 66 72 65 65 28 70 52 6f 6f 74 2d 3e 62 6c 6f 63 free(pRoot->bloc
21970 6b 2e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f k.a);. sqlite3_
21980 66 72 65 65 28 70 52 6f 6f 74 2d 3e 6b 65 79 2e free(pRoot->key.
21990 61 29 3b 0a 0a 20 20 2a 70 52 63 20 3d 20 72 63 a);.. *pRc = rc
219a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 ;.}../*.** Compa
219b0 72 65 20 74 68 65 20 74 65 72 6d 20 69 6e 20 62 re the term in b
219c0 75 66 66 65 72 20 7a 4c 68 73 20 28 73 69 7a 65 uffer zLhs (size
219d0 20 69 6e 20 62 79 74 65 73 20 6e 4c 68 73 29 20 in bytes nLhs)
219e0 77 69 74 68 20 74 68 61 74 20 69 6e 0a 2a 2a 20 with that in.**
219f0 7a 52 68 73 20 28 73 69 7a 65 20 69 6e 20 62 79 zRhs (size in by
21a00 74 65 73 20 6e 52 68 73 29 20 75 73 69 6e 67 20 tes nRhs) using
21a10 6d 65 6d 63 6d 70 2e 20 49 66 20 6f 6e 65 20 74 memcmp. If one t
21a20 65 72 6d 20 69 73 20 61 20 70 72 65 66 69 78 20 erm is a prefix
21a30 6f 66 0a 2a 2a 20 74 68 65 20 6f 74 68 65 72 2c of.** the other,
21a40 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 it is considere
21a50 64 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65 72 20 d to be smaller
21a60 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 0a than the other..
21a70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 **.** Return -ve
21a80 20 69 66 20 7a 4c 68 73 20 69 73 20 73 6d 61 6c if zLhs is smal
21a90 6c 65 72 20 74 68 61 6e 20 7a 52 68 73 2c 20 30 ler than zRhs, 0
21aa0 20 69 66 20 69 74 20 69 73 20 65 71 75 61 6c 2c if it is equal,
21ab0 20 6f 72 20 2b 76 65 0a 2a 2a 20 69 66 20 69 74 or +ve.** if it
21ac0 20 69 73 20 67 72 65 61 74 65 72 2e 0a 2a 2f 0a is greater..*/.
21ad0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 static int fts3T
21ae0 65 72 6d 43 6d 70 28 0a 20 20 63 6f 6e 73 74 20 ermCmp(. const
21af0 63 68 61 72 20 2a 7a 4c 68 73 2c 20 69 6e 74 20 char *zLhs, int
21b00 6e 4c 68 73 2c 20 20 20 20 20 2f 2a 20 4c 48 53 nLhs, /* LHS
21b10 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a of comparison *
21b20 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
21b30 7a 52 68 73 2c 20 69 6e 74 20 6e 52 68 73 20 20 zRhs, int nRhs
21b40 20 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 63 6f /* RHS of co
21b50 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 mparison */.){.
21b60 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 int nCmp = MIN(
21b70 6e 4c 68 73 2c 20 6e 52 68 73 29 3b 0a 20 20 69 nLhs, nRhs);. i
21b80 6e 74 20 72 65 73 3b 0a 0a 20 20 72 65 73 20 3d nt res;.. res =
21b90 20 6d 65 6d 63 6d 70 28 7a 4c 68 73 2c 20 7a 52 memcmp(zLhs, zR
21ba0 68 73 2c 20 6e 43 6d 70 29 3b 0a 20 20 69 66 28 hs, nCmp);. if(
21bb0 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 res==0 ) res =
21bc0 6e 4c 68 73 20 2d 20 6e 52 68 73 3b 0a 0a 20 20 nLhs - nRhs;..
21bd0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 0a return res;.}...
21be0 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 /*.** Query to s
21bf0 65 65 20 69 66 20 74 68 65 20 65 6e 74 72 79 20 ee if the entry
21c00 69 6e 20 74 68 65 20 25 5f 73 65 67 6d 65 6e 74 in the %_segment
21c10 73 20 74 61 62 6c 65 20 77 69 74 68 20 62 6c 6f s table with blo
21c20 63 6b 69 64 20 69 45 6e 64 20 69 73 20 0a 2a 2a ckid iEnd is .**
21c30 20 4e 55 4c 4c 2e 20 49 66 20 6e 6f 20 65 72 72 NULL. If no err
21c40 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 or occurs and th
21c50 65 20 65 6e 74 72 79 20 69 73 20 4e 55 4c 4c 2c e entry is NULL,
21c60 20 73 65 74 20 2a 70 62 52 65 73 20 31 20 62 65 set *pbRes 1 be
21c70 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e fore.** returnin
21c80 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 g. Otherwise, se
21c90 74 20 2a 70 62 52 65 73 20 74 6f 20 30 2e 20 0a t *pbRes to 0. .
21ca0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 61 6e 20 **.** Or, if an
21cb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 error occurs whi
21cc0 6c 65 20 71 75 65 72 79 69 6e 67 20 74 68 65 20 le querying the
21cd0 64 61 74 61 62 61 73 65 2c 20 72 65 74 75 72 6e database, return
21ce0 20 61 6e 20 53 51 4c 69 74 65 20 0a 2a 2a 20 65 an SQLite .** e
21cf0 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 rror code. The f
21d00 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 inal value of *p
21d10 62 52 65 73 20 69 73 20 75 6e 64 65 66 69 6e 65 bRes is undefine
21d20 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a d in this case..
21d30 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 **.** This is us
21d40 65 64 20 74 6f 20 74 65 73 74 20 69 66 20 61 20 ed to test if a
21d50 73 65 67 6d 65 6e 74 20 69 73 20 61 6e 20 22 61 segment is an "a
21d60 70 70 65 6e 64 61 62 6c 65 22 20 73 65 67 6d 65 ppendable" segme
21d70 6e 74 2e 20 49 66 20 69 74 0a 2a 2a 20 69 73 2c nt. If it.** is,
21d80 20 74 68 65 6e 20 61 20 4e 55 4c 4c 20 65 6e 74 then a NULL ent
21d90 72 79 20 68 61 73 20 62 65 65 6e 20 69 6e 73 65 ry has been inse
21da0 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 25 5f rted into the %_
21db0 73 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 0a 2a segments table.*
21dc0 2a 20 77 69 74 68 20 62 6c 6f 63 6b 69 64 20 25 * with blockid %
21dd0 5f 73 65 67 64 69 72 2e 65 6e 64 5f 62 6c 6f 63 _segdir.end_bloc
21de0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 k..*/.static int
21df0 20 66 74 73 33 49 73 41 70 70 65 6e 64 61 62 6c fts3IsAppendabl
21e00 65 28 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 e(Fts3Table *p,
21e10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45 sqlite3_int64 iE
21e20 6e 64 2c 20 69 6e 74 20 2a 70 62 52 65 73 29 7b nd, int *pbRes){
21e30 0a 20 20 69 6e 74 20 62 52 65 73 20 3d 20 30 3b . int bRes = 0;
21e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21e50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 74 6f 20 /* Result to
21e60 73 65 74 20 2a 70 62 52 65 73 20 74 6f 20 2a 2f set *pbRes to */
21e70 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 . sqlite3_stmt
21e80 2a 70 43 68 65 63 6b 20 3d 20 30 3b 20 20 20 20 *pCheck = 0;
21e90 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 /* Statement
21ea0 74 6f 20 71 75 65 72 79 20 64 61 74 61 62 61 73 to query databas
21eb0 65 20 77 69 74 68 20 2a 2f 0a 20 20 69 6e 74 20 e with */. int
21ec0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rc;
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
21ee0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 eturn code */..
21ef0 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d rc = fts3SqlStm
21f00 74 28 70 2c 20 53 51 4c 5f 53 45 47 4d 45 4e 54 t(p, SQL_SEGMENT
21f10 5f 49 53 5f 41 50 50 45 4e 44 41 42 4c 45 2c 20 _IS_APPENDABLE,
21f20 26 70 43 68 65 63 6b 2c 20 30 29 3b 0a 20 20 69 &pCheck, 0);. i
21f30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
21f40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
21f50 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 65 63 bind_int64(pChec
21f60 6b 2c 20 31 2c 20 69 45 6e 64 29 3b 0a 20 20 20 k, 1, iEnd);.
21f70 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d if( SQLITE_ROW=
21f80 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 =sqlite3_step(pC
21f90 68 65 63 6b 29 20 29 20 62 52 65 73 20 3d 20 31 heck) ) bRes = 1
21fa0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 ;. rc = sqlit
21fb0 65 33 5f 72 65 73 65 74 28 70 43 68 65 63 6b 29 e3_reset(pCheck)
21fc0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2a 70 62 52 65 ;. }. . *pbRe
21fd0 73 20 3d 20 62 52 65 73 3b 0a 20 20 72 65 74 75 s = bRes;. retu
21fe0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 rn rc;.}../*.**
21ff0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
22000 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 69 called when ini
22010 74 69 61 6c 69 7a 69 6e 67 20 61 6e 20 69 6e 63 tializing an inc
22020 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f remental-merge o
22030 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 peration..** It
22040 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 65 78 checks if the ex
22050 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 20 77 isting segment w
22060 69 74 68 20 69 6e 64 65 78 20 76 61 6c 75 65 20 ith index value
22070 69 49 64 78 20 61 74 20 61 62 73 6f 6c 75 74 65 iIdx at absolute
22080 20 6c 65 76 65 6c 20 0a 2a 2a 20 28 69 41 62 73 level .** (iAbs
22090 4c 65 76 65 6c 2b 31 29 20 63 61 6e 20 62 65 20 Level+1) can be
220a0 61 70 70 65 6e 64 65 64 20 74 6f 20 62 79 20 74 appended to by t
220b0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d he incremental m
220c0 65 72 67 65 2e 20 49 66 20 69 74 20 63 61 6e 2c erge. If it can,
220d0 20 74 68 65 0a 2a 2a 20 6d 65 72 67 65 2d 77 72 the.** merge-wr
220e0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 70 57 72 iter object *pWr
220f0 69 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 iter is initiali
22100 7a 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 zed to write to
22110 69 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69 it..**.** An exi
22120 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 20 63 61 sting segment ca
22130 6e 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f n be appended to
22140 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 by an increment
22150 61 6c 20 6d 65 72 67 65 20 69 66 3a 0a 2a 2a 0a al merge if:.**.
22160 2a 2a 20 20 20 2a 20 49 74 20 77 61 73 20 69 6e ** * It was in
22170 69 74 69 61 6c 6c 79 20 63 72 65 61 74 65 64 20 itially created
22180 61 73 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 as an appendable
22190 20 73 65 67 6d 65 6e 74 20 28 77 69 74 68 20 61 segment (with a
221a0 6c 6c 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 20 ll required.**
221b0 20 20 20 73 70 61 63 65 20 70 72 65 2d 61 6c 6c space pre-all
221c0 6f 63 61 74 65 64 29 2c 20 61 6e 64 0a 2a 2a 0a ocated), and.**.
221d0 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 ** * The first
221e0 20 6b 65 79 20 72 65 61 64 20 66 72 6f 6d 20 74 key read from t
221f0 68 65 20 69 6e 70 75 74 20 28 61 72 67 75 6d 65 he input (argume
22200 6e 74 73 20 7a 4b 65 79 20 61 6e 64 20 6e 4b 65 nts zKey and nKe
22210 79 29 20 69 73 20 0a 2a 2a 20 20 20 20 20 67 72 y) is .** gr
22220 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c eater than the l
22230 61 72 67 65 73 74 20 6b 65 79 20 63 75 72 72 65 argest key curre
22240 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 74 ntly stored in t
22250 68 65 20 70 6f 74 65 6e 74 69 61 6c 0a 2a 2a 20 he potential.**
22260 20 20 20 20 6f 75 74 70 75 74 20 73 65 67 6d 65 output segme
22270 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e nt..*/.static in
22280 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 4c t fts3IncrmergeL
22290 6f 61 64 28 0a 20 20 46 74 73 33 54 61 62 6c 65 oad(. Fts3Table
222a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *p,
222b0 20 20 20 20 20 20 20 2f 2a 20 46 74 73 33 20 74 /* Fts3 t
222c0 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 able handle */.
222d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 sqlite3_int64 i
222e0 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 AbsLevel,
222f0 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 76 /* Absolute lev
22300 65 6c 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d el of input segm
22310 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 49 ents */. int iI
22320 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 dx,
22330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 /* Ind
22340 65 78 20 6f 66 20 63 61 6e 64 69 64 61 74 65 20 ex of candidate
22350 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a output segment *
22360 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
22370 7a 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 zKey,
22380 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6b 65 79 /* First key
22390 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 to write */. i
223a0 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 nt nKey,
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
223c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
223d0 73 20 69 6e 20 6e 4b 65 79 20 2a 2f 0a 20 20 49 s in nKey */. I
223e0 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 20 2a ncrmergeWriter *
223f0 70 57 72 69 74 65 72 20 20 20 20 20 20 20 20 2f pWriter /
22400 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 * Populate this
22410 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 object */.){. i
22420 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 nt rc;
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
22440 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f * Return code */
22450 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 . sqlite3_stmt
22460 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b 20 20 20 *pSelect = 0;
22470 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 74 6f 20 /* SELECT to
22480 72 65 61 64 20 25 5f 73 65 67 64 69 72 20 65 6e read %_segdir en
22490 74 72 79 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 try */.. rc = f
224a0 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 ts3SqlStmt(p, SQ
224b0 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 52 2c L_SELECT_SEGDIR,
224c0 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 &pSelect, 0);.
224d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
224e0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 OK ){. sqlite
224f0 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 20 3d 3_int64 iStart =
22500 20 30 3b 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 0; /* Value
22510 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 73 74 61 of %_segdir.sta
22520 72 74 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 rt_block */.
22530 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4c sqlite3_int64 iL
22540 65 61 66 45 6e 64 20 3d 20 30 3b 20 20 20 2f 2a eafEnd = 0; /*
22550 20 56 61 6c 75 65 20 6f 66 20 25 5f 73 65 67 64 Value of %_segd
22560 69 72 2e 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c ir.leaves_end_bl
22570 6f 63 6b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 ock */. sqlit
22580 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20 e3_int64 iEnd =
22590 30 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 0; /* Valu
225a0 65 20 6f 66 20 25 5f 73 65 67 64 69 72 2e 65 6e e of %_segdir.en
225b0 64 5f 62 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 63 d_block */. c
225c0 6f 6e 73 74 20 63 68 61 72 20 2a 61 52 6f 6f 74 onst char *aRoot
225d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 = 0; /*
225e0 50 6f 69 6e 74 65 72 20 74 6f 20 25 5f 73 65 67 Pointer to %_seg
225f0 64 69 72 2e 72 6f 6f 74 20 62 75 66 66 65 72 20 dir.root buffer
22600 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 6f 6f 74 */. int nRoot
22610 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
22620 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
22630 61 52 6f 6f 74 5b 5d 20 69 6e 20 62 79 74 65 73 aRoot[] in bytes
22640 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 32 3b */. int rc2;
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22660 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 /* Return
22670 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 code from sqlite
22680 33 5f 72 65 73 65 74 28 29 20 2a 2f 0a 20 20 20 3_reset() */.
22690 20 69 6e 74 20 62 41 70 70 65 6e 64 61 62 6c 65 int bAppendable
226a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f = 0; /
226b0 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 * Set to true if
226c0 20 73 65 67 6d 65 6e 74 20 69 73 20 61 70 70 65 segment is appe
226d0 6e 64 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f ndable */.. /
226e0 2a 20 52 65 61 64 20 74 68 65 20 25 5f 73 65 67 * Read the %_seg
226f0 64 69 72 20 65 6e 74 72 79 20 66 6f 72 20 69 6e dir entry for in
22700 64 65 78 20 69 49 64 78 20 61 62 73 6f 6c 75 74 dex iIdx absolut
22710 65 20 6c 65 76 65 6c 20 28 69 41 62 73 4c 65 76 e level (iAbsLev
22720 65 6c 2b 31 29 20 2a 2f 0a 20 20 20 20 73 71 6c el+1) */. sql
22730 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 ite3_bind_int64(
22740 70 53 65 6c 65 63 74 2c 20 31 2c 20 69 41 62 73 pSelect, 1, iAbs
22750 4c 65 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 Level+1);. sq
22760 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 lite3_bind_int(p
22770 53 65 6c 65 63 74 2c 20 32 2c 20 69 49 64 78 29 Select, 2, iIdx)
22780 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 ;. if( sqlite
22790 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 3d 3_step(pSelect)=
227a0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 =SQLITE_ROW ){.
227b0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 iStart = sq
227c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 lite3_column_int
227d0 36 34 28 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 64(pSelect, 1);.
227e0 20 20 20 20 20 20 69 4c 65 61 66 45 6e 64 20 3d iLeafEnd =
227f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
22800 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20 32 int64(pSelect, 2
22810 29 3b 0a 20 20 20 20 20 20 66 74 73 33 52 65 61 );. fts3Rea
22820 64 45 6e 64 42 6c 6f 63 6b 46 69 65 6c 64 28 70 dEndBlockField(p
22830 53 65 6c 65 63 74 2c 20 33 2c 20 26 69 45 6e 64 Select, 3, &iEnd
22840 2c 20 26 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 , &pWriter->nLea
22850 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 fData);. if
22860 28 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 ( pWriter->nLeaf
22870 44 61 74 61 3c 30 20 29 7b 0a 20 20 20 20 20 20 Data<0 ){.
22880 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 pWriter->nLeaf
22890 44 61 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e Data = pWriter->
228a0 6e 4c 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a nLeafData * -1;.
228b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 }. nR
228c0 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f oot = sqlite3_co
228d0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 65 6c 65 lumn_bytes(pSele
228e0 63 74 2c 20 34 29 3b 0a 20 20 20 20 20 20 61 52 ct, 4);. aR
228f0 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f oot = sqlite3_co
22900 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 65 6c 65 63 lumn_blob(pSelec
22910 74 2c 20 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 t, 4);. }else
22920 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 {. return s
22930 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 qlite3_reset(pSe
22940 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 lect);. }..
22950 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 /* Check for t
22960 68 65 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 6d he zero-length m
22970 61 72 6b 65 72 20 69 6e 20 74 68 65 20 25 5f 73 arker in the %_s
22980 65 67 6d 65 6e 74 73 20 74 61 62 6c 65 20 2a 2f egments table */
22990 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 49 73 . rc = fts3Is
229a0 41 70 70 65 6e 64 61 62 6c 65 28 70 2c 20 69 45 Appendable(p, iE
229b0 6e 64 2c 20 26 62 41 70 70 65 6e 64 61 62 6c 65 nd, &bAppendable
229c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b );.. /* Check
229d0 20 74 68 61 74 20 7a 4b 65 79 2f 6e 4b 65 79 20 that zKey/nKey
229e0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 is larger than t
229f0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 74 he largest key t
22a00 68 65 20 63 61 6e 64 69 64 61 74 65 20 2a 2f 0a he candidate */.
22a10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
22a20 54 45 5f 4f 4b 20 26 26 20 62 41 70 70 65 6e 64 TE_OK && bAppend
22a30 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 63 68 able ){. ch
22a40 61 72 20 2a 61 4c 65 61 66 20 3d 20 30 3b 0a 20 ar *aLeaf = 0;.
22a50 20 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 20 3d int nLeaf =
22a60 20 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 0;.. rc =
22a70 73 71 6c 69 74 65 33 46 74 73 33 52 65 61 64 42 sqlite3Fts3ReadB
22a80 6c 6f 63 6b 28 70 2c 20 69 4c 65 61 66 45 6e 64 lock(p, iLeafEnd
22a90 2c 20 26 61 4c 65 61 66 2c 20 26 6e 4c 65 61 66 , &aLeaf, &nLeaf
22aa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 , 0);. if(
22ab0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
22ac0 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52 65 61 . NodeRea
22ad0 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20 20 20 der reader;.
22ae0 20 20 20 20 66 6f 72 28 72 63 20 3d 20 6e 6f 64 for(rc = nod
22af0 65 52 65 61 64 65 72 49 6e 69 74 28 26 72 65 61 eReaderInit(&rea
22b00 64 65 72 2c 20 61 4c 65 61 66 2c 20 6e 4c 65 61 der, aLeaf, nLea
22b10 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 f);.
22b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
22b30 20 72 65 61 64 65 72 2e 61 4e 6f 64 65 3b 0a 20 reader.aNode;.
22b40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 rc =
22b50 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 74 28 26 nodeReaderNext(&
22b60 72 65 61 64 65 72 29 0a 20 20 20 20 20 20 20 20 reader).
22b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 ){. ass
22b80 65 72 74 28 20 72 65 61 64 65 72 2e 61 4e 6f 64 ert( reader.aNod
22b90 65 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 e );. }.
22ba0 20 20 20 20 20 20 20 69 66 28 20 66 74 73 33 54 if( fts3T
22bb0 65 72 6d 43 6d 70 28 7a 4b 65 79 2c 20 6e 4b 65 ermCmp(zKey, nKe
22bc0 79 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 y, reader.term.a
22bd0 2c 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29 , reader.term.n)
22be0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 <=0 ){.
22bf0 20 62 41 70 70 65 6e 64 61 62 6c 65 20 3d 20 30 bAppendable = 0
22c00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
22c10 20 20 20 20 6e 6f 64 65 52 65 61 64 65 72 52 65 nodeReaderRe
22c20 6c 65 61 73 65 28 26 72 65 61 64 65 72 29 3b 0a lease(&reader);.
22c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 }. sq
22c40 6c 69 74 65 33 5f 66 72 65 65 28 61 4c 65 61 66 lite3_free(aLeaf
22c50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 );. }.. if
22c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
22c70 26 26 20 62 41 70 70 65 6e 64 61 62 6c 65 20 29 && bAppendable )
22c80 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 {. /* It is
22c90 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 70 70 possible to app
22ca0 65 6e 64 20 74 6f 20 74 68 69 73 20 73 65 67 6d end to this segm
22cb0 65 6e 74 2e 20 53 65 74 20 75 70 20 74 68 65 20 ent. Set up the
22cc0 49 6e 63 72 6d 65 72 67 65 57 72 69 74 65 72 0a IncrmergeWriter.
22cd0 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 20 ** object
22ce0 74 6f 20 64 6f 20 73 6f 2e 20 20 2a 2f 0a 20 20 to do so. */.
22cf0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 int i;.
22d00 20 69 6e 74 20 6e 48 65 69 67 68 74 20 3d 20 28 int nHeight = (
22d10 69 6e 74 29 61 52 6f 6f 74 5b 30 5d 3b 0a 20 20 int)aRoot[0];.
22d20 20 20 20 20 4e 6f 64 65 57 72 69 74 65 72 20 2a NodeWriter *
22d30 70 4e 6f 64 65 3b 0a 0a 20 20 20 20 20 20 70 57 pNode;.. pW
22d40 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 riter->nLeafEst
22d50 3d 20 28 69 6e 74 29 28 28 69 45 6e 64 20 2d 20 = (int)((iEnd -
22d60 69 53 74 61 72 74 29 20 2b 20 31 29 2f 46 54 53 iStart) + 1)/FTS
22d70 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 4c 45 5f _MAX_APPENDABLE_
22d80 48 45 49 47 48 54 3b 0a 20 20 20 20 20 20 70 57 HEIGHT;. pW
22d90 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 riter->iStart =
22da0 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 57 iStart;. pW
22db0 72 69 74 65 72 2d 3e 69 45 6e 64 20 3d 20 69 45 riter->iEnd = iE
22dc0 6e 64 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 nd;. pWrite
22dd0 72 2d 3e 69 41 62 73 4c 65 76 65 6c 20 3d 20 69 r->iAbsLevel = i
22de0 41 62 73 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 AbsLevel;.
22df0 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 pWriter->iIdx =
22e00 69 49 64 78 3b 0a 0a 20 20 20 20 20 20 66 6f 72 iIdx;.. for
22e10 28 69 3d 6e 48 65 69 67 68 74 2b 31 3b 20 69 3c (i=nHeight+1; i<
22e20 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 FTS_MAX_APPENDAB
22e30 4c 45 5f 48 45 49 47 48 54 3b 20 69 2b 2b 29 7b LE_HEIGHT; i++){
22e40 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 . pWriter
22e50 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d ->aNodeWriter[i]
22e60 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 .iBlock = pWrite
22e70 72 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57 r->iStart + i*pW
22e80 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b riter->nLeafEst;
22e90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 . }..
22ea0 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 74 65 72 pNode = &pWriter
22eb0 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 6e 48 ->aNodeWriter[nH
22ec0 65 69 67 68 74 5d 3b 0a 20 20 20 20 20 20 70 4e eight];. pN
22ed0 6f 64 65 2d 3e 69 42 6c 6f 63 6b 20 3d 20 70 57 ode->iBlock = pW
22ee0 72 69 74 65 72 2d 3e 69 53 74 61 72 74 20 2b 20 riter->iStart +
22ef0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 pWriter->nLeafEs
22f00 74 2a 6e 48 65 69 67 68 74 3b 0a 20 20 20 20 20 t*nHeight;.
22f10 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 blobGrowBuffer(
22f20 26 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2c 20 4d &pNode->block, M
22f30 41 58 28 6e 52 6f 6f 74 2c 20 70 2d 3e 6e 4e 6f AX(nRoot, p->nNo
22f40 64 65 53 69 7a 65 29 2c 20 26 72 63 29 3b 0a 20 deSize), &rc);.
22f50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
22f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
22f70 20 20 6d 65 6d 63 70 79 28 70 4e 6f 64 65 2d 3e memcpy(pNode->
22f80 62 6c 6f 63 6b 2e 61 2c 20 61 52 6f 6f 74 2c 20 block.a, aRoot,
22f90 6e 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 nRoot);.
22fa0 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d pNode->block.n =
22fb0 20 6e 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 0a nRoot;. }.
22fc0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6e 48 65 . for(i=nHe
22fd0 69 67 68 74 3b 20 69 3e 3d 30 20 26 26 20 72 63 ight; i>=0 && rc
22fe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d ==SQLITE_OK; i--
22ff0 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 64 65 52 ){. NodeR
23000 65 61 64 65 72 20 72 65 61 64 65 72 3b 0a 20 20 eader reader;.
23010 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 pNode = &p
23020 57 72 69 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 Writer->aNodeWri
23030 74 65 72 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 20 ter[i];..
23040 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 rc = nodeReader
23050 49 6e 69 74 28 26 72 65 61 64 65 72 2c 20 70 4e Init(&reader, pN
23060 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c 20 70 4e ode->block.a, pN
23070 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 ode->block.n);.
23080 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 while( re
23090 61 64 65 72 2e 61 4e 6f 64 65 20 26 26 20 72 63 ader.aNode && rc
230a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 ==SQLITE_OK ) rc
230b0 20 3d 20 6e 6f 64 65 52 65 61 64 65 72 4e 65 78 = nodeReaderNex
230c0 74 28 26 72 65 61 64 65 72 29 3b 0a 20 20 20 20 t(&reader);.
230d0 20 20 20 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 blobGrowBuff
230e0 65 72 28 26 70 4e 6f 64 65 2d 3e 6b 65 79 2c 20 er(&pNode->key,
230f0 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 2c 20 26 reader.term.n, &
23100 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 rc);. if(
23110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
23120 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 {. memc
23130 70 79 28 70 4e 6f 64 65 2d 3e 6b 65 79 2e 61 2c py(pNode->key.a,
23140 20 72 65 61 64 65 72 2e 74 65 72 6d 2e 61 2c 20 reader.term.a,
23150 72 65 61 64 65 72 2e 74 65 72 6d 2e 6e 29 3b 0a reader.term.n);.
23160 20 20 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d pNode-
23170 3e 6b 65 79 2e 6e 20 3d 20 72 65 61 64 65 72 2e >key.n = reader.
23180 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 20 20 term.n;.
23190 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 if( i>0 ){.
231a0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 61 char *a
231b0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 Block = 0;.
231c0 20 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 63 int nBloc
231d0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 k = 0;.
231e0 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 57 72 69 pNode = &pWri
231f0 74 65 72 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 ter->aNodeWriter
23200 5b 69 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 [i-1];.
23210 20 20 20 70 4e 6f 64 65 2d 3e 69 42 6c 6f 63 6b pNode->iBlock
23220 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 = reader.iChild
23230 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 ;. rc
23240 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 = sqlite3Fts3Re
23250 61 64 42 6c 6f 63 6b 28 70 2c 20 72 65 61 64 65 adBlock(p, reade
23260 72 2e 69 43 68 69 6c 64 2c 20 26 61 42 6c 6f 63 r.iChild, &aBloc
23270 6b 2c 20 26 6e 42 6c 6f 63 6b 2c 20 30 29 3b 0a k, &nBlock, 0);.
23280 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 blob
23290 47 72 6f 77 42 75 66 66 65 72 28 26 70 4e 6f 64 GrowBuffer(&pNod
232a0 65 2d 3e 62 6c 6f 63 6b 2c 20 4d 41 58 28 6e 42 e->block, MAX(nB
232b0 6c 6f 63 6b 2c 20 70 2d 3e 6e 4e 6f 64 65 53 69 lock, p->nNodeSi
232c0 7a 65 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 ze), &rc);.
232d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 if( rc==S
232e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
232f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 memcpy
23300 28 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 61 2c (pNode->block.a,
23310 20 61 42 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 29 aBlock, nBlock)
23320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
23330 70 4e 6f 64 65 2d 3e 62 6c 6f 63 6b 2e 6e 20 3d pNode->block.n =
23340 20 6e 42 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 nBlock;.
23350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
23360 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
23370 61 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 aBlock);.
23380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 }. }.
23390 20 20 20 20 20 20 20 6e 6f 64 65 52 65 61 64 65 nodeReade
233a0 72 52 65 6c 65 61 73 65 28 26 72 65 61 64 65 72 rRelease(&reader
233b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
233c0 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 .. rc2 = sqli
233d0 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65 63 te3_reset(pSelec
233e0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d t);. if( rc==
233f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d SQLITE_OK ) rc =
23400 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 rc2;. }.. ret
23410 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
23420 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c Determine the l
23430 61 72 67 65 73 74 20 73 65 67 6d 65 6e 74 20 69 argest segment i
23440 6e 64 65 78 20 76 61 6c 75 65 20 74 68 61 74 20 ndex value that
23450 65 78 69 73 74 73 20 77 69 74 68 69 6e 20 61 62 exists within ab
23460 73 6f 6c 75 74 65 0a 2a 2a 20 6c 65 76 65 6c 20 solute.** level
23470 69 41 62 73 4c 65 76 65 6c 2b 31 2e 20 49 66 20 iAbsLevel+1. If
23480 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c no error occurs,
23490 20 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20 74 set *piIdx to t
234a0 68 69 73 20 76 61 6c 75 65 20 70 6c 75 73 0a 2a his value plus.*
234b0 2a 20 6f 6e 65 20 62 65 66 6f 72 65 20 72 65 74 * one before ret
234c0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b urning SQLITE_OK
234d0 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 61 . Or, if there a
234e0 72 65 20 6e 6f 20 73 65 67 6d 65 6e 74 73 20 61 re no segments a
234f0 74 20 61 6c 6c 20 0a 2a 2a 20 77 69 74 68 69 6e t all .** within
23500 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 6c level iAbsLevel
23510 2c 20 73 65 74 20 2a 70 69 49 64 78 20 74 6f 20 , set *piIdx to
23520 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 zero..**.** If a
23530 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 n error occurs,
23540 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 return an SQLite
23550 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 error code. The
23560 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 0a final value of.
23570 2a 2a 20 2a 70 69 49 64 78 20 69 73 20 75 6e 64 ** *piIdx is und
23580 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 efined in this c
23590 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ase..*/.static i
235a0 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 nt fts3Incrmerge
235b0 4f 75 74 70 75 74 49 64 78 28 20 0a 20 20 46 74 OutputIdx( . Ft
235c0 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 s3Table *p,
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
235e0 20 46 54 53 20 54 61 62 6c 65 20 68 61 6e 64 6c FTS Table handl
235f0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 e */. sqlite3_i
23600 6e 74 36 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 nt64 iAbsLevel,
23610 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 /* Absolu
23620 74 65 20 69 6e 64 65 78 20 6f 66 20 69 6e 70 75 te index of inpu
23630 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 t segments */.
23640 69 6e 74 20 2a 70 69 49 64 78 20 20 20 20 20 20 int *piIdx
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23660 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 66 72 65 /* OUT: Next fre
23670 65 20 69 6e 64 65 78 20 61 74 20 69 41 62 73 4c e index at iAbsL
23680 65 76 65 6c 2b 31 20 2a 2f 0a 29 7b 0a 20 20 69 evel+1 */.){. i
23690 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 nt rc;. sqlite3
236a0 5f 73 74 6d 74 20 2a 70 4f 75 74 70 75 74 49 64 _stmt *pOutputId
236b0 78 20 3d 20 30 3b 20 20 20 2f 2a 20 53 51 4c 20 x = 0; /* SQL
236c0 75 73 65 64 20 74 6f 20 66 69 6e 64 20 6f 75 74 used to find out
236d0 70 75 74 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 put index */..
236e0 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d 74 rc = fts3SqlStmt
236f0 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 47 (p, SQL_NEXT_SEG
23700 4d 45 4e 54 5f 49 4e 44 45 58 2c 20 26 70 4f 75 MENT_INDEX, &pOu
23710 74 70 75 74 49 64 78 2c 20 30 29 3b 0a 20 20 69 tputIdx, 0);. i
23720 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
23730 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
23740 62 69 6e 64 5f 69 6e 74 36 34 28 70 4f 75 74 70 bind_int64(pOutp
23750 75 74 49 64 78 2c 20 31 2c 20 69 41 62 73 4c 65 utIdx, 1, iAbsLe
23760 76 65 6c 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 vel+1);. sqli
23770 74 65 33 5f 73 74 65 70 28 70 4f 75 74 70 75 74 te3_step(pOutput
23780 49 64 78 29 3b 0a 20 20 20 20 2a 70 69 49 64 78 Idx);. *piIdx
23790 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d = sqlite3_colum
237a0 6e 5f 69 6e 74 28 70 4f 75 74 70 75 74 49 64 78 n_int(pOutputIdx
237b0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 , 0);. rc = s
237c0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 4f 75 qlite3_reset(pOu
237d0 74 70 75 74 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 tputIdx);. }..
237e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
237f0 2a 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 * .** Allocate a
23800 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 6f 75 74 n appendable out
23810 70 75 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 61 put segment on a
23820 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 69 41 bsolute level iA
23830 62 73 4c 65 76 65 6c 2b 31 0a 2a 2a 20 77 69 74 bsLevel+1.** wit
23840 68 20 69 64 78 20 76 61 6c 75 65 20 69 49 64 78 h idx value iIdx
23850 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 25 ..**.** In the %
23860 5f 73 65 67 64 69 72 20 74 61 62 6c 65 2c 20 61 _segdir table, a
23870 20 73 65 67 6d 65 6e 74 20 69 73 20 64 65 66 69 segment is defi
23880 6e 65 64 20 62 79 20 74 68 65 20 76 61 6c 75 65 ned by the value
23890 73 20 69 6e 20 74 68 72 65 65 0a 2a 2a 20 63 6f s in three.** co
238a0 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 lumns:.**.**
238b0 20 73 74 61 72 74 5f 62 6c 6f 63 6b 0a 2a 2a 20 start_block.**
238c0 20 20 20 20 6c 65 61 76 65 73 5f 65 6e 64 5f 62 leaves_end_b
238d0 6c 6f 63 6b 0a 2a 2a 20 20 20 20 20 65 6e 64 5f lock.** end_
238e0 62 6c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e block.**.** When
238f0 20 61 6e 20 61 70 70 65 6e 64 61 62 6c 65 20 73 an appendable s
23900 65 67 6d 65 6e 74 20 69 73 20 61 6c 6c 6f 63 61 egment is alloca
23910 74 65 64 2c 20 69 74 20 69 73 20 65 73 74 69 6d ted, it is estim
23920 61 74 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a ated that the.**
23930 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 maximum number
23940 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 74 of leaf blocks t
23950 68 61 74 20 6d 61 79 20 62 65 20 72 65 71 75 69 hat may be requi
23960 72 65 64 20 69 73 20 74 68 65 20 73 75 6d 20 6f red is the sum o
23970 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 f the.** number
23980 6f 66 20 6c 65 61 66 20 62 6c 6f 63 6b 73 20 63 of leaf blocks c
23990 6f 6e 73 75 6d 65 64 20 62 79 20 74 68 65 20 69 onsumed by the i
239a0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 2c 20 70 nput segments, p
239b0 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a lus the number.*
239c0 2a 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 * of input segme
239d0 6e 74 73 2c 20 6d 75 6c 74 69 70 6c 69 65 64 20 nts, multiplied
239e0 62 79 20 74 77 6f 2e 20 54 68 69 73 20 76 61 6c by two. This val
239f0 75 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 ue is stored in
23a00 73 74 61 63 6b 20 0a 2a 2a 20 76 61 72 69 61 62 stack .** variab
23a10 6c 65 20 6e 4c 65 61 66 45 73 74 2e 0a 2a 2a 0a le nLeafEst..**.
23a20 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 31 36 ** A total of 16
23a30 2a 6e 4c 65 61 66 45 73 74 20 62 6c 6f 63 6b 73 *nLeafEst blocks
23a40 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 77 are allocated w
23a50 68 65 6e 20 61 6e 20 61 70 70 65 6e 64 61 62 6c hen an appendabl
23a60 65 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 73 20 e segment.** is
23a70 63 72 65 61 74 65 64 20 28 28 31 20 2b 20 65 6e created ((1 + en
23a80 64 5f 62 6c 6f 63 6b 20 2d 20 73 74 61 72 74 5f d_block - start_
23a90 62 6c 6f 63 6b 29 3d 3d 31 36 2a 6e 4c 65 61 66 block)==16*nLeaf
23aa0 45 73 74 29 2e 20 54 68 65 20 63 6f 6e 74 69 67 Est). The contig
23ab0 75 6f 75 73 0a 2a 2a 20 61 72 72 61 79 20 6f 66 uous.** array of
23ac0 20 6c 65 61 66 20 6e 6f 64 65 73 20 73 74 61 72 leaf nodes star
23ad0 74 73 20 61 74 20 74 68 65 20 66 69 72 73 74 20 ts at the first
23ae0 62 6c 6f 63 6b 20 61 6c 6c 6f 63 61 74 65 64 2e block allocated.
23af0 20 54 68 65 20 61 72 72 61 79 0a 2a 2a 20 6f 66 The array.** of
23b00 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 interior nodes
23b10 74 68 61 74 20 61 72 65 20 70 61 72 65 6e 74 73 that are parents
23b20 20 6f 66 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 of the leaf nod
23b30 65 73 20 73 74 61 72 74 20 61 74 20 62 6c 6f 63 es start at bloc
23b40 6b 0a 2a 2a 20 28 73 74 61 72 74 5f 62 6c 6f 63 k.** (start_bloc
23b50 6b 20 2b 20 28 31 20 2b 20 65 6e 64 5f 62 6c 6f k + (1 + end_blo
23b60 63 6b 20 2d 20 73 74 61 72 74 5f 62 6c 6f 63 6b ck - start_block
23b70 29 20 2f 20 31 36 29 2e 20 41 6e 64 20 73 6f 20 ) / 16). And so
23b80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 on..**.** In the
23b90 20 61 63 74 75 61 6c 20 63 6f 64 65 20 62 65 6c actual code bel
23ba0 6f 77 2c 20 74 68 65 20 76 61 6c 75 65 20 22 31 ow, the value "1
23bb0 36 22 20 69 73 20 72 65 70 6c 61 63 65 64 20 77 6" is replaced w
23bc0 69 74 68 20 74 68 65 20 0a 2a 2a 20 70 72 65 2d ith the .** pre-
23bd0 70 72 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 processor macro
23be0 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 FTS_MAX_APPENDAB
23bf0 4c 45 5f 48 45 49 47 48 54 2e 0a 2a 2f 0a 73 74 LE_HEIGHT..*/.st
23c00 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 atic int fts3Inc
23c10 72 6d 65 72 67 65 57 72 69 74 65 72 28 20 0a 20 rmergeWriter( .
23c20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 Fts3Table *p,
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23c40 20 2f 2a 20 46 74 73 33 20 74 61 62 6c 65 20 68 /* Fts3 table h
23c50 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 andle */. sqlit
23c60 65 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 e3_int64 iAbsLev
23c70 65 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 el, /* Ab
23c80 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 solute level of
23c90 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a input segments *
23ca0 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 /. int iIdx,
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23cc0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 /* Index of
23cd0 6e 65 77 20 6f 75 74 70 75 74 20 73 65 67 6d 65 new output segme
23ce0 6e 74 20 2a 2f 0a 20 20 46 74 73 33 4d 75 6c 74 nt */. Fts3Mult
23cf0 69 53 65 67 52 65 61 64 65 72 20 2a 70 43 73 72 iSegReader *pCsr
23d00 2c 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f , /* Curso
23d10 72 20 74 68 61 74 20 64 61 74 61 20 77 69 6c 6c r that data will
23d20 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f be read from */
23d30 0a 20 20 49 6e 63 72 6d 65 72 67 65 57 72 69 74 . IncrmergeWrit
23d40 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 er *pWriter
23d50 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 /* Populate t
23d60 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b his object */.){
23d70 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 . int rc;
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23d90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 /* Return Cod
23da0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 e */. int i;
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23dc0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 /* Iterat
23dd0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 or variable */.
23de0 20 69 6e 74 20 6e 4c 65 61 66 45 73 74 20 3d 20 int nLeafEst =
23df0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
23e00 20 2f 2a 20 42 6c 6f 63 6b 73 20 61 6c 6c 6f 63 /* Blocks alloc
23e10 61 74 65 64 20 66 6f 72 20 6c 65 61 66 20 6e 6f ated for leaf no
23e20 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 des */. sqlite3
23e30 5f 73 74 6d 74 20 2a 70 4c 65 61 66 45 73 74 20 _stmt *pLeafEst
23e40 3d 20 30 3b 20 20 20 20 20 2f 2a 20 53 51 4c 20 = 0; /* SQL
23e50 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e used to determin
23e60 65 20 6e 4c 65 61 66 45 73 74 20 2a 2f 0a 20 20 e nLeafEst */.
23e70 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 46 sqlite3_stmt *pF
23e80 69 72 73 74 42 6c 6f 63 6b 20 3d 20 30 3b 20 20 irstBlock = 0;
23e90 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 64 /* SQL used to d
23ea0 65 74 65 72 6d 69 6e 65 20 66 69 72 73 74 20 62 etermine first b
23eb0 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 lock */.. /* Ca
23ec0 6c 63 75 6c 61 74 65 20 6e 4c 65 61 66 45 73 74 lculate nLeafEst
23ed0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 33 . */. rc = fts3
23ee0 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 4d SqlStmt(p, SQL_M
23ef0 41 58 5f 4c 45 41 46 5f 4e 4f 44 45 5f 45 53 54 AX_LEAF_NODE_EST
23f00 49 4d 41 54 45 2c 20 26 70 4c 65 61 66 45 73 74 IMATE, &pLeafEst
23f10 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d , 0);. if( rc==
23f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
23f30 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
23f40 74 36 34 28 70 4c 65 61 66 45 73 74 2c 20 31 2c t64(pLeafEst, 1,
23f50 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 20 iAbsLevel);.
23f60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
23f70 74 36 34 28 70 4c 65 61 66 45 73 74 2c 20 32 2c t64(pLeafEst, 2,
23f80 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 pCsr->nSegment)
23f90 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 ;. if( SQLITE
23fa0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 _ROW==sqlite3_st
23fb0 65 70 28 70 4c 65 61 66 45 73 74 29 20 29 7b 0a ep(pLeafEst) ){.
23fc0 20 20 20 20 20 20 6e 4c 65 61 66 45 73 74 20 3d nLeafEst =
23fd0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
23fe0 69 6e 74 28 70 4c 65 61 66 45 73 74 2c 20 30 29 int(pLeafEst, 0)
23ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d ;. }. rc =
24000 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 sqlite3_reset(p
24010 4c 65 61 66 45 73 74 29 3b 0a 20 20 7d 0a 20 20 LeafEst);. }.
24020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
24030 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a K ) return rc;..
24040 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 /* Calculate t
24050 68 65 20 66 69 72 73 74 20 62 6c 6f 63 6b 20 74 he first block t
24060 6f 20 75 73 65 20 69 6e 20 74 68 65 20 6f 75 74 o use in the out
24070 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 put segment */.
24080 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d rc = fts3SqlStm
24090 74 28 70 2c 20 53 51 4c 5f 4e 45 58 54 5f 53 45 t(p, SQL_NEXT_SE
240a0 47 4d 45 4e 54 53 5f 49 44 2c 20 26 70 46 69 72 GMENTS_ID, &pFir
240b0 73 74 42 6c 6f 63 6b 2c 20 30 29 3b 0a 20 20 69 stBlock, 0);. i
240c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
240d0 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 ){. if( SQLI
240e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f TE_ROW==sqlite3_
240f0 73 74 65 70 28 70 46 69 72 73 74 42 6c 6f 63 6b step(pFirstBlock
24100 29 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74 ) ){. pWrit
24110 65 72 2d 3e 69 53 74 61 72 74 20 3d 20 73 71 6c er->iStart = sql
24120 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 ite3_column_int6
24130 34 28 70 46 69 72 73 74 42 6c 6f 63 6b 2c 20 30 4(pFirstBlock, 0
24140 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 );. pWriter
24150 2d 3e 69 45 6e 64 20 3d 20 70 57 72 69 74 65 72 ->iEnd = pWriter
24160 2d 3e 69 53 74 61 72 74 20 2d 20 31 3b 0a 20 20 ->iStart - 1;.
24170 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 45 6e pWriter->iEn
24180 64 20 2b 3d 20 6e 4c 65 61 66 45 73 74 20 2a 20 d += nLeafEst *
24190 46 54 53 5f 4d 41 58 5f 41 50 50 45 4e 44 41 42 FTS_MAX_APPENDAB
241a0 4c 45 5f 48 45 49 47 48 54 3b 0a 20 20 20 20 7d LE_HEIGHT;. }
241b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
241c0 33 5f 72 65 73 65 74 28 70 46 69 72 73 74 42 6c 3_reset(pFirstBl
241d0 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 ock);. }. if(
241e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 rc!=SQLITE_OK )
241f0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a return rc;.. /*
24200 20 49 6e 73 65 72 74 20 74 68 65 20 6d 61 72 6b Insert the mark
24210 65 72 20 69 6e 20 74 68 65 20 25 5f 73 65 67 6d er in the %_segm
24220 65 6e 74 73 20 74 61 62 6c 65 20 74 6f 20 6d 61 ents table to ma
24230 6b 65 20 73 75 72 65 20 6e 6f 62 6f 64 79 20 74 ke sure nobody t
24240 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 73 74 65 ries. ** to ste
24250 61 6c 20 74 68 65 20 73 70 61 63 65 20 6a 75 73 al the space jus
24260 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 54 68 69 t allocated. Thi
24270 73 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 74 s is also used t
24280 6f 20 69 64 65 6e 74 69 66 79 20 0a 20 20 2a 2a o identify . **
24290 20 61 70 70 65 6e 64 61 62 6c 65 20 73 65 67 6d appendable segm
242a0 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 72 63 20 3d ents. */. rc =
242b0 20 66 74 73 33 57 72 69 74 65 53 65 67 6d 65 6e fts3WriteSegmen
242c0 74 28 70 2c 20 70 57 72 69 74 65 72 2d 3e 69 45 t(p, pWriter->iE
242d0 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 nd, 0, 0);. if(
242e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
242f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 return rc;.. p
24300 57 72 69 74 65 72 2d 3e 69 41 62 73 4c 65 76 65 Writer->iAbsLeve
24310 6c 20 3d 20 69 41 62 73 4c 65 76 65 6c 3b 0a 20 l = iAbsLevel;.
24320 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 pWriter->nLeafE
24330 73 74 20 3d 20 6e 4c 65 61 66 45 73 74 3b 0a 20 st = nLeafEst;.
24340 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d pWriter->iIdx =
24350 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 53 65 74 iIdx;.. /* Set
24360 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 up the array of
24370 20 4e 6f 64 65 57 72 69 74 65 72 20 6f 62 6a 65 NodeWriter obje
24380 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 cts */. for(i=0
24390 3b 20 69 3c 46 54 53 5f 4d 41 58 5f 41 50 50 45 ; i<FTS_MAX_APPE
243a0 4e 44 41 42 4c 45 5f 48 45 49 47 48 54 3b 20 69 NDABLE_HEIGHT; i
243b0 2b 2b 29 7b 0a 20 20 20 20 70 57 72 69 74 65 72 ++){. pWriter
243c0 2d 3e 61 4e 6f 64 65 57 72 69 74 65 72 5b 69 5d ->aNodeWriter[i]
243d0 2e 69 42 6c 6f 63 6b 20 3d 20 70 57 72 69 74 65 .iBlock = pWrite
243e0 72 2d 3e 69 53 74 61 72 74 20 2b 20 69 2a 70 57 r->iStart + i*pW
243f0 72 69 74 65 72 2d 3e 6e 4c 65 61 66 45 73 74 3b riter->nLeafEst;
24400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 . }. return SQ
24410 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
24420 2a 20 52 65 6d 6f 76 65 20 61 6e 20 65 6e 74 72 * Remove an entr
24430 79 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 65 67 y from the %_seg
24440 64 69 72 20 74 61 62 6c 65 2e 20 54 68 69 73 20 dir table. This
24450 69 6e 76 6f 6c 76 65 73 20 72 75 6e 6e 69 6e 67 involves running
24460 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 the .** followi
24470 6e 67 20 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 ng two statement
24480 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 44 45 4c 45 54 s:.**.** DELET
24490 45 20 46 52 4f 4d 20 25 5f 73 65 67 64 69 72 20 E FROM %_segdir
244a0 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 WHERE level = :i
244b0 41 62 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78 AbsLevel AND idx
244c0 20 3d 20 3a 69 49 64 78 0a 2a 2a 20 20 20 55 50 = :iIdx.** UP
244d0 44 41 54 45 20 25 5f 73 65 67 64 69 72 20 53 45 DATE %_segdir SE
244e0 54 20 69 64 78 20 3d 20 69 64 78 20 2d 20 31 20 T idx = idx - 1
244f0 57 48 45 52 45 20 6c 65 76 65 6c 20 3d 20 3a 69 WHERE level = :i
24500 41 62 73 4c 65 76 65 6c 20 41 4e 44 20 69 64 78 AbsLevel AND idx
24510 20 3e 20 3a 69 49 64 78 0a 2a 2a 0a 2a 2a 20 54 > :iIdx.**.** T
24520 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d he DELETE statem
24530 65 6e 74 20 72 65 6d 6f 76 65 73 20 74 68 65 20 ent removes the
24540 73 70 65 63 69 66 69 63 20 25 5f 73 65 67 64 69 specific %_segdi
24550 72 20 6c 65 76 65 6c 2e 20 54 68 65 20 55 50 44 r level. The UPD
24560 41 54 45 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e ATE .** statemen
24570 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 t ensures that t
24580 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 73 65 67 he remaining seg
24590 6d 65 6e 74 73 20 68 61 76 65 20 63 6f 6e 74 69 ments have conti
245a0 67 75 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 guously allocate
245b0 64 0a 2a 2a 20 69 64 78 20 76 61 6c 75 65 73 2e d.** idx values.
245c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 .*/.static int f
245d0 74 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45 ts3RemoveSegdirE
245e0 6e 74 72 79 28 0a 20 20 46 74 73 33 54 61 62 6c ntry(. Fts3Tabl
245f0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 e *p,
24600 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 /* FTS3
24610 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a table handle */.
24620 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
24630 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 iAbsLevel,
24640 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c 65 /* Absolute le
24650 76 65 6c 20 74 6f 20 64 65 6c 65 74 65 20 66 72 vel to delete fr
24660 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 om */. int iIdx
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24680 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 /* Index
24690 20 6f 66 20 25 5f 73 65 67 64 69 72 20 65 6e 74 of %_segdir ent
246a0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a ry to delete */.
246b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 ){. int rc;
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
246d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 /* Return c
246e0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ode */. sqlite3
246f0 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 20 3d _stmt *pDelete =
24700 20 30 3b 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 0; /* DELE
24710 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a TE statement */.
24720 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 . rc = fts3SqlS
24730 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 4c 45 54 tmt(p, SQL_DELET
24740 45 5f 53 45 47 44 49 52 5f 45 4e 54 52 59 2c 20 E_SEGDIR_ENTRY,
24750 26 70 44 65 6c 65 74 65 2c 20 30 29 3b 0a 20 20 &pDelete, 0);.
24760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
24770 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 K ){. sqlite3
24780 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 44 65 6c _bind_int64(pDel
24790 65 74 65 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 ete, 1, iAbsLeve
247a0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f l);. sqlite3_
247b0 62 69 6e 64 5f 69 6e 74 28 70 44 65 6c 65 74 65 bind_int(pDelete
247c0 2c 20 32 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 , 2, iIdx);.
247d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 sqlite3_step(pDe
247e0 6c 65 74 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 lete);. rc =
247f0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 44 sqlite3_reset(pD
24800 65 6c 65 74 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 elete);. }.. r
24810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
24820 2a 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 ** One or more s
24830 65 67 6d 65 6e 74 73 20 68 61 76 65 20 6a 75 73 egments have jus
24840 74 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 66 t been removed f
24850 72 6f 6d 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 rom absolute lev
24860 65 6c 20 69 41 62 73 4c 65 76 65 6c 2e 0a 2a 2a el iAbsLevel..**
24870 20 55 70 64 61 74 65 20 74 68 65 20 27 69 64 78 Update the 'idx
24880 27 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 ' values of the
24890 72 65 6d 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e remaining segmen
248a0 74 73 20 69 6e 20 74 68 65 20 6c 65 76 65 6c 20 ts in the level
248b0 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 69 so that.** the i
248c0 64 78 20 76 61 6c 75 65 73 20 61 72 65 20 61 20 dx values are a
248d0 63 6f 6e 74 69 67 75 6f 75 73 20 73 65 71 75 65 contiguous seque
248e0 6e 63 65 20 73 74 61 72 74 69 6e 67 20 66 72 6f nce starting fro
248f0 6d 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 m 0..*/.static i
24900 6e 74 20 66 74 73 33 52 65 70 61 63 6b 53 65 67 nt fts3RepackSeg
24910 64 69 72 4c 65 76 65 6c 28 0a 20 20 46 74 73 33 dirLevel(. Fts3
24920 54 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 Table *p,
24930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
24940 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 TS3 table handle
24950 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e */. sqlite3_in
24960 74 36 34 20 69 41 62 73 4c 65 76 65 6c 20 20 20 t64 iAbsLevel
24970 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 /* Absolut
24980 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 70 61 63 e level to repac
24990 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 k */.){. int rc
249a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
249b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 /* Ret
249c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e urn code */. in
249d0 74 20 2a 61 49 64 78 20 3d 20 30 3b 20 20 20 20 t *aIdx = 0;
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
249f0 20 41 72 72 61 79 20 6f 66 20 72 65 6d 61 69 6e Array of remain
24a00 69 6e 67 20 69 64 78 20 76 61 6c 75 65 73 20 2a ing idx values *
24a10 2f 0a 20 20 69 6e 74 20 6e 49 64 78 20 3d 20 30 /. int nIdx = 0
24a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
24a30 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 65 6e 74 /* Valid ent
24a40 72 69 65 73 20 69 6e 20 61 49 64 78 5b 5d 20 2a ries in aIdx[] *
24a50 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d /. int nAlloc =
24a60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
24a70 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 /* Allocated
24a80 20 73 69 7a 65 20 6f 66 20 61 49 64 78 5b 5d 20 size of aIdx[]
24a90 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 */. int i;
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24ab0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 /* Iterator
24ac0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 73 variable */. s
24ad0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 qlite3_stmt *pSe
24ae0 6c 65 63 74 20 3d 20 30 3b 20 20 20 20 20 20 2f lect = 0; /
24af0 2a 20 53 65 6c 65 63 74 20 73 74 61 74 65 6d 65 * Select stateme
24b00 6e 74 20 74 6f 20 72 65 61 64 20 69 64 78 20 76 nt to read idx v
24b10 61 6c 75 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 alues */. sqlit
24b20 65 33 5f 73 74 6d 74 20 2a 70 55 70 64 61 74 65 e3_stmt *pUpdate
24b30 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 55 70 = 0; /* Up
24b40 64 61 74 65 20 73 74 61 74 65 6d 65 6e 74 20 74 date statement t
24b50 6f 20 6d 6f 64 69 66 79 20 69 64 78 20 76 61 6c o modify idx val
24b60 75 65 73 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 ues */.. rc = f
24b70 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 ts3SqlStmt(p, SQ
24b80 4c 5f 53 45 4c 45 43 54 5f 49 4e 44 45 58 45 53 L_SELECT_INDEXES
24b90 2c 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a , &pSelect, 0);.
24ba0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
24bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 _OK ){. int r
24bc0 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f c2;. sqlite3_
24bd0 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 65 6c 65 bind_int64(pSele
24be0 63 74 2c 20 31 2c 20 69 41 62 73 4c 65 76 65 6c ct, 1, iAbsLevel
24bf0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 );. while( SQ
24c00 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 LITE_ROW==sqlite
24c10 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 3_step(pSelect)
24c20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 49 64 ){. if( nId
24c30 78 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 x>=nAlloc ){.
24c40 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a int *aNew;.
24c50 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b nAlloc +
24c60 3d 20 31 36 3b 0a 20 20 20 20 20 20 20 20 61 4e = 16;. aN
24c70 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 ew = sqlite3_rea
24c80 6c 6c 6f 63 28 61 49 64 78 2c 20 6e 41 6c 6c 6f lloc(aIdx, nAllo
24c90 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a c*sizeof(int));.
24ca0 20 20 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 if( !aNe
24cb0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 w ){. r
24cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d c = SQLITE_NOMEM
24cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ;. brea
24ce0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 k;. }.
24cf0 20 20 20 20 20 61 49 64 78 20 3d 20 61 4e 65 77 aIdx = aNew
24d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
24d10 61 49 64 78 5b 6e 49 64 78 2b 2b 5d 20 3d 20 73 aIdx[nIdx++] = s
24d20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e qlite3_column_in
24d30 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 t(pSelect, 0);.
24d40 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 }. rc2 = s
24d50 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 qlite3_reset(pSe
24d60 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28 20 72 lect);. if( r
24d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 c==SQLITE_OK ) r
24d80 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 c = rc2;. }..
24d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
24da0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 K ){. rc = ft
24db0 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c s3SqlStmt(p, SQL
24dc0 5f 53 48 49 46 54 5f 53 45 47 44 49 52 5f 45 4e _SHIFT_SEGDIR_EN
24dd0 54 52 59 2c 20 26 70 55 70 64 61 74 65 2c 20 30 TRY, &pUpdate, 0
24de0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d );. }. if( rc=
24df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
24e00 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 sqlite3_bind_i
24e10 6e 74 36 34 28 70 55 70 64 61 74 65 2c 20 32 2c nt64(pUpdate, 2,
24e20 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 20 7d iAbsLevel);. }
24e30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 .. assert( p->b
24e40 49 67 6e 6f 72 65 53 61 76 65 70 6f 69 6e 74 3d IgnoreSavepoint=
24e50 3d 30 20 29 3b 0a 20 20 70 2d 3e 62 49 67 6e 6f =0 );. p->bIgno
24e60 72 65 53 61 76 65 70 6f 69 6e 74 20 3d 20 31 3b reSavepoint = 1;
24e70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d . for(i=0; rc==
24e80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e SQLITE_OK && i<n
24e90 49 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 Idx; i++){. i
24ea0 66 28 20 61 49 64 78 5b 69 5d 21 3d 69 20 29 7b f( aIdx[i]!=i ){
24eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 . sqlite3_b
24ec0 69 6e 64 5f 69 6e 74 28 70 55 70 64 61 74 65 2c ind_int(pUpdate,
24ed0 20 33 2c 20 61 49 64 78 5b 69 5d 29 3b 0a 20 20 3, aIdx[i]);.
24ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 sqlite3_bind
24ef0 5f 69 6e 74 28 70 55 70 64 61 74 65 2c 20 31 2c _int(pUpdate, 1,
24f00 20 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 i);. sqlit
24f10 65 33 5f 73 74 65 70 28 70 55 70 64 61 74 65 29 e3_step(pUpdate)
24f20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c ;. rc = sql
24f30 69 74 65 33 5f 72 65 73 65 74 28 70 55 70 64 61 ite3_reset(pUpda
24f40 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 te);. }. }.
24f50 20 70 2d 3e 62 49 67 6e 6f 72 65 53 61 76 65 70 p->bIgnoreSavep
24f60 6f 69 6e 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c oint = 0;.. sql
24f70 69 74 65 33 5f 66 72 65 65 28 61 49 64 78 29 3b ite3_free(aIdx);
24f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
24f90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 .static void fts
24fa0 33 53 74 61 72 74 4e 6f 64 65 28 42 6c 6f 62 20 3StartNode(Blob
24fb0 2a 70 4e 6f 64 65 2c 20 69 6e 74 20 69 48 65 69 *pNode, int iHei
24fc0 67 68 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 ght, sqlite3_int
24fd0 36 34 20 69 43 68 69 6c 64 29 7b 0a 20 20 70 4e 64 iChild){. pN
24fe0 6f 64 65 2d 3e 61 5b 30 5d 20 3d 20 28 63 68 61 ode->a[0] = (cha
24ff0 72 29 69 48 65 69 67 68 74 3b 0a 20 20 69 66 28 r)iHeight;. if(
25000 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 61 iChild ){. a
25010 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6e 41 ssert( pNode->nA
25020 6c 6c 6f 63 3e 3d 31 2b 73 71 6c 69 74 65 33 46 lloc>=1+sqlite3F
25030 74 73 33 56 61 72 69 6e 74 4c 65 6e 28 69 43 68 ts3VarintLen(iCh
25040 69 6c 64 29 20 29 3b 0a 20 20 20 20 70 4e 6f 64 ild) );. pNod
25050 65 2d 3e 6e 20 3d 20 31 20 2b 20 73 71 6c 69 74 e->n = 1 + sqlit
25060 65 33 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 e3Fts3PutVarint(
25070 26 70 4e 6f 64 65 2d 3e 61 5b 31 5d 2c 20 69 43 &pNode->a[1], iC
25080 68 69 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a hild);. }else{.
25090 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 assert( pNod
250a0 65 2d 3e 6e 41 6c 6c 6f 63 3e 3d 31 20 29 3b 0a e->nAlloc>=1 );.
250b0 20 20 20 20 70 4e 6f 64 65 2d 3e 6e 20 3d 20 31 pNode->n = 1
250c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 ;. }.}../*.** T
250d0 68 65 20 66 69 72 73 74 20 74 77 6f 20 61 72 67 he first two arg
250e0 75 6d 65 6e 74 73 20 61 72 65 20 61 20 70 6f 69 uments are a poi
250f0 6e 74 65 72 20 74 6f 20 61 6e 64 20 74 68 65 20 nter to and the
25100 73 69 7a 65 20 6f 66 20 61 20 73 65 67 6d 65 6e size of a segmen
25110 74 20 62 2d 74 72 65 65 0a 2a 2a 20 6e 6f 64 65 t b-tree.** node
25120 2e 20 54 68 65 20 6e 6f 64 65 20 6d 61 79 20 62 . The node may b
25130 65 20 61 20 6c 65 61 66 20 6f 72 20 61 6e 20 69 e a leaf or an i
25140 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 2a 2a nternal node..**
25150 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
25160 6e 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 n creates a new
25170 6e 6f 64 65 20 69 6d 61 67 65 20 69 6e 20 62 6c node image in bl
25180 6f 62 20 6f 62 6a 65 63 74 20 2a 70 4e 65 77 20 ob object *pNew
25190 62 79 20 63 6f 70 79 69 6e 67 0a 2a 2a 20 61 6c by copying.** al
251a0 6c 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 l terms that are
251b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 greater than or
251c0 20 65 71 75 61 6c 20 74 6f 20 7a 54 65 72 6d 2f equal to zTerm/
251d0 6e 54 65 72 6d 20 28 66 6f 72 20 6c 65 61 66 20 nTerm (for leaf
251e0 6e 6f 64 65 73 29 0a 2a 2a 20 6f 72 20 67 72 65 nodes).** or gre
251f0 61 74 65 72 20 74 68 61 6e 20 7a 54 65 72 6d 2f ater than zTerm/
25200 6e 54 65 72 6d 20 28 66 6f 72 20 69 6e 74 65 72 nTerm (for inter
25210 6e 61 6c 20 6e 6f 64 65 73 29 20 66 72 6f 6d 20 nal nodes) from
25220 61 4e 6f 64 65 2f 6e 4e 6f 64 65 2e 0a 2a 2f 0a aNode/nNode..*/.
25230 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 static int fts3T
25240 72 75 6e 63 61 74 65 4e 6f 64 65 28 0a 20 20 63 runcateNode(. c
25250 6f 6e 73 74 20 63 68 61 72 20 2a 61 4e 6f 64 65 onst char *aNode
25260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
25270 2a 20 43 75 72 72 65 6e 74 20 6e 6f 64 65 20 69 * Current node i
25280 6d 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e mage */. int nN
25290 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ode,
252a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a /* Siz
252b0 65 20 6f 66 20 61 4e 6f 64 65 20 69 6e 20 62 79 e of aNode in by
252c0 74 65 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 tes */. Blob *p
252d0 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 New,
252e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a /* OUT:
252f0 20 57 72 69 74 65 20 6e 65 77 20 6e 6f 64 65 20 Write new node
25300 69 6d 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 image here */.
25310 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 const char *zTer
25320 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 m,
25330 2f 2a 20 4f 6d 69 74 20 61 6c 6c 20 74 65 72 6d /* Omit all term
25340 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 s smaller than t
25350 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 his */. int nTe
25360 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 rm,
25370 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
25380 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 of zTerm in byt
25390 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f es */. sqlite3_
253a0 69 6e 74 36 34 20 2a 70 69 42 6c 6f 63 6b 20 20 int64 *piBlock
253b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 /* OUT:
253c0 42 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 69 6e 20 Block number in
253d0 6e 65 78 74 20 6c 61 79 65 72 20 64 6f 77 6e 20 next layer down
253e0 2a 2f 0a 29 7b 0a 20 20 4e 6f 64 65 52 65 61 64 */.){. NodeRead
253f0 65 72 20 72 65 61 64 65 72 3b 20 20 20 20 20 20 er reader;
25400 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 /* Reade
25410 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 42 6c r object */. Bl
25420 6f 62 20 70 72 65 76 20 3d 20 7b 30 2c 20 30 2c ob prev = {0, 0,
25430 20 30 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 0}; /*
25440 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 77 Previous term w
25450 72 69 74 74 65 6e 20 74 6f 20 6e 65 77 20 6e 6f ritten to new no
25460 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d de */. int rc =
25470 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 SQLITE_OK;
25480 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 /* Retur
25490 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 n code */. int
254a0 62 4c 65 61 66 20 3d 20 61 4e 6f 64 65 5b 30 5d bLeaf = aNode[0]
254b0 3d 3d 27 5c 30 27 3b 20 20 20 20 20 2f 2a 20 54 =='\0'; /* T
254c0 72 75 65 20 66 6f 72 20 61 20 6c 65 61 66 20 6e rue for a leaf n
254d0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c ode */.. /* All
254e0 6f 63 61 74 65 20 72 65 71 75 69 72 65 64 20 6f ocate required o
254f0 75 74 70 75 74 20 73 70 61 63 65 20 2a 2f 0a 20 utput space */.
25500 20 62 6c 6f 62 47 72 6f 77 42 75 66 66 65 72 28 blobGrowBuffer(
25510 70 4e 65 77 2c 20 6e 4e 6f 64 65 2c 20 26 72 63 pNew, nNode, &rc
25520 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c );. if( rc!=SQL
25530 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 ITE_OK ) return
25540 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 6e 20 3d 20 rc;. pNew->n =
25550 30 3b 0a 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 0;.. /* Populat
25560 65 20 6e 65 77 20 6e 6f 64 65 20 62 75 66 66 65 e new node buffe
25570 72 20 2a 2f 0a 20 20 66 6f 72 28 72 63 20 3d 20 r */. for(rc =
25580 6e 6f 64 65 52 65 61 64 65 72 49 6e 69 74 28 26 nodeReaderInit(&
25590 72 65 61 64 65 72 2c 20 61 4e 6f 64 65 2c 20 6e reader, aNode, n
255a0 4e 6f 64 65 29 3b 20 0a 20 20 20 20 20 20 72 63 Node); . rc
255b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 ==SQLITE_OK && r
255c0 65 61 64 65 72 2e 61 4e 6f 64 65 3b 20 0a 20 20 eader.aNode; .
255d0 20 20 20 20 72 63 20 3d 20 6e 6f 64 65 52 65 61 rc = nodeRea
255e0 64 65 72 4e 65 78 74 28 26 72 65 61 64 65 72 29 derNext(&reader)
255f0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e . ){. if( pN
25600 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 ew->n==0 ){.
25610 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 33 int res = fts3
25620 54 65 72 6d 43 6d 70 28 72 65 61 64 65 72 2e 74 TermCmp(reader.t
25630 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 erm.a, reader.te
25640 72 6d 2e 6e 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 rm.n, zTerm, nTe
25650 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 rm);. if( r
25660 65 73 3c 30 20 7c 7c 20 28 62 4c 65 61 66 3d 3d es<0 || (bLeaf==
25670 30 20 26 26 20 72 65 73 3d 3d 30 29 20 29 20 63 0 && res==0) ) c
25680 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 ontinue;. f
25690 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70 4e 65 ts3StartNode(pNe
256a0 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b 30 5d w, (int)aNode[0]
256b0 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 29 , reader.iChild)
256c0 3b 0a 20 20 20 20 20 20 2a 70 69 42 6c 6f 63 6b ;. *piBlock
256d0 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 = reader.iChild
256e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d ;. }. rc =
256f0 20 66 74 73 33 41 70 70 65 6e 64 54 6f 4e 6f 64 fts3AppendToNod
25700 65 28 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2c e(. pNew,
25710 20 26 70 72 65 76 2c 20 72 65 61 64 65 72 2e 74 &prev, reader.t
25720 65 72 6d 2e 61 2c 20 72 65 61 64 65 72 2e 74 65 erm.a, reader.te
25730 72 6d 2e 6e 2c 0a 20 20 20 20 20 20 20 20 72 65 rm.n,. re
25740 61 64 65 72 2e 61 44 6f 63 6c 69 73 74 2c 20 72 ader.aDoclist, r
25750 65 61 64 65 72 2e 6e 44 6f 63 6c 69 73 74 0a 20 eader.nDoclist.
25760 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 );. if( rc
25770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 !=SQLITE_OK ) br
25780 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 eak;. }. if( p
25790 4e 65 77 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 New->n==0 ){.
257a0 20 66 74 73 33 53 74 61 72 74 4e 6f 64 65 28 70 fts3StartNode(p
257b0 4e 65 77 2c 20 28 69 6e 74 29 61 4e 6f 64 65 5b New, (int)aNode[
257c0 30 5d 2c 20 72 65 61 64 65 72 2e 69 43 68 69 6c 0], reader.iChil
257d0 64 29 3b 0a 20 20 20 20 2a 70 69 42 6c 6f 63 6b d);. *piBlock
257e0 20 3d 20 72 65 61 64 65 72 2e 69 43 68 69 6c 64 = reader.iChild
257f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
25800 70 4e 65 77 2d 3e 6e 3c 3d 70 4e 65 77 2d 3e 6e pNew->n<=pNew->n
25810 41 6c 6c 6f 63 20 29 3b 0a 0a 20 20 6e 6f 64 65 Alloc );.. node
25820 52 65 61 64 65 72 52 65 6c 65 61 73 65 28 26 72 ReaderRelease(&r
25830 65 61 64 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 eader);. sqlite
25840 33 5f 66 72 65 65 28 70 72 65 76 2e 61 29 3b 0a 3_free(prev.a);.
25850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
25860 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c /*.** Remove all
25870 20 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 terms smaller t
25880 68 61 6e 20 7a 54 65 72 6d 2f 6e 54 65 72 6d 20 han zTerm/nTerm
25890 66 72 6f 6d 20 73 65 67 6d 65 6e 74 20 69 49 64 from segment iId
258a0 78 20 69 6e 20 61 62 73 6f 6c 75 74 65 20 0a 2a x in absolute .*
258b0 2a 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 65 * level iAbsLeve
258c0 6c 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f l. This may invo
258d0 6c 76 65 20 64 65 6c 65 74 69 6e 67 20 65 6e 74 lve deleting ent
258e0 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20 25 5f ries from the %_
258f0 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 74 61 62 6c segments.** tabl
25900 65 2c 20 61 6e 64 20 6d 6f 64 69 66 79 69 6e 67 e, and modifying
25910 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 69 65 existing entrie
25920 73 20 69 6e 20 62 6f 74 68 20 74 68 65 20 25 5f s in both the %_
25930 73 65 67 6d 65 6e 74 73 20 61 6e 64 20 25 5f 73 segments and %_s
25940 65 67 64 69 72 0a 2a 2a 20 74 61 62 6c 65 73 2e egdir.** tables.
25950 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b .**.** SQLITE_OK
25960 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 is returned if
25970 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 75 the segment is u
25980 70 64 61 74 65 64 20 73 75 63 63 65 73 73 66 75 pdated successfu
25990 6c 6c 79 2e 20 4f 72 20 61 6e 0a 2a 2a 20 53 51 lly. Or an.** SQ
259a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 Lite error code
259b0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 otherwise..*/.st
259c0 61 74 69 63 20 69 6e 74 20 66 74 73 33 54 72 75 atic int fts3Tru
259d0 6e 63 61 74 65 53 65 67 6d 65 6e 74 28 0a 20 20 ncateSegment(.
259e0 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 20 20 Fts3Table *p,
259f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25a00 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 68 61 /* FTS3 table ha
25a10 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 ndle */. sqlite
25a20 33 5f 69 6e 74 36 34 20 69 41 62 73 4c 65 76 65 3_int64 iAbsLeve
25a30 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 l, /* Abs
25a40 6f 6c 75 74 65 20 6c 65 76 65 6c 20 6f 66 20 73 olute level of s
25a50 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 egment to modify
25a60 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 */. int iIdx,
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25a80 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 77 /* Index w
25a90 69 74 68 69 6e 20 6c 65 76 65 6c 20 6f 66 20 73 ithin level of s
25aa0 65 67 6d 65 6e 74 20 74 6f 20 6d 6f 64 69 66 79 egment to modify
25ab0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
25ac0 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 20 20 *zTerm,
25ad0 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 /* Remove
25ae0 74 65 72 6d 73 20 73 6d 61 6c 6c 65 72 20 74 68 terms smaller th
25af0 61 6e 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 an this */. int
25b00 20 6e 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 nTerm
25b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
25b20 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 umber of bytes i
25b30 6e 20 62 75 66 66 65 72 20 7a 54 65 72 6d 20 2a n buffer zTerm *
25b40 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 /.){. int rc =
25b50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 SQLITE_OK;
25b60 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e /* Return
25b70 20 63 6f 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 code */. Blob
25b80 72 6f 6f 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 root = {0,0,0};
25b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 /* Ne
25ba0 77 20 72 6f 6f 74 20 70 61 67 65 20 69 6d 61 67 w root page imag
25bb0 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 62 6c 6f 63 e */. Blob bloc
25bc0 6b 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 k = {0,0,0};
25bd0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 /* Buffer
25be0 20 75 73 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 used for any ot
25bf0 68 65 72 20 62 6c 6f 63 6b 20 2a 2f 0a 20 20 73 her block */. s
25c00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42 6c qlite3_int64 iBl
25c10 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f ock = 0; /
25c20 2a 20 42 6c 6f 63 6b 20 69 64 20 2a 2f 0a 20 20 * Block id */.
25c30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4e sqlite3_int64 iN
25c40 65 77 53 74 61 72 74 20 3d 20 30 3b 20 20 20 20 ewStart = 0;
25c50 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 /* New value for
25c60 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a 2f 0a iStartBlock */.
25c70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
25c80 69 4f 6c 64 53 74 61 72 74 20 3d 20 30 3b 20 20 iOldStart = 0;
25c90 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 66 /* Old value f
25ca0 6f 72 20 69 53 74 61 72 74 42 6c 6f 63 6b 20 2a or iStartBlock *
25cb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 /. sqlite3_stmt
25cc0 20 2a 70 46 65 74 63 68 20 3d 20 30 3b 20 20 20 *pFetch = 0;
25cd0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 /* Statement
25ce0 20 75 73 65 64 20 74 6f 20 66 65 74 63 68 20 73 used to fetch s
25cf0 65 67 64 69 72 20 2a 2f 0a 0a 20 20 72 63 20 3d egdir */.. rc =
25d00 20 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 fts3SqlStmt(p,
25d10 53 51 4c 5f 53 45 4c 45 43 54 5f 53 45 47 44 49 SQL_SELECT_SEGDI
25d20 52 2c 20 26 70 46 65 74 63 68 2c 20 30 29 3b 0a R, &pFetch, 0);.
25d30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
25d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 _OK ){. int r
25d50 63 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 c2;
25d60 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 /* sqli
25d70 74 65 33 5f 72 65 73 65 74 28 29 20 72 65 74 75 te3_reset() retu
25d80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 73 rn code */. s
25d90 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 qlite3_bind_int6
25da0 34 28 70 46 65 74 63 68 2c 20 31 2c 20 69 41 62 4(pFetch, 1, iAb
25db0 73 4c 65 76 65 6c 29 3b 0a 20 20 20 20 73 71 6c sLevel);. sql
25dc0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 46 ite3_bind_int(pF
25dd0 65 74 63 68 2c 20 32 2c 20 69 49 64 78 29 3b 0a etch, 2, iIdx);.
25de0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 if( SQLITE_R
25df0 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 OW==sqlite3_step
25e00 28 70 46 65 74 63 68 29 20 29 7b 0a 20 20 20 20 (pFetch) ){.
25e10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 52 const char *aR
25e20 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f oot = sqlite3_co
25e30 6c 75 6d 6e 5f 62 6c 6f 62 28 70 46 65 74 63 68 lumn_blob(pFetch
25e40 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 , 4);. int
25e50 6e 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f nRoot = sqlite3_
25e60 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 46 65 column_bytes(pFe
25e70 74 63 68 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 tch, 4);. i
25e80 4f 6c 64 53 74 61 72 74 20 3d 20 73 71 6c 69 74 OldStart = sqlit
25e90 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 e3_column_int64(
25ea0 70 46 65 74 63 68 2c 20 31 29 3b 0a 20 20 20 20 pFetch, 1);.
25eb0 20 20 72 63 20 3d 20 66 74 73 33 54 72 75 6e 63 rc = fts3Trunc
25ec0 61 74 65 4e 6f 64 65 28 61 52 6f 6f 74 2c 20 6e ateNode(aRoot, n
25ed0 52 6f 6f 74 2c 20 26 72 6f 6f 74 2c 20 7a 54 65 Root, &root, zTe
25ee0 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 69 42 6c 6f rm, nTerm, &iBlo
25ef0 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ck);. }. r
25f00 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 c2 = sqlite3_res
25f10 65 74 28 70 46 65 74 63 68 29 3b 0a 20 20 20 20 et(pFetch);.
25f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
25f30 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 K ) rc = rc2;.
25f40 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d }.. while( rc==
25f50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 42 6c SQLITE_OK && iBl
25f60 6f 63 6b 20 29 7b 0a 20 20 20 20 63 68 61 72 20 ock ){. char
25f70 2a 61 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 *aBlock = 0;.
25f80 20 69 6e 74 20 6e 42 6c 6f 63 6b 20 3d 20 30 3b int nBlock = 0;
25f90 0a 20 20 20 20 69 4e 65 77 53 74 61 72 74 20 3d . iNewStart =
25fa0 20 69 42 6c 6f 63 6b 3b 0a 0a 20 20 20 20 72 63 iBlock;.. rc
25fb0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 52 65 = sqlite3Fts3Re
25fc0 61 64 42 6c 6f 63 6b 28 70 2c 20 69 42 6c 6f 63 adBlock(p, iBloc
25fd0 6b 2c 20 26 61 42 6c 6f 63 6b 2c 20 26 6e 42 6c k, &aBlock, &nBl
25fe0 6f 63 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 ock, 0);. if(
25ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
26000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 {. rc = fts
26010 33 54 72 75 6e 63 61 74 65 4e 6f 64 65 28 61 42 3TruncateNode(aB
26020 6c 6f 63 6b 2c 20 6e 42 6c 6f 63 6b 2c 20 26 62 lock, nBlock, &b
26030 6c 6f 63 6b 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 lock, zTerm, nTe
26040 72 6d 2c 20 26 69 42 6c 6f 63 6b 29 3b 0a 20 20 rm, &iBlock);.
26050 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d }. if( rc==
26060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
26070 20 20 20 72 63 20 3d 20 66 74 73 33 57 72 69 74 rc = fts3Writ
26080 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 4e 65 77 eSegment(p, iNew
26090 53 74 61 72 74 2c 20 62 6c 6f 63 6b 2e 61 2c 20 Start, block.a,
260a0 62 6c 6f 63 6b 2e 6e 29 3b 0a 20 20 20 20 7d 0a block.n);. }.
260b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 sqlite3_free
260c0 28 61 42 6c 6f 63 6b 29 3b 0a 20 20 7d 0a 0a 20 (aBlock);. }..
260d0 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 /* Variable iNe
260e0 77 53 74 61 72 74 20 6e 6f 77 20 63 6f 6e 74 61 wStart now conta
260f0 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 76 61 ins the first va
26100 6c 69 64 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a lid leaf node. *
26110 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 /. if( rc==SQLI
26120 54 45 5f 4f 4b 20 26 26 20 69 4e 65 77 53 74 61 TE_OK && iNewSta
26130 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 rt ){. sqlite
26140 33 5f 73 74 6d 74 20 2a 70 44 65 6c 20 3d 20 30 3_stmt *pDel = 0
26150 3b 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 ;. rc = fts3S
26160 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 44 45 qlStmt(p, SQL_DE
26170 4c 45 54 45 5f 53 45 47 4d 45 4e 54 53 5f 52 41 LETE_SEGMENTS_RA
26180 4e 47 45 2c 20 26 70 44 65 6c 2c 20 30 29 3b 0a NGE, &pDel, 0);.
26190 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
261a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 TE_OK ){. s
261b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 qlite3_bind_int6
261c0 34 28 70 44 65 6c 2c 20 31 2c 20 69 4f 6c 64 53 4(pDel, 1, iOldS
261d0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c tart);. sql
261e0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 ite3_bind_int64(
261f0 70 44 65 6c 2c 20 32 2c 20 69 4e 65 77 53 74 61 pDel, 2, iNewSta
26200 72 74 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c rt-1);. sql
26210 69 74 65 33 5f 73 74 65 70 28 70 44 65 6c 29 3b ite3_step(pDel);
26220 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 . rc = sqli
26230 74 65 33 5f 72 65 73 65 74 28 70 44 65 6c 29 3b te3_reset(pDel);
26240 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 . }. }.. if
26250 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
26260 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 ){. sqlite3_s
26270 74 6d 74 20 2a 70 43 68 6f 6d 70 20 3d 20 30 3b tmt *pChomp = 0;
26280 0a 20 20 20 20 72 63 20 3d 20 66 74 73 33 53 71 . rc = fts3Sq
26290 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 43 48 4f lStmt(p, SQL_CHO
262a0 4d 50 5f 53 45 47 44 49 52 2c 20 26 70 43 68 6f MP_SEGDIR, &pCho
262b0 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 mp, 0);. if(
262c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
262d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 . sqlite3_b
262e0 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 6f 6d 70 ind_int64(pChomp
262f0 2c 20 31 2c 20 69 4e 65 77 53 74 61 72 74 29 3b , 1, iNewStart);
26300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 . sqlite3_b
26310 69 6e 64 5f 62 6c 6f 62 28 70 43 68 6f 6d 70 2c ind_blob(pChomp,
26320 20 32 2c 20 72 6f 6f 74 2e 61 2c 20 72 6f 6f 74 2, root.a, root
26330 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 .n, SQLITE_STATI
26340 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 C);. sqlite
26350 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 43 68 3_bind_int64(pCh
26360 6f 6d 70 2c 20 33 2c 20 69 41 62 73 4c 65 76 65 omp, 3, iAbsLeve
26370 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 l);. sqlite
26380 33 5f 62 69 6e 64 5f 69 6e 74 28 70 43 68 6f 6d 3_bind_int(pChom
26390 70 2c 20 34 2c 20 69 49 64 78 29 3b 0a 20 20 20 p, 4, iIdx);.
263a0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 sqlite3_step(
263b0 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 20 20 72 pChomp);. r
263c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 c = sqlite3_rese
263d0 74 28 70 43 68 6f 6d 70 29 3b 0a 20 20 20 20 7d t(pChomp);. }
263e0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f . }.. sqlite3_
263f0 66 72 65 65 28 72 6f 6f 74 2e 61 29 3b 0a 20 20 free(root.a);.
26400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62 6c 6f sqlite3_free(blo
26410 63 6b 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 ck.a);. return
26420 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 rc;.}../*.** Thi
26430 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 s function is ca
26440 6c 6c 65 64 20 61 66 74 65 72 20 61 6e 20 69 6e lled after an in
26450 63 72 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 6f crmental-merge o
26460 70 65 72 61 74 69 6f 6e 20 68 61 73 20 72 75 6e peration has run
26470 20 74 6f 0a 2a 2a 20 6d 65 72 67 65 20 28 6f 72 to.** merge (or
26480 20 70 61 72 74 69 61 6c 6c 79 20 6d 65 72 67 65 partially merge
26490 29 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 ) two or more se
264a0 67 6d 65 6e 74 73 20 66 72 6f 6d 20 61 62 73 6f gments from abso
264b0 6c 75 74 65 20 6c 65 76 65 6c 0a 2a 2a 20 69 41 lute level.** iA
264c0 62 73 4c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 45 bsLevel..**.** E
264d0 61 63 68 20 69 6e 70 75 74 20 73 65 67 6d 65 6e ach input segmen
264e0 74 20 69 73 20 65 69 74 68 65 72 20 72 65 6d 6f t is either remo
264f0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 62 20 ved from the db
26500 63 6f 6d 70 6c 65 74 65 6c 79 20 28 69 66 20 61 completely (if a
26510 6c 6c 20 6f 66 0a 2a 2a 20 69 74 73 20 64 61 74 ll of.** its dat
26520 61 20 77 61 73 20 63 6f 70 69 65 64 20 74 6f 20 a was copied to
26530 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 the output segme
26540 6e 74 20 62 79 20 74 68 65 20 69 6e 63 72 6d 65 nt by the incrme
26550 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 29 0a 2a rge operation).*
26560 2a 20 6f 72 20 6d 6f 64 69 66 69 65 64 20 69 6e * or modified in
26570 20 70 6c 61 63 65 20 73 6f 20 74 68 61 74 20 69 place so that i
26580 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 74 t no longer cont
26590 61 69 6e 73 20 74 68 6f 73 65 20 65 6e 74 72 69 ains those entri
265a0 65 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 es that.** have
265b0 62 65 65 6e 20 64 75 70 6c 69 63 61 74 65 64 20 been duplicated
265c0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 in the output se
265d0 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 gment..*/.static
265e0 20 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 int fts3Incrmer
265f0 67 65 43 68 6f 6d 70 28 0a 20 20 46 74 73 33 54 geChomp(. Fts3T
26600 61 62 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 able *p,
26610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 /* FT
26620 53 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a S table handle *
26630 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 /. sqlite3_int6
26640 34 20 69 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 4 iAbsLevel,
26650 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 /* Absolute
26660 6c 65 76 65 6c 20 63 6f 6e 74 61 69 6e 69 6e 67 level containing
26670 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 segments */. F
26680 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 65 ts3MultiSegReade
26690 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 2f r *pCsr, /
266a0 2a 20 43 68 6f 6d 70 20 61 6c 6c 20 73 65 67 6d * Chomp all segm
266b0 65 6e 74 73 20 6f 70 65 6e 65 64 20 62 79 20 74 ents opened by t
266c0 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 his cursor */.
266d0 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 int *pnRem
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
266f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 /* Number of seg
26700 6d 65 6e 74 73 20 6e 6f 74 20 64 65 6c 65 74 65 ments not delete
26710 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b d */.){. int i;
26720 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 30 3b . int nRem = 0;
26730 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
26740 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d TE_OK;.. for(i=
26750 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 2d 31 pCsr->nSegment-1
26760 3b 20 69 3e 3d 30 20 26 26 20 72 63 3d 3d 53 51 ; i>=0 && rc==SQ
26770 4c 49 54 45 5f 4f 4b 3b 20 69 2d 2d 29 7b 0a 20 LITE_OK; i--){.
26780 20 20 20 46 74 73 33 53 65 67 52 65 61 64 65 72 Fts3SegReader
26790 20 2a 70 53 65 67 20 3d 20 30 3b 0a 20 20 20 20 *pSeg = 0;.
267a0 69 6e 74 20 6a 3b 0a 0a 20 20 20 20 2f 2a 20 46 int j;.. /* F
267b0 69 6e 64 20 74 68 65 20 46 74 73 33 53 65 67 52 ind the Fts3SegR
267c0 65 61 64 65 72 20 6f 62 6a 65 63 74 20 77 69 74 eader object wit
267d0 68 20 46 74 73 33 53 65 67 52 65 61 64 65 72 2e h Fts3SegReader.
267e0 69 49 64 78 3d 3d 69 2e 20 49 74 20 69 73 20 68 iIdx==i. It is h
267f0 69 64 69 6e 67 0a 20 20 20 20 2a 2a 20 73 6f 6d iding. ** som
26800 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 70 43 ewhere in the pC
26810 73 72 2d 3e 61 70 53 65 67 6d 65 6e 74 5b 5d 20 sr->apSegment[]
26820 61 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 66 array. */. f
26830 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a or(j=0; ALWAYS(j
26840 3c 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 29 <pCsr->nSegment)
26850 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 53 ; j++){. pS
26860 65 67 20 3d 20 70 43 73 72 2d 3e 61 70 53 65 67 eg = pCsr->apSeg
26870 6d 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 ment[j];. i
26880 66 28 20 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 f( pSeg->iIdx==i
26890 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a ) break;. }.
268a0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 43 assert( j<pC
268b0 73 72 2d 3e 6e 53 65 67 6d 65 6e 74 20 26 26 20 sr->nSegment &&
268c0 70 53 65 67 2d 3e 69 49 64 78 3d 3d 69 20 29 3b pSeg->iIdx==i );
268d0 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e .. if( pSeg->
268e0 61 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 aNode==0 ){.
268f0 20 20 2f 2a 20 53 65 67 2d 72 65 61 64 65 72 20 /* Seg-reader
26900 69 73 20 61 74 20 45 4f 46 2e 20 52 65 6d 6f 76 is at EOF. Remov
26910 65 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 e the entire inp
26920 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 ut segment. */.
26930 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 65 rc = fts3De
26940 6c 65 74 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 leteSegment(p, p
26950 53 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 Seg);. if(
26960 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
26970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 . rc = ft
26980 73 33 52 65 6d 6f 76 65 53 65 67 64 69 72 45 6e s3RemoveSegdirEn
26990 74 72 79 28 70 2c 20 69 41 62 73 4c 65 76 65 6c try(p, iAbsLevel
269a0 2c 20 70 53 65 67 2d 3e 69 49 64 78 29 3b 0a 20 , pSeg->iIdx);.
269b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e }. *pn
269c0 52 65 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c Rem = 0;. }el
269d0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 se{. /* The
269e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 incremental mer
269f0 67 65 20 64 69 64 20 6e 6f 74 20 63 6f 70 79 20 ge did not copy
26a00 61 6c 6c 20 74 68 65 20 64 61 74 61 20 66 72 6f all the data fro
26a10 6d 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a m this . **
26a20 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 segment to the
26a30 75 70 70 65 72 20 6c 65 76 65 6c 2e 20 54 68 65 upper level. The
26a40 20 73 65 67 6d 65 6e 74 20 69 73 20 6d 6f 64 69 segment is modi
26a50 66 69 65 64 20 69 6e 20 70 6c 61 63 65 0a 20 20 fied in place.
26a60 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 ** so that i
26a70 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6b 65 t contains no ke
26a80 79 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 ys smaller than
26a90 7a 54 65 72 6d 2f 6e 54 65 72 6d 2e 20 2a 2f 20 zTerm/nTerm. */
26aa0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 . const cha
26ab0 72 20 2a 7a 54 65 72 6d 20 3d 20 70 53 65 67 2d r *zTerm = pSeg-
26ac0 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e >zTerm;. in
26ad0 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e t nTerm = pSeg->
26ae0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 72 63 20 nTerm;. rc
26af0 3d 20 66 74 73 33 54 72 75 6e 63 61 74 65 53 65 = fts3TruncateSe
26b00 67 6d 65 6e 74 28 70 2c 20 69 41 62 73 4c 65 76 gment(p, iAbsLev
26b10 65 6c 2c 20 70 53 65 67 2d 3e 69 49 64 78 2c 20 el, pSeg->iIdx,
26b20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 zTerm, nTerm);.
26b30 20 20 20 20 20 6e 52 65 6d 2b 2b 3b 0a 20 20 20 nRem++;.
26b40 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 }. }.. if( rc
26b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e ==SQLITE_OK && n
26b60 52 65 6d 21 3d 70 43 73 72 2d 3e 6e 53 65 67 6d Rem!=pCsr->nSegm
26b70 65 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 ent ){. rc =
26b80 66 74 73 33 52 65 70 61 63 6b 53 65 67 64 69 72 fts3RepackSegdir
26b90 4c 65 76 65 6c 28 70 2c 20 69 41 62 73 4c 65 76 Level(p, iAbsLev
26ba0 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 52 el);. }.. *pnR
26bb0 65 6d 20 3d 20 6e 52 65 6d 3b 0a 20 20 72 65 74 em = nRem;. ret
26bc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
26bd0 20 53 74 6f 72 65 20 61 6e 20 69 6e 63 72 2d 6d Store an incr-m
26be0 65 72 67 65 20 68 69 6e 74 20 69 6e 20 74 68 65 erge hint in the
26bf0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 database..*/.st
26c00 61 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 atic int fts3Inc
26c10 72 6d 65 72 67 65 48 69 6e 74 53 74 6f 72 65 28 rmergeHintStore(
26c20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c Fts3Table *p, Bl
26c30 6f 62 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 ob *pHint){. sq
26c40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 52 65 70 lite3_stmt *pRep
26c50 6c 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 lace = 0;. int
26c60 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rc;
26c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
26c80 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 eturn code */..
26c90 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 6d rc = fts3SqlStm
26ca0 74 28 70 2c 20 53 51 4c 5f 52 45 50 4c 41 43 45 t(p, SQL_REPLACE
26cb0 5f 53 54 41 54 2c 20 26 70 52 65 70 6c 61 63 65 _STAT, &pReplace
26cc0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d , 0);. if( rc==
26cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
26ce0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
26cf0 74 28 70 52 65 70 6c 61 63 65 2c 20 31 2c 20 46 t(pReplace, 1, F
26d00 54 53 5f 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 TS_STAT_INCRMERG
26d10 45 48 49 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 EHINT);. sqli
26d20 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 52 te3_bind_blob(pR
26d30 65 70 6c 61 63 65 2c 20 32 2c 20 70 48 69 6e 74 eplace, 2, pHint
26d40 2d 3e 61 2c 20 70 48 69 6e 74 2d 3e 6e 2c 20 53 ->a, pHint->n, S
26d50 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 QLITE_STATIC);.
26d60 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 sqlite3_step(
26d70 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 72 pReplace);. r
26d80 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 c = sqlite3_rese
26d90 74 28 70 52 65 70 6c 61 63 65 29 3b 0a 20 20 7d t(pReplace);. }
26da0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d .. return rc;.}
26db0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 6e 20 ../*.** Load an
26dc0 69 6e 63 72 2d 6d 65 72 67 65 20 68 69 6e 74 20 incr-merge hint
26dd0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
26de0 65 2e 20 54 68 65 20 69 6e 63 72 2d 6d 65 72 67 e. The incr-merg
26df0 65 20 68 69 6e 74 2c 20 69 66 20 6f 6e 65 20 0a e hint, if one .
26e00 2a 2a 20 65 78 69 73 74 73 2c 20 69 73 20 73 74 ** exists, is st
26e10 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 77 69 ored in the rowi
26e20 64 3d 3d 31 20 72 6f 77 20 6f 66 20 74 68 65 20 d==1 row of the
26e30 25 5f 73 74 61 74 20 74 61 62 6c 65 2e 0a 2a 2a %_stat table..**
26e40 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 .** If successfu
26e50 6c 2c 20 70 6f 70 75 6c 61 74 65 20 62 6c 6f 62 l, populate blob
26e60 20 2a 70 48 69 6e 74 20 77 69 74 68 20 74 68 65 *pHint with the
26e70 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d value read from
26e80 20 74 68 65 20 25 5f 73 74 61 74 0a 2a 2a 20 74 the %_stat.** t
26e90 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 able and return
26ea0 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 SQLITE_OK. Other
26eb0 77 69 73 65 2c 20 69 66 20 61 6e 20 65 72 72 6f wise, if an erro
26ec0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e r occurs, return
26ed0 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 an.** SQLite er
26ee0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 ror code..*/.sta
26ef0 74 69 63 20 69 6e 74 20 66 74 73 33 49 6e 63 72 tic int fts3Incr
26f00 6d 65 72 67 65 48 69 6e 74 4c 6f 61 64 28 46 74 mergeHintLoad(Ft
26f10 73 33 54 61 62 6c 65 20 2a 70 2c 20 42 6c 6f 62 s3Table *p, Blob
26f20 20 2a 70 48 69 6e 74 29 7b 0a 20 20 73 71 6c 69 *pHint){. sqli
26f30 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 te3_stmt *pSelec
26f40 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b t = 0;. int rc;
26f50 0a 0a 20 20 70 48 69 6e 74 2d 3e 6e 20 3d 20 30 .. pHint->n = 0
26f60 3b 0a 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c ;. rc = fts3Sql
26f70 53 74 6d 74 28 70 2c 20 53 51 4c 5f 53 45 4c 45 Stmt(p, SQL_SELE
26f80 43 54 5f 53 54 41 54 2c 20 26 70 53 65 6c 65 63 CT_STAT, &pSelec
26f90 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d t, 0);. if( rc=
26fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
26fb0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 int rc2;. s
26fc0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 qlite3_bind_int(
26fd0 70 53 65 6c 65 63 74 2c 20 31 2c 20 46 54 53 5f pSelect, 1, FTS_
26fe0 53 54 41 54 5f 49 4e 43 52 4d 45 52 47 45 48 49 STAT_INCRMERGEHI
26ff0 4e 54 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c NT);. if( SQL
27000 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 ITE_ROW==sqlite3
27010 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29 _step(pSelect) )
27020 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 {. const ch
27030 61 72 20 2a 61 48 69 6e 74 20 3d 20 73 71 6c 69 ar *aHint = sqli
27040 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 te3_column_blob(
27050 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 pSelect, 0);.
27060 20 20 20 69 6e 74 20 6e 48 69 6e 74 20 3d 20 73 int nHint = s
27070 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 qlite3_column_by
27080 74 65 73 28 70 53 65 6c 65 63 74 2c 20 30 29 3b tes(pSelect, 0);
27090 0a 20 20 20 20 20 20 69 66 28 20 61 48 69 6e 74 . if( aHint
270a0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 ){. blob
270b0 47 72 6f 77 42 75 66 66 65 72 28 70 48 69 6e 74 GrowBuffer(pHint
270c0 2c 20 6e 48 69 6e 74 2c 20 26 72 63 29 3b 0a 20 , nHint, &rc);.
270d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 if( rc==S
270e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
270f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 memcpy(pHi
27100 6e 74 2d 3e 61 2c 20 61 48 69 6e 74 2c 20 6e 48 nt->a, aHint, nH
27110 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 int);.
27120 70 48 69 6e 74 2d 3e 6e 20 3d 20 6e 48 69 6e 74 pHint->n = nHint
27130 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
27140 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 }. }. rc
27150 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 2 = sqlite3_rese
27160 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 t(pSelect);.
27170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
27180 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 K ) rc = rc2;.
27190 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a }.. return rc;.
271a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 }../*.** If *pRc
271b0 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f is not SQLITE_O
271c0 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 K when this func
271d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 tion is called,
271e0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a it is a no-op..*
271f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 70 70 * Otherwise, app
27200 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 end an entry to
27210 74 68 65 20 68 69 6e 74 20 73 74 6f 72 65 64 20 the hint stored
27220 69 6e 20 62 6c 6f 62 20 2a 70 48 69 6e 74 2e 20 in blob *pHint.
27230 45 61 63 68 20 65 6e 74 72 79 0a 2a 2a 20 63 6f Each entry.** co
27240 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 76 61 nsists of two va
27250 72 69 6e 74 73 2c 20 74 68 65 20 61 62 73 6f 6c rints, the absol
27260 75 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 ute level number
27270 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 65 of the input se
27280 67 6d 65 6e 74 73 20 0a 2a 2a 20 61 6e 64 20 74 gments .** and t
27290 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 he number of inp
272a0 75 74 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a ut segments..**.
272b0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c ** If successful
272c0 2c 20 6c 65 61 76 65 20 2a 70 52 63 20 73 65 74 , leave *pRc set
272d0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e to SQLITE_OK an
272e0 64 20 72 65 74 75 72 6e 2e 20 49 66 20 61 6e 20 d return. If an
272f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a error occurs,.**
27300 20 73 65 74 20 2a 70 52 63 20 74 6f 20 61 6e 20 set *pRc to an
27310 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 SQLite error cod
27320 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 e before returni
27330 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ng..*/.static vo
27340 69 64 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 id fts3Incrmerge
27350 48 69 6e 74 50 75 73 68 28 0a 20 20 42 6c 6f 62 HintPush(. Blob
27360 20 2a 70 48 69 6e 74 2c 20 20 20 20 20 20 20 20 *pHint,
27370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 /* H
27380 69 6e 74 20 62 6c 6f 62 20 74 6f 20 61 70 70 65 int blob to appe
27390 6e 64 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 nd to */. i64 i
273a0 41 62 73 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 AbsLevel,
273b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 /* Fi
273c0 72 73 74 20 76 61 72 69 6e 74 20 74 6f 20 73 74 rst varint to st
273d0 6f 72 65 20 69 6e 20 68 69 6e 74 20 2a 2f 0a 20 ore in hint */.
273e0 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20 20 20 int nInput,
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27400 20 2f 2a 20 53 65 63 6f 6e 64 20 76 61 72 69 6e /* Second varin
27410 74 20 74 6f 20 73 74 6f 72 65 20 69 6e 20 68 69 t to store in hi
27420 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 63 nt */. int *pRc
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27440 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 /* IN/OU
27450 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f T: Error code */
27460 0a 29 7b 0a 20 20 62 6c 6f 62 47 72 6f 77 42 75 .){. blobGrowBu
27470 66 66 65 72 28 70 48 69 6e 74 2c 20 70 48 69 6e ffer(pHint, pHin
27480 74 2d 3e 6e 20 2b 20 32 2a 46 54 53 33 5f 56 41 t->n + 2*FTS3_VA
27490 52 49 4e 54 5f 4d 41 58 2c 20 70 52 63 29 3b 0a RINT_MAX, pRc);.
274a0 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 if( *pRc==SQLI
274b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 48 69 TE_OK ){. pHi
274c0 6e 74 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 nt->n += sqlite3
274d0 46 74 73 33 50 75 74 56 61 72 69 6e 74 28 26 70 Fts3PutVarint(&p
274e0 48 69 6e 74 2d 3e 61 5b 70 48 69 6e 74 2d 3e 6e Hint->a[pHint->n
274f0 5d 2c 20 69 41 62 73 4c 65 76 65 6c 29 3b 0a 20 ], iAbsLevel);.
27500 20 20 20 70 48 69 6e 74 2d 3e 6e 20 2b 3d 20 73 pHint->n += s
27510 71 6c 69 74 65 33 46 74 73 33 50 75 74 56 61 72 qlite3Fts3PutVar
27520 69 6e 74 28 26 70 48 69 6e 74 2d 3e 61 5b 70 48 int(&pHint->a[pH
27530 69 6e 74 2d 3e 6e 5d 2c 20 28 69 36 34 29 6e 49 int->n], (i64)nI
27540 6e 70 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a nput);. }.}../*
27550 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6c 61 73 .** Read the las
27560 74 20 65 6e 74 72 79 20 28 6d 6f 73 74 20 72 65 t entry (most re
27570 63 65 6e 74 6c 79 20 70 75 73 68 65 64 29 20 66 cently pushed) f
27580 72 6f 6d 20 74 68 65 20 68 69 6e 74 20 62 6c 6f rom the hint blo
27590 62 20 2a 70 48 69 6e 74 0a 2a 2a 20 61 6e 64 20 b *pHint.** and
275a0 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 then remove the
275b0 65 6e 74 72 79 2e 20 57 72 69 74 65 20 74 68 65 entry. Write the
275c0 20 74 77 6f 20 76 61 6c 75 65 73 20 72 65 61 64 two values read
275d0 20 74 6f 20 2a 70 69 41 62 73 4c 65 76 65 6c 20 to *piAbsLevel
275e0 61 6e 64 20 0a 2a 2a 20 2a 70 6e 49 6e 70 75 74 and .** *pnInput
275f0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e before returnin
27600 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 g..**.** If no e
27610 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 rror occurs, ret
27620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 urn SQLITE_OK. I
27630 66 20 74 68 65 20 68 69 6e 74 20 62 6c 6f 62 20 f the hint blob
27640 69 6e 20 2a 70 48 69 6e 74 20 64 6f 65 73 0a 2a in *pHint does.*
27650 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 74 * not contain at
27660 20 6c 65 61 73 74 20 74 77 6f 20 76 61 6c 69 64 least two valid
27670 20 76 61 72 69 6e 74 73 2c 20 72 65 74 75 72 6e varints, return
27680 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f SQLITE_CORRUPT_
27690 56 54 41 42 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 VTAB..*/.static
276a0 69 6e 74 20 66 74 73 33 49 6e 63 72 6d 65 72 67 int fts3Incrmerg
276b0 65 48 69 6e 74 50 6f 70 28 42 6c 6f 62 20 2a 70 eHintPop(Blob *p
276c0 48 69 6e 74 2c 20 69 36 34 20 2a 70 69 41 62 73 Hint, i64 *piAbs
276d0 4c 65 76 65 6c 2c 20 69 6e 74 20 2a 70 6e 49 6e Level, int *pnIn
276e0 70 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e put){. const in
276f0 74 20 6e 48 69 6e 74 20 3d 20 70 48 69 6e 74 2d t nHint = pHint-
27700 3e 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 >n;. int i;..
27710 69 20 3d 20 70 48 69 6e 74 2d 3e 6e 2d 32 3b 0a i = pHint->n-2;.
27720 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 while( i>0 &&
27730 28 70 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 (pHint->a[i-1] &
27740 20 30 78 38 30 29 20 29 20 69 2d 2d 3b 0a 20 20 0x80) ) i--;.
27750 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 28 70 while( i>0 && (p
27760 48 69 6e 74 2d 3e 61 5b 69 2d 31 5d 20 26 20 30 Hint->a[i-1] & 0
27770 78 38 30 29 20 29 20 69 2d 2d 3b 0a 0a 20 20 70 x80) ) i--;.. p
27780 48 69 6e 74 2d 3e 6e 20 3d 20 69 3b 0a 20 20 69 Hint->n = i;. i
27790 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 += sqlite3Fts3G
277a0 65 74 56 61 72 69 6e 74 28 26 70 48 69 6e 74 2d etVarint(&pHint-
277b0 3e 61 5b 69 5d 2c 20 70 69 41 62 73 4c 65 76 65 >a[i], piAbsLeve
277c0 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 33 47 l);. i += fts3G
277d0 65 74 56 61 72 69 6e 74 33 32 28 26 70 48 69 6e etVarint32(&pHin
277e0 74 2d 3e 61 5b 69 5d 2c 20 70 6e 49 6e 70 75 74 t->a[i], pnInput
277f0 29 3b 0a 20 20 69 66 28 20 69 21 3d 6e 48 69 6e );. if( i!=nHin
27800 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 t ) return SQLIT
27810 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a E_CORRUPT_VTAB;.
27820 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
27830 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 _OK;.}.../*.** A
27840 74 74 65 6d 70 74 20 61 6e 20 69 6e 63 72 65 6d ttempt an increm
27850 65 6e 74 61 6c 20 6d 65 72 67 65 20 74 68 61 74 ental merge that
27860 20 77 72 69 74 65 73 20 6e 4d 65 72 67 65 20 6c writes nMerge l
27870 65 61 66 20 62 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a eaf blocks..**.*
27880 2a 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 * Incremental me
27890 72 67 65 73 20 68 61 70 70 65 6e 20 6e 4d 69 6e rges happen nMin
278a0 20 73 65 67 6d 65 6e 74 73 20 61 74 20 61 20 74 segments at a t
278b0 69 6d 65 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 ime. The segment
278c0 73 20 0a 2a 2a 20 74 6f 20 62 65 20 6d 65 72 67 s .** to be merg
278d0 65 64 20 61 72 65 20 74 68 65 20 6e 4d 69 6e 20 ed are the nMin
278e0 6f 6c 64 65 73 74 20 73 65 67 6d 65 6e 74 73 20 oldest segments
278f0 28 74 68 65 20 6f 6e 65 73 20 77 69 74 68 20 74 (the ones with t
27900 68 65 20 73 6d 61 6c 6c 65 73 74 20 0a 2a 2a 20 he smallest .**
27910 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 5f values for the _
27920 73 65 67 64 69 72 2e 69 64 78 20 66 69 65 6c 64 segdir.idx field
27930 29 20 69 6e 20 74 68 65 20 68 69 67 68 65 73 74 ) in the highest
27940 20 6c 65 76 65 6c 20 74 68 61 74 20 63 6f 6e 74 level that cont
27950 61 69 6e 73 20 0a 2a 2a 20 61 74 20 6c 65 61 73 ains .** at leas
27960 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 2e t nMin segments.
27970 20 4d 75 6c 74 69 70 6c 65 20 6d 65 72 67 65 73 Multiple merges
27980 20 6d 69 67 68 74 20 6f 63 63 75 72 20 69 6e 20 might occur in
27990 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a an attempt to .*
279a0 2a 20 77 72 69 74 65 20 74 68 65 20 71 75 6f 74 * write the quot
279b0 61 20 6f 66 20 6e 4d 65 72 67 65 20 6c 65 61 66 a of nMerge leaf
279c0 20 62 6c 6f 63 6b 73 2e 0a 2a 2f 0a 69 6e 74 20 blocks..*/.int
279d0 73 71 6c 69 74 65 33 46 74 73 33 49 6e 63 72 6d sqlite3Fts3Incrm
279e0 65 72 67 65 28 46 74 73 33 54 61 62 6c 65 20 2a erge(Fts3Table *
279f0 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 69 p, int nMerge, i
27a00 6e 74 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 nt nMin){. int
27a10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rc;
27a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
27a30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 eturn code */.
27a40 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 4d 65 72 67 int nRem = nMerg
27a50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
27a60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 /* Number of lea
27a70 66 20 70 61 67 65 73 20 79 65 74 20 74 6f 20 20 f pages yet to
27a80 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 be written */.
27a90 46 74 73 33 4d 75 6c 74 69 53 65 67 52 65 61 64 Fts3MultiSegRead
27aa0 65 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 er *pCsr;
27ab0 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20 74 /* Cursor used t
27ac0 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 o read input dat
27ad0 61 20 2a 2f 0a 20 20 46 74 73 33 53 65 67 46 69 a */. Fts3SegFi
27ae0 6c 74 65 72 20 2a 70 46 69 6c 74 65 72 3b 20 20 lter *pFilter;
27af0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 74 65 72 /* Filter
27b00 20 75 73 65 64 20 77 69 74 68 20 63 75 72 73 6f used with curso
27b10 72 20 70 43 73 72 20 2a 2f 0a 20 20 49 6e 63 72 r pCsr */. Incr
27b20 6d 65 72 67 65 57 72 69 74 65 72 20 2a 70 57 72 mergeWriter *pWr
27b30 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 57 iter; /* W
27b40 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a riter object */.
27b50 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 int nSeg = 0;
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27b70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 /* Number of i
27b80 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f nput segments */
27b90 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 . sqlite3_int64
27ba0 20 69 41 62 73 4c 65 76 65 6c 20 3d 20 30 3b 20 iAbsLevel = 0;
27bb0 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 6c /* Absolute l
27bc0 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 77 evel number to w
27bd0 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 42 6c 6f 62 ork on */. Blob
27be0 20 68 69 6e 74 20 3d 20 7b 30 2c 20 30 2c 20 30 hint = {0, 0, 0
27bf0 7d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 }; /* H
27c00 69 6e 74 20 72 65 61 64 20 66 72 6f 6d 20 25 5f int read from %_
27c10 73 74 61 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 stat table */.
27c20 69 6e 74 20 62 44 69 72 74 79 48 69 6e 74 20 3d int bDirtyHint =
27c30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
27c40 2f 2a 20 54 72 75 65 20 69 66 20 62 6c 6f 62 20 /* True if blob
27c50 27 68 69 6e 74 27 20 68 61 73 20 62 65 65 6e 20 'hint' has been
27c60 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 0a 20 20 2f modified */.. /
27c70 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 * Allocate space
27c80 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72 2c for the cursor,
27c90 20 66 69 6c 74 65 72 20 61 6e 64 20 77 72 69 74 filter and writ
27ca0 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 er objects */.
27cb0 63 6f 6e 73 74 20 69 6e 74 20 6e 41 6c 6c 6f 63 const int nAlloc
27cc0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 43 73 72 29 = sizeof(*pCsr)
27cd0 20 2b 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 74 + sizeof(*pFilt
27ce0 65 72 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 57 er) + sizeof(*pW
27cf0 72 69 74 65 72 29 3b 0a 20 20 70 57 72 69 74 65 riter);. pWrite
27d00 72 20 3d 20 28 49 6e 63 72 6d 65 72 67 65 57 72 r = (IncrmergeWr
27d10 69 74 65 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d iter *)sqlite3_m
27d20 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 alloc(nAlloc);.
27d30 20 69 66 28 20 21 70 57 72 69 74 65 72 20 29 20 if( !pWriter )
27d40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f return SQLITE_NO
27d50 4d 45 4d 3b 0a 20 20 70 46 69 6c 74 65 72 20 3d MEM;. pFilter =
27d60 20 28 46 74 73 33 53 65 67 46 69 6c 74 65 72 20 (Fts3SegFilter
27d70 2a 29 26 70 57 72 69 74 65 72 5b 31 5d 3b 0a 20 *)&pWriter[1];.
27d80 20 70 43 73 72 20 3d 20 28 46 74 73 33 4d 75 6c pCsr = (Fts3Mul
27d90 74 69 53 65 67 52 65 61 64 65 72 20 2a 29 26 70 tiSegReader *)&p
27da0 46 69 6c 74 65 72 5b 31 5d 3b 0a 0a 20 20 72 63 Filter[1];.. rc
27db0 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 = fts3Incrmerge
27dc0 48 69 6e 74 4c 6f 61 64 28 70 2c 20 26 68 69 6e HintLoad(p, &hin
27dd0 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d t);. while( rc=
27de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 52 =SQLITE_OK && nR
27df0 65 6d 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 em>0 ){. cons
27e00 74 20 69 36 34 20 6e 4d 6f 64 20 3d 20 46 54 53 t i64 nMod = FTS
27e10 33 5f 53 45 47 44 49 52 5f 4d 41 58 4c 45 56 45 3_SEGDIR_MAXLEVE
27e20 4c 20 2a 20 70 2d 3e 6e 49 6e 64 65 78 3b 0a 20 L * p->nIndex;.
27e30 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 sqlite3_stmt
27e40 2a 70 46 69 6e 64 4c 65 76 65 6c 20 3d 20 30 3b *pFindLevel = 0;
27e50 20 2f 2a 20 53 51 4c 20 75 73 65 64 20 74 6f 20 /* SQL used to
27e60 64 65 74 65 72 6d 69 6e 65 20 69 41 62 73 4c 65 determine iAbsLe
27e70 76 65 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 vel */. int b
27e80 55 73 65 48 69 6e 74 20 3d 20 30 3b 20 20 20 20 UseHint = 0;
27e90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
27ea0 20 69 66 20 61 74 74 65 6d 70 74 69 6e 67 20 74 if attempting t
27eb0 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 20 20 o append */.
27ec0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20 20 20 int iIdx = 0;
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
27ee0 20 4c 61 72 67 65 73 74 20 69 64 78 20 69 6e 20 Largest idx in
27ef0 6c 65 76 65 6c 20 28 69 41 62 73 4c 65 76 65 6c level (iAbsLevel
27f00 2b 31 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 +1) */.. /* S
27f10 65 61 72 63 68 20 74 68 65 20 25 5f 73 65 67 64 earch the %_segd
27f20 69 72 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 ir table for the
27f30 20 61 62 73 6f 6c 75 74 65 20 6c 65 76 65 6c 20 absolute level
27f40 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 with the smalles
27f50 74 0a 20 20 20 20 2a 2a 20 72 65 6c 61 74 69 76 t. ** relativ
27f60 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 74 e level number t
27f70 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 hat contains at
27f80 6c 65 61 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 least nMin segme
27f90 6e 74 73 2c 20 69 66 20 61 6e 79 2e 0a 20 20 20 nts, if any..
27fa0 20 2a 2a 20 49 66 20 6f 6e 65 20 69 73 20 66 6f ** If one is fo
27fb0 75 6e 64 2c 20 73 65 74 20 69 41 62 73 4c 65 76 und, set iAbsLev
27fc0 65 6c 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 el to the absolu
27fd0 74 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 te level number
27fe0 61 6e 64 0a 20 20 20 20 2a 2a 20 6e 53 65 67 20 and. ** nSeg
27ff0 74 6f 20 6e 4d 69 6e 2e 20 49 66 20 6e 6f 20 6c to nMin. If no l
28000 65 76 65 6c 20 77 69 74 68 20 61 74 20 6c 65 61 evel with at lea
28010 73 74 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 73 st nMin segments
28020 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 0a can be found, .
28030 20 20 20 20 2a 2a 20 73 65 74 20 6e 53 65 67 20 ** set nSeg
28040 74 6f 20 2d 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 to -1.. */.
28050 20 20 72 63 20 3d 20 66 74 73 33 53 71 6c 53 74 rc = fts3SqlSt
28060 6d 74 28 70 2c 20 53 51 4c 5f 46 49 4e 44 5f 4d mt(p, SQL_FIND_M
28070 45 52 47 45 5f 4c 45 56 45 4c 2c 20 26 70 46 69 ERGE_LEVEL, &pFi
28080 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 20 20 ndLevel, 0);.
28090 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e sqlite3_bind_in
280a0 74 28 70 46 69 6e 64 4c 65 76 65 6c 2c 20 31 2c t(pFindLevel, 1,
280b0 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 nMin);. if(
280c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 46 69 sqlite3_step(pFi
280d0 6e 64 4c 65 76 65 6c 29 3d 3d 53 51 4c 49 54 45 ndLevel)==SQLITE
280e0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 41 _ROW ){. iA
280f0 62 73 4c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 bsLevel = sqlite
28100 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 3_column_int64(p
28110 46 69 6e 64 4c 65 76 65 6c 2c 20 30 29 3b 0a 20 FindLevel, 0);.
28120 20 20 20 20 20 6e 53 65 67 20 3d 20 6e 4d 69 6e nSeg = nMin
28130 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
28140 20 20 20 6e 53 65 67 20 3d 20 2d 31 3b 0a 20 20 nSeg = -1;.
28150 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c }. rc = sql
28160 69 74 65 33 5f 72 65 73 65 74 28 70 46 69 6e 64 ite3_reset(pFind
28170 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 Level);.. /*
28180 49 66 20 74 68 65 20 68 69 6e 74 20 72 65 61 64 If the hint read
28190 20 66 72 6f 6d 20 74 68 65 20 25 5f 73 74 61 74 from the %_stat
281a0 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 65 6d table is not em
281b0 70 74 79 2c 20 63 68 65 63 6b 20 69 66 20 74 68 pty, check if th
281c0 65 0a 20 20 20 20 2a 2a 20 6c 61 73 74 20 65 6e e. ** last en
281d0 74 72 79 20 69 6e 20 69 74 20 73 70 65 63 69 66 try in it specif
281e0 69 65 73 20 61 20 72 65 6c 61 74 69 76 65 20 6c ies a relative l
281f0 65 76 65 6c 20 73 6d 61 6c 6c 65 72 20 74 68 61 evel smaller tha
28200 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 20 20 2a n or equal. *
28210 2a 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 69 * to the level i
28220 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 dentified by the
28230 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 28 69 66 block above (if
28240 20 61 6e 79 29 2e 20 49 66 20 73 6f 2c 20 74 68 any). If so, th
28250 69 73 20 0a 20 20 20 20 2a 2a 20 69 74 65 72 61 is . ** itera
28260 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 tion of the loop
28270 20 77 69 6c 6c 20 77 6f 72 6b 20 6f 6e 20 6d 65 will work on me
28280 72 67 69 6e 67 20 61 74 20 74 68 65 20 68 69 6e rging at the hin
28290 74 65 64 20 6c 65 76 65 6c 2e 0a 20 20 20 20 2a ted level.. *
282a0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 /. if( rc==SQ
282b0 4c 49 54 45 5f 4f 4b 20 26 26 20 68 69 6e 74 2e LITE_OK && hint.
282c0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e n ){. int n
282d0 48 69 6e 74 20 3d 20 68 69 6e 74 2e 6e 3b 0a 20 Hint = hint.n;.
282e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 sqlite3_int
282f0 36 34 20 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 64 iHintAbsLevel
28300 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 48 69 = 0; /* Hi
28310 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 nt level */.
28320 20 20 69 6e 74 20 6e 48 69 6e 74 53 65 67 20 3d int nHintSeg =
28330 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
28340 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 20 /* Hint
28350 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e number of segmen
28360 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 ts */.. rc
28370 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 = fts3IncrmergeH
28380 69 6e 74 50 6f 70 28 26 68 69 6e 74 2c 20 26 69 intPop(&hint, &i
28390 48 69 6e 74 41 62 73 4c 65 76 65 6c 2c 20 26 6e HintAbsLevel, &n
283a0 48 69 6e 74 53 65 67 29 3b 0a 20 20 20 20 20 20 HintSeg);.
283b0 69 66 28 20 6e 53 65 67 3c 30 20 7c 7c 20 28 69 if( nSeg<0 || (i
283c0 41 62 73 4c 65 76 65 6c 20 25 20 6e 4d 6f 64 29 AbsLevel % nMod)
283d0 20 3e 3d 20 28 69 48 69 6e 74 41 62 73 4c 65 76 >= (iHintAbsLev
283e0 65 6c 20 25 20 6e 4d 6f 64 29 20 29 7b 0a 20 20 el % nMod) ){.
283f0 20 20 20 20 20 20 69 41 62 73 4c 65 76 65 6c 20 iAbsLevel
28400 3d 20 69 48 69 6e 74 41 62 73 4c 65 76 65 6c 3b = iHintAbsLevel;
28410 0a 20 20 20 20 20 20 20 20 6e 53 65 67 20 3d 20 . nSeg =
28420 6e 48 69 6e 74 53 65 67 3b 0a 20 20 20 20 20 20 nHintSeg;.
28430 20 20 62 55 73 65 48 69 6e 74 20 3d 20 31 3b 0a bUseHint = 1;.
28440 20 20 20 20 20 20 20 20 62 44 69 72 74 79 48 69 bDirtyHi
28450 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 nt = 1;. }e
28460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 lse{. /*
28470 54 68 69 73 20 75 6e 64 6f 65 73 20 74 68 65 20 This undoes the
28480 65 66 66 65 63 74 20 6f 66 20 74 68 65 20 48 69 effect of the Hi
28490 6e 74 50 6f 70 28 29 20 61 62 6f 76 65 20 2d 20 ntPop() above -
284a0 73 6f 20 74 68 61 74 20 6e 6f 20 65 6e 74 72 79 so that no entry
284b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 . ** is r
284c0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
284d0 68 69 6e 74 20 62 6c 6f 62 2e 20 20 2a 2f 0a 20 hint blob. */.
284e0 20 20 20 20 20 20 20 68 69 6e 74 2e 6e 20 3d 20 hint.n =
284f0 6e 48 69 6e 74 3b 0a 20 20 20 20 20 20 7d 0a 20 nHint;. }.
28500 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 }.. /* If
28510 6e 53 65 67 20 69 73 20 6c 65 73 73 20 74 68 61 nSeg is less tha
28520 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 t zero, then the
28530 72 65 20 69 73 20 6e 6f 20 6c 65 76 65 6c 20 77 re is no level w
28540 69 74 68 20 61 74 20 6c 65 61 73 74 0a 20 20 20 ith at least.
28550 20 2a 2a 20 6e 4d 69 6e 20 73 65 67 6d 65 6e 74 ** nMin segment
28560 73 20 61 6e 64 20 6e 6f 20 68 69 6e 74 20 69 6e s and no hint in
28570 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c the %_stat tabl
28580 65 2e 20 4e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f e. No work to do
28590 2e 0a 20 20 20 20 2a 2a 20 45 78 69 74 20 65 61 .. ** Exit ea
285a0 72 6c 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 rly in this case
285b0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 . */. if( nS
285c0 65 67 3c 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 eg<0 ) break;..
285d0 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 63 75 72 /* Open a cur
285e0 73 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 sor to iterate t
285f0 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74 65 hrough the conte
28600 6e 74 73 20 6f 66 20 74 68 65 20 6f 6c 64 65 73 nts of the oldes
28610 74 20 6e 53 65 67 20 0a 20 20 20 20 2a 2a 20 69 t nSeg . ** i
28620 6e 64 65 78 65 73 20 6f 66 20 61 62 73 6f 6c 75 ndexes of absolu
28630 74 65 20 6c 65 76 65 6c 20 69 41 62 73 4c 65 76 te level iAbsLev
28640 65 6c 2e 20 49 66 20 74 68 69 73 20 63 75 72 73 el. If this curs
28650 6f 72 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 or is opened usi
28660 6e 67 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 27 ng . ** the '
28670 68 69 6e 74 27 20 70 61 72 61 6d 65 74 65 72 73 hint' parameters
28680 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 , it is possible
28690 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 that there are
286a0 6c 65 73 73 20 74 68 61 6e 20 6e 53 65 67 0a 20 less than nSeg.
286b0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 ** segments a
286c0 76 61 69 6c 61 62 6c 65 20 69 6e 20 6c 65 76 65 vailable in leve
286d0 6c 20 69 41 62 73 4c 65 76 65 6c 2e 20 49 6e 20 l iAbsLevel. In
286e0 74 68 69 73 20 63 61 73 65 2c 20 6e 6f 20 77 6f this case, no wo
286f0 72 6b 20 69 73 0a 20 20 20 20 2a 2a 20 64 6f 6e rk is. ** don
28700 65 20 6f 6e 20 69 41 62 73 4c 65 76 65 6c 20 2d e on iAbsLevel -
28710 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f fall through to
28720 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 the next iterat
28730 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 ion of the loop
28740 0a 20 20 20 20 2a 2a 20 74 6f 20 73 74 61 72 74 . ** to start
28750 20 77 6f 72 6b 20 6f 6e 20 73 6f 6d 65 20 6f 74 work on some ot
28760 68 65 72 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 her level. */.
28770 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 memset(pWrite
28780 72 2c 20 30 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 r, 0, nAlloc);.
28790 20 20 20 70 46 69 6c 74 65 72 2d 3e 66 6c 61 67 pFilter->flag
287a0 73 20 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e 54 s = FTS3_SEGMENT
287b0 5f 52 45 51 55 49 52 45 5f 50 4f 53 3b 0a 0a 20 _REQUIRE_POS;..
287c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
287d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 E_OK ){. rc
287e0 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 = fts3Incrmerge
287f0 4f 75 74 70 75 74 49 64 78 28 70 2c 20 69 41 62 OutputIdx(p, iAb
28800 73 4c 65 76 65 6c 2c 20 26 69 49 64 78 29 3b 0a sLevel, &iIdx);.
28810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 55 assert( bU
28820 73 65 48 69 6e 74 3d 3d 31 20 7c 7c 20 62 55 73 seHint==1 || bUs
28830 65 48 69 6e 74 3d 3d 30 20 29 3b 0a 20 20 20 20 eHint==0 );.
28840 20 20 69 66 28 20 69 49 64 78 3d 3d 30 20 7c 7c if( iIdx==0 ||
28850 20 28 62 55 73 65 48 69 6e 74 20 26 26 20 69 49 (bUseHint && iI
28860 64 78 3d 3d 31 29 20 29 7b 0a 20 20 20 20 20 20 dx==1) ){.
28870 20 20 69 6e 74 20 62 49 67 6e 6f 72 65 3b 0a 20 int bIgnore;.
28880 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 rc = fts3
28890 53 65 67 6d 65 6e 74 49 73 4d 61 78 4c 65 76 65 SegmentIsMaxLeve
288a0 6c 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2b 31 l(p, iAbsLevel+1
288b0 2c 20 26 62 49 67 6e 6f 72 65 29 3b 0a 20 20 20 , &bIgnore);.
288c0 20 20 20 20 20 69 66 28 20 62 49 67 6e 6f 72 65 if( bIgnore
288d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 ){. pF
288e0 69 6c 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 ilter->flags |=
288f0 46 54 53 33 5f 53 45 47 4d 45 4e 54 5f 49 47 4e FTS3_SEGMENT_IGN
28900 4f 52 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 20 ORE_EMPTY;.
28910 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
28920 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d }.. if( rc==
28930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
28940 20 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 rc = fts3Incr
28950 6d 65 72 67 65 43 73 72 28 70 2c 20 69 41 62 73 mergeCsr(p, iAbs
28960 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 70 43 73 Level, nSeg, pCs
28970 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 r);. }. if
28980 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 ( SQLITE_OK==rc
28990 26 26 20 70 43 73 72 2d 3e 6e 53 65 67 6d 65 6e && pCsr->nSegmen
289a0 74 3d 3d 6e 53 65 67 0a 20 20 20 20 20 26 26 20 t==nSeg. &&
289b0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d SQLITE_OK==(rc =
289c0 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 sqlite3Fts3SegR
289d0 65 61 64 65 72 53 74 61 72 74 28 70 2c 20 70 43 eaderStart(p, pC
289e0 73 72 2c 20 70 46 69 6c 74 65 72 29 29 0a 20 20 sr, pFilter)).
289f0 20 20 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 && SQLITE_ROW
28a00 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 46 ==(rc = sqlite3F
28a10 74 73 33 53 65 67 52 65 61 64 65 72 53 74 65 70 ts3SegReaderStep
28a20 28 70 2c 20 70 43 73 72 29 29 0a 20 20 20 20 29 (p, pCsr)). )
28a30 7b 0a 20 20 20 20 20 20 69 66 28 20 62 55 73 65 {. if( bUse
28a40 48 69 6e 74 20 26 26 20 69 49 64 78 3e 30 20 29 Hint && iIdx>0 )
28a50 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 {. const
28a60 63 68 61 72 20 2a 7a 4b 65 79 20 3d 20 70 43 73 char *zKey = pCs
28a70 72 2d 3e 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 r->zTerm;.
28a80 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 43 73 int nKey = pCs
28a90 72 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 r->nTerm;.
28aa0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 63 72 6d rc = fts3Incrm
28ab0 65 72 67 65 4c 6f 61 64 28 70 2c 20 69 41 62 73 ergeLoad(p, iAbs
28ac0 4c 65 76 65 6c 2c 20 69 49 64 78 2d 31 2c 20 7a Level, iIdx-1, z
28ad0 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 57 72 69 74 Key, nKey, pWrit
28ae0 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 er);. }else
28af0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 {. rc = f
28b00 74 73 33 49 6e 63 72 6d 65 72 67 65 57 72 69 74 ts3IncrmergeWrit
28b10 65 72 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c er(p, iAbsLevel,
28b20 20 69 49 64 78 2c 20 70 43 73 72 2c 20 70 57 72 iIdx, pCsr, pWr
28b30 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a iter);. }..
28b40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
28b50 4c 49 54 45 5f 4f 4b 20 26 26 20 70 57 72 69 74 LITE_OK && pWrit
28b60 65 72 2d 3e 6e 4c 65 61 66 45 73 74 20 29 7b 0a er->nLeafEst ){.
28b70 20 20 20 20 20 20 20 20 66 74 73 33 4c 6f 67 4d fts3LogM
28b80 65 72 67 65 28 6e 53 65 67 2c 20 69 41 62 73 4c erge(nSeg, iAbsL
28b90 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 64 evel);. d
28ba0 6f 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 o {. rc
28bb0 20 3d 20 66 74 73 33 49 6e 63 72 6d 65 72 67 65 = fts3Incrmerge
28bc0 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 Append(p, pWrite
28bd0 72 2c 20 70 43 73 72 29 3b 0a 20 20 20 20 20 20 r, pCsr);.
28be0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
28bf0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 73 71 6c TE_OK ) rc = sql
28c00 69 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 ite3Fts3SegReade
28c10 72 53 74 65 70 28 70 2c 20 70 43 73 72 29 3b 0a rStep(p, pCsr);.
28c20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 57 if( pW
28c30 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 3e 3d 6e 52 riter->nWork>=nR
28c40 65 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 em && rc==SQLITE
28c50 5f 52 4f 57 20 29 20 72 63 20 3d 20 53 51 4c 49 _ROW ) rc = SQLI
28c60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d TE_OK;. }
28c70 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 while( rc==SQLIT
28c80 45 5f 52 4f 57 20 29 3b 0a 0a 20 20 20 20 20 20 E_ROW );..
28c90 20 20 2f 2a 20 55 70 64 61 74 65 20 6f 72 20 64 /* Update or d
28ca0 65 6c 65 74 65 20 74 68 65 20 69 6e 70 75 74 20 elete the input
28cb0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 segments */.
28cc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
28cd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 TE_OK ){.
28ce0 20 20 20 6e 52 65 6d 20 2d 3d 20 28 31 20 2b 20 nRem -= (1 +
28cf0 70 57 72 69 74 65 72 2d 3e 6e 57 6f 72 6b 29 3b pWriter->nWork);
28d00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
28d10 66 74 73 33 49 6e 63 72 6d 65 72 67 65 43 68 6f fts3IncrmergeCho
28d20 6d 70 28 70 2c 20 69 41 62 73 4c 65 76 65 6c 2c mp(p, iAbsLevel,
28d30 20 70 43 73 72 2c 20 26 6e 53 65 67 29 3b 0a 20 pCsr, &nSeg);.
28d40 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 53 65 if( nSe
28d50 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 g!=0 ){.
28d60 20 20 20 20 62 44 69 72 74 79 48 69 6e 74 20 3d bDirtyHint =
28d70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 1;.
28d80 66 74 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e fts3IncrmergeHin
28d90 74 50 75 73 68 28 26 68 69 6e 74 2c 20 69 41 62 tPush(&hint, iAb
28da0 73 4c 65 76 65 6c 2c 20 6e 53 65 67 2c 20 26 72 sLevel, nSeg, &r
28db0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a c);. }.
28dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
28dd0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65 }.. if( nSe
28de0 67 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 g!=0 ){.
28df0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 44 61 pWriter->nLeafDa
28e00 74 61 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 4c ta = pWriter->nL
28e10 65 61 66 44 61 74 61 20 2a 20 2d 31 3b 0a 20 20 eafData * -1;.
28e20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 33 }. fts3
28e30 49 6e 63 72 6d 65 72 67 65 52 65 6c 65 61 73 65 IncrmergeRelease
28e40 28 70 2c 20 70 57 72 69 74 65 72 2c 20 26 72 63 (p, pWriter, &rc
28e50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53 65 );. if( nSe
28e60 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 g==0 ){.
28e70 66 74 73 33 50 72 6f 6d 6f 74 65 53 65 67 6d 65 fts3PromoteSegme
28e80 6e 74 73 28 70 2c 20 69 41 62 73 4c 65 76 65 6c nts(p, iAbsLevel
28e90 2b 31 2c 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 +1, pWriter->nLe
28ea0 61 66 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d afData);. }
28eb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 . }.. sqli
28ec0 74 65 33 46 74 73 33 53 65 67 52 65 61 64 65 72 te3Fts3SegReader
28ed0 46 69 6e 69 73 68 28 70 43 73 72 29 3b 0a 20 20 Finish(pCsr);.
28ee0 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 }.. /* Write th
28ef0 65 20 68 69 6e 74 20 76 61 6c 75 65 73 20 69 6e e hint values in
28f00 74 6f 20 74 68 65 20 25 5f 73 74 61 74 20 74 61 to the %_stat ta
28f10 62 6c 65 20 66 6f 72 20 74 68 65 20 6e 65 78 74 ble for the next
28f20 20 69 6e 63 72 2d 6d 65 72 67 65 72 20 2a 2f 0a incr-merger */.
28f30 20 20 69 66 28 20 62 44 69 72 74 79 48 69 6e 74 if( bDirtyHint
28f40 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f && rc==SQLITE_O
28f50 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 K ){. rc = ft
28f60 73 33 49 6e 63 72 6d 65 72 67 65 48 69 6e 74 53 s3IncrmergeHintS
28f70 74 6f 72 65 28 70 2c 20 26 68 69 6e 74 29 3b 0a tore(p, &hint);.
28f80 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 }.. sqlite3_f
28f90 72 65 65 28 70 57 72 69 74 65 72 29 3b 0a 20 20 ree(pWriter);.
28fa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 68 69 6e sqlite3_free(hin
28fb0 74 2e 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 t.a);. return r
28fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 c;.}../*.** Conv
28fd0 65 72 74 20 74 68 65 20 74 65 78 74 20 62 65 67 ert the text beg
28fe0 69 6e 6e 69 6e 67 20 61 74 20 2a 70 7a 20 69 6e inning at *pz in
28ff0 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e to an integer an
29000 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20 d return.** its
29010 76 61 6c 75 65 2e 20 20 41 64 76 61 6e 63 65 20 value. Advance
29020 2a 70 7a 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 *pz to point to
29030 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 the first charac
29040 74 65 72 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 ter past.** the
29050 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 integer..*/.stat
29060 69 63 20 69 6e 74 20 66 74 73 33 47 65 74 69 6e ic int fts3Getin
29070 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 t(const char **p
29080 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 z){. const char
29090 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 6e 74 *z = *pz;. int
290a0 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 i = 0;. while(
290b0 20 28 2a 7a 29 3e 3d 27 30 27 20 26 26 20 28 2a (*z)>='0' && (*
290c0 7a 29 3c 3d 27 39 27 20 29 20 69 20 3d 20 31 30 z)<='9' ) i = 10
290d0 2a 69 20 2b 20 2a 28 7a 2b 2b 29 20 2d 20 27 30 *i + *(z++) - '0
290e0 27 3b 0a 20 20 2a 70 7a 20 3d 20 7a 3b 0a 20 20 ';. *pz = z;.
290f0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a return i;.}../*.
29100 2a 2a 20 50 72 6f 63 65 73 73 20 73 74 61 74 65 ** Process state
29110 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72 ments of the for
29120 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 m:.**.** INSE
29130 52 54 20 49 4e 54 4f 20 74 61 62 6c 65 28 74 61 RT INTO table(ta
29140 62 6c 65 29 20 56 41 4c 55 45 53 28 27 6d 65 72 ble) VALUES('mer
29150 67 65 3d 41 2c 42 27 29 3b 0a 2a 2a 0a 2a 2a 20 ge=A,B');.**.**
29160 41 20 61 6e 64 20 42 20 61 72 65 20 69 6e 74 65 A and B are inte
29170 67 65 72 73 20 74 68 61 74 20 64 65 63 6f 64 65 gers that decode
29180 20 74 6f 20 62 65 20 74 68 65 20 6e 75 6d 62 65 to be the numbe
29190 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 0a r of leaf pages.
291a0 2a 2a 20 77 72 69 74 74 65 6e 20 66 6f 72 20 74 ** written for t
291b0 68 65 20 6d 65 72 67 65 2c 20 61 6e 64 20 74 68 he merge, and th
291c0 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 e minimum number
291d0 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 of segments on
291e0 61 20 6c 65 76 65 6c 0a 2a 2a 20 62 65 66 6f 72 a level.** befor
291f0 65 20 69 74 20 77 69 6c 6c 20 62 65 20 73 65 6c e it will be sel
29200 65 63 74 65 64 20 66 6f 72 20 61 20 6d 65 72 67 ected for a merg
29210 65 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e e, respectively.
29220 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 .*/.static int f
29230 74 73 33 44 6f 49 6e 63 72 6d 65 72 67 65 28 0a ts3DoIncrmerge(.
29240 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 2c 20 Fts3Table *p,
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29260 20 20 2f 2a 20 46 54 53 33 20 74 61 62 6c 65 20 /* FTS3 table
29270 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 handle */. cons
29280 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 20 20 t char *zParam
29290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
292a0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 ul-terminated st
292b0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 ring containing
292c0 22 41 2c 42 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e "A,B" */.){. in
292d0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e t rc;. int nMin
292e0 20 3d 20 28 46 54 53 33 5f 4d 45 52 47 45 5f 43 = (FTS3_MERGE_C
292f0 4f 55 4e 54 20 2f 20 32 29 3b 0a 20 20 69 6e 74 OUNT / 2);. int
29300 20 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 63 nMerge = 0;. c
29310 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a onst char *z = z
29320 50 61 72 61 6d 3b 0a 0a 20 20 2f 2a 20 52 65 61 Param;.. /* Rea
29330 64 20 74 68 65 20 66 69 72 73 74 20 69 6e 74 65 d the first inte
29340 67 65 72 20 76 61 6c 75 65 20 2a 2f 0a 20 20 6e ger value */. n
29350 4d 65 72 67 65 20 3d 20 66 74 73 33 47 65 74 69 Merge = fts3Geti
29360 6e 74 28 26 7a 29 3b 0a 0a 20 20 2f 2a 20 49 66 nt(&z);.. /* If
29370 20 74 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 the first integ
29380 65 72 20 76 61 6c 75 65 20 69 73 20 66 6f 6c 6c er value is foll
29390 6f 77 65 64 20 62 79 20 61 20 27 2c 27 2c 20 20 owed by a ',',
293a0 72 65 61 64 20 74 68 65 20 73 65 63 6f 6e 64 0a read the second.
293b0 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 76 61 6c ** integer val
293c0 75 65 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 5b 30 ue. */. if( z[0
293d0 5d 3d 3d 27 2c 27 20 26 26 20 7a 5b 31 5d 21 3d ]==',' && z[1]!=
293e0 27 5c 30 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b '\0' ){. z++;
293f0 0a 20 20 20 20 6e 4d 69 6e 20 3d 20 66 74 73 33 . nMin = fts3
29400 47 65 74 69 6e 74 28 26 7a 29 3b 0a 20 20 7d 0a Getint(&z);. }.
29410 0a 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 5c 30 . if( z[0]!='\0
29420 27 20 7c 7c 20 6e 4d 69 6e 3c 32 20 29 7b 0a 20 ' || nMin<2 ){.
29430 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 rc = SQLITE_E
29440 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 RROR;. }else{.
29450 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f rc = SQLITE_O
29460 4b 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 62 K;. if( !p->b
29470 48 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20 20 HasStat ){.
29480 20 61 73 73 65 72 74 28 20 70 2d 3e 62 46 74 73 assert( p->bFts
29490 34 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 4==0 );. sq
294a0 6c 69 74 65 33 46 74 73 33 43 72 65 61 74 65 53 lite3Fts3CreateS
294b0 74 61 74 54 61 62 6c 65 28 26 72 63 2c 20 70 29 tatTable(&rc, p)
294c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
294d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
294e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 . rc = sqli
294f0 74 65 33 46 74 73 33 49 6e 63 72 6d 65 72 67 65 te3Fts3Incrmerge
29500 28 70 2c 20 6e 4d 65 72 67 65 2c 20 6e 4d 69 6e (p, nMerge, nMin
29510 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c );. }. sql
29520 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 73 ite3Fts3Segments
29530 43 6c 6f 73 65 28 70 29 3b 0a 20 20 7d 0a 20 20 Close(p);. }.
29540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
29550 0a 2a 2a 20 50 72 6f 63 65 73 73 20 73 74 61 74 .** Process stat
29560 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 66 6f ements of the fo
29570 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 rm:.**.** INS
29580 45 52 54 20 49 4e 54 4f 20 74 61 62 6c 65 28 74 ERT INTO table(t
29590 61 62 6c 65 29 20 56 41 4c 55 45 53 28 27 61 75 able) VALUES('au
295a0 74 6f 6d 65 72 67 65 3d 58 27 29 3b 0a 2a 2a 0a tomerge=X');.**.
295b0 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61 6e ** where X is an
295c0 20 69 6e 74 65 67 65 72 2e 20 20 58 3d 3d 30 20 integer. X==0
295d0 6d 65 61 6e 73 20 74 6f 20 74 75 72 6e 20 61 75 means to turn au
295e0 74 6f 6d 65 72 67 65 20 6f 66 66 2e 20 20 58 21 tomerge off. X!
295f0 3d 30 20 6d 65 61 6e 73 0a 2a 2a 20 74 75 72 6e =0 means.** turn
29600 20 69 74 20 6f 6e 2e 20 20 54 68 65 20 73 65 74 it on. The set
29610 74 69 6e 67 20 69 73 20 70 65 72 73 69 73 74 65 ting is persiste
29620 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e nt..*/.static in
29630 74 20 66 74 73 33 44 6f 41 75 74 6f 69 6e 63 72 t fts3DoAutoincr
29640 6d 65 72 67 65 28 0a 20 20 46 74 73 33 54 61 62 merge(. Fts3Tab
29650 6c 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 le *p,
29660 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 /* FTS3
29670 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f table handle */
29680 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
29690 50 61 72 61 6d 20 20 20 20 20 20 20 20 20 20 20 Param
296a0 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e /* Nul-termin
296b0 61 74 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 ated string cont
296c0 61 69 6e 69 6e 67 20 62 6f 6f 6c 65 61 6e 20 2a aining boolean *
296d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 /.){. int rc =
296e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c SQLITE_OK;. sql
296f0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 ite3_stmt *pStmt
29700 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 41 75 74 6f = 0;. p->nAuto
29710 69 6e 63 72 6d 65 72 67 65 20 3d 20 66 74 73 33 incrmerge = fts3
29720 47 65 74 69 6e 74 28 26 7a 50 61 72 61 6d 29 3b Getint(&zParam);
29730 0a 20 20 69 66 28 20 70 2d 3e 6e 41 75 74 6f 69 . if( p->nAutoi
29740 6e 63 72 6d 65 72 67 65 3d 3d 31 20 7c 7c 20 70 ncrmerge==1 || p
29750 2d 3e 6e 41 75 74 6f 69 6e 63 72 6d 65 72 67 65 ->nAutoincrmerge
29760 3e 46 54 53 33 5f 4d 45 52 47 45 5f 43 4f 55 4e >FTS3_MERGE_COUN
29770 54 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 75 74 T ){. p->nAut
29780 6f 69 6e 63 72 6d 65 72 67 65 20 3d 20 38 3b 0a oincrmerge = 8;.
29790 20 20 7d 0a 20 20 69 66 28 20 21 70 2d 3e 62 48 }. if( !p->bH
297a0 61 73 53 74 61 74 20 29 7b 0a 20 20 20 20 61 73 asStat ){. as
297b0 73 65 72 74 28 20 70 2d 3e 62 46 74 73 34 3d 3d sert( p->bFts4==
297c0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 0 );. sqlite3
297d0 46 74 73 33 43 72 65 61 74 65 53 74 61 74 54 61 Fts3CreateStatTa
297e0 62 6c 65 28 26 72 63 2c 20 70 29 3b 0a 20 20 20 ble(&rc, p);.
297f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e if( rc ) return
29800 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 rc;. }. rc =
29810 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 fts3SqlStmt(p, S
29820 51 4c 5f 52 45 50 4c 41 43 45 5f 53 54 41 54 2c QL_REPLACE_STAT,
29830 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 &pStmt, 0);. i
29840 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 f( rc ) return r
29850 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e c;. sqlite3_bin
29860 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 2c 20 d_int(pStmt, 1,
29870 46 54 53 5f 53 54 41 54 5f 41 55 54 4f 49 4e 43 FTS_STAT_AUTOINC
29880 52 4d 45 52 47 45 29 3b 0a 20 20 73 71 6c 69 74 RMERGE);. sqlit
29890 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d e3_bind_int(pStm
298a0 74 2c 20 32 2c 20 70 2d 3e 6e 41 75 74 6f 69 6e t, 2, p->nAutoin
298b0 63 72 6d 65 72 67 65 29 3b 0a 20 20 73 71 6c 69 crmerge);. sqli
298c0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b te3_step(pStmt);
298d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f . rc = sqlite3_
298e0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 reset(pStmt);.
298f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
29900 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d .** Return a 64-
29910 62 69 74 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 bit checksum for
29920 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 65 the FTS index e
29930 6e 74 72 79 20 73 70 65 63 69 66 69 65 64 20 62 ntry specified b
29940 79 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e y the.** argumen
29950 74 73 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 ts to this funct
29960 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 ion..*/.static u
29970 36 34 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 64 fts3ChecksumE
29980 6e 74 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 ntry(. const ch
29990 61 72 20 2a 7a 54 65 72 6d 2c 20 20 20 20 20 20 ar *zTerm,
299a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
299b0 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e er to buffer con
299c0 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a taining term */.
299d0 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 int nTerm,
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
299f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65 /* Size of zTe
29a00 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 rm in bytes */.
29a10 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 int iLangid,
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29a30 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 /* Language id
29a40 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20 for current row
29a50 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 78 2c */. int iIndex,
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29a70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 28 30 /* Index (0
29a80 2e 2e 46 74 73 33 54 61 62 6c 65 2e 6e 49 6e 64 ..Fts3Table.nInd
29a90 65 78 2d 31 29 20 2a 2f 0a 20 20 69 36 34 20 69 ex-1) */. i64 i
29aa0 44 6f 63 69 64 2c 20 20 20 20 20 20 20 20 20 20 Docid,
29ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f /* Do
29ac0 63 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 cid for current
29ad0 72 6f 77 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 row. */. int iC
29ae0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ol,
29af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c /* Col
29b00 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 umn number */.
29b10 69 6e 74 20 69 50 6f 73 20 20 20 20 20 20 20 20 int iPos
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29b30 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 2a 2f 0a 29 /* Position */.)
29b40 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 {. int i;. u64
29b50 20 72 65 74 20 3d 20 28 75 36 34 29 69 44 6f 63 ret = (u64)iDoc
29b60 69 64 3b 0a 0a 20 20 72 65 74 20 2b 3d 20 28 72 id;.. ret += (r
29b70 65 74 3c 3c 33 29 20 2b 20 69 4c 61 6e 67 69 64 et<<3) + iLangid
29b80 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c ;. ret += (ret<
29b90 3c 33 29 20 2b 20 69 49 6e 64 65 78 3b 0a 20 20 <3) + iIndex;.
29ba0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 ret += (ret<<3)
29bb0 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d + iCol;. ret +=
29bc0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 (ret<<3) + iPos
29bd0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e ;. for(i=0; i<n
29be0 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b Term; i++) ret +
29bf0 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 7a 54 65 = (ret<<3) + zTe
29c00 72 6d 5b 69 5d 3b 0a 0a 20 20 72 65 74 75 72 6e rm[i];.. return
29c10 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 ret;.}../*.** R
29c20 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d eturn a checksum
29c30 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 of all entries
29c40 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 in the FTS index
29c50 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 that correspond
29c60 20 74 6f 0a 2a 2a 20 6c 61 6e 67 75 61 67 65 20 to.** language
29c70 69 64 20 69 4c 61 6e 67 69 64 2e 20 54 68 65 20 id iLangid. The
29c80 63 68 65 63 6b 73 75 6d 20 69 73 20 63 61 6c 63 checksum is calc
29c90 75 6c 61 74 65 64 20 62 79 20 58 4f 52 69 6e 67 ulated by XORing
29ca0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a the checksums.*
29cb0 2a 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 * of each indivi
29cc0 64 75 61 6c 20 65 6e 74 72 79 20 28 73 65 65 20 dual entry (see
29cd0 66 74 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 fts3ChecksumEntr
29ce0 79 28 29 29 20 74 6f 67 65 74 68 65 72 2e 0a 2a y()) together..*
29cf0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 *.** If successf
29d00 75 6c 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d ul, the checksum
29d10 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e value is return
29d20 65 64 20 61 6e 64 20 2a 70 52 63 20 73 65 74 20 ed and *pRc set
29d30 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a to SQLITE_OK..**
29d40 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 Otherwise, if a
29d50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 n error occurs,
29d60 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 *pRc is set to a
29d70 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 n SQLite error c
29d80 6f 64 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 ode. The.** retu
29d90 72 6e 20 76 61 6c 75 65 20 69 73 20 75 6e 64 65 rn value is unde
29da0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 fined in this ca
29db0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 se..*/.static u6
29dc0 34 20 66 74 73 33 43 68 65 63 6b 73 75 6d 49 6e 4 fts3ChecksumIn
29dd0 64 65 78 28 0a 20 20 46 74 73 33 54 61 62 6c 65 dex(. Fts3Table
29de0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *p,
29df0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 33 20 74 /* FTS3 t
29e00 61 62 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 able handle */.
29e10 20 69 6e 74 20 69 4c 61 6e 67 69 64 2c 20 20 20 int iLangid,
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29e30 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 69 64 20 /* Language id
29e40 74 6f 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 20 to return cksum
29e50 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e for */. int iIn
29e60 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 dex,
29e70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 /* Inde
29e80 78 20 74 6f 20 63 6b 73 75 6d 20 28 30 2e 2e 70 x to cksum (0..p
29e90 2d 3e 6e 49 6e 64 65 78 2d 31 29 20 2a 2f 0a 20 ->nIndex-1) */.
29ea0 20 69 6e 74 20 2a 70 52 63 20 20 20 20 20 20 20 int *pRc
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29ec0 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 /* OUT: Return
29ed0 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 code */.){. Fts
29ee0 33 53 65 67 46 69 6c 74 65 72 20 66 69 6c 74 65 3SegFilter filte
29ef0 72 3b 0a 20 20 46 74 73 33 4d 75 6c 74 69 53 65 r;. Fts3MultiSe
29f00 67 52 65 61 64 65 72 20 63 73 72 3b 0a 20 20 69 gReader csr;. i
29f10 6e 74 20 72 63 3b 0a 20 20 75 36 34 20 63 6b 73 nt rc;. u64 cks
29f20 75 6d 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 um = 0;.. asser
29f30 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f t( *pRc==SQLITE_
29f40 4f 4b 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 OK );.. memset(
29f50 26 66 69 6c 74 65 72 2c 20 30 2c 20 73 69 7a 65 &filter, 0, size
29f60 6f 66 28 66 69 6c 74 65 72 29 29 3b 0a 20 20 6d of(filter));. m
29f70 65 6d 73 65 74 28 26 63 73 72 2c 20 30 2c 20 73 emset(&csr, 0, s
29f80 69 7a 65 6f 66 28 63 73 72 29 29 3b 0a 20 20 66 izeof(csr));. f
29f90 69 6c 74 65 72 2e 66 6c 61 67 73 20 3d 20 20 46 ilter.flags = F
29fa0 54 53 33 5f 53 45 47 4d 45 4e 54 5f 52 45 51 55 TS3_SEGMENT_REQU
29fb0 49 52 45 5f 50 4f 53 7c 46 54 53 33 5f 53 45 47 IRE_POS|FTS3_SEG
29fc0 4d 45 4e 54 5f 49 47 4e 4f 52 45 5f 45 4d 50 54 MENT_IGNORE_EMPT
29fd0 59 3b 0a 20 20 66 69 6c 74 65 72 2e 66 6c 61 67 Y;. filter.flag
29fe0 73 20 7c 3d 20 46 54 53 33 5f 53 45 47 4d 45 4e s |= FTS3_SEGMEN
29ff0 54 5f 53 43 41 4e 3b 0a 0a 20 20 72 63 20 3d 20 T_SCAN;.. rc =
2a000 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 sqlite3Fts3SegRe
2a010 61 64 65 72 43 75 72 73 6f 72 28 0a 20 20 20 20 aderCursor(.
2a020 20 20 70 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 p, iLangid, iI
2a030 6e 64 65 78 2c 20 46 54 53 33 5f 53 45 47 43 55 ndex, FTS3_SEGCU
2a040 52 53 4f 52 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 RSOR_ALL, 0, 0,
2a050 30 2c 20 31 2c 26 63 73 72 0a 20 20 29 3b 0a 20 0, 1,&csr. );.
2a060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
2a070 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 OK ){. rc = s
2a080 71 6c 69 74 65 33 46 74 73 33 53 65 67 52 65 61 qlite3Fts3SegRea
2a090 64 65 72 53 74 61 72 74 28 70 2c 20 26 63 73 72 derStart(p, &csr
2a0a0 2c 20 26 66 69 6c 74 65 72 29 3b 0a 20 20 7d 0a , &filter);. }.
2a0b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 . if( rc==SQLIT
2a0c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 68 69 6c E_OK ){. whil
2a0d0 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 e( SQLITE_ROW==(
2a0e0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 rc = sqlite3Fts3
2a0f0 53 65 67 52 65 61 64 65 72 53 74 65 70 28 70 2c SegReaderStep(p,
2a100 20 26 63 73 72 29 29 20 29 7b 0a 20 20 20 20 20 &csr)) ){.
2a110 20 63 68 61 72 20 2a 70 43 73 72 20 3d 20 63 73 char *pCsr = cs
2a120 72 2e 61 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 r.aDoclist;.
2a130 20 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 char *pEnd = &
2a140 70 43 73 72 5b 63 73 72 2e 6e 44 6f 63 6c 69 73 pCsr[csr.nDoclis
2a150 74 5d 3b 0a 0a 20 20 20 20 20 20 69 36 34 20 69 t];.. i64 i
2a160 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 Docid = 0;.
2a170 20 69 36 34 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 i64 iCol = 0;.
2a180 20 20 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20 i64 iPos =
2a190 30 3b 0a 0a 20 20 20 20 20 20 70 43 73 72 20 2b 0;.. pCsr +
2a1a0 3d 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 = sqlite3Fts3Get
2a1b0 56 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 44 Varint(pCsr, &iD
2a1c0 6f 63 69 64 29 3b 0a 20 20 20 20 20 20 77 68 69 ocid);. whi
2a1d0 6c 65 28 20 70 43 73 72 3c 70 45 6e 64 20 29 7b le( pCsr<pEnd ){
2a1e0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 56 61 . i64 iVa
2a1f0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 l = 0;. p
2a200 43 73 72 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 Csr += sqlite3Ft
2a210 73 33 47 65 74 56 61 72 69 6e 74 28 70 43 73 72 s3GetVarint(pCsr
2a220 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 , &iVal);.
2a230 20 20 69 66 28 20 70 43 73 72 3c 70 45 6e 64 20 if( pCsr<pEnd
2a240 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ){. if(
2a250 20 69 56 61 6c 3d 3d 30 20 7c 7c 20 69 56 61 6c iVal==0 || iVal
2a260 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==1 ){.
2a270 20 20 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 iCol = 0;.
2a280 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 3d 20 iPos =
2a290 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 0;. i
2a2a0 66 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20 20 f( iVal ){.
2a2b0 20 20 20 20 20 20 20 20 20 70 43 73 72 20 2b 3d pCsr +=
2a2c0 20 73 71 6c 69 74 65 33 46 74 73 33 47 65 74 56 sqlite3Fts3GetV
2a2d0 61 72 69 6e 74 28 70 43 73 72 2c 20 26 69 43 6f arint(pCsr, &iCo
2a2e0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 l);.
2a2f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
2a300 20 20 20 20 20 70 43 73 72 20 2b 3d 20 73 71 6c pCsr += sql
2a310 69 74 65 33 46 74 73 33 47 65 74 56 61 72 69 6e ite3Fts3GetVarin
2a320 74 28 70 43 73 72 2c 20 26 69 56 61 6c 29 3b 0a t(pCsr, &iVal);.
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 44 iD
2a340 6f 63 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 ocid += iVal;.
2a350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
2a360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
2a370 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d iPos +=
2a380 20 28 69 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20 (iVal - 2);.
2a390 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d cksum =
2a3a0 20 63 6b 73 75 6d 20 5e 20 66 74 73 33 43 68 65 cksum ^ fts3Che
2a3b0 63 6b 73 75 6d 45 6e 74 72 79 28 0a 20 20 20 20 cksumEntry(.
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 63 73 72 2e csr.
2a3d0 7a 54 65 72 6d 2c 20 63 73 72 2e 6e 54 65 72 6d zTerm, csr.nTerm
2a3e0 2c 20 69 4c 61 6e 67 69 64 2c 20 69 49 6e 64 65 , iLangid, iInde
2a3f0 78 2c 20 69 44 6f 63 69 64 2c 0a 20 20 20 20 20 x, iDocid,.
2a400 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 (int)
2a410 69 43 6f 6c 2c 20 28 69 6e 74 29 69 50 6f 73 0a iCol, (int)iPos.
2a420 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 );.
2a430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
2a440 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
2a450 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 }. }. sqlite3
2a460 46 74 73 33 53 65 67 52 65 61 64 65 72 46 69 6e Fts3SegReaderFin
2a470 69 73 68 28 26 63 73 72 29 3b 0a 0a 20 20 2a 70 ish(&csr);.. *p
2a480 52 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 Rc = rc;. retur
2a490 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a n cksum;.}../*.*
2a4a0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 * Check if the c
2a4b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 46 ontents of the F
2a4c0 54 53 20 69 6e 64 65 78 20 6d 61 74 63 68 20 74 TS index match t
2a4d0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 he current conte
2a4e0 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f nts of the.** co
2a4f0 6e 74 65 6e 74 20 74 61 62 6c 65 2e 20 49 66 20 ntent table. If
2a500 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 no error occurs
2a510 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 and the contents
2a520 20 64 6f 20 6d 61 74 63 68 2c 20 73 65 74 20 2a do match, set *
2a530 70 62 4f 6b 0a 2a 2a 20 74 6f 20 74 72 75 65 20 pbOk.** to true
2a540 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 and return SQLIT
2a550 45 5f 4f 4b 2e 20 4f 72 20 69 66 20 74 68 65 20 E_OK. Or if the
2a560 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 contents do not
2a570 6d 61 74 63 68 2c 20 73 65 74 20 2a 70 62 4f 6b match, set *pbOk
2a580 0a 2a 2a 20 74 6f 20 66 61 6c 73 65 20 62 65 66 .** to false bef
2a590 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a ore returning..*
2a5a0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 *.** If an error
2a5b0 20 6f 63 63 75 72 73 20 28 65 2e 67 2e 20 61 6e occurs (e.g. an
2a5c0 20 4f 4f 4d 20 6f 72 20 49 4f 20 65 72 72 6f 72 OOM or IO error
2a5d0 29 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c ), return an SQL
2a5e0 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f ite error .** co
2a5f0 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 de. The final va
2a600 6c 75 65 20 6f 66 20 2a 70 62 4f 6b 20 69 73 20 lue of *pbOk is
2a610 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 undefined in thi
2a620 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 s case..*/.stati
2a630 63 20 69 6e 74 20 66 74 73 33 49 6e 74 65 67 72 c int fts3Integr
2a640 69 74 79 43 68 65 63 6b 28 46 74 73 33 54 61 62 ityCheck(Fts3Tab
2a650 6c 65 20 2a 70 2c 20 69 6e 74 20 2a 70 62 4f 6b le *p, int *pbOk
2a660 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 ){. int rc = SQ
2a670 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 LITE_OK;
2a680 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 /* Return c
2a690 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 ode */. u64 cks
2a6a0 75 6d 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 um1 = 0;
2a6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 /* Chec
2a6c0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 46 54 ksum based on FT
2a6d0 53 20 69 6e 64 65 78 20 63 6f 6e 74 65 6e 74 73 S index contents
2a6e0 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 */. u64 cksum2
2a6f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
2a700 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 /* Checksu
2a710 6d 20 62 61 73 65 64 20 6f 6e 20 25 5f 63 6f 6e m based on %_con
2a720 74 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 2a 2f tent contents */
2a730 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 . sqlite3_stmt
2a740 2a 70 41 6c 6c 4c 61 6e 67 69 64 20 3d 20 30 3b *pAllLangid = 0;
2a750 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 /* Statement
2a760 74 6f 20 72 65 74 75 72 6e 20 61 6c 6c 20 6c 61 to return all la
2a770 6e 67 75 61 67 65 2d 69 64 73 20 2a 2f 0a 0a 20 nguage-ids */..
2a780 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 /* This block c
2a790 61 6c 63 75 6c 61 74 65 73 20 74 68 65 20 63 68 alculates the ch
2a7a0 65 63 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 ecksum according
2a7b0 20 74 6f 20 74 68 65 20 46 54 53 20 69 6e 64 65 to the FTS inde
2a7c0 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 66 74 73 x. */. rc = fts
2a7d0 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 51 4c 5f 3SqlStmt(p, SQL_
2a7e0 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 4e 47 49 SELECT_ALL_LANGI
2a7f0 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 D, &pAllLangid,
2a800 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 0);. if( rc==SQ
2a810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 LITE_OK ){. i
2a820 6e 74 20 72 63 32 3b 0a 20 20 20 20 73 71 6c 69 nt rc2;. sqli
2a830 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 41 6c te3_bind_int(pAl
2a840 6c 4c 61 6e 67 69 64 2c 20 31 2c 20 70 2d 3e 6e lLangid, 1, p->n
2a850 49 6e 64 65 78 29 3b 0a 20 20 20 20 77 68 69 6c Index);. whil
2a860 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b e( rc==SQLITE_OK
2a870 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 && sqlite3_step
2a880 28 70 41 6c 6c 4c 61 6e 67 69 64 29 3d 3d 53 51 (pAllLangid)==SQ
2a890 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 LITE_ROW ){.
2a8a0 20 20 69 6e 74 20 69 4c 61 6e 67 69 64 20 3d 20 int iLangid =
2a8b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 sqlite3_column_i
2a8c0 6e 74 28 70 41 6c 6c 4c 61 6e 67 69 64 2c 20 30 nt(pAllLangid, 0
2a8d0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a );. int i;.
2a8e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 for(i=0; i
2a8f0 3c 70 2d 3e 6e 49 6e 64 65 78 3b 20 69 2b 2b 29 <p->nIndex; i++)
2a900 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 31 {. cksum1
2a910 20 3d 20 63 6b 73 75 6d 31 20 5e 20 66 74 73 33 = cksum1 ^ fts3
2a920 43 68 65 63 6b 73 75 6d 49 6e 64 65 78 28 70 2c ChecksumIndex(p,
2a930 20 69 4c 61 6e 67 69 64 2c 20 69 2c 20 26 72 63 iLangid, i, &rc
2a940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
2a950 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 . rc2 = sqlit
2a960 65 33 5f 72 65 73 65 74 28 70 41 6c 6c 4c 61 6e e3_reset(pAllLan
2a970 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 gid);. if( rc
2a980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 ==SQLITE_OK ) rc
2a990 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 0a 20 20 2f = rc2;. }.. /
2a9a0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 61 6c * This block cal
2a9b0 63 75 6c 61 74 65 73 20 74 68 65 20 63 68 65 63 culates the chec
2a9c0 6b 73 75 6d 20 61 63 63 6f 72 64 69 6e 67 20 74 ksum according t
2a9d0 6f 20 74 68 65 20 25 5f 63 6f 6e 74 65 6e 74 20 o the %_content
2a9e0 74 61 62 6c 65 20 2a 2f 0a 20 20 72 63 20 3d 20 table */. rc =
2a9f0 66 74 73 33 53 71 6c 53 74 6d 74 28 70 2c 20 53 fts3SqlStmt(p, S
2aa00 51 4c 5f 53 45 4c 45 43 54 5f 41 4c 4c 5f 4c 41 QL_SELECT_ALL_LA
2aa10 4e 47 49 44 2c 20 26 70 41 6c 6c 4c 61 6e 67 69 NGID, &pAllLangi
2aa20 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d d, 0);. if( rc=
2aa30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
2aa40 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 sqlite3_tokeni
2aa50 7a 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 zer_module const
2aa60 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 2d 3e 70 *pModule = p->p
2aa70 54 6f 6b 65 6e 69 7a 65 72 2d 3e 70 4d 6f 64 75 Tokenizer->pModu
2aa80 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f le;. sqlite3_
2aa90 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b stmt *pStmt = 0;
2aaa0 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b . char *zSql;
2aab0 0a 20 20 20 0a 20 20 20 20 7a 53 71 6c 20 3d 20 . . zSql =
2aac0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 sqlite3_mprintf(
2aad0 22 53 45 4c 45 43 54 20 25 73 22 20 2c 20 70 2d "SELECT %s" , p-
2aae0 3e 7a 52 65 61 64 45 78 70 72 6c 69 73 74 29 3b >zReadExprlist);
2aaf0 0a 20 20 20 20 69 66 28 20 21 7a 53 71 6c 20 29 . if( !zSql )
2ab00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c {. rc = SQL
2ab10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d ITE_NOMEM;. }
2ab20 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d else{. rc =
2ab30 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 sqlite3_prepare
2ab40 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c _v2(p->db, zSql,
2ab50 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b -1, &pStmt, 0);
2ab60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 . sqlite3_f
2ab70 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d ree(zSql);. }
2ab80 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d .. while( rc=
2ab90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 =SQLITE_OK && SQ
2aba0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 LITE_ROW==sqlite
2abb0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 3_step(pStmt) ){
2abc0 0a 20 20 20 20 20 20 69 36 34 20 69 44 6f 63 69 . i64 iDoci
2abd0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 d = sqlite3_colu
2abe0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 mn_int64(pStmt,
2abf0 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 0);. int iL
2ac00 61 6e 67 20 3d 20 6c 61 6e 67 69 64 46 72 6f 6d ang = langidFrom
2ac10 53 65 6c 65 63 74 28 70 2c 20 70 53 74 6d 74 29 Select(p, pStmt)
2ac20 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c ;. int iCol
2ac30 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f ;.. for(iCo
2ac40 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f l=0; rc==SQLITE_
2ac50 4f 4b 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 6e 43 OK && iCol<p->nC
2ac60 6f 6c 75 6d 6e 3b 20 69 43 6f 6c 2b 2b 29 7b 0a olumn; iCol++){.
2ac70 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 const ch
2ac80 61 72 20 2a 7a 54 65 78 74 20 3d 20 28 63 6f 6e ar *zText = (con
2ac90 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 st char *)sqlite
2aca0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 3_column_text(pS
2acb0 74 6d 74 2c 20 69 43 6f 6c 2b 31 29 3b 0a 20 20 tmt, iCol+1);.
2acc0 20 20 20 20 20 20 69 6e 74 20 6e 54 65 78 74 20 int nText
2acd0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e = sqlite3_column
2ace0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 69 43 _bytes(pStmt, iC
2acf0 6f 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 ol+1);. s
2ad00 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 qlite3_tokenizer
2ad10 5f 63 75 72 73 6f 72 20 2a 70 54 20 3d 20 30 3b _cursor *pT = 0;
2ad20 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 .. rc = s
2ad30 71 6c 69 74 65 33 46 74 73 33 4f 70 65 6e 54 6f qlite3Fts3OpenTo
2ad40 6b 65 6e 69 7a 65 72 28 70 2d 3e 70 54 6f 6b 65 kenizer(p->pToke
2ad50 6e 69 7a 65 72 2c 20 69 4c 61 6e 67 2c 20 7a 54 nizer, iLang, zT
2ad60 65 78 74 2c 20 6e 54 65 78 74 2c 20 26 70 54 29 ext, nText, &pT)
2ad70 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 ;. while(
2ad80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
2ad90 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 {. char
2ada0 20 63 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 const *zToken;
2adb0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 /* Buffer
2adc0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e containing token
2add0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e */. in
2ade0 74 20 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 t nToken = 0;
2adf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
2ae00 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 6f r of bytes in to
2ae10 6b 65 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 ken */.
2ae20 20 69 6e 74 20 69 44 75 6d 31 20 3d 20 30 2c 20 int iDum1 = 0,
2ae30 69 44 75 6d 32 20 3d 20 30 3b 20 2f 2a 20 44 75 iDum2 = 0; /* Du
2ae40 6d 6d 79 20 76 61 72 69 61 62 6c 65 73 20 2a 2f mmy variables */
2ae50 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 . int i
2ae60 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 Pos = 0;
2ae70 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e /* Position
2ae80 20 6f 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 of token in zTe
2ae90 78 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 xt */..
2aea0 20 72 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 rc = pModule->x
2aeb0 4e 65 78 74 28 70 54 2c 20 26 7a 54 6f 6b 65 6e Next(pT, &zToken
2aec0 2c 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d , &nToken, &iDum
2aed0 31 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 1, &iDum2, &iPos
2aee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 );. if(
2aef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
2af00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e {. in
2af10 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 t i;.
2af20 20 63 6b 73 75 6d 32 20 3d 20 63 6b 73 75 6d 32 cksum2 = cksum2
2af30 20 5e 20 66 74 73 33 43 68 65 63 6b 73 75 6d 45 ^ fts3ChecksumE
2af40 6e 74 72 79 28 0a 20 20 20 20 20 20 20 20 20 20 ntry(.
2af50 20 20 20 20 20 20 7a 54 6f 6b 65 6e 2c 20 6e 54 zToken, nT
2af60 6f 6b 65 6e 2c 20 69 4c 61 6e 67 2c 20 30 2c 20 oken, iLang, 0,
2af70 69 44 6f 63 69 64 2c 20 69 43 6f 6c 2c 20 69 50 iDocid, iCol, iP
2af80 6f 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 os. )
2af90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f ;. fo
2afa0 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 49 6e 64 r(i=1; i<p->nInd
2afb0 65 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 ex; i++){.
2afc0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 if( p->a
2afd0 49 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78 Index[i].nPrefix
2afe0 3c 3d 6e 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 <=nToken ){.
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 cksu
2b000 6d 32 20 3d 20 63 6b 73 75 6d 32 20 5e 20 66 74 m2 = cksum2 ^ ft
2b010 73 33 43 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 s3ChecksumEntry(
2b020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2b030 20 20 20 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 61 49 zToken, p->aI
2b040 6e 64 65 78 5b 69 5d 2e 6e 50 72 65 66 69 78 2c ndex[i].nPrefix,
2b050 20 69 4c 61 6e 67 2c 20 69 2c 20 69 44 6f 63 69 iLang, i, iDoci
2b060 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 0a 20 20 d, iCol, iPos.
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b );
2b080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d . }
2b090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 . }.
2b0a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
2b0b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
2b0c0 20 70 54 20 29 20 70 4d 6f 64 75 6c 65 2d 3e 78 pT ) pModule->x
2b0d0 43 6c 6f 73 65 28 70 54 29 3b 0a 20 20 20 20 20 Close(pT);.
2b0e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
2b0f0 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 E_DONE ) rc = SQ
2b100 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d LITE_OK;. }
2b110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 . }.. sqli
2b120 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 te3_finalize(pSt
2b130 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 62 4f mt);. }.. *pbO
2b140 6b 20 3d 20 28 63 6b 73 75 6d 31 3d 3d 63 6b 73 k = (cksum1==cks
2b150 75 6d 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 um2);. return r
2b160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 c;.}../*.** Run
2b170 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 the integrity-ch
2b180 65 63 6b 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 eck. If no error
2b190 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 occurs and the
2b1a0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 current contents
2b1b0 20 6f 66 0a 2a 2a 20 74 68 65 20 46 54 53 20 69 of.** the FTS i
2b1c0 6e 64 65 78 20 61 72 65 20 63 6f 72 72 65 63 74 ndex are correct
2b1d0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f , return SQLITE_
2b1e0 4f 4b 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 63 OK. Or, if the c
2b1f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a ontents of the.*
2b200 2a 20 46 54 53 20 69 6e 64 65 78 20 61 72 65 20 * FTS index are
2b210 69 6e 63 6f 72 72 65 63 74 2c 20 72 65 74 75 72 incorrect, retur
2b220 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 n SQLITE_CORRUPT
2b230 5f 56 54 41 42 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c _VTAB..**.** Or,
2b240 20 69 66 20 61 6e 20 65 72 72 6f 72 20 28 65 2e if an error (e.
2b250 67 2e 20 61 6e 20 4f 4f 4d 20 6f 72 20 49 4f 20 g. an OOM or IO
2b260 65 72 72 6f 72 29 20 6f 63 63 75 72 73 2c 20 72 error) occurs, r
2b270 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 eturn an SQLite
2b280 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a .** error code..
2b290 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 72 **.** The integr
2b2a0 69 74 79 2d 63 68 65 63 6b 20 77 6f 72 6b 73 20 ity-check works
2b2b0 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 46 6f 72 20 as follows. For
2b2c0 65 61 63 68 20 74 6f 6b 65 6e 20 61 6e 64 20 69 each token and i
2b2d0 6e 64 65 78 65 64 20 74 6f 6b 65 6e 0a 2a 2a 20 ndexed token.**
2b2e0 70 72 65 66 69 78 20 69 6e 20 74 68 65 20 64 6f prefix in the do
2b2f0 63 75 6d 65 6e 74 20 73 65 74 2c 20 61 20 36 34 cument set, a 64
2b300 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 69 73 -bit checksum is
2b310 20 63 61 6c 63 75 6c 61 74 65 64 20 28 62 79 20 calculated (by
2b320 63 6f 64 65 0a 2a 2a 20 69 6e 20 66 74 73 33 43 code.** in fts3C
2b330 68 65 63 6b 73 75 6d 45 6e 74 72 79 28 29 29 20 hecksumEntry())
2b340 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 6f 6c based on the fol
2b350 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 lowing:.**.**
2b360 20 20 2b 20 54 68 65 20 69 6e 64 65 78 20 6e 75 + The index nu
2b370 6d 62 65 72 20 28 30 20 66 6f 72 20 74 68 65 20 mber (0 for the
2b380 6d 61 69 6e 20 69 6e 64 65 78 2c 20 31 20 66 6f main index, 1 fo
2b390 72 20 74 68 65 20 66 69 72 73 74 20 70 72 65 66 r the first pref
2b3a0 69 78 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 ix.** inde
2b3b0 78 20 65 74 63 2e 29 2c 0a 2a 2a 20 20 20 20 20 x etc.),.**
2b3c0 2b 20 54 68 65 20 74 6f 6b 65 6e 20 28 6f 72 20 + The token (or
2b3d0 74 6f 6b 65 6e 20 70 72 65 66 69 78 29 20 74 65 token prefix) te
2b3e0 78 74 20 69 74 73 65 6c 66 2c 20 0a 2a 2a 20 20 xt itself, .**
2b3f0 20 20 20 2b 20 54 68 65 20 6c 61 6e 67 75 61 67 + The languag
2b400 65 2d 69 64 20 6f 66 20 74 68 65 20 72 6f 77 20 e-id of the row
2b410 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a it appears in,.*
2b420 2a 20 20 20 20 20 2b 20 54 68 65 20 64 6f 63 69 * + The doci
2b430 64 20 6f 66 20 74 68 65 20 72 6f 77 20 69 74 20 d of the row it
2b440 61 70 70 65 61 72 73 20 69 6e 2c 0a 2a 2a 20 20 appears in,.**
2b450 20 20 20 2b 20 54 68 65 20 63 6f 6c 75 6d 6e 20 + The column
2b460 69 74 20 61 70 70 65 61 72 73 20 69 6e 2c 20 61 it appears in, a
2b470 6e 64 0a 2a 2a 20 20 20 20 20 2b 20 54 68 65 20 nd.** + The
2b480 74 6f 6b 65 6e 73 20 70 6f 73 69 74 69 6f 6e 20 tokens position
2b490 77 69 74 68 69 6e 20 74 68 61 74 20 63 6f 6c 75 within that colu
2b4a0 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 68 mn..**.** The ch
2b4b0 65 63 6b 73 75 6d 73 20 66 6f 72 20 61 6c 6c 20 ecksums for all
2b4c0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 69 entries in the i
2b4d0 6e 64 65 78 20 61 72 65 20 58 4f 52 65 64 20 74 ndex are XORed t
2b4e0 6f 67 65 74 68 65 72 20 74 6f 20 63 72 65 61 74 ogether to creat
2b4f0 65 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 63 68 e.** a single ch
2b500 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 65 ecksum for the e
2b510 6e 74 69 72 65 20 69 6e 64 65 78 2e 0a 2a 2a 0a ntire index..**.
2b520 2a 2a 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 ** The integrity
2b530 2d 63 68 65 63 6b 20 63 6f 64 65 20 63 61 6c 63 -check code calc
2b540 75 6c 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 ulates the same
2b550 63 68 65 63 6b 73 75 6d 20 69 6e 20 74 77 6f 20 checksum in two
2b560 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 ways:.**.**
2b570 31 2e 20 42 79 20 73 63 61 6e 6e 69 6e 67 20 74 1. By scanning t
2b580 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 he contents of t
2b590 68 65 20 46 54 53 20 69 6e 64 65 78 2c 20 61 6e he FTS index, an
2b5a0 64 20 0a 2a 2a 20 20 20 20 20 32 2e 20 42 79 20 d .** 2. By
2b5b0 73 63 61 6e 6e 69 6e 67 20 61 6e 64 20 74 6f 6b scanning and tok
2b5c0 65 6e 69 7a 69 6e 67 20 74 68 65 20 63 6f 6e 74 enizing the cont
2b5d0 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a ent table..**.**
2b5e0 20 49 66 20 74 68 65 20 74 77 6f 20 63 68 65 63 If the two chec
2b5f0 6b 73 75 6d 73 20 61 72 65 20 69 64 65 6e 74 69 ksums are identi
2b600 63 61 6c 2c 20 74 68 65 20 69 6e 74 65 67 72 69 cal, the integri
2b610 74 79 2d 63 68 65 63 6b 20 69 73 20 64 65 65 6d ty-check is deem
2b620 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 61 ed to have.** pa
2b630 73 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ssed..*/.static
2b640 69 6e 74 20 66 74 73 33 44 6f 49 6e 74 65 67 72 int fts3DoIntegr
2b650 69 74 79 43 68 65 63 6b 28 0a 20 20 46 74 73 33 ityCheck(. Fts3
2b660 54 61 62 6c 65 20 2a 70 20 20 20 20 20 20 20 20 Table *p
2b670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 /* F
2b680 54 53 33 20 74 61 62 6c 65 20 68 61 6e 64 6c 65 TS3 table handle
2b690 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b */.){. int rc;
2b6a0 0a 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a . int bOk = 0;.
2b6b0 20 20 72 63 20 3d 20 66 74 73 33 49 6e 74 65 67 rc = fts3Integ
2b6c0 72 69 74 79 43 68 65 63 6b 28 70 2c 20 26 62 4f rityCheck(p, &bO
2b6d0 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 k);. if( rc==SQ
2b6e0 4c 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d LITE_OK && bOk==
2b6f0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 0 ) rc = SQLITE_
2b700 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 0a 20 20 CORRUPT_VTAB;.
2b710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
2b720 0a 2a 2a 20 48 61 6e 64 6c 65 20 61 20 27 73 70 .** Handle a 'sp
2b730 65 63 69 61 6c 27 20 49 4e 53 45 52 54 20 6f 66 ecial' INSERT of
2b740 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a the form:.**.**
2b750 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 "INSERT INTO
2b760 74 62 6c 28 74 62 6c 29 20 56 41 4c 55 45 53 28 tbl(tbl) VALUES(
2b770 3c 65 78 70 72 3e 29 22 0a 2a 2a 0a 2a 2a 20 41 <expr>)".**.** A
2b780 72 67 75 6d 65 6e 74 20 70 56 61 6c 20 63 6f 6e rgument pVal con
2b790 74 61 69 6e 73 20 74 68 65 20 72 65 73 75 6c 74 tains the result
2b7a0 20 6f 66 20 3c 65 78 70 72 3e 2e 20 43 75 72 72 of <expr>. Curr
2b7b0 65 6e 74 6c 79 20 74 68 65 20 6f 6e 6c 79 20 0a ently the only .
2b7c0 2a 2a 20 6d 65 61 6e 69 6e 67 66 75 6c 20 76 61 ** meaningful va
2b7d0 6c 75 65 20 74 6f 20 69 6e 73 65 72 74 20 69 73 lue to insert is
2b7e0 20 74 68 65 20 74 65 78 74 20 27 6f 70 74 69 6d the text 'optim
2b7f0 69 7a 65 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ize'..*/.static
2b800 69 6e 74 20 66 74 73 33 53 70 65 63 69 61 6c 49 int fts3SpecialI
2b810 6e 73 65 72 74 28 46 74 73 33 54 61 62 6c 65 20 nsert(Fts3Table
2b820 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 *p, sqlite3_valu
2b830 65 20 2a 70 56 61 6c 29 7b 0a 20 20 69 6e 74 20 e *pVal){. int
2b840 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rc;
2b850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 /* R
2b860 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 eturn Code */.
2b870 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c const char *zVal
2b880 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a = (const char *
2b890 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 )sqlite3_value_t
2b8a0 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 69 6e 74 ext(pVal);. int
2b8b0 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f nVal = sqlite3_
2b8c0 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c value_bytes(pVal
2b8d0 29 3b 0a 0a 20 20 69 66 28 20 21 7a 56 61 6c 20 );.. if( !zVal
2b8e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 ){. return SQ
2b8f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 LITE_NOMEM;. }e
2b900 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 38 20 lse if( nVal==8
2b910 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 && 0==sqlite3_st
2b920 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 6f 70 rnicmp(zVal, "op
2b930 74 69 6d 69 7a 65 22 2c 20 38 29 20 29 7b 0a 20 timize", 8) ){.
2b940 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 rc = fts3DoOp
2b950 74 69 6d 69 7a 65 28 70 2c 20 30 29 3b 0a 20 20 timize(p, 0);.
2b960 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d }else if( nVal==
2b970 37 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 7 && 0==sqlite3_
2b980 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 strnicmp(zVal, "
2b990 72 65 62 75 69 6c 64 22 2c 20 37 29 20 29 7b 0a rebuild", 7) ){.
2b9a0 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 6f 52 rc = fts3DoR
2b9b0 65 62 75 69 6c 64 28 70 29 3b 0a 20 20 7d 65 6c ebuild(p);. }el
2b9c0 73 65 20 69 66 28 20 6e 56 61 6c 3d 3d 31 35 20 se if( nVal==15
2b9d0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 && 0==sqlite3_st
2b9e0 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 22 69 6e rnicmp(zVal, "in
2b9f0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 22 2c 20 tegrity-check",
2ba00 31 35 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 15) ){. rc =
2ba10 66 74 73 33 44 6f 49 6e 74 65 67 72 69 74 79 43 fts3DoIntegrityC
2ba20 68 65 63 6b 28 70 29 3b 0a 20 20 7d 65 6c 73 65 heck(p);. }else
2ba30 20 69 66 28 20 6e 56 61 6c 3e 36 20 26 26 20 30 if( nVal>6 && 0
2ba40 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 ==sqlite3_strnic
2ba50 6d 70 28 7a 56 61 6c 2c 20 22 6d 65 72 67 65 3d mp(zVal, "merge=
2ba60 22 2c 20 36 29 20 29 7b 0a 20 20 20 20 72 63 20 ", 6) ){. rc
2ba70 3d 20 66 74 73 33 44 6f 49 6e 63 72 6d 65 72 67 = fts3DoIncrmerg
2ba80 65 28 70 2c 20 26 7a 56 61 6c 5b 36 5d 29 3b 0a e(p, &zVal[6]);.
2ba90 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c }else if( nVal
2baa0 3e 31 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 >10 && 0==sqlite
2bab0 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 3_strnicmp(zVal,
2bac0 20 22 61 75 74 6f 6d 65 72 67 65 3d 22 2c 20 31 "automerge=", 1
2bad0 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 0) ){. rc = f
2bae0 74 73 33 44 6f 41 75 74 6f 69 6e 63 72 6d 65 72 ts3DoAutoincrmer
2baf0 67 65 28 70 2c 20 26 7a 56 61 6c 5b 31 30 5d 29 ge(p, &zVal[10])
2bb00 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
2bb10 54 45 53 54 0a 20 20 7d 65 6c 73 65 20 69 66 28 TEST. }else if(
2bb20 20 6e 56 61 6c 3e 39 20 26 26 20 30 3d 3d 73 71 nVal>9 && 0==sq
2bb30 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a lite3_strnicmp(z
2bb40 56 61 6c 2c 20 22 6e 6f 64 65 73 69 7a 65 3d 22 Val, "nodesize="
2bb50 2c 20 39 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e , 9) ){. p->n
2bb60 4e 6f 64 65 53 69 7a 65 20 3d 20 61 74 6f 69 28 NodeSize = atoi(
2bb70 26 7a 56 61 6c 5b 39 5d 29 3b 0a 20 20 20 20 72 &zVal[9]);. r
2bb80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 c = SQLITE_OK;.
2bb90 20 7d 65 6c 73 65 20 69 66 28 20 6e 56 61 6c 3e }else if( nVal>
2bba0 31 31 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 11 && 0==sqlite3
2bbb0 5f 73 74 72 6e 69 63 6d 70 28 7a 56 61 6c 2c 20 _strnicmp(zVal,
2bbc0 22 6d 61 78 70 65 6e 64 69 6e 67 3d 22 2c 20 39 "maxpending=", 9
2bbd0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 61 78 ) ){. p->nMax
2bbe0 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 61 74 PendingData = at
2bbf0 6f 69 28 26 7a 56 61 6c 5b 31 31 5d 29 3b 0a 20 oi(&zVal[11]);.
2bc00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f rc = SQLITE_O
2bc10 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e K;. }else if( n
2bc20 56 61 6c 3e 32 31 20 26 26 20 30 3d 3d 73 71 6c Val>21 && 0==sql
2bc30 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 56 ite3_strnicmp(zV
2bc40 61 6c 2c 20 22 74 65 73 74 2d 6e 6f 2d 69 6e 63 al, "test-no-inc
2bc50 72 2d 64 6f 63 6c 69 73 74 3d 22 2c 20 32 31 29 r-doclist=", 21)
2bc60 20 29 7b 0a 20 20 20 20 70 2d 3e 62 4e 6f 49 6e ){. p->bNoIn
2bc70 63 72 44 6f 63 6c 69 73 74 20 3d 20 61 74 6f 69 crDoclist = atoi
2bc80 28 26 7a 56 61 6c 5b 32 31 5d 29 3b 0a 20 20 20 (&zVal[21]);.
2bc90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
2bca0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b .#endif. }else{
2bcb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
2bcc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 _ERROR;. }.. r
2bcd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 eturn rc;.}..#if
2bce0 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 ndef SQLITE_DISA
2bcf0 42 4c 45 5f 46 54 53 34 5f 44 45 46 45 52 52 45 BLE_FTS4_DEFERRE
2bd00 44 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 D./*.** Delete a
2bd10 6c 6c 20 63 61 63 68 65 64 20 64 65 66 65 72 72 ll cached deferr
2bd20 65 64 20 64 6f 63 6c 69 73 74 73 2e 20 44 65 66 ed doclists. Def
2bd30 65 72 72 65 64 20 64 6f 63 6c 69 73 74 73 20 61 erred doclists a
2bd40 72 65 20 63 61 63 68 65 64 0a 2a 2a 20 28 61 6c re cached.** (al
2bd50 6c 6f 63 61 74 65 64 29 20 62 79 20 74 68 65 20 located) by the
2bd60 73 71 6c 69 74 65 33 46 74 73 33 43 61 63 68 65 sqlite3Fts3Cache
2bd70 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 73 DeferredDoclists
2bd80 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a () function..*/.
2bd90 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 33 void sqlite3Fts3
2bda0 46 72 65 65 44 65 66 65 72 72 65 64 44 6f 63 6c FreeDeferredDocl
2bdb0 69 73 74 73 28 46 74 73 33 43 75 72 73 6f 72 20 ists(Fts3Cursor
2bdc0 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 33 44 65 *pCsr){. Fts3De
2bdd0 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 44 65 ferredToken *pDe
2bde0 66 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43 f;. for(pDef=pC
2bdf0 73 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 sr->pDeferred; p
2be00 44 65 66 3b 20 70 44 65 66 3d 70 44 65 66 2d 3e Def; pDef=pDef->
2be10 70 4e 65 78 74 29 7b 0a 20 20 20 20 66 74 73 33 pNext){. fts3
2be20 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c 65 74 PendingListDelet
2be30 65 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 3b 0a e(pDef->pList);.
2be40 20 20 20 20 70 44 65 66 2d 3e 70 4c 69 73 74 20 pDef->pList
2be50 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a = 0;. }.}../*.*
2be60 2a 20 46 72 65 65 20 61 6c 6c 20 65 6e 74 72 69 * Free all entri
2be70 65 73 20 69 6e 20 74 68 65 20 70 43 73 72 2d 3e es in the pCsr->
2be80 70 44 65 66 66 65 72 65 64 20 6c 69 73 74 2e 20 pDeffered list.
2be90 45 6e 74 72 69 65 73 20 61 72 65 20 61 64 64 65 Entries are adde
2bea0 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20 6c 69 d to .** this li
2beb0 73 74 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 st using sqlite3
2bec0 46 74 73 33 44 65 66 65 72 54 6f 6b 65 6e 28 29 Fts3DeferToken()
2bed0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
2bee0 33 46 74 73 33 46 72 65 65 44 65 66 65 72 72 65 3Fts3FreeDeferre
2bef0 64 54 6f 6b 65 6e 73 28 46 74 73 33 43 75 72 73 dTokens(Fts3Curs
2bf00 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 46 74 73 or *pCsr){. Fts
2bf10 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 3DeferredToken *
2bf20 70 44 65 66 3b 0a 20 20 46 74 73 33 44 65 66 65 pDef;. Fts3Defe
2bf30 72 72 65 64 54 6f 6b 65 6e 20 2a 70 4e 65 78 74 rredToken *pNext
2bf40 3b 0a 20 20 66 6f 72 28 70 44 65 66 3d 70 43 73 ;. for(pDef=pCs
2bf50 72 2d 3e 70 44 65 66 65 72 72 65 64 3b 20 70 44 r->pDeferred; pD
2bf60 65 66 3b 20 70 44 65 66 3d 70 4e 65 78 74 29 7b ef; pDef=pNext){
2bf70 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 44 65 . pNext = pDe
2bf80 66 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66 74 f->pNext;. ft
2bf90 73 33 50 65 6e 64 69 6e 67 4c 69 73 74 44 65 6c s3PendingListDel
2bfa0 65 74 65 28 70 44 65 66 2d 3e 70 4c 69 73 74 29 ete(pDef->pList)
2bfb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
2bfc0 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a 20 20 ee(pDef);. }.
2bfd0 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 pCsr->pDeferred
2bfe0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 = 0;.}../*.** Ge
2bff0 6e 65 72 61 74 65 20 64 65 66 65 72 72 65 64 2d nerate deferred-
2c000 64 6f 63 6c 69 73 74 73 20 66 6f 72 20 61 6c 6c doclists for all
2c010 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 70 tokens in the p
2c020 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 6c Csr->pDeferred l
2c030 69 73 74 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 ist.** based on
2c040 74 68 65 20 72 6f 77 20 74 68 61 74 20 70 43 73 the row that pCs
2c050 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e r currently poin
2c060 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 41 20 64 ts to..**.** A d
2c070 65 66 65 72 72 65 64 2d 64 6f 63 6c 69 73 74 20 eferred-doclist
2c080 69 73 20 6c 69 6b 65 20 61 6e 79 20 6f 74 68 65 is like any othe
2c090 72 20 64 6f 63 6c 69 73 74 20 77 69 74 68 20 70 r doclist with p
2c0a0 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 osition informat
2c0b0 69 6f 6e 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 2c ion.** included,
2c0c0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 except that it
2c0d0 6f 6e 6c 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e only contains en
2c0e0 74 72 69 65 73 20 66 6f 72 20 61 20 73 69 6e 67 tries for a sing
2c0f0 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 0a 2a 2a le row of the.**
2c100 20 74 61 62 6c 65 2c 20 6e 6f 74 20 66 6f 72 20 table, not for
2c110 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2f 0a 69 6e 74 all rows..*/.int
2c120 20 73 71 6c 69 74 65 33 46 74 73 33 43 61 63 68 sqlite3Fts3Cach
2c130 65 44 65 66 65 72 72 65 64 44 6f 63 6c 69 73 74 eDeferredDoclist
2c140 73 28 46 74 73 33 43 75 72 73 6f 72 20 2a 70 43 s(Fts3Cursor *pC
2c150 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 sr){. int rc =
2c160 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 SQLITE_OK;
2c170 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e /* Return
2c180 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 70 code */. if( p
2c190 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 20 29 Csr->pDeferred )
2c1a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 {. int i;
2c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c1c0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 /* Used to i
2c1d0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 terate through t
2c1e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a able columns */.
2c1f0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 sqlite3_int6
2c200 34 20 69 44 6f 63 69 64 3b 20 20 20 20 20 20 20 4 iDocid;
2c210 20 20 2f 2a 20 44 6f 63 69 64 20 6f 66 20 74 68 /* Docid of th
2c220 65 20 72 6f 77 20 70 43 73 72 20 70 6f 69 6e 74 e row pCsr point
2c230 73 20 74 6f 20 2a 2f 0a 20 20 20 20 46 74 73 33 s to */. Fts3
2c240 44 65 66 65 72 72 65 64 54 6f 6b 65 6e 20 2a 70 DeferredToken *p
2c250 44 65 66 3b 20 20 20 20 20 20 2f 2a 20 55 73 65 Def; /* Use
2c260 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 d to iterate thr
2c270 6f 75 67 68 20 64 65 66 65 72 72 65 64 20 74 6f ough deferred to
2c280 6b 65 6e 73 20 2a 2f 0a 20 20 0a 20 20 20 20 46 kens */. . F
2c290 74 73 33 54 61 62 6c 65 20 2a 70 20 3d 20 28 46 ts3Table *p = (F
2c2a0 74 73 33 54 61 62 6c 65 20 2a 29 70 43 73 72 2d ts3Table *)pCsr-
2c2b0 3e 62 61 73 65 2e 70 56 74 61 62 3b 0a 20 20 20 >base.pVtab;.
2c2c0 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a sqlite3_tokeniz
2c2d0 65 72 20 2a 70 54 20 3d 20 70 2d 3e 70 54 6f 6b er *pT = p->pTok
2c2e0 65 6e 69 7a 65 72 3b 0a 20 20 20 20 73 71 6c 69 enizer;. sqli
2c2f0 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f te3_tokenizer_mo
2c300 64 75 6c 65 20 63 6f 6e 73 74 20 2a 70 4d 6f 64 dule const *pMod
2c310 75 6c 65 20 3d 20 70 54 2d 3e 70 4d 6f 64 75 6c ule = pT->pModul
2c320 65 3b 0a 20 20 20 0a 20 20 20 20 61 73 73 65 72 e;. . asser
2c330 74 28 20 70 43 73 72 2d 3e 69 73 52 65 71 75 69 t( pCsr->isRequi
2c340 72 65 53 65 65 6b 3d 3d 30 20 29 3b 0a 20 20 20 reSeek==0 );.
2c350 20 69 44 6f 63 69 64 20 3d 20 73 71 6c 69 74 65 iDocid = sqlite
2c360 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 3_column_int64(p
2c370 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a Csr->pStmt, 0);.
2c380 20 20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 . for(i=0;
2c390 69 3c 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 i<p->nColumn &&
2c3a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 rc==SQLITE_OK; i
2c3b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 ++){. if( p
2c3c0 2d 3e 61 62 4e 6f 74 69 6e 64 65 78 65 64 5b 69 ->abNotindexed[i
2c3d0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 ]==0 ){.
2c3e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 const char *zTex
2c3f0 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 t = (const char
2c400 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e *)sqlite3_column
2c410 5f 74 65 78 74 28 70 43 73 72 2d 3e 70 53 74 6d _text(pCsr->pStm
2c420 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 t, i+1);.
2c430 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a sqlite3_tokeniz
2c440 65 72 5f 63 75 72 73 6f 72 20 2a 70 54 43 20 3d er_cursor *pTC =
2c450 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 0;.. rc
2c460 3d 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 65 = sqlite3Fts3Ope
2c470 6e 54 6f 6b 65 6e 69 7a 65 72 28 70 54 2c 20 70 nTokenizer(pT, p
2c480 43 73 72 2d 3e 69 4c 61 6e 67 69 64 2c 20 7a 54 Csr->iLangid, zT
2c490 65 78 74 2c 20 2d 31 2c 20 26 70 54 43 29 3b 0a ext, -1, &pTC);.
2c4a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 while( r
2c4b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
2c4c0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 char c
2c4d0 6f 6e 73 74 20 2a 7a 54 6f 6b 65 6e 3b 20 20 20 onst *zToken;
2c4e0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f /* Buffer co
2c4f0 6e 74 61 69 6e 69 6e 67 20 74 6f 6b 65 6e 20 2a ntaining token *
2c500 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 /. int
2c510 6e 54 6f 6b 65 6e 20 3d 20 30 3b 20 20 20 20 20 nToken = 0;
2c520 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
2c530 6f 66 20 62 79 74 65 73 20 69 6e 20 74 6f 6b 65 of bytes in toke
2c540 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 n */. i
2c550 6e 74 20 69 44 75 6d 31 20 3d 20 30 2c 20 69 44 nt iDum1 = 0, iD
2c560 75 6d 32 20 3d 20 30 3b 20 2f 2a 20 44 75 6d 6d um2 = 0; /* Dumm
2c570 79 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 y variables */.
2c580 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f int iPo
2c590 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 s = 0;
2c5a0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f /* Position o
2c5b0 66 20 74 6f 6b 65 6e 20 69 6e 20 7a 54 65 78 74 f token in zText
2c5c0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 72 */.. r
2c5d0 63 20 3d 20 70 4d 6f 64 75 6c 65 2d 3e 78 4e 65 c = pModule->xNe
2c5e0 78 74 28 70 54 43 2c 20 26 7a 54 6f 6b 65 6e 2c xt(pTC, &zToken,
2c5f0 20 26 6e 54 6f 6b 65 6e 2c 20 26 69 44 75 6d 31 &nToken, &iDum1
2c600 2c 20 26 69 44 75 6d 32 2c 20 26 69 50 6f 73 29 , &iDum2, &iPos)
2c610 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 ;. for(
2c620 70 44 65 66 3d 70 43 73 72 2d 3e 70 44 65 66 65 pDef=pCsr->pDefe
2c630 72 72 65 64 3b 20 70 44 65 66 20 26 26 20 72 63 rred; pDef && rc
2c640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 44 65 ==SQLITE_OK; pDe
2c650 66 3d 70 44 65 66 2d 3e 70 4e 65 78 74 29 7b 0a f=pDef->pNext){.
2c660 20 20 20 20 20 20 20 20 20 20 20 20 46 74 73 33 Fts3
2c670 50 68 72 61 73 65 54 6f 6b 65 6e 20 2a 70 50 54 PhraseToken *pPT
2c680 20 3d 20 70 44 65 66 2d 3e 70 54 6f 6b 65 6e 3b = pDef->pToken;
2c690 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 . if(
2c6a0 20 28 70 44 65 66 2d 3e 69 43 6f 6c 3e 3d 70 2d (pDef->iCol>=p-
2c6b0 3e 6e 43 6f 6c 75 6d 6e 20 7c 7c 20 70 44 65 66 >nColumn || pDef
2c6c0 2d 3e 69 43 6f 6c 3d 3d 69 29 0a 20 20 20 20 20 ->iCol==i).
2c6d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 && (p
2c6e0 50 54 2d 3e 62 46 69 72 73 74 3d 3d 30 20 7c 7c PT->bFirst==0 ||
2c6f0 20 69 50 6f 73 3d 3d 30 29 0a 20 20 20 20 20 20 iPos==0).
2c700 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 && (pP
2c710 54 2d 3e 6e 3d 3d 6e 54 6f 6b 65 6e 20 7c 7c 20 T->n==nToken ||
2c720 28 70 50 54 2d 3e 69 73 50 72 65 66 69 78 20 26 (pPT->isPrefix &
2c730 26 20 70 50 54 2d 3e 6e 3c 6e 54 6f 6b 65 6e 29 & pPT->n<nToken)
2c740 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ).
2c750 20 20 26 26 20 28 30 3d 3d 6d 65 6d 63 6d 70 28 && (0==memcmp(
2c760 7a 54 6f 6b 65 6e 2c 20 70 50 54 2d 3e 7a 2c 20 zToken, pPT->z,
2c770 70 50 54 2d 3e 6e 29 29 0a 20 20 20 20 20 20 20 pPT->n)).
2c780 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 ){.
2c790 20 20 20 20 20 20 20 20 66 74 73 33 50 65 6e 64 fts3Pend
2c7a0 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 28 26 70 ingListAppend(&p
2c7b0 44 65 66 2d 3e 70 4c 69 73 74 2c 20 69 44 6f 63 Def->pList, iDoc
2c7c0 69 64 2c 20 69 2c 20 69 50 6f 73 2c 20 26 72 63 id, i, iPos, &rc
2c7d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d );. }
2c7e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
2c7f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 }. i
2c800 66 28 20 70 54 43 20 29 20 70 4d 6f 64 75 6c 65 f( pTC ) pModule
2c810 2d 3e 78 43 6c 6f 73 65 28 70 54 43 29 3b 0a 20 ->xClose(pTC);.
2c820 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 if( rc==S
2c830 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 QLITE_DONE ) rc
2c840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 = SQLITE_OK;.
2c850 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
2c860 66 6f 72 28 70 44 65 66 3d 70 43 73 72 2d 3e 70 for(pDef=pCsr->p
2c870 44 65 66 65 72 72 65 64 3b 20 70 44 65 66 20 26 Deferred; pDef &
2c880 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b & rc==SQLITE_OK;
2c890 20 70 44 65 66 3d 70 44 65 66 2d 3e 70 4e 65 78 pDef=pDef->pNex
2c8a0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 t){. if( pD
2c8b0 65 66 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 ef->pList ){.
2c8c0 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 50 65 rc = fts3Pe
2c8d0 6e 64 69 6e 67 4c 69 73 74 41 70 70 65 6e 64 56 ndingListAppendV
2c8e0 61 72 69 6e 74 28 26 70 44 65 66 2d 3e 70 4c 69 arint(&pDef->pLi
2c8f0 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a st, 0);. }.
2c900 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 }. }.. ret
2c910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 urn rc;.}..int s
2c920 71 6c 69 74 65 33 46 74 73 33 44 65 66 65 72 72 qlite3Fts3Deferr
2c930 65 64 54 6f 6b 65 6e 4c 69 73 74 28 0a 20 20 46 edTokenList(. F
2c940 74 73 33 44 65 66 65 72 72 65 64 54 6f 6b 65 6e ts3DeferredToken
2c950 20 2a 70 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 *p, . char **p
2c960 70 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 2a 70 pData, . int *p
2c970 6e 44 61 74 61 0a 29 7b 0a 20 20 63 68 61 72 20 nData.){. char
2c980 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 6e 53 6b *pRet;. int nSk
2c990 69 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e ip;. sqlite3_in
2c9a0 74 36 34 20 64 75 6d 6d 79 3b 0a 0a 20 20 2a 70 t64 dummy;.. *p
2c9b0 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 2a 70 6e pData = 0;. *pn
2c9c0 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 69 66 28 Data = 0;.. if(
2c9d0 20 70 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 7b 0a p->pList==0 ){.
2c9e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
2c9f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 E_OK;. }.. pRe
2ca00 74 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 t = (char *)sqli
2ca10 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 70 4c te3_malloc(p->pL
2ca20 69 73 74 2d 3e 6e 44 61 74 61 29 3b 0a 20 20 69 ist->nData);. i
2ca30 66 28 20 21 70 52 65 74 20 29 20 72 65 74 75 72 f( !pRet ) retur
2ca40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a n SQLITE_NOMEM;.
2ca50 0a 20 20 6e 53 6b 69 70 20 3d 20 73 71 6c 69 74 . nSkip = sqlit
2ca60 65 33 46 74 73 33 47 65 74 56 61 72 69 6e 74 28 e3Fts3GetVarint(
2ca70 70 2d 3e 70 4c 69 73 74 2d 3e 61 44 61 74 61 2c p->pList->aData,
2ca80 20 26 64 75 6d 6d 79 29 3b 0a 20 20 2a 70 6e 44 &dummy);. *pnD
2ca90 61 74 61 20 3d 20 70 2d 3e 70 4c 69 73 74 2d 3e ata = p->pList->
2caa0 6e 44 61 74 61 20 2d 20 6e 53 6b 69 70 3b 0a 20 nData - nSkip;.
2cab0 20 2a 70 70 44 61 74 61 20 3d 20 70 52 65 74 3b *ppData = pRet;
2cac0 0a 20 20 0a 20 20 6d 65 6d 63 70 79 28 70 52 65 . . memcpy(pRe
2cad0 74 2c 20 26 70 2d 3e 70 4c 69 73 74 2d 3e 61 44 t, &p->pList->aD
2cae0 61 74 61 5b 6e 53 6b 69 70 5d 2c 20 2a 70 6e 44 ata[nSkip], *pnD
2caf0 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 ata);. return S
2cb00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a QLITE_OK;.}../*.
2cb10 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 ** Add an entry
2cb20 66 6f 72 20 74 6f 6b 65 6e 20 70 54 6f 6b 65 6e for token pToken
2cb30 20 74 6f 20 74 68 65 20 70 43 73 72 2d 3e 70 44 to the pCsr->pD
2cb40 65 66 65 72 72 65 64 20 6c 69 73 74 2e 0a 2a 2f eferred list..*/
2cb50 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 .int sqlite3Fts3
2cb60 44 65 66 65 72 54 6f 6b 65 6e 28 0a 20 20 46 74 DeferToken(. Ft
2cb70 73 33 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 s3Cursor *pCsr,
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
2cb90 20 46 74 73 33 20 74 61 62 6c 65 20 63 75 72 73 Fts3 table curs
2cba0 6f 72 20 2a 2f 0a 20 20 46 74 73 33 50 68 72 61 or */. Fts3Phra
2cbb0 73 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c seToken *pToken,
2cbc0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e /* Token
2cbd0 20 74 6f 20 64 65 66 65 72 20 2a 2f 0a 20 20 69 to defer */. i
2cbe0 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 nt iCol
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
2cc00 2a 20 43 6f 6c 75 6d 6e 20 74 68 61 74 20 74 6f * Column that to
2cc10 6b 65 6e 20 6d 75 73 74 20 61 70 70 65 61 72 20 ken must appear
2cc20 69 6e 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 29 7b in (or -1) */.){
2cc30 0a 20 20 46 74 73 33 44 65 66 65 72 72 65 64 54 . Fts3DeferredT
2cc40 6f 6b 65 6e 20 2a 70 44 65 66 65 72 72 65 64 3b oken *pDeferred;
2cc50 0a 20 20 70 44 65 66 65 72 72 65 64 20 3d 20 73 . pDeferred = s
2cc60 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 qlite3_malloc(si
2cc70 7a 65 6f 66 28 2a 70 44 65 66 65 72 72 65 64 29 zeof(*pDeferred)
2cc80 29 3b 0a 20 20 69 66 28 20 21 70 44 65 66 65 72 );. if( !pDefer
2cc90 72 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 red ){. retur
2cca0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a n SQLITE_NOMEM;.
2ccb0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 }. memset(pDe
2ccc0 66 65 72 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f ferred, 0, sizeo
2ccd0 66 28 2a 70 44 65 66 65 72 72 65 64 29 29 3b 0a f(*pDeferred));.
2cce0 20 20 70 44 65 66 65 72 72 65 64 2d 3e 70 54 6f pDeferred->pTo
2ccf0 6b 65 6e 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20 20 ken = pToken;.
2cd00 70 44 65 66 65 72 72 65 64 2d 3e 70 4e 65 78 74 pDeferred->pNext
2cd10 20 3d 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 = pCsr->pDeferr
2cd20 65 64 3b 20 0a 20 20 70 44 65 66 65 72 72 65 64 ed; . pDeferred
2cd30 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 ->iCol = iCol;.
2cd40 20 70 43 73 72 2d 3e 70 44 65 66 65 72 72 65 64 pCsr->pDeferred
2cd50 20 3d 20 70 44 65 66 65 72 72 65 64 3b 0a 0a 20 = pDeferred;..
2cd60 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d assert( pToken-
2cd70 3e 70 44 65 66 65 72 72 65 64 3d 3d 30 20 29 3b >pDeferred==0 );
2cd80 0a 20 20 70 54 6f 6b 65 6e 2d 3e 70 44 65 66 65 . pToken->pDefe
2cd90 72 72 65 64 20 3d 20 70 44 65 66 65 72 72 65 64 rred = pDeferred
2cda0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 ;.. return SQLI
2cdb0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a TE_OK;.}.#endif.
2cdc0 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 76 61 ./*.** SQLite va
2cdd0 6c 75 65 20 70 52 6f 77 69 64 20 63 6f 6e 74 61 lue pRowid conta
2cde0 69 6e 73 20 74 68 65 20 72 6f 77 69 64 20 6f 66 ins the rowid of
2cdf0 20 61 20 72 6f 77 20 74 68 61 74 20 6d 61 79 20 a row that may
2ce00 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a or may not be.**
2ce10 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 present in the
2ce20 46 54 53 33 20 74 61 62 6c 65 2e 20 49 66 20 69 FTS3 table. If i
2ce30 74 20 69 73 2c 20 64 65 6c 65 74 65 20 69 74 20 t is, delete it
2ce40 61 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20 63 and adjust the c
2ce50 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 73 75 ontents.** of su
2ce60 62 73 69 64 75 61 72 79 20 64 61 74 61 20 73 74 bsiduary data st
2ce70 72 75 63 74 75 72 65 73 20 61 63 63 6f 72 64 69 ructures accordi
2ce80 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ngly..*/.static
2ce90 69 6e 74 20 66 74 73 33 44 65 6c 65 74 65 42 79 int fts3DeleteBy
2cea0 52 6f 77 69 64 28 0a 20 20 46 74 73 33 54 61 62 Rowid(. Fts3Tab
2ceb0 6c 65 20 2a 70 2c 20 0a 20 20 73 71 6c 69 74 65 le *p, . sqlite
2cec0 33 5f 76 61 6c 75 65 20 2a 70 52 6f 77 69 64 2c 3_value *pRowid,
2ced0 20 0a 20 20 69 6e 74 20 2a 70 6e 43 68 6e 67 2c . int *pnChng,
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2cef0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 44 /* IN/OUT: D
2cf00 65 63 72 65 6d 65 6e 74 20 69 66 20 72 6f 77 20 ecrement if row
2cf10 69 73 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 is deleted */.
2cf20 75 33 32 20 2a 61 53 7a 44 65 6c 0a 29 7b 0a 20 u32 *aSzDel.){.
2cf30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
2cf40 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 _OK;
2cf50 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 /* Return code
2cf60 2a 2f 0a 20 20 69 6e 74 20 62 46 6f 75 6e 64 20 */. int bFound
2cf70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
2cf80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
2cf90 2a 70 52 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 *pRowid really i
2cfa0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a s in the table *
2cfb0 2f 0a 0a 20 20 66 74 73 33 44 65 6c 65 74 65 54 /.. fts3DeleteT
2cfc0 65 72 6d 73 28 26 72 63 2c 20 70 2c 20 70 52 6f erms(&rc, p, pRo
2cfd0 77 69 64 2c 20 61 53 7a 44 65 6c 2c 20 26 62 46 wid, aSzDel, &bF
2cfe0 6f 75 6e 64 29 3b 0a 20 20 69 66 28 20 62 46 6f ound);. if( bFo
2cff0 75 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 und && rc==SQLIT
2d000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 E_OK ){. int
2d010 69 73 45 6d 70 74 79 20 3d 20 30 3b 20 20 20 20 isEmpty = 0;
2d020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c /* Del
2d030 65 74 69 6e 67 20 2a 70 52 6f 77 69 64 20 6c 65 eting *pRowid le
2d040 61 76 65 73 20 74 68 65 20 74 61 62 6c 65 20 65 aves the table e
2d050 6d 70 74 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d mpty */. rc =
2d060 20 66 74 73 33 49 73 45 6d 70 74 79 28 70 2c 20 fts3IsEmpty(p,
2d070 70 52 6f 77 69 64 2c 20 26 69 73 45 6d 70 74 79 pRowid, &isEmpty
2d080 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 );. if( rc==S
2d090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
2d0a0 20 20 69 66 28 20 69 73 45 6d 70 74 79 20 29 7b if( isEmpty ){
2d0b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 . /* Dele
2d0c0 74 69 6e 67 20 74 68 69 73 20 72 6f 77 20 6d 65 ting this row me
2d0d0 61 6e 73 20 74 68 65 20 77 68 6f 6c 65 20 74 61 ans the whole ta
2d0e0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 49 6e ble is empty. In
2d0f0 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 20 this case.
2d100 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 ** delete the
2d110 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c contents of all
2d120 20 74 68 72 65 65 20 74 61 62 6c 65 73 20 61 6e three tables an
2d130 64 20 74 68 72 6f 77 20 61 77 61 79 20 61 6e 79 d throw away any
2d140 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 . ** data
2d150 20 69 6e 20 74 68 65 20 70 65 6e 64 69 6e 67 54 in the pendingT
2d160 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e erms hash table.
2d170 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 */. rc
2d180 3d 20 66 74 73 33 44 65 6c 65 74 65 41 6c 6c 28 = fts3DeleteAll(
2d190 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 2a p, 1);. *
2d1a0 70 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 pnChng = 0;.
2d1b0 20 20 20 20 6d 65 6d 73 65 74 28 61 53 7a 44 65 memset(aSzDe
2d1c0 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 33 32 l, 0, sizeof(u32
2d1d0 29 20 2a 20 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b ) * (p->nColumn+
2d1e0 31 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d 1) * 2);. }
2d1f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 else{. *p
2d200 6e 43 68 6e 67 20 3d 20 2a 70 6e 43 68 6e 67 20 nChng = *pnChng
2d210 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 - 1;. if(
2d220 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d p->zContentTbl=
2d230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
2d240 66 74 73 33 53 71 6c 45 78 65 63 28 26 72 63 2c fts3SqlExec(&rc,
2d250 20 70 2c 20 53 51 4c 5f 44 45 4c 45 54 45 5f 43 p, SQL_DELETE_C
2d260 4f 4e 54 45 4e 54 2c 20 26 70 52 6f 77 69 64 29 ONTENT, &pRowid)
2d270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
2d280 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 44 if( p->bHasD
2d290 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 ocsize ){.
2d2a0 20 20 20 20 66 74 73 33 53 71 6c 45 78 65 63 28 fts3SqlExec(
2d2b0 26 72 63 2c 20 70 2c 20 53 51 4c 5f 44 45 4c 45 &rc, p, SQL_DELE
2d2c0 54 45 5f 44 4f 43 53 49 5a 45 2c 20 26 70 52 6f TE_DOCSIZE, &pRo
2d2d0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a wid);. }.
2d2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
2d2f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a }.. return rc;.
2d300 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 }../*.** This fu
2d310 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 nction does the
2d320 77 6f 72 6b 20 66 6f 72 20 74 68 65 20 78 55 70 work for the xUp
2d330 64 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20 46 date method of F
2d340 54 53 33 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 TS3 virtual.** t
2d350 61 62 6c 65 73 2e 20 54 68 65 20 73 63 68 65 6d ables. The schem
2d360 61 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c a of the virtual
2d370 20 74 61 62 6c 65 20 62 65 69 6e 67 3a 0a 2a 2a table being:.**
2d380 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 .** CREATE T
2d390 41 42 4c 45 20 3c 74 61 62 6c 65 20 6e 61 6d 65 ABLE <table name
2d3a0 3e 28 20 0a 2a 2a 20 20 20 20 20 20 20 3c 75 73 >( .** <us
2d3b0 65 72 20 63 6f 6c 75 6d 6e 73 3e 2c 0a 2a 2a 20 er columns>,.**
2d3c0 20 20 20 20 20 20 3c 74 61 62 6c 65 20 6e 61 6d <table nam
2d3d0 65 3e 20 48 49 44 44 45 4e 2c 20 0a 2a 2a 20 20 e> HIDDEN, .**
2d3e0 20 20 20 20 20 64 6f 63 69 64 20 48 49 44 44 45 docid HIDDE
2d3f0 4e 2c 20 0a 2a 2a 20 20 20 20 20 20 20 3c 6c 61 N, .** <la
2d400 6e 67 69 64 3e 20 48 49 44 44 45 4e 0a 2a 2a 20 ngid> HIDDEN.**
2d410 20 20 20 20 29 3b 0a 2a 2a 0a 2a 2a 20 0a 2a 2f );.**.** .*/
2d420 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 33 .int sqlite3Fts3
2d430 55 70 64 61 74 65 4d 65 74 68 6f 64 28 0a 20 20 UpdateMethod(.
2d440 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 sqlite3_vtab *pV
2d450 74 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 tab,
2d460 2f 2a 20 46 54 53 33 20 76 74 61 62 20 6f 62 6a /* FTS3 vtab obj
2d470 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 ect */. int nAr
2d480 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 g,
2d490 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 /* Size
2d4a0 20 6f 66 20 61 72 67 75 6d 65 6e 74 20 61 72 72 of argument arr
2d4b0 61 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f ay */. sqlite3_
2d4c0 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 2c 20 20 value **apVal,
2d4d0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 /* Array
2d4e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f of arguments */
2d4f0 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 . sqlite_int64
2d500 2a 70 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 *pRowid
2d510 20 20 20 2f 2a 20 4f 55 54 3a 20 54 68 65 20 61 /* OUT: The a
2d520 66 66 65 63 74 65 64 20 28 6f 72 20 65 66 66 65 ffected (or effe
2d530 63 74 65 64 29 20 72 6f 77 69 64 20 2a 2f 0a 29 cted) rowid */.)
2d540 7b 0a 20 20 46 74 73 33 54 61 62 6c 65 20 2a 70 {. Fts3Table *p
2d550 20 3d 20 28 46 74 73 33 54 61 62 6c 65 20 2a 29 = (Fts3Table *)
2d560 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 20 pVtab;. int rc
2d570 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 = SQLITE_OK;
2d580 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
2d590 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 rn Code */. int
2d5a0 20 69 73 52 65 6d 6f 76 65 20 3d 20 30 3b 20 20 isRemove = 0;
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2d5c0 54 72 75 65 20 66 6f 72 20 61 6e 20 55 50 44 41 True for an UPDA
2d5d0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a TE or DELETE */.
2d5e0 20 20 75 33 32 20 2a 61 53 7a 49 6e 73 20 3d 20 u32 *aSzIns =
2d5f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
2d600 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 69 6e /* Sizes of in
2d610 73 65 72 74 65 64 20 64 6f 63 75 6d 65 6e 74 73 serted documents
2d620 20 2a 2f 0a 20 20 75 33 32 20 2a 61 53 7a 44 65 */. u32 *aSzDe
2d630 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 l = 0;
2d640 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f /* Sizes o
2d650 66 20 64 65 6c 65 74 65 64 20 64 6f 63 75 6d 65 f deleted docume
2d660 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 nts */. int nCh
2d670 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 ng = 0;
2d680 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 74 20 /* Net
2d690 63 68 61 6e 67 65 20 69 6e 20 6e 75 6d 62 65 72 change in number
2d6a0 20 6f 66 20 64 6f 63 75 6d 65 6e 74 73 20 2a 2f of documents */
2d6b0 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 44 6f . int bInsertDo
2d6c0 6e 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 74 ne = 0;.. /* At
2d6d0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d this point it m
2d6e0 75 73 74 20 62 65 20 6b 6e 6f 77 6e 20 69 66 20 ust be known if
2d6f0 74 68 65 20 25 5f 73 74 61 74 20 74 61 62 6c 65 the %_stat table
2d700 20 65 78 69 73 74 73 20 6f 72 20 6e 6f 74 2e 0a exists or not..
2d710 20 20 2a 2a 20 53 6f 20 62 48 61 73 53 74 61 74 ** So bHasStat
2d720 20 6d 61 79 20 6e 6f 74 20 62 65 20 32 2e 20 20 may not be 2.
2d730 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e */. assert( p->
2d740 62 48 61 73 53 74 61 74 3d 3d 30 20 7c 7c 20 70 bHasStat==0 || p
2d750 2d 3e 62 48 61 73 53 74 61 74 3d 3d 31 20 29 3b ->bHasStat==1 );
2d760 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 .. assert( p->p
2d770 53 65 67 6d 65 6e 74 73 3d 3d 30 20 29 3b 0a 20 Segments==0 );.
2d780 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 assert( .
2d790 6e 41 72 67 3d 3d 31 20 20 20 20 20 20 20 20 20 nArg==1
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 /* D
2d7b0 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 ELETE operations
2d7c0 20 2a 2f 0a 20 20 20 7c 7c 20 6e 41 72 67 3d 3d */. || nArg==
2d7d0 28 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 (2 + p->nColumn
2d7e0 2b 20 33 29 20 20 2f 2a 20 49 4e 53 45 52 54 20 + 3) /* INSERT
2d7f0 6f 72 20 55 50 44 41 54 45 20 6f 70 65 72 61 74 or UPDATE operat
2d800 69 6f 6e 73 20 2a 2f 0a 20 20 29 3b 0a 0a 20 20 ions */. );..
2d810 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20 22 /* Check for a "
2d820 73 70 65 63 69 61 6c 22 20 49 4e 53 45 52 54 20 special" INSERT
2d830 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f operation. One o
2d840 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a f the form:. **
2d850 0a 20 20 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 . ** INSERT I
2d860 4e 54 4f 20 78 79 7a 28 78 79 7a 29 20 56 41 4c NTO xyz(xyz) VAL
2d870 55 45 53 28 27 63 6f 6d 6d 61 6e 64 27 29 3b 0a UES('command');.
2d880 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e */. if( nArg>
2d890 31 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 1 . && sqlite3
2d8a0 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 61 _value_type(apVa
2d8b0 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 l[0])==SQLITE_NU
2d8c0 4c 4c 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 LL . && sqlite
2d8d0 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 56 3_value_type(apV
2d8e0 61 6c 5b 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 32 5d al[p->nColumn+2]
2d8f0 29 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 0a )!=SQLITE_NULL .
2d900 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 74 ){. rc = ft
2d910 73 33 53 70 65 63 69 61 6c 49 6e 73 65 72 74 28 s3SpecialInsert(
2d920 70 2c 20 61 70 56 61 6c 5b 70 2d 3e 6e 43 6f 6c p, apVal[p->nCol
2d930 75 6d 6e 2b 32 5d 29 3b 0a 20 20 20 20 67 6f 74 umn+2]);. got
2d940 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 20 o update_out;.
2d950 7d 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 }.. if( nArg>1
2d960 26 26 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 && sqlite3_value
2d970 5f 69 6e 74 28 61 70 56 61 6c 5b 32 20 2b 20 70 _int(apVal[2 + p
2d980 2d 3e 6e 43 6f 6c 75 6d 6e 20 2b 20 32 5d 29 3c ->nColumn + 2])<
2d990 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 0 ){. rc = SQ
2d9a0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b LITE_CONSTRAINT;
2d9b0 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 65 . goto update
2d9c0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 _out;. }.. /*
2d9d0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 Allocate space t
2d9e0 6f 20 68 6f 6c 64 20 74 68 65 20 63 68 61 6e 67 o hold the chang
2d9f0 65 20 69 6e 20 64 6f 63 75 6d 65 6e 74 20 73 69 e in document si
2da00 7a 65 73 20 2a 2f 0a 20 20 61 53 7a 44 65 6c 20 zes */. aSzDel
2da10 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 = sqlite3_malloc
2da20 28 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b ( sizeof(aSzDel[
2da30 30 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 0])*(p->nColumn+
2da40 31 29 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 53 1)*2 );. if( aS
2da50 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 zDel==0 ){. r
2da60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d c = SQLITE_NOMEM
2da70 3b 0a 20 20 20 20 67 6f 74 6f 20 75 70 64 61 74 ;. goto updat
2da80 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 61 53 7a e_out;. }. aSz
2da90 49 6e 73 20 3d 20 26 61 53 7a 44 65 6c 5b 70 2d Ins = &aSzDel[p-
2daa0 3e 6e 43 6f 6c 75 6d 6e 2b 31 5d 3b 0a 20 20 6d >nColumn+1];. m
2dab0 65 6d 73 65 74 28 61 53 7a 44 65 6c 2c 20 30 2c emset(aSzDel, 0,
2dac0 20 73 69 7a 65 6f 66 28 61 53 7a 44 65 6c 5b 30 sizeof(aSzDel[0
2dad0 5d 29 2a 28 70 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 ])*(p->nColumn+1
2dae0 29 2a 32 29 3b 0a 0a 20 20 72 63 20 3d 20 66 74 )*2);.. rc = ft
2daf0 73 33 57 72 69 74 65 6c 6f 63 6b 28 70 29 3b 0a s3Writelock(p);.
2db00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
2db10 5f 4f 4b 20 29 20 67 6f 74 6f 20 75 70 64 61 74 _OK ) goto updat
2db20 65 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 e_out;.. /* If
2db30 74 68 69 73 20 69 73 20 61 6e 20 49 4e 53 45 52 this is an INSER
2db40 54 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 T operation, or
2db50 61 6e 20 55 50 44 41 54 45 20 74 68 61 74 20 6d an UPDATE that m
2db60 6f 64 69 66 69 65 73 20 74 68 65 20 72 6f 77 69 odifies the rowi
2db70 64 0a 20 20 2a 2a 20 76 61 6c 75 65 2c 20 74 68 d. ** value, th
2db80 65 6e 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f en this operatio
2db90 6e 20 72 65 71 75 69 72 65 73 20 63 6f 6e 73 74 n requires const
2dba0 72 61 69 6e 74 20 68 61 6e 64 6c 69 6e 67 2e 0a raint handling..
2dbb0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 **. ** If the
2dbc0 20 6f 6e 2d 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 on-conflict mod
2dbd0 65 20 69 73 20 52 45 50 4c 41 43 45 2c 20 74 68 e is REPLACE, th
2dbe0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 is means that th
2dbf0 65 20 65 78 69 73 74 69 6e 67 20 72 6f 77 0a 20 e existing row.
2dc00 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 64 65 ** should be de
2dc10 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 leted from the d
2dc20 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 atabase before i
2dc30 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e 65 77 nserting the new
2dc40 20 72 6f 77 2e 20 4f 72 2c 0a 20 20 2a 2a 20 69 row. Or,. ** i
2dc50 66 20 74 68 65 20 6f 6e 2d 63 6f 6e 66 6c 69 63 f the on-conflic
2dc60 74 20 6d 6f 64 65 20 69 73 20 6f 74 68 65 72 20 t mode is other
2dc70 74 68 61 6e 20 52 45 50 4c 41 43 45 2c 20 74 68 than REPLACE, th
2dc80 65 6e 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6d en this method m
2dc90 75 73 74 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 ust. ** detect
2dca0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 61 6e 64 the conflict and
2dcb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
2dcc0 4f 4e 53 54 52 41 49 4e 54 20 62 65 66 6f 72 65 ONSTRAINT before
2dcd0 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 beginning to.
2dce0 2a 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 ** modify the da
2dcf0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a tabase file.. *
2dd00 2f 0a 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 /. if( nArg>1 &
2dd10 26 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c & p->zContentTbl
2dd20 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 ==0 ){. /* Fi
2dd30 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 62 6a nd the value obj
2dd40 65 63 74 20 74 68 61 74 20 68 6f 6c 64 73 20 74 ect that holds t
2dd50 68 65 20 6e 65 77 20 72 6f 77 69 64 20 76 61 6c he new rowid val
2dd60 75 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 ue. */. sqlit
2dd70 65 33 5f 76 61 6c 75 65 20 2a 70 4e 65 77 52 6f e3_value *pNewRo
2dd80 77 69 64 20 3d 20 61 70 56 61 6c 5b 33 2b 70 2d wid = apVal[3+p-
2dd90 3e 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20 20 20 69 >nColumn];. i
2dda0 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 f( sqlite3_value
2ddb0 5f 74 79 70 65 28 70 4e 65 77 52 6f 77 69 64 29 _type(pNewRowid)
2ddc0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b ==SQLITE_NULL ){
2ddd0 0a 20 20 20 20 20 20 70 4e 65 77 52 6f 77 69 64 . pNewRowid
2dde0 20 3d 20 61 70 56 61 6c 5b 31 5d 3b 0a 20 20 20 = apVal[1];.
2ddf0 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 }.. if( sqli
2de00 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 te3_value_type(p
2de10 4e 65 77 52 6f 77 69 64 29 21 3d 53 51 4c 49 54 NewRowid)!=SQLIT
2de20 45 5f 4e 55 4c 4c 20 26 26 20 28 20 0a 20 20 20 E_NULL && ( .
2de30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c sqlite3_val
2de40 75 65 5f 74 79 70 65 28 61 70 56 61 6c 5b 30 5d ue_type(apVal[0]
2de50 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 0a 20 )==SQLITE_NULL.
2de60 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 76 || sqlite3_v
2de70 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c alue_int64(apVal
2de80 5b 30 5d 29 21 3d 73 71 6c 69 74 65 33 5f 76 61 [0])!=sqlite3_va
2de90 6c 75 65 5f 69 6e 74 36 34 28 70 4e 65 77 52 6f lue_int64(pNewRo
2dea0 77 69 64 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 wid). )){.
2deb0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f /* The new ro
2dec0 77 69 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 wid is not NULL
2ded0 28 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 (in this case th
2dee0 65 20 72 6f 77 69 64 20 77 69 6c 6c 20 62 65 0a e rowid will be.
2def0 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 ** automat
2df00 69 63 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 20 ically assigned
2df10 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 and there is no
2df20 63 68 61 6e 63 65 20 6f 66 20 61 20 63 6f 6e 66 chance of a conf
2df30 6c 69 63 74 29 2c 20 61 6e 64 20 0a 20 20 20 20 lict), and .
2df40 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 ** the stateme
2df50 6e 74 20 69 73 20 65 69 74 68 65 72 20 61 6e 20 nt is either an
2df60 49 4e 53 45 52 54 20 6f 72 20 61 6e 20 55 50 44 INSERT or an UPD
2df70 41 54 45 20 74 68 61 74 20 6d 6f 64 69 66 69 65 ATE that modifie
2df80 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 s the. ** r
2df90 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 20 53 6f 20 owid column. So
2dfa0 69 66 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 if the conflict
2dfb0 6d 6f 64 65 20 69 73 20 52 45 50 4c 41 43 45 2c mode is REPLACE,
2dfc0 20 74 68 65 6e 20 64 65 6c 65 74 65 20 61 6e 79 then delete any
2dfd0 0a 20 20 20 20 20 20 2a 2a 20 65 78 69 73 74 69 . ** existi
2dfe0 6e 67 20 72 6f 77 20 77 69 74 68 20 72 6f 77 69 ng row with rowi
2dff0 64 3d 70 4e 65 77 52 6f 77 69 64 2e 20 0a 20 20 d=pNewRowid. .
2e000 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 **. **
2e010 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 66 6c Or, if the confl
2e020 69 63 74 20 6d 6f 64 65 20 69 73 20 6e 6f 74 20 ict mode is not
2e030 52 45 50 4c 41 43 45 2c 20 69 6e 73 65 72 74 20 REPLACE, insert
2e040 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 the new record i
2e050 6e 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 nto . ** th
2e060 65 20 25 5f 63 6f 6e 74 65 6e 74 20 74 61 62 6c e %_content tabl
2e070 65 2e 20 49 66 20 77 65 20 68 69 74 20 74 68 65 e. If we hit the
2e080 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 69 64 duplicate rowid
2e090 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 6f 72 20 constraint (or
2e0a0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 any. ** oth
2e0b0 65 72 20 65 72 72 6f 72 29 20 77 68 69 6c 65 20 er error) while
2e0c0 64 6f 69 6e 67 20 73 6f 2c 20 72 65 74 75 72 6e doing so, return
2e0d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 immediately..
2e0e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 **. **
2e0f0 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 This branch may
2e100 61 6c 73 6f 20 72 75 6e 20 69 66 20 70 4e 65 77 also run if pNew
2e110 52 6f 77 69 64 20 63 6f 6e 74 61 69 6e 73 20 61 Rowid contains a
2e120 20 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 6e value that cann
2e130 6f 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6c ot. ** be l
2e140 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 osslessly conver
2e150 74 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 ted to an intege
2e160 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c r. In this case,
2e170 20 74 68 65 20 65 76 65 6e 74 75 61 6c 20 0a 20 the eventual .
2e180 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 ** call to
2e190 66 74 73 33 49 6e 73 65 72 74 44 61 74 61 28 29 fts3InsertData()
2e1a0 20 28 65 69 74 68 65 72 20 6a 75 73 74 20 62 65 (either just be
2e1b0 6c 6f 77 20 6f 72 20 66 75 72 74 68 65 72 20 6f low or further o
2e1c0 6e 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 20 n in this.
2e1d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 29 20 77 69 6c ** function) wil
2e1e0 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f l return SQLITE_
2e1f0 4d 49 53 4d 41 54 43 48 2e 20 49 66 20 66 74 73 MISMATCH. If fts
2e200 33 44 65 6c 65 74 65 42 79 52 6f 77 69 64 20 69 3DeleteByRowid i
2e210 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 6f s . ** invo
2e220 6b 65 64 2c 20 69 74 20 77 69 6c 6c 20 64 65 6c ked, it will del
2e230 65 74 65 20 7a 65 72 6f 20 72 6f 77 73 20 28 73 ete zero rows (s
2e240 69 6e 63 65 20 6e 6f 20 72 6f 77 20 77 69 6c 6c ince no row will
2e250 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 64 have. ** d
2e260 6f 63 69 64 3d 24 70 4e 65 77 52 6f 77 69 64 20 ocid=$pNewRowid
2e270 69 66 20 24 70 4e 65 77 52 6f 77 69 64 20 69 73 if $pNewRowid is
2e280 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 not an integer
2e290 76 61 6c 75 65 29 2e 0a 20 20 20 20 20 20 2a 2f value).. */
2e2a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 . if( sqlit
2e2b0 65 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c e3_vtab_on_confl
2e2c0 69 63 74 28 70 2d 3e 64 62 29 3d 3d 53 51 4c 49 ict(p->db)==SQLI
2e2d0 54 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 TE_REPLACE ){.
2e2e0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 44 rc = fts3D
2e2f0 65 6c 65 74 65 42 79 52 6f 77 69 64 28 70 2c 20 eleteByRowid(p,
2e300 70 4e 65 77 52 6f 77 69 64 2c 20 26 6e 43 68 6e pNewRowid, &nChn
2e310 67 2c 20 61 53 7a 44 65 6c 29 3b 0a 20 20 20 20 g, aSzDel);.
2e320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
2e330 20 72 63 20 3d 20 66 74 73 33 49 6e 73 65 72 74 rc = fts3Insert
2e340 44 61 74 61 28 70 2c 20 61 70 56 61 6c 2c 20 70 Data(p, apVal, p
2e350 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 Rowid);.
2e360 62 49 6e 73 65 72 74 44 6f 6e 65 20 3d 20 31 3b bInsertDone = 1;
2e370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
2e380 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c }. if( rc!=SQL
2e390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f ITE_OK ){. go
2e3a0 74 6f 20 75 70 64 61 74 65 5f 6f 75 74 3b 0a 20 to update_out;.
2e3b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 }.. /* If this
2e3c0 20 69 73 20 61 20 44 45 4c 45 54 45 20 6f 72 20 is a DELETE or
2e3d0 55 50 44 41 54 45 20 6f 70 65 72 61 74 69 6f 6e UPDATE operation
2e3e0 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 6c 64 , remove the old
2e3f0 20 72 65 63 6f 72 64 2e 20 2a 2f 0a 20 20 69 66 record. */. if
2e400 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f ( sqlite3_value_
2e410 74 79 70 65 28 61 70 56 61 6c 5b 30 5d 29 21 3d type(apVal[0])!=
2e420 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 SQLITE_NULL ){.
2e430 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 assert( sqlit
2e440 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 70 e3_value_type(ap
2e450 56 61 6c 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f Val[0])==SQLITE_
2e460 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 72 INTEGER );. r
2e470 63 20 3d 20 66 74 73 33 44 65 6c 65 74 65 42 79 c = fts3DeleteBy
2e480 52 6f 77 69 64 28 70 2c 20 61 70 56 61 6c 5b 30 Rowid(p, apVal[0
2e490 5d 2c 20 26 6e 43 68 6e 67 2c 20 61 53 7a 44 65 ], &nChng, aSzDe
2e4a0 6c 29 3b 0a 20 20 20 20 69 73 52 65 6d 6f 76 65 l);. isRemove
2e4b0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f = 1;. }. . /
2e4c0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 * If this is an
2e4d0 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 INSERT or UPDATE
2e4e0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 73 65 operation, inse
2e4f0 72 74 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 rt the new recor
2e500 64 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72 67 d. */. if( nArg
2e510 3e 31 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 >1 && rc==SQLITE
2e520 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 _OK ){. int i
2e530 4c 61 6e 67 69 64 20 3d 20 73 71 6c 69 74 65 33 Langid = sqlite3
2e540 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c _value_int(apVal
2e550 5b 32 20 2b 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 [2 + p->nColumn
2e560 2b 20 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 62 + 2]);. if( b
2e570 49 6e 73 65 72 74 44 6f 6e 65 3d 3d 30 20 29 7b InsertDone==0 ){
2e580 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 33 . rc = fts3
2e590 49 6e 73 65 72 74 44 61 74 61 28 70 2c 20 61 70 InsertData(p, ap
2e5a0 56 61 6c 2c 20 70 52 6f 77 69 64 29 3b 0a 20 20 Val, pRowid);.
2e5b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
2e5c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 TE_CONSTRAINT &&
2e5d0 20 70 2d 3e 7a 43 6f 6e 74 65 6e 74 54 62 6c 3d p->zContentTbl=
2e5e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 =0 ){. rc
2e5f0 20 3d 20 46 54 53 5f 43 4f 52 52 55 50 54 5f 56 = FTS_CORRUPT_V
2e600 54 41 42 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 TAB;. }.
2e610 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 }. if( rc==S
2e620 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 21 69 73 QLITE_OK && (!is
2e630 52 65 6d 6f 76 65 20 7c 7c 20 2a 70 52 6f 77 69 Remove || *pRowi
2e640 64 21 3d 70 2d 3e 69 50 72 65 76 44 6f 63 69 64 d!=p->iPrevDocid
2e650 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d ) ){. rc =
2e660 20 66 74 73 33 50 65 6e 64 69 6e 67 54 65 72 6d fts3PendingTerm
2e670 73 44 6f 63 69 64 28 70 2c 20 69 4c 61 6e 67 69 sDocid(p, iLangi
2e680 64 2c 20 2a 70 52 6f 77 69 64 29 3b 0a 20 20 20 d, *pRowid);.
2e690 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 }. if( rc==S
2e6a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
2e6b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 50 72 assert( p->iPr
2e6c0 65 76 44 6f 63 69 64 3d 3d 2a 70 52 6f 77 69 64 evDocid==*pRowid
2e6d0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 );. rc = f
2e6e0 74 73 33 49 6e 73 65 72 74 54 65 72 6d 73 28 70 ts3InsertTerms(p
2e6f0 2c 20 69 4c 61 6e 67 69 64 2c 20 61 70 56 61 6c , iLangid, apVal
2e700 2c 20 61 53 7a 49 6e 73 29 3b 0a 20 20 20 20 7d , aSzIns);. }
2e710 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 48 61 73 . if( p->bHas
2e720 44 6f 63 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 Docsize ){.
2e730 20 66 74 73 33 49 6e 73 65 72 74 44 6f 63 73 69 fts3InsertDocsi
2e740 7a 65 28 26 72 63 2c 20 70 2c 20 61 53 7a 49 6e ze(&rc, p, aSzIn
2e750 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 s);. }. nC
2e760 68 6e 67 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 hng++;. }.. if
2e770 28 20 70 2d 3e 62 46 74 73 34 20 29 7b 0a 20 20 ( p->bFts4 ){.
2e780 20 20 66 74 73 33 55 70 64 61 74 65 44 6f 63 54 fts3UpdateDocT
2e790 6f 74 61 6c 73 28 26 72 63 2c 20 70 2c 20 61 53 otals(&rc, p, aS
2e7a0 7a 49 6e 73 2c 20 61 53 7a 44 65 6c 2c 20 6e 43 zIns, aSzDel, nC
2e7b0 68 6e 67 29 3b 0a 20 20 7d 0a 0a 20 75 70 64 61 hng);. }.. upda
2e7c0 74 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 te_out:. sqlite
2e7d0 33 5f 66 72 65 65 28 61 53 7a 44 65 6c 29 3b 0a 3_free(aSzDel);.
2e7e0 20 20 73 71 6c 69 74 65 33 46 74 73 33 53 65 67 sqlite3Fts3Seg
2e7f0 6d 65 6e 74 73 43 6c 6f 73 65 28 70 29 3b 0a 20 mentsClose(p);.
2e800 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
2e810 2a 20 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 * .** Flush any
2e820 64 61 74 61 20 69 6e 20 74 68 65 20 70 65 6e 64 data in the pend
2e830 69 6e 67 2d 74 65 72 6d 73 20 68 61 73 68 20 74 ing-terms hash t
2e840 61 62 6c 65 20 74 6f 20 64 69 73 6b 2e 20 49 66 able to disk. If
2e850 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 successful,.**
2e860 6d 65 72 67 65 20 61 6c 6c 20 73 65 67 6d 65 6e merge all segmen
2e870 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 ts in the databa
2e880 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68 se (including th
2e890 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 2c 20 69 e new segment, i
2e8a0 66 20 0a 2a 2a 20 74 68 65 72 65 20 77 61 73 20 f .** there was
2e8b0 61 6e 79 20 64 61 74 61 20 74 6f 20 66 6c 75 73 any data to flus
2e8c0 68 29 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 h) into a single
2e8d0 20 73 65 67 6d 65 6e 74 2e 20 0a 2a 2f 0a 69 6e segment. .*/.in
2e8e0 74 20 73 71 6c 69 74 65 33 46 74 73 33 4f 70 74 t sqlite3Fts3Opt
2e8f0 69 6d 69 7a 65 28 46 74 73 33 54 61 62 6c 65 20 imize(Fts3Table
2e900 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 *p){. int rc;.
2e910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 rc = sqlite3_ex
2e920 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50 ec(p->db, "SAVEP
2e930 4f 49 4e 54 20 66 74 73 33 22 2c 20 30 2c 20 30 OINT fts3", 0, 0
2e940 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d , 0);. if( rc==
2e950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
2e960 20 72 63 20 3d 20 66 74 73 33 44 6f 4f 70 74 69 rc = fts3DoOpti
2e970 6d 69 7a 65 28 70 2c 20 31 29 3b 0a 20 20 20 20 mize(p, 1);.
2e980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
2e990 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f K || rc==SQLITE_
2e9a0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e DONE ){. in
2e9b0 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f t rc2 = sqlite3_
2e9c0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c exec(p->db, "REL
2e9d0 45 41 53 45 20 66 74 73 33 22 2c 20 30 2c 20 30 EASE fts3", 0, 0
2e9e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 , 0);. if(
2e9f0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc2!=SQLITE_OK )
2ea00 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d rc = rc2;. }
2ea10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 else{. sqli
2ea20 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 te3_exec(p->db,
2ea30 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 66 74 73 "ROLLBACK TO fts
2ea40 33 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 3", 0, 0, 0);.
2ea50 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 sqlite3_exec
2ea60 28 70 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 (p->db, "RELEASE
2ea70 20 66 74 73 33 22 2c 20 30 2c 20 30 2c 20 30 29 fts3", 0, 0, 0)
2ea80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 ;. }. }. sq
2ea90 6c 69 74 65 33 46 74 73 33 53 65 67 6d 65 6e 74 lite3Fts3Segment
2eaa0 73 43 6c 6f 73 65 28 70 29 3b 0a 20 20 72 65 74 sClose(p);. ret
2eab0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 urn rc;.}..#endi
2eac0 66 0a f.