/ Hex Artifact Content
Login

Artifact 9d7bd654123832879c9f7e2d37f37aebcc3271e65a5e56d9410d81ef59da7a59:


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 6e 4e 65 77 3b 0a 20 20 20 20 20  ce = nNew;.     
0300: 20 70 42 75 66 2d 3e 70 20 3d 20 70 4e 65 77 3b   pBuf->p = pNew;
0310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
0320: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
0330: 20 45 6e 63 6f 64 65 20 76 61 6c 75 65 20 69 56   Encode value iV
0340: 61 6c 20 61 73 20 61 6e 20 53 51 4c 69 74 65 20  al as an SQLite 
0350: 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e  varint and appen
0360: 64 20 69 74 20 74 6f 20 74 68 65 20 62 75 66 66  d it to the buff
0370: 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 70 42 75  er object.** pBu
0380: 66 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  f. If an OOM err
0390: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
03a0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  he error code in
03b0: 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   p..*/.void sqli
03c0: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
03d0: 65 6e 64 56 61 72 69 6e 74 28 69 6e 74 20 2a 70  endVarint(int *p
03e0: 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
03f0: 70 42 75 66 2c 20 69 36 34 20 69 56 61 6c 29 7b  pBuf, i64 iVal){
0400: 0a 20 20 69 66 28 20 66 74 73 35 42 75 66 66 65  .  if( fts5Buffe
0410: 72 47 72 6f 77 28 70 52 63 2c 20 70 42 75 66 2c  rGrow(pRc, pBuf,
0420: 20 39 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   9) ) return;.  
0430: 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
0440: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
0450: 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
0460: 5d 2c 20 69 56 61 6c 29 3b 0a 7d 0a 0a 76 6f 69  ], iVal);.}..voi
0470: 64 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  d sqlite3Fts5Put
0480: 33 32 28 75 38 20 2a 61 42 75 66 2c 20 69 6e 74  32(u8 *aBuf, int
0490: 20 69 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30   iVal){.  aBuf[0
04a0: 5d 20 3d 20 28 69 56 61 6c 3e 3e 32 34 29 20 26  ] = (iVal>>24) &
04b0: 20 30 78 30 30 46 46 3b 0a 20 20 61 42 75 66 5b   0x00FF;.  aBuf[
04c0: 31 5d 20 3d 20 28 69 56 61 6c 3e 3e 31 36 29 20  1] = (iVal>>16) 
04d0: 26 20 30 78 30 30 46 46 3b 0a 20 20 61 42 75 66  & 0x00FF;.  aBuf
04e0: 5b 32 5d 20 3d 20 28 69 56 61 6c 3e 3e 20 38 29  [2] = (iVal>> 8)
04f0: 20 26 20 30 78 30 30 46 46 3b 0a 20 20 61 42 75   & 0x00FF;.  aBu
0500: 66 5b 33 5d 20 3d 20 28 69 56 61 6c 3e 3e 20 30  f[3] = (iVal>> 0
0510: 29 20 26 20 30 78 30 30 46 46 3b 0a 7d 0a 0a 69  ) & 0x00FF;.}..i
0520: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  nt sqlite3Fts5Ge
0530: 74 33 32 28 63 6f 6e 73 74 20 75 38 20 2a 61 42  t32(const u8 *aB
0540: 75 66 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61  uf){.  return (a
0550: 42 75 66 5b 30 5d 20 3c 3c 20 32 34 29 20 2b 20  Buf[0] << 24) + 
0560: 28 61 42 75 66 5b 31 5d 20 3c 3c 20 31 36 29 20  (aBuf[1] << 16) 
0570: 2b 20 28 61 42 75 66 5b 32 5d 20 3c 3c 20 38 29  + (aBuf[2] << 8)
0580: 20 2b 20 61 42 75 66 5b 33 5d 3b 0a 7d 0a 0a 2f   + aBuf[3];.}../
0590: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 62 75 66 66  *.** Append buff
05a0: 65 72 20 6e 44 61 74 61 2f 70 44 61 74 61 20 74  er nData/pData t
05b0: 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 49  o buffer pBuf. I
05c0: 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
05d0: 63 63 75 72 73 2c 20 73 65 74 20 0a 2a 2a 20 74  ccurs, set .** t
05e0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  he error code in
05f0: 20 70 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20   p. If an error 
0600: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
0610: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
0620: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
0630: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
0640: 2d 6f 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  -op..*/.void sql
0650: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
0660: 70 65 6e 64 42 6c 6f 62 28 0a 20 20 69 6e 74 20  pendBlob(.  int 
0670: 2a 70 52 63 2c 0a 20 20 46 74 73 35 42 75 66 66  *pRc,.  Fts5Buff
0680: 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 75 33 32  er *pBuf, .  u32
0690: 20 6e 44 61 74 61 2c 20 0a 20 20 63 6f 6e 73 74   nData, .  const
06a0: 20 75 38 20 2a 70 44 61 74 61 0a 29 7b 0a 20 20   u8 *pData.){.  
06b0: 61 73 73 65 72 74 5f 6e 63 28 20 2a 70 52 63 20  assert_nc( *pRc 
06c0: 7c 7c 20 6e 44 61 74 61 3e 3d 30 20 29 3b 0a 20  || nData>=0 );. 
06d0: 20 69 66 28 20 6e 44 61 74 61 20 29 7b 0a 20 20   if( nData ){.  
06e0: 20 20 69 66 28 20 66 74 73 35 42 75 66 66 65 72    if( fts5Buffer
06f0: 47 72 6f 77 28 70 52 63 2c 20 70 42 75 66 2c 20  Grow(pRc, pBuf, 
0700: 6e 44 61 74 61 29 20 29 20 72 65 74 75 72 6e 3b  nData) ) return;
0710: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 42 75  .    memcpy(&pBu
0720: 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 70  f->p[pBuf->n], p
0730: 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
0740: 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 44 61    pBuf->n += nDa
0750: 74 61 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ta;.  }.}../*.**
0760: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6c 2d   Append the nul-
0770: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
0780: 67 20 7a 53 74 72 20 74 6f 20 74 68 65 20 62 75  g zStr to the bu
0790: 66 66 65 72 20 70 42 75 66 2e 20 54 68 69 73 20  ffer pBuf. This 
07a0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65 6e 73 75  function.** ensu
07b0: 72 65 73 20 74 68 61 74 20 74 68 65 20 62 79 74  res that the byt
07c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
07d0: 62 75 66 66 65 72 20 64 61 74 61 20 69 73 20 73  buffer data is s
07e0: 65 74 20 74 6f 20 30 78 30 30 2c 20 65 76 65 6e  et to 0x00, even
07f0: 20 0a 2a 2a 20 74 68 6f 75 67 68 20 74 68 69 73   .** though this
0800: 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63   byte is not inc
0810: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 70 42 75  luded in the pBu
0820: 66 2d 3e 6e 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76  f->n count..*/.v
0830: 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42  oid sqlite3Fts5B
0840: 75 66 66 65 72 41 70 70 65 6e 64 53 74 72 69 6e  ufferAppendStrin
0850: 67 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20  g(.  int *pRc,. 
0860: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
0870: 66 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  f, .  const char
0880: 20 2a 7a 53 74 72 0a 29 7b 0a 20 20 69 6e 74 20   *zStr.){.  int 
0890: 6e 53 74 72 20 3d 20 28 69 6e 74 29 73 74 72 6c  nStr = (int)strl
08a0: 65 6e 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69  en(zStr);.  sqli
08b0: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
08c0: 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70 42 75  endBlob(pRc, pBu
08d0: 66 2c 20 6e 53 74 72 2b 31 2c 20 28 63 6f 6e 73  f, nStr+1, (cons
08e0: 74 20 75 38 2a 29 7a 53 74 72 29 3b 0a 20 20 70  t u8*)zStr);.  p
08f0: 42 75 66 2d 3e 6e 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  Buf->n--;.}../*.
0900: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46 6d 74  ** Argument zFmt
0910: 20 69 73 20 61 20 70 72 69 6e 74 66 28 29 20 73   is a printf() s
0920: 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69  tyle format stri
0930: 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ng. This functio
0940: 6e 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68  n performs.** th
0950: 65 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65  e printf() style
0960: 20 70 72 6f 63 65 73 73 69 6e 67 2c 20 74 68 65   processing, the
0970: 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 72 65  n appends the re
0980: 73 75 6c 74 73 20 74 6f 20 62 75 66 66 65 72 20  sults to buffer 
0990: 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6b 65  pBuf..**.** Like
09a0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
09b0: 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28 29  erAppendString()
09c0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
09d0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
09e0: 20 62 79 74 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77   byte .** follow
09f0: 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20 64  ing the buffer d
0a00: 61 74 61 20 69 73 20 73 65 74 20 74 6f 20 30 78  ata is set to 0x
0a10: 30 30 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  00, even though 
0a20: 74 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74  this byte is not
0a30: 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20  .** included in 
0a40: 74 68 65 20 70 42 75 66 2d 3e 6e 20 63 6f 75 6e  the pBuf->n coun
0a50: 74 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  t..*/ .void sqli
0a60: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
0a70: 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 69 6e 74  endPrintf(.  int
0a80: 20 2a 70 52 63 2c 0a 20 20 46 74 73 35 42 75 66   *pRc,.  Fts5Buf
0a90: 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 63 68  fer *pBuf, .  ch
0aa0: 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 0a 29 7b  ar *zFmt, ....){
0ab0: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
0ac0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68  ITE_OK ){.    ch
0ad0: 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 20 20 76 61  ar *zTmp;.    va
0ae0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61  _list ap;.    va
0af0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
0b00: 3b 0a 20 20 20 20 7a 54 6d 70 20 3d 20 73 71 6c  ;.    zTmp = sql
0b10: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
0b20: 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  mt, ap);.    va_
0b30: 65 6e 64 28 61 70 29 3b 0a 0a 20 20 20 20 69 66  end(ap);..    if
0b40: 28 20 7a 54 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  ( zTmp==0 ){.   
0b50: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
0b60: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
0b70: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
0b80: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
0b90: 53 74 72 69 6e 67 28 70 52 63 2c 20 70 42 75 66  String(pRc, pBuf
0ba0: 2c 20 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20 73  , zTmp);.      s
0bb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
0bc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
0bd0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
0be0: 35 4d 70 72 69 6e 74 66 28 69 6e 74 20 2a 70 52  5Mprintf(int *pR
0bf0: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  c, const char *z
0c00: 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61  Fmt, ...){.  cha
0c10: 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69  r *zRet = 0;.  i
0c20: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
0c30: 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73  OK ){.    va_lis
0c40: 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61  t ap;.    va_sta
0c50: 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
0c60: 20 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33    zRet = sqlite3
0c70: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
0c80: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
0c90: 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65  ap);.    if( zRe
0ca0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  t==0 ){.      *p
0cb0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
0cc0: 4d 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  M; .    }.  }.  
0cd0: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 20  return zRet;.}. 
0ce0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
0cf0: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
0d00: 64 20 62 79 20 70 42 75 66 2e 20 5a 65 72 6f 20  d by pBuf. Zero 
0d10: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 62 65  the structure be
0d20: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
0d30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
0d40: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 46 74  ts5BufferFree(Ft
0d50: 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b  s5Buffer *pBuf){
0d60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
0d70: 70 42 75 66 2d 3e 70 29 3b 0a 20 20 6d 65 6d 73  pBuf->p);.  mems
0d80: 65 74 28 70 42 75 66 2c 20 30 2c 20 73 69 7a 65  et(pBuf, 0, size
0d90: 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
0da0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
0db0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
0dc0: 68 65 20 62 75 66 66 65 72 20 6f 62 6a 65 63 74  he buffer object
0dd0: 2e 20 42 75 74 20 64 6f 20 6e 6f 74 20 66 72 65  . But do not fre
0de0: 65 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  e the associated
0df0: 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   .** memory allo
0e00: 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  cation..*/.void 
0e10: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
0e20: 72 5a 65 72 6f 28 46 74 73 35 42 75 66 66 65 72  rZero(Fts5Buffer
0e30: 20 2a 70 42 75 66 29 7b 0a 20 20 70 42 75 66 2d   *pBuf){.  pBuf-
0e40: 3e 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >n = 0;.}../*.**
0e50: 20 53 65 74 20 74 68 65 20 62 75 66 66 65 72 20   Set the buffer 
0e60: 74 6f 20 63 6f 6e 74 61 69 6e 20 6e 44 61 74 61  to contain nData
0e70: 2f 70 44 61 74 61 2e 20 49 66 20 61 6e 20 4f 4f  /pData. If an OO
0e80: 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
0e90: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 74 68 65 20  leave an.** the 
0ea0: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e  error code in p.
0eb0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
0ec0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
0ed0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
0ee0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
0ef0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
0f00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0f10: 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 0a  3Fts5BufferSet(.
0f20: 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74    int *pRc,.  Ft
0f30: 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
0f40: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20  .  int nData, . 
0f50: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
0f60: 0a 29 7b 0a 20 20 70 42 75 66 2d 3e 6e 20 3d 20  .){.  pBuf->n = 
0f70: 30 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  0;.  sqlite3Fts5
0f80: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
0f90: 28 70 52 63 2c 20 70 42 75 66 2c 20 6e 44 61 74  (pRc, pBuf, nDat
0fa0: 61 2c 20 70 44 61 74 61 29 3b 0a 7d 0a 0a 69 6e  a, pData);.}..in
0fb0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  t sqlite3Fts5Pos
0fc0: 6c 69 73 74 4e 65 78 74 36 34 28 0a 20 20 63 6f  listNext64(.  co
0fd0: 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
0fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
0ff0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
1000: 6e 67 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20  ng poslist */.  
1010: 69 6e 74 20 2a 70 69 2c 20 20 20 20 20 20 20 20  int *pi,        
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65  /* IN/OUT: Offse
1040: 74 20 77 69 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a  t within a[] */.
1050: 20 20 69 36 34 20 2a 70 69 4f 66 66 20 20 20 20    i64 *piOff    
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1070: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
1080: 72 65 6e 74 20 6f 66 66 73 65 74 20 2a 2f 0a 29  rent offset */.)
1090: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 3b  {.  int i = *pi;
10a0: 0a 20 20 69 66 28 20 69 3e 3d 6e 20 29 7b 0a 20  .  if( i>=n ){. 
10b0: 20 20 20 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20     /* EOF */.   
10c0: 20 2a 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20   *piOff = -1;.  
10d0: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 0a 20 20    return 1;  .  
10e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 69  }else{.    i64 i
10f0: 4f 66 66 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20  Off = *piOff;.  
1100: 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
1110: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
1120: 74 33 32 28 61 2c 20 69 2c 20 69 56 61 6c 29 3b  t32(a, i, iVal);
1130: 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d 31  .    if( iVal==1
1140: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 46 61   ){.      fts5Fa
1150: 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  stGetVarint32(a,
1160: 20 69 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20   i, iVal);.     
1170: 20 69 4f 66 66 20 3d 20 28 28 69 36 34 29 69 56   iOff = ((i64)iV
1180: 61 6c 29 20 3c 3c 20 33 32 3b 0a 20 20 20 20 20  al) << 32;.     
1190: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
11a0: 6e 74 33 32 28 61 2c 20 69 2c 20 69 56 61 6c 29  nt32(a, i, iVal)
11b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 69 4f  ;.    }.    *piO
11c0: 66 66 20 3d 20 69 4f 66 66 20 2b 20 28 69 56 61  ff = iOff + (iVa
11d0: 6c 2d 32 29 3b 0a 20 20 20 20 2a 70 69 20 3d 20  l-2);.    *pi = 
11e0: 69 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  i;.    return 0;
11f0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  .  }.}.../*.** A
1200: 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
1210: 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
1220: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
1230: 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  gument. Return t
1240: 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69 74  rue.** if the it
1250: 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45  erator reaches E
1260: 4f 46 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  OF, or false oth
1270: 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1280: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1290: 74 52 65 61 64 65 72 4e 65 78 74 28 46 74 73 35  tReaderNext(Fts5
12a0: 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 2a 70  PoslistReader *p
12b0: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c  Iter){.  if( sql
12c0: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
12d0: 65 78 74 36 34 28 70 49 74 65 72 2d 3e 61 2c 20  ext64(pIter->a, 
12e0: 70 49 74 65 72 2d 3e 6e 2c 20 26 70 49 74 65 72  pIter->n, &pIter
12f0: 2d 3e 69 2c 20 26 70 49 74 65 72 2d 3e 69 50 6f  ->i, &pIter->iPo
1300: 73 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  s) ){.    pIter-
1310: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 0a 20  >bEof = 1;.  }. 
1320: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62   return pIter->b
1330: 45 6f 66 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  Eof;.}..int sqli
1340: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
1350: 61 64 65 72 49 6e 69 74 28 0a 20 20 63 6f 6e 73  aderInit(.  cons
1360: 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20  t u8 *a, int n, 
1370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1380: 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 74 6f  oslist buffer to
1390: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
13a0: 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 6c 69 73   */.  Fts5Poslis
13b0: 74 52 65 61 64 65 72 20 2a 70 49 74 65 72 20 20  tReader *pIter  
13c0: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
13d0: 72 20 6f 62 6a 65 63 74 20 74 6f 20 69 6e 69 74  r object to init
13e0: 69 61 6c 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 6d  ialize */.){.  m
13f0: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
1400: 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
1410: 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 61 3b  .  pIter->a = a;
1420: 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 6e 3b  .  pIter->n = n;
1430: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  .  sqlite3Fts5Po
1440: 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
1450: 70 49 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  pIter);.  return
1460: 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a   pIter->bEof;.}.
1470: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 70 6f  ./*.** Append po
1480: 73 69 74 69 6f 6e 20 69 50 6f 73 20 74 6f 20 74  sition iPos to t
1490: 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
14a0: 20 62 65 69 6e 67 20 61 63 63 75 6d 75 6c 61 74   being accumulat
14b0: 65 64 20 69 6e 20 62 75 66 66 65 72 0a 2a 2a 20  ed in buffer.** 
14c0: 70 42 75 66 2c 20 77 68 69 63 68 20 6d 75 73 74  pBuf, which must
14d0: 20 62 65 20 61 6c 72 65 61 64 79 20 62 65 20 6c   be already be l
14e0: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
14f0: 6f 6c 64 20 74 68 65 20 6e 65 77 20 64 61 74 61  old the new data
1500: 2e 0a 2a 2a 20 54 68 65 20 70 72 65 76 69 6f 75  ..** The previou
1510: 73 20 70 6f 73 69 74 69 6f 6e 20 77 72 69 74 74  s position writt
1520: 65 6e 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20  en to this list 
1530: 69 73 20 2a 70 69 50 72 65 76 2e 20 2a 70 69 50  is *piPrev. *piP
1540: 72 65 76 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  rev is set.** to
1550: 20 69 50 6f 73 20 62 65 66 6f 72 65 20 72 65 74   iPos before ret
1560: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  urning..*/.void 
1570: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1580: 73 74 53 61 66 65 41 70 70 65 6e 64 28 0a 20 20  stSafeAppend(.  
1590: 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
15a0: 2c 20 0a 20 20 69 36 34 20 2a 70 69 50 72 65 76  , .  i64 *piPrev
15b0: 2c 20 0a 20 20 69 36 34 20 69 50 6f 73 0a 29 7b  , .  i64 iPos.){
15c0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
15d0: 69 36 34 20 63 6f 6c 6d 61 73 6b 20 3d 20 28 28  i64 colmask = ((
15e0: 69 36 34 29 28 30 78 37 46 46 46 46 46 46 46 29  i64)(0x7FFFFFFF)
15f0: 29 20 3c 3c 20 33 32 3b 0a 20 20 69 66 28 20 28  ) << 32;.  if( (
1600: 69 50 6f 73 20 26 20 63 6f 6c 6d 61 73 6b 29 20  iPos & colmask) 
1610: 21 3d 20 28 2a 70 69 50 72 65 76 20 26 20 63 6f  != (*piPrev & co
1620: 6c 6d 61 73 6b 29 20 29 7b 0a 20 20 20 20 70 42  lmask) ){.    pB
1630: 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d  uf->p[pBuf->n++]
1640: 20 3d 20 31 3b 0a 20 20 20 20 70 42 75 66 2d 3e   = 1;.    pBuf->
1650: 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1660: 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1670: 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 28 69 50  >p[pBuf->n], (iP
1680: 6f 73 3e 3e 33 32 29 29 3b 0a 20 20 20 20 2a 70  os>>32));.    *p
1690: 69 50 72 65 76 20 3d 20 28 69 50 6f 73 20 26 20  iPrev = (iPos & 
16a0: 63 6f 6c 6d 61 73 6b 29 3b 0a 20 20 7d 0a 20 20  colmask);.  }.  
16b0: 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
16c0: 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28  e3Fts5PutVarint(
16d0: 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
16e0: 5d 2c 20 28 69 50 6f 73 2d 2a 70 69 50 72 65 76  ], (iPos-*piPrev
16f0: 29 2b 32 29 3b 0a 20 20 2a 70 69 50 72 65 76 20  )+2);.  *piPrev 
1700: 3d 20 69 50 6f 73 3b 0a 7d 0a 0a 69 6e 74 20 73  = iPos;.}..int s
1710: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1720: 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 0a 20  tWriterAppend(. 
1730: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1740: 66 2c 20 0a 20 20 46 74 73 35 50 6f 73 6c 69 73  f, .  Fts5Poslis
1750: 74 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  tWriter *pWriter
1760: 2c 0a 20 20 69 36 34 20 69 50 6f 73 0a 29 7b 0a  ,.  i64 iPos.){.
1770: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1780: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 6f  /* Initialized o
1790: 6e 6c 79 20 74 6f 20 73 75 70 70 72 65 73 73 20  nly to suppress 
17a0: 65 72 72 6f 6e 65 6f 75 73 20 77 61 72 6e 69 6e  erroneous warnin
17b0: 67 20 66 72 6f 6d 20 43 6c 61 6e 67 20 2a 2f 0a  g from Clang */.
17c0: 20 20 69 66 28 20 66 74 73 35 42 75 66 66 65 72    if( fts5Buffer
17d0: 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20  Grow(&rc, pBuf, 
17e0: 35 2b 35 2b 35 29 20 29 20 72 65 74 75 72 6e 20  5+5+5) ) return 
17f0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  rc;.  sqlite3Fts
1800: 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
1810: 6e 64 28 70 42 75 66 2c 20 26 70 57 72 69 74 65  nd(pBuf, &pWrite
1820: 72 2d 3e 69 50 72 65 76 2c 20 69 50 6f 73 29 3b  r->iPrev, iPos);
1830: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1840: 5f 4f 4b 3b 0a 7d 0a 0a 76 6f 69 64 20 2a 73 71  _OK;.}..void *sq
1850: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
1860: 65 72 6f 28 69 6e 74 20 2a 70 52 63 2c 20 73 71  ero(int *pRc, sq
1870: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
1880: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
1890: 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
18a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18b0: 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65     pRet = sqlite
18c0: 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
18d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d  );.    if( pRet=
18e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
18f0: 6e 42 79 74 65 3e 30 20 29 20 2a 70 52 63 20 3d  nByte>0 ) *pRc =
1900: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1920: 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
1930: 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
1940: 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
1950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1960: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
1970: 64 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74  d copy of the st
1980: 72 69 6e 67 20 69 6e 64 69 63 61 74 65 64 20 62  ring indicated b
1990: 79 20 70 49 6e 2e 20 49 66 20 6e 49 6e 0a 2a 2a  y pIn. If nIn.**
19a0: 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
19b0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
19c0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
19d0: 74 72 69 6e 67 20 69 6e 20 62 79 74 65 73 2e 20  tring in bytes. 
19e0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68  Otherwise,.** th
19f0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
1a00: 73 74 72 69 6e 67 20 69 73 20 64 65 74 65 72 6d  string is determ
1a10: 69 6e 65 64 20 75 73 69 6e 67 20 73 74 72 6c 65  ined using strle
1a20: 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  n()..**.** It is
1a30: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1a40: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1a50: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
1a60: 66 72 65 65 20 74 68 65 20 72 65 74 75 72 6e 65  free the returne
1a70: 64 0a 2a 2a 20 62 75 66 66 65 72 20 75 73 69 6e  d.** buffer usin
1a80: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
1a90: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1aa0: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1ab0: 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2f 0a  s returned. .*/.
1ac0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
1ad0: 35 53 74 72 6e 64 75 70 28 69 6e 74 20 2a 70 52  5Strndup(int *pR
1ae0: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  c, const char *p
1af0: 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20  In, int nIn){.  
1b00: 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b 0a  char *zRet = 0;.
1b10: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
1b20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1b30: 20 6e 49 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20   nIn<0 ){.      
1b40: 6e 49 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  nIn = (int)strle
1b50: 6e 28 70 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pIn);.    }.  
1b60: 20 20 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29    zRet = (char*)
1b70: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
1b80: 49 6e 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 7a  In+1);.    if( z
1b90: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  Ret ){.      mem
1ba0: 63 70 79 28 7a 52 65 74 2c 20 70 49 6e 2c 20 6e  cpy(zRet, pIn, n
1bb0: 49 6e 29 3b 0a 20 20 20 20 20 20 7a 52 65 74 5b  In);.      zRet[
1bc0: 6e 49 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  nIn] = '\0';.   
1bd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
1be0: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
1bf0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  M;.    }.  }.  r
1c00: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 0a  eturn zRet;.}...
1c10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1c20: 65 20 69 66 20 63 68 61 72 61 63 74 65 72 20 27  e if character '
1c30: 74 27 20 6d 61 79 20 62 65 20 70 61 72 74 20 6f  t' may be part o
1c40: 66 20 61 6e 20 46 54 53 35 20 62 61 72 65 77 6f  f an FTS5 barewo
1c50: 72 64 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20  rd, or false.** 
1c60: 6f 74 68 65 72 77 69 73 65 2e 20 43 68 61 72 61  otherwise. Chara
1c70: 63 74 65 72 73 20 74 68 61 74 20 6d 61 79 20 62  cters that may b
1c80: 65 20 70 61 72 74 20 6f 66 20 62 61 72 65 77 6f  e part of barewo
1c90: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  rds:.**.**   * A
1ca0: 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49 20 63 68 61  ll non-ASCII cha
1cb0: 72 61 63 74 65 72 73 2c 0a 2a 2a 20 20 20 2a 20  racters,.**   * 
1cc0: 54 68 65 20 35 32 20 75 70 70 65 72 20 61 6e 64  The 52 upper and
1cd0: 20 6c 6f 77 65 72 20 63 61 73 65 20 41 53 43 49   lower case ASCI
1ce0: 49 20 63 68 61 72 61 63 74 65 72 73 2c 20 61 6e  I characters, an
1cf0: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 31 30 20  d.**   * The 10 
1d00: 69 6e 74 65 67 65 72 20 41 53 43 49 49 20 63 68  integer ASCII ch
1d10: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 20 20 20 2a  aracters..**   *
1d20: 20 54 68 65 20 75 6e 64 65 72 73 63 6f 72 65 20   The underscore 
1d30: 63 68 61 72 61 63 74 65 72 20 22 5f 22 20 28 30  character "_" (0
1d40: 78 35 46 29 2e 0a 2a 2a 20 20 20 2a 20 54 68 65  x5F)..**   * The
1d50: 20 75 6e 69 63 6f 64 65 20 22 73 75 62 73 69 74   unicode "subsit
1d60: 75 74 65 22 20 63 68 61 72 61 63 74 65 72 20 28  ute" character (
1d70: 30 78 31 41 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  0x1A)..*/.int sq
1d80: 6c 69 74 65 33 46 74 73 35 49 73 42 61 72 65 77  lite3Fts5IsBarew
1d90: 6f 72 64 28 63 68 61 72 20 74 29 7b 0a 20 20 75  ord(char t){.  u
1da0: 38 20 61 42 61 72 65 77 6f 72 64 5b 31 32 38 5d  8 aBareword[128]
1db0: 20 3d 20 7b 0a 20 20 20 20 30 2c 20 30 2c 20 30   = {.    0, 0, 0
1dc0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1dd0: 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20      0, 0, 0, 0, 
1de0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a  0, 0, 0, 0,   /*
1df0: 20 30 78 30 30 20 2e 2e 20 30 78 30 46 20 2a 2f   0x00 .. 0x0F */
1e00: 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  .    0, 0, 0, 0,
1e10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
1e20: 30 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30  0, 0, 1, 0, 0, 0
1e30: 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78 31  , 0, 0,   /* 0x1
1e40: 30 20 2e 2e 20 30 78 31 46 20 2a 2f 0a 20 20 20  0 .. 0x1F */.   
1e50: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1e60: 30 2c 20 30 2c 20 30 2c 20 20 20 20 30 2c 20 30  0, 0, 0,    0, 0
1e70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1e80: 20 30 2c 20 20 20 2f 2a 20 30 78 32 30 20 2e 2e   0,   /* 0x20 ..
1e90: 20 30 78 32 46 20 2a 2f 0a 20 20 20 20 31 2c 20   0x2F */.    1, 
1ea0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
1eb0: 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c 20 30 2c  , 1,    1, 1, 0,
1ec0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1ed0: 20 20 2f 2a 20 30 78 33 30 20 2e 2e 20 30 78 33    /* 0x30 .. 0x3
1ee0: 46 20 2a 2f 0a 20 20 20 20 30 2c 20 31 2c 20 31  F */.    0, 1, 1
1ef0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
1f00: 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20      1, 1, 1, 1, 
1f10: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 2f 2a  1, 1, 1, 1,   /*
1f20: 20 30 78 34 30 20 2e 2e 20 30 78 34 46 20 2a 2f   0x40 .. 0x4F */
1f30: 0a 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  .    1, 1, 1, 1,
1f40: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 20   1, 1, 1, 1,    
1f50: 31 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 1, 1, 0, 0, 0
1f60: 2c 20 30 2c 20 31 2c 20 20 20 2f 2a 20 30 78 35  , 0, 1,   /* 0x5
1f70: 30 20 2e 2e 20 30 78 35 46 20 2a 2f 0a 20 20 20  0 .. 0x5F */.   
1f80: 20 30 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   0, 1, 1, 1, 1, 
1f90: 31 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c 20 31  1, 1, 1,    1, 1
1fa0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
1fb0: 20 31 2c 20 20 20 2f 2a 20 30 78 36 30 20 2e 2e   1,   /* 0x60 ..
1fc0: 20 30 78 36 46 20 2a 2f 0a 20 20 20 20 31 2c 20   0x6F */.    1, 
1fd0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
1fe0: 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c 20 31 2c  , 1,    1, 1, 1,
1ff0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 20   0, 0, 0, 0, 0  
2000: 20 20 2f 2a 20 30 78 37 30 20 2e 2e 20 30 78 37    /* 0x70 .. 0x7
2010: 46 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 72 65 74  F */.  };..  ret
2020: 75 72 6e 20 28 74 20 26 20 30 78 38 30 29 20 7c  urn (t & 0x80) |
2030: 7c 20 61 42 61 72 65 77 6f 72 64 5b 28 69 6e 74  | aBareword[(int
2040: 29 74 5d 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  )t];.}.../******
2050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2090: 2a 2a 2a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ***.*/.typedef s
20a0: 74 72 75 63 74 20 46 74 73 35 54 65 72 6d 73 65  truct Fts5Termse
20b0: 74 45 6e 74 72 79 20 46 74 73 35 54 65 72 6d 73  tEntry Fts5Terms
20c0: 65 74 45 6e 74 72 79 3b 0a 73 74 72 75 63 74 20  etEntry;.struct 
20d0: 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79  Fts5TermsetEntry
20e0: 20 7b 0a 20 20 63 68 61 72 20 2a 70 54 65 72 6d   {.  char *pTerm
20f0: 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20  ;.  int nTerm;. 
2100: 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 2f 2a 20 49 6e 64 65 78 20 28 6d 61 69 6e 20   /* Index (main 
2130: 6f 72 20 61 50 72 65 66 69 78 5b 5d 20 65 6e 74  or aPrefix[] ent
2140: 72 79 29 20 2a 2f 0a 20 20 46 74 73 35 54 65 72  ry) */.  Fts5Ter
2150: 6d 73 65 74 45 6e 74 72 79 20 2a 70 4e 65 78 74  msetEntry *pNext
2160: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73  ;.};..struct Fts
2170: 35 54 65 72 6d 73 65 74 20 7b 0a 20 20 46 74 73  5Termset {.  Fts
2180: 35 54 65 72 6d 73 65 74 45 6e 74 72 79 20 2a 61  5TermsetEntry *a
2190: 70 48 61 73 68 5b 35 31 32 5d 3b 0a 7d 3b 0a 0a  pHash[512];.};..
21a0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 54  int sqlite3Fts5T
21b0: 65 72 6d 73 65 74 4e 65 77 28 46 74 73 35 54 65  ermsetNew(Fts5Te
21c0: 72 6d 73 65 74 20 2a 2a 70 70 29 7b 0a 20 20 69  rmset **pp){.  i
21d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21e0: 4b 3b 0a 20 20 2a 70 70 20 3d 20 73 71 6c 69 74  K;.  *pp = sqlit
21f0: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
2200: 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73  (&rc, sizeof(Fts
2210: 35 54 65 72 6d 73 65 74 29 29 3b 0a 20 20 72 65  5Termset));.  re
2220: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
2230: 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d 73  sqlite3Fts5Terms
2240: 65 74 41 64 64 28 0a 20 20 46 74 73 35 54 65 72  etAdd(.  Fts5Ter
2250: 6d 73 65 74 20 2a 70 2c 20 0a 20 20 69 6e 74 20  mset *p, .  int 
2260: 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68  iIdx,.  const ch
2270: 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  ar *pTerm, int n
2280: 54 65 72 6d 2c 20 0a 20 20 69 6e 74 20 2a 70 62  Term, .  int *pb
2290: 50 72 65 73 65 6e 74 0a 29 7b 0a 20 20 69 6e 74  Present.){.  int
22a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22b0: 0a 20 20 2a 70 62 50 72 65 73 65 6e 74 20 3d 20  .  *pbPresent = 
22c0: 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
22d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 75 33 32    int i;.    u32
22e0: 20 68 61 73 68 20 3d 20 31 33 3b 0a 20 20 20 20   hash = 13;.    
22f0: 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79  Fts5TermsetEntry
2300: 20 2a 70 45 6e 74 72 79 3b 0a 0a 20 20 20 20 2f   *pEntry;..    /
2310: 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 20 68 61  * Calculate a ha
2320: 73 68 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  sh value for thi
2330: 73 20 74 65 72 6d 2e 20 54 68 69 73 20 69 73 20  s term. This is 
2340: 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 63 68  the same hash ch
2350: 65 63 6b 73 75 6d 0a 20 20 20 20 2a 2a 20 75 73  ecksum.    ** us
2360: 65 64 20 62 79 20 74 68 65 20 66 74 73 35 5f 68  ed by the fts5_h
2370: 61 73 68 2e 63 20 6d 6f 64 75 6c 65 2e 20 54 68  ash.c module. Th
2380: 69 73 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74  is is not import
2390: 61 6e 74 20 66 6f 72 20 63 6f 72 72 65 63 74 0a  ant for correct.
23a0: 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
23b0: 20 6f 66 20 74 68 65 20 6d 6f 64 75 6c 65 2c 20   of the module, 
23c0: 62 75 74 20 69 73 20 6e 65 63 65 73 73 61 72 79  but is necessary
23d0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
23e0: 73 6f 6d 65 20 74 65 73 74 73 0a 20 20 20 20 2a  some tests.    *
23f0: 2a 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 72  * designed to pr
2400: 6f 64 75 63 65 20 68 61 73 68 20 74 61 62 6c 65  oduce hash table
2410: 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 72 65 61 6c   collisions real
2420: 6c 79 20 64 6f 20 77 6f 72 6b 2e 20 20 2a 2f 0a  ly do work.  */.
2430: 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 2d      for(i=nTerm-
2440: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2450: 20 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73       hash = (has
2460: 68 20 3c 3c 20 33 29 20 5e 20 68 61 73 68 20 5e  h << 3) ^ hash ^
2470: 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 20 20 7d   pTerm[i];.    }
2480: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
2490: 68 20 3c 3c 20 33 29 20 5e 20 68 61 73 68 20 5e  h << 3) ^ hash ^
24a0: 20 69 49 64 78 3b 0a 20 20 20 20 68 61 73 68 20   iIdx;.    hash 
24b0: 3d 20 68 61 73 68 20 25 20 41 72 72 61 79 53 69  = hash % ArraySi
24c0: 7a 65 28 70 2d 3e 61 70 48 61 73 68 29 3b 0a 0a  ze(p->apHash);..
24d0: 20 20 20 20 66 6f 72 28 70 45 6e 74 72 79 3d 70      for(pEntry=p
24e0: 2d 3e 61 70 48 61 73 68 5b 68 61 73 68 5d 3b 20  ->apHash[hash]; 
24f0: 70 45 6e 74 72 79 3b 20 70 45 6e 74 72 79 3d 70  pEntry; pEntry=p
2500: 45 6e 74 72 79 2d 3e 70 4e 65 78 74 29 7b 0a 20  Entry->pNext){. 
2510: 20 20 20 20 20 69 66 28 20 70 45 6e 74 72 79 2d       if( pEntry-
2520: 3e 69 49 64 78 3d 3d 69 49 64 78 20 0a 20 20 20  >iIdx==iIdx .   
2530: 20 20 20 20 20 20 20 26 26 20 70 45 6e 74 72 79         && pEntry
2540: 2d 3e 6e 54 65 72 6d 3d 3d 6e 54 65 72 6d 20 0a  ->nTerm==nTerm .
2550: 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d            && mem
2560: 63 6d 70 28 70 45 6e 74 72 79 2d 3e 70 54 65 72  cmp(pEntry->pTer
2570: 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  m, pTerm, nTerm)
2580: 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  ==0 .      ){.  
2590: 20 20 20 20 20 20 2a 70 62 50 72 65 73 65 6e 74        *pbPresent
25a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
25b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25c0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 45 6e 74   }..    if( pEnt
25d0: 72 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ry==0 ){.      p
25e0: 45 6e 74 72 79 20 3d 20 73 71 6c 69 74 65 33 46  Entry = sqlite3F
25f0: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
2600: 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 54 65  c, sizeof(Fts5Te
2610: 72 6d 73 65 74 45 6e 74 72 79 29 20 2b 20 6e 54  rmsetEntry) + nT
2620: 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  erm);.      if( 
2630: 70 45 6e 74 72 79 20 29 7b 0a 20 20 20 20 20 20  pEntry ){.      
2640: 20 20 70 45 6e 74 72 79 2d 3e 70 54 65 72 6d 20    pEntry->pTerm 
2650: 3d 20 28 63 68 61 72 2a 29 26 70 45 6e 74 72 79  = (char*)&pEntry
2660: 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 70 45 6e  [1];.        pEn
2670: 74 72 79 2d 3e 6e 54 65 72 6d 20 3d 20 6e 54 65  try->nTerm = nTe
2680: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 74  rm;.        pEnt
2690: 72 79 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b  ry->iIdx = iIdx;
26a0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
26b0: 70 45 6e 74 72 79 2d 3e 70 54 65 72 6d 2c 20 70  pEntry->pTerm, p
26c0: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
26d0: 20 20 20 20 20 20 70 45 6e 74 72 79 2d 3e 70 4e        pEntry->pN
26e0: 65 78 74 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b  ext = p->apHash[
26f0: 68 61 73 68 5d 3b 0a 20 20 20 20 20 20 20 20 70  hash];.        p
2700: 2d 3e 61 70 48 61 73 68 5b 68 61 73 68 5d 20 3d  ->apHash[hash] =
2710: 20 70 45 6e 74 72 79 3b 0a 20 20 20 20 20 20 7d   pEntry;.      }
2720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2730: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 76 6f 69 64  turn rc;.}..void
2740: 20 73 71 6c 69 74 65 33 46 74 73 35 54 65 72 6d   sqlite3Fts5Term
2750: 73 65 74 46 72 65 65 28 46 74 73 35 54 65 72 6d  setFree(Fts5Term
2760: 73 65 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  set *p){.  if( p
2770: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   ){.    u32 i;. 
2780: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
2790: 72 61 79 53 69 7a 65 28 70 2d 3e 61 70 48 61 73  raySize(p->apHas
27a0: 68 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  h); i++){.      
27b0: 46 74 73 35 54 65 72 6d 73 65 74 45 6e 74 72 79  Fts5TermsetEntry
27c0: 20 2a 70 45 6e 74 72 79 20 3d 20 70 2d 3e 61 70   *pEntry = p->ap
27d0: 48 61 73 68 5b 69 5d 3b 0a 20 20 20 20 20 20 77  Hash[i];.      w
27e0: 68 69 6c 65 28 20 70 45 6e 74 72 79 20 29 7b 0a  hile( pEntry ){.
27f0: 20 20 20 20 20 20 20 20 46 74 73 35 54 65 72 6d          Fts5Term
2800: 73 65 74 45 6e 74 72 79 20 2a 70 44 65 6c 20 3d  setEntry *pDel =
2810: 20 70 45 6e 74 72 79 3b 0a 20 20 20 20 20 20 20   pEntry;.       
2820: 20 70 45 6e 74 72 79 20 3d 20 70 45 6e 74 72 79   pEntry = pEntry
2830: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
2840: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
2850: 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
2860: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2870: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a        ree(p);.  }.}.