/ Hex Artifact Content
Login

Artifact 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** 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 2f 0a 0a 0a 0a 23 69 6e 63  *****.*/....#inc
0180: 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68 22  lude "fts5Int.h"
0190: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
01a0: 35 42 75 66 66 65 72 53 69 7a 65 28 69 6e 74 20  5BufferSize(int 
01b0: 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
01c0: 20 2a 70 42 75 66 2c 20 75 33 32 20 6e 42 79 74   *pBuf, u32 nByt
01d0: 65 29 7b 0a 20 20 69 66 28 20 28 75 33 32 29 70  e){.  if( (u32)p
01e0: 42 75 66 2d 3e 6e 53 70 61 63 65 3c 6e 42 79 74  Buf->nSpace<nByt
01f0: 65 20 29 7b 0a 20 20 20 20 75 36 34 20 6e 4e 65  e ){.    u64 nNe
0200: 77 20 3d 20 70 42 75 66 2d 3e 6e 53 70 61 63 65  w = pBuf->nSpace
0210: 20 3f 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 20   ? pBuf->nSpace 
0220: 3a 20 36 34 3b 0a 20 20 20 20 75 38 20 2a 70 4e  : 64;.    u8 *pN
0230: 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  ew;.    while( n
0240: 4e 65 77 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20  New<nByte ){.   
0250: 20 20 20 6e 4e 65 77 20 3d 20 6e 4e 65 77 20 2a     nNew = nNew *
0260: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e   2;.    }.    pN
0270: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
0280: 6c 6c 6f 63 36 34 28 70 42 75 66 2d 3e 70 2c 20  lloc64(pBuf->p, 
0290: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 70  nNew);.    if( p
02a0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
02b0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
02c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  MEM;.      retur
02d0: 6e 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n 1;.    }else{.
02e0: 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 53 70 61        pBuf->nSpa
02f0: 63 65 20 3d 20 28 69 6e 74 29 6e 4e 65 77 3b 0a  ce = (int)nNew;.
0300: 20 20 20 20 20 20 70 42 75 66 2d 3e 70 20 3d 20        pBuf->p = 
0310: 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pNew;.    }.  }.
0320: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
0330: 2f 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20 76 61 6c  /*.** Encode val
0340: 75 65 20 69 56 61 6c 20 61 73 20 61 6e 20 53 51  ue iVal as an SQ
0350: 4c 69 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  Lite varint and 
0360: 61 70 70 65 6e 64 20 69 74 20 74 6f 20 74 68 65  append it to the
0370: 20 62 75 66 66 65 72 20 6f 62 6a 65 63 74 0a 2a   buffer object.*
0380: 2a 20 70 42 75 66 2e 20 49 66 20 61 6e 20 4f 4f  * pBuf. If an OO
0390: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
03a0: 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f  set the error co
03b0: 64 65 20 69 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64  de in p..*/.void
03c0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
03d0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 69  erAppendVarint(i
03e0: 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
03f0: 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
0400: 56 61 6c 29 7b 0a 20 20 69 66 28 20 66 74 73 35  Val){.  if( fts5
0410: 42 75 66 66 65 72 47 72 6f 77 28 70 52 63 2c 20  BufferGrow(pRc, 
0420: 70 42 75 66 2c 20 39 29 20 29 20 72 65 74 75 72  pBuf, 9) ) retur
0430: 6e 3b 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20  n;.  pBuf->n += 
0440: 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
0450: 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
0460: 75 66 2d 3e 6e 5d 2c 20 69 56 61 6c 29 3b 0a 7d  uf->n], iVal);.}
0470: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  ..void sqlite3Ft
0480: 73 35 50 75 74 33 32 28 75 38 20 2a 61 42 75 66  s5Put32(u8 *aBuf
0490: 2c 20 69 6e 74 20 69 56 61 6c 29 7b 0a 20 20 61  , int iVal){.  a
04a0: 42 75 66 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e  Buf[0] = (iVal>>
04b0: 32 34 29 20 26 20 30 78 30 30 46 46 3b 0a 20 20  24) & 0x00FF;.  
04c0: 61 42 75 66 5b 31 5d 20 3d 20 28 69 56 61 6c 3e  aBuf[1] = (iVal>
04d0: 3e 31 36 29 20 26 20 30 78 30 30 46 46 3b 0a 20  >16) & 0x00FF;. 
04e0: 20 61 42 75 66 5b 32 5d 20 3d 20 28 69 56 61 6c   aBuf[2] = (iVal
04f0: 3e 3e 20 38 29 20 26 20 30 78 30 30 46 46 3b 0a  >> 8) & 0x00FF;.
0500: 20 20 61 42 75 66 5b 33 5d 20 3d 20 28 69 56 61    aBuf[3] = (iVa
0510: 6c 3e 3e 20 30 29 20 26 20 30 78 30 30 46 46 3b  l>> 0) & 0x00FF;
0520: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
0530: 74 73 35 47 65 74 33 32 28 63 6f 6e 73 74 20 75  ts5Get32(const u
0540: 38 20 2a 61 42 75 66 29 7b 0a 20 20 72 65 74 75  8 *aBuf){.  retu
0550: 72 6e 20 28 69 6e 74 29 28 28 28 28 75 33 32 29  rn (int)((((u32)
0560: 61 42 75 66 5b 30 5d 29 3c 3c 32 34 29 20 2b 20  aBuf[0])<<24) + 
0570: 28 61 42 75 66 5b 31 5d 3c 3c 31 36 29 20 2b 20  (aBuf[1]<<16) + 
0580: 28 61 42 75 66 5b 32 5d 3c 3c 38 29 20 2b 20 61  (aBuf[2]<<8) + a
0590: 42 75 66 5b 33 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf[3]);.}../*.*
05a0: 2a 20 41 70 70 65 6e 64 20 62 75 66 66 65 72 20  * Append buffer 
05b0: 6e 44 61 74 61 2f 70 44 61 74 61 20 74 6f 20 62  nData/pData to b
05c0: 75 66 66 65 72 20 70 42 75 66 2e 20 49 66 20 61  uffer pBuf. If a
05d0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
05e0: 72 73 2c 20 73 65 74 20 0a 2a 2a 20 74 68 65 20  rs, set .** the 
05f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e  error code in p.
0600: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
0610: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
0620: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
0630: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
0640: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
0650: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0660: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
0670: 64 42 6c 6f 62 28 0a 20 20 69 6e 74 20 2a 70 52  dBlob(.  int *pR
0680: 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  c,.  Fts5Buffer 
0690: 2a 70 42 75 66 2c 20 0a 20 20 75 33 32 20 6e 44  *pBuf, .  u32 nD
06a0: 61 74 61 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ata, .  const u8
06b0: 20 2a 70 44 61 74 61 0a 29 7b 0a 20 20 61 73 73   *pData.){.  ass
06c0: 65 72 74 5f 6e 63 28 20 2a 70 52 63 20 7c 7c 20  ert_nc( *pRc || 
06d0: 6e 44 61 74 61 3e 3d 30 20 29 3b 0a 20 20 69 66  nData>=0 );.  if
06e0: 28 20 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 69  ( nData ){.    i
06f0: 66 28 20 66 74 73 35 42 75 66 66 65 72 47 72 6f  f( fts5BufferGro
0700: 77 28 70 52 63 2c 20 70 42 75 66 2c 20 6e 44 61  w(pRc, pBuf, nDa
0710: 74 61 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ta) ) return;.  
0720: 20 20 6d 65 6d 63 70 79 28 26 70 42 75 66 2d 3e    memcpy(&pBuf->
0730: 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 70 44 61 74  p[pBuf->n], pDat
0740: 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 70  a, nData);.    p
0750: 42 75 66 2d 3e 6e 20 2b 3d 20 6e 44 61 74 61 3b  Buf->n += nData;
0760: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  .  }.}../*.** Ap
0770: 70 65 6e 64 20 74 68 65 20 6e 75 6c 2d 74 65 72  pend the nul-ter
0780: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 7a  minated string z
0790: 53 74 72 20 74 6f 20 74 68 65 20 62 75 66 66 65  Str to the buffe
07a0: 72 20 70 42 75 66 2e 20 54 68 69 73 20 66 75 6e  r pBuf. This fun
07b0: 63 74 69 6f 6e 0a 2a 2a 20 65 6e 73 75 72 65 73  ction.** ensures
07c0: 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 66   that the byte f
07d0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 62 75 66  ollowing the buf
07e0: 66 65 72 20 64 61 74 61 20 69 73 20 73 65 74 20  fer data is set 
07f0: 74 6f 20 30 78 30 30 2c 20 65 76 65 6e 20 0a 2a  to 0x00, even .*
0800: 2a 20 74 68 6f 75 67 68 20 74 68 69 73 20 62 79  * though this by
0810: 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64  te is not includ
0820: 65 64 20 69 6e 20 74 68 65 20 70 42 75 66 2d 3e  ed in the pBuf->
0830: 6e 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  n count..*/.void
0840: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
0850: 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 0a  erAppendString(.
0860: 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74    int *pRc,.  Ft
0870: 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
0880: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0890: 53 74 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74  Str.){.  int nSt
08a0: 72 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  r = (int)strlen(
08b0: 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  zStr);.  sqlite3
08c0: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
08d0: 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66 2c 20  Blob(pRc, pBuf, 
08e0: 6e 53 74 72 2b 31 2c 20 28 63 6f 6e 73 74 20 75  nStr+1, (const u
08f0: 38 2a 29 7a 53 74 72 29 3b 0a 20 20 70 42 75 66  8*)zStr);.  pBuf
0900: 2d 3e 6e 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->n--;.}../*.** 
0910: 41 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69 73  Argument zFmt is
0920: 20 61 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c   a printf() styl
0930: 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e  e format string.
0940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
0950: 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65 20 70  erforms.** the p
0960: 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 70 72  rintf() style pr
0970: 6f 63 65 73 73 69 6e 67 2c 20 74 68 65 6e 20 61  ocessing, then a
0980: 70 70 65 6e 64 73 20 74 68 65 20 72 65 73 75 6c  ppends the resul
0990: 74 73 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  ts to buffer pBu
09a0: 66 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6b 65 20 73 71  f..**.** Like sq
09b0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
09c0: 70 70 65 6e 64 53 74 72 69 6e 67 28 29 2c 20 74  ppendString(), t
09d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e 73  his function ens
09e0: 75 72 65 73 20 74 68 61 74 20 74 68 65 20 62 79  ures that the by
09f0: 74 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  te .** following
0a00: 20 74 68 65 20 62 75 66 66 65 72 20 64 61 74 61   the buffer data
0a10: 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 30 2c   is set to 0x00,
0a20: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   even though thi
0a30: 73 20 62 79 74 65 20 69 73 20 6e 6f 74 0a 2a 2a  s byte is not.**
0a40: 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
0a50: 20 70 42 75 66 2d 3e 6e 20 63 6f 75 6e 74 2e 0a   pBuf->n count..
0a60: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
0a70: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
0a80: 50 72 69 6e 74 66 28 0a 20 20 69 6e 74 20 2a 70  Printf(.  int *p
0a90: 52 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  Rc,.  Fts5Buffer
0aa0: 20 2a 70 42 75 66 2c 20 0a 20 20 63 68 61 72 20   *pBuf, .  char 
0ab0: 2a 7a 46 6d 74 2c 20 2e 2e 2e 0a 29 7b 0a 20 20  *zFmt, ....){.  
0ac0: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
0ad0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61 72 20  _OK ){.    char 
0ae0: 2a 7a 54 6d 70 3b 0a 20 20 20 20 76 61 5f 6c 69  *zTmp;.    va_li
0af0: 73 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74  st ap;.    va_st
0b00: 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
0b10: 20 20 20 7a 54 6d 70 20 3d 20 73 71 6c 69 74 65     zTmp = sqlite
0b20: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
0b30: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
0b40: 28 61 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a  (ap);..    if( z
0b50: 54 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tmp==0 ){.      
0b60: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
0b70: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
0b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
0b90: 35 42 75 66 66 65 72 41 70 70 65 6e 64 53 74 72  5BufferAppendStr
0ba0: 69 6e 67 28 70 52 63 2c 20 70 42 75 66 2c 20 7a  ing(pRc, pBuf, z
0bb0: 54 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Tmp);.      sqli
0bc0: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 29 3b 0a  te3_free(zTmp);.
0bd0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 63 68 61      }.  }.}..cha
0be0: 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 4d 70  r *sqlite3Fts5Mp
0bf0: 72 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c 20  rintf(int *pRc, 
0c00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
0c10: 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a  , ...){.  char *
0c20: 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  zRet = 0;.  if( 
0c30: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
0c40: 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61  ){.    va_list a
0c50: 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  p;.    va_start(
0c60: 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a  ap, zFmt);.    z
0c70: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Ret = sqlite3_vm
0c80: 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
0c90: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
0ca0: 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d 3d  ;.    if( zRet==
0cb0: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  0 ){.      *pRc 
0cc0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20  = SQLITE_NOMEM; 
0cd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0ce0: 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 20 0a 0a 2f  urn zRet;.}. ../
0cf0: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 62 75  *.** Free any bu
0d00: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
0d10: 79 20 70 42 75 66 2e 20 5a 65 72 6f 20 74 68 65  y pBuf. Zero the
0d20: 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72   structure befor
0d30: 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
0d40: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
0d50: 42 75 66 66 65 72 46 72 65 65 28 46 74 73 35 42  BufferFree(Fts5B
0d60: 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
0d70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75  sqlite3_free(pBu
0d80: 66 2d 3e 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28  f->p);.  memset(
0d90: 70 42 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pBuf, 0, sizeof(
0da0: 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 7d 0a  Fts5Buffer));.}.
0db0: 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20  ./*.** Zero the 
0dc0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
0dd0: 62 75 66 66 65 72 20 6f 62 6a 65 63 74 2e 20 42  buffer object. B
0de0: 75 74 20 64 6f 20 6e 6f 74 20 66 72 65 65 20 74  ut do not free t
0df0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  he associated .*
0e00: 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
0e10: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
0e20: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65  ite3Fts5BufferZe
0e30: 72 6f 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  ro(Fts5Buffer *p
0e40: 42 75 66 29 7b 0a 20 20 70 42 75 66 2d 3e 6e 20  Buf){.  pBuf->n 
0e50: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
0e60: 74 20 74 68 65 20 62 75 66 66 65 72 20 74 6f 20  t the buffer to 
0e70: 63 6f 6e 74 61 69 6e 20 6e 44 61 74 61 2f 70 44  contain nData/pD
0e80: 61 74 61 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  ata. If an OOM e
0e90: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
0ea0: 76 65 20 61 6e 0a 2a 2a 20 74 68 65 20 65 72 72  ve an.** the err
0eb0: 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e 20 49 66  or code in p. If
0ec0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
0ed0: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
0ee0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
0ef0: 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  n.** is called, 
0f00: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
0f10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
0f20: 73 35 42 75 66 66 65 72 53 65 74 28 0a 20 20 69  s5BufferSet(.  i
0f30: 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35 42  nt *pRc,.  Fts5B
0f40: 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20  uffer *pBuf, .  
0f50: 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20 20 63 6f  int nData, .  co
0f60: 6e 73 74 20 75 38 20 2a 70 44 61 74 61 0a 29 7b  nst u8 *pData.){
0f70: 0a 20 20 70 42 75 66 2d 3e 6e 20 3d 20 30 3b 0a  .  pBuf->n = 0;.
0f80: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
0f90: 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52  ferAppendBlob(pR
0fa0: 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2c 20  c, pBuf, nData, 
0fb0: 70 44 61 74 61 29 3b 0a 7d 0a 0a 69 6e 74 20 73  pData);.}..int s
0fc0: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
0fd0: 74 4e 65 78 74 36 34 28 0a 20 20 63 6f 6e 73 74  tNext64(.  const
0fe0: 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20   u8 *a, int n,  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1000: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1010: 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  poslist */.  int
1020: 20 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20 20   *pi,           
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1040: 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20 77  IN/OUT: Offset w
1050: 69 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69  ithin a[] */.  i
1060: 36 34 20 2a 70 69 4f 66 66 20 20 20 20 20 20 20  64 *piOff       
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1080: 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1090: 74 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  t offset */.){. 
10a0: 20 69 6e 74 20 69 20 3d 20 2a 70 69 3b 0a 20 20   int i = *pi;.  
10b0: 69 66 28 20 69 3e 3d 6e 20 29 7b 0a 20 20 20 20  if( i>=n ){.    
10c0: 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20 20 2a 70  /* EOF */.    *p
10d0: 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 20 20 72  iOff = -1;.    r
10e0: 65 74 75 72 6e 20 31 3b 20 20 0a 20 20 7d 65 6c  eturn 1;  .  }el
10f0: 73 65 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66  se{.    i64 iOff
1100: 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 20 20 69   = *piOff;.    i
1110: 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 66 74 73  nt iVal;.    fts
1120: 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
1130: 28 61 2c 20 69 2c 20 69 56 61 6c 29 3b 0a 20 20  (a, i, iVal);.  
1140: 20 20 69 66 28 20 69 56 61 6c 3c 3d 31 20 29 7b    if( iVal<=1 ){
1150: 0a 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3d  .      if( iVal=
1160: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
1170: 69 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 72  i = i;.        r
1180: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1190: 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
11a0: 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 2c  etVarint32(a, i,
11b0: 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 4f   iVal);.      iO
11c0: 66 66 20 3d 20 28 28 69 36 34 29 69 56 61 6c 29  ff = ((i64)iVal)
11d0: 20 3c 3c 20 33 32 3b 0a 20 20 20 20 20 20 66 74   << 32;.      ft
11e0: 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
11f0: 32 28 61 2c 20 69 2c 20 69 56 61 6c 29 3b 0a 20  2(a, i, iVal);. 
1200: 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 32 20       if( iVal<2 
1210: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1220: 69 73 20 69 73 20 61 20 63 6f 72 72 75 70 74 20  is is a corrupt 
1230: 72 65 63 6f 72 64 2e 20 53 6f 20 73 74 6f 70 20  record. So stop 
1240: 70 61 72 73 69 6e 67 20 69 74 20 68 65 72 65 2e  parsing it here.
1250: 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 69 4f   */.        *piO
1260: 66 66 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ff = -1;.       
1270: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1280: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 69   }.    }.    *pi
1290: 4f 66 66 20 3d 20 69 4f 66 66 20 2b 20 28 28 69  Off = iOff + ((i
12a0: 56 61 6c 2d 32 29 20 26 20 30 78 37 46 46 46 46  Val-2) & 0x7FFFF
12b0: 46 46 46 29 3b 0a 20 20 20 20 2a 70 69 20 3d 20  FFF);.    *pi = 
12c0: 69 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  i;.    return 0;
12d0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  .  }.}.../*.** A
12e0: 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
12f0: 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
1300: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
1310: 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  gument. Return t
1320: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 74  rue.** if the it
1330: 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45  erator reaches E
1340: 4f 46 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  OF, or false oth
1350: 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1360: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1370: 74 52 65 61 64 65 72 4e 65 78 74 28 46 74 73 35  tReaderNext(Fts5
1380: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 70  PoslistReader *p
1390: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c  Iter){.  if( sql
13a0: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
13b0: 65 78 74 36 34 28 70 49 74 65 72 2d 3e 61 2c 20  ext64(pIter->a, 
13c0: 70 49 74 65 72 2d 3e 6e 2c 20 26 70 49 74 65 72  pIter->n, &pIter
13d0: 2d 3e 69 2c 20 26 70 49 74 65 72 2d 3e 69 50 6f  ->i, &pIter->iPo
13e0: 73 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  s) ){.    pIter-
13f0: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 0a 20  >bEof = 1;.  }. 
1400: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62   return pIter->b
1410: 45 6f 66 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  Eof;.}..int sqli
1420: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
1430: 61 64 65 72 49 6e 69 74 28 0a 20 20 63 6f 6e 73  aderInit(.  cons
1440: 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20  t u8 *a, int n, 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1460: 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 74 6f  oslist buffer to
1470: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1480: 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 6c 69 73   */.  Fts5Poslis
1490: 74 52 65 61 64 65 72 20 2a 70 49 74 65 72 20 20  tReader *pIter  
14a0: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
14b0: 72 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e 69 74  r object to init
14c0: 69 61 6c 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 6d  ialize */.){.  m
14d0: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
14e0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
14f0: 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 61 3b  .  pIter->a = a;
1500: 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 6e 3b  .  pIter->n = n;
1510: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  .  sqlite3Fts5Po
1520: 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
1530: 70 49 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  pIter);.  return
1540: 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a   pIter->bEof;.}.
1550: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 70 6f  ./*.** Append po
1560: 73 69 74 69 6f 6e 20 69 50 6f 73 20 74 6f 20 74  sition iPos to t
1570: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
1580: 20 62 65 69 6e 67 20 61 63 63 75 6d 75 6c 61 74   being accumulat
1590: 65 64 20 69 6e 20 62 75 66 66 65 72 0a 2a 2a 20  ed in buffer.** 
15a0: 70 42 75 66 2c 20 77 68 69 63 68 20 6d 75 73 74  pBuf, which must
15b0: 20 62 65 20 61 6c 72 65 61 64 79 20 62 65 20 6c   be already be l
15c0: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
15d0: 6f 6c 64 20 74 68 65 20 6e 65 77 20 64 61 74 61  old the new data
15e0: 2e 0a 2a 2a 20 54 68 65 20 70 72 65 76 69 6f 75  ..** The previou
15f0: 73 20 70 6f 73 69 74 69 6f 6e 20 77 72 69 74 74  s position writt
1600: 65 6e 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20  en to this list 
1610: 69 73 20 2a 70 69 50 72 65 76 2e 20 2a 70 69 50  is *piPrev. *piP
1620: 72 65 76 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  rev is set.** to
1630: 20 69 50 6f 73 20 62 65 66 6f 72 65 20 72 65 74   iPos before ret
1640: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  urning..*/.void 
1650: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1660: 73 74 53 61 66 65 41 70 70 65 6e 64 28 0a 20 20  stSafeAppend(.  
1670: 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1680: 2c 20 0a 20 20 69 36 34 20 2a 70 69 50 72 65 76  , .  i64 *piPrev
1690: 2c 20 0a 20 20 69 36 34 20 69 50 6f 73 0a 29 7b  , .  i64 iPos.){
16a0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
16b0: 69 36 34 20 63 6f 6c 6d 61 73 6b 20 3d 20 28 28  i64 colmask = ((
16c0: 69 36 34 29 28 30 78 37 46 46 46 46 46 46 46 29  i64)(0x7FFFFFFF)
16d0: 29 20 3c 3c 20 33 32 3b 0a 20 20 69 66 28 20 28  ) << 32;.  if( (
16e0: 69 50 6f 73 20 26 20 63 6f 6c 6d 61 73 6b 29 20  iPos & colmask) 
16f0: 21 3d 20 28 2a 70 69 50 72 65 76 20 26 20 63 6f  != (*piPrev & co
1700: 6c 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 70 42  lmask) ){.    pB
1710: 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d  uf->p[pBuf->n++]
1720: 20 3d 20 31 3b 0a 20 20 20 20 70 42 75 66 2d 3e   = 1;.    pBuf->
1730: 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1740: 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1750: 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 28 69 50  >p[pBuf->n], (iP
1760: 6f 73 3e 3e 33 32 29 29 3b 0a 20 20 20 20 2a 70  os>>32));.    *p
1770: 69 50 72 65 76 20 3d 20 28 69 50 6f 73 20 26 20  iPrev = (iPos & 
1780: 63 6f 6c 6d 61 73 6b 29 3b 0a 20 20 7d 0a 20 20  colmask);.  }.  
1790: 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
17a0: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
17b0: 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
17c0: 5d 2c 20 28 69 50 6f 73 2d 2a 70 69 50 72 65 76  ], (iPos-*piPrev
17d0: 29 2b 32 29 3b 0a 20 20 2a 70 69 50 72 65 76 20  )+2);.  *piPrev 
17e0: 3d 20 69 50 6f 73 3b 0a 7d 0a 0a 69 6e 74 20 73  = iPos;.}..int s
17f0: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1800: 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 0a 20  tWriterAppend(. 
1810: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1820: 66 2c 20 0a 20 20 46 74 73 35 50 6f 73 6c 69 73  f, .  Fts5Poslis
1830: 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
1840: 2c 0a 20 20 69 36 34 20 69 50 6f 73 0a 29 7b 0a  ,.  i64 iPos.){.
1850: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1860: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 6f  /* Initialized o
1870: 6e 6c 79 20 74 6f 20 73 75 70 70 72 65 73 73 20  nly to suppress 
1880: 65 72 72 6f 6e 65 6f 75 73 20 77 61 72 6e 69 6e  erroneous warnin
1890: 67 20 66 72 6f 6d 20 43 6c 61 6e 67 20 2a 2f 0a  g from Clang */.
18a0: 20 20 69 66 28 20 66 74 73 35 42 75 66 66 65 72    if( fts5Buffer
18b0: 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20  Grow(&rc, pBuf, 
18c0: 35 2b 35 2b 35 29 20 29 20 72 65 74 75 72 6e 20  5+5+5) ) return 
18d0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  rc;.  sqlite3Fts
18e0: 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
18f0: 6e 64 28 70 42 75 66 2c 20 26 70 57 72 69 74 65  nd(pBuf, &pWrite
1900: 72 2d 3e 69 50 72 65 76 2c 20 69 50 6f 73 29 3b  r->iPrev, iPos);
1910: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1920: 5f 4f 4b 3b 0a 7d 0a 0a 76 6f 69 64 20 2a 73 71  _OK;.}..void *sq
1930: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
1940: 65 72 6f 28 69 6e 74 20 2a 70 52 63 2c 20 73 71  ero(int *pRc, sq
1950: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
1960: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
1970: 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
1980: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1990: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
19a0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
19b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d  );.    if( pRet=
19c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
19d0: 6e 42 79 74 65 3e 30 20 29 20 2a 70 52 63 20 3d  nByte>0 ) *pRc =
19e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
19f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a00: 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
1a10: 28 73 69 7a 65 5f 74 29 6e 42 79 74 65 29 3b 0a  (size_t)nByte);.
1a20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a30: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
1a40: 2a 20 52 65 74 75 72 6e 20 61 20 6e 75 6c 2d 74  * Return a nul-t
1a50: 65 72 6d 69 6e 61 74 65 64 20 63 6f 70 79 20 6f  erminated copy o
1a60: 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 64  f the string ind
1a70: 69 63 61 74 65 64 20 62 79 20 70 49 6e 2e 20 49  icated by pIn. I
1a80: 66 20 6e 49 6e 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  f nIn.** is non-
1a90: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
1aa0: 74 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68 20  t is the length 
1ab0: 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e  of the string in
1ac0: 20 62 79 74 65 73 2e 20 4f 74 68 65 72 77 69 73   bytes. Otherwis
1ad0: 65 2c 0a 2a 2a 20 74 68 65 20 6c 65 6e 67 74 68  e,.** the length
1ae0: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 69   of the string i
1af0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 75 73 69  s determined usi
1b00: 6e 67 20 73 74 72 6c 65 6e 28 29 2e 0a 2a 2a 0a  ng strlen()..**.
1b10: 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
1b20: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1b30: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
1b40: 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 65  ntually free the
1b50: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 62 75 66   returned.** buf
1b60: 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
1b70: 33 5f 66 72 65 65 28 29 2e 20 49 66 20 61 6e 20  3_free(). If an 
1b80: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
1b90: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1ba0: 65 64 2e 20 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ed. .*/.char *sq
1bb0: 6c 69 74 65 33 46 74 73 35 53 74 72 6e 64 75 70  lite3Fts5Strndup
1bc0: 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74  (int *pRc, const
1bd0: 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20   char *pIn, int 
1be0: 6e 49 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  nIn){.  char *zR
1bf0: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  et = 0;.  if( *p
1c00: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
1c10: 0a 20 20 20 20 69 66 28 20 6e 49 6e 3c 30 20 29  .    if( nIn<0 )
1c20: 7b 0a 20 20 20 20 20 20 6e 49 6e 20 3d 20 28 69  {.      nIn = (i
1c30: 6e 74 29 73 74 72 6c 65 6e 28 70 49 6e 29 3b 0a  nt)strlen(pIn);.
1c40: 20 20 20 20 7d 0a 20 20 20 20 7a 52 65 74 20 3d      }.    zRet =
1c50: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
1c60: 6d 61 6c 6c 6f 63 28 6e 49 6e 2b 31 29 3b 0a 20  malloc(nIn+1);. 
1c70: 20 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20     if( zRet ){. 
1c80: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 52 65 74       memcpy(zRet
1c90: 2c 20 70 49 6e 2c 20 6e 49 6e 29 3b 0a 20 20 20  , pIn, nIn);.   
1ca0: 20 20 20 7a 52 65 74 5b 6e 49 6e 5d 20 3d 20 27     zRet[nIn] = '
1cb0: 5c 30 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  \0';.    }else{.
1cc0: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
1cd0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1ce0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52  .  }.  return zR
1cf0: 65 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  et;.}.../*.** Re
1d00: 74 75 72 6e 20 74 72 75 65 20 69 66 20 63 68 61  turn true if cha
1d10: 72 61 63 74 65 72 20 27 74 27 20 6d 61 79 20 62  racter 't' may b
1d20: 65 20 70 61 72 74 20 6f 66 20 61 6e 20 46 54 53  e part of an FTS
1d30: 35 20 62 61 72 65 77 6f 72 64 2c 20 6f 72 20 66  5 bareword, or f
1d40: 61 6c 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73  alse.** otherwis
1d50: 65 2e 20 43 68 61 72 61 63 74 65 72 73 20 74 68  e. Characters th
1d60: 61 74 20 6d 61 79 20 62 65 20 70 61 72 74 20 6f  at may be part o
1d70: 66 20 62 61 72 65 77 6f 72 64 73 3a 0a 2a 2a 0a  f barewords:.**.
1d80: 2a 2a 20 20 20 2a 20 41 6c 6c 20 6e 6f 6e 2d 41  **   * All non-A
1d90: 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73 2c  SCII characters,
1da0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 35 32 20 75  .**   * The 52 u
1db0: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63  pper and lower c
1dc0: 61 73 65 20 41 53 43 49 49 20 63 68 61 72 61 63  ase ASCII charac
1dd0: 74 65 72 73 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  ters, and.**   *
1de0: 20 54 68 65 20 31 30 20 69 6e 74 65 67 65 72 20   The 10 integer 
1df0: 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73  ASCII characters
1e00: 2e 0a 2a 2a 20 20 20 2a 20 54 68 65 20 75 6e 64  ..**   * The und
1e10: 65 72 73 63 6f 72 65 20 63 68 61 72 61 63 74 65  erscore characte
1e20: 72 20 22 5f 22 20 28 30 78 35 46 29 2e 0a 2a 2a  r "_" (0x5F)..**
1e30: 20 20 20 2a 20 54 68 65 20 75 6e 69 63 6f 64 65     * The unicode
1e40: 20 22 73 75 62 73 69 74 75 74 65 22 20 63 68 61   "subsitute" cha
1e50: 72 61 63 74 65 72 20 28 30 78 31 41 29 2e 0a 2a  racter (0x1A)..*
1e60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1e70: 35 49 73 42 61 72 65 77 6f 72 64 28 63 68 61 72  5IsBareword(char
1e80: 20 74 29 7b 0a 20 20 75 38 20 61 42 61 72 65 77   t){.  u8 aBarew
1e90: 6f 72 64 5b 31 32 38 5d 20 3d 20 7b 0a 20 20 20  ord[128] = {.   
1ea0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1eb0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 30 2c 20 30  0, 0, 0,    0, 0
1ec0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1ed0: 20 30 2c 20 20 20 2f 2a 20 30 78 30 30 20 2e 2e   0,   /* 0x00 ..
1ee0: 20 30 78 30 46 20 2a 2f 0a 20 20 20 20 30 2c 20   0x0F */.    0, 
1ef0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
1f00: 2c 20 30 2c 20 20 20 20 30 2c 20 30 2c 20 31 2c  , 0,    0, 0, 1,
1f10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1f20: 20 20 2f 2a 20 30 78 31 30 20 2e 2e 20 30 78 31    /* 0x10 .. 0x1
1f30: 46 20 2a 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30  F */.    0, 0, 0
1f40: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1f50: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
1f60: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a  0, 0, 0, 0,   /*
1f70: 20 30 78 32 30 20 2e 2e 20 30 78 32 46 20 2a 2f   0x20 .. 0x2F */
1f80: 0a 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  .    1, 1, 1, 1,
1f90: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 20   1, 1, 1, 1,    
1fa0: 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 1, 0, 0, 0, 0
1fb0: 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78 33  , 0, 0,   /* 0x3
1fc0: 30 20 2e 2e 20 30 78 33 46 20 2a 2f 0a 20 20 20  0 .. 0x3F */.   
1fd0: 20 30 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   0, 1, 1, 1, 1, 
1fe0: 31 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c 20 31  1, 1, 1,    1, 1
1ff0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
2000: 20 31 2c 20 20 20 2f 2a 20 30 78 34 30 20 2e 2e   1,   /* 0x40 ..
2010: 20 30 78 34 46 20 2a 2f 0a 20 20 20 20 31 2c 20   0x4F */.    1, 
2020: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
2030: 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c 20 31 2c  , 1,    1, 1, 1,
2040: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
2050: 20 20 2f 2a 20 30 78 35 30 20 2e 2e 20 30 78 35    /* 0x50 .. 0x5
2060: 46 20 2a 2f 0a 20 20 20 20 30 2c 20 31 2c 20 31  F */.    0, 1, 1
2070: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
2080: 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20      1, 1, 1, 1, 
2090: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 2f 2a  1, 1, 1, 1,   /*
20a0: 20 30 78 36 30 20 2e 2e 20 30 78 36 46 20 2a 2f   0x60 .. 0x6F */
20b0: 0a 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  .    1, 1, 1, 1,
20c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 20   1, 1, 1, 1,    
20d0: 31 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 1, 1, 0, 0, 0
20e0: 2c 20 30 2c 20 30 20 20 20 20 2f 2a 20 30 78 37  , 0, 0    /* 0x7
20f0: 30 20 2e 2e 20 30 78 37 46 20 2a 2f 0a 20 20 7d  0 .. 0x7F */.  }
2100: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 74 20 26  ;..  return (t &
2110: 20 30 78 38 30 29 20 7c 7c 20 61 42 61 72 65 77   0x80) || aBarew
2120: 6f 72 64 5b 28 69 6e 74 29 74 5d 3b 0a 7d 0a 0a  ord[(int)t];.}..
2130: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 74  ***********.*/.t
2180: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2190: 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20 46  s5TermsetEntry F
21a0: 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79 3b  ts5TermsetEntry;
21b0: 0a 73 74 72 75 63 74 20 46 74 73 35 54 65 72 6d  .struct Fts5Term
21c0: 73 65 74 45 6e 74 72 79 20 7b 0a 20 20 63 68 61  setEntry {.  cha
21d0: 72 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  r *pTerm;.  int 
21e0: 6e 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 49 64  nTerm;.  int iId
21f0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2200: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2210: 78 20 28 6d 61 69 6e 20 6f 72 20 61 50 72 65 66  x (main or aPref
2220: 69 78 5b 5d 20 65 6e 74 72 79 29 20 2a 2f 0a 20  ix[] entry) */. 
2230: 20 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72   Fts5TermsetEntr
2240: 79 20 2a 70 4e 65 78 74 3b 0a 7d 3b 0a 0a 73 74  y *pNext;.};..st
2250: 72 75 63 74 20 46 74 73 35 54 65 72 6d 73 65 74  ruct Fts5Termset
2260: 20 7b 0a 20 20 46 74 73 35 54 65 72 6d 73 65 74   {.  Fts5Termset
2270: 45 6e 74 72 79 20 2a 61 70 48 61 73 68 5b 35 31  Entry *apHash[51
2280: 32 5d 3b 0a 7d 3b 0a 0a 69 6e 74 20 73 71 6c 69  2];.};..int sqli
2290: 74 65 33 46 74 73 35 54 65 72 6d 73 65 74 4e 65  te3Fts5TermsetNe
22a0: 77 28 46 74 73 35 54 65 72 6d 73 65 74 20 2a 2a  w(Fts5Termset **
22b0: 70 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pp){.  int rc = 
22c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 2a 70 70  SQLITE_OK;.  *pp
22d0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61   = sqlite3Fts5Ma
22e0: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69  llocZero(&rc, si
22f0: 7a 65 6f 66 28 46 74 73 35 54 65 72 6d 73 65 74  zeof(Fts5Termset
2300: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
2310: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
2320: 74 73 35 54 65 72 6d 73 65 74 41 64 64 28 0a 20  ts5TermsetAdd(. 
2330: 20 46 74 73 35 54 65 72 6d 73 65 74 20 2a 70 2c   Fts5Termset *p,
2340: 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20   .  int iIdx,.  
2350: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72  const char *pTer
2360: 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 0a 20  m, int nTerm, . 
2370: 20 69 6e 74 20 2a 70 62 50 72 65 73 65 6e 74 0a   int *pbPresent.
2380: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2390: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 2a 70 62 50 72  LITE_OK;.  *pbPr
23a0: 65 73 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  esent = 0;.  if(
23b0: 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
23c0: 0a 20 20 20 20 75 33 32 20 68 61 73 68 20 3d 20  .    u32 hash = 
23d0: 31 33 3b 0a 20 20 20 20 46 74 73 35 54 65 72 6d  13;.    Fts5Term
23e0: 73 65 74 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  setEntry *pEntry
23f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c  ;..    /* Calcul
2400: 61 74 65 20 61 20 68 61 73 68 20 76 61 6c 75 65  ate a hash value
2410: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2e 20   for this term. 
2420: 54 68 69 73 20 69 73 20 74 68 65 20 73 61 6d 65  This is the same
2430: 20 68 61 73 68 20 63 68 65 63 6b 73 75 6d 0a 20   hash checksum. 
2440: 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68     ** used by th
2450: 65 20 66 74 73 35 5f 68 61 73 68 2e 63 20 6d 6f  e fts5_hash.c mo
2460: 64 75 6c 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  dule. This is no
2470: 74 20 69 6d 70 6f 72 74 61 6e 74 20 66 6f 72 20  t important for 
2480: 63 6f 72 72 65 63 74 0a 20 20 20 20 2a 2a 20 6f  correct.    ** o
2490: 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
24a0: 6d 6f 64 75 6c 65 2c 20 62 75 74 20 69 73 20 6e  module, but is n
24b0: 65 63 65 73 73 61 72 79 20 74 6f 20 65 6e 73 75  ecessary to ensu
24c0: 72 65 20 74 68 61 74 20 73 6f 6d 65 20 74 65 73  re that some tes
24d0: 74 73 0a 20 20 20 20 2a 2a 20 64 65 73 69 67 6e  ts.    ** design
24e0: 65 64 20 74 6f 20 70 72 6f 64 75 63 65 20 68 61  ed to produce ha
24f0: 73 68 20 74 61 62 6c 65 20 63 6f 6c 6c 69 73 69  sh table collisi
2500: 6f 6e 73 20 72 65 61 6c 6c 79 20 64 6f 20 77 6f  ons really do wo
2510: 72 6b 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  rk.  */.    for(
2520: 69 3d 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  i=nTerm-1; i>=0;
2530: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 68 61 73   i--){.      has
2540: 68 20 3d 20 28 68 61 73 68 20 3c 3c 20 33 29 20  h = (hash << 3) 
2550: 5e 20 68 61 73 68 20 5e 20 70 54 65 72 6d 5b 69  ^ hash ^ pTerm[i
2560: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  ];.    }.    has
2570: 68 20 3d 20 28 68 61 73 68 20 3c 3c 20 33 29 20  h = (hash << 3) 
2580: 5e 20 68 61 73 68 20 5e 20 69 49 64 78 3b 0a 20  ^ hash ^ iIdx;. 
2590: 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 20 25     hash = hash %
25a0: 20 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 70   ArraySize(p->ap
25b0: 48 61 73 68 29 3b 0a 0a 20 20 20 20 66 6f 72 28  Hash);..    for(
25c0: 70 45 6e 74 72 79 3d 70 2d 3e 61 70 48 61 73 68  pEntry=p->apHash
25d0: 5b 68 61 73 68 5d 3b 20 70 45 6e 74 72 79 3b 20  [hash]; pEntry; 
25e0: 70 45 6e 74 72 79 3d 70 45 6e 74 72 79 2d 3e 70  pEntry=pEntry->p
25f0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
2600: 20 70 45 6e 74 72 79 2d 3e 69 49 64 78 3d 3d 69   pEntry->iIdx==i
2610: 49 64 78 20 0a 20 20 20 20 20 20 20 20 20 20 26  Idx .          &
2620: 26 20 70 45 6e 74 72 79 2d 3e 6e 54 65 72 6d 3d  & pEntry->nTerm=
2630: 3d 6e 54 65 72 6d 20 0a 20 20 20 20 20 20 20 20  =nTerm .        
2640: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 6e 74    && memcmp(pEnt
2650: 72 79 2d 3e 70 54 65 72 6d 2c 20 70 54 65 72 6d  ry->pTerm, pTerm
2660: 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 0a 20 20 20  , nTerm)==0 .   
2670: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70     ){.        *p
2680: 62 50 72 65 73 65 6e 74 20 3d 20 31 3b 0a 20 20  bPresent = 1;.  
2690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
26b0: 69 66 28 20 70 45 6e 74 72 79 3d 3d 30 20 29 7b  if( pEntry==0 ){
26c0: 0a 20 20 20 20 20 20 70 45 6e 74 72 79 20 3d 20  .      pEntry = 
26d0: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
26e0: 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f  cZero(&rc, sizeo
26f0: 66 28 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74  f(Fts5TermsetEnt
2700: 72 79 29 20 2b 20 6e 54 65 72 6d 29 3b 0a 20 20  ry) + nTerm);.  
2710: 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 20 29      if( pEntry )
2720: 7b 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79  {.        pEntry
2730: 2d 3e 70 54 65 72 6d 20 3d 20 28 63 68 61 72 2a  ->pTerm = (char*
2740: 29 26 70 45 6e 74 72 79 5b 31 5d 3b 0a 20 20 20  )&pEntry[1];.   
2750: 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 6e 54 65       pEntry->nTe
2760: 72 6d 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20  rm = nTerm;.    
2770: 20 20 20 20 70 45 6e 74 72 79 2d 3e 69 49 64 78      pEntry->iIdx
2780: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 20   = iIdx;.       
2790: 20 6d 65 6d 63 70 79 28 70 45 6e 74 72 79 2d 3e   memcpy(pEntry->
27a0: 70 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54  pTerm, pTerm, nT
27b0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 45  erm);.        pE
27c0: 6e 74 72 79 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  ntry->pNext = p-
27d0: 3e 61 70 48 61 73 68 5b 68 61 73 68 5d 3b 0a 20  >apHash[hash];. 
27e0: 20 20 20 20 20 20 20 70 2d 3e 61 70 48 61 73 68         p->apHash
27f0: 5b 68 61 73 68 5d 20 3d 20 70 45 6e 74 72 79 3b  [hash] = pEntry;
2800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2810: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2820: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
2830: 46 74 73 35 54 65 72 6d 73 65 74 46 72 65 65 28  Fts5TermsetFree(
2840: 46 74 73 35 54 65 72 6d 73 65 74 20 2a 70 29 7b  Fts5Termset *p){
2850: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2860: 75 33 32 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  u32 i;.    for(i
2870: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
2880: 70 2d 3e 61 70 48 61 73 68 29 3b 20 69 2b 2b 29  p->apHash); i++)
2890: 7b 0a 20 20 20 20 20 20 46 74 73 35 54 65 72 6d  {.      Fts5Term
28a0: 73 65 74 45 6e 74 72 79 20 2a 70 45 6e 74 72 79  setEntry *pEntry
28b0: 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b 69 5d 3b   = p->apHash[i];
28c0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 45  .      while( pE
28d0: 6e 74 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  ntry ){.        
28e0: 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79  Fts5TermsetEntry
28f0: 20 2a 70 44 65 6c 20 3d 20 70 45 6e 74 72 79 3b   *pDel = pEntry;
2900: 0a 20 20 20 20 20 20 20 20 70 45 6e 74 72 79 20  .        pEntry 
2910: 3d 20 70 45 6e 74 72 79 2d 3e 70 4e 65 78 74 3b  = pEntry->pNext;
2920: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2930: 5f 66 72 65 65 28 70 44 65 6c 29 3b 0a 20 20 20  _free(pDel);.   
2940: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2950: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
2960: 20 20 7d 0a 7d 0a                                  }.}.