/ Hex Artifact Content
Login

Artifact b7aa6cdf4a63642fcc12359cedc4be748ca400cc:


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 47 72 6f 77 28 69 6e 74 20  5BufferGrow(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 69 6e 74 20 6e 42 79 74   *pBuf, int nByt
01d0: 65 29 7b 0a 20 20 2f 2a 20 41 20 6e 6f 2d 6f 70  e){.  /* A no-op
01e0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   if an error has
01f0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
0200: 64 20 2a 2f 0a 20 20 69 66 28 20 2a 70 52 63 20  d */.  if( *pRc 
0210: 29 20 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 69  ) return 1;..  i
0220: 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 42  f( (pBuf->n + nB
0230: 79 74 65 29 20 3e 20 70 42 75 66 2d 3e 6e 53 70  yte) > pBuf->nSp
0240: 61 63 65 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  ace ){.    u8 *p
0250: 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65  New;.    int nNe
0260: 77 20 3d 20 70 42 75 66 2d 3e 6e 53 70 61 63 65  w = pBuf->nSpace
0270: 20 3f 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 2a   ? pBuf->nSpace*
0280: 32 20 3a 20 36 34 3b 0a 20 20 20 20 77 68 69 6c  2 : 64;.    whil
0290: 65 28 20 6e 4e 65 77 3c 28 70 42 75 66 2d 3e 6e  e( nNew<(pBuf->n
02a0: 20 2b 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20   + nByte) ){.   
02b0: 20 20 20 6e 4e 65 77 20 3d 20 6e 4e 65 77 20 2a     nNew = nNew *
02c0: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e   2;.    }.    pN
02d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
02e0: 6c 6c 6f 63 28 70 42 75 66 2d 3e 70 2c 20 6e 4e  lloc(pBuf->p, nN
02f0: 65 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ew);.    if( pNe
0300: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
0310: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
0320: 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  M;.      return 
0330: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
0340: 20 20 20 20 70 42 75 66 2d 3e 6e 53 70 61 63 65      pBuf->nSpace
0350: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 70   = nNew;.      p
0360: 42 75 66 2d 3e 70 20 3d 20 70 4e 65 77 3b 0a 20  Buf->p = pNew;. 
0370: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
0380: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e  n 0;.}../*.** En
0390: 63 6f 64 65 20 76 61 6c 75 65 20 69 56 61 6c 20  code value iVal 
03a0: 61 73 20 61 6e 20 53 51 4c 69 74 65 20 76 61 72  as an SQLite var
03b0: 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
03c0: 74 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  t to the buffer 
03d0: 6f 62 6a 65 63 74 0a 2a 2a 20 70 42 75 66 2e 20  object.** pBuf. 
03e0: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
03f0: 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
0400: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e  error code in p.
0410: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0420: 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
0430: 56 61 72 69 6e 74 28 69 6e 74 20 2a 70 52 63 2c  Varint(int *pRc,
0440: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
0450: 66 2c 20 69 36 34 20 69 56 61 6c 29 7b 0a 20 20  f, i64 iVal){.  
0460: 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 42  if( sqlite3Fts5B
0470: 75 66 66 65 72 47 72 6f 77 28 70 52 63 2c 20 70  ufferGrow(pRc, p
0480: 42 75 66 2c 20 39 29 20 29 20 72 65 74 75 72 6e  Buf, 9) ) return
0490: 3b 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73  ;.  pBuf->n += s
04a0: 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28  qlite3PutVarint(
04b0: 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
04c0: 5d 2c 20 69 56 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ], iVal);.}../*.
04d0: 2a 2a 20 41 70 70 65 6e 64 20 62 75 66 66 65 72  ** Append buffer
04e0: 20 6e 44 61 74 61 2f 70 44 61 74 61 20 74 6f 20   nData/pData to 
04f0: 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 66 20  buffer pBuf. If 
0500: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
0510: 75 72 73 2c 20 73 65 74 20 0a 2a 2a 20 74 68 65  urs, set .** the
0520: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70   error code in p
0530: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
0540: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
0550: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
0560: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
0570: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
0580: 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  p..*/.void sqlit
0590: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
05a0: 6e 64 42 6c 6f 62 28 0a 20 20 69 6e 74 20 2a 70  ndBlob(.  int *p
05b0: 52 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  Rc,.  Fts5Buffer
05c0: 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 6e   *pBuf, .  int n
05d0: 44 61 74 61 2c 20 0a 20 20 63 6f 6e 73 74 20 75  Data, .  const u
05e0: 38 20 2a 70 44 61 74 61 0a 29 7b 0a 20 20 69 66  8 *pData.){.  if
05f0: 28 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  ( sqlite3Fts5Buf
0600: 66 65 72 47 72 6f 77 28 70 52 63 2c 20 70 42 75  ferGrow(pRc, pBu
0610: 66 2c 20 6e 44 61 74 61 29 20 29 20 72 65 74 75  f, nData) ) retu
0620: 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 42  rn;.  memcpy(&pB
0630: 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
0640: 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
0650: 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 44 61 74   pBuf->n += nDat
0660: 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  a;.}../*.** Appe
0670: 6e 64 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  nd the nul-termi
0680: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 7a 53 74  nated string zSt
0690: 72 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  r to the buffer 
06a0: 70 42 75 66 2e 20 54 68 69 73 20 66 75 6e 63 74  pBuf. This funct
06b0: 69 6f 6e 0a 2a 2a 20 65 6e 73 75 72 65 73 20 74  ion.** ensures t
06c0: 68 61 74 20 74 68 65 20 62 79 74 65 20 66 6f 6c  hat the byte fol
06d0: 6c 6f 77 69 6e 67 20 74 68 65 20 62 75 66 66 65  lowing the buffe
06e0: 72 20 64 61 74 61 20 69 73 20 73 65 74 20 74 6f  r data is set to
06f0: 20 30 78 30 30 2c 20 65 76 65 6e 20 0a 2a 2a 20   0x00, even .** 
0700: 74 68 6f 75 67 68 20 74 68 69 73 20 62 79 74 65  though this byte
0710: 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64   is not included
0720: 20 69 6e 20 74 68 65 20 70 42 75 66 2d 3e 6e 20   in the pBuf->n 
0730: 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
0740: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
0750: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 0a 20 20  AppendString(.  
0760: 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35  int *pRc,.  Fts5
0770: 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20  Buffer *pBuf, . 
0780: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
0790: 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 74 72 20  r.){.  int nStr 
07a0: 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b 0a  = strlen(zStr);.
07b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
07c0: 35 42 75 66 66 65 72 47 72 6f 77 28 70 52 63 2c  5BufferGrow(pRc,
07d0: 20 70 42 75 66 2c 20 6e 53 74 72 2b 31 29 20 29   pBuf, nStr+1) )
07e0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
07f0: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
0800: 6e 64 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66  ndBlob(pRc, pBuf
0810: 2c 20 6e 53 74 72 2c 20 28 63 6f 6e 73 74 20 75  , nStr, (const u
0820: 38 2a 29 7a 53 74 72 29 3b 0a 20 20 69 66 28 20  8*)zStr);.  if( 
0830: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
0840: 29 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  ) pBuf->p[pBuf->
0850: 6e 5d 20 3d 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a  n] = 0x00;.}../*
0860: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 46 6d  .** Argument zFm
0870: 74 20 69 73 20 61 20 70 72 69 6e 74 66 28 29 20  t is a printf() 
0880: 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72  style format str
0890: 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
08a0: 6f 6e 20 70 65 72 66 6f 72 6d 73 0a 2a 2a 20 74  on performs.** t
08b0: 68 65 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c  he printf() styl
08c0: 65 20 70 72 6f 63 65 73 73 69 6e 67 2c 20 74 68  e processing, th
08d0: 65 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 72  en appends the r
08e0: 65 73 75 6c 74 73 20 74 6f 20 62 75 66 66 65 72  esults to buffer
08f0: 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 4c 69 6b   pBuf..**.** Lik
0900: 65 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66  e sqlite3Fts5Buf
0910: 66 65 72 41 70 70 65 6e 64 53 74 72 69 6e 67 28  ferAppendString(
0920: 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
0930: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
0940: 65 20 62 79 74 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  e byte .** follo
0950: 77 69 6e 67 20 74 68 65 20 62 75 66 66 65 72 20  wing the buffer 
0960: 64 61 74 61 20 69 73 20 73 65 74 20 74 6f 20 30  data is set to 0
0970: 78 30 30 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  x00, even though
0980: 20 74 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f   this byte is no
0990: 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e  t.** included in
09a0: 20 74 68 65 20 70 42 75 66 2d 3e 6e 20 63 6f 75   the pBuf->n cou
09b0: 6e 74 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  nt..*/ .void sql
09c0: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
09d0: 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 69 6e  pendPrintf(.  in
09e0: 74 20 2a 70 52 63 2c 0a 20 20 46 74 73 35 42 75  t *pRc,.  Fts5Bu
09f0: 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 63  ffer *pBuf, .  c
0a00: 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 0a 29  har *zFmt, ....)
0a10: 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  {.  if( *pRc==SQ
0a20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
0a30: 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 20 20 76  har *zTmp;.    v
0a40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 76  a_list ap;.    v
0a50: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74  a_start(ap, zFmt
0a60: 29 3b 0a 20 20 20 20 7a 54 6d 70 20 3d 20 73 71  );.    zTmp = sq
0a70: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
0a80: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  Fmt, ap);.    va
0a90: 5f 65 6e 64 28 61 70 29 3b 0a 0a 20 20 20 20 69  _end(ap);..    i
0aa0: 66 28 20 7a 54 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( zTmp==0 ){.  
0ab0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
0ac0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
0ad0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
0ae0: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
0af0: 64 53 74 72 69 6e 67 28 70 52 63 2c 20 70 42 75  dString(pRc, pBu
0b00: 66 2c 20 7a 54 6d 70 29 3b 0a 20 20 20 20 20 20  f, zTmp);.      
0b10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
0b20: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
0b30: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
0b40: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
0b50: 20 62 79 20 70 42 75 66 2e 20 5a 65 72 6f 20 74   by pBuf. Zero t
0b60: 68 65 20 73 74 72 75 63 74 75 72 65 20 62 65 66  he structure bef
0b70: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
0b80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
0b90: 73 35 42 75 66 66 65 72 46 72 65 65 28 46 74 73  s5BufferFree(Fts
0ba0: 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
0bb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
0bc0: 42 75 66 2d 3e 70 29 3b 0a 20 20 6d 65 6d 73 65  Buf->p);.  memse
0bd0: 74 28 70 42 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(pBuf, 0, sizeo
0be0: 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68  }../*.** Zero th
0c00: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
0c10: 65 20 62 75 66 66 65 72 20 6f 62 6a 65 63 74 2e  e buffer object.
0c20: 20 42 75 74 20 64 6f 20 6e 6f 74 20 66 72 65 65   But do not free
0c30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
0c40: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  .** memory alloc
0c50: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
0c60: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
0c70: 5a 65 72 6f 28 46 74 73 35 42 75 66 66 65 72 20  Zero(Fts5Buffer 
0c80: 2a 70 42 75 66 29 7b 0a 20 20 70 42 75 66 2d 3e  *pBuf){.  pBuf->
0c90: 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 0;.}../*.** 
0ca0: 53 65 74 20 74 68 65 20 62 75 66 66 65 72 20 74  Set the buffer t
0cb0: 6f 20 63 6f 6e 74 61 69 6e 20 6e 44 61 74 61 2f  o contain nData/
0cc0: 70 44 61 74 61 2e 20 49 66 20 61 6e 20 4f 4f 4d  pData. If an OOM
0cd0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
0ce0: 65 61 76 65 20 61 6e 0a 2a 2a 20 74 68 65 20 65  eave an.** the e
0cf0: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 70 2e 20  rror code in p. 
0d00: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
0d10: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
0d20: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
0d30: 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
0d40: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
0d50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0d60: 46 74 73 35 42 75 66 66 65 72 53 65 74 28 0a 20  Fts5BufferSet(. 
0d70: 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74 73   int *pRc,.  Fts
0d80: 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a  5Buffer *pBuf, .
0d90: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 0a 20 20    int nData, .  
0da0: 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 0a  const u8 *pData.
0db0: 29 7b 0a 20 20 70 42 75 66 2d 3e 6e 20 3d 20 30  ){.  pBuf->n = 0
0dc0: 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
0dd0: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
0de0: 70 52 63 2c 20 70 42 75 66 2c 20 6e 44 61 74 61  pRc, pBuf, nData
0df0: 2c 20 70 44 61 74 61 29 3b 0a 7d 0a 0a 0a 2f 2a  , pData);.}.../*
0e00: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
0e10: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
0e20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
0e30: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74  ly argument. Ret
0e40: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
0e50: 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
0e60: 68 65 73 20 45 4f 46 2c 20 6f 72 20 66 61 6c 73  hes EOF, or fals
0e70: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
0e80: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 50  int sqlite3Fts5P
0e90: 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
0ea0: 28 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  (Fts5PoslistRead
0eb0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
0ec0: 28 20 70 49 74 65 72 2d 3e 69 3e 3d 70 49 74 65  ( pIter->i>=pIte
0ed0: 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  r->n ){.    pIte
0ee0: 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  r->bEof = 1;.  }
0ef0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 56  else{.    int iV
0f00: 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  al;.    pIter->i
0f10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
0f20: 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d  &pIter->a[pIter-
0f30: 3e 69 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  >i], iVal);.    
0f40: 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20  if( iVal==1 ){. 
0f50: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d       pIter->i +=
0f60: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49   getVarint32(&pI
0f70: 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d  ter->a[pIter->i]
0f80: 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  , iVal);.      i
0f90: 66 28 20 70 49 74 65 72 2d 3e 69 43 6f 6c 3e 3d  f( pIter->iCol>=
0fa0: 30 20 26 26 20 69 56 61 6c 3e 70 49 74 65 72 2d  0 && iVal>pIter-
0fb0: 3e 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >iCol ){.       
0fc0: 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
0fd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
0fe0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50         pIter->iP
0ff0: 6f 73 20 3d 20 28 28 75 36 34 29 69 56 61 6c 20  os = ((u64)iVal 
1000: 3c 3c 20 33 32 29 3b 0a 20 20 20 20 20 20 20 20  << 32);.        
1010: 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56  pIter->i += getV
1020: 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
1030: 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 69 56 61  a[pIter->i], iVa
1040: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
1050: 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 6f  }.    pIter->iPo
1060: 73 20 2b 3d 20 28 69 56 61 6c 2d 32 29 3b 0a 20  s += (iVal-2);. 
1070: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65   }.  return pIte
1080: 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 69 6e 74 20  r->bEof;.}..int 
1090: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
10a0: 73 74 52 65 61 64 65 72 49 6e 69 74 28 0a 20 20  stReaderInit(.  
10b0: 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d0: 2f 2a 20 49 66 20 28 69 43 6f 6c 3e 3d 30 29 2c  /* If (iCol>=0),
10e0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 6e 6c   this column onl
10f0: 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  y */.  const u8 
1100: 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  *a, int n,      
1110: 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73         /* Poslis
1120: 74 20 62 75 66 66 65 72 20 74 6f 20 69 74 65 72  t buffer to iter
1130: 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
1140: 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
1150: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
1160: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 6f 62 6a   /* Iterator obj
1170: 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ect to initializ
1180: 65 20 2a 2f 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  e */.){.  memset
1190: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
11a0: 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
11b0: 74 65 72 2d 3e 61 20 3d 20 61 3b 0a 20 20 70 49  ter->a = a;.  pI
11c0: 74 65 72 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 49  ter->n = n;.  pI
11d0: 74 65 72 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c  ter->iCol = iCol
11e0: 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 73 71 6c  ;.  do {.    sql
11f0: 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
1200: 65 61 64 65 72 4e 65 78 74 28 70 49 74 65 72 29  eaderNext(pIter)
1210: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65  ;.  }while( pIte
1220: 72 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 28 70  r->bEof==0 && (p
1230: 49 74 65 72 2d 3e 69 50 6f 73 20 3e 3e 20 33 32  Iter->iPos >> 32
1240: 29 3c 69 43 6f 6c 20 29 3b 0a 20 20 72 65 74 75  )<iCol );.  retu
1250: 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
1260: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  }..int sqlite3Ft
1270: 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41  s5PoslistWriterA
1280: 70 70 65 6e 64 28 0a 20 20 46 74 73 35 42 75 66  ppend(.  Fts5Buf
1290: 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74  fer *pBuf, .  Ft
12a0: 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20  s5PoslistWriter 
12b0: 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20  *pWriter,.  i64 
12c0: 69 50 6f 73 0a 29 7b 0a 20 20 69 6e 74 20 72 63  iPos.){.  int rc
12d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12e0: 69 6e 74 20 69 43 6f 6c 20 3d 20 28 69 6e 74 29  int iCol = (int)
12f0: 28 69 50 6f 73 20 3e 3e 20 33 32 29 3b 0a 20 20  (iPos >> 32);.  
1300: 69 6e 74 20 69 4f 66 66 20 3d 20 28 69 50 6f 73  int iOff = (iPos
1310: 20 26 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a   & 0x7FFFFFFF);.
1320: 0a 20 20 69 66 28 20 69 43 6f 6c 21 3d 70 57 72  .  if( iCol!=pWr
1330: 69 74 65 72 2d 3e 69 43 6f 6c 20 29 7b 0a 20 20  iter->iCol ){.  
1340: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1350: 6e 64 56 61 72 69 6e 74 28 26 72 63 2c 20 70 42  ndVarint(&rc, pB
1360: 75 66 2c 20 31 29 3b 0a 20 20 20 20 66 74 73 35  uf, 1);.    fts5
1370: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1380: 6e 74 28 26 72 63 2c 20 70 42 75 66 2c 20 69 43  nt(&rc, pBuf, iC
1390: 6f 6c 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  ol);.    pWriter
13a0: 2d 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20  ->iCol = iCol;. 
13b0: 20 20 20 70 57 72 69 74 65 72 2d 3e 69 4f 66 66     pWriter->iOff
13c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 74 73 35   = 0;.  }.  fts5
13d0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
13e0: 6e 74 28 26 72 63 2c 20 70 42 75 66 2c 20 28 69  nt(&rc, pBuf, (i
13f0: 4f 66 66 20 2d 20 70 57 72 69 74 65 72 2d 3e 69  Off - pWriter->i
1400: 4f 66 66 29 20 2b 20 32 29 3b 0a 0a 20 20 72 65  Off) + 2);..  re
1410: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
1420: 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1430: 73 74 4e 65 78 74 28 0a 20 20 63 6f 6e 73 74 20  stNext(.  const 
1440: 75 38 20 2a 61 2c 20 69 6e 74 20 6e 2c 20 20 20  u8 *a, int n,   
1450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1460: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
1470: 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oslist */.  int 
1480: 2a 70 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pi,            
1490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14a0: 4e 2f 4f 55 54 3a 20 4f 66 66 73 65 74 20 77 69  N/OUT: Offset wi
14b0: 74 68 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 69 6e  thin a[] */.  in
14c0: 74 20 2a 70 69 43 6f 6c 2c 20 20 20 20 20 20 20  t *piCol,       
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14e0: 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
14f0: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1500: 20 2a 70 69 4f 66 66 20 20 20 20 20 20 20 20 20   *piOff         
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1520: 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1530: 74 6f 6b 65 6e 20 6f 66 66 73 65 74 20 2a 2f 0a  token offset */.
1540: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69  ){.  int i = *pi
1550: 3b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20  ;.  int iVal;.  
1560: 69 66 28 20 69 3e 3d 6e 20 29 7b 0a 20 20 20 20  if( i>=n ){.    
1570: 2f 2a 20 45 4f 46 20 2a 2f 0a 20 20 20 20 72 65  /* EOF */.    re
1580: 74 75 72 6e 20 31 3b 20 20 0a 20 20 7d 0a 20 20  turn 1;  .  }.  
1590: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
15a0: 28 26 61 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a 20  (&a[i], iVal);. 
15b0: 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a   if( iVal==1 ){.
15c0: 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69      i += getVari
15d0: 6e 74 33 32 28 26 61 5b 69 5d 2c 20 69 56 61 6c  nt32(&a[i], iVal
15e0: 29 3b 0a 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20  );.    *piCol = 
15f0: 69 56 61 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66  iVal;.    *piOff
1600: 20 3d 20 30 3b 0a 20 20 20 20 69 20 2b 3d 20 67   = 0;.    i += g
1610: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 5d  etVarint32(&a[i]
1620: 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 2a  , iVal);.  }.  *
1630: 70 69 4f 66 66 20 2b 3d 20 28 69 56 61 6c 2d 32  piOff += (iVal-2
1640: 29 3b 0a 20 20 2a 70 69 20 3d 20 69 3b 0a 20 20  );.  *pi = i;.  
1650: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a        return 0;.}...