/ Hex Artifact Content
Login

Artifact 1f5ab036ec189411aeea27e6e74ab0009d831764d5d8517455dcb6b6a734beb7:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 20 46 65 62 72 75  /*.** 2016 Febru
0010: 61 72 79 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 10.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou 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 2a 0a 2a 2f 0a 0a 74 79 70 65 64 65  *****.*/..typede
0180: 66 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  f sqlite3_int64 
0190: 69 36 34 3b 0a 74 79 70 65 64 65 66 20 73 71 6c  i64;.typedef sql
01a0: 69 74 65 33 5f 75 69 6e 74 36 34 20 75 36 34 3b  ite3_uint64 u64;
01b0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
01c0: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 49   IdxConstraint I
01d0: 64 78 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 74 79  dxConstraint;.ty
01e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64 78  pedef struct Idx
01f0: 43 6f 6e 74 65 78 74 20 49 64 78 43 6f 6e 74 65  Context IdxConte
0200: 78 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  xt;.typedef stru
0210: 63 74 20 49 64 78 53 63 61 6e 20 49 64 78 53 63  ct IdxScan IdxSc
0220: 61 6e 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  an;.typedef stru
0230: 63 74 20 49 64 78 57 68 65 72 65 20 49 64 78 57  ct IdxWhere IdxW
0240: 68 65 72 65 3b 0a 0a 74 79 70 65 64 65 66 20 73  here;..typedef s
0250: 74 72 75 63 74 20 49 64 78 43 6f 6c 75 6d 6e 20  truct IdxColumn 
0260: 49 64 78 43 6f 6c 75 6d 6e 3b 0a 74 79 70 65 64  IdxColumn;.typed
0270: 65 66 20 73 74 72 75 63 74 20 49 64 78 54 61 62  ef struct IdxTab
0280: 6c 65 20 49 64 78 54 61 62 6c 65 3b 0a 0a 2f 2a  le IdxTable;../*
0290: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e  .** A single con
02a0: 73 74 72 61 69 6e 74 2e 20 45 71 75 69 76 61 6c  straint. Equival
02b0: 65 6e 74 20 74 6f 20 65 69 74 68 65 72 20 22 63  ent to either "c
02c0: 6f 6c 20 3d 20 3f 22 20 6f 72 20 22 63 6f 6c 20  ol = ?" or "col 
02d0: 3c 20 3f 22 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 6e  < ?"..**.** pLin
02e0: 6b 3a 0a 2a 2a 20 20 20 55 73 65 64 20 74 6f 20  k:.**   Used to 
02f0: 74 65 6d 70 6f 72 61 72 69 6c 79 20 6c 69 6e 6b  temporarily link
0300: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 6f   IdxConstraint o
0310: 62 6a 65 63 74 73 20 69 6e 74 6f 20 6c 69 73 74  bjects into list
0320: 73 20 77 68 69 6c 65 0a 2a 2a 20 20 20 63 72 65  s while.**   cre
0330: 61 74 69 6e 67 20 63 61 6e 64 69 64 61 74 65 20  ating candidate 
0340: 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a 73 74 72 75  indexes..*/.stru
0350: 63 74 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74  ct IdxConstraint
0360: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c   {.  char *zColl
0370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0380: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
0390: 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20  n sequence */.  
03a0: 69 6e 74 20 62 52 61 6e 67 65 3b 20 20 20 20 20  int bRange;     
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03c0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 72 61 6e 67  /* True for rang
03d0: 65 2c 20 66 61 6c 73 65 20 66 6f 72 20 65 71 20  e, false for eq 
03e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
0410: 6e 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  ned table column
0420: 20 2a 2f 0a 20 20 69 36 34 20 64 65 70 6d 61 73   */.  i64 depmas
0430: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
0440: 20 20 20 20 20 20 2f 2a 20 44 65 70 65 6e 64 65        /* Depende
0450: 6e 63 79 20 6d 61 73 6b 20 2a 2f 0a 20 20 69 6e  ncy mask */.  in
0460: 74 20 62 46 6c 61 67 3b 20 20 20 20 20 20 20 20  t bFlag;        
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0480: 20 55 73 65 64 20 62 79 20 69 64 78 46 69 6e 64   Used by idxFind
0490: 43 6f 6d 70 61 74 69 62 6c 65 28 29 20 2a 2f 0a  Compatible() */.
04a0: 20 20 69 6e 74 20 62 44 65 73 63 3b 20 20 20 20    int bDesc;    
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4f 52 44    /* True if ORD
04d0: 45 52 20 42 59 20 3c 65 78 70 72 3e 20 44 45 53  ER BY <expr> DES
04e0: 43 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73 74 72  C */.  IdxConstr
04f0: 61 69 6e 74 20 2a 70 4e 65 78 74 3b 20 20 20 20  aint *pNext;    
0500: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63         /* Next c
0510: 6f 6e 73 74 72 61 69 6e 74 20 69 6e 20 70 45 71  onstraint in pEq
0520: 20 6f 72 20 70 52 61 6e 67 65 20 6c 69 73 74 20   or pRange list 
0530: 2a 2f 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69  */.  IdxConstrai
0540: 6e 74 20 2a 70 4c 69 6e 6b 3b 20 20 20 20 20 20  nt *pLink;      
0550: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
0560: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
0570: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 4d   WHERE clause. M
0580: 61 64 65 20 75 70 20 6f 66 20 49 64 78 43 6f 6e  ade up of IdxCon
0590: 73 74 72 61 69 6e 74 20 6f 62 6a 65 63 74 73 2e  straint objects.
05a0: 20 45 78 61 6d 70 6c 65 20 57 48 45 52 45 20 63   Example WHERE c
05b0: 6c 61 75 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  lause:.**.**   a
05c0: 3d 3f 20 41 4e 44 20 62 3d 3f 20 41 4e 44 20 63  =? AND b=? AND c
05d0: 3d 3f 20 41 4e 44 20 64 3d 3f 20 41 4e 44 20 65  =? AND d=? AND e
05e0: 3e 3f 20 41 4e 44 20 66 3c 3f 0a 2a 2a 0a 2a 2a  >? AND f<?.**.**
05f0: 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 64 65   The above is de
0600: 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 36 20  composed into 6 
0610: 41 4e 44 20 63 6f 6e 6e 65 63 74 65 64 20 63 6c  AND connected cl
0620: 61 75 73 65 73 2e 20 54 68 65 20 66 69 72 73 74  auses. The first
0630: 20 66 6f 75 72 20 61 72 65 0a 2a 2a 20 61 64 64   four are.** add
0640: 65 64 20 74 6f 20 74 68 65 20 49 64 78 57 68 65  ed to the IdxWhe
0650: 72 65 2e 70 45 71 20 6c 69 6e 6b 65 64 20 6c 69  re.pEq linked li
0660: 73 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  st, the followin
0670: 67 20 74 77 6f 20 69 6e 74 6f 20 0a 2a 2a 20 49  g two into .** I
0680: 64 78 57 68 65 72 65 2e 70 52 61 6e 67 65 2e 0a  dxWhere.pRange..
0690: 2a 2a 0a 2a 2a 20 49 64 78 57 68 65 72 65 2e 70  **.** IdxWhere.p
06a0: 45 71 20 61 6e 64 20 49 64 78 57 68 65 72 65 2e  Eq and IdxWhere.
06b0: 70 52 61 6e 67 65 20 61 72 65 20 73 69 6d 70 6c  pRange are simpl
06c0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 73 20 6f  e linked lists o
06d0: 66 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 0a  f IdxConstraint.
06e0: 2a 2a 20 6f 62 6a 65 63 74 73 20 6c 69 6e 6b 65  ** objects linke
06f0: 64 20 62 79 20 74 68 65 20 49 64 78 43 6f 6e 73  d by the IdxCons
0700: 74 72 61 69 6e 74 2e 70 4e 65 78 74 20 66 69 65  traint.pNext fie
0710: 6c 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64  ld..*/.struct Id
0720: 78 57 68 65 72 65 20 7b 0a 20 20 49 64 78 43 6f  xWhere {.  IdxCo
0730: 6e 73 74 72 61 69 6e 74 20 2a 70 45 71 3b 20 20  nstraint *pEq;  
0740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
0750: 73 74 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61  st of == constra
0760: 69 6e 74 73 20 2a 2f 0a 20 20 49 64 78 43 6f 6e  ints */.  IdxCon
0770: 73 74 72 61 69 6e 74 20 2a 70 52 61 6e 67 65 3b  straint *pRange;
0780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
0790: 74 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e  t of < constrain
07a0: 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.};../*.** 
07b0: 41 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6f 66  A single scan of
07c0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e   a single table.
07d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 53 63  .*/.struct IdxSc
07e0: 61 6e 20 7b 0a 20 20 49 64 78 54 61 62 6c 65 20  an {.  IdxTable 
07f0: 2a 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  *pTable;        
0800: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 2d         /* Table-
0810: 69 6e 66 6f 20 2a 2f 0a 20 20 63 68 61 72 20 2a  info */.  char *
0820: 7a 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  zTable;         
0830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0840: 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 73 63  e of table to sc
0850: 61 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  an */.  int iDb;
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
0880: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
0890: 61 62 6c 65 20 7a 54 61 62 6c 65 20 2a 2f 0a 20  able zTable */. 
08a0: 20 69 36 34 20 63 6f 76 65 72 69 6e 67 3b 20 20   i64 covering;  
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6c 75   /* Mask of colu
08d0: 6d 6e 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  mns required for
08e0: 20 63 6f 76 2e 20 69 6e 64 65 78 20 2a 2f 0a 20   cov. index */. 
08f0: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
0900: 70 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 20  pOrder;         
0910: 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c   /* ORDER BY col
0920: 75 6d 6e 73 20 2a 2f 0a 20 20 49 64 78 57 68 65  umns */.  IdxWhe
0930: 72 65 20 77 68 65 72 65 3b 20 20 20 20 20 20 20  re where;       
0940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45            /* WHE
0950: 52 45 20 43 6f 6e 73 74 72 61 69 6e 74 73 20 2a  RE Constraints *
0960: 2f 0a 20 20 49 64 78 53 63 61 6e 20 2a 70 4e 65  /.  IdxScan *pNe
0970: 78 74 53 63 61 6e 3b 20 20 20 20 20 20 20 20 20  xtScan;         
0980: 20 20 20 20 2f 2a 20 4e 65 78 74 20 49 64 78 53      /* Next IdxS
0990: 63 61 6e 20 6f 62 6a 65 63 74 20 66 6f 72 20 73  can object for s
09a0: 61 6d 65 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a  ame query */.};.
09b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f  ./*.** Context o
09c0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 74 6f 20  bject passed to 
09d0: 69 64 78 57 68 65 72 65 49 6e 66 6f 28 29 20 61  idxWhereInfo() a
09e0: 6e 64 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  nd other functio
09f0: 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64  ns..*/.struct Id
0a00: 78 43 6f 6e 74 65 78 74 20 7b 0a 20 20 63 68 61  xContext {.  cha
0a10: 72 20 2a 2a 70 7a 45 72 72 6d 73 67 3b 0a 20 20  r **pzErrmsg;.  
0a20: 49 64 78 57 68 65 72 65 20 2a 70 43 75 72 72 65  IdxWhere *pCurre
0a30: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
0a40: 2f 2a 20 43 75 72 72 65 6e 74 20 77 68 65 72 65  /* Current where
0a50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
0a60: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0a80: 45 72 72 6f 72 20 63 6f 64 65 20 28 69 66 20 65  Error code (if e
0a90: 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
0aa0: 64 29 20 2a 2f 0a 20 20 49 64 78 53 63 61 6e 20  d) */.  IdxScan 
0ab0: 2a 70 53 63 61 6e 3b 20 20 20 20 20 20 20 20 20  *pScan;         
0ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
0ad0: 6f 66 20 73 63 61 6e 20 6f 62 6a 65 63 74 73 20  of scan objects 
0ae0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
0af0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
0b00: 20 20 20 20 20 2f 2a 20 49 6e 2d 6d 65 6d 6f 72       /* In-memor
0b10: 79 20 64 62 20 66 6f 72 20 74 68 69 73 20 61 6e  y db for this an
0b20: 61 6c 79 73 69 73 20 2a 2f 0a 20 20 73 71 6c 69  alysis */.  sqli
0b30: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
0b50: 73 65 72 20 64 61 74 61 62 61 73 65 20 75 6e 64  ser database und
0b60: 65 72 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a 20  er analysis */. 
0b70: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0b80: 49 6e 73 65 72 74 4d 61 73 6b 3b 20 20 20 20 20  InsertMask;     
0b90: 20 2f 2a 20 54 6f 20 77 72 69 74 65 20 74 6f 20   /* To write to 
0ba0: 61 75 78 2e 64 65 70 6d 61 73 6b 20 2a 2f 0a 20  aux.depmask */. 
0bb0: 20 69 36 34 20 69 49 64 78 52 6f 77 69 64 3b 20   i64 iIdxRowid; 
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 66 69 72   /* Rowid of fir
0be0: 73 74 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  st index created
0bf0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 61   */.};../*.** Da
0c00: 74 61 20 72 65 67 61 72 64 69 6e 67 20 61 20 64  ta regarding a d
0c10: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 20 45  atabase table. E
0c20: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 22 50  xtracted from "P
0c30: 52 41 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f  RAGMA table_info
0c40: 22 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78 43  ".*/.struct IdxC
0c50: 6f 6c 75 6d 6e 20 7b 0a 20 20 63 68 61 72 20 2a  olumn {.  char *
0c60: 7a 4e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 7a  zName;.  char *z
0c70: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 50 6b 3b  Coll;.  int iPk;
0c80: 0a 7d 3b 0a 73 74 72 75 63 74 20 49 64 78 54 61  .};.struct IdxTa
0c90: 62 6c 65 20 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  ble {.  int nCol
0ca0: 3b 0a 20 20 49 64 78 43 6f 6c 75 6d 6e 20 2a 61  ;.  IdxColumn *a
0cb0: 43 6f 6c 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  Col;.};../*.** A
0cc0: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
0cd0: 72 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  rn nByte bytes o
0ce0: 66 20 7a 65 72 6f 65 64 20 6d 65 6d 6f 72 79 20  f zeroed memory 
0cf0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6d 61  using sqlite3_ma
0d00: 6c 6c 6f 63 28 29 2e 20 0a 2a 2a 20 49 66 20 74  lloc(). .** If t
0d10: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  he allocation fa
0d20: 69 6c 73 2c 20 73 65 74 20 2a 70 52 63 20 74 6f  ils, set *pRc to
0d30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
0d40: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  d return NULL..*
0d50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 69  /.static void *i
0d60: 64 78 4d 61 6c 6c 6f 63 28 69 6e 74 20 2a 70 52  dxMalloc(int *pR
0d70: 63 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  c, int nByte){. 
0d80: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 61   void *pRet;.  a
0d90: 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53 51 4c  ssert( *pRc==SQL
0da0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
0db0: 72 74 28 20 6e 42 79 74 65 3e 30 20 29 3b 0a 20  rt( nByte>0 );. 
0dc0: 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 5f   pRet = sqlite3_
0dd0: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
0de0: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
0df0: 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c   memset(pRet, 0,
0e00: 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
0e10: 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c  {.    *pRc = SQL
0e20: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
0e30: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
0e40: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
0e50: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
0e60: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 6f   IdxConstraint o
0e70: 62 6a 65 63 74 2e 20 53 65 74 20 74 68 65 20 49  bject. Set the I
0e80: 64 78 43 6f 6e 73 74 72 61 69 6e 74 2e 7a 43 6f  dxConstraint.zCo
0e90: 6c 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  ll.** variable t
0ea0: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 63 6f 70  o point to a cop
0eb0: 79 20 6f 66 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  y of nul-termina
0ec0: 74 65 64 20 73 74 72 69 6e 67 20 7a 43 6f 6c 6c  ted string zColl
0ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 49 64 78 43  ..*/.static IdxC
0ee0: 6f 6e 73 74 72 61 69 6e 74 20 2a 69 64 78 4e 65  onstraint *idxNe
0ef0: 77 43 6f 6e 73 74 72 61 69 6e 74 28 69 6e 74 20  wConstraint(int 
0f00: 2a 70 52 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pRc, const char
0f10: 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 64 78 43   *zColl){.  IdxC
0f20: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 4e 65 77 3b  onstraint *pNew;
0f30: 0a 20 20 69 6e 74 20 6e 43 6f 6c 6c 20 3d 20 73  .  int nColl = s
0f40: 74 72 6c 65 6e 28 7a 43 6f 6c 6c 29 3b 0a 0a 20  trlen(zColl);.. 
0f50: 20 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 53   assert( *pRc==S
0f60: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 4e  QLITE_OK );.  pN
0f70: 65 77 20 3d 20 28 49 64 78 43 6f 6e 73 74 72 61  ew = (IdxConstra
0f80: 69 6e 74 2a 29 69 64 78 4d 61 6c 6c 6f 63 28 70  int*)idxMalloc(p
0f90: 52 63 2c 20 73 69 7a 65 6f 66 28 49 64 78 43 6f  Rc, sizeof(IdxCo
0fa0: 6e 73 74 72 61 69 6e 74 29 20 2a 20 6e 43 6f 6c  nstraint) * nCol
0fb0: 6c 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  l + 1);.  if( pN
0fc0: 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew ){.    pNew->
0fd0: 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 29 26  zColl = (char*)&
0fe0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  pNew[1];.    mem
0ff0: 63 70 79 28 70 4e 65 77 2d 3e 7a 43 6f 6c 6c 2c  cpy(pNew->zColl,
1000: 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 2b 31 29   zColl, nColl+1)
1010: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1020: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  New;.}../*.** SQ
1030: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 48  LITE_DBCONFIG_WH
1040: 45 52 45 49 4e 46 4f 20 63 61 6c 6c 62 61 63 6b  EREINFO callback
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1060: 20 69 64 78 57 68 65 72 65 49 6e 66 6f 28 0a 20   idxWhereInfo(. 
1070: 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 49   /* Pointer to I
10a0: 64 78 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  dxContext struct
10b0: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  ure */.  int eOp
10c0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
10d0: 2a 7a 56 61 6c 2c 20 0a 20 20 69 6e 74 20 69 56  *zVal, .  int iV
10e0: 61 6c 2c 20 0a 20 20 75 36 34 20 6d 61 73 6b 0a  al, .  u64 mask.
10f0: 29 7b 0a 20 20 49 64 78 43 6f 6e 74 65 78 74 20  ){.  IdxContext 
1100: 2a 70 20 3d 20 28 49 64 78 43 6f 6e 74 65 78 74  *p = (IdxContext
1110: 2a 29 70 43 74 78 3b 0a 0a 23 69 66 20 30 0a 20  *)pCtx;..#if 0. 
1120: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
1130: 20 3d 20 0a 20 20 20 20 65 4f 70 3d 3d 53 51 4c   = .    eOp==SQL
1140: 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 54 41  ITE_WHEREINFO_TA
1150: 42 4c 45 20 3f 20 22 54 41 42 4c 45 22 20 3a 0a  BLE ? "TABLE" :.
1160: 20 20 20 20 65 4f 70 3d 3d 53 51 4c 49 54 45 5f      eOp==SQLITE_
1170: 57 48 45 52 45 49 4e 46 4f 5f 45 51 55 41 4c 53  WHEREINFO_EQUALS
1180: 20 3f 20 22 45 51 55 41 4c 53 22 20 3a 0a 20 20   ? "EQUALS" :.  
1190: 20 20 65 4f 70 3d 3d 53 51 4c 49 54 45 5f 57 48    eOp==SQLITE_WH
11a0: 45 52 45 49 4e 46 4f 5f 52 41 4e 47 45 20 3f 20  EREINFO_RANGE ? 
11b0: 22 52 41 4e 47 45 22 20 3a 0a 20 20 20 20 65 4f  "RANGE" :.    eO
11c0: 70 3d 3d 53 51 4c 49 54 45 5f 57 48 45 52 45 49  p==SQLITE_WHEREI
11d0: 4e 46 4f 5f 4f 52 44 45 52 42 59 20 3f 20 22 4f  NFO_ORDERBY ? "O
11e0: 52 44 45 52 42 59 22 20 3a 0a 20 20 20 20 22 21  RDERBY" :.    "!
11f0: 65 72 72 6f 72 21 22 3b 0a 20 20 70 72 69 6e 74  error!";.  print
1200: 66 28 22 6f 70 3d 25 73 20 7a 56 61 6c 3d 25 73  f("op=%s zVal=%s
1210: 20 69 56 61 6c 3d 25 64 20 6d 61 73 6b 3d 25 6c   iVal=%d mask=%l
1220: 6c 78 5c 6e 22 2c 20 7a 4f 70 2c 20 7a 56 61 6c  lx\n", zOp, zVal
1230: 2c 20 69 56 61 6c 2c 20 6d 61 73 6b 29 3b 0a 23  , iVal, mask);.#
1240: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 2d 3e  endif..  if( p->
1250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1260: 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
1270: 3d 3d 53 51 4c 49 54 45 5f 57 48 45 52 45 49 4e  ==SQLITE_WHEREIN
1280: 46 4f 5f 54 41 42 4c 45 20 7c 7c 20 70 2d 3e 70  FO_TABLE || p->p
1290: 53 63 61 6e 21 3d 30 20 29 3b 0a 20 20 20 20 73  Scan!=0 );.    s
12a0: 77 69 74 63 68 28 20 65 4f 70 20 29 7b 0a 20 20  witch( eOp ){.  
12b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12c0: 57 48 45 52 45 49 4e 46 4f 5f 54 41 42 4c 45 3a  WHEREINFO_TABLE:
12d0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
12e0: 56 61 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61  Val = strlen(zVa
12f0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 49 64 78 53  l);.        IdxS
1300: 63 61 6e 20 2a 70 4e 65 77 20 3d 20 28 49 64 78  can *pNew = (Idx
1310: 53 63 61 6e 2a 29 69 64 78 4d 61 6c 6c 6f 63 28  Scan*)idxMalloc(
1320: 26 70 2d 3e 72 63 2c 20 73 69 7a 65 6f 66 28 49  &p->rc, sizeof(I
1330: 64 78 53 63 61 6e 29 20 2b 20 6e 56 61 6c 20 2b  dxScan) + nVal +
1340: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
1350: 20 21 70 4e 65 77 20 29 20 72 65 74 75 72 6e 3b   !pNew ) return;
1360: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  .        pNew->z
1370: 54 61 62 6c 65 20 3d 20 28 63 68 61 72 2a 29 26  Table = (char*)&
1380: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pNew[1];.       
1390: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 54   memcpy(pNew->zT
13a0: 61 62 6c 65 2c 20 7a 56 61 6c 2c 20 6e 56 61 6c  able, zVal, nVal
13b0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  +1);.        pNe
13c0: 77 2d 3e 70 4e 65 78 74 53 63 61 6e 20 3d 20 70  w->pNextScan = p
13d0: 2d 3e 70 53 63 61 6e 3b 0a 20 20 20 20 20 20 20  ->pScan;.       
13e0: 20 70 4e 65 77 2d 3e 63 6f 76 65 72 69 6e 67 20   pNew->covering 
13f0: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
1400: 70 2d 3e 70 53 63 61 6e 20 3d 20 70 4e 65 77 3b  p->pScan = pNew;
1410: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 43 75 72  .        p->pCur
1420: 72 65 6e 74 20 3d 20 26 70 4e 65 77 2d 3e 77 68  rent = &pNew->wh
1430: 65 72 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ere;.        bre
1440: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
1450: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57     case SQLITE_W
1460: 48 45 52 45 49 4e 46 4f 5f 4f 52 44 45 52 42 59  HEREINFO_ORDERBY
1470: 3a 20 7b 0a 20 20 20 20 20 20 20 20 49 64 78 43  : {.        IdxC
1480: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 4e 65 77 20  onstraint *pNew 
1490: 3d 20 69 64 78 4e 65 77 43 6f 6e 73 74 72 61 69  = idxNewConstrai
14a0: 6e 74 28 26 70 2d 3e 72 63 2c 20 7a 56 61 6c 29  nt(&p->rc, zVal)
14b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
14c0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
14d0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43          pNew->iC
14e0: 6f 6c 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20  ol = iVal;.     
14f0: 20 20 20 70 4e 65 77 2d 3e 62 44 65 73 63 20 3d     pNew->bDesc =
1500: 20 28 69 6e 74 29 6d 61 73 6b 3b 0a 20 20 20 20   (int)mask;.    
1510: 20 20 20 20 69 66 28 20 70 2d 3e 70 53 63 61 6e      if( p->pScan
1520: 2d 3e 70 4f 72 64 65 72 3d 3d 30 20 29 7b 0a 20  ->pOrder==0 ){. 
1530: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 53 63 61           p->pSca
1540: 6e 2d 3e 70 4f 72 64 65 72 20 3d 20 70 4e 65 77  n->pOrder = pNew
1550: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1560: 0a 20 20 20 20 20 20 20 20 20 20 49 64 78 43 6f  .          IdxCo
1570: 6e 73 74 72 61 69 6e 74 20 2a 70 49 74 65 72 3b  nstraint *pIter;
1580: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70  .          for(p
1590: 49 74 65 72 3d 70 2d 3e 70 53 63 61 6e 2d 3e 70  Iter=p->pScan->p
15a0: 4f 72 64 65 72 3b 20 70 49 74 65 72 2d 3e 70 4e  Order; pIter->pN
15b0: 65 78 74 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ext; pIter=pIter
15c0: 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ->pNext);.      
15d0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74      pIter->pNext
15e0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
15f0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 69 6e 6b 20     pIter->pLink 
1600: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
1610: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1620: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1630: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 48 45 52  case SQLITE_WHER
1640: 45 49 4e 46 4f 5f 45 51 55 41 4c 53 3a 0a 20 20  EINFO_EQUALS:.  
1650: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1660: 57 48 45 52 45 49 4e 46 4f 5f 52 41 4e 47 45 3a  WHEREINFO_RANGE:
1670: 20 7b 0a 20 20 20 20 20 20 20 20 49 64 78 43 6f   {.        IdxCo
1680: 6e 73 74 72 61 69 6e 74 20 2a 70 4e 65 77 20 3d  nstraint *pNew =
1690: 20 69 64 78 4e 65 77 43 6f 6e 73 74 72 61 69 6e   idxNewConstrain
16a0: 74 28 26 70 2d 3e 72 63 2c 20 7a 56 61 6c 29 3b  t(&p->rc, zVal);
16b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
16c0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
16d0: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43 6f         pNew->iCo
16e0: 6c 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  l = iVal;.      
16f0: 20 20 70 4e 65 77 2d 3e 64 65 70 6d 61 73 6b 20    pNew->depmask 
1700: 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 20 20 20  = mask;..       
1710: 20 69 66 28 20 65 4f 70 3d 3d 53 51 4c 49 54 45   if( eOp==SQLITE
1720: 5f 57 48 45 52 45 49 4e 46 4f 5f 52 41 4e 47 45  _WHEREINFO_RANGE
1730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
1740: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ew->pNext = p->p
1750: 43 75 72 72 65 6e 74 2d 3e 70 52 61 6e 67 65 3b  Current->pRange;
1760: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 43  .          p->pC
1770: 75 72 72 65 6e 74 2d 3e 70 52 61 6e 67 65 20 3d  urrent->pRange =
1780: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   pNew;.        }
1790: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17a0: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  pNew->pNext = p-
17b0: 3e 70 43 75 72 72 65 6e 74 2d 3e 70 45 71 3b 0a  >pCurrent->pEq;.
17c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 43 75            p->pCu
17d0: 72 72 65 6e 74 2d 3e 70 45 71 20 3d 20 70 4e 65  rrent->pEq = pNe
17e0: 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  w;.        }..  
17f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1800: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49 6e 73  nd_int64(p->pIns
1810: 65 72 74 4d 61 73 6b 2c 20 31 2c 20 6d 61 73 6b  ertMask, 1, mask
1820: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1830: 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 6e 73 65  e3_step(p->pInse
1840: 72 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  rtMask);.       
1850: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1860: 5f 72 65 73 65 74 28 70 2d 3e 70 49 6e 73 65 72  _reset(p->pInser
1870: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20  tMask);.        
1880: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1890: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18a0: 2a 20 41 6e 20 65 72 72 6f 72 20 61 73 73 6f 63  * An error assoc
18b0: 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62  iated with datab
18c0: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 68 61  ase handle db ha
18d0: 73 20 6a 75 73 74 20 6f 63 63 75 72 72 65 64 2e  s just occurred.
18e0: 20 50 61 73 73 0a 2a 2a 20 74 68 65 20 65 72 72   Pass.** the err
18f0: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 63 61  or message to ca
1900: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
1910: 78 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  xOut..*/.static 
1920: 76 6f 69 64 20 69 64 78 44 61 74 61 62 61 73 65  void idxDatabase
1930: 45 72 72 6f 72 28 0a 20 20 73 71 6c 69 74 65 33  Error(.  sqlite3
1940: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1950: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1960: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
1970: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 2f 2a 20 57 72 69 74 65 20 65 72 72 6f 72 20   /* Write error 
19a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 2a 70 7a  here */.){.  *pz
19b0: 45 72 72 6d 73 67 20 3d 20 73 71 6c 69 74 65 33  Errmsg = sqlite3
19c0: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
19d0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
19e0: 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ));.}..static in
19f0: 74 20 69 64 78 50 72 65 70 61 72 65 53 74 6d 74  t idxPrepareStmt
1a00: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1a30: 68 61 6e 64 6c 65 20 74 6f 20 63 6f 6d 70 69 6c  handle to compil
1a40: 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 73  e against */.  s
1a50: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
1a60: 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Stmt,          /
1a70: 2a 20 4f 55 54 3a 20 43 6f 6d 70 69 6c 65 64 20  * OUT: Compiled 
1a80: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
1a90: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d  .  char **pzErrm
1aa0: 73 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sg,             
1ab0: 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71 6c 69 74     /* OUT: sqlit
1ac0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 65 64 20 65 72  e3_malloc()ed er
1ad0: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
1ae0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
1af0: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
1b00: 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   /* SQL statemen
1b10: 74 20 74 6f 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a  t to compile */.
1b20: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
1b30: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1b40: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  (db, zSql, -1, p
1b50: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
1b60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b70: 7b 0a 20 20 20 20 2a 70 70 53 74 6d 74 20 3d 20  {.    *ppStmt = 
1b80: 30 3b 0a 20 20 20 20 69 64 78 44 61 74 61 62 61  0;.    idxDataba
1b90: 73 65 45 72 72 6f 72 28 64 62 2c 20 70 7a 45 72  seError(db, pzEr
1ba0: 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
1bb0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
1bc0: 63 20 69 6e 74 20 69 64 78 50 72 69 6e 74 66 50  c int idxPrintfP
1bd0: 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20 73 71  repareStmt(.  sq
1be0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
1c10: 20 74 6f 20 63 6f 6d 70 69 6c 65 20 61 67 61 69   to compile agai
1c20: 6e 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nst */.  sqlite3
1c30: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20  _stmt **ppStmt, 
1c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1c50: 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74   Compiled SQL st
1c60: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61  atement */.  cha
1c70: 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 20 20 20  r **pzErrmsg,   
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c90: 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  OUT: sqlite3_mal
1ca0: 6c 6f 63 28 29 65 64 20 65 72 72 6f 72 20 6d 65  loc()ed error me
1cb0: 73 73 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  ssage */.  const
1cc0: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 20 20 20   char *zFmt,    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72             /* pr
1ce0: 69 6e 74 66 28 29 20 66 6f 72 6d 61 74 20 6f 66  intf() format of
1cf0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
1d00: 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  /.  ...         
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20      /* Trailing 
1d30: 70 72 69 6e 74 66 28 29 20 61 72 67 75 6d 65 6e  printf() argumen
1d40: 74 73 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69  ts */.){.  va_li
1d50: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b  st ap;.  int rc;
1d60: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
1d70: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1d80: 6d 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  mt);.  zSql = sq
1d90: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
1da0: 46 6d 74 2c 20 61 70 29 3b 0a 20 20 69 66 28 20  Fmt, ap);.  if( 
1db0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zSql==0 ){.    r
1dc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1dd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1de0: 63 20 3d 20 69 64 78 50 72 65 70 61 72 65 53 74  c = idxPrepareSt
1df0: 6d 74 28 64 62 2c 20 70 70 53 74 6d 74 2c 20 70  mt(db, ppStmt, p
1e00: 7a 45 72 72 6d 73 67 2c 20 7a 53 71 6c 29 3b 0a  zErrmsg, zSql);.
1e10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e20: 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 76 61  (zSql);.  }.  va
1e30: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
1e40: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
1e50: 20 69 6e 74 20 69 64 78 47 65 74 54 61 62 6c 65   int idxGetTable
1e60: 49 6e 66 6f 28 0a 20 20 73 71 6c 69 74 65 33 20  Info(.  sqlite3 
1e70: 2a 64 62 2c 0a 20 20 49 64 78 53 63 61 6e 20 2a  *db,.  IdxScan *
1e80: 70 53 63 61 6e 2c 0a 20 20 63 68 61 72 20 2a 2a  pScan,.  char **
1e90: 70 7a 45 72 72 6d 73 67 0a 29 7b 0a 20 20 63 6f  pzErrmsg.){.  co
1ea0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
1eb0: 20 70 53 63 61 6e 2d 3e 7a 54 61 62 6c 65 3b 0a   pScan->zTable;.
1ec0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1ed0: 70 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 43  p1 = 0;.  int nC
1ee0: 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42  ol = 0;.  int nB
1ef0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 49 64 78  yte = sizeof(Idx
1f00: 54 61 62 6c 65 29 3b 0a 20 20 49 64 78 54 61 62  Table);.  IdxTab
1f10: 6c 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  le *pNew = 0;.  
1f20: 69 6e 74 20 72 63 2c 20 72 63 32 3b 0a 20 20 63  int rc, rc2;.  c
1f30: 68 61 72 20 2a 70 43 73 72 3b 0a 0a 20 20 72 63  har *pCsr;..  rc
1f40: 20 3d 20 69 64 78 50 72 69 6e 74 66 50 72 65 70   = idxPrintfPrep
1f50: 61 72 65 53 74 6d 74 28 64 62 2c 20 26 70 31 2c  areStmt(db, &p1,
1f60: 20 70 7a 45 72 72 6d 73 67 2c 20 22 50 52 41 47   pzErrmsg, "PRAG
1f70: 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51  MA table_info=%Q
1f80: 22 2c 20 7a 54 62 6c 29 3b 0a 20 20 77 68 69 6c  ", zTbl);.  whil
1f90: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1fa0: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
1fb0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 31 29  sqlite3_step(p1)
1fc0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1fd0: 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73  ar *zCol = (cons
1fe0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1ff0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 31 2c 20  column_text(p1, 
2000: 31 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d  1);.    nByte +=
2010: 20 31 20 2b 20 73 74 72 6c 65 6e 28 7a 43 6f 6c   1 + strlen(zCol
2020: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2030: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
2040: 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20  _metadata(.     
2050: 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a     db, "main", z
2060: 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a  Tbl, zCol, 0, &z
2070: 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20  Col, 0, 0, 0.   
2080: 20 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d   );.    nByte +=
2090: 20 31 20 2b 20 73 74 72 6c 65 6e 28 7a 43 6f 6c   1 + strlen(zCol
20a0: 29 3b 0a 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20  );.    nCol++;. 
20b0: 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74   }.  rc2 = sqlit
20c0: 65 33 5f 72 65 73 65 74 28 70 31 29 3b 0a 20 20  e3_reset(p1);.  
20d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20e0: 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20  K ) rc = rc2;.. 
20f0: 20 6e 42 79 74 65 20 2b 3d 20 73 69 7a 65 6f 66   nByte += sizeof
2100: 28 49 64 78 43 6f 6c 75 6d 6e 29 20 2a 20 6e 43  (IdxColumn) * nC
2110: 6f 6c 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ol;.  if( rc==SQ
2120: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2130: 4e 65 77 20 3d 20 69 64 78 4d 61 6c 6c 6f 63 28  New = idxMalloc(
2140: 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  &rc, nByte);.  }
2150: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2160: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77  E_OK ){.    pNew
2170: 2d 3e 61 43 6f 6c 20 3d 20 28 49 64 78 43 6f 6c  ->aCol = (IdxCol
2180: 75 6d 6e 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  umn*)&pNew[1];. 
2190: 20 20 20 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d 20     pNew->nCol = 
21a0: 6e 43 6f 6c 3b 0a 20 20 20 20 70 43 73 72 20 3d  nCol;.    pCsr =
21b0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 2d 3e 61   (char*)&pNew->a
21c0: 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a  Col[nCol];.  }..
21d0: 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 77 68    nCol = 0;.  wh
21e0: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
21f0: 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
2200: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2210: 31 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  1) ){.    const 
2220: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f  char *zCol = (co
2230: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2240: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 31  3_column_text(p1
2250: 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43  , 1);.    int nC
2260: 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a 43 6f  opy = strlen(zCo
2270: 6c 29 20 2b 20 31 3b 0a 20 20 20 20 70 4e 65 77  l) + 1;.    pNew
2280: 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 2e 7a 4e 61  ->aCol[nCol].zNa
2290: 6d 65 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 70  me = pCsr;.    p
22a0: 4e 65 77 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 2e  New->aCol[nCol].
22b0: 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  iPk = sqlite3_co
22c0: 6c 75 6d 6e 5f 69 6e 74 28 70 31 2c 20 35 29 3b  lumn_int(p1, 5);
22d0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 73 72  .    memcpy(pCsr
22e0: 2c 20 7a 43 6f 6c 2c 20 6e 43 6f 70 79 29 3b 0a  , zCol, nCopy);.
22f0: 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 43 6f 70      pCsr += nCop
2300: 79 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  y;..    rc = sql
2310: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
2320: 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20  n_metadata(.    
2330: 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20      db, "main", 
2340: 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26  zTbl, zCol, 0, &
2350: 7a 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20  zCol, 0, 0, 0.  
2360: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d    );.    if( rc=
2370: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2380: 20 20 20 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c      nCopy = strl
2390: 65 6e 28 7a 43 6f 6c 29 20 2b 20 31 3b 0a 20 20  en(zCol) + 1;.  
23a0: 20 20 20 20 70 4e 65 77 2d 3e 61 43 6f 6c 5b 6e      pNew->aCol[n
23b0: 43 6f 6c 5d 2e 7a 43 6f 6c 6c 20 3d 20 70 43 73  Col].zColl = pCs
23c0: 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
23d0: 70 43 73 72 2c 20 7a 43 6f 6c 2c 20 6e 43 6f 70  pCsr, zCol, nCop
23e0: 79 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20 2b  y);.      pCsr +
23f0: 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 0a  = nCopy;.    }..
2400: 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a      nCol++;.  }.
2410: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
2420: 66 69 6e 61 6c 69 7a 65 28 70 31 29 3b 0a 20 20  finalize(p1);.  
2430: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2440: 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20  K ) rc = rc2;.. 
2450: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2460: 4f 4b 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d  OK ){.    pScan-
2470: 3e 70 54 61 62 6c 65 20 3d 20 70 4e 65 77 3b 0a  >pTable = pNew;.
2480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
2490: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
24a0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
24b0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
24c0: 20 69 64 78 43 72 65 61 74 65 54 61 62 6c 65 73   idxCreateTables
24d0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61      /* User data
2500: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
2510: 33 20 2a 64 62 6d 2c 20 20 20 20 20 20 20 20 20  3 *dbm,         
2520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 2d            /* In-
2530: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
2540: 74 6f 20 63 72 65 61 74 65 20 74 61 62 6c 65 73  to create tables
2550: 20 69 6e 20 2a 2f 0a 20 20 49 64 78 53 63 61 6e   in */.  IdxScan
2560: 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 20   *pScan,        
2570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2580: 20 6f 66 20 73 63 61 6e 73 20 2a 2f 0a 20 20 63   of scans */.  c
2590: 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 20 20  har **pzErrmsg  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b0: 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
25c0: 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  sage */.){.  int
25d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25e0: 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 49 64  .  int rc2;.  Id
25f0: 78 53 63 61 6e 20 2a 70 49 74 65 72 3b 0a 20 20  xScan *pIter;.  
2600: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2610: 71 6c 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  ql = 0;..  /* Co
2620: 70 79 20 74 68 65 20 65 6e 74 69 72 65 20 73 63  py the entire sc
2630: 68 65 6d 61 20 6f 66 20 64 61 74 61 62 61 73 65  hema of database
2640: 20 5b 64 62 5d 20 69 6e 74 6f 20 5b 64 62 6d 5d   [db] into [dbm]
2650: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 69 64 78 50  . */.  rc = idxP
2660: 72 69 6e 74 66 50 72 65 70 61 72 65 53 74 6d 74  rintfPrepareStmt
2670: 28 64 62 2c 20 26 70 53 71 6c 2c 20 70 7a 45 72  (db, &pSql, pzEr
2680: 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 22 53 45  rmsg, .      "SE
2690: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71  LECT sql FROM sq
26a0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
26b0: 45 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20  E name NOT LIKE 
26c0: 27 73 71 6c 69 74 65 5f 25 25 27 22 0a 20 20 29  'sqlite_%%'".  )
26d0: 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
26e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
26f0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2700: 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
2710: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2720: 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
2730: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2740: 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a  _text(pSql, 0);.
2750: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2760: 5f 65 78 65 63 28 64 62 6d 2c 20 7a 53 71 6c 2c  _exec(dbm, zSql,
2770: 20 30 2c 20 30 2c 20 70 7a 45 72 72 6d 73 67 29   0, 0, pzErrmsg)
2780: 3b 0a 20 20 7d 0a 20 20 72 63 32 20 3d 20 73 71  ;.  }.  rc2 = sq
2790: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
27a0: 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Sql);.  if( rc==
27b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
27c0: 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64   rc2;..  /* Load
27d0: 20 49 64 78 54 61 62 6c 65 20 6f 62 6a 65 63 74   IdxTable object
27e0: 73 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72  s */.  for(pIter
27f0: 3d 70 53 63 61 6e 3b 20 70 49 74 65 72 20 26 26  =pScan; pIter &&
2800: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
2810: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2820: 78 74 53 63 61 6e 29 7b 0a 20 20 20 20 72 63 20  xtScan){.    rc 
2830: 3d 20 69 64 78 47 65 74 54 61 62 6c 65 49 6e 66  = idxGetTableInf
2840: 6f 28 64 62 2c 20 70 49 74 65 72 2c 20 70 7a 45  o(db, pIter, pzE
2850: 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65  rrmsg);.  }.  re
2860: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2870: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2880: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 2a 70  is a no-op if *p
2890: 52 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 79  Rc is set to any
28a0: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
28b0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 77   .** SQLITE_OK w
28c0: 68 65 6e 20 69 74 20 69 73 20 63 61 6c 6c 65 64  hen it is called
28d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ..**.** If *pRc 
28e0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 73 65 74  is initially set
28f0: 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74   to SQLITE_OK, t
2900: 68 65 6e 20 74 68 65 20 74 65 78 74 20 73 70 65  hen the text spe
2910: 63 69 66 69 65 64 20 62 79 0a 2a 2a 20 74 68 65  cified by.** the
2920: 20 70 72 69 6e 74 66 28 29 20 73 74 79 6c 65 20   printf() style 
2930: 61 72 67 75 6d 65 6e 74 73 20 69 73 20 61 70 70  arguments is app
2940: 65 6e 64 65 64 20 74 6f 20 7a 49 6e 20 61 6e 64  ended to zIn and
2950: 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 74 75   the result retu
2960: 72 6e 65 64 0a 2a 2a 20 69 6e 20 61 20 62 75 66  rned.** in a buf
2970: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
2980: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2990: 29 2e 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ). sqlite3_free(
29a0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 0a 2a  ) is called on.*
29b0: 2a 20 7a 49 6e 20 62 65 66 6f 72 65 20 72 65 74  * zIn before ret
29c0: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
29d0: 63 20 63 68 61 72 20 2a 69 64 78 41 70 70 65 6e  c char *idxAppen
29e0: 64 54 65 78 74 28 69 6e 74 20 2a 70 52 63 2c 20  dText(int *pRc, 
29f0: 63 68 61 72 20 2a 7a 49 6e 2c 20 63 6f 6e 73 74  char *zIn, const
2a00: 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e   char *zFmt, ...
2a10: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
2a20: 0a 20 20 63 68 61 72 20 2a 7a 41 70 70 65 6e 64  .  char *zAppend
2a30: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52   = 0;.  char *zR
2a40: 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 49  et = 0;.  int nI
2a50: 6e 20 3d 20 7a 49 6e 20 3f 20 73 74 72 6c 65 6e  n = zIn ? strlen
2a60: 28 7a 49 6e 29 20 3a 20 30 3b 0a 20 20 69 6e 74  (zIn) : 0;.  int
2a70: 20 6e 41 70 70 65 6e 64 20 3d 20 30 3b 0a 20 20   nAppend = 0;.  
2a80: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
2a90: 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  t);.  if( *pRc==
2aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ab0: 20 7a 41 70 70 65 6e 64 20 3d 20 73 71 6c 69 74   zAppend = sqlit
2ac0: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
2ad0: 2c 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  , ap);.    if( z
2ae0: 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  Append ){.      
2af0: 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c 65 6e  nAppend = strlen
2b00: 28 7a 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 20  (zAppend);.     
2b10: 20 7a 52 65 74 20 3d 20 28 63 68 61 72 2a 29 73   zRet = (char*)s
2b20: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 49  qlite3_malloc(nI
2b30: 6e 20 2b 20 6e 41 70 70 65 6e 64 20 2b 20 31 29  n + nAppend + 1)
2b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b50: 7a 41 70 70 65 6e 64 20 26 26 20 7a 52 65 74 20  zAppend && zRet 
2b60: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2b70: 7a 52 65 74 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b  zRet, zIn, nIn);
2b80: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  .      memcpy(&z
2b90: 52 65 74 5b 6e 49 6e 5d 2c 20 7a 41 70 70 65 6e  Ret[nIn], zAppen
2ba0: 64 2c 20 6e 41 70 70 65 6e 64 2b 31 29 3b 0a 20  d, nAppend+1);. 
2bb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65  sqlite3_free(zRe
2bd0: 74 29 3b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d  t);.      zRet =
2be0: 20 30 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   0;.      *pRc =
2bf0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c00: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2c10: 5f 66 72 65 65 28 7a 41 70 70 65 6e 64 29 3b 0a  _free(zAppend);.
2c20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c30: 28 7a 49 6e 29 3b 0a 20 20 7d 0a 20 20 76 61 5f  (zIn);.  }.  va_
2c40: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
2c50: 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69  n zRet;.}..stati
2c60: 63 20 69 6e 74 20 69 64 78 49 64 65 6e 74 69 66  c int idxIdentif
2c70: 69 65 72 52 65 71 75 69 72 65 73 51 75 6f 74 65  ierRequiresQuote
2c80: 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  s(const char *zI
2c90: 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  d){.  int i;.  f
2ca0: 6f 72 28 69 3d 30 3b 20 7a 49 64 5b 69 5d 3b 20  or(i=0; zId[i]; 
2cb0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 28  i++){.    if( !(
2cc0: 7a 49 64 5b 69 5d 3d 3d 27 5f 27 29 0a 20 20 20  zId[i]=='_').   
2cd0: 20 20 26 26 20 21 28 7a 49 64 5b 69 5d 3e 3d 27    && !(zId[i]>='
2ce0: 30 27 20 26 26 20 7a 49 64 5b 69 5d 3c 3d 27 39  0' && zId[i]<='9
2cf0: 27 29 0a 20 20 20 20 20 26 26 20 21 28 7a 49 64  ').     && !(zId
2d00: 5b 69 5d 3e 3d 27 61 27 20 26 26 20 7a 49 64 5b  [i]>='a' && zId[
2d10: 69 5d 3c 3d 27 7a 27 29 0a 20 20 20 20 20 26 26  i]<='z').     &&
2d20: 20 21 28 7a 49 64 5b 69 5d 3e 3d 27 41 27 20 26   !(zId[i]>='A' &
2d30: 26 20 7a 49 64 5b 69 5d 3c 3d 27 5a 27 29 0a 20  & zId[i]<='Z'). 
2d40: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
2d50: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
2d60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73    return 0;.}..s
2d70: 74 61 74 69 63 20 63 68 61 72 20 2a 69 64 78 41  tatic char *idxA
2d80: 70 70 65 6e 64 43 6f 6c 44 65 66 6e 28 0a 20 20  ppendColDefn(.  
2d90: 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 68 61  int *pRc, .  cha
2da0: 72 20 2a 7a 49 6e 2c 20 0a 20 20 49 64 78 54 61  r *zIn, .  IdxTa
2db0: 62 6c 65 20 2a 70 54 61 62 2c 20 0a 20 20 49 64  ble *pTab, .  Id
2dc0: 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  xConstraint *pCo
2dd0: 6e 73 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  ns.){.  char *zR
2de0: 65 74 20 3d 20 7a 49 6e 3b 0a 20 20 49 64 78 43  et = zIn;.  IdxC
2df0: 6f 6c 75 6d 6e 20 2a 70 20 3d 20 26 70 54 61 62  olumn *p = &pTab
2e00: 2d 3e 61 43 6f 6c 5b 70 43 6f 6e 73 2d 3e 69 43  ->aCol[pCons->iC
2e10: 6f 6c 5d 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  ol];.  if( zRet 
2e20: 29 20 7a 52 65 74 20 3d 20 69 64 78 41 70 70 65  ) zRet = idxAppe
2e30: 6e 64 54 65 78 74 28 70 52 63 2c 20 7a 52 65 74  ndText(pRc, zRet
2e40: 2c 20 22 2c 20 22 29 3b 0a 0a 20 20 69 66 28 20  , ", ");..  if( 
2e50: 69 64 78 49 64 65 6e 74 69 66 69 65 72 52 65 71  idxIdentifierReq
2e60: 75 69 72 65 73 51 75 6f 74 65 73 28 70 2d 3e 7a  uiresQuotes(p->z
2e70: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 7a 52 65  Name) ){.    zRe
2e80: 74 20 3d 20 69 64 78 41 70 70 65 6e 64 54 65 78  t = idxAppendTex
2e90: 74 28 70 52 63 2c 20 7a 52 65 74 2c 20 22 25 51  t(pRc, zRet, "%Q
2ea0: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ", p->zName);.  
2eb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 52 65 74 20  }else{.    zRet 
2ec0: 3d 20 69 64 78 41 70 70 65 6e 64 54 65 78 74 28  = idxAppendText(
2ed0: 70 52 63 2c 20 7a 52 65 74 2c 20 22 25 73 22 2c  pRc, zRet, "%s",
2ee0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a   p->zName);.  }.
2ef0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
2f00: 74 72 69 63 6d 70 28 70 2d 3e 7a 43 6f 6c 6c 2c  tricmp(p->zColl,
2f10: 20 70 43 6f 6e 73 2d 3e 7a 43 6f 6c 6c 29 20 29   pCons->zColl) )
2f20: 7b 0a 20 20 20 20 69 66 28 20 69 64 78 49 64 65  {.    if( idxIde
2f30: 6e 74 69 66 69 65 72 52 65 71 75 69 72 65 73 51  ntifierRequiresQ
2f40: 75 6f 74 65 73 28 70 43 6f 6e 73 2d 3e 7a 43 6f  uotes(pCons->zCo
2f50: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 7a 52 65  ll) ){.      zRe
2f60: 74 20 3d 20 69 64 78 41 70 70 65 6e 64 54 65 78  t = idxAppendTex
2f70: 74 28 70 52 63 2c 20 7a 52 65 74 2c 20 22 20 43  t(pRc, zRet, " C
2f80: 4f 4c 4c 41 54 45 20 25 51 22 2c 20 70 43 6f 6e  OLLATE %Q", pCon
2f90: 73 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  s->zColl);.    }
2fa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 65 74  else{.      zRet
2fb0: 20 3d 20 69 64 78 41 70 70 65 6e 64 54 65 78 74   = idxAppendText
2fc0: 28 70 52 63 2c 20 7a 52 65 74 2c 20 22 20 43 4f  (pRc, zRet, " CO
2fd0: 4c 4c 41 54 45 20 25 73 22 2c 20 70 43 6f 6e 73  LLATE %s", pCons
2fe0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
2ff0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 6f 6e 73    }..  if( pCons
3000: 2d 3e 62 44 65 73 63 20 29 7b 0a 20 20 20 20 7a  ->bDesc ){.    z
3010: 52 65 74 20 3d 20 69 64 78 41 70 70 65 6e 64 54  Ret = idxAppendT
3020: 65 78 74 28 70 52 63 2c 20 7a 52 65 74 2c 20 22  ext(pRc, zRet, "
3030: 20 44 45 53 43 22 29 3b 0a 20 20 7d 0a 20 20 72   DESC");.  }.  r
3040: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
3050: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 64 61 74 61  *.** Search data
3060: 62 61 73 65 20 64 62 6d 20 66 6f 72 20 61 6e 20  base dbm for an 
3070: 69 6e 64 65 78 20 63 6f 6d 70 61 74 69 62 6c 65  index compatible
3080: 20 77 69 74 68 20 74 68 65 20 6f 6e 65 20 69 64   with the one id
3090: 78 43 72 65 61 74 65 46 72 6f 6d 43 6f 6e 73 28  xCreateFromCons(
30a0: 29 0a 2a 2a 20 77 6f 75 6c 64 20 63 72 65 61 74  ).** would creat
30b0: 65 20 66 72 6f 6d 20 61 72 67 75 6d 65 6e 74 73  e from arguments
30c0: 20 70 53 63 61 6e 2c 20 70 45 71 20 61 6e 64 20   pScan, pEq and 
30d0: 70 54 61 69 6c 2e 20 49 66 20 6e 6f 20 65 72 72  pTail. If no err
30e0: 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 0a 2a  or occurs and .*
30f0: 2a 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 20  * such an index 
3100: 69 73 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  is found, return
3110: 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 4f 72 2c 20 69   non-zero. Or, i
3120: 66 20 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 20  f no such index 
3130: 69 73 20 66 6f 75 6e 64 2c 0a 2a 2a 20 72 65 74  is found,.** ret
3140: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  urn zero..**.** 
3150: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
3160: 72 73 2c 20 73 65 74 20 2a 70 52 63 20 74 6f 20  rs, set *pRc to 
3170: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
3180: 63 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  code and return 
3190: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
31a0: 69 6e 74 20 69 64 78 46 69 6e 64 43 6f 6d 70 61  int idxFindCompa
31b0: 74 69 62 6c 65 28 0a 20 20 69 6e 74 20 2a 70 52  tible(.  int *pR
31c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
31d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
31e0: 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
31f0: 20 73 71 6c 69 74 65 33 2a 20 64 62 6d 2c 20 20   sqlite3* dbm,  
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
3220: 73 65 61 72 63 68 20 2a 2f 0a 20 20 49 64 78 53  search */.  IdxS
3230: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
3240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3250: 63 61 6e 20 66 6f 72 20 74 61 62 6c 65 20 74 6f  can for table to
3260: 20 73 65 61 72 63 68 20 66 6f 72 20 69 6e 64 65   search for inde
3270: 78 20 6f 6e 20 2a 2f 0a 20 20 49 64 78 43 6f 6e  x on */.  IdxCon
3280: 73 74 72 61 69 6e 74 20 2a 70 45 71 2c 20 20 20  straint *pEq,   
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
32a0: 74 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69  t of == constrai
32b0: 6e 74 73 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73  nts */.  IdxCons
32c0: 74 72 61 69 6e 74 20 2a 70 54 61 69 6c 20 20 20  traint *pTail   
32d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
32e0: 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72   of range constr
32f0: 61 69 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  aints */.){.  co
3300: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
3310: 20 70 53 63 61 6e 2d 3e 7a 54 61 62 6c 65 3b 0a   pScan->zTable;.
3320: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
3330: 70 49 64 78 4c 69 73 74 20 3d 20 30 3b 0a 20 20  pIdxList = 0;.  
3340: 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  IdxConstraint *p
3350: 49 74 65 72 3b 0a 20 20 69 6e 74 20 6e 45 71 20  Iter;.  int nEq 
3360: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
3370: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3380: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
3390: 20 70 45 71 20 2a 2f 0a 20 20 69 6e 74 20 72 63   pEq */.  int rc
33a0: 2c 20 72 63 32 3b 0a 0a 0a 20 20 2f 2a 20 43 6f  , rc2;...  /* Co
33b0: 75 6e 74 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  unt the elements
33c0: 20 69 6e 20 6c 69 73 74 20 70 45 71 20 2a 2f 0a   in list pEq */.
33d0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 45 71 3b    for(pIter=pEq;
33e0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
33f0: 74 65 72 2d 3e 70 4c 69 6e 6b 29 20 6e 45 71 2b  ter->pLink) nEq+
3400: 2b 3b 0a 0a 20 20 72 63 20 3d 20 69 64 78 50 72  +;..  rc = idxPr
3410: 69 6e 74 66 50 72 65 70 61 72 65 53 74 6d 74 28  intfPrepareStmt(
3420: 64 62 6d 2c 20 26 70 49 64 78 4c 69 73 74 2c 20  dbm, &pIdxList, 
3430: 30 2c 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78  0, "PRAGMA index
3440: 5f 6c 69 73 74 3d 25 51 22 2c 20 7a 54 62 6c 29  _list=%Q", zTbl)
3450: 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
3460: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
3470: 74 65 33 5f 73 74 65 70 28 70 49 64 78 4c 69 73  te3_step(pIdxLis
3480: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
3490: 7b 0a 20 20 20 20 69 6e 74 20 62 4d 61 74 63 68  {.    int bMatch
34a0: 20 3d 20 31 3b 0a 20 20 20 20 49 64 78 43 6f 6e   = 1;.    IdxCon
34b0: 73 74 72 61 69 6e 74 20 2a 70 54 20 3d 20 70 54  straint *pT = pT
34c0: 61 69 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ail;.    sqlite3
34d0: 5f 73 74 6d 74 20 2a 70 49 6e 66 6f 20 3d 20 30  _stmt *pInfo = 0
34e0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
34f0: 20 2a 7a 49 64 78 20 3d 20 28 63 6f 6e 73 74 20   *zIdx = (const 
3500: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
3510: 6c 75 6d 6e 5f 74 65 78 74 28 70 49 64 78 4c 69  lumn_text(pIdxLi
3520: 73 74 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  st, 1);..    /* 
3530: 5a 65 72 6f 20 74 68 65 20 49 64 78 43 6f 6e 73  Zero the IdxCons
3540: 74 72 61 69 6e 74 2e 62 46 6c 61 67 20 76 61 6c  traint.bFlag val
3550: 75 65 73 20 69 6e 20 74 68 65 20 70 45 71 20 6c  ues in the pEq l
3560: 69 73 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ist */.    for(p
3570: 49 74 65 72 3d 70 45 71 3b 20 70 49 74 65 72 3b  Iter=pEq; pIter;
3580: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4c   pIter=pIter->pL
3590: 69 6e 6b 29 20 70 49 74 65 72 2d 3e 62 46 6c 61  ink) pIter->bFla
35a0: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d  g = 0;..    rc =
35b0: 20 69 64 78 50 72 69 6e 74 66 50 72 65 70 61 72   idxPrintfPrepar
35c0: 65 53 74 6d 74 28 64 62 6d 2c 20 26 70 49 6e 66  eStmt(dbm, &pInf
35d0: 6f 2c 20 30 2c 20 22 50 52 41 47 4d 41 20 69 6e  o, 0, "PRAGMA in
35e0: 64 65 78 5f 78 49 6e 66 6f 3d 25 51 22 2c 20 7a  dex_xInfo=%Q", z
35f0: 49 64 78 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  Idx);.    while(
3600: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
3610: 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
3620: 49 6e 66 6f 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Info)==SQLITE_RO
3630: 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  W ){.      int i
3640: 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Idx = sqlite3_co
3650: 6c 75 6d 6e 5f 69 6e 74 28 70 49 6e 66 6f 2c 20  lumn_int(pInfo, 
3660: 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  0);.      int iC
3670: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ol = sqlite3_col
3680: 75 6d 6e 5f 69 6e 74 28 70 49 6e 66 6f 2c 20 31  umn_int(pInfo, 1
3690: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
36a0: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 28 63 6f  har *zColl = (co
36b0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
36c0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49  3_column_text(pI
36d0: 6e 66 6f 2c 20 34 29 3b 0a 0a 20 20 20 20 20 20  nfo, 4);..      
36e0: 69 66 28 20 69 49 64 78 3c 6e 45 71 20 29 7b 0a  if( iIdx<nEq ){.
36f0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 74 65          for(pIte
3700: 72 3d 70 45 71 3b 20 70 49 74 65 72 3b 20 70 49  r=pEq; pIter; pI
3710: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4c 69 6e 6b  ter=pIter->pLink
3720: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3730: 20 70 49 74 65 72 2d 3e 62 46 6c 61 67 20 29 20   pIter->bFlag ) 
3740: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3750: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
3760: 43 6f 6c 21 3d 69 43 6f 6c 20 29 20 63 6f 6e 74  Col!=iCol ) cont
3770: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
3780: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
3790: 63 6d 70 28 70 49 74 65 72 2d 3e 7a 43 6f 6c 6c  cmp(pIter->zColl
37a0: 2c 20 7a 43 6f 6c 6c 29 20 29 20 63 6f 6e 74 69  , zColl) ) conti
37b0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nue;.          p
37c0: 49 74 65 72 2d 3e 62 46 6c 61 67 20 3d 20 31 3b  Iter->bFlag = 1;
37d0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
37e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37f0: 20 20 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30      if( pIter==0
3800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4d   ){.          bM
3810: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
3820: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3830: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
3840: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
3850: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
3860: 28 20 70 54 2d 3e 69 43 6f 6c 21 3d 69 43 6f 6c  ( pT->iCol!=iCol
3870: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
3880: 63 6d 70 28 70 54 2d 3e 7a 43 6f 6c 6c 2c 20 7a  cmp(pT->zColl, z
3890: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  Coll) ){.       
38a0: 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20 30 3b       bMatch = 0;
38b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
38c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
38d0: 20 20 20 20 20 20 20 20 20 20 70 54 20 3d 20 70            pT = p
38e0: 54 2d 3e 70 4c 69 6e 6b 3b 0a 20 20 20 20 20 20  T->pLink;.      
38f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3900: 7d 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  }.    rc2 = sqli
3910: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 6e  te3_finalize(pIn
3920: 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fo);.    if( rc=
3930: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
3940: 3d 20 72 63 32 3b 0a 0a 20 20 20 20 69 66 28 20  = rc2;..    if( 
3950: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
3960: 20 62 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20   bMatch ){.     
3970: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3980: 65 28 70 49 64 78 4c 69 73 74 29 3b 0a 20 20 20  e(pIdxList);.   
3990: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
39a0: 20 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d 20 73   }.  }.  rc2 = s
39b0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
39c0: 70 49 64 78 4c 69 73 74 29 3b 0a 20 20 69 66 28  pIdxList);.  if(
39d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
39e0: 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 2a 70   rc = rc2;..  *p
39f0: 52 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  Rc = rc;.  retur
3a00: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 0;.}..static i
3a10: 6e 74 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d  nt idxCreateFrom
3a20: 43 6f 6e 73 28 0a 20 20 49 64 78 43 6f 6e 74 65  Cons(.  IdxConte
3a30: 78 74 20 2a 70 43 74 78 2c 0a 20 20 49 64 78 53  xt *pCtx,.  IdxS
3a40: 63 61 6e 20 2a 70 53 63 61 6e 2c 0a 20 20 49 64  can *pScan,.  Id
3a50: 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 45 71  xConstraint *pEq
3a60: 2c 20 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69  , .  IdxConstrai
3a70: 6e 74 20 2a 70 54 61 69 6c 0a 29 7b 0a 20 20 73  nt *pTail.){.  s
3a80: 71 6c 69 74 65 33 20 2a 64 62 6d 20 3d 20 70 43  qlite3 *dbm = pC
3a90: 74 78 2d 3e 64 62 6d 3b 0a 20 20 69 6e 74 20 72  tx->dbm;.  int r
3aa0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
3ab0: 20 69 66 28 20 28 70 45 71 20 7c 7c 20 70 54 61   if( (pEq || pTa
3ac0: 69 6c 29 20 26 26 20 30 3d 3d 69 64 78 46 69 6e  il) && 0==idxFin
3ad0: 64 43 6f 6d 70 61 74 69 62 6c 65 28 26 72 63 2c  dCompatible(&rc,
3ae0: 20 64 62 6d 2c 20 70 53 63 61 6e 2c 20 70 45 71   dbm, pScan, pEq
3af0: 2c 20 70 54 61 69 6c 29 20 29 7b 0a 20 20 20 20  , pTail) ){.    
3b00: 49 64 78 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  IdxTable *pTab =
3b10: 20 70 53 63 61 6e 2d 3e 70 54 61 62 6c 65 3b 0a   pScan->pTable;.
3b20: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 73 20      char *zCols 
3b30: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  = 0;.    char *z
3b40: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 49 64 78  Idx = 0;.    Idx
3b50: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e  Constraint *pCon
3b60: 73 3b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 30  s;.    int h = 0
3b70: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
3b80: 20 2a 7a 46 6d 74 3b 0a 0a 20 20 20 20 66 6f 72   *zFmt;..    for
3b90: 28 70 43 6f 6e 73 3d 70 45 71 3b 20 70 43 6f 6e  (pCons=pEq; pCon
3ba0: 73 3b 20 70 43 6f 6e 73 3d 70 43 6f 6e 73 2d 3e  s; pCons=pCons->
3bb0: 70 4c 69 6e 6b 29 7b 0a 20 20 20 20 20 20 7a 43  pLink){.      zC
3bc0: 6f 6c 73 20 3d 20 69 64 78 41 70 70 65 6e 64 43  ols = idxAppendC
3bd0: 6f 6c 44 65 66 6e 28 26 72 63 2c 20 7a 43 6f 6c  olDefn(&rc, zCol
3be0: 73 2c 20 70 54 61 62 2c 20 70 43 6f 6e 73 29 3b  s, pTab, pCons);
3bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
3c00: 43 6f 6e 73 3d 70 54 61 69 6c 3b 20 70 43 6f 6e  Cons=pTail; pCon
3c10: 73 3b 20 70 43 6f 6e 73 3d 70 43 6f 6e 73 2d 3e  s; pCons=pCons->
3c20: 70 4c 69 6e 6b 29 7b 0a 20 20 20 20 20 20 7a 43  pLink){.      zC
3c30: 6f 6c 73 20 3d 20 69 64 78 41 70 70 65 6e 64 43  ols = idxAppendC
3c40: 6f 6c 44 65 66 6e 28 26 72 63 2c 20 7a 43 6f 6c  olDefn(&rc, zCol
3c50: 73 2c 20 70 54 61 62 2c 20 70 43 6f 6e 73 29 3b  s, pTab, pCons);
3c60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
3c70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3c80: 0a 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74  .      /* Hash t
3c90: 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
3ca0: 6e 73 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69  ns to come up wi
3cb0: 74 68 20 61 20 6e 61 6d 65 20 66 6f 72 20 74 68  th a name for th
3cc0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  e index */.     
3cd0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
3ce0: 72 28 69 3d 30 3b 20 7a 43 6f 6c 73 5b 69 5d 3b  r(i=0; zCols[i];
3cf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 68   i++){.        h
3d00: 20 2b 3d 20 28 28 68 3c 3c 33 29 20 2b 20 7a 43   += ((h<<3) + zC
3d10: 6f 6c 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ols[i]);.      }
3d20: 0a 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 49  ..      if( idxI
3d30: 64 65 6e 74 69 66 69 65 72 52 65 71 75 69 72 65  dentifierRequire
3d40: 73 51 75 6f 74 65 73 28 70 53 63 61 6e 2d 3e 7a  sQuotes(pScan->z
3d50: 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  Table) ){.      
3d60: 20 20 7a 46 6d 74 20 3d 20 22 43 52 45 41 54 45    zFmt = "CREATE
3d70: 20 49 4e 44 45 58 20 27 25 71 5f 69 64 78 5f 25   INDEX '%q_idx_%
3d80: 30 38 78 27 20 4f 4e 20 25 51 28 25 73 29 22 3b  08x' ON %Q(%s)";
3d90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3da0: 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 52        zFmt = "CR
3db0: 45 41 54 45 20 49 4e 44 45 58 20 25 73 5f 69 64  EATE INDEX %s_id
3dc0: 78 5f 25 30 38 78 20 4f 4e 20 25 73 28 25 73 29  x_%08x ON %s(%s)
3dd0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
3de0: 20 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f   zIdx = sqlite3_
3df0: 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 70 53  mprintf(zFmt, pS
3e00: 63 61 6e 2d 3e 7a 54 61 62 6c 65 2c 20 68 2c 20  can->zTable, h, 
3e10: 70 53 63 61 6e 2d 3e 7a 54 61 62 6c 65 2c 20 7a  pScan->zTable, z
3e20: 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 69 66 28  Cols);.      if(
3e30: 20 21 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !zIdx ){.      
3e40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
3e50: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
3e60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
3e70: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 6d 2c  qlite3_exec(dbm,
3e80: 20 7a 49 64 78 2c 20 30 2c 20 30 2c 20 70 43 74   zIdx, 0, 0, pCt
3e90: 78 2d 3e 70 7a 45 72 72 6d 73 67 29 3b 0a 23 69  x->pzErrmsg);.#i
3ea0: 66 20 30 0a 20 20 20 20 20 20 20 20 70 72 69 6e  f 0.        prin
3eb0: 74 66 28 22 43 41 4e 44 49 44 41 54 45 3a 20 25  tf("CANDIDATE: %
3ec0: 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 23 65 6e  s\n", zIdx);.#en
3ed0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
3ee0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
3ef0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 74 78 2d  LITE_OK && pCtx-
3f00: 3e 69 49 64 78 52 6f 77 69 64 3d 3d 30 20 29 7b  >iIdxRowid==0 ){
3f10: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
3f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
3f30: 6d 74 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20  mt *pLast = 0;. 
3f40: 20 20 20 20 20 72 63 20 3d 20 69 64 78 50 72 65       rc = idxPre
3f50: 70 61 72 65 53 74 6d 74 28 64 62 6d 2c 20 26 70  pareStmt(dbm, &p
3f60: 4c 61 73 74 2c 20 70 43 74 78 2d 3e 70 7a 45 72  Last, pCtx->pzEr
3f70: 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20 20 20  rmsg, .         
3f80: 20 22 53 45 4c 45 43 54 20 6d 61 78 28 72 6f 77   "SELECT max(row
3f90: 69 64 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  id) FROM sqlite_
3fa0: 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 29 3b  master".      );
3fb0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
3fc0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
3fd0: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
3fe0: 73 74 65 70 28 70 4c 61 73 74 29 20 29 7b 0a 20  step(pLast) ){. 
3ff0: 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69 49 64         pCtx->iId
4000: 78 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  xRowid = sqlite3
4010: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 4c  _column_int64(pL
4020: 61 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ast, 0);.      }
4030: 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c  .      rc2 = sql
4040: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 4c  ite3_finalize(pL
4050: 61 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ast);.      if( 
4060: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
4070: 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
4080: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4090: 65 28 7a 49 64 78 29 3b 0a 20 20 20 20 73 71 6c  e(zIdx);.    sql
40a0: 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 73 29  ite3_free(zCols)
40b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
40c0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
40d0: 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d 57 68   idxCreateFromWh
40e0: 65 72 65 28 0a 20 20 20 20 49 64 78 43 6f 6e 74  ere(.    IdxCont
40f0: 65 78 74 2a 2c 20 69 36 34 2c 20 49 64 78 53 63  ext*, i64, IdxSc
4100: 61 6e 2a 2c 20 49 64 78 57 68 65 72 65 2a 2c 20  an*, IdxWhere*, 
4110: 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 2a 2c 20  IdxConstraint*, 
4120: 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 2a 0a 29  IdxConstraint*.)
4130: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ;../*.** Return 
4140: 74 72 75 65 20 69 66 20 6c 69 73 74 20 70 4c 69  true if list pLi
4150: 73 74 20 28 6c 69 6e 6b 65 64 20 62 79 20 49 64  st (linked by Id
4160: 78 43 6f 6e 73 74 72 61 69 6e 74 2e 70 4c 69 6e  xConstraint.pLin
4170: 6b 29 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61  k) contains.** a
4180: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6d 70   constraint comp
4190: 61 74 69 62 6c 65 20 77 69 74 68 20 2a 70 2e 20  atible with *p. 
41a0: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
41b0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
41c0: 63 20 69 6e 74 20 69 64 78 46 69 6e 64 43 6f 6e  c int idxFindCon
41d0: 73 74 72 61 69 6e 74 28 49 64 78 43 6f 6e 73 74  straint(IdxConst
41e0: 72 61 69 6e 74 20 2a 70 4c 69 73 74 2c 20 49 64  raint *pList, Id
41f0: 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 29 7b  xConstraint *p){
4200: 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74  .  IdxConstraint
4210: 20 2a 70 43 6d 70 3b 0a 20 20 66 6f 72 28 70 43   *pCmp;.  for(pC
4220: 6d 70 3d 70 4c 69 73 74 3b 20 70 43 6d 70 3b 20  mp=pList; pCmp; 
4230: 70 43 6d 70 3d 70 43 6d 70 2d 3e 70 4c 69 6e 6b  pCmp=pCmp->pLink
4240: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 43  ){.    if( p->iC
4250: 6f 6c 3d 3d 70 43 6d 70 2d 3e 69 43 6f 6c 20 29  ol==pCmp->iCol )
4260: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4270: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
4280: 61 74 69 63 20 69 6e 74 20 69 64 78 43 72 65 61  atic int idxCrea
4290: 74 65 46 72 6f 6d 57 68 65 72 65 28 0a 20 20 49  teFromWhere(.  I
42a0: 64 78 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  dxContext *pCtx,
42b0: 20 0a 20 20 69 36 34 20 6d 61 73 6b 2c 20 20 20   .  i64 mask,   
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 20 20 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20      /* Consider 
42e0: 6f 6e 6c 79 20 74 68 65 73 65 20 63 6f 6e 73 74  only these const
42f0: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 49 64 78 53  raints */.  IdxS
4300: 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20  can *pScan,     
4310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4320: 72 65 61 74 65 20 69 6e 64 65 78 65 73 20 66 6f  reate indexes fo
4330: 72 20 74 68 69 73 20 73 63 61 6e 20 2a 2f 0a 20  r this scan */. 
4340: 20 49 64 78 57 68 65 72 65 20 2a 70 57 68 65 72   IdxWhere *pWher
4350: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4360: 20 2f 2a 20 52 65 61 64 20 63 6f 6e 73 74 72 61   /* Read constra
4370: 69 6e 74 73 20 66 72 6f 6d 20 68 65 72 65 20 2a  ints from here *
4380: 2f 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e  /.  IdxConstrain
4390: 74 20 2a 70 45 71 2c 20 20 20 20 20 20 20 20 20  t *pEq,         
43a0: 20 20 20 20 2f 2a 20 3d 3d 20 63 6f 6e 73 74 72      /* == constr
43b0: 61 69 6e 74 73 20 66 6f 72 20 69 6e 63 6c 75 73  aints for inclus
43c0: 69 6f 6e 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73  ion */.  IdxCons
43d0: 74 72 61 69 6e 74 20 2a 70 54 61 69 6c 20 20 20  traint *pTail   
43e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 72 61 6e 67           /* rang
43f0: 65 2f 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74  e/ORDER BY const
4400: 72 61 69 6e 74 73 20 66 6f 72 20 69 6e 63 6c 75  raints for inclu
4410: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 49 64 78  sion */.){.  Idx
4420: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 31 20 3d  Constraint *p1 =
4430: 20 70 45 71 3b 0a 20 20 49 64 78 43 6f 6e 73 74   pEq;.  IdxConst
4440: 72 61 69 6e 74 20 2a 70 43 6f 6e 3b 0a 20 20 69  raint *pCon;.  i
4450: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 47 61 74  nt rc;..  /* Gat
4460: 68 65 72 20 75 70 20 61 6c 6c 20 74 68 65 20 3d  her up all the =
4470: 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  = constraints th
4480: 61 74 20 6d 61 74 63 68 20 74 68 65 20 6d 61 73  at match the mas
4490: 6b 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 43 6f 6e  k. */.  for(pCon
44a0: 3d 70 57 68 65 72 65 2d 3e 70 45 71 3b 20 70 43  =pWhere->pEq; pC
44b0: 6f 6e 3b 20 70 43 6f 6e 3d 70 43 6f 6e 2d 3e 70  on; pCon=pCon->p
44c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
44d0: 6d 61 73 6b 20 26 20 70 43 6f 6e 2d 3e 64 65 70  mask & pCon->dep
44e0: 6d 61 73 6b 29 3d 3d 70 43 6f 6e 2d 3e 64 65 70  mask)==pCon->dep
44f0: 6d 61 73 6b 20 0a 20 20 20 20 20 26 26 20 69 64  mask .     && id
4500: 78 46 69 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28  xFindConstraint(
4510: 70 31 2c 20 70 43 6f 6e 29 3d 3d 30 0a 20 20 20  p1, pCon)==0.   
4520: 20 20 26 26 20 69 64 78 46 69 6e 64 43 6f 6e 73    && idxFindCons
4530: 74 72 61 69 6e 74 28 70 54 61 69 6c 2c 20 70 43  traint(pTail, pC
4540: 6f 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  on)==0.    ){.  
4550: 20 20 20 20 70 43 6f 6e 2d 3e 70 4c 69 6e 6b 20      pCon->pLink 
4560: 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31 20 3d  = p1;.      p1 =
4570: 20 70 43 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d   pCon;.    }.  }
4580: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 6e  ..  /* Create an
4590: 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65   index using the
45a0: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
45b0: 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 76 65 2e  collected above.
45c0: 20 41 6e 64 20 74 68 65 0a 20 20 2a 2a 20 72 61   And the.  ** ra
45d0: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2f 4f  nge constraint/O
45e0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
45f0: 73 73 65 64 20 69 6e 20 62 79 20 74 68 65 20 63  ssed in by the c
4600: 61 6c 6c 65 72 2c 20 69 66 20 61 6e 79 2e 20 2a  aller, if any. *
4610: 2f 0a 20 20 72 63 20 3d 20 69 64 78 43 72 65 61  /.  rc = idxCrea
4620: 74 65 46 72 6f 6d 43 6f 6e 73 28 70 43 74 78 2c  teFromCons(pCtx,
4630: 20 70 53 63 61 6e 2c 20 70 31 2c 20 70 54 61 69   pScan, p1, pTai
4640: 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20  l);..  /* If no 
4650: 72 61 6e 67 65 2f 4f 52 44 45 52 20 42 59 20 70  range/ORDER BY p
4660: 61 73 73 65 64 20 62 79 20 74 68 65 20 63 61 6c  assed by the cal
4670: 6c 65 72 2c 20 63 72 65 61 74 65 20 61 20 76 65  ler, create a ve
4680: 72 73 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  rsion of the.  *
4690: 2a 20 69 6e 64 65 78 20 66 6f 72 20 65 61 63 68  * index for each
46a0: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
46b0: 74 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74  t that matches t
46c0: 68 65 20 6d 61 73 6b 2e 20 2a 2f 0a 20 20 69 66  he mask. */.  if
46d0: 28 20 70 54 61 69 6c 3d 3d 30 20 29 7b 0a 20 20  ( pTail==0 ){.  
46e0: 20 20 66 6f 72 28 70 43 6f 6e 3d 70 57 68 65 72    for(pCon=pWher
46f0: 65 2d 3e 70 52 61 6e 67 65 3b 20 72 63 3d 3d 53  e->pRange; rc==S
4700: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e  QLITE_OK && pCon
4710: 3b 20 70 43 6f 6e 3d 70 43 6f 6e 2d 3e 70 4e 65  ; pCon=pCon->pNe
4720: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
4730: 74 28 20 70 43 6f 6e 2d 3e 70 4c 69 6e 6b 3d 3d  t( pCon->pLink==
4740: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
4750: 6d 61 73 6b 20 26 20 70 43 6f 6e 2d 3e 64 65 70  mask & pCon->dep
4760: 6d 61 73 6b 29 3d 3d 70 43 6f 6e 2d 3e 64 65 70  mask)==pCon->dep
4770: 6d 61 73 6b 0a 20 20 20 20 20 20 20 20 26 26 20  mask.        && 
4780: 69 64 78 46 69 6e 64 43 6f 6e 73 74 72 61 69 6e  idxFindConstrain
4790: 74 28 70 45 71 2c 20 70 43 6f 6e 29 3d 3d 30 0a  t(pEq, pCon)==0.
47a0: 20 20 20 20 20 20 20 20 26 26 20 69 64 78 46 69          && idxFi
47b0: 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28 70 54 61  ndConstraint(pTa
47c0: 69 6c 2c 20 70 43 6f 6e 29 3d 3d 30 0a 20 20 20  il, pCon)==0.   
47d0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63     ){.        rc
47e0: 20 3d 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d   = idxCreateFrom
47f0: 43 6f 6e 73 28 70 43 74 78 2c 20 70 53 63 61 6e  Cons(pCtx, pScan
4800: 2c 20 70 31 2c 20 70 43 6f 6e 29 3b 0a 20 20 20  , p1, pCon);.   
4810: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
4820: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4830: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 63 61 6e  /*.** Create can
4840: 64 69 64 61 74 65 20 69 6e 64 65 78 65 73 20 69  didate indexes i
4850: 6e 20 64 61 74 61 62 61 73 65 20 5b 64 62 6d 5d  n database [dbm]
4860: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 64 61   based on the da
4870: 74 61 20 69 6e 20 0a 2a 2a 20 6c 69 6e 6b 65 64  ta in .** linked
4880: 2d 6c 69 73 74 20 70 53 63 61 6e 2e 0a 2a 2f 0a  -list pScan..*/.
4890: 73 74 61 74 69 63 20 69 6e 74 20 69 64 78 43 72  static int idxCr
48a0: 65 61 74 65 43 61 6e 64 69 64 61 74 65 73 28 49  eateCandidates(I
48b0: 64 78 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  dxContext *pCtx)
48c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 6d  {.  sqlite3 *dbm
48d0: 20 3d 20 70 43 74 78 2d 3e 64 62 6d 3b 0a 20 20   = pCtx->dbm;.  
48e0: 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20 72  int rc2;.  int r
48f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4900: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
4910: 44 65 70 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  Depmask;        
4920: 20 2f 2a 20 46 6f 72 65 61 63 68 20 64 65 70 6d   /* Foreach depm
4930: 61 73 6b 20 2a 2f 0a 20 20 49 64 78 53 63 61 6e  ask */.  IdxScan
4940: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 72 63 20 3d   *pIter;..  rc =
4950: 20 69 64 78 50 72 65 70 61 72 65 53 74 6d 74 28   idxPrepareStmt(
4960: 64 62 6d 2c 20 26 70 44 65 70 6d 61 73 6b 2c 20  dbm, &pDepmask, 
4970: 70 43 74 78 2d 3e 70 7a 45 72 72 6d 73 67 2c 20  pCtx->pzErrmsg, 
4980: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6d  .      "SELECT m
4990: 61 73 6b 20 46 52 4f 4d 20 64 65 70 6d 61 73 6b  ask FROM depmask
49a0: 22 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 70 49  ".  );..  for(pI
49b0: 74 65 72 3d 70 43 74 78 2d 3e 70 53 63 61 6e 3b  ter=pCtx->pScan;
49c0: 20 70 49 74 65 72 20 26 26 20 72 63 3d 3d 53 51   pIter && rc==SQ
49d0: 4c 49 54 45 5f 4f 4b 3b 20 70 49 74 65 72 3d 70  LITE_OK; pIter=p
49e0: 49 74 65 72 2d 3e 70 4e 65 78 74 53 63 61 6e 29  Iter->pNextScan)
49f0: 7b 0a 20 20 20 20 49 64 78 57 68 65 72 65 20 2a  {.    IdxWhere *
4a00: 70 57 68 65 72 65 20 3d 20 26 70 49 74 65 72 2d  pWhere = &pIter-
4a10: 3e 77 68 65 72 65 3b 0a 20 20 20 20 77 68 69 6c  >where;.    whil
4a20: 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
4a30: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 44 65 70  qlite3_step(pDep
4a40: 6d 61 73 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c  mask) && rc==SQL
4a50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4a60: 69 36 34 20 6d 61 73 6b 20 3d 20 73 71 6c 69 74  i64 mask = sqlit
4a70: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
4a80: 70 44 65 70 6d 61 73 6b 2c 20 30 29 3b 0a 20 20  pDepmask, 0);.  
4a90: 20 20 20 20 72 63 20 3d 20 69 64 78 43 72 65 61      rc = idxCrea
4aa0: 74 65 46 72 6f 6d 57 68 65 72 65 28 70 43 74 78  teFromWhere(pCtx
4ab0: 2c 20 6d 61 73 6b 2c 20 70 49 74 65 72 2c 20 70  , mask, pIter, p
4ac0: 57 68 65 72 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Where, 0, 0);.  
4ad0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4ae0: 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e  TE_OK && pIter->
4af0: 70 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  pOrder ){.      
4b00: 20 20 72 63 20 3d 20 69 64 78 43 72 65 61 74 65    rc = idxCreate
4b10: 46 72 6f 6d 57 68 65 72 65 28 70 43 74 78 2c 20  FromWhere(pCtx, 
4b20: 6d 61 73 6b 2c 20 70 49 74 65 72 2c 20 70 57 68  mask, pIter, pWh
4b30: 65 72 65 2c 20 30 2c 20 70 49 74 65 72 2d 3e 70  ere, 0, pIter->p
4b40: 4f 72 64 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Order);.      }.
4b50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 32      }.  }..  rc2
4b60: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
4b70: 69 7a 65 28 70 44 65 70 6d 61 73 6b 29 3b 0a 20  ize(pDepmask);. 
4b80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4b90: 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
4ba0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
4bb0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 78 53 63  tatic void idxSc
4bc0: 61 6e 46 72 65 65 28 49 64 78 53 63 61 6e 20 2a  anFree(IdxScan *
4bd0: 70 53 63 61 6e 29 7b 0a 20 20 49 64 78 53 63 61  pScan){.  IdxSca
4be0: 6e 20 2a 70 49 74 65 72 3b 0a 20 20 49 64 78 53  n *pIter;.  IdxS
4bf0: 63 61 6e 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  can *pNext;.  fo
4c00: 72 28 70 49 74 65 72 3d 70 53 63 61 6e 3b 20 70  r(pIter=pScan; p
4c10: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 4e 65 78  Iter; pIter=pNex
4c20: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
4c30: 70 49 74 65 72 2d 3e 70 4e 65 78 74 53 63 61 6e  pIter->pNextScan
4c40: 3b 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20 69 64 78  ;.  }.}..int idx
4c50: 46 69 6e 64 49 6e 64 65 78 65 73 28 0a 20 20 49  FindIndexes(.  I
4c60: 64 78 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  dxContext *pCtx,
4c70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4c80: 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
4c90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
4ca0: 6f 20 66 69 6e 64 20 69 6e 64 65 78 65 73 20 66  o find indexes f
4cb0: 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  or */.  void (*x
4cc0: 4f 75 74 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73  Out)(void*, cons
4cd0: 74 20 63 68 61 72 2a 29 2c 20 20 20 20 2f 2a 20  t char*),    /* 
4ce0: 4f 75 74 70 75 74 20 63 61 6c 6c 62 61 63 6b 20  Output callback 
4cf0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4f 75 74 43  */.  void *pOutC
4d00: 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
4d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
4d20: 74 65 78 74 20 66 6f 72 20 78 4f 75 74 28 29 20  text for xOut() 
4d30: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
4d40: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
4d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
4d60: 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
4d70: 28 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29  (sqlite3_malloc)
4d80: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4d90: 20 2a 64 62 6d 20 3d 20 70 43 74 78 2d 3e 64 62   *dbm = pCtx->db
4da0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  m;.  sqlite3_stm
4db0: 74 20 2a 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b  t *pExplain = 0;
4dc0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
4dd0: 2a 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  *pSelect = 0;.  
4de0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
4df0: 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  nsert = 0;.  int
4e00: 20 72 63 2c 20 72 63 32 3b 0a 20 20 69 6e 74 20   rc, rc2;.  int 
4e10: 62 46 6f 75 6e 64 20 3d 20 30 3b 0a 0a 20 20 72  bFound = 0;..  r
4e20: 63 20 3d 20 69 64 78 50 72 69 6e 74 66 50 72 65  c = idxPrintfPre
4e30: 70 61 72 65 53 74 6d 74 28 64 62 6d 2c 20 26 70  pareStmt(dbm, &p
4e40: 45 78 70 6c 61 69 6e 2c 20 70 7a 45 72 72 2c 22  Explain, pzErr,"
4e50: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
4e60: 41 4e 20 25 73 22 2c 7a 53 71 6c 29 3b 0a 20 20  AN %s",zSql);.  
4e70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4e80: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 64  K ){.    rc = id
4e90: 78 50 72 65 70 61 72 65 53 74 6d 74 28 64 62 6d  xPrepareStmt(dbm
4ea0: 2c 20 26 70 53 65 6c 65 63 74 2c 20 70 7a 45 72  , &pSelect, pzEr
4eb0: 72 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  r, .        "SEL
4ec0: 45 43 54 20 72 6f 77 69 64 2c 20 73 71 6c 20 46  ECT rowid, sql F
4ed0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
4ee0: 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 3f  r WHERE name = ?
4ef0: 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 69  ".    );.  }.  i
4f00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f10: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 64 78   ){.    rc = idx
4f20: 50 72 65 70 61 72 65 53 74 6d 74 28 64 62 6d 2c  PrepareStmt(dbm,
4f30: 20 26 70 49 6e 73 65 72 74 2c 20 70 7a 45 72 72   &pInsert, pzErr
4f40: 2c 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52  ,.        "INSER
4f50: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
4f60: 20 61 75 78 2e 69 6e 64 65 78 65 73 20 56 41 4c   aux.indexes VAL
4f70: 55 45 53 28 3f 29 22 0a 20 20 20 20 29 3b 0a 20  UES(?)".    );. 
4f80: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
4f90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
4fa0: 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c  lite3_step(pExpl
4fb0: 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ain)==SQLITE_ROW
4fc0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4fd0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4fe0: 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20  Detail = (const 
4ff0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
5000: 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
5010: 69 6e 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20  in, 3);.    int 
5020: 6e 44 65 74 61 69 6c 20 3d 20 73 74 72 6c 65 6e  nDetail = strlen
5030: 28 7a 44 65 74 61 69 6c 29 3b 0a 0a 20 20 20 20  (zDetail);..    
5040: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 65 74 61  for(i=0; i<nDeta
5050: 69 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  il; i++){.      
5060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
5070: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
5080: 6d 65 6d 63 6d 70 28 26 7a 44 65 74 61 69 6c 5b  memcmp(&zDetail[
5090: 69 5d 2c 20 22 20 55 53 49 4e 47 20 49 4e 44 45  i], " USING INDE
50a0: 58 20 22 2c 20 31 33 29 3d 3d 30 20 29 7b 0a 20  X ", 13)==0 ){. 
50b0: 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20 26 7a         zIdx = &z
50c0: 44 65 74 61 69 6c 5b 69 2b 31 33 5d 3b 0a 20 20  Detail[i+13];.  
50d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
50e0: 6d 63 6d 70 28 26 7a 44 65 74 61 69 6c 5b 69 5d  mcmp(&zDetail[i]
50f0: 2c 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49  , " USING COVERI
5100: 4e 47 20 49 4e 44 45 58 20 22 2c 20 32 32 29 3d  NG INDEX ", 22)=
5110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49  =0 ){.        zI
5120: 64 78 20 3d 20 26 7a 44 65 74 61 69 6c 5b 69 2b  dx = &zDetail[i+
5130: 32 32 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  22];.      }.   
5140: 20 20 20 69 66 28 20 7a 49 64 78 20 29 7b 0a 20     if( zIdx ){. 
5150: 20 20 20 20 20 20 20 69 6e 74 20 6e 49 64 78 20         int nIdx 
5160: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = 0;.        whi
5170: 6c 65 28 20 7a 49 64 78 5b 6e 49 64 78 5d 21 3d  le( zIdx[nIdx]!=
5180: 27 5c 30 27 20 26 26 20 28 7a 49 64 78 5b 6e 49  '\0' && (zIdx[nI
5190: 64 78 5d 21 3d 27 20 27 20 7c 7c 20 7a 49 64 78  dx]!=' ' || zIdx
51a0: 5b 6e 49 64 78 2b 31 5d 21 3d 27 28 27 29 20 29  [nIdx+1]!='(') )
51b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 49 64 78  {.          nIdx
51c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
51e0: 6e 64 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  nd_text(pSelect,
51f0: 20 31 2c 20 7a 49 64 78 2c 20 6e 49 64 78 2c 20   1, zIdx, nIdx, 
5200: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
5210: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
5220: 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
5230: 73 74 65 70 28 70 53 65 6c 65 63 74 29 20 29 7b  step(pSelect) ){
5240: 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
5250: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
5260: 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 65  column_int64(pSe
5270: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
5280: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5290: 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zSql = (const ch
52a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
52b0: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
52c0: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   1);.          i
52d0: 66 28 20 69 52 6f 77 69 64 3e 3d 70 43 74 78 2d  f( iRowid>=pCtx-
52e0: 3e 69 49 64 78 52 6f 77 69 64 20 29 7b 0a 20 20  >iIdxRowid ){.  
52f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5300: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e 73  3_bind_text(pIns
5310: 65 72 74 2c 20 31 2c 20 7a 53 71 6c 2c 20 2d 31  ert, 1, zSql, -1
5320: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
5330: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
5340: 6c 69 74 65 33 5f 73 74 65 70 28 70 49 6e 73 65  lite3_step(pInse
5350: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
5360: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
5370: 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  set(pInsert);.  
5380: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
5390: 20 29 20 67 6f 74 6f 20 66 69 6e 64 5f 69 6e 64   ) goto find_ind
53a0: 65 78 65 73 5f 6f 75 74 3b 0a 20 20 20 20 20 20  exes_out;.      
53b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
53c0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
53d0: 69 74 65 33 5f 72 65 73 65 74 28 70 53 65 6c 65  ite3_reset(pSele
53e0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ct);.        bre
53f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5400: 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d 20 73 71  }.  }.  rc2 = sq
5410: 6c 69 74 65 33 5f 72 65 73 65 74 28 70 45 78 70  lite3_reset(pExp
5420: 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  lain);.  if( rc=
5430: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
5440: 3d 20 72 63 32 3b 0a 20 20 69 66 28 20 72 63 3d  = rc2;.  if( rc=
5450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5460: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
5470: 70 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 72  pLoop = 0;.    r
5480: 63 20 3d 20 69 64 78 50 72 65 70 61 72 65 53 74  c = idxPrepareSt
5490: 6d 74 28 64 62 6d 2c 20 26 70 4c 6f 6f 70 2c 20  mt(dbm, &pLoop, 
54a0: 70 7a 45 72 72 2c 22 53 45 4c 45 43 54 20 6e 61  pzErr,"SELECT na
54b0: 6d 65 7c 7c 27 3b 27 20 46 52 4f 4d 20 61 75 78  me||';' FROM aux
54c0: 2e 69 6e 64 65 78 65 73 22 29 3b 0a 20 20 20 20  .indexes");.    
54d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
54e0: 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  K ){.      while
54f0: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
5500: 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70  lite3_step(pLoop
5510: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 46 6f  ) ){.        bFo
5520: 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  und = 1;.       
5530: 20 78 4f 75 74 28 70 4f 75 74 43 74 78 2c 20 28   xOut(pOutCtx, (
5540: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
5550: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
5560: 70 4c 6f 6f 70 2c 20 30 29 29 3b 0a 20 20 20 20  pLoop, 0));.    
5570: 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
5580: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
5590: 70 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20  pLoop);.    }.  
55a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
55b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
55c0: 20 62 46 6f 75 6e 64 3d 3d 30 20 29 20 78 4f 75   bFound==0 ) xOu
55d0: 74 28 70 4f 75 74 43 74 78 2c 20 22 28 6e 6f 20  t(pOutCtx, "(no 
55e0: 6e 65 77 20 69 6e 64 65 78 65 73 29 22 29 3b 0a  new indexes)");.
55f0: 20 20 20 20 20 20 78 4f 75 74 28 70 4f 75 74 43        xOut(pOutC
5600: 74 78 2c 20 22 22 29 3b 0a 20 20 20 20 7d 0a 20  tx, "");.    }. 
5610: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
5620: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
5630: 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c  lite3_step(pExpl
5640: 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ain)==SQLITE_ROW
5650: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 6c   ){.    int iSel
5660: 65 63 74 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  ectid = sqlite3_
5670: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
5680: 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74  ain, 0);.    int
5690: 20 69 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65   iOrder = sqlite
56a0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
56b0: 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69  plain, 1);.    i
56c0: 6e 74 20 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74  nt iFrom = sqlit
56d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
56e0: 78 70 6c 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20  xplain, 2);.    
56f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 74  const char *zDet
5700: 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ail = (const cha
5710: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5720: 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
5730: 20 33 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   3);.    char *z
5740: 4f 75 74 3b 0a 0a 20 20 20 20 7a 4f 75 74 20 3d  Out;..    zOut =
5750: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
5760: 28 22 25 64 7c 25 64 7c 25 64 7c 25 73 22 2c 20  ("%d|%d|%d|%s", 
5770: 69 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65  iSelectid, iOrde
5780: 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69  r, iFrom, zDetai
5790: 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4f 75 74  l);.    if( zOut
57a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
57b0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
57c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
57d0: 20 78 4f 75 74 28 70 4f 75 74 43 74 78 2c 20 7a   xOut(pOutCtx, z
57e0: 4f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Out);.      sqli
57f0: 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
5800: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66 69 6e 64      }.  }.. find
5810: 5f 69 6e 64 65 78 65 73 5f 6f 75 74 3a 0a 20 20  _indexes_out:.  
5820: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
5830: 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29  nalize(pExplain)
5840: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5850: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
5860: 3b 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65  ;.  rc2 = sqlite
5870: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65  3_finalize(pSele
5880: 63 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ct);.  if( rc==S
5890: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
58a0: 72 63 32 3b 0a 20 20 72 63 32 20 3d 20 73 71 6c  rc2;.  rc2 = sql
58b0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49  ite3_finalize(pI
58c0: 6e 73 65 72 74 29 3b 0a 20 20 69 66 28 20 72 63  nsert);.  if( rc
58d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
58e0: 20 3d 20 72 63 32 3b 0a 0a 20 20 72 65 74 75 72   = rc2;..  retur
58f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
5900: 68 65 20 78 4f 75 74 20 63 61 6c 6c 62 61 63 6b  he xOut callback
5910: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72   is invoked to r
5920: 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 6f 75  eturn command ou
5930: 74 70 75 74 20 74 6f 20 74 68 65 20 75 73 65 72  tput to the user
5940: 2e 20 54 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  . The.** second 
5950: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6c 77 61  argument is alwa
5960: 79 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ys a nul-termina
5970: 74 65 64 20 73 74 72 69 6e 67 2e 20 54 68 65 20  ted string. The 
5980: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
5990: 73 0a 2a 2a 20 70 61 73 73 65 64 20 7a 65 72 6f  s.** passed zero
59a0: 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20 63   if the string c
59b0: 6f 6e 74 61 69 6e 73 20 6e 6f 72 6d 61 6c 20 6f  ontains normal o
59c0: 75 74 70 75 74 20 6f 72 20 6e 6f 6e 2d 7a 65 72  utput or non-zer
59d0: 6f 20 69 66 20 69 74 20 69 73 20 61 6e 0a 2a 2a  o if it is an.**
59e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
59f0: 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 49 6e 64 65  */.int shellInde
5a00: 78 65 73 43 6f 6d 6d 61 6e 64 28 0a 20 20 73 71  xesCommand(.  sq
5a10: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
5a40: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
5a50: 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 2f 2a 20 53 51 4c 20 74 6f 20 66 69 6e 64 20 69  /* SQL to find i
5a80: 6e 64 65 78 65 73 20 66 6f 72 20 2a 2f 0a 20 20  ndexes for */.  
5a90: 76 6f 69 64 20 28 2a 78 4f 75 74 29 28 76 6f 69  void (*xOut)(voi
5aa0: 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  d*, const char*)
5ab0: 2c 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63  ,    /* Output c
5ac0: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69  allback */.  voi
5ad0: 64 20 2a 70 4f 75 74 43 74 78 2c 20 20 20 20 20  d *pOutCtx,     
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
5b00: 20 78 4f 75 74 28 29 20 2a 2f 0a 20 20 63 68 61   xOut() */.  cha
5b10: 72 20 2a 2a 70 7a 45 72 72 6d 73 67 20 20 20 20  r **pzErrmsg    
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
5b40: 6d 65 73 73 61 67 65 20 28 73 71 6c 69 74 65 33  message (sqlite3
5b50: 5f 6d 61 6c 6c 6f 63 29 20 2a 2f 0a 29 7b 0a 20  _malloc) */.){. 
5b60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
5b70: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  _OK;.  sqlite3 *
5b80: 64 62 6d 20 3d 20 30 3b 0a 20 20 49 64 78 43 6f  dbm = 0;.  IdxCo
5b90: 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73 71 6c  ntext ctx;.  sql
5ba0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
5bb0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
5bc0: 53 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 69 6c  Statement compil
5bd0: 65 64 20 66 72 6f 6d 20 7a 53 71 6c 20 2a 2f 0a  ed from zSql */.
5be0: 0a 20 20 6d 65 6d 73 65 74 28 26 63 74 78 2c 20  .  memset(&ctx, 
5bf0: 30 2c 20 73 69 7a 65 6f 66 28 49 64 78 43 6f 6e  0, sizeof(IdxCon
5c00: 74 65 78 74 29 29 3b 0a 20 20 63 74 78 2e 70 7a  text));.  ctx.pz
5c10: 45 72 72 6d 73 67 20 3d 20 70 7a 45 72 72 6d 73  Errmsg = pzErrms
5c20: 67 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e  g;..  /* Open an
5c30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5c40: 61 73 65 20 74 6f 20 77 6f 72 6b 20 77 69 74 68  ase to work with
5c50: 2e 20 54 68 65 20 6d 61 69 6e 20 69 6e 2d 6d 65  . The main in-me
5c60: 6d 6f 72 79 20 0a 20 20 2a 2a 20 64 61 74 61 62  mory .  ** datab
5c70: 61 73 65 20 73 63 68 65 6d 61 20 63 6f 6e 74 61  ase schema conta
5c80: 69 6e 73 20 74 61 62 6c 65 73 20 73 69 6d 69 6c  ins tables simil
5c90: 61 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 20 74  ar to those in t
5ca0: 68 65 20 75 73 65 72 73 20 0a 20 20 2a 2a 20 64  he users .  ** d
5cb0: 61 74 61 62 61 73 65 20 28 68 61 6e 64 6c 65 20  atabase (handle 
5cc0: 64 62 29 2e 20 54 68 65 20 61 74 74 61 63 68 65  db). The attache
5cd0: 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 20 28  d in-memory db (
5ce0: 61 75 78 29 20 63 6f 6e 74 61 69 6e 73 0a 20 20  aux) contains.  
5cf0: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  ** application t
5d00: 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 74 68  ables used by th
5d10: 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  e code in this f
5d20: 69 6c 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ile.  */.  rc = 
5d30: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d  sqlite3_open(":m
5d40: 65 6d 6f 72 79 3a 22 2c 20 26 64 62 6d 29 3b 0a  emory:", &dbm);.
5d50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5d60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
5d70: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 6d  sqlite3_exec(dbm
5d80: 2c 20 0a 20 20 20 20 20 20 20 20 22 41 54 54 41  , .        "ATTA
5d90: 43 48 20 27 3a 6d 65 6d 6f 72 79 3a 27 20 41 53  CH ':memory:' AS
5da0: 20 61 75 78 3b 22 0a 20 20 20 20 20 20 20 20 22   aux;".        "
5db0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75 78  CREATE TABLE aux
5dc0: 2e 64 65 70 6d 61 73 6b 28 6d 61 73 6b 20 50 52  .depmask(mask PR
5dd0: 49 4d 41 52 59 20 4b 45 59 29 20 57 49 54 48 4f  IMARY KEY) WITHO
5de0: 55 54 20 52 4f 57 49 44 3b 22 0a 20 20 20 20 20  UT ROWID;".     
5df0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
5e00: 20 61 75 78 2e 69 6e 64 65 78 65 73 28 6e 61 6d   aux.indexes(nam
5e10: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 57  e PRIMARY KEY) W
5e20: 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 0a 20  ITHOUT ROWID;". 
5e30: 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
5e40: 4e 54 4f 20 61 75 78 2e 64 65 70 6d 61 73 6b 20  NTO aux.depmask 
5e50: 56 41 4c 55 45 53 28 30 29 3b 22 0a 20 20 20 20  VALUES(0);".    
5e60: 20 20 20 20 2c 20 30 2c 20 30 2c 20 70 7a 45 72      , 0, 0, pzEr
5e70: 72 6d 73 67 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  rmsg.    );.  }.
5e80: 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61 6e  .  /* Prepare an
5e90: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
5ea0: 74 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  t for writing to
5eb0: 20 61 75 78 2e 64 65 70 6d 61 73 6b 20 2a 2f 0a   aux.depmask */.
5ec0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5ed0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
5ee0: 69 64 78 50 72 65 70 61 72 65 53 74 6d 74 28 64  idxPrepareStmt(d
5ef0: 62 6d 2c 20 26 63 74 78 2e 70 49 6e 73 65 72 74  bm, &ctx.pInsert
5f00: 4d 61 73 6b 2c 20 70 7a 45 72 72 6d 73 67 2c 0a  Mask, pzErrmsg,.
5f10: 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
5f20: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 61  OR IGNORE INTO a
5f30: 75 78 2e 64 65 70 6d 61 73 6b 20 53 45 4c 45 43  ux.depmask SELEC
5f40: 54 20 6d 61 73 6b 20 7c 20 3f 31 20 46 52 4f 4d  T mask | ?1 FROM
5f50: 20 61 75 78 2e 64 65 70 6d 61 73 6b 3b 22 0a 20   aux.depmask;". 
5f60: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
5f70: 41 6e 61 6c 79 7a 65 20 74 68 65 20 53 45 4c 45  Analyze the SELE
5f80: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
5f90: 7a 53 71 6c 2e 20 2a 2f 0a 20 20 69 66 28 20 72  zSql. */.  if( r
5fa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5fb0: 20 20 20 20 63 74 78 2e 64 62 6d 20 3d 20 64 62      ctx.dbm = db
5fc0: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  m;.    sqlite3_w
5fd0: 68 65 72 65 69 6e 66 6f 5f 68 6f 6f 6b 28 64 62  hereinfo_hook(db
5fe0: 2c 20 69 64 78 57 68 65 72 65 49 6e 66 6f 2c 20  , idxWhereInfo, 
5ff0: 28 76 6f 69 64 2a 29 26 63 74 78 29 3b 0a 20 20  (void*)&ctx);.  
6000: 20 20 72 63 20 3d 20 69 64 78 50 72 65 70 61 72    rc = idxPrepar
6010: 65 53 74 6d 74 28 64 62 2c 20 26 70 53 74 6d 74  eStmt(db, &pStmt
6020: 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53 71 6c  , pzErrmsg, zSql
6030: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
6040: 68 65 72 65 69 6e 66 6f 5f 68 6f 6f 6b 28 64 62  hereinfo_hook(db
6050: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6060: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
6070: 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tmt);.  }..  /* 
6080: 43 72 65 61 74 65 20 74 61 62 6c 65 73 20 77 69  Create tables wi
6090: 74 68 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  thin the main in
60a0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
60b0: 2e 20 54 68 65 73 65 20 74 61 62 6c 65 73 0a 20  . These tables. 
60c0: 20 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d   ** have the sam
60d0: 65 20 6e 61 6d 65 73 2c 20 63 6f 6c 75 6d 6e 73  e names, columns
60e0: 20 61 6e 64 20 64 65 63 6c 61 72 65 64 20 74 79   and declared ty
60f0: 70 65 73 20 61 73 20 74 68 65 20 74 61 62 6c 65  pes as the table
6100: 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 75 73  s in.  ** the us
6110: 65 72 20 64 61 74 61 62 61 73 65 2e 20 41 6c 6c  er database. All
6120: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 65 78 63   constraints exc
6130: 65 70 74 20 66 6f 72 20 50 52 49 4d 41 52 59 20  ept for PRIMARY 
6140: 4b 45 59 20 61 72 65 0a 20 20 2a 2a 20 72 65 6d  KEY are.  ** rem
6150: 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72  oved. */.  if( r
6160: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6170: 20 20 20 20 72 63 20 3d 20 69 64 78 43 72 65 61      rc = idxCrea
6180: 74 65 54 61 62 6c 65 73 28 64 62 2c 20 64 62 6d  teTables(db, dbm
6190: 2c 20 63 74 78 2e 70 53 63 61 6e 2c 20 70 7a 45  , ctx.pScan, pzE
61a0: 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rrmsg);.  }..  /
61b0: 2a 20 43 72 65 61 74 65 20 63 61 6e 64 69 64 61  * Create candida
61c0: 74 65 20 69 6e 64 65 78 65 73 20 77 69 74 68 69  te indexes withi
61d0: 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
61e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
61f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6200: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
6210: 20 69 64 78 43 72 65 61 74 65 43 61 6e 64 69 64   idxCreateCandid
6220: 61 74 65 73 28 26 63 74 78 29 3b 0a 20 20 7d 0a  ates(&ctx);.  }.
6230: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
6240: 20 77 68 69 63 68 20 6f 66 20 74 68 65 20 63 61   which of the ca
6250: 6e 64 69 64 61 74 65 20 69 6e 64 65 78 65 73 20  ndidate indexes 
6260: 61 72 65 20 70 72 65 66 65 72 72 65 64 20 62 79  are preferred by
6270: 20 74 68 65 20 71 75 65 72 79 0a 20 20 2a 2a 20   the query.  ** 
6280: 70 6c 61 6e 6e 65 72 20 61 6e 64 20 72 65 70 6f  planner and repo
6290: 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 74  rt the results t
62a0: 6f 20 74 68 65 20 75 73 65 72 2e 20 20 2a 2f 0a  o the user.  */.
62b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
62c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
62d0: 69 64 78 46 69 6e 64 49 6e 64 65 78 65 73 28 26  idxFindIndexes(&
62e0: 63 74 78 2c 20 7a 53 71 6c 2c 20 78 4f 75 74 2c  ctx, zSql, xOut,
62f0: 20 70 4f 75 74 43 74 78 2c 20 70 7a 45 72 72 6d   pOutCtx, pzErrm
6300: 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 69 64 78 53  sg);.  }..  idxS
6310: 63 61 6e 46 72 65 65 28 63 74 78 2e 70 53 63 61  canFree(ctx.pSca
6320: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  n);.  sqlite3_fi
6330: 6e 61 6c 69 7a 65 28 63 74 78 2e 70 49 6e 73 65  nalize(ctx.pInse
6340: 72 74 4d 61 73 6b 29 3b 0a 20 20 73 71 6c 69 74  rtMask);.  sqlit
6350: 65 33 5f 63 6c 6f 73 65 28 64 62 6d 29 3b 0a 20  e3_close(dbm);. 
6360: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...