/ Hex Artifact Content
Login

Artifact 7428b0bcb257641cbecc3bacce7f40686cf99f36:


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 23 69 66 64 65  *****.*/...#ifde
0180: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0190: 46 54 53 35 0a 0a 23 69 6e 63 6c 75 64 65 20 22  FTS5..#include "
01a0: 66 74 73 35 49 6e 74 2e 68 22 0a 0a 69 6e 74 20  fts5Int.h"..int 
01b0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
01c0: 72 47 72 6f 77 28 69 6e 74 20 2a 70 52 63 2c 20  rGrow(int *pRc, 
01d0: 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
01e0: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
01f0: 2f 2a 20 41 20 6e 6f 2d 6f 70 20 69 66 20 61 6e  /* A no-op if an
0200: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
0210: 64 79 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 20  dy occurred */. 
0220: 20 69 66 28 20 2a 70 52 63 20 29 20 72 65 74 75   if( *pRc ) retu
0230: 72 6e 20 31 3b 0a 0a 20 20 69 66 28 20 28 70 42  rn 1;..  if( (pB
0240: 75 66 2d 3e 6e 20 2b 20 6e 42 79 74 65 29 20 3e  uf->n + nByte) >
0250: 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 7b   pBuf->nSpace ){
0260: 0a 20 20 20 20 75 38 20 2a 70 4e 65 77 3b 0a 20  .    u8 *pNew;. 
0270: 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 42     int nNew = pB
0280: 75 66 2d 3e 6e 53 70 61 63 65 20 3f 20 70 42 75  uf->nSpace ? pBu
0290: 66 2d 3e 6e 53 70 61 63 65 2a 32 20 3a 20 36 34  f->nSpace*2 : 64
02a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 4e 65  ;.    while( nNe
02b0: 77 3c 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 42 79  w<(pBuf->n + nBy
02c0: 74 65 29 20 29 7b 0a 20 20 20 20 20 20 6e 4e 65  te) ){.      nNe
02d0: 77 20 3d 20 6e 4e 65 77 20 2a 20 32 3b 0a 20 20  w = nNew * 2;.  
02e0: 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 73    }.    pNew = s
02f0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
0300: 42 75 66 2d 3e 70 2c 20 6e 4e 65 77 29 3b 0a 20  Buf->p, nNew);. 
0310: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
0320: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
0330: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
0340: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
0350: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
0360: 75 66 2d 3e 6e 53 70 61 63 65 20 3d 20 6e 4e 65  uf->nSpace = nNe
0370: 77 3b 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 70  w;.      pBuf->p
0380: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20   = pNew;.    }. 
0390: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
03a0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 63 6f 64 65 20 76  ../*.** Encode v
03b0: 61 6c 75 65 20 69 56 61 6c 20 61 73 20 61 6e 20  alue iVal as an 
03c0: 53 51 4c 69 74 65 20 76 61 72 69 6e 74 20 61 6e  SQLite varint an
03d0: 64 20 61 70 70 65 6e 64 20 69 74 20 74 6f 20 74  d append it to t
03e0: 68 65 20 62 75 66 66 65 72 20 6f 62 6a 65 63 74  he buffer object
03f0: 0a 2a 2a 20 70 42 75 66 2e 20 49 66 20 61 6e 20  .** pBuf. If an 
0400: 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
0410: 2c 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  , set the error 
0420: 63 6f 64 65 20 69 6e 20 70 2e 0a 2a 2f 0a 76 6f  code in p..*/.vo
0430: 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  id sqlite3Fts5Bu
0440: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
0450: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
0460: 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34  uffer *pBuf, i64
0470: 20 69 56 61 6c 29 7b 0a 20 20 69 66 28 20 73 71   iVal){.  if( sq
0480: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 47  lite3Fts5BufferG
0490: 72 6f 77 28 70 52 63 2c 20 70 42 75 66 2c 20 39  row(pRc, pBuf, 9
04a0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 42  ) ) return;.  pB
04b0: 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  uf->n += sqlite3
04c0: 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70  Fts5PutVarint(&p
04d0: 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c  Buf->p[pBuf->n],
04e0: 20 69 56 61 6c 29 3b 0a 7d 0a 0a 76 6f 69 64 20   iVal);.}..void 
04f0: 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32  sqlite3Fts5Put32
0500: 28 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 69  (u8 *aBuf, int i
0510: 56 61 6c 29 7b 0a 20 20 61 42 75 66 5b 30 5d 20  Val){.  aBuf[0] 
0520: 3d 20 28 69 56 61 6c 3e 3e 32 34 29 20 26 20 30  = (iVal>>24) & 0
0530: 78 30 30 46 46 3b 0a 20 20 61 42 75 66 5b 31 5d  x00FF;.  aBuf[1]
0540: 20 3d 20 28 69 56 61 6c 3e 3e 31 36 29 20 26 20   = (iVal>>16) & 
0550: 30 78 30 30 46 46 3b 0a 20 20 61 42 75 66 5b 32  0x00FF;.  aBuf[2
0560: 5d 20 3d 20 28 69 56 61 6c 3e 3e 20 38 29 20 26  ] = (iVal>> 8) &
0570: 20 30 78 30 30 46 46 3b 0a 20 20 61 42 75 66 5b   0x00FF;.  aBuf[
0580: 33 5d 20 3d 20 28 69 56 61 6c 3e 3e 20 30 29 20  3] = (iVal>> 0) 
0590: 26 20 30 78 30 30 46 46 3b 0a 7d 0a 0a 69 6e 74  & 0x00FF;.}..int
05a0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33   sqlite3Fts5Get3
05b0: 32 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66  2(const u8 *aBuf
05c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 61 42 75  ){.  return (aBu
05d0: 66 5b 30 5d 20 3c 3c 20 32 34 29 20 2b 20 28 61  f[0] << 24) + (a
05e0: 42 75 66 5b 31 5d 20 3c 3c 20 31 36 29 20 2b 20  Buf[1] << 16) + 
05f0: 28 61 42 75 66 5b 32 5d 20 3c 3c 20 38 29 20 2b  (aBuf[2] << 8) +
0600: 20 61 42 75 66 5b 33 5d 3b 0a 7d 0a 0a 76 6f 69   aBuf[3];.}..voi
0610: 64 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  d sqlite3Fts5Buf
0620: 66 65 72 41 70 70 65 6e 64 33 32 28 69 6e 74 20  ferAppend32(int 
0630: 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
0640: 20 2a 70 42 75 66 2c 20 69 6e 74 20 69 56 61 6c   *pBuf, int iVal
0650: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
0660: 46 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 70  Fts5BufferGrow(p
0670: 52 63 2c 20 70 42 75 66 2c 20 34 29 20 29 20 72  Rc, pBuf, 4) ) r
0680: 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
0690: 46 74 73 35 50 75 74 33 32 28 26 70 42 75 66 2d  Fts5Put32(&pBuf-
06a0: 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 56 61  >p[pBuf->n], iVa
06b0: 6c 29 3b 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d  l);.  pBuf->n +=
06c0: 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   4;.}../*.** App
06d0: 65 6e 64 20 62 75 66 66 65 72 20 6e 44 61 74 61  end buffer nData
06e0: 2f 70 44 61 74 61 20 74 6f 20 62 75 66 66 65 72  /pData to buffer
06f0: 20 70 42 75 66 2e 20 49 66 20 61 6e 20 4f 4f 4d   pBuf. If an OOM
0700: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
0710: 65 74 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  et .** the error
0720: 20 63 6f 64 65 20 69 6e 20 70 2e 20 49 66 20 61   code in p. If a
0730: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
0740: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
0750: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
0760: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ** is called, it
0770: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
0780: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
0790: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
07a0: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20  (.  int *pRc,.  
07b0: 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
07c0: 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20  , .  int nData, 
07d0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
07e0: 74 61 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ta.){.  assert( 
07f0: 2a 70 52 63 20 7c 7c 20 6e 44 61 74 61 3e 3d 30  *pRc || nData>=0
0800: 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
0810: 33 46 74 73 35 42 75 66 66 65 72 47 72 6f 77 28  3Fts5BufferGrow(
0820: 70 52 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61  pRc, pBuf, nData
0830: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  ) ) return;.  me
0840: 6d 63 70 79 28 26 70 42 75 66 2d 3e 70 5b 70 42  mcpy(&pBuf->p[pB
0850: 75 66 2d 3e 6e 5d 2c 20 70 44 61 74 61 2c 20 6e  uf->n], pData, n
0860: 44 61 74 61 29 3b 0a 20 20 70 42 75 66 2d 3e 6e  Data);.  pBuf->n
0870: 20 2b 3d 20 6e 44 61 74 61 3b 0a 7d 0a 0a 2f 2a   += nData;.}../*
0880: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e  .** Append the n
0890: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
08a0: 72 69 6e 67 20 7a 53 74 72 20 74 6f 20 74 68 65  ring zStr to the
08b0: 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 54 68   buffer pBuf. Th
08c0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 65  is function.** e
08d0: 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
08e0: 62 79 74 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  byte following t
08f0: 68 65 20 62 75 66 66 65 72 20 64 61 74 61 20 69  he buffer data i
0900: 73 20 73 65 74 20 74 6f 20 30 78 30 30 2c 20 65  s set to 0x00, e
0910: 76 65 6e 20 0a 2a 2a 20 74 68 6f 75 67 68 20 74  ven .** though t
0920: 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74 20  his byte is not 
0930: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
0940: 70 42 75 66 2d 3e 6e 20 63 6f 75 6e 74 2e 0a 2a  pBuf->n count..*
0950: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
0960: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 53 74  s5BufferAppendSt
0970: 72 69 6e 67 28 0a 20 20 69 6e 74 20 2a 70 52 63  ring(.  int *pRc
0980: 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
0990: 70 42 75 66 2c 20 0a 20 20 63 6f 6e 73 74 20 63  pBuf, .  const c
09a0: 68 61 72 20 2a 7a 53 74 72 0a 29 7b 0a 20 20 69  har *zStr.){.  i
09b0: 6e 74 20 6e 53 74 72 20 3d 20 73 74 72 6c 65 6e  nt nStr = strlen
09c0: 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  (zStr);.  sqlite
09d0: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
09e0: 64 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66 2c  dBlob(pRc, pBuf,
09f0: 20 6e 53 74 72 2b 31 2c 20 28 63 6f 6e 73 74 20   nStr+1, (const 
0a00: 75 38 2a 29 7a 53 74 72 29 3b 0a 20 20 70 42 75  u8*)zStr);.  pBu
0a10: 66 2d 3e 6e 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f->n--;.}../*.**
0a20: 20 41 72 67 75 6d 65 6e 74 20 7a 46 6d 74 20 69   Argument zFmt i
0a30: 73 20 61 20 70 72 69 6e 74 66 28 29 20 73 74 79  s a printf() sty
0a40: 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  le format string
0a50: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
0a60: 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74 68 65 20  performs.** the 
0a70: 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20 70  printf() style p
0a80: 72 6f 63 65 73 73 69 6e 67 2c 20 74 68 65 6e 20  rocessing, then 
0a90: 61 70 70 65 6e 64 73 20 74 68 65 20 72 65 73 75  appends the resu
0aa0: 6c 74 73 20 74 6f 20 62 75 66 66 65 72 20 70 42  lts to buffer pB
0ab0: 75 66 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6b 65 20 73  uf..**.** Like s
0ac0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
0ad0: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 29 2c 20  AppendString(), 
0ae0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 6e  this function en
0af0: 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 62  sures that the b
0b00: 79 74 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  yte .** followin
0b10: 67 20 74 68 65 20 62 75 66 66 65 72 20 64 61 74  g the buffer dat
0b20: 61 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 30  a is set to 0x00
0b30: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
0b40: 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74 0a 2a  is byte is not.*
0b50: 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
0b60: 65 20 70 42 75 66 2d 3e 6e 20 63 6f 75 6e 74 2e  e pBuf->n count.
0b70: 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
0b80: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
0b90: 64 50 72 69 6e 74 66 28 0a 20 20 69 6e 74 20 2a  dPrintf(.  int *
0ba0: 70 52 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65  pRc,.  Fts5Buffe
0bb0: 72 20 2a 70 42 75 66 2c 20 0a 20 20 63 68 61 72  r *pBuf, .  char
0bc0: 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 0a 29 7b 0a 20   *zFmt, ....){. 
0bd0: 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
0be0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 61 72  E_OK ){.    char
0bf0: 20 2a 7a 54 6d 70 3b 0a 20 20 20 20 76 61 5f 6c   *zTmp;.    va_l
0c00: 69 73 74 20 61 70 3b 0a 20 20 20 20 76 61 5f 73  ist ap;.    va_s
0c10: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
0c20: 20 20 20 20 7a 54 6d 70 20 3d 20 73 71 6c 69 74      zTmp = sqlit
0c30: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
0c40: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
0c50: 64 28 61 70 29 3b 0a 0a 20 20 20 20 69 66 28 20  d(ap);..    if( 
0c60: 7a 54 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zTmp==0 ){.     
0c70: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
0c80: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
0c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
0ca0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 53 74  s5BufferAppendSt
0cb0: 72 69 6e 67 28 70 52 63 2c 20 70 42 75 66 2c 20  ring(pRc, pBuf, 
0cc0: 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  zTmp);.      sql
0cd0: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 29 3b  ite3_free(zTmp);
0ce0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 63 68  .    }.  }.}..ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 4d  ar *sqlite3Fts5M
0d00: 70 72 69 6e 74 66 28 69 6e 74 20 2a 70 52 63 2c  printf(int *pRc,
0d10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
0d20: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20  t, ...){.  char 
0d30: 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *zRet = 0;.  if(
0d40: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
0d50: 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
0d60: 61 70 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  ap;.    va_start
0d70: 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20  (ap, zFmt);.    
0d80: 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  zRet = sqlite3_v
0d90: 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
0da0: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
0db0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 74 3d  );.    if( zRet=
0dc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
0dd0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
0de0: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65   .    }.  }.  re
0df0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 20 0a 0a  turn zRet;.}. ..
0e00: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 62  /*.** Free any b
0e10: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
0e20: 62 79 20 70 42 75 66 2e 20 5a 65 72 6f 20 74 68  by pBuf. Zero th
0e30: 65 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  e structure befo
0e40: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
0e50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
0e60: 35 42 75 66 66 65 72 46 72 65 65 28 46 74 73 35  5BufferFree(Fts5
0e70: 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20  Buffer *pBuf){. 
0e80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
0e90: 75 66 2d 3e 70 29 3b 0a 20 20 6d 65 6d 73 65 74  uf->p);.  memset
0ea0: 28 70 42 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (pBuf, 0, sizeof
0eb0: 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 7d  (Fts5Buffer));.}
0ec0: 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65  ../*.** Zero the
0ed0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
0ee0: 20 62 75 66 66 65 72 20 6f 62 6a 65 63 74 2e 20   buffer object. 
0ef0: 42 75 74 20 64 6f 20 6e 6f 74 20 66 72 65 65 20  But do not free 
0f00: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
0f10: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
0f20: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
0f30: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
0f40: 65 72 6f 28 46 74 73 35 42 75 66 66 65 72 20 2a  ero(Fts5Buffer *
0f50: 70 42 75 66 29 7b 0a 20 20 70 42 75 66 2d 3e 6e  pBuf){.  pBuf->n
0f60: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
0f70: 65 74 20 74 68 65 20 62 75 66 66 65 72 20 74 6f  et the buffer to
0f80: 20 63 6f 6e 74 61 69 6e 20 6e 44 61 74 61 2f 70   contain nData/p
0f90: 44 61 74 61 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  Data. If an OOM 
0fa0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
0fb0: 61 76 65 20 61 6e 0a 2a 2a 20 74 68 65 20 65 72  ave an.** the er
0fc0: 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e 20 49  ror code in p. I
0fd0: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
0fe0: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
0ff0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1000: 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  on.** is called,
1010: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1020: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
1030: 74 73 35 42 75 66 66 65 72 53 65 74 28 0a 20 20  ts5BufferSet(.  
1040: 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35  int *pRc,.  Fts5
1050: 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20  Buffer *pBuf, . 
1060: 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20 20 63   int nData, .  c
1070: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 0a 29  onst u8 *pData.)
1080: 7b 0a 20 20 70 42 75 66 2d 3e 6e 20 3d 20 30 3b  {.  pBuf->n = 0;
1090: 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75  .  sqlite3Fts5Bu
10a0: 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70  fferAppendBlob(p
10b0: 52 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61 2c  Rc, pBuf, nData,
10c0: 20 70 44 61 74 61 29 3b 0a 7d 0a 0a 69 6e 74 20   pData);.}..int 
10d0: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
10e0: 73 74 4e 65 78 74 36 34 28 0a 20 20 63 6f 6e 73  stNext64(.  cons
10f0: 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20  t u8 *a, int n, 
1100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1110: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1120: 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e   poslist */.  in
1130: 74 20 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20  t *pi,          
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1150: 20 49 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20   IN/OUT: Offset 
1160: 77 69 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  within a[] */.  
1170: 69 36 34 20 2a 70 69 4f 66 66 20 20 20 20 20 20  i64 *piOff      
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65  /* IN/OUT: Curre
11a0: 6e 74 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a  nt offset */.){.
11b0: 20 20 69 6e 74 20 69 20 3d 20 2a 70 69 3b 0a 20    int i = *pi;. 
11c0: 20 69 66 28 20 69 3e 3d 6e 20 29 7b 0a 20 20 20   if( i>=n ){.   
11d0: 20 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20 20 2a   /* EOF */.    *
11e0: 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 20 20  piOff = -1;.    
11f0: 72 65 74 75 72 6e 20 31 3b 20 20 0a 20 20 7d 65  return 1;  .  }e
1200: 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  lse{.    i64 iOf
1210: 66 20 3d 20 2a 70 69 4f 66 66 3b 0a 20 20 20 20  f = *piOff;.    
1220: 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 20  int iVal;.    i 
1230: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
1240: 33 32 28 26 61 5b 69 5d 2c 20 69 56 61 6c 29 3b  32(&a[i], iVal);
1250: 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d 31  .    if( iVal==1
1260: 20 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66   ){.      i += f
1270: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
1280: 61 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  a[i], iVal);.   
1290: 20 20 20 69 4f 66 66 20 3d 20 28 28 69 36 34 29     iOff = ((i64)
12a0: 69 56 61 6c 29 20 3c 3c 20 33 32 3b 0a 20 20 20  iVal) << 32;.   
12b0: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
12c0: 61 72 69 6e 74 33 32 28 26 61 5b 69 5d 2c 20 69  arint32(&a[i], i
12d0: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
12e0: 2a 70 69 4f 66 66 20 3d 20 69 4f 66 66 20 2b 20  *piOff = iOff + 
12f0: 28 69 56 61 6c 2d 32 29 3b 0a 20 20 20 20 2a 70  (iVal-2);.    *p
1300: 69 20 3d 20 69 3b 0a 20 20 20 20 72 65 74 75 72  i = i;.    retur
1310: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  n 0;.  }.}.../*.
1320: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
1330: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
1340: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
1350: 79 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  y argument. Retu
1360: 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68  rn true.** if th
1370: 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68  e iterator reach
1380: 65 73 20 45 4f 46 2c 20 6f 72 20 66 61 6c 73 65  es EOF, or false
1390: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
13a0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f  nt sqlite3Fts5Po
13b0: 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
13c0: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
13d0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
13e0: 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
13f0: 69 73 74 4e 65 78 74 36 34 28 70 49 74 65 72 2d  istNext64(pIter-
1400: 3e 61 2c 20 70 49 74 65 72 2d 3e 6e 2c 20 26 70  >a, pIter->n, &p
1410: 49 74 65 72 2d 3e 69 2c 20 26 70 49 74 65 72 2d  Iter->i, &pIter-
1420: 3e 69 50 6f 73 29 20 0a 20 20 20 7c 7c 20 28 70  >iPos) .   || (p
1430: 49 74 65 72 2d 3e 69 43 6f 6c 3e 3d 30 20 26 26  Iter->iCol>=0 &&
1440: 20 28 70 49 74 65 72 2d 3e 69 50 6f 73 20 3e 3e   (pIter->iPos >>
1450: 20 33 32 29 20 3e 20 70 49 74 65 72 2d 3e 69 43   32) > pIter->iC
1460: 6f 6c 29 0a 20 20 29 7b 0a 20 20 20 20 70 49 74  ol).  ){.    pIt
1470: 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  er->bEof = 1;.  
1480: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  }.  return pIter
1490: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 69 6e 74 20 73  ->bEof;.}..int s
14a0: 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
14b0: 74 52 65 61 64 65 72 49 6e 69 74 28 0a 20 20 69  tReaderInit(.  i
14c0: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14e0: 2a 20 49 66 20 28 69 43 6f 6c 3e 3d 30 29 2c 20  * If (iCol>=0), 
14f0: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 6e 6c 79  this column only
1500: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
1510: 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  a, int n,       
1520: 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74        /* Poslist
1530: 20 62 75 66 66 65 72 20 74 6f 20 69 74 65 72 61   buffer to itera
1540: 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  te through */.  
1550: 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1560: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
1570: 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a 65  /* Iterator obje
1580: 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ct to initialize
1590: 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28   */.){.  memset(
15a0: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
15b0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
15c0: 65 72 2d 3e 61 20 3d 20 61 3b 0a 20 20 70 49 74  er->a = a;.  pIt
15d0: 65 72 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 49 74  er->n = n;.  pIt
15e0: 65 72 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b  er->iCol = iCol;
15f0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 73 71 6c 69  .  do {.    sqli
1600: 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
1610: 61 64 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  aderNext(pIter);
1620: 0a 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72  .  }while( pIter
1630: 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 28 70 49  ->bEof==0 && (pI
1640: 74 65 72 2d 3e 69 50 6f 73 20 3e 3e 20 33 32 29  ter->iPos >> 32)
1650: 3c 69 43 6f 6c 20 29 3b 0a 20 20 72 65 74 75 72  <iCol );.  retur
1660: 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d  n pIter->bEof;.}
1670: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
1680: 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70  5PoslistWriterAp
1690: 70 65 6e 64 28 0a 20 20 46 74 73 35 42 75 66 66  pend(.  Fts5Buff
16a0: 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73  er *pBuf, .  Fts
16b0: 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 2a  5PoslistWriter *
16c0: 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69  pWriter,.  i64 i
16d0: 50 6f 73 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  Pos.){.  static 
16e0: 63 6f 6e 73 74 20 69 36 34 20 63 6f 6c 6d 61 73  const i64 colmas
16f0: 6b 20 3d 20 28 28 69 36 34 29 28 30 78 37 46 46  k = ((i64)(0x7FF
1700: 46 46 46 46 46 29 29 20 3c 3c 20 33 32 3b 0a 20  FFFFF)) << 32;. 
1710: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1720: 5f 4f 4b 3b 0a 20 20 69 66 28 20 28 69 50 6f 73  _OK;.  if( (iPos
1730: 20 26 20 63 6f 6c 6d 61 73 6b 29 20 21 3d 20 28   & colmask) != (
1740: 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 20 26  pWriter->iPrev &
1750: 20 63 6f 6c 6d 61 73 6b 29 20 29 7b 0a 20 20 20   colmask) ){.   
1760: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1770: 64 56 61 72 69 6e 74 28 26 72 63 2c 20 70 42 75  dVarint(&rc, pBu
1780: 66 2c 20 31 29 3b 0a 20 20 20 20 66 74 73 35 42  f, 1);.    fts5B
1790: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17a0: 74 28 26 72 63 2c 20 70 42 75 66 2c 20 28 69 50  t(&rc, pBuf, (iP
17b0: 6f 73 20 3e 3e 20 33 32 29 29 3b 0a 20 20 20 20  os >> 32));.    
17c0: 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 20 3d  pWriter->iPrev =
17d0: 20 28 69 50 6f 73 20 26 20 63 6f 6c 6d 61 73 6b   (iPos & colmask
17e0: 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66  );.  }.  fts5Buf
17f0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1800: 26 72 63 2c 20 70 42 75 66 2c 20 28 69 50 6f 73  &rc, pBuf, (iPos
1810: 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65   - pWriter->iPre
1820: 76 29 20 2b 20 32 29 3b 0a 20 20 70 57 72 69 74  v) + 2);.  pWrit
1830: 65 72 2d 3e 69 50 72 65 76 20 3d 20 69 50 6f 73  er->iPrev = iPos
1840: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1850: 0a 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 46  ..void *sqlite3F
1860: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e  ts5MallocZero(in
1870: 74 20 2a 70 52 63 2c 20 69 6e 74 20 6e 42 79 74  t *pRc, int 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 28 6e 42 79 74 65 29 3b  3_malloc(nByte);
18d0: 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30  .    if( pRet==0
18e0: 20 26 26 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20   && nByte>0 ){. 
18f0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
1900: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1910: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
1920: 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65  t(pRet, 0, nByte
1930: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1940: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
1950: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 75  *.** Return a nu
1960: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 63 6f 70  l-terminated cop
1970: 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  y of the string 
1980: 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 49 6e  indicated by pIn
1990: 2e 20 49 66 20 6e 49 6e 0a 2a 2a 20 69 73 20 6e  . If nIn.** is n
19a0: 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65  on-negative, the
19b0: 6e 20 69 74 20 69 73 20 74 68 65 20 6c 65 6e 67  n it is the leng
19c0: 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  th of the string
19d0: 20 69 6e 20 62 79 74 65 73 2e 20 4f 74 68 65 72   in bytes. Other
19e0: 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 6c 65 6e  wise,.** the len
19f0: 67 74 68 20 6f 66 20 74 68 65 20 73 74 72 69 6e  gth of the strin
1a00: 67 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  g is determined 
1a10: 75 73 69 6e 67 20 73 74 72 6c 65 6e 28 29 2e 0a  using strlen()..
1a20: 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  **.** It is the 
1a30: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1a40: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1a50: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
1a60: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
1a70: 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
1a80: 69 74 65 33 5f 66 72 65 65 28 29 2e 20 49 66 20  ite3_free(). If 
1a90: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
1aa0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
1ab0: 75 72 6e 65 64 2e 20 0a 2a 2f 0a 63 68 61 72 20  urned. .*/.char 
1ac0: 2a 73 71 6c 69 74 65 33 46 74 73 35 53 74 72 6e  *sqlite3Fts5Strn
1ad0: 64 75 70 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f  dup(int *pRc, co
1ae0: 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69  nst char *pIn, i
1af0: 6e 74 20 6e 49 6e 29 7b 0a 20 20 63 68 61 72 20  nt nIn){.  char 
1b00: 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *zRet = 0;.  if(
1b10: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
1b20: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 49 6e 3c   ){.    if( nIn<
1b30: 30 20 29 7b 0a 20 20 20 20 20 20 6e 49 6e 20 3d  0 ){.      nIn =
1b40: 20 73 74 72 6c 65 6e 28 70 49 6e 29 3b 0a 20 20   strlen(pIn);.  
1b50: 20 20 7d 0a 20 20 20 20 7a 52 65 74 20 3d 20 28    }.    zRet = (
1b60: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  char*)sqlite3_ma
1b70: 6c 6c 6f 63 28 6e 49 6e 2b 31 29 3b 0a 20 20 20  lloc(nIn+1);.   
1b80: 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
1b90: 20 20 20 6d 65 6d 63 70 79 28 7a 52 65 74 2c 20     memcpy(zRet, 
1ba0: 70 49 6e 2c 20 6e 49 6e 29 3b 0a 20 20 20 20 20  pIn, nIn);.     
1bb0: 20 7a 52 65 74 5b 6e 49 6e 5d 20 3d 20 27 5c 30   zRet[nIn] = '\0
1bc0: 27 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ';.    }else{.  
1bd0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
1be0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
1bf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74   }.  return zRet
1c00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
1c10: 72 6e 20 74 72 75 65 20 69 66 20 63 68 61 72 61  rn true if chara
1c20: 63 74 65 72 20 27 74 27 20 6d 61 79 20 62 65 20  cter 't' may be 
1c30: 70 61 72 74 20 6f 66 20 61 6e 20 46 54 53 35 20  part of an FTS5 
1c40: 62 61 72 65 77 6f 72 64 2c 20 6f 72 20 66 61 6c  bareword, or fal
1c50: 73 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  se.** otherwise.
1c60: 20 43 68 61 72 61 63 74 65 72 73 20 74 68 61 74   Characters that
1c70: 20 6d 61 79 20 62 65 20 70 61 72 74 20 6f 66 20   may be part of 
1c80: 62 61 72 65 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  barewords:.**.**
1c90: 20 20 20 2a 20 41 6c 6c 20 6e 6f 6e 2d 41 53 43     * All non-ASC
1ca0: 49 49 20 63 68 61 72 61 63 74 65 72 73 2c 0a 2a  II characters,.*
1cb0: 2a 20 20 20 2a 20 54 68 65 20 35 32 20 75 70 70  *   * The 52 upp
1cc0: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73  er and lower cas
1cd0: 65 20 41 53 43 49 49 20 63 68 61 72 61 63 74 65  e ASCII characte
1ce0: 72 73 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  rs, and.**   * T
1cf0: 68 65 20 31 30 20 69 6e 74 65 67 65 72 20 41 53  he 10 integer AS
1d00: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 2e 0a  CII characters..
1d10: 2a 2a 20 20 20 2a 20 54 68 65 20 75 6e 64 65 72  **   * The under
1d20: 73 63 6f 72 65 20 63 68 61 72 61 63 74 65 72 20  score character 
1d30: 22 5f 22 20 28 30 78 35 46 29 2e 0a 2a 2f 0a 69  "_" (0x5F)..*/.i
1d40: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 73  nt sqlite3Fts5Is
1d50: 42 61 72 65 77 6f 72 64 28 63 68 61 72 20 74 29  Bareword(char t)
1d60: 7b 0a 20 20 75 38 20 61 42 61 72 65 77 6f 72 64  {.  u8 aBareword
1d70: 5b 31 32 38 5d 20 3d 20 7b 0a 20 20 20 20 30 2c  [128] = {.    0,
1d80: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1d90: 30 2c 20 30 2c 20 20 20 20 30 2c 20 30 2c 20 30  0, 0,    0, 0, 0
1da0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
1db0: 20 20 20 2f 2a 20 30 78 30 30 20 2e 2e 20 30 78     /* 0x00 .. 0x
1dc0: 30 46 20 2a 2f 0a 20 20 20 20 30 2c 20 30 2c 20  0F */.    0, 0, 
1dd0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
1de0: 2c 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ,    0, 0, 0, 0,
1df0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f   0, 0, 0, 0,   /
1e00: 2a 20 30 78 31 30 20 2e 2e 20 30 78 31 46 20 2a  * 0x10 .. 0x1F *
1e10: 2f 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30  /.    0, 0, 0, 0
1e20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
1e30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
1e40: 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78  0, 0, 0,   /* 0x
1e50: 32 30 20 2e 2e 20 30 78 32 46 20 2a 2f 0a 20 20  20 .. 0x2F */.  
1e60: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
1e70: 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c 20   1, 1, 1,    1, 
1e80: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 0, 0, 0, 0, 0
1e90: 2c 20 30 2c 20 20 20 2f 2a 20 30 78 33 30 20 2e  , 0,   /* 0x30 .
1ea0: 2e 20 30 78 33 46 20 2a 2f 0a 20 20 20 20 30 2c  . 0x3F */.    0,
1eb0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
1ec0: 31 2c 20 31 2c 20 20 20 20 31 2c 20 31 2c 20 31  1, 1,    1, 1, 1
1ed0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
1ee0: 20 20 20 2f 2a 20 30 78 34 30 20 2e 2e 20 30 78     /* 0x40 .. 0x
1ef0: 34 46 20 2a 2f 0a 20 20 20 20 31 2c 20 31 2c 20  4F */.    1, 1, 
1f00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
1f10: 2c 20 20 20 20 31 2c 20 31 2c 20 31 2c 20 30 2c  ,    1, 1, 1, 0,
1f20: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 2f   0, 0, 0, 1,   /
1f30: 2a 20 30 78 35 30 20 2e 2e 20 30 78 35 46 20 2a  * 0x50 .. 0x5F *
1f40: 2f 0a 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 31  /.    0, 1, 1, 1
1f50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
1f60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
1f70: 31 2c 20 31 2c 20 31 2c 20 20 20 2f 2a 20 30 78  1, 1, 1,   /* 0x
1f80: 36 30 20 2e 2e 20 30 78 36 46 20 2a 2f 0a 20 20  60 .. 0x6F */.  
1f90: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
1fa0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 20 31 2c 20   1, 1, 1,    1, 
1fb0: 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 1, 0, 0, 0, 0
1fc0: 2c 20 30 20 20 20 20 2f 2a 20 30 78 37 30 20 2e  , 0    /* 0x70 .
1fd0: 2e 20 30 78 37 46 20 2a 2f 0a 20 20 7d 3b 0a 0a  . 0x7F */.  };..
1fe0: 20 20 72 65 74 75 72 6e 20 28 74 20 26 20 30 78    return (t & 0x
1ff0: 38 30 29 20 7c 7c 20 61 42 61 72 65 77 6f 72 64  80) || aBareword
2000: 5b 28 69 6e 74 29 74 5d 3b 0a 7d 0a 0a 23 65 6e  [(int)t];.}..#en
2010: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
2020: 41 42 4c 45 5f 46 54 53 35 20 2a 2f 0a 0a        ABLE_FTS5 */..