/ Hex Artifact Content
Login

Artifact 7d28c01a2e012ac64257d230fc452b2cafb78311a91a343633d01d95220f66f3:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 20 4f 63 74 6f 62  /*.** 2017 Octob
0010: 65 72 20 32 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20  er 27.**.** The 
0020: 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73  author disclaims
0030: 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68   copyright to th
0040: 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20  is source code. 
0050: 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20   In place of.** 
0060: 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20  a legal notice, 
0070: 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69  here is a blessi
0080: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79  ng:.**.**    May
0090: 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64   you do good and
00a0: 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20   not evil..**   
00b0: 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f   May you find fo
00c0: 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f  rgiveness for yo
00d0: 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69  urself and forgi
00e0: 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20  ve others..**   
00f0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
0100: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0110: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0120: 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  u give..**.*****
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 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64  ****.*/..#includ
0180: 65 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22  e "sqlite3ext.h"
0190: 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f  .SQLITE_EXTENSIO
01a0: 4e 5f 49 4e 49 54 31 0a 0a 2f 2a 0a 2a 2a 20 53  N_INIT1../*.** S
01b0: 74 75 66 66 20 74 68 61 74 20 69 73 20 61 76 61  tuff that is ava
01c0: 69 6c 61 62 6c 65 20 69 6e 73 69 64 65 20 74 68  ilable inside th
01d0: 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2c 20  e amalgamation, 
01e0: 62 75 74 20 77 68 69 63 68 20 77 65 20 6e 65 65  but which we nee
01f0: 64 20 74 6f 0a 2a 2a 20 64 65 63 6c 61 72 65 20  d to.** declare 
0200: 6f 75 72 73 65 6c 76 65 73 20 69 66 20 74 68 69  ourselves if thi
0210: 73 20 6d 6f 64 75 6c 65 20 69 73 20 63 6f 6d 70  s module is comp
0220: 69 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  iled separately.
0230: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0240: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a  TE_AMALGAMATION.
0250: 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  # include <strin
0260: 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  g.h>.# include <
0270: 73 74 64 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75  stdio.h>.# inclu
0280: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 20  de <stdlib.h>.# 
0290: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
02a0: 68 3e 0a 74 79 70 65 64 65 66 20 75 6e 73 69 67  h>.typedef unsig
02b0: 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 74 79 70  ned char u8;.typ
02c0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68  edef unsigned sh
02d0: 6f 72 74 20 75 31 36 3b 0a 74 79 70 65 64 65 66  ort u16;.typedef
02e0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 33   unsigned int u3
02f0: 32 3b 0a 23 64 65 66 69 6e 65 20 67 65 74 34 62  2;.#define get4b
0300: 79 74 65 28 78 29 20 28 20 20 20 20 20 20 20 20  yte(x) (        
0310: 5c 0a 20 20 20 20 28 28 75 33 32 29 28 28 78 29  \.    ((u32)((x)
0320: 5b 30 5d 29 3c 3c 32 34 29 20 2b 20 20 20 20 5c  [0])<<24) +    \
0330: 0a 20 20 20 20 28 28 75 33 32 29 28 28 78 29 5b  .    ((u32)((x)[
0340: 31 5d 29 3c 3c 31 36 29 20 2b 20 20 20 20 5c 0a  1])<<16) +    \.
0350: 20 20 20 20 28 28 75 33 32 29 28 28 78 29 5b 32      ((u32)((x)[2
0360: 5d 29 3c 3c 38 29 20 2b 20 20 20 20 20 5c 0a 20  ])<<8) +     \. 
0370: 20 20 20 28 28 75 33 32 29 28 28 78 29 5b 33 5d     ((u32)((x)[3]
0380: 29 29 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a  ))          \.).
0390: 23 65 6e 64 69 66 0a 0a 74 79 70 65 64 65 66 20  #endif..typedef 
03a0: 73 74 72 75 63 74 20 43 69 64 78 54 61 62 6c 65  struct CidxTable
03b0: 20 43 69 64 78 54 61 62 6c 65 3b 0a 74 79 70 65   CidxTable;.type
03c0: 64 65 66 20 73 74 72 75 63 74 20 43 69 64 78 43  def struct CidxC
03d0: 75 72 73 6f 72 20 43 69 64 78 43 75 72 73 6f 72  ursor CidxCursor
03e0: 3b 0a 0a 73 74 72 75 63 74 20 43 69 64 78 54 61  ;..struct CidxTa
03f0: 62 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ble {.  sqlite3_
0400: 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20 20  vtab base;      
0410: 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
0420: 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20  class.  Must be 
0430: 66 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74  first */.  sqlit
0440: 65 33 20 2a 64 62 3b 0a 7d 3b 0a 0a 73 74 72 75  e3 *db;.};..stru
0450: 63 74 20 43 69 64 78 43 75 72 73 6f 72 20 7b 0a  ct CidxCursor {.
0460: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
0470: 75 72 73 6f 72 20 62 61 73 65 3b 20 20 20 20 20  ursor base;     
0480: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 2e    /* Base class.
0490: 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20    Must be first 
04a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
04b0: 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
04c0: 20 20 20 20 20 2f 2a 20 52 6f 77 20 6e 75 6d 62       /* Row numb
04d0: 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  er of the output
04e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 64 78   */.  char *zIdx
04f0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
0500: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66        /* Copy of
0510: 20 74 68 65 20 69 6e 64 65 78 5f 6e 61 6d 65 20   the index_name 
0520: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 63  parameter */.  c
0530: 68 61 72 20 2a 7a 41 66 74 65 72 4b 65 79 3b 20  har *zAfterKey; 
0540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0550: 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20 61 66  * Copy of the af
0560: 74 65 72 5f 6b 65 79 20 70 61 72 61 6d 65 74 65  ter_key paramete
0570: 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  r */.  sqlite3_s
0580: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
0590: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
05a0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 67 65 6e  atement that gen
05b0: 65 72 61 74 65 73 20 74 68 65 20 6f 75 74 70 75  erates the outpu
05c0: 74 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  t */.};..typedef
05d0: 20 73 74 72 75 63 74 20 43 69 64 78 43 6f 6c 75   struct CidxColu
05e0: 6d 6e 20 43 69 64 78 43 6f 6c 75 6d 6e 3b 0a 73  mn CidxColumn;.s
05f0: 74 72 75 63 74 20 43 69 64 78 43 6f 6c 75 6d 6e  truct CidxColumn
0600: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 72   {.  char *zExpr
0610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0620: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 66 6f 72       /* Text for
0630: 20 69 6e 64 65 78 65 64 20 65 78 70 72 65 73 73   indexed express
0640: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ion */.  int bDe
0650: 73 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sc;             
0660: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0670: 20 66 6f 72 20 44 45 53 43 20 63 6f 6c 75 6d 6e   for DESC column
0680: 73 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c  s, otherwise fal
0690: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 62 4b 65 79  se */.  int bKey
06a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
06b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74 20          /* Part 
06c0: 6f 66 20 69 6e 64 65 78 2c 20 6e 6f 74 20 50 4b  of index, not PK
06d0: 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20   */.};..typedef 
06e0: 73 74 72 75 63 74 20 43 69 64 78 49 6e 64 65 78  struct CidxIndex
06f0: 20 43 69 64 78 49 6e 64 65 78 3b 0a 73 74 72 75   CidxIndex;.stru
0700: 63 74 20 43 69 64 78 49 6e 64 65 78 20 7b 0a 20  ct CidxIndex {. 
0710: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 3b 20 20   char *zWhere;  
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0730: 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
0740: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  , if any */.  in
0750: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0770: 20 45 6c 65 6d 65 6e 74 73 20 69 6e 20 61 43 6f   Elements in aCo
0780: 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 43  l[] array */.  C
0790: 69 64 78 43 6f 6c 75 6d 6e 20 61 43 6f 6c 5b 31  idxColumn aCol[1
07a0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
07b0: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 78  * Array of index
07c0: 65 64 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 7d 3b  ed columns */.};
07d0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  ..static void *c
07e0: 69 64 78 4d 61 6c 6c 6f 63 28 69 6e 74 20 2a 70  idxMalloc(int *p
07f0: 52 63 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 76 6f  Rc, int n){.  vo
0800: 69 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  id *pRet = 0;.  
0810: 61 73 73 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a  assert( n!=0 );.
0820: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
0830: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65  TE_OK ){.    pRe
0840: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
0850: 6f 63 28 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  oc(n);.    if( p
0860: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  Ret ){.      mem
0870: 73 65 74 28 70 52 65 74 2c 20 30 2c 20 6e 29 3b  set(pRet, 0, n);
0880: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
0890: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
08a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
08b0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
08c0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  }..static void c
08d0: 69 64 78 43 75 72 73 6f 72 45 72 72 6f 72 28 43  idxCursorError(C
08e0: 69 64 78 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  idxCursor *pCsr,
08f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
0900: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
0910: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
0920: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 61  t(ap, zFmt);.  a
0930: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 62 61 73  ssert( pCsr->bas
0940: 65 2e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e.pVtab->zErrMsg
0950: 3d 3d 30 20 29 3b 0a 20 20 70 43 73 72 2d 3e 62  ==0 );.  pCsr->b
0960: 61 73 65 2e 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ase.pVtab->zErrM
0970: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  sg = sqlite3_vmp
0980: 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
0990: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d  .  va_end(ap);.}
09a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 6e 65 63 74 20  ../*.** Connect 
09b0: 74 6f 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  to the increment
09c0: 61 6c 5f 69 6e 64 65 78 5f 63 68 65 63 6b 20 76  al_index_check v
09d0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
09e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 69 64 78  .static int cidx
09f0: 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74  Connect(.  sqlit
0a00: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a  e3 *db,.  void *
0a10: 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pAux,.  int argc
0a20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  , const char *co
0a30: 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69  nst*argv,.  sqli
0a40: 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61  te3_vtab **ppVta
0a50: 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
0a60: 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
0a70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 43 69 64  SQLITE_OK;.  Cid
0a80: 78 54 61 62 6c 65 20 2a 70 52 65 74 3b 0a 0a 23  xTable *pRet;..#
0a90: 64 65 66 69 6e 65 20 49 49 43 5f 45 52 52 4d 53  define IIC_ERRMS
0aa0: 47 20 20 20 20 20 20 20 20 30 0a 23 64 65 66 69  G        0.#defi
0ab0: 6e 65 20 49 49 43 5f 43 55 52 52 45 4e 54 5f 4b  ne IIC_CURRENT_K
0ac0: 45 59 20 20 20 31 0a 23 64 65 66 69 6e 65 20 49  EY   1.#define I
0ad0: 49 43 5f 49 4e 44 45 58 5f 4e 41 4d 45 20 20 20  IC_INDEX_NAME   
0ae0: 20 32 0a 23 64 65 66 69 6e 65 20 49 49 43 5f 41   2.#define IIC_A
0af0: 46 54 45 52 5f 4b 45 59 20 20 20 20 20 33 0a 23  FTER_KEY     3.#
0b00: 64 65 66 69 6e 65 20 49 49 43 5f 53 43 41 4e 4e  define IIC_SCANN
0b10: 45 52 5f 53 51 4c 20 20 20 34 0a 20 20 72 63 20  ER_SQL   4.  rc 
0b20: 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  = sqlite3_declar
0b30: 65 5f 76 74 61 62 28 64 62 2c 0a 20 20 20 20 20  e_vtab(db,.     
0b40: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78   "CREATE TABLE x
0b50: 79 7a 28 22 0a 20 20 20 20 20 20 22 20 65 72 72  yz(".      " err
0b60: 6d 73 67 20 54 45 58 54 2c 22 20 20 20 20 20 20  msg TEXT,"      
0b70: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
0b80: 65 73 73 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  essage or NULL i
0b90: 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
0ba0: 6f 6b 20 2a 2f 0a 20 20 20 20 20 20 22 20 63 75  ok */.      " cu
0bb0: 72 72 65 6e 74 5f 6b 65 79 20 54 45 58 54 2c 22  rrent_key TEXT,"
0bc0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
0bd0: 20 71 75 6f 74 65 28 29 20 74 65 78 74 20 6f 66   quote() text of
0be0: 20 6b 65 79 20 76 61 6c 75 65 73 20 2a 2f 0a 20   key values */. 
0bf0: 20 20 20 20 20 22 20 69 6e 64 65 78 5f 6e 61 6d       " index_nam
0c00: 65 20 48 49 44 44 45 4e 2c 22 20 20 20 20 20 20  e HIDDEN,"      
0c10: 2f 2a 20 49 4e 3a 20 6e 61 6d 65 20 6f 66 20 74  /* IN: name of t
0c20: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73  he index being s
0c30: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 20 20 20 20  canned */.      
0c40: 22 20 61 66 74 65 72 5f 6b 65 79 20 48 49 44 44  " after_key HIDD
0c50: 45 4e 2c 22 20 20 20 20 20 20 20 2f 2a 20 49 4e  EN,"       /* IN
0c60: 3a 20 53 74 61 72 74 20 73 63 61 6e 6e 69 6e 67  : Start scanning
0c70: 20 61 66 74 65 72 20 74 68 69 73 20 6b 65 79 20   after this key 
0c80: 2a 2f 0a 20 20 20 20 20 20 22 20 73 63 61 6e 6e  */.      " scann
0c90: 65 72 5f 73 71 6c 20 48 49 44 44 45 4e 22 20 20  er_sql HIDDEN"  
0ca0: 20 20 20 20 2f 2a 20 64 65 62 75 67 67 69 6e 67      /* debugging
0cb0: 6e 20 69 6e 66 6f 3a 20 53 51 4c 20 75 73 65 64  n info: SQL used
0cc0: 20 66 6f 72 20 73 63 61 6e 6e 65 72 20 2a 2f 0a   for scanner */.
0cd0: 20 20 20 20 20 20 22 29 22 0a 20 20 29 3b 0a 20        ")".  );. 
0ce0: 20 70 52 65 74 20 3d 20 63 69 64 78 4d 61 6c 6c   pRet = cidxMall
0cf0: 6f 63 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 43  oc(&rc, sizeof(C
0d00: 69 64 78 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  idxTable));.  if
0d10: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52  ( pRet ){.    pR
0d20: 65 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 7d  et->db = db;.  }
0d30: 0a 0a 20 20 2a 70 70 56 74 61 62 20 3d 20 28 73  ..  *ppVtab = (s
0d40: 71 6c 69 74 65 33 5f 76 74 61 62 2a 29 70 52 65  qlite3_vtab*)pRe
0d50: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
0d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e  }../*.** Disconn
0d70: 65 63 74 20 66 72 6f 6d 20 6f 72 20 64 65 73 74  ect from or dest
0d80: 72 6f 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  roy an increment
0d90: 61 6c 5f 69 6e 64 65 78 5f 63 68 65 63 6b 20 76  al_index_check v
0da0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
0db0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 69 64 78  .static int cidx
0dc0: 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74  Disconnect(sqlit
0dd0: 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
0de0: 0a 20 20 43 69 64 78 54 61 62 6c 65 20 2a 70 54  .  CidxTable *pT
0df0: 61 62 20 3d 20 28 43 69 64 78 54 61 62 6c 65 2a  ab = (CidxTable*
0e00: 29 70 56 74 61 62 3b 0a 20 20 73 71 6c 69 74 65  )pVtab;.  sqlite
0e10: 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20  3_free(pTab);.  
0e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 69 64 78 4e 75  ;.}../*.** idxNu
0e40: 6d 20 61 6e 64 20 69 64 78 53 74 72 20 61 72 65  m and idxStr are
0e50: 20 6e 6f 74 20 75 73 65 64 2e 20 20 54 68 65 72   not used.  Ther
0e60: 65 20 61 72 65 20 6f 6e 6c 79 20 74 68 72 65 65  e are only three
0e70: 20 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e 73 2c   possible plans,
0e80: 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 61 6c  .** which are al
0e90: 6c 20 64 69 73 74 69 6e 67 75 69 73 68 65 64 20  l distinguished 
0ea0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
0eb0: 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a   parameters..**.
0ec0: 2a 2a 20 20 20 4e 6f 20 70 61 72 61 6d 65 74 65  **   No paramete
0ed0: 72 73 3a 20 20 20 20 20 20 20 20 20 41 20 64 65  rs:         A de
0ee0: 67 65 6e 65 72 61 74 65 20 70 6c 61 6e 2e 20 20  generate plan.  
0ef0: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 7a 65  The result is ze
0f00: 72 6f 20 72 6f 77 73 2e 0a 2a 2a 20 20 20 31 20  ro rows..**   1 
0f10: 50 61 72 61 6d 65 74 65 72 3a 20 20 20 20 20 20  Parameter:      
0f20: 20 20 20 20 20 53 63 61 6e 20 61 6c 6c 20 6f 66       Scan all of
0f30: 20 74 68 65 20 69 6e 64 65 78 20 73 74 61 72 74   the index start
0f40: 69 6e 67 20 77 69 74 68 20 66 69 72 73 74 20 65  ing with first e
0f50: 6e 74 72 79 0a 2a 2a 20 20 20 32 20 70 61 72 61  ntry.**   2 para
0f60: 6d 65 74 65 72 73 3a 20 20 20 20 20 20 20 20 20  meters:         
0f70: 20 53 63 61 6e 20 74 68 65 20 69 6e 64 65 78 20   Scan the index 
0f80: 73 74 61 72 74 69 6e 67 20 61 66 74 65 72 20 74  starting after t
0f90: 68 65 20 22 61 66 74 65 72 5f 6b 65 79 22 2e 20  he "after_key". 
0fa0: 20 20 20 0a 2a 2a 0a 2a 2a 20 50 72 6f 76 69 64     .**.** Provid
0fb0: 65 20 73 75 63 63 65 73 73 69 76 65 6c 79 20 73  e successively s
0fc0: 6d 61 6c 6c 65 72 20 63 6f 73 74 73 20 66 6f 72  maller costs for
0fd0: 20 65 61 63 68 20 6f 66 20 74 68 65 73 65 20 70   each of these p
0fe0: 6c 61 6e 73 20 74 6f 20 65 6e 63 6f 75 72 61 67  lans to encourag
0ff0: 65 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20 70  e.** the query p
1000: 6c 61 6e 6e 65 72 20 74 6f 20 73 65 6c 65 63 74  lanner to select
1010: 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1020: 65 20 6d 6f 73 74 20 70 61 72 61 6d 65 74 65 72  e most parameter
1030: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1040: 20 63 69 64 78 42 65 73 74 49 6e 64 65 78 28 73   cidxBestIndex(s
1050: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
1060: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
1070: 69 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20  info *pInfo){.  
1080: 69 6e 74 20 69 49 64 78 4e 61 6d 65 20 3d 20 2d  int iIdxName = -
1090: 31 3b 0a 20 20 69 6e 74 20 69 41 66 74 65 72 4b  1;.  int iAfterK
10a0: 65 79 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  ey = -1;.  int i
10b0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
10c0: 70 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  pInfo->nConstrai
10d0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  nt; i++){.    st
10e0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
10f0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
1100: 20 3d 20 26 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73   = &pInfo->aCons
1110: 74 72 61 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  traint[i];.    i
1120: 66 28 20 70 2d 3e 75 73 61 62 6c 65 3d 3d 30 20  f( p->usable==0 
1130: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1140: 69 66 28 20 70 2d 3e 6f 70 21 3d 53 51 4c 49 54  if( p->op!=SQLIT
1150: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
1160: 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e 75 65  NT_EQ ) continue
1170: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43  ;..    if( p->iC
1180: 6f 6c 75 6d 6e 3d 3d 49 49 43 5f 49 4e 44 45 58  olumn==IIC_INDEX
1190: 5f 4e 41 4d 45 20 29 7b 0a 20 20 20 20 20 20 69  _NAME ){.      i
11a0: 49 64 78 4e 61 6d 65 20 3d 20 69 3b 0a 20 20 20  IdxName = i;.   
11b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43   }.    if( p->iC
11c0: 6f 6c 75 6d 6e 3d 3d 49 49 43 5f 41 46 54 45 52  olumn==IIC_AFTER
11d0: 5f 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 69 41  _KEY ){.      iA
11e0: 66 74 65 72 4b 65 79 20 3d 20 69 3b 0a 20 20 20  fterKey = i;.   
11f0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 49   }.  }..  if( iI
1200: 64 78 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20  dxName<0 ){.    
1210: 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  pInfo->estimated
1220: 43 6f 73 74 20 3d 20 31 30 30 30 30 30 30 30 30  Cost = 100000000
1230: 30 2e 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0.0;.  }else{.  
1240: 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72    pInfo->aConstr
1250: 61 69 6e 74 55 73 61 67 65 5b 69 49 64 78 4e 61  aintUsage[iIdxNa
1260: 6d 65 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  me].argvIndex = 
1270: 31 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  1;.    pInfo->aC
1280: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
1290: 49 64 78 4e 61 6d 65 5d 2e 6f 6d 69 74 20 3d 20  IdxName].omit = 
12a0: 31 3b 0a 20 20 20 20 69 66 28 20 69 41 66 74 65  1;.    if( iAfte
12b0: 72 4b 65 79 3c 30 20 29 7b 0a 20 20 20 20 20 20  rKey<0 ){.      
12c0: 70 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  pInfo->estimated
12d0: 43 6f 73 74 20 3d 20 31 30 30 30 30 30 30 2e 30  Cost = 1000000.0
12e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12f0: 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74     pInfo->aConst
1300: 72 61 69 6e 74 55 73 61 67 65 5b 69 41 66 74 65  raintUsage[iAfte
1310: 72 4b 65 79 5d 2e 61 72 67 76 49 6e 64 65 78 20  rKey].argvIndex 
1320: 3d 20 32 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  = 2;.      pInfo
1330: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
1340: 67 65 5b 69 41 66 74 65 72 4b 65 79 5d 2e 6f 6d  ge[iAfterKey].om
1350: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  it = 1;.      pI
1360: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1370: 73 74 20 3d 20 31 30 30 30 2e 30 3b 0a 20 20 20  st = 1000.0;.   
1380: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1390: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13a0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
13b0: 62 74 72 65 65 69 6e 66 6f 20 63 75 72 73 6f 72  btreeinfo cursor
13c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13d0: 63 69 64 78 4f 70 65 6e 28 73 71 6c 69 74 65 33  cidxOpen(sqlite3
13e0: 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71  _vtab *pVTab, sq
13f0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
1400: 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20  r **ppCursor){. 
1410: 20 43 69 64 78 43 75 72 73 6f 72 20 2a 70 52 65   CidxCursor *pRe
1420: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1430: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 70 52 65 74  LITE_OK;..  pRet
1440: 20 3d 20 63 69 64 78 4d 61 6c 6c 6f 63 28 26 72   = cidxMalloc(&r
1450: 63 2c 20 73 69 7a 65 6f 66 28 43 69 64 78 43 75  c, sizeof(CidxCu
1460: 72 73 6f 72 29 29 3b 0a 0a 20 20 2a 70 70 43 75  rsor));..  *ppCu
1470: 72 73 6f 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  rsor = (sqlite3_
1480: 76 74 61 62 5f 63 75 72 73 6f 72 2a 29 70 52 65  vtab_cursor*)pRe
1490: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
14a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
14b0: 20 62 74 72 65 65 69 6e 66 6f 20 63 75 72 73 6f   btreeinfo curso
14c0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
14d0: 20 63 69 64 78 43 6c 6f 73 65 28 73 71 6c 69 74   cidxClose(sqlit
14e0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
14f0: 70 43 75 72 73 6f 72 29 7b 0a 20 20 43 69 64 78  pCursor){.  Cidx
1500: 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28  Cursor *pCsr = (
1510: 43 69 64 78 43 75 72 73 6f 72 2a 29 70 43 75 72  CidxCursor*)pCur
1520: 73 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sor;.  sqlite3_f
1530: 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e 70 53  inalize(pCsr->pS
1540: 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tmt);.  sqlite3_
1550: 66 72 65 65 28 70 43 73 72 2d 3e 7a 49 64 78 4e  free(pCsr->zIdxN
1560: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
1570: 66 72 65 65 28 70 43 73 72 2d 3e 7a 41 66 74 65  free(pCsr->zAfte
1580: 72 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  rKey);.  sqlite3
1590: 5f 66 72 65 65 28 70 43 73 72 29 3b 0a 20 20 72  _free(pCsr);.  r
15a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 61  .}../*.** Move a
15c0: 20 62 74 72 65 65 69 6e 66 6f 20 63 75 72 73 6f   btreeinfo curso
15d0: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
15e0: 74 72 79 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  try in the file.
15f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1600: 69 64 78 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  idxNext(sqlite3_
1610: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 43 75  vtab_cursor *pCu
1620: 72 73 6f 72 29 7b 0a 20 20 43 69 64 78 43 75 72  rsor){.  CidxCur
1630: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 43 69 64  sor *pCsr = (Cid
1640: 78 43 75 72 73 6f 72 2a 29 70 43 75 72 73 6f 72  xCursor*)pCursor
1650: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
1660: 69 74 65 33 5f 73 74 65 70 28 70 43 73 72 2d 3e  ite3_step(pCsr->
1670: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63  pStmt);.  if( rc
1680: 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  !=SQLITE_ROW ){.
1690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16a0: 5f 66 69 6e 61 6c 69 7a 65 28 70 43 73 72 2d 3e  _finalize(pCsr->
16b0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 43 73 72  pStmt);.    pCsr
16c0: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
16d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
16f0: 74 65 33 20 2a 64 62 20 3d 20 28 28 43 69 64 78  te3 *db = ((Cidx
1700: 54 61 62 6c 65 2a 29 70 43 73 72 2d 3e 62 61 73  Table*)pCsr->bas
1710: 65 2e 70 56 74 61 62 29 2d 3e 64 62 3b 0a 20 20  e.pVtab)->db;.  
1720: 20 20 20 20 63 69 64 78 43 75 72 73 6f 72 45 72      cidxCursorEr
1730: 72 6f 72 28 70 43 73 72 2c 20 22 43 75 72 73 6f  ror(pCsr, "Curso
1740: 72 20 65 72 72 6f 72 3a 20 25 73 22 2c 20 73 71  r error: %s", sq
1750: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1760: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1770: 7b 0a 20 20 20 20 70 43 73 72 2d 3e 69 52 6f 77  {.    pCsr->iRow
1780: 69 64 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 53  id++;.    rc = S
1790: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17b0: 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64   We have reached
17c0: 20 45 4f 46 20 69 66 20 70 72 65 76 69 6f 75 73   EOF if previous
17d0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
17e0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 79 74  returned.** anyt
17f0: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1800: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 2a 2f 0a 73  SQLITE_ROW;.*/.s
1810: 74 61 74 69 63 20 69 6e 74 20 63 69 64 78 45 6f  tatic int cidxEo
1820: 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  f(sqlite3_vtab_c
1830: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b  ursor *pCursor){
1840: 0a 20 20 43 69 64 78 43 75 72 73 6f 72 20 2a 70  .  CidxCursor *p
1850: 43 73 72 20 3d 20 28 43 69 64 78 43 75 72 73 6f  Csr = (CidxCurso
1860: 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20 20 72 65  r*)pCursor;.  re
1870: 74 75 72 6e 20 70 43 73 72 2d 3e 70 53 74 6d 74  turn pCsr->pStmt
1880: 3d 3d 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  ==0;.}..static c
1890: 68 61 72 20 2a 63 69 64 78 4d 70 72 69 6e 74 66  har *cidxMprintf
18a0: 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73 74  (int *pRc, const
18b0: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
18c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20  ){.  char *zRet 
18d0: 3d 20 30 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61  = 0;.  va_list a
18e0: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
18f0: 2c 20 7a 46 6d 74 29 3b 0a 20 20 7a 52 65 74 20  , zFmt);.  zRet 
1900: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
1910: 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
1920: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
1930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  _OK ){.    if( z
1940: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
1950: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
1960: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  MEM;.    }.  }el
1970: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
1980: 66 72 65 65 28 7a 52 65 74 29 3b 0a 20 20 20 20  free(zRet);.    
1990: 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  zRet = 0;.  }.  
19a0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
19b0: 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74  turn zRet;.}..st
19c0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
19d0: 74 20 2a 63 69 64 78 50 72 65 70 61 72 65 28 0a  t *cidxPrepare(.
19e0: 20 20 69 6e 74 20 2a 70 52 63 2c 20 43 69 64 78    int *pRc, Cidx
19f0: 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 63 6f  Cursor *pCsr, co
1a00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
1a10: 2e 2e 2e 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  ....){.  sqlite3
1a20: 5f 73 74 6d 74 20 2a 70 52 65 74 20 3d 20 30 3b  _stmt *pRet = 0;
1a30: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
1a40: 20 76 61 5f 6c 69 73 74 20 61 70 3b 20 20 20 20   va_list ap;    
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 2f 2a 20 2e 2e 2e 20 70 72 69 6e 74 66 20 61   /* ... printf a
1a70: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 76 61  rguments */.  va
1a80: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
1a90: 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  ;..  zSql = sqli
1aa0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
1ab0: 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20 2a 70  t, ap);.  if( *p
1ac0: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
1ad0: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
1ae0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
1af0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1b00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 28  sqlite3 *db = ((
1b20: 43 69 64 78 54 61 62 6c 65 2a 29 70 43 73 72 2d  CidxTable*)pCsr-
1b30: 3e 62 61 73 65 2e 70 56 74 61 62 29 2d 3e 64 62  >base.pVtab)->db
1b40: 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 73  ;.      *pRc = s
1b50: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1b60: 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
1b70: 26 70 52 65 74 2c 20 30 29 3b 0a 20 20 20 20 20  &pRet, 0);.     
1b80: 20 69 66 28 20 2a 70 52 63 21 3d 53 51 4c 49 54   if( *pRc!=SQLIT
1b90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ba0: 63 69 64 78 43 75 72 73 6f 72 45 72 72 6f 72 28  cidxCursorError(
1bb0: 70 43 73 72 2c 20 22 53 51 4c 20 65 72 72 6f 72  pCsr, "SQL error
1bc0: 3a 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  : %s", sqlite3_e
1bd0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
1be0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1bf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
1c00: 6c 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  l);.  va_end(ap)
1c10: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  ;..  return pRet
1c20: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1c30: 20 63 69 64 78 46 69 6e 61 6c 69 7a 65 28 69 6e   cidxFinalize(in
1c40: 74 20 2a 70 52 63 2c 20 73 71 6c 69 74 65 33 5f  t *pRc, sqlite3_
1c50: 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20  stmt *pStmt){.  
1c60: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1c70: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1c80: 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
1c90: 4c 49 54 45 5f 4f 4b 20 29 20 2a 70 52 63 20 3d  LITE_OK ) *pRc =
1ca0: 20 72 63 3b 0a 7d 0a 0a 63 68 61 72 20 2a 63 69   rc;.}..char *ci
1cb0: 64 78 53 74 72 64 75 70 28 69 6e 74 20 2a 70 52  dxStrdup(int *pR
1cc0: 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  c, const char *z
1cd0: 53 74 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  Str){.  char *zR
1ce0: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  et = 0;.  if( *p
1cf0: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
1d00: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e  .    int n = (in
1d10: 74 29 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b 0a  t)strlen(zStr);.
1d20: 20 20 20 20 7a 52 65 74 20 3d 20 63 69 64 78 4d      zRet = cidxM
1d30: 61 6c 6c 6f 63 28 70 52 63 2c 20 6e 2b 31 29 3b  alloc(pRc, n+1);
1d40: 0a 20 20 20 20 69 66 28 20 7a 52 65 74 20 29 20  .    if( zRet ) 
1d50: 6d 65 6d 63 70 79 28 7a 52 65 74 2c 20 7a 53 74  memcpy(zRet, zSt
1d60: 72 2c 20 6e 2b 31 29 3b 0a 20 20 7d 0a 20 20 72  r, n+1);.  }.  r
1d70: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73  eturn zRet;.}..s
1d80: 74 61 74 69 63 20 76 6f 69 64 20 63 69 64 78 46  tatic void cidxF
1d90: 72 65 65 49 6e 64 65 78 28 43 69 64 78 49 6e 64  reeIndex(CidxInd
1da0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 66 28  ex *pIdx){.  if(
1db0: 20 70 49 64 78 20 29 7b 0a 20 20 20 20 69 6e 74   pIdx ){.    int
1dc0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
1dd0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 3b 20 69   i<pIdx->nCol; i
1de0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1df0: 65 33 5f 66 72 65 65 28 70 49 64 78 2d 3e 61 43  e3_free(pIdx->aC
1e00: 6f 6c 5b 69 5d 2e 7a 45 78 70 72 29 3b 0a 20 20  ol[i].zExpr);.  
1e10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1e20: 66 72 65 65 28 70 49 64 78 2d 3e 7a 57 68 65 72  free(pIdx->zWher
1e30: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
1e40: 66 72 65 65 28 70 49 64 78 29 3b 0a 20 20 7d 0a  free(pIdx);.  }.
1e50: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 69  }..static int ci
1e60: 64 78 5f 69 73 73 70 61 63 65 28 63 68 61 72 20  dx_isspace(char 
1e70: 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 3d 3d  c){.  return c==
1e80: 27 20 27 20 7c 7c 20 63 3d 3d 27 5c 74 27 20 7c  ' ' || c=='\t' |
1e90: 7c 20 63 3d 3d 27 5c 72 27 20 7c 7c 20 63 3d 3d  | c=='\r' || c==
1ea0: 27 5c 6e 27 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  '\n';.}..static 
1eb0: 69 6e 74 20 63 69 64 78 5f 69 73 69 64 65 6e 74  int cidx_isident
1ec0: 28 63 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75  (char c){.  retu
1ed0: 72 6e 20 63 3c 30 20 0a 20 20 20 20 7c 7c 20 28  rn c<0 .    || (
1ee0: 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27  c>='0' && c<='9'
1ef0: 29 20 7c 7c 20 28 63 3e 3d 27 61 27 20 26 26 20  ) || (c>='a' && 
1f00: 63 3c 3d 27 7a 27 29 20 0a 20 20 20 20 7c 7c 20  c<='z') .    || 
1f10: 28 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 5a  (c>='A' && c<='Z
1f20: 27 29 20 7c 7c 20 63 3d 3d 27 5f 27 3b 0a 7d 0a  ') || c=='_';.}.
1f30: 0a 23 64 65 66 69 6e 65 20 43 49 44 58 5f 50 41  .#define CIDX_PA
1f40: 52 53 45 5f 45 4f 46 20 20 20 30 0a 23 64 65 66  RSE_EOF   0.#def
1f50: 69 6e 65 20 43 49 44 58 5f 50 41 52 53 45 5f 43  ine CIDX_PARSE_C
1f60: 4f 4d 4d 41 20 31 20 20 20 20 20 20 2f 2a 20 20  OMMA 1      /*  
1f70: 22 2c 22 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43  "," */.#define C
1f80: 49 44 58 5f 50 41 52 53 45 5f 4f 50 45 4e 20 20  IDX_PARSE_OPEN  
1f90: 32 20 20 20 20 20 20 2f 2a 20 20 22 28 22 20 2a  2      /*  "(" *
1fa0: 2f 0a 23 64 65 66 69 6e 65 20 43 49 44 58 5f 50  /.#define CIDX_P
1fb0: 41 52 53 45 5f 43 4c 4f 53 45 20 33 20 20 20 20  ARSE_CLOSE 3    
1fc0: 20 20 2f 2a 20 20 22 29 22 20 2a 2f 0a 0a 2f 2a    /*  ")" */../*
1fd0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 49 6e  .** Argument zIn
1fe0: 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
1ff0: 20 73 74 61 72 74 2c 20 6d 69 64 64 6c 65 20 6f   start, middle o
2000: 72 20 65 6e 64 20 6f 66 20 61 20 43 52 45 41 54  r end of a CREAT
2010: 45 20 49 4e 44 45 58 0a 2a 2a 20 73 74 61 74 65  E INDEX.** state
2020: 6d 65 6e 74 2e 20 49 66 20 61 72 67 75 6d 65 6e  ment. If argumen
2030: 74 20 70 62 44 6f 4e 6f 74 54 72 69 6d 20 69 73  t pbDoNotTrim is
2040: 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
2050: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
2060: 20 73 63 61 6e 73 20 74 68 65 20 69 6e 70 75 74   scans the input
2070: 20 75 6e 74 69 6c 20 69 74 20 66 69 6e 64 73 20   until it finds 
2080: 45 4f 46 2c 20 61 20 63 6f 6d 6d 61 20 28 22 2c  EOF, a comma (",
2090: 22 29 20 6f 72 20 61 6e 20 6f 70 65 6e 20 6f 72  ") or an open or
20a0: 0a 2a 2a 20 63 6c 6f 73 65 20 70 61 72 65 6e 74  .** close parent
20b0: 68 65 73 69 73 20 63 68 61 72 61 63 74 65 72 2e  hesis character.
20c0: 20 49 74 20 74 68 65 6e 20 73 65 74 73 20 28 2a   It then sets (*
20d0: 70 7a 4f 75 74 29 20 74 6f 20 70 6f 69 6e 74 20  pzOut) to point 
20e0: 74 6f 20 73 61 69 64 0a 2a 2a 20 63 68 61 72 61  to said.** chara
20f0: 63 74 65 72 20 61 6e 64 20 72 65 74 75 72 6e 73  cter and returns
2100: 20 61 20 43 49 44 58 5f 50 41 52 53 45 5f 58 58   a CIDX_PARSE_XX
2110: 58 20 63 6f 6e 73 74 61 6e 74 20 61 73 20 61 70  X constant as ap
2120: 70 72 6f 70 72 69 61 74 65 2e 20 54 68 65 0a 2a  propriate. The.*
2130: 2a 20 70 61 72 73 65 72 20 69 73 20 73 6d 61 72  * parser is smar
2140: 74 20 65 6e 6f 75 67 68 20 74 68 61 74 20 73 70  t enough that sp
2150: 65 63 69 61 6c 20 63 68 61 72 61 63 74 65 72 73  ecial characters
2160: 20 69 6e 73 69 64 65 20 53 51 4c 20 73 74 72 69   inside SQL stri
2170: 6e 67 73 0a 2a 2a 20 6f 72 20 63 6f 6d 6d 65 6e  ngs.** or commen
2180: 74 73 20 61 72 65 20 6e 6f 74 20 72 65 74 75 72  ts are not retur
2190: 6e 65 64 20 66 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4f  ned for..**.** O
21a0: 72 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70  r, if argument p
21b0: 62 44 6f 4e 6f 74 54 72 69 6d 20 69 73 20 4e 55  bDoNotTrim is NU
21c0: 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
21d0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a 70 7a 4f  nction sets *pzO
21e0: 75 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74  ut.** to point t
21f0: 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72  o the first char
2200: 61 63 74 65 72 20 6f 66 20 74 68 65 20 73 74 72  acter of the str
2210: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
2220: 77 68 69 74 65 73 70 61 63 65 0a 2a 2a 20 6f 72  whitespace.** or
2230: 20 70 61 72 74 20 6f 66 20 61 6e 20 53 51 4c 20   part of an SQL 
2240: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 72 65 74 75  comment and retu
2250: 72 6e 73 20 43 49 44 58 5f 50 41 52 53 45 5f 45  rns CIDX_PARSE_E
2260: 4f 46 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69  OF..**.** Additi
2270: 6f 6e 61 6c 6c 79 2c 20 69 66 20 70 62 44 6f 4e  onally, if pbDoN
2280: 6f 74 54 72 69 6d 20 69 73 20 6e 6f 74 20 4e 55  otTrim is not NU
2290: 4c 4c 20 61 6e 64 20 74 68 65 20 65 6c 65 6d 65  LL and the eleme
22a0: 6e 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  nt immediately.*
22b0: 2a 20 62 65 66 6f 72 65 20 28 2a 70 7a 4f 75 74  * before (*pzOut
22c0: 29 20 69 73 20 61 6e 20 53 51 4c 20 63 6f 6d 6d  ) is an SQL comm
22d0: 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ent of the form 
22e0: 22 2d 2d 20 63 6f 6d 6d 65 6e 74 22 2c 20 74 68  "-- comment", th
22f0: 65 6e 0a 2a 2a 20 28 2a 70 62 44 6f 4e 6f 74 54  en.** (*pbDoNotT
2300: 72 69 6d 29 20 69 73 20 73 65 74 20 62 65 66 6f  rim) is set befo
2310: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 6e  re returning. In
2320: 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
2330: 20 69 74 20 69 73 0a 2a 2a 20 63 6c 65 61 72 65   it is.** cleare
2340: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2350: 20 63 69 64 78 46 69 6e 64 4e 65 78 74 28 0a 20   cidxFindNext(. 
2360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
2370: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
2380: 2a 2a 70 7a 4f 75 74 2c 0a 20 20 69 6e 74 20 2a  **pzOut,.  int *
2390: 70 62 44 6f 4e 6f 74 54 72 69 6d 20 20 20 20 20  pbDoNotTrim     
23a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23b0: 54 3a 20 54 72 75 65 20 69 66 20 70 72 65 76 20  T: True if prev 
23c0: 69 73 20 2d 2d 20 63 6f 6d 6d 65 6e 74 20 2a 2f  is -- comment */
23d0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
23e0: 20 2a 7a 20 3d 20 7a 49 6e 3b 0a 0a 20 20 77 68   *z = zIn;..  wh
23f0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 77 68  ile( 1 ){.    wh
2400: 69 6c 65 28 20 63 69 64 78 5f 69 73 73 70 61 63  ile( cidx_isspac
2410: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
2420: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
2430: 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  & z[1]=='-' ){. 
2440: 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
2450: 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 21 3d     while( z[0]!=
2460: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
2470: 69 66 28 20 7a 5b 30 5d 3d 3d 27 5c 30 27 20 29  if( z[0]=='\0' )
2480: 20 72 65 74 75 72 6e 20 43 49 44 58 5f 50 41 52   return CIDX_PAR
2490: 53 45 5f 45 4f 46 3b 0a 20 20 20 20 20 20 20 20  SE_EOF;.        
24a0: 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  z++;.      }.   
24b0: 20 20 20 77 68 69 6c 65 28 20 63 69 64 78 5f 69     while( cidx_i
24c0: 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b  sspace(*z) ) z++
24d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 62 44 6f  ;.      if( pbDo
24e0: 4e 6f 74 54 72 69 6d 20 29 20 2a 70 62 44 6f 4e  NotTrim ) *pbDoN
24f0: 6f 74 54 72 69 6d 20 3d 20 31 3b 0a 20 20 20 20  otTrim = 1;.    
2500: 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 7a 5b  }else.    if( z[
2510: 30 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d  0]=='/' && z[1]=
2520: 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 7a 20  ='*' ){.      z 
2530: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
2540: 65 28 20 7a 5b 30 5d 21 3d 27 2a 27 20 7c 7c 20  e( z[0]!='*' || 
2550: 7a 5b 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  z[1]!='/' ){.   
2560: 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d 3d 27       if( z[1]=='
2570: 5c 30 27 20 29 20 72 65 74 75 72 6e 20 43 49 44  \0' ) return CID
2580: 58 5f 50 41 52 53 45 5f 45 4f 46 3b 0a 20 20 20  X_PARSE_EOF;.   
2590: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
25a0: 7d 0a 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a  }.      z += 2;.
25b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25c0: 20 2a 70 7a 4f 75 74 20 3d 20 7a 3b 0a 20 20 20   *pzOut = z;.   
25d0: 20 20 20 69 66 28 20 70 62 44 6f 4e 6f 74 54 72     if( pbDoNotTr
25e0: 69 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 43  im==0 ) return C
25f0: 49 44 58 5f 50 41 52 53 45 5f 45 4f 46 3b 0a 20  IDX_PARSE_EOF;. 
2600: 20 20 20 20 20 73 77 69 74 63 68 28 20 2a 7a 20       switch( *z 
2610: 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
2620: 27 5c 30 27 3a 0a 20 20 20 20 20 20 20 20 20 20  '\0':.          
2630: 72 65 74 75 72 6e 20 43 49 44 58 5f 50 41 52 53  return CIDX_PARS
2640: 45 5f 45 4f 46 3b 0a 20 20 20 20 20 20 20 20 63  E_EOF;.        c
2650: 61 73 65 20 27 28 27 3a 0a 20 20 20 20 20 20 20  ase '(':.       
2660: 20 20 20 72 65 74 75 72 6e 20 43 49 44 58 5f 50     return CIDX_P
2670: 41 52 53 45 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  ARSE_OPEN;.     
2680: 20 20 20 63 61 73 65 20 27 29 27 3a 0a 20 20 20     case ')':.   
2690: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 43 49         return CI
26a0: 44 58 5f 50 41 52 53 45 5f 43 4c 4f 53 45 3b 0a  DX_PARSE_CLOSE;.
26b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 27 2c 27          case ','
26c0: 3a 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  :.          retu
26d0: 72 6e 20 43 49 44 58 5f 50 41 52 53 45 5f 43 4f  rn CIDX_PARSE_CO
26e0: 4d 4d 41 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  MMA;.  .        
26f0: 63 61 73 65 20 27 22 27 3a 20 0a 20 20 20 20 20  case '"': .     
2700: 20 20 20 63 61 73 65 20 27 5c 27 27 3a 20 0a 20     case '\'': . 
2710: 20 20 20 20 20 20 20 63 61 73 65 20 27 60 27 3a         case '`':
2720: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61   {.          cha
2730: 72 20 71 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20  r q = *z;.      
2740: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20      z++;.       
2750: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2760: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2770: 2a 7a 3d 3d 71 20 29 7b 0a 20 20 20 20 20 20 20  *z==q ){.       
2780: 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
2790: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a            if( *z
27a0: 21 3d 71 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  !=q ) break;.   
27b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27c0: 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
27d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
27f0: 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 63 61   }.  .        ca
2800: 73 65 20 27 5b 27 3a 0a 20 20 20 20 20 20 20 20  se '[':.        
2810: 20 20 77 68 69 6c 65 28 20 2a 7a 2b 2b 21 3d 27    while( *z++!='
2820: 5d 27 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ]' );.          
2830: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 20 20  break;.  .      
2840: 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2850: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
2860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2870: 20 7d 0a 20 20 20 20 20 20 2a 70 62 44 6f 4e 6f   }.      *pbDoNo
2880: 74 54 72 69 6d 20 3d 20 30 3b 0a 20 20 20 20 7d  tTrim = 0;.    }
2890: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
28a0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31  0 );.  return -1
28b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
28c0: 63 69 64 78 50 61 72 73 65 53 51 4c 28 43 69 64  cidxParseSQL(Cid
28d0: 78 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 43  xCursor *pCsr, C
28e0: 69 64 78 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  idxIndex *pIdx, 
28f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2900: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2910: 2a 7a 20 3d 20 7a 53 71 6c 3b 0a 20 20 63 6f 6e  *z = zSql;.  con
2920: 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 69  st char *z1;.  i
2930: 6e 74 20 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt e;.  int rc =
2940: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2950: 74 20 6e 50 61 72 65 6e 20 3d 20 31 3b 0a 20 20  t nParen = 1;.  
2960: 69 6e 74 20 62 44 6f 4e 6f 74 54 72 69 6d 20 3d  int bDoNotTrim =
2970: 20 30 3b 0a 20 20 43 69 64 78 43 6f 6c 75 6d 6e   0;.  CidxColumn
2980: 20 2a 70 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61   *pCol = pIdx->a
2990: 43 6f 6c 3b 0a 0a 20 20 65 20 3d 20 63 69 64 78  Col;..  e = cidx
29a0: 46 69 6e 64 4e 65 78 74 28 7a 2c 20 26 7a 2c 20  FindNext(z, &z, 
29b0: 26 62 44 6f 4e 6f 74 54 72 69 6d 29 3b 0a 20 20  &bDoNotTrim);.  
29c0: 69 66 28 20 65 21 3d 43 49 44 58 5f 50 41 52 53  if( e!=CIDX_PARS
29d0: 45 5f 4f 50 45 4e 20 29 20 67 6f 74 6f 20 70 61  E_OPEN ) goto pa
29e0: 72 73 65 5f 65 72 72 6f 72 3b 0a 20 20 7a 31 20  rse_error;.  z1 
29f0: 3d 20 7a 2b 31 3b 0a 20 20 7a 2b 2b 3b 0a 20 20  = z+1;.  z++;.  
2a00: 77 68 69 6c 65 28 20 6e 50 61 72 65 6e 3e 30 20  while( nParen>0 
2a10: 29 7b 0a 20 20 20 20 65 20 3d 20 63 69 64 78 46  ){.    e = cidxF
2a20: 69 6e 64 4e 65 78 74 28 7a 2c 20 26 7a 2c 20 26  indNext(z, &z, &
2a30: 62 44 6f 4e 6f 74 54 72 69 6d 29 3b 0a 20 20 20  bDoNotTrim);.   
2a40: 20 69 66 28 20 65 3d 3d 43 49 44 58 5f 50 41 52   if( e==CIDX_PAR
2a50: 53 45 5f 45 4f 46 20 29 20 67 6f 74 6f 20 70 61  SE_EOF ) goto pa
2a60: 72 73 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 69  rse_error;.    i
2a70: 66 28 20 28 65 3d 3d 43 49 44 58 5f 50 41 52 53  f( (e==CIDX_PARS
2a80: 45 5f 43 4f 4d 4d 41 20 7c 7c 20 65 3d 3d 43 49  E_COMMA || e==CI
2a90: 44 58 5f 50 41 52 53 45 5f 43 4c 4f 53 45 29 20  DX_PARSE_CLOSE) 
2aa0: 26 26 20 6e 50 61 72 65 6e 3d 3d 31 20 29 7b 0a  && nParen==1 ){.
2ab0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2ac0: 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 20 20 20 20   *z2 = z;.      
2ad0: 69 66 28 20 70 43 6f 6c 2d 3e 7a 45 78 70 72 20  if( pCol->zExpr 
2ae0: 29 20 67 6f 74 6f 20 70 61 72 73 65 5f 65 72 72  ) goto parse_err
2af0: 6f 72 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62  or;..      if( b
2b00: 44 6f 4e 6f 74 54 72 69 6d 3d 3d 30 20 29 7b 0a  DoNotTrim==0 ){.
2b10: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 63          while( c
2b20: 69 64 78 5f 69 73 73 70 61 63 65 28 7a 5b 2d 31  idx_isspace(z[-1
2b30: 5d 29 20 29 20 7a 2d 2d 3b 0a 20 20 20 20 20 20  ]) ) z--;.      
2b40: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 73    if( !sqlite3_s
2b50: 74 72 6e 69 63 6d 70 28 26 7a 5b 2d 33 5d 2c 20  trnicmp(&z[-3], 
2b60: 22 61 73 63 22 2c 20 33 29 20 26 26 20 30 3d 3d  "asc", 3) && 0==
2b70: 63 69 64 78 5f 69 73 69 64 65 6e 74 28 7a 5b 2d  cidx_isident(z[-
2b80: 34 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  4]) ){.         
2b90: 20 7a 20 2d 3d 20 33 3b 0a 20 20 20 20 20 20 20   z -= 3;.       
2ba0: 20 20 20 77 68 69 6c 65 28 20 63 69 64 78 5f 69     while( cidx_i
2bb0: 73 73 70 61 63 65 28 7a 5b 2d 31 5d 29 20 29 20  sspace(z[-1]) ) 
2bc0: 7a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  z--;.        }el
2bd0: 73 65 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  se.          if(
2be0: 20 21 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63   !sqlite3_strnic
2bf0: 6d 70 28 26 7a 5b 2d 34 5d 2c 20 22 64 65 73 63  mp(&z[-4], "desc
2c00: 22 2c 20 34 29 20 26 26 20 30 3d 3d 63 69 64 78  ", 4) && 0==cidx
2c10: 5f 69 73 69 64 65 6e 74 28 7a 5b 2d 35 5d 29 20  _isident(z[-5]) 
2c20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
2c30: 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   -= 4;.         
2c40: 20 20 20 77 68 69 6c 65 28 20 63 69 64 78 5f 69     while( cidx_i
2c50: 73 73 70 61 63 65 28 7a 5b 2d 31 5d 29 20 29 20  sspace(z[-1]) ) 
2c60: 7a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  z--;.          }
2c70: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
2c80: 63 69 64 78 5f 69 73 73 70 61 63 65 28 7a 31 5b  cidx_isspace(z1[
2c90: 30 5d 29 20 29 20 7a 31 2b 2b 3b 0a 20 20 20 20  0]) ) z1++;.    
2ca0: 20 20 7d 0a 0a 20 20 20 20 20 20 70 43 6f 6c 2d    }..      pCol-
2cb0: 3e 7a 45 78 70 72 20 3d 20 63 69 64 78 4d 70 72  >zExpr = cidxMpr
2cc0: 69 6e 74 66 28 26 72 63 2c 20 22 25 2e 2a 73 22  intf(&rc, "%.*s"
2cd0: 2c 20 7a 2d 7a 31 2c 20 7a 31 29 3b 0a 20 20 20  , z-z1, z1);.   
2ce0: 20 20 20 70 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20     pCol++;.     
2cf0: 20 7a 20 3d 20 7a 31 20 3d 20 7a 32 2b 31 3b 0a   z = z1 = z2+1;.
2d00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 3d      }.    if( e=
2d10: 3d 43 49 44 58 5f 50 41 52 53 45 5f 4f 50 45 4e  =CIDX_PARSE_OPEN
2d20: 20 29 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20   ) nParen++;.   
2d30: 20 69 66 28 20 65 3d 3d 43 49 44 58 5f 50 41 52   if( e==CIDX_PAR
2d40: 53 45 5f 43 4c 4f 53 45 20 29 20 6e 50 61 72 65  SE_CLOSE ) nPare
2d50: 6e 2d 2d 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20  n--;.    z++;.  
2d60: 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  }..  /* Search f
2d70: 6f 72 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  or a WHERE claus
2d80: 65 20 2a 2f 0a 20 20 63 69 64 78 46 69 6e 64 4e  e */.  cidxFindN
2d90: 65 78 74 28 7a 2c 20 26 7a 2c 20 30 29 3b 0a 20  ext(z, &z, 0);. 
2da0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
2db0: 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 77 68 65  strnicmp(z, "whe
2dc0: 72 65 22 2c 20 35 29 20 29 7b 0a 20 20 20 20 70  re", 5) ){.    p
2dd0: 49 64 78 2d 3e 7a 57 68 65 72 65 20 3d 20 63 69  Idx->zWhere = ci
2de0: 64 78 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22  dxMprintf(&rc, "
2df0: 25 73 5c 6e 22 2c 20 26 7a 5b 35 5d 29 3b 0a 20  %s\n", &z[5]);. 
2e00: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 21   }else if( z[0]!
2e10: 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 67 6f 74  ='\0' ){.    got
2e20: 6f 20 70 61 72 73 65 5f 65 72 72 6f 72 3b 0a 20  o parse_error;. 
2e30: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2e40: 0a 0a 20 70 61 72 73 65 5f 65 72 72 6f 72 3a 0a  .. parse_error:.
2e50: 20 20 63 69 64 78 43 75 72 73 6f 72 45 72 72 6f    cidxCursorErro
2e60: 72 28 70 43 73 72 2c 20 22 50 61 72 73 65 20 65  r(pCsr, "Parse e
2e70: 72 72 6f 72 20 69 6e 3a 20 25 73 22 2c 20 7a 53  rror in: %s", zS
2e80: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ql);.  return SQ
2e90: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73  LITE_ERROR;.}..s
2ea0: 74 61 74 69 63 20 69 6e 74 20 63 69 64 78 4c 6f  tatic int cidxLo
2eb0: 6f 6b 75 70 49 6e 64 65 78 28 0a 20 20 43 69 64  okupIndex(.  Cid
2ec0: 78 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  xCursor *pCsr,  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ee0: 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
2ef0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f00: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
2f10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e     /* Name of in
2f20: 64 65 78 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 2a  dex to look up *
2f30: 2f 0a 20 20 43 69 64 78 49 6e 64 65 78 20 2a 2a  /.  CidxIndex **
2f40: 70 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ppIdx,          
2f50: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 63      /* OUT: Desc
2f60: 72 69 70 74 69 6f 6e 20 6f 66 20 63 6f 6c 75 6d  ription of colum
2f70: 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ns */.  char **p
2f80: 7a 54 61 62 20 20 20 20 20 20 20 20 20 20 20 20  zTab            
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2fa0: 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b  Table name */.){
2fb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2fc0: 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
2fd0: 54 61 62 20 3d 20 30 3b 0a 20 20 43 69 64 78 49  Tab = 0;.  CidxI
2fe0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
2ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
3000: 2a 70 46 69 6e 64 54 61 62 20 3d 20 30 3b 0a 20  *pFindTab = 0;. 
3010: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
3020: 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 0a 20  Info = 0;.    . 
3030: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   /* Find the tab
3040: 6c 65 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  le for this inde
3050: 78 2e 20 2a 2f 0a 20 20 70 46 69 6e 64 54 61 62  x. */.  pFindTab
3060: 20 3d 20 63 69 64 78 50 72 65 70 61 72 65 28 26   = cidxPrepare(&
3070: 72 63 2c 20 70 43 73 72 2c 20 0a 20 20 20 20 20  rc, pCsr, .     
3080: 20 22 53 45 4c 45 43 54 20 74 62 6c 5f 6e 61 6d   "SELECT tbl_nam
3090: 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
30a0: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
30b0: 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65  name=%Q AND type
30c0: 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20  ='index'",.     
30d0: 20 7a 49 64 78 0a 20 20 29 3b 0a 20 20 69 66 28   zIdx.  );.  if(
30e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30f0: 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
3100: 46 69 6e 64 54 61 62 29 3d 3d 53 51 4c 49 54 45  FindTab)==SQLITE
3110: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
3120: 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28  t char *zSql = (
3130: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
3140: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
3150: 70 46 69 6e 64 54 61 62 2c 20 31 29 3b 0a 20 20  pFindTab, 1);.  
3160: 20 20 7a 54 61 62 20 3d 20 63 69 64 78 53 74 72    zTab = cidxStr
3170: 64 75 70 28 26 72 63 2c 20 28 63 6f 6e 73 74 20  dup(&rc, (const 
3180: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
3190: 6c 75 6d 6e 5f 74 65 78 74 28 70 46 69 6e 64 54  lumn_text(pFindT
31a0: 61 62 2c 20 30 29 29 3b 0a 0a 20 20 20 20 70 49  ab, 0));..    pI
31b0: 6e 66 6f 20 3d 20 63 69 64 78 50 72 65 70 61 72  nfo = cidxPrepar
31c0: 65 28 26 72 63 2c 20 70 43 73 72 2c 20 22 50 52  e(&rc, pCsr, "PR
31d0: 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
31e0: 28 25 51 29 22 2c 20 7a 49 64 78 29 3b 0a 20 20  (%Q)", zIdx);.  
31f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3200: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
3210: 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20   nAlloc = 0;.   
3220: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b     int iCol = 0;
3230: 0a 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ..      while( s
3240: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 66  qlite3_step(pInf
3250: 6f 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  o)==SQLITE_ROW )
3260: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
3270: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
3280: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
3290: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
32a0: 49 6e 66 6f 2c 20 32 29 3b 0a 20 20 20 20 20 20  Info, 2);.      
32b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
32c0: 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  oll = (const cha
32d0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
32e0: 6e 5f 74 65 78 74 28 70 49 6e 66 6f 2c 20 34 29  n_text(pInfo, 4)
32f0: 3b 0a 20 20 20 20 20 20 20 20 43 69 64 78 43 6f  ;.        CidxCo
3300: 6c 75 6d 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20  lumn *p;.       
3310: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
3320: 7a 4e 61 6d 65 20 3d 20 22 72 6f 77 69 64 22 3b  zName = "rowid";
3330: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
3340: 6c 3d 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  l==nAlloc ){.   
3350: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
3360: 20 3d 20 73 69 7a 65 6f 66 28 43 69 64 78 49 6e   = sizeof(CidxIn
3370: 64 65 78 29 20 2b 20 73 69 7a 65 6f 66 28 43 69  dex) + sizeof(Ci
3380: 64 78 43 6f 6c 75 6d 6e 29 2a 28 6e 41 6c 6c 6f  dxColumn)*(nAllo
3390: 63 2b 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  c+8);.          
33a0: 70 49 64 78 20 3d 20 28 43 69 64 78 49 6e 64 65  pIdx = (CidxInde
33b0: 78 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  x*)sqlite3_reall
33c0: 6f 63 28 70 49 64 78 2c 20 6e 42 79 74 65 29 3b  oc(pIdx, nByte);
33d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f  .          nAllo
33e0: 63 20 2b 3d 20 38 3b 0a 20 20 20 20 20 20 20 20  c += 8;.        
33f0: 7d 0a 20 20 20 20 20 20 20 20 70 20 3d 20 26 70  }.        p = &p
3400: 49 64 78 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 2b 2b  Idx->aCol[iCol++
3410: 5d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 44  ];.        p->bD
3420: 65 73 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  esc = sqlite3_co
3430: 6c 75 6d 6e 5f 69 6e 74 28 70 49 6e 66 6f 2c 20  lumn_int(pInfo, 
3440: 33 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62  3);.        p->b
3450: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Key = sqlite3_co
3460: 6c 75 6d 6e 5f 69 6e 74 28 70 49 6e 66 6f 2c 20  lumn_int(pInfo, 
3470: 35 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  5);.        if( 
3480: 7a 53 71 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 62 4b  zSql==0 || p->bK
3490: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
34a0: 20 20 20 70 2d 3e 7a 45 78 70 72 20 3d 20 63 69     p->zExpr = ci
34b0: 64 78 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22  dxMprintf(&rc, "
34c0: 5c 22 25 77 5c 22 20 43 4f 4c 4c 41 54 45 20 25  \"%w\" COLLATE %
34d0: 73 22 2c 7a 4e 61 6d 65 2c 7a 43 6f 6c 6c 29 3b  s",zName,zColl);
34e0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
34f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 78            p->zEx
3500: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pr = 0;.        
3510: 7d 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e  }.        pIdx->
3520: 6e 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  nCol = iCol;.   
3530: 20 20 20 20 20 70 49 64 78 2d 3e 7a 57 68 65 72       pIdx->zWher
3540: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
3550: 20 20 20 20 20 63 69 64 78 46 69 6e 61 6c 69 7a       cidxFinaliz
3560: 65 28 26 72 63 2c 20 70 49 6e 66 6f 29 3b 0a 20  e(&rc, pInfo);. 
3570: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
3580: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
3590: 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Sql ){.      rc 
35a0: 3d 20 63 69 64 78 50 61 72 73 65 53 51 4c 28 70  = cidxParseSQL(p
35b0: 43 73 72 2c 20 70 49 64 78 2c 20 7a 53 71 6c 29  Csr, pIdx, zSql)
35c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  ;.    }.  }..  c
35d0: 69 64 78 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  idxFinalize(&rc,
35e0: 20 70 46 69 6e 64 54 61 62 29 3b 0a 20 20 69 66   pFindTab);.  if
35f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3600: 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20  && zTab==0 ){.  
3610: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3620: 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66  ROR;.  }.  .  if
3630: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3640: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
3650: 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 20 20 63  ree(zTab);.    c
3660: 69 64 78 46 72 65 65 49 6e 64 65 78 28 70 49 64  idxFreeIndex(pId
3670: 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
3680: 20 2a 70 7a 54 61 62 20 3d 20 7a 54 61 62 3b 0a   *pzTab = zTab;.
3690: 20 20 20 20 2a 70 70 49 64 78 20 3d 20 70 49 64      *ppIdx = pId
36a0: 78 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  x;.  }..  return
36b0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
36c0: 6e 74 20 63 69 64 78 44 65 63 6f 64 65 41 66 74  nt cidxDecodeAft
36d0: 65 72 28 0a 20 20 43 69 64 78 43 75 72 73 6f 72  er(.  CidxCursor
36e0: 20 2a 70 43 73 72 2c 20 0a 20 20 69 6e 74 20 6e   *pCsr, .  int n
36f0: 43 6f 6c 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Col, .  const ch
3700: 61 72 20 2a 7a 41 66 74 65 72 4b 65 79 2c 20 0a  ar *zAfterKey, .
3710: 20 20 63 68 61 72 20 2a 2a 2a 70 61 7a 41 66 74    char ***pazAft
3720: 65 72 0a 29 7b 0a 20 20 63 68 61 72 20 2a 2a 61  er.){.  char **a
3730: 7a 41 66 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  zAfter;.  int rc
3740: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3750: 69 6e 74 20 6e 41 66 74 65 72 4b 65 79 20 3d 20  int nAfterKey = 
3760: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 66 74  (int)strlen(zAft
3770: 65 72 4b 65 79 29 3b 0a 0a 20 20 61 7a 41 66 74  erKey);..  azAft
3780: 65 72 20 3d 20 63 69 64 78 4d 61 6c 6c 6f 63 28  er = cidxMalloc(
3790: 26 72 63 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  &rc, sizeof(char
37a0: 2a 29 2a 6e 43 6f 6c 20 2b 20 6e 41 66 74 65 72  *)*nCol + nAfter
37b0: 4b 65 79 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  Key+1);.  if( rc
37c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37d0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
37e0: 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61  ar *zCopy = (cha
37f0: 72 2a 29 26 61 7a 41 66 74 65 72 5b 6e 43 6f 6c  r*)&azAfter[nCol
3800: 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  ];.    char *p =
3810: 20 7a 43 6f 70 79 3b 0a 20 20 20 20 6d 65 6d 63   zCopy;.    memc
3820: 70 79 28 7a 43 6f 70 79 2c 20 7a 41 66 74 65 72  py(zCopy, zAfter
3830: 4b 65 79 2c 20 6e 41 66 74 65 72 4b 65 79 2b 31  Key, nAfterKey+1
3840: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
3850: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
3860: 20 20 20 20 77 68 69 6c 65 28 20 2a 70 3d 3d 27      while( *p=='
3870: 20 27 20 29 20 70 2b 2b 3b 0a 0a 20 20 20 20 20   ' ) p++;..     
3880: 20 2f 2a 20 43 68 65 63 6b 20 4e 55 4c 4c 20 76   /* Check NULL v
3890: 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  alues */.      i
38a0: 66 28 20 2a 70 3d 3d 27 4e 27 20 29 7b 0a 20 20  f( *p=='N' ){.  
38b0: 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
38c0: 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 34 29 20 29  (p, "NULL", 4) )
38d0: 20 67 6f 74 6f 20 70 61 72 73 65 5f 65 72 72 6f   goto parse_erro
38e0: 72 3b 0a 20 20 20 20 20 20 20 20 70 20 2b 3d 20  r;.        p += 
38f0: 34 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  4;.      }..    
3900: 20 20 2f 2a 20 43 68 65 63 6b 20 73 74 72 69 6e    /* Check strin
3910: 67 73 20 61 6e 64 20 62 6c 6f 62 20 6c 69 74 65  gs and blob lite
3920: 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 65 6c  rals */.      el
3930: 73 65 20 69 66 28 20 2a 70 3d 3d 27 58 27 20 7c  se if( *p=='X' |
3940: 7c 20 2a 70 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  | *p=='\'' ){.  
3950: 20 20 20 20 20 20 61 7a 41 66 74 65 72 5b 69 5d        azAfter[i]
3960: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 69 66   = p;.        if
3970: 28 20 2a 70 3d 3d 27 58 27 20 29 20 70 2b 2b 3b  ( *p=='X' ) p++;
3980: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 21  .        if( *p!
3990: 3d 27 5c 27 27 20 29 20 67 6f 74 6f 20 70 61 72  ='\'' ) goto par
39a0: 73 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  se_error;.      
39b0: 20 20 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 77    p++;.        w
39c0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
39d0: 20 20 20 20 20 69 66 28 20 2a 70 3d 3d 27 5c 30       if( *p=='\0
39e0: 27 20 29 20 67 6f 74 6f 20 70 61 72 73 65 5f 65  ' ) goto parse_e
39f0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rror;.          
3a00: 69 66 28 20 2a 70 3d 3d 27 5c 27 27 20 29 7b 0a  if( *p=='\'' ){.
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b              p++;
3a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
3a30: 20 2a 70 21 3d 27 5c 27 27 20 29 20 62 72 65 61   *p!='\'' ) brea
3a40: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
3a50: 20 20 20 20 20 20 20 20 20 70 2b 2b 3b 0a 20 20           p++;.  
3a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3a70: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
3a80: 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 20 20 20  numbers */.     
3a90: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61   else{.        a
3aa0: 7a 41 66 74 65 72 5b 69 5d 20 3d 20 70 3b 0a 20  zAfter[i] = p;. 
3ab0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 2a         while( (*
3ac0: 70 3e 3d 27 30 27 20 26 26 20 2a 70 3c 3d 27 39  p>='0' && *p<='9
3ad0: 27 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ') .            
3ae0: 7c 7c 20 2a 70 3d 3d 27 2e 27 20 7c 7c 20 2a 70  || *p=='.' || *p
3af0: 3d 3d 27 2b 27 20 7c 7c 20 2a 70 3d 3d 27 2d 27  =='+' || *p=='-'
3b00: 20 7c 7c 20 2a 70 3d 3d 27 65 27 20 7c 7c 20 2a   || *p=='e' || *
3b10: 70 3d 3d 27 45 27 0a 20 20 20 20 20 20 20 20 29  p=='E'.        )
3b20: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2b 2b 3b  {.          p++;
3b30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3b40: 20 7d 0a 0a 20 20 20 20 20 20 77 68 69 6c 65 28   }..      while(
3b50: 20 2a 70 3d 3d 27 20 27 20 29 20 70 2b 2b 3b 0a   *p==' ' ) p++;.
3b60: 20 20 20 20 20 20 69 66 28 20 2a 70 21 3d 28 69        if( *p!=(i
3b70: 3d 3d 28 6e 43 6f 6c 2d 31 29 20 3f 20 27 5c 30  ==(nCol-1) ? '\0
3b80: 27 20 3a 20 27 2c 27 29 20 29 7b 0a 20 20 20 20  ' : ',') ){.    
3b90: 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 65      goto parse_e
3ba0: 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rror;.      }.  
3bb0: 20 20 20 20 2a 70 2b 2b 20 3d 20 27 5c 30 27 3b      *p++ = '\0';
3bc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
3bd0: 61 7a 41 66 74 65 72 20 3d 20 61 7a 41 66 74 65  azAfter = azAfte
3be0: 72 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  r;.  return rc;.
3bf0: 0a 20 70 61 72 73 65 5f 65 72 72 6f 72 3a 0a 20  . parse_error:. 
3c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
3c10: 41 66 74 65 72 29 3b 0a 20 20 2a 70 61 7a 41 66  After);.  *pazAf
3c20: 74 65 72 20 3d 20 30 3b 0a 20 20 63 69 64 78 43  ter = 0;.  cidxC
3c30: 75 72 73 6f 72 45 72 72 6f 72 28 70 43 73 72 2c  ursorError(pCsr,
3c40: 20 22 25 73 22 2c 20 22 65 72 72 6f 72 20 70 61   "%s", "error pa
3c50: 72 73 69 6e 67 20 61 66 74 65 72 20 76 61 6c 75  rsing after valu
3c60: 65 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e");.  return SQ
3c70: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 73  LITE_ERROR;.}..s
3c80: 74 61 74 69 63 20 63 68 61 72 20 2a 63 69 64 78  tatic char *cidx
3c90: 57 68 65 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  Where(.  int *pR
3ca0: 63 2c 20 43 69 64 78 43 6f 6c 75 6d 6e 20 2a 61  c, CidxColumn *a
3cb0: 43 6f 6c 2c 20 63 68 61 72 20 2a 2a 61 7a 41 66  Col, char **azAf
3cc0: 74 65 72 2c 20 69 6e 74 20 69 47 74 2c 20 69 6e  ter, int iGt, in
3cd0: 74 20 62 4c 61 73 74 49 73 4e 75 6c 6c 0a 29 7b  t bLastIsNull.){
3ce0: 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20  .  char *zRet = 
3cf0: 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
3d00: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 69 6e  *zSep = "";.  in
3d10: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t i;..  for(i=0;
3d20: 20 69 3c 69 47 74 3b 20 69 2b 2b 29 7b 0a 20 20   i<iGt; i++){.  
3d30: 20 20 7a 52 65 74 20 3d 20 63 69 64 78 4d 70 72    zRet = cidxMpr
3d40: 69 6e 74 66 28 70 52 63 2c 20 22 25 7a 25 73 28  intf(pRc, "%z%s(
3d50: 25 73 29 20 49 53 20 25 73 22 2c 20 7a 52 65 74  %s) IS %s", zRet
3d60: 2c 20 0a 20 20 20 20 20 20 20 20 7a 53 65 70 2c  , .        zSep,
3d70: 20 61 43 6f 6c 5b 69 5d 2e 7a 45 78 70 72 2c 20   aCol[i].zExpr, 
3d80: 28 61 7a 41 66 74 65 72 5b 69 5d 20 3f 20 61 7a  (azAfter[i] ? az
3d90: 41 66 74 65 72 5b 69 5d 20 3a 20 22 4e 55 4c 4c  After[i] : "NULL
3da0: 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 53  ").    );.    zS
3db0: 65 70 20 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20  ep = " AND ";.  
3dc0: 7d 0a 0a 20 20 69 66 28 20 62 4c 61 73 74 49 73  }..  if( bLastIs
3dd0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 7a 52 65 74  Null ){.    zRet
3de0: 20 3d 20 63 69 64 78 4d 70 72 69 6e 74 66 28 70   = cidxMprintf(p
3df0: 52 63 2c 20 22 25 7a 25 73 28 25 73 29 20 49 53  Rc, "%z%s(%s) IS
3e00: 20 4e 55 4c 4c 22 2c 20 7a 52 65 74 2c 20 7a 53   NULL", zRet, zS
3e10: 65 70 2c 20 61 43 6f 6c 5b 69 47 74 5d 2e 7a 45  ep, aCol[iGt].zE
3e20: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  xpr);.  }.  else
3e30: 20 69 66 28 20 61 7a 41 66 74 65 72 5b 69 47 74   if( azAfter[iGt
3e40: 5d 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20  ] ){.    zRet = 
3e50: 63 69 64 78 4d 70 72 69 6e 74 66 28 70 52 63 2c  cidxMprintf(pRc,
3e60: 20 22 25 7a 25 73 28 25 73 29 20 25 73 20 25 73   "%z%s(%s) %s %s
3e70: 22 2c 20 7a 52 65 74 2c 20 0a 20 20 20 20 20 20  ", zRet, .      
3e80: 20 20 7a 53 65 70 2c 20 61 43 6f 6c 5b 69 47 74    zSep, aCol[iGt
3e90: 5d 2e 7a 45 78 70 72 2c 20 28 61 43 6f 6c 5b 69  ].zExpr, (aCol[i
3ea0: 47 74 5d 2e 62 44 65 73 63 20 3f 20 22 3c 22 20  Gt].bDesc ? "<" 
3eb0: 3a 20 22 3e 22 29 2c 20 0a 20 20 20 20 20 20 20  : ">"), .       
3ec0: 20 61 7a 41 66 74 65 72 5b 69 47 74 5d 0a 20 20   azAfter[iGt].  
3ed0: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
3ee0: 20 20 7a 52 65 74 20 3d 20 63 69 64 78 4d 70 72    zRet = cidxMpr
3ef0: 69 6e 74 66 28 70 52 63 2c 20 22 25 7a 25 73 28  intf(pRc, "%z%s(
3f00: 25 73 29 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  %s) IS NOT NULL"
3f10: 2c 20 7a 52 65 74 2c 20 7a 53 65 70 2c 61 43 6f  , zRet, zSep,aCo
3f20: 6c 5b 69 47 74 5d 2e 7a 45 78 70 72 29 3b 0a 20  l[iGt].zExpr);. 
3f30: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65   }..  return zRe
3f40: 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 43 49  t;.}..#define CI
3f50: 44 58 5f 43 4c 49 53 54 5f 41 4c 4c 20 20 20 20  DX_CLIST_ALL    
3f60: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 43       0.#define C
3f70: 49 44 58 5f 43 4c 49 53 54 5f 4f 52 44 45 52 42  IDX_CLIST_ORDERB
3f80: 59 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20  Y     1.#define 
3f90: 43 49 44 58 5f 43 4c 49 53 54 5f 43 55 52 52 45  CIDX_CLIST_CURRE
3fa0: 4e 54 5f 4b 45 59 20 32 0a 23 64 65 66 69 6e 65  NT_KEY 2.#define
3fb0: 20 43 49 44 58 5f 43 4c 49 53 54 5f 53 55 42 57   CIDX_CLIST_SUBW
3fc0: 48 45 52 45 20 20 20 20 33 0a 23 64 65 66 69 6e  HERE    3.#defin
3fd0: 65 20 43 49 44 58 5f 43 4c 49 53 54 5f 53 55 42  e CIDX_CLIST_SUB
3fe0: 45 58 50 52 20 20 20 20 20 34 0a 0a 2f 2a 0a 2a  EXPR     4../*.*
3ff0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4000: 72 65 74 75 72 6e 73 20 76 61 72 69 6f 75 73 20  returns various 
4010: 73 74 72 69 6e 67 73 20 62 61 73 65 64 20 6f 6e  strings based on
4020: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4030: 20 74 68 65 0a 2a 2a 20 43 69 64 78 49 6e 64 65   the.** CidxInde
4040: 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  x structure and 
4050: 74 68 65 20 65 54 79 70 65 20 70 61 72 61 6d 65  the eType parame
4060: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ter..*/.static c
4070: 68 61 72 20 2a 63 69 64 78 43 6f 6c 75 6d 6e 4c  har *cidxColumnL
4080: 69 73 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ist(.  int *pRc,
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
40b0: 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
40c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
40d0: 64 78 2c 0a 20 20 43 69 64 78 49 6e 64 65 78 20  dx,.  CidxIndex 
40e0: 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
40f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64        /* Indexed
4100: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
4110: 74 20 65 54 79 70 65 20 20 20 20 20 20 20 20 20  t eType         
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4130: 20 54 72 75 65 20 74 6f 20 69 6e 63 6c 75 64 65   True to include
4140: 20 41 53 43 2f 44 45 53 43 20 2a 2f 0a 29 7b 0a   ASC/DESC */.){.
4150: 20 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30    char *zRet = 0
4160: 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
4170: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
4180: 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 69 72 5b  onst char *aDir[
4190: 32 5d 20 3d 20 7b 22 22 2c 20 22 20 44 45 53 43  2] = {"", " DESC
41a0: 22 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  "};.    int i;. 
41b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
41c0: 53 65 70 20 3d 20 22 22 3b 0a 0a 20 20 20 20 66  Sep = "";..    f
41d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
41e0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
41f0: 20 20 43 69 64 78 43 6f 6c 75 6d 6e 20 2a 70 20    CidxColumn *p 
4200: 3d 20 26 70 49 64 78 2d 3e 61 43 6f 6c 5b 69 5d  = &pIdx->aCol[i]
4210: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4220: 70 49 64 78 2d 3e 61 43 6f 6c 5b 69 5d 2e 62 44  pIdx->aCol[i].bD
4230: 65 73 63 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e  esc==0 || pIdx->
4240: 61 43 6f 6c 5b 69 5d 2e 62 44 65 73 63 3d 3d 31  aCol[i].bDesc==1
4250: 20 29 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68   );.      switch
4260: 28 20 65 54 79 70 65 20 29 7b 0a 0a 20 20 20 20  ( eType ){..    
4270: 20 20 20 20 63 61 73 65 20 43 49 44 58 5f 43 4c      case CIDX_CL
4280: 49 53 54 5f 4f 52 44 45 52 42 59 3a 0a 20 20 20  IST_ORDERBY:.   
4290: 20 20 20 20 20 20 20 7a 52 65 74 20 3d 20 63 69         zRet = ci
42a0: 64 78 4d 70 72 69 6e 74 66 28 70 52 63 2c 20 22  dxMprintf(pRc, "
42b0: 25 7a 25 73 25 64 25 73 22 2c 20 7a 52 65 74 2c  %z%s%d%s", zRet,
42c0: 20 7a 53 65 70 2c 20 69 2b 31 2c 20 61 44 69 72   zSep, i+1, aDir
42d0: 5b 70 2d 3e 62 44 65 73 63 5d 29 3b 0a 20 20 20  [p->bDesc]);.   
42e0: 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 2c         zSep = ",
42f0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ";.          bre
4300: 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 63 61 73  ak;..        cas
4310: 65 20 43 49 44 58 5f 43 4c 49 53 54 5f 43 55 52  e CIDX_CLIST_CUR
4320: 52 45 4e 54 5f 4b 45 59 3a 0a 20 20 20 20 20 20  RENT_KEY:.      
4330: 20 20 20 20 7a 52 65 74 20 3d 20 63 69 64 78 4d      zRet = cidxM
4340: 70 72 69 6e 74 66 28 70 52 63 2c 20 22 25 7a 25  printf(pRc, "%z%
4350: 73 71 75 6f 74 65 28 69 25 64 29 22 2c 20 7a 52  squote(i%d)", zR
4360: 65 74 2c 20 7a 53 65 70 2c 20 69 29 3b 0a 20 20  et, zSep, i);.  
4370: 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
4380: 7c 7c 27 2c 27 7c 7c 22 3b 0a 20 20 20 20 20 20  ||','||";.      
4390: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
43a0: 20 20 20 20 63 61 73 65 20 43 49 44 58 5f 43 4c      case CIDX_CL
43b0: 49 53 54 5f 53 55 42 57 48 45 52 45 3a 0a 20 20  IST_SUBWHERE:.  
43c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62          if( p->b
43d0: 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
43e0: 20 20 20 20 20 20 7a 52 65 74 20 3d 20 63 69 64        zRet = cid
43f0: 78 4d 70 72 69 6e 74 66 28 70 52 63 2c 20 22 25  xMprintf(pRc, "%
4400: 7a 25 73 25 73 20 49 53 20 69 2e 69 25 64 22 2c  z%s%s IS i.i%d",
4410: 20 7a 52 65 74 2c 20 0a 20 20 20 20 20 20 20 20   zRet, .        
4420: 20 20 20 20 20 20 20 20 7a 53 65 70 2c 20 70 2d          zSep, p-
4430: 3e 7a 45 78 70 72 2c 20 69 0a 20 20 20 20 20 20  >zExpr, i.      
4440: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
4450: 20 20 20 20 20 7a 53 65 70 20 3d 20 22 20 41 4e       zSep = " AN
4460: 44 20 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  D ";.          }
4470: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4480: 3b 0a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ;..        case 
4490: 43 49 44 58 5f 43 4c 49 53 54 5f 53 55 42 45 58  CIDX_CLIST_SUBEX
44a0: 50 52 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  PR:.          if
44b0: 28 20 70 2d 3e 62 4b 65 79 3d 3d 31 20 29 7b 0a  ( p->bKey==1 ){.
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 74              zRet
44d0: 20 3d 20 63 69 64 78 4d 70 72 69 6e 74 66 28 70   = cidxMprintf(p
44e0: 52 63 2c 20 22 25 7a 25 73 25 73 20 49 53 20 69  Rc, "%z%s%s IS i
44f0: 2e 69 25 64 22 2c 20 7a 52 65 74 2c 20 0a 20 20  .i%d", zRet, .  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
4510: 65 70 2c 20 70 2d 3e 7a 45 78 70 72 2c 20 69 0a  ep, p->zExpr, i.
4520: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
4530: 20 20 20 20 20 20 20 20 20 20 20 7a 53 65 70 20             zSep 
4540: 3d 20 22 20 41 4e 44 20 22 3b 0a 20 20 20 20 20  = " AND ";.     
4550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4560: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
4570: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
4580: 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
4590: 65 3d 3d 43 49 44 58 5f 43 4c 49 53 54 5f 41 4c  e==CIDX_CLIST_AL
45a0: 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  L );.          z
45b0: 52 65 74 20 3d 20 63 69 64 78 4d 70 72 69 6e 74  Ret = cidxMprint
45c0: 66 28 70 52 63 2c 20 22 25 7a 25 73 28 25 73 29  f(pRc, "%z%s(%s)
45d0: 20 41 53 20 69 25 64 22 2c 20 7a 52 65 74 2c 20   AS i%d", zRet, 
45e0: 7a 53 65 70 2c 20 70 2d 3e 7a 45 78 70 72 2c 20  zSep, p->zExpr, 
45f0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 53  i);.          zS
4600: 65 70 20 3d 20 22 2c 20 22 3b 0a 20 20 20 20 20  ep = ", ";.     
4610: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4620: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4630: 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
4640: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
4650: 53 51 4c 20 28 69 6e 20 6d 65 6d 6f 72 79 20 6f  SQL (in memory o
4660: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4670: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 29 20 74  ite3_malloc()) t
4680: 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 63 6f 6e 74  hat will.** cont
4690: 69 6e 75 65 20 74 68 65 20 69 6e 64 65 78 20 73  inue the index s
46a0: 63 61 6e 20 66 6f 72 20 7a 49 64 78 4e 61 6d 65  can for zIdxName
46b0: 20 73 74 61 72 74 69 6e 67 20 61 66 74 65 72 20   starting after 
46c0: 7a 41 66 74 65 72 4b 65 79 2e 0a 2a 2f 0a 69 6e  zAfterKey..*/.in
46d0: 74 20 63 69 64 78 47 65 6e 65 72 61 74 65 53 63  t cidxGenerateSc
46e0: 61 6e 53 71 6c 28 0a 20 20 43 69 64 78 43 75 72  anSql(.  CidxCur
46f0: 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
4700: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
4710: 6f 72 20 77 68 69 63 68 20 6e 65 65 64 73 20 74  or which needs t
4720: 68 65 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74  he new statement
4730: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4740: 20 2a 7a 49 64 78 4e 61 6d 65 2c 20 20 20 20 20   *zIdxName,     
4750: 20 20 2f 2a 20 69 6e 64 65 78 20 74 6f 20 62 65    /* index to be
4760: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 63 6f   scanned */.  co
4770: 6e 73 74 20 63 68 61 72 20 2a 7a 41 66 74 65 72  nst char *zAfter
4780: 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 73 74 61  Key,      /* sta
4790: 72 74 20 61 66 74 65 72 20 74 68 69 73 20 6b 65  rt after this ke
47a0: 79 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a  y, if not NULL *
47b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 53 71 6c  /.  char **pzSql
47c0: 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
47d0: 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 74 68  /* OUT: Write th
47e0: 65 20 67 65 6e 65 72 61 74 65 64 20 53 51 4c 20  e generated SQL 
47f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
4800: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 54 61   rc;.  char *zTa
4810: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  b = 0;.  char *z
4820: 43 75 72 72 65 6e 74 4b 65 79 20 3d 20 30 3b 0a  CurrentKey = 0;.
4830: 20 20 63 68 61 72 20 2a 7a 4f 72 64 65 72 42 79    char *zOrderBy
4840: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
4850: 75 62 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 63  ubWhere = 0;.  c
4860: 68 61 72 20 2a 7a 53 75 62 45 78 70 72 20 3d 20  har *zSubExpr = 
4870: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 4c  0;.  char *zSrcL
4880: 69 73 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ist = 0;.  char 
4890: 2a 2a 61 7a 41 66 74 65 72 20 3d 20 30 3b 0a 20  **azAfter = 0;. 
48a0: 20 43 69 64 78 49 6e 64 65 78 20 2a 70 49 64 78   CidxIndex *pIdx
48b0: 20 3d 20 30 3b 0a 0a 20 20 2a 70 7a 53 71 6c 4f   = 0;..  *pzSqlO
48c0: 75 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 63  ut = 0;.  rc = c
48d0: 69 64 78 4c 6f 6f 6b 75 70 49 6e 64 65 78 28 70  idxLookupIndex(p
48e0: 43 73 72 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 26  Csr, zIdxName, &
48f0: 70 49 64 78 2c 20 26 7a 54 61 62 29 3b 0a 0a 20  pIdx, &zTab);.. 
4900: 20 7a 4f 72 64 65 72 42 79 20 3d 20 63 69 64 78   zOrderBy = cidx
4910: 43 6f 6c 75 6d 6e 4c 69 73 74 28 26 72 63 2c 20  ColumnList(&rc, 
4920: 7a 49 64 78 4e 61 6d 65 2c 20 70 49 64 78 2c 20  zIdxName, pIdx, 
4930: 43 49 44 58 5f 43 4c 49 53 54 5f 4f 52 44 45 52  CIDX_CLIST_ORDER
4940: 42 59 29 3b 0a 20 20 7a 43 75 72 72 65 6e 74 4b  BY);.  zCurrentK
4950: 65 79 20 3d 20 63 69 64 78 43 6f 6c 75 6d 6e 4c  ey = cidxColumnL
4960: 69 73 74 28 26 72 63 2c 20 7a 49 64 78 4e 61 6d  ist(&rc, zIdxNam
4970: 65 2c 20 70 49 64 78 2c 20 43 49 44 58 5f 43 4c  e, pIdx, CIDX_CL
4980: 49 53 54 5f 43 55 52 52 45 4e 54 5f 4b 45 59 29  IST_CURRENT_KEY)
4990: 3b 0a 20 20 7a 53 75 62 57 68 65 72 65 20 3d 20  ;.  zSubWhere = 
49a0: 63 69 64 78 43 6f 6c 75 6d 6e 4c 69 73 74 28 26  cidxColumnList(&
49b0: 72 63 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 70 49  rc, zIdxName, pI
49c0: 64 78 2c 20 43 49 44 58 5f 43 4c 49 53 54 5f 53  dx, CIDX_CLIST_S
49d0: 55 42 57 48 45 52 45 29 3b 0a 20 20 7a 53 75 62  UBWHERE);.  zSub
49e0: 45 78 70 72 20 3d 20 63 69 64 78 43 6f 6c 75 6d  Expr = cidxColum
49f0: 6e 4c 69 73 74 28 26 72 63 2c 20 7a 49 64 78 4e  nList(&rc, zIdxN
4a00: 61 6d 65 2c 20 70 49 64 78 2c 20 43 49 44 58 5f  ame, pIdx, CIDX_
4a10: 43 4c 49 53 54 5f 53 55 42 45 58 50 52 29 3b 0a  CLIST_SUBEXPR);.
4a20: 20 20 7a 53 72 63 4c 69 73 74 20 3d 20 63 69 64    zSrcList = cid
4a30: 78 43 6f 6c 75 6d 6e 4c 69 73 74 28 26 72 63 2c  xColumnList(&rc,
4a40: 20 7a 49 64 78 4e 61 6d 65 2c 20 70 49 64 78 2c   zIdxName, pIdx,
4a50: 20 43 49 44 58 5f 43 4c 49 53 54 5f 41 4c 4c 29   CIDX_CLIST_ALL)
4a60: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 7a 41 66 74 65 72  ITE_OK && zAfter
4a80: 4b 65 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Key ){.    rc = 
4a90: 63 69 64 78 44 65 63 6f 64 65 41 66 74 65 72 28  cidxDecodeAfter(
4aa0: 70 43 73 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  pCsr, pIdx->nCol
4ab0: 2c 20 7a 41 66 74 65 72 4b 65 79 2c 20 26 61 7a  , zAfterKey, &az
4ac0: 41 66 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  After);.  }..  i
4ad0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4ae0: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 41 66 74   ){.    if( zAft
4af0: 65 72 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  erKey==0 ){.    
4b00: 20 20 2a 70 7a 53 71 6c 4f 75 74 20 3d 20 63 69    *pzSqlOut = ci
4b10: 64 78 4d 70 72 69 6e 74 66 28 26 72 63 2c 0a 20  dxMprintf(&rc,. 
4b20: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
4b30: 20 28 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d   (SELECT %s FROM
4b40: 20 25 51 20 41 53 20 74 20 57 48 45 52 45 20 25   %Q AS t WHERE %
4b50: 73 29 2c 20 25 73 20 22 0a 20 20 20 20 20 20 20  s), %s ".       
4b60: 20 20 20 22 46 52 4f 4d 20 28 53 45 4c 45 43 54     "FROM (SELECT
4b70: 20 25 73 20 46 52 4f 4d 20 25 51 20 49 4e 44 45   %s FROM %Q INDE
4b80: 58 45 44 20 42 59 20 25 51 20 25 73 25 73 4f 52  XED BY %Q %s%sOR
4b90: 44 45 52 20 42 59 20 25 73 29 20 41 53 20 69 22  DER BY %s) AS i"
4ba0: 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 53 75 62  ,.          zSub
4bb0: 45 78 70 72 2c 20 7a 54 61 62 2c 20 7a 53 75 62  Expr, zTab, zSub
4bc0: 57 68 65 72 65 2c 20 7a 43 75 72 72 65 6e 74 4b  Where, zCurrentK
4bd0: 65 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20 7a  ey, .          z
4be0: 53 72 63 4c 69 73 74 2c 20 7a 54 61 62 2c 20 7a  SrcList, zTab, z
4bf0: 49 64 78 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  IdxName, .      
4c00: 20 20 20 20 28 70 49 64 78 2d 3e 7a 57 68 65 72      (pIdx->zWher
4c10: 65 20 3f 20 22 57 48 45 52 45 20 22 20 3a 20 22  e ? "WHERE " : "
4c20: 22 29 2c 20 28 70 49 64 78 2d 3e 7a 57 68 65 72  "), (pIdx->zWher
4c30: 65 20 3f 20 70 49 64 78 2d 3e 7a 57 68 65 72 65  e ? pIdx->zWhere
4c40: 20 3a 20 22 22 29 2c 0a 20 20 20 20 20 20 20 20   : ""),.        
4c50: 20 20 7a 4f 72 64 65 72 42 79 0a 20 20 20 20 20    zOrderBy.     
4c60: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
4c70: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4c80: 2a 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20  *zSep = "";.    
4c90: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
4ca0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 0a 20 20      int i;.  .  
4cb0: 20 20 20 20 7a 53 71 6c 20 3d 20 63 69 64 78 4d      zSql = cidxM
4cc0: 70 72 69 6e 74 66 28 26 72 63 2c 20 0a 20 20 20  printf(&rc, .   
4cd0: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 28         "SELECT (
4ce0: 53 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25  SELECT %s FROM %
4cf0: 51 20 57 48 45 52 45 20 25 73 29 2c 20 25 73 20  Q WHERE %s), %s 
4d00: 46 52 4f 4d 20 28 22 2c 0a 20 20 20 20 20 20 20  FROM (",.       
4d10: 20 20 20 7a 53 75 62 45 78 70 72 2c 20 7a 54 61     zSubExpr, zTa
4d20: 62 2c 20 7a 53 75 62 57 68 65 72 65 2c 20 7a 43  b, zSubWhere, zC
4d30: 75 72 72 65 6e 74 4b 65 79 0a 20 20 20 20 20 20  urrentKey.      
4d40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  );.      for(i=p
4d50: 49 64 78 2d 3e 6e 43 6f 6c 2d 31 3b 20 69 3e 3d  Idx->nCol-1; i>=
4d60: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  0; i--){.       
4d70: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
4d80: 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c 5b 69  if( pIdx->aCol[i
4d90: 5d 2e 62 44 65 73 63 20 26 26 20 61 7a 41 66 74  ].bDesc && azAft
4da0: 65 72 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  er[i]==0 ) conti
4db0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
4dc0: 28 6a 3d 30 3b 20 6a 3c 32 3b 20 6a 2b 2b 29 7b  (j=0; j<2; j++){
4dd0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
4de0: 2a 7a 57 68 65 72 65 20 3d 20 63 69 64 78 57 68  *zWhere = cidxWh
4df0: 65 72 65 28 26 72 63 2c 20 70 49 64 78 2d 3e 61  ere(&rc, pIdx->a
4e00: 43 6f 6c 2c 20 61 7a 41 66 74 65 72 2c 20 69 2c  Col, azAfter, i,
4e10: 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a   j);.          z
4e20: 53 71 6c 20 3d 20 63 69 64 78 4d 70 72 69 6e 74  Sql = cidxMprint
4e30: 66 28 26 72 63 2c 20 22 25 7a 22 0a 20 20 20 20  f(&rc, "%z".    
4e40: 20 20 20 20 20 20 20 20 20 20 22 25 73 53 45 4c            "%sSEL
4e50: 45 43 54 20 2a 20 46 52 4f 4d 20 28 22 0a 20 20  ECT * FROM (".  
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
4e70: 45 4c 45 43 54 20 25 73 20 46 52 4f 4d 20 25 51  ELECT %s FROM %Q
4e80: 20 49 4e 44 45 58 45 44 20 42 59 20 25 51 20 57   INDEXED BY %Q W
4e90: 48 45 52 45 20 25 73 25 73 25 7a 20 4f 52 44 45  HERE %s%s%z ORDE
4ea0: 52 20 42 59 20 25 73 22 0a 20 20 20 20 20 20 20  R BY %s".       
4eb0: 20 20 20 20 20 20 20 22 29 22 2c 0a 20 20 20 20         ")",.    
4ec0: 20 20 20 20 20 20 20 20 20 20 7a 53 71 6c 2c 20            zSql, 
4ed0: 7a 53 65 70 2c 20 7a 53 72 63 4c 69 73 74 2c 20  zSep, zSrcList, 
4ee0: 7a 54 61 62 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  zTab, zIdxName, 
4ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
4f00: 49 64 78 2d 3e 7a 57 68 65 72 65 20 3f 20 70 49  Idx->zWhere ? pI
4f10: 64 78 2d 3e 7a 57 68 65 72 65 20 3a 20 22 22 2c  dx->zWhere : "",
4f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
4f30: 49 64 78 2d 3e 7a 57 68 65 72 65 20 3f 20 22 20  Idx->zWhere ? " 
4f40: 41 4e 44 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  AND " : "",.    
4f50: 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65            zWhere
4f60: 2c 20 7a 4f 72 64 65 72 42 79 0a 20 20 20 20 20  , zOrderBy.     
4f70: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
4f80: 20 20 7a 53 65 70 20 3d 20 22 20 55 4e 49 4f 4e    zSep = " UNION
4f90: 20 41 4c 4c 20 22 3b 0a 20 20 20 20 20 20 20 20   ALL ";.        
4fa0: 20 20 69 66 28 20 70 49 64 78 2d 3e 61 43 6f 6c    if( pIdx->aCol
4fb0: 5b 69 5d 2e 62 44 65 73 63 3d 3d 30 20 29 20 62  [i].bDesc==0 ) b
4fc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
4fe0: 7a 53 71 6c 4f 75 74 20 3d 20 63 69 64 78 4d 70  zSqlOut = cidxMp
4ff0: 72 69 6e 74 66 28 26 72 63 2c 20 22 25 7a 29 20  rintf(&rc, "%z) 
5000: 41 53 20 69 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  AS i", zSql);.  
5010: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
5020: 65 33 5f 66 72 65 65 28 7a 54 61 62 29 3b 0a 20  e3_free(zTab);. 
5030: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
5040: 75 72 72 65 6e 74 4b 65 79 29 3b 0a 20 20 73 71  urrentKey);.  sq
5050: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 72 64 65  lite3_free(zOrde
5060: 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rBy);.  sqlite3_
5070: 66 72 65 65 28 7a 53 75 62 57 68 65 72 65 29 3b  free(zSubWhere);
5080: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5090: 7a 53 75 62 45 78 70 72 29 3b 0a 20 20 73 71 6c  zSubExpr);.  sql
50a0: 69 74 65 33 5f 66 72 65 65 28 7a 53 72 63 4c 69  ite3_free(zSrcLi
50b0: 73 74 29 3b 0a 20 20 63 69 64 78 46 72 65 65 49  st);.  cidxFreeI
50c0: 6e 64 65 78 28 70 49 64 78 29 3b 0a 20 20 73 71  ndex(pIdx);.  sq
50d0: 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 41 66 74  lite3_free(azAft
50e0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
50f0: 3b 0a 7d 0a 0a 0a 2f 2a 20 0a 2a 2a 20 50 6f 73  ;.}.../* .** Pos
5100: 69 74 69 6f 6e 20 61 20 63 75 72 73 6f 72 20 62  ition a cursor b
5110: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
5120: 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
5130: 69 6e 74 20 63 69 64 78 46 69 6c 74 65 72 28 0a  int cidxFilter(.
5140: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
5150: 75 72 73 6f 72 20 2a 70 43 75 72 73 6f 72 2c 20  ursor *pCursor, 
5160: 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63  .  int idxNum, c
5170: 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74  onst char *idxSt
5180: 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73  r,.  int argc, s
5190: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
51a0: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  rgv.){.  int rc 
51b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 43  = SQLITE_OK;.  C
51c0: 69 64 78 43 75 72 73 6f 72 20 2a 70 43 73 72 20  idxCursor *pCsr 
51d0: 3d 20 28 43 69 64 78 43 75 72 73 6f 72 2a 29 70  = (CidxCursor*)p
51e0: 43 75 72 73 6f 72 3b 0a 20 20 63 6f 6e 73 74 20  Cursor;.  const 
51f0: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 20 3d  char *zIdxName =
5200: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
5210: 20 2a 7a 41 66 74 65 72 4b 65 79 20 3d 20 30 3b   *zAfterKey = 0;
5220: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
5230: 28 70 43 73 72 2d 3e 7a 49 64 78 4e 61 6d 65 29  (pCsr->zIdxName)
5240: 3b 0a 20 20 70 43 73 72 2d 3e 7a 49 64 78 4e 61  ;.  pCsr->zIdxNa
5250: 6d 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  me = 0;.  sqlite
5260: 33 5f 66 72 65 65 28 70 43 73 72 2d 3e 7a 41 66  3_free(pCsr->zAf
5270: 74 65 72 4b 65 79 29 3b 0a 20 20 70 43 73 72 2d  terKey);.  pCsr-
5280: 3e 7a 41 66 74 65 72 4b 65 79 20 3d 20 30 3b 0a  >zAfterKey = 0;.
5290: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
52a0: 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b  ze(pCsr->pStmt);
52b0: 0a 20 20 70 43 73 72 2d 3e 70 53 74 6d 74 20 3d  .  pCsr->pStmt =
52c0: 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3e   0;..  if( argc>
52d0: 30 20 29 7b 0a 20 20 20 20 7a 49 64 78 4e 61 6d  0 ){.    zIdxNam
52e0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
52f0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5300: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
5310: 20 20 69 66 28 20 61 72 67 63 3e 31 20 29 7b 0a    if( argc>1 ){.
5320: 20 20 20 20 20 20 7a 41 66 74 65 72 4b 65 79 20        zAfterKey 
5330: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
5340: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
5350: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
5360: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 49 64  }.  }..  if( zId
5370: 78 4e 61 6d 65 20 29 7b 0a 20 20 20 20 63 68 61  xName ){.    cha
5380: 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a 20 20 20  r *zSql = 0;.   
5390: 20 70 43 73 72 2d 3e 7a 49 64 78 4e 61 6d 65 20   pCsr->zIdxName 
53a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
53b0: 66 28 22 25 73 22 2c 20 7a 49 64 78 4e 61 6d 65  f("%s", zIdxName
53c0: 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 7a 41 66  );.    pCsr->zAf
53d0: 74 65 72 4b 65 79 20 3d 20 7a 41 66 74 65 72 4b  terKey = zAfterK
53e0: 65 79 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72  ey ? sqlite3_mpr
53f0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 41 66 74 65  intf("%s", zAfte
5400: 72 4b 65 79 29 20 3a 20 30 3b 0a 20 20 20 20 72  rKey) : 0;.    r
5410: 63 20 3d 20 63 69 64 78 47 65 6e 65 72 61 74 65  c = cidxGenerate
5420: 53 63 61 6e 53 71 6c 28 70 43 73 72 2c 20 7a 49  ScanSql(pCsr, zI
5430: 64 78 4e 61 6d 65 2c 20 7a 41 66 74 65 72 4b 65  dxName, zAfterKe
5440: 79 2c 20 26 7a 53 71 6c 29 3b 0a 20 20 20 20 69  y, &zSql);.    i
5450: 66 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  f( zSql ){.     
5460: 20 70 43 73 72 2d 3e 70 53 74 6d 74 20 3d 20 63   pCsr->pStmt = c
5470: 69 64 78 50 72 65 70 61 72 65 28 26 72 63 2c 20  idxPrepare(&rc, 
5480: 70 43 73 72 2c 20 22 25 7a 22 2c 20 7a 53 71 6c  pCsr, "%z", zSql
5490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
54a0: 69 66 28 20 70 43 73 72 2d 3e 70 53 74 6d 74 20  if( pCsr->pStmt 
54b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
54c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
54d0: 20 20 20 20 72 63 20 3d 20 63 69 64 78 4e 65 78      rc = cidxNex
54e0: 74 28 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  t(pCursor);.  }.
54f0: 20 20 70 43 73 72 2d 3e 69 52 6f 77 69 64 20 3d    pCsr->iRowid =
5500: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   1;.  return rc;
5510: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 74 75 72  .}../* .** Retur
5520: 6e 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  n a column value
5530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5540: 63 69 64 78 43 6f 6c 75 6d 6e 28 0a 20 20 73 71  cidxColumn(.  sq
5550: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
5560: 72 20 2a 70 43 75 72 73 6f 72 2c 20 0a 20 20 73  r *pCursor, .  s
5570: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5580: 63 74 78 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c  ctx, .  int iCol
5590: 0a 29 7b 0a 20 20 43 69 64 78 43 75 72 73 6f 72  .){.  CidxCursor
55a0: 20 2a 70 43 73 72 20 3d 20 28 43 69 64 78 43 75   *pCsr = (CidxCu
55b0: 72 73 6f 72 2a 29 70 43 75 72 73 6f 72 3b 0a 20  rsor*)pCursor;. 
55c0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 49   assert( iCol>=I
55d0: 49 43 5f 45 52 52 4d 53 47 20 26 26 20 69 43 6f  IC_ERRMSG && iCo
55e0: 6c 3c 3d 49 49 43 5f 53 43 41 4e 4e 45 52 5f 53  l<=IIC_SCANNER_S
55f0: 51 4c 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  QL );.  switch( 
5600: 69 43 6f 6c 20 29 7b 0a 20 20 20 20 63 61 73 65  iCol ){.    case
5610: 20 49 49 43 5f 45 52 52 4d 53 47 3a 20 7b 0a 20   IIC_ERRMSG: {. 
5620: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5630: 2a 7a 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  *zVal = 0;.     
5640: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
5650: 75 6d 6e 5f 74 79 70 65 28 70 43 73 72 2d 3e 70  umn_type(pCsr->p
5660: 53 74 6d 74 2c 20 30 29 3d 3d 53 51 4c 49 54 45  Stmt, 0)==SQLITE
5670: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
5680: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
5690: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 43 73 72 2d  column_int(pCsr-
56a0: 3e 70 53 74 6d 74 2c 20 30 29 3d 3d 30 20 29 7b  >pStmt, 0)==0 ){
56b0: 0a 20 20 20 20 20 20 20 20 20 20 7a 56 61 6c 20  .          zVal 
56c0: 3d 20 22 72 6f 77 20 64 61 74 61 20 6d 69 73 6d  = "row data mism
56d0: 61 74 63 68 22 3b 0a 20 20 20 20 20 20 20 20 7d  atch";.        }
56e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
56f0: 20 20 20 20 20 20 7a 56 61 6c 20 3d 20 22 72 6f        zVal = "ro
5700: 77 20 6d 69 73 73 69 6e 67 22 3b 0a 20 20 20 20  w missing";.    
5710: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
5720: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
5730: 78 2c 20 7a 56 61 6c 2c 20 2d 31 2c 20 53 51 4c  x, zVal, -1, SQL
5740: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
5750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5760: 20 20 20 20 63 61 73 65 20 49 49 43 5f 43 55 52      case IIC_CUR
5770: 52 45 4e 54 5f 4b 45 59 3a 20 7b 0a 20 20 20 20  RENT_KEY: {.    
5780: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5790: 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69  _value(ctx, sqli
57a0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
57b0: 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 31 29  (pCsr->pStmt, 1)
57c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
57d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 49      }.    case I
57e0: 49 43 5f 49 4e 44 45 58 5f 4e 41 4d 45 3a 20 7b  IC_INDEX_NAME: {
57f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
5800: 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20  esult_text(ctx, 
5810: 70 43 73 72 2d 3e 7a 49 64 78 4e 61 6d 65 2c 20  pCsr->zIdxName, 
5820: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
5830: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
5840: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5850: 73 65 20 49 49 43 5f 41 46 54 45 52 5f 4b 45 59  se IIC_AFTER_KEY
5860: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
5870: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
5880: 78 2c 20 70 43 73 72 2d 3e 7a 41 66 74 65 72 4b  x, pCsr->zAfterK
5890: 65 79 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  ey, -1, SQLITE_T
58a0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
58b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
58c0: 20 20 63 61 73 65 20 49 49 43 5f 53 43 41 4e 4e    case IIC_SCANN
58d0: 45 52 5f 53 51 4c 3a 20 7b 0a 20 20 20 20 20 20  ER_SQL: {.      
58e0: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 0a  char *zSql = 0;.
58f0: 20 20 20 20 20 20 63 69 64 78 47 65 6e 65 72 61        cidxGenera
5900: 74 65 53 63 61 6e 53 71 6c 28 70 43 73 72 2c 20  teScanSql(pCsr, 
5910: 70 43 73 72 2d 3e 7a 49 64 78 4e 61 6d 65 2c 20  pCsr->zIdxName, 
5920: 70 43 73 72 2d 3e 7a 41 66 74 65 72 4b 65 79 2c  pCsr->zAfterKey,
5930: 20 26 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73   &zSql);.      s
5940: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5950: 78 74 28 63 74 78 2c 20 7a 53 71 6c 2c 20 2d 31  xt(ctx, zSql, -1
5960: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
5970: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5980: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
59a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
59b0: 49 44 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ID for the sqlit
59c0: 65 5f 62 74 72 65 65 69 6e 66 6f 20 74 61 62 6c  e_btreeinfo tabl
59d0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
59e0: 63 69 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  cidxRowid(sqlite
59f0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
5a00: 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69  Cursor, sqlite_i
5a10: 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20  nt64 *pRowid){. 
5a20: 20 43 69 64 78 43 75 72 73 6f 72 20 2a 70 43 73   CidxCursor *pCs
5a30: 72 20 3d 20 28 43 69 64 78 43 75 72 73 6f 72 2a  r = (CidxCursor*
5a40: 29 70 43 75 72 73 6f 72 3b 0a 20 20 2a 70 52 6f  )pCursor;.  *pRo
5a50: 77 69 64 20 3d 20 70 43 73 72 2d 3e 69 52 6f 77  wid = pCsr->iRow
5a60: 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
5a70: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5a80: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 76 69   Register the vi
5a90: 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
5aa0: 6c 65 73 20 77 69 74 68 20 74 68 65 20 64 61 74  les with the dat
5ab0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 70 61 73  abase handle pas
5ac0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
5ad0: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
5ae0: 73 74 61 74 69 63 20 69 6e 74 20 63 69 49 6e 69  static int ciIni
5af0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
5b00: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
5b10: 5f 6d 6f 64 75 6c 65 20 63 69 64 78 5f 6d 6f 64  _module cidx_mod
5b20: 75 6c 65 20 3d 20 7b 0a 20 20 20 20 30 2c 20 20  ule = {.    0,  
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
5b50: 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 30 2c 20  rsion */.    0, 
5b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
5b80: 72 65 61 74 65 20 2a 2f 0a 20 20 20 20 63 69 64  reate */.    cid
5b90: 78 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  xConnect,       
5ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
5bb0: 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 63 69  onnect */.    ci
5bc0: 64 78 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20  dxBestIndex,    
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
5be0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 20  BestIndex */.   
5bf0: 20 63 69 64 78 44 69 73 63 6f 6e 6e 65 63 74 2c   cidxDisconnect,
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5c10: 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f  * xDisconnect */
5c20: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a     /* xDestroy *
5c50: 2f 0a 20 20 20 20 63 69 64 78 4f 70 65 6e 2c 20  /.    cidxOpen, 
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f      /* xOpen - o
5c80: 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  pen a cursor */.
5c90: 20 20 20 20 63 69 64 78 43 6c 6f 73 65 2c 20 20      cidxClose,  
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
5cc0: 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
5cd0: 20 20 20 20 63 69 64 78 46 69 6c 74 65 72 2c 20      cidxFilter, 
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
5d00: 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
5d10: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
5d20: 20 63 69 64 78 4e 65 78 74 2c 20 20 20 20 20 20   cidxNext,      
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5d40: 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63  * xNext - advanc
5d50: 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
5d60: 20 20 63 69 64 78 45 6f 66 2c 20 20 20 20 20 20    cidxEof,      
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20  /* xEof - check 
5d90: 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20  for end of scan 
5da0: 2a 2f 0a 20 20 20 20 63 69 64 78 43 6f 6c 75 6d  */.    cidxColum
5db0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
5dc0: 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
5dd0: 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
5de0: 20 20 20 63 69 64 78 52 6f 77 69 64 2c 20 20 20     cidxRowid,   
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61   /* xRowid - rea
5e10: 64 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 30 2c  d data */.    0,
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
5e40: 55 70 64 61 74 65 20 2a 2f 0a 20 20 20 20 30 2c  Update */.    0,
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
5e70: 42 65 67 69 6e 20 2a 2f 0a 20 20 20 20 30 2c 20  Begin */.    0, 
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
5ea0: 79 6e 63 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ync */.    0,   
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d           /* xCom
5ed0: 6d 69 74 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  mit */.    0,   
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
5f00: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 30 2c 20  lback */.    0, 
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
5f30: 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 20  indMethod */.   
5f40: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f60: 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  * xRename */.   
5f70: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f90: 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  * xSavepoint */.
5fa0: 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
5fd0: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54     /* xRollbackT
6000: 6f 20 2a 2f 0a 20 20 7d 3b 0a 20 20 72 65 74 75  o */.  };.  retu
6010: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
6020: 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 69 6e  e_module(db, "in
6030: 63 72 65 6d 65 6e 74 61 6c 5f 69 6e 64 65 78 5f  cremental_index_
6040: 63 68 65 63 6b 22 2c 20 26 63 69 64 78 5f 6d 6f  check", &cidx_mo
6050: 64 75 6c 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  dule, 0);.}../*.
6060: 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 20 6c 6f 61  ** Extension loa
6070: 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23  d function..*/.#
6080: 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64  ifdef _WIN32.__d
6090: 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72  eclspec(dllexpor
60a0: 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71  t).#endif.int sq
60b0: 6c 69 74 65 33 5f 63 68 65 63 6b 69 6e 64 65 78  lite3_checkindex
60c0: 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  _init(.  sqlite3
60d0: 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a   *db, .  char **
60e0: 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e  pzErrMsg, .  con
60f0: 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
6100: 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b  outines *pApi.){
6110: 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
6120: 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b  ION_INIT2(pApi);
6130: 0a 20 20 72 65 74 75 72 6e 20 63 69 49 6e 69 74  .  return ciInit
6140: 28 64 62 29 3b 0a 7d 0a                          (db);.}.