/ Hex Artifact Content
Login

Artifact d40ea0a81112df7bdccd7232238bee0bbb39699085ea78cc08fd863bf052a63b:


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 28  =? AND b=? AND (
05d0: 28 63 3d 3f 20 41 4e 44 20 64 3d 3f 29 20 4f 52  (c=? AND d=?) OR
05e0: 20 65 3d 3f 29 20 41 4e 44 20 28 66 3d 3f 20 4f   e=?) AND (f=? O
05f0: 52 20 67 3d 3f 29 20 41 4e 44 20 68 3e 3f 0a 2a  R g=?) AND h>?.*
0600: 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69  *.** The above i
0610: 73 20 64 65 63 6f 6d 70 6f 73 65 64 20 69 6e 74  s decomposed int
0620: 6f 20 35 20 41 4e 44 20 63 6f 6e 6e 65 63 74 65  o 5 AND connecte
0630: 64 20 63 6c 61 75 73 65 73 2e 20 54 68 65 20 66  d clauses. The f
0640: 69 72 73 74 20 74 77 6f 20 61 72 65 0a 2a 2a 20  irst two are.** 
0650: 61 64 64 65 64 20 74 6f 20 74 68 65 20 49 64 78  added to the Idx
0660: 57 68 65 72 65 2e 70 45 71 20 6c 69 6e 6b 65 64  Where.pEq linked
0670: 20 6c 69 73 74 2c 20 74 68 65 20 66 6f 6c 6c 6f   list, the follo
0680: 77 69 6e 67 20 74 77 6f 20 69 6e 74 6f 20 0a 2a  wing two into .*
0690: 2a 20 49 64 78 57 68 65 72 65 2e 70 4f 72 20 61  * IdxWhere.pOr a
06a0: 6e 64 20 74 68 65 20 6c 61 73 74 20 69 6e 74 6f  nd the last into
06b0: 20 49 64 78 57 68 65 72 65 2e 70 52 61 6e 67 65   IdxWhere.pRange
06c0: 2e 0a 2a 2a 0a 2a 2a 20 49 64 78 57 68 65 72 65  ..**.** IdxWhere
06d0: 2e 70 45 71 20 61 6e 64 20 49 64 78 57 68 65 72  .pEq and IdxWher
06e0: 65 2e 70 52 61 6e 67 65 20 61 72 65 20 73 69 6d  e.pRange are sim
06f0: 70 6c 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 73  ple linked lists
0700: 20 6f 66 20 49 64 78 43 6f 6e 73 74 72 61 69 6e   of IdxConstrain
0710: 74 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 6c 69 6e  t.** objects lin
0720: 6b 65 64 20 62 79 20 74 68 65 20 49 64 78 43 6f  ked by the IdxCo
0730: 6e 73 74 72 61 69 6e 74 2e 70 4e 65 78 74 20 66  nstraint.pNext f
0740: 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ield..**.** The 
0750: 6c 69 73 74 20 68 65 61 64 65 64 20 61 74 20 49  list headed at I
0760: 64 78 57 68 65 72 65 2e 70 4f 72 20 61 6e 64 20  dxWhere.pOr and 
0770: 6c 69 6e 6b 65 64 20 62 79 20 49 64 78 57 68 65  linked by IdxWhe
0780: 72 65 2e 70 4e 65 78 74 4f 72 20 63 6f 6e 74 61  re.pNextOr conta
0790: 69 6e 73 0a 2a 2a 20 61 6c 6c 20 22 4f 52 22 20  ins.** all "OR" 
07a0: 74 65 72 6d 73 20 74 68 61 74 20 62 65 6c 6f 6e  terms that belon
07b0: 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
07c0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 49   WHERE clause. I
07d0: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 0a 2a 2a  n the example.**
07e0: 20 61 62 6f 76 65 2c 20 74 68 65 72 65 20 61 72   above, there ar
07f0: 65 20 74 77 6f 20 4f 52 20 74 65 72 6d 73 3a 0a  e two OR terms:.
0800: 2a 2a 0a 2a 2a 20 20 20 28 28 63 3d 3f 20 41 4e  **.**   ((c=? AN
0810: 44 20 64 3d 3f 29 20 4f 52 20 65 3d 3f 29 0a 2a  D d=?) OR e=?).*
0820: 2a 20 20 20 28 66 3d 3f 20 4f 52 20 67 3d 3f 29  *   (f=? OR g=?)
0830: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 61 6e  .**.** Within an
0840: 20 4f 52 20 74 65 72 6d 2c 20 74 68 65 20 4f 52   OR term, the OR
0850: 20 63 6f 6e 6e 65 63 74 65 64 20 73 75 62 2d 65   connected sub-e
0860: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
0870: 65 72 6d 65 64 20 73 69 62 6c 69 6e 67 73 2e 0a  ermed siblings..
0880: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 63 6f 6e  ** These are con
0890: 6e 65 63 74 65 64 20 69 6e 74 6f 20 61 20 6c 69  nected into a li
08a0: 6e 6b 65 64 20 6c 69 73 74 20 62 79 20 74 68 65  nked list by the
08b0: 20 70 53 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65   pSibling pointe
08c0: 72 73 2e 20 45 61 63 68 20 4f 52 0a 2a 2a 20 74  rs. Each OR.** t
08d0: 65 72 6d 20 61 62 6f 76 65 20 63 6f 6e 73 69 73  erm above consis
08e0: 74 73 20 6f 66 20 74 77 6f 20 73 69 62 6c 69 6e  ts of two siblin
08f0: 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 4f 72 20  gs..**.**   pOr 
0900: 2d 3e 20 28 63 3d 3f 20 41 4e 44 20 64 3d 3f 29  -> (c=? AND d=?)
0910: 20 2d 3e 20 70 4e 65 78 74 4f 72 20 2d 3e 20 28   -> pNextOr -> (
0920: 66 3d 3f 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  f=?).**         
0930: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
0950: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 70  .**            p
0960: 53 69 62 6c 69 6e 67 20 20 20 20 20 20 20 20 20  Sibling         
0970: 20 20 20 20 20 20 20 20 70 53 69 62 6c 69 6e 67          pSibling
0980: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0990: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
09a0: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 56 0a 2a 2a 20 20 20 20 20         V.**     
09e0: 20 20 20 20 20 20 20 20 28 65 3d 3f 29 20 20 20          (e=?)   
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 28 67 3d 3f 29 0a 2a 2a 0a 2a 2a 20 49 64 78   (g=?).**.** Idx
0a10: 57 68 65 72 65 2e 70 50 61 72 65 6e 74 20 69 73  Where.pParent is
0a20: 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 69 6c 65   only used while
0a30: 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20   constructing a 
0a40: 74 72 65 65 20 6f 66 20 49 64 78 57 68 65 72 65  tree of IdxWhere
0a50: 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 2e   .** structures.
0a60: 20 49 74 20 69 73 20 4e 55 4c 4c 20 66 6f 72 20   It is NULL for 
0a70: 74 68 65 20 72 6f 6f 74 20 49 64 78 57 68 65 72  the root IdxWher
0a80: 65 2e 20 46 6f 72 20 61 6c 6c 20 6f 74 68 65 72  e. For all other
0a90: 73 2c 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a  s, the parent.**
0aa0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
0ab0: 2f 0a 73 74 72 75 63 74 20 49 64 78 57 68 65 72  /.struct IdxWher
0ac0: 65 20 7b 0a 20 20 49 64 78 43 6f 6e 73 74 72 61  e {.  IdxConstra
0ad0: 69 6e 74 20 2a 70 45 71 3b 20 20 20 20 20 20 20  int *pEq;       
0ae0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
0af0: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
0b00: 2a 2f 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69  */.  IdxConstrai
0b10: 6e 74 20 2a 70 52 61 6e 67 65 3b 20 20 20 20 20  nt *pRange;     
0b20: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
0b30: 3c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  < constraints */
0b40: 0a 20 20 49 64 78 57 68 65 72 65 20 2a 70 4f 72  .  IdxWhere *pOr
0b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0b60: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 4f 52     /* List of OR
0b70: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
0b80: 20 20 49 64 78 57 68 65 72 65 20 2a 70 4e 65 78    IdxWhere *pNex
0b90: 74 4f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tOr;            
0ba0: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 4f 52 20    /* Next in OR 
0bb0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 73  constraints of s
0bc0: 61 6d 65 20 49 64 78 57 68 65 72 65 20 2a 2f 0a  ame IdxWhere */.
0bd0: 20 20 49 64 78 57 68 65 72 65 20 2a 70 53 69 62    IdxWhere *pSib
0be0: 6c 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20  ling;           
0bf0: 20 20 2f 2a 20 4e 65 78 74 20 62 72 61 6e 63 68    /* Next branch
0c00: 20 69 6e 20 73 69 6e 67 6c 65 20 4f 52 20 63 6f   in single OR co
0c10: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 49 64  nstraint */.  Id
0c20: 78 57 68 65 72 65 20 2a 70 50 61 72 65 6e 74 3b  xWhere *pParent;
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c40: 20 50 61 72 65 6e 74 20 6f 62 6a 65 63 74 20 28   Parent object (
0c50: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 7d 3b 0a 0a  or NULL) */.};..
0c60: 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73  /*.** A single s
0c70: 63 61 6e 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  can of a single 
0c80: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
0c90: 20 49 64 78 53 63 61 6e 20 7b 0a 20 20 49 64 78   IdxScan {.  Idx
0ca0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20  Table *pTable;  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0cc0: 54 61 62 6c 65 2d 69 6e 66 6f 20 2a 2f 0a 20 20  Table-info */.  
0cd0: 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20  char *zTable;   
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cf0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
0d00: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 69 6e   to scan */.  in
0d10: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d30: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   Database contai
0d40: 6e 69 6e 67 20 74 61 62 6c 65 20 7a 54 61 62 6c  ning table zTabl
0d50: 65 20 2a 2f 0a 20 20 69 36 34 20 63 6f 76 65 72  e */.  i64 cover
0d60: 69 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ing;            
0d70: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
0d80: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 71 75 69 72  f columns requir
0d90: 65 64 20 66 6f 72 20 63 6f 76 2e 20 69 6e 64 65  ed for cov. inde
0da0: 78 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73 74 72  x */.  IdxConstr
0db0: 61 69 6e 74 20 2a 70 4f 72 64 65 72 3b 20 20 20  aint *pOrder;   
0dc0: 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20         /* ORDER 
0dd0: 42 59 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  BY columns */.  
0de0: 49 64 78 57 68 65 72 65 20 77 68 65 72 65 3b 20  IdxWhere where; 
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 2f 2a 20 57 48 45 52 45 20 43 6f 6e 73 74 72 61  /* WHERE Constra
0e10: 69 6e 74 73 20 2a 2f 0a 20 20 49 64 78 53 63 61  ints */.  IdxSca
0e20: 6e 20 2a 70 4e 65 78 74 53 63 61 6e 3b 20 20 20  n *pNextScan;   
0e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
0e40: 74 20 49 64 78 53 63 61 6e 20 6f 62 6a 65 63 74  t IdxScan object
0e50: 20 66 6f 72 20 73 61 6d 65 20 71 75 65 72 79 20   for same query 
0e60: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
0e70: 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73  text object pass
0e80: 65 64 20 74 6f 20 69 64 78 57 68 65 72 65 49 6e  ed to idxWhereIn
0e90: 66 6f 28 29 20 61 6e 64 20 6f 74 68 65 72 20 66  fo() and other f
0ea0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72  unctions..*/.str
0eb0: 75 63 74 20 49 64 78 43 6f 6e 74 65 78 74 20 7b  uct IdxContext {
0ec0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d  .  char **pzErrm
0ed0: 73 67 3b 0a 20 20 49 64 78 57 68 65 72 65 20 2a  sg;.  IdxWhere *
0ee0: 70 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  pCurrent;       
0ef0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
0f00: 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 2a 2f   where clause */
0f10: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
0f40: 20 28 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f   (if error has o
0f50: 63 63 75 72 72 65 64 29 20 2a 2f 0a 20 20 49 64  ccurred) */.  Id
0f60: 78 53 63 61 6e 20 2a 70 53 63 61 6e 3b 20 20 20  xScan *pScan;   
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f80: 20 4c 69 73 74 20 6f 66 20 73 63 61 6e 20 6f 62   List of scan ob
0f90: 6a 65 63 74 73 20 2a 2f 0a 20 20 73 71 6c 69 74  jects */.  sqlit
0fa0: 65 33 20 2a 64 62 6d 3b 20 20 20 20 20 20 20 20  e3 *dbm;        
0fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0fc0: 2d 6d 65 6d 6f 72 79 20 64 62 20 66 6f 72 20 74  -memory db for t
0fd0: 68 69 73 20 61 6e 61 6c 79 73 69 73 20 2a 2f 0a  his analysis */.
0fe0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1000: 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 62 61    /* User databa
1010: 73 65 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69  se under analysi
1020: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  s */.  sqlite3_s
1030: 74 6d 74 20 2a 70 49 6e 73 65 72 74 4d 61 73 6b  tmt *pInsertMask
1040: 3b 20 20 20 20 20 20 2f 2a 20 54 6f 20 77 72 69  ;      /* To wri
1050: 74 65 20 74 6f 20 61 75 78 2e 64 65 70 6d 61 73  te to aux.depmas
1060: 6b 20 2a 2f 0a 20 20 69 36 34 20 69 49 64 78 52  k */.  i64 iIdxR
1070: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
1080: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1090: 6f 66 20 66 69 72 73 74 20 69 6e 64 65 78 20 63  of first index c
10a0: 72 65 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  reated */.};../*
10b0: 0a 2a 2a 20 44 61 74 61 20 72 65 67 61 72 64 69  .** Data regardi
10c0: 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 74 61  ng a database ta
10d0: 62 6c 65 2e 20 45 78 74 72 61 63 74 65 64 20 66  ble. Extracted f
10e0: 72 6f 6d 20 22 50 52 41 47 4d 41 20 74 61 62 6c  rom "PRAGMA tabl
10f0: 65 5f 69 6e 66 6f 22 0a 2a 2f 0a 73 74 72 75 63  e_info".*/.struc
1100: 74 20 49 64 78 43 6f 6c 75 6d 6e 20 7b 0a 20 20  t IdxColumn {.  
1110: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
1120: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 69 6e  har *zColl;.  in
1130: 74 20 69 50 6b 3b 0a 7d 3b 0a 73 74 72 75 63 74  t iPk;.};.struct
1140: 20 49 64 78 54 61 62 6c 65 20 7b 0a 20 20 69 6e   IdxTable {.  in
1150: 74 20 6e 43 6f 6c 3b 0a 20 20 49 64 78 43 6f 6c  t nCol;.  IdxCol
1160: 75 6d 6e 20 2a 61 43 6f 6c 3b 0a 7d 3b 0a 0a 2f  umn *aCol;.};../
1170: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
1180: 64 20 72 65 74 75 72 6e 20 6e 42 79 74 65 20 62  d return nByte b
1190: 79 74 65 73 20 6f 66 20 7a 65 72 6f 65 64 20 6d  ytes of zeroed m
11a0: 65 6d 6f 72 79 20 75 73 69 6e 67 20 73 71 6c 69  emory using sqli
11b0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 0a 2a  te3_malloc(). .*
11c0: 2a 20 49 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  * If the allocat
11d0: 69 6f 6e 20 66 61 69 6c 73 2c 20 73 65 74 20 2a  ion fails, set *
11e0: 70 52 63 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  pRc to SQLITE_NO
11f0: 4d 45 4d 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  MEM and return N
1200: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ULL..*/.static v
1210: 6f 69 64 20 2a 69 64 78 4d 61 6c 6c 6f 63 28 69  oid *idxMalloc(i
1220: 6e 74 20 2a 70 52 63 2c 20 69 6e 74 20 6e 42 79  nt *pRc, int nBy
1230: 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  te){.  void *pRe
1240: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  t;.  assert( *pR
1250: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1260: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
1270: 30 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 73 71  0 );.  pRet = sq
1280: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
1290: 74 65 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20  te);.  if( pRet 
12a0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52  ){.    memset(pR
12b0: 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  et, 0, nByte);. 
12c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 63   }else{.    *pRc
12d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
12f0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  et;.}../*.** All
1300: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
1310: 20 61 20 6e 65 77 20 49 64 78 43 6f 6e 73 74 72   a new IdxConstr
1320: 61 69 6e 74 20 6f 62 6a 65 63 74 2e 20 53 65 74  aint object. Set
1330: 20 74 68 65 20 49 64 78 43 6f 6e 73 74 72 61 69   the IdxConstrai
1340: 6e 74 2e 7a 43 6f 6c 6c 0a 2a 2a 20 76 61 72 69  nt.zColl.** vari
1350: 61 62 6c 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  able to point to
1360: 20 61 20 63 6f 70 79 20 6f 66 20 6e 75 6c 2d 74   a copy of nul-t
1370: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
1380: 20 7a 43 6f 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69   zColl..*/.stati
1390: 63 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20  c IdxConstraint 
13a0: 2a 69 64 78 4e 65 77 43 6f 6e 73 74 72 61 69 6e  *idxNewConstrain
13b0: 74 28 69 6e 74 20 2a 70 52 63 2c 20 63 6f 6e 73  t(int *pRc, cons
13c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 29 7b 0a  t char *zColl){.
13d0: 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
13e0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 6f  *pNew;.  int nCo
13f0: 6c 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  ll = strlen(zCol
1400: 6c 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  l);..  assert( *
1410: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
1420: 3b 0a 20 20 70 4e 65 77 20 3d 20 28 49 64 78 43  ;.  pNew = (IdxC
1430: 6f 6e 73 74 72 61 69 6e 74 2a 29 69 64 78 4d 61  onstraint*)idxMa
1440: 6c 6c 6f 63 28 70 52 63 2c 20 73 69 7a 65 6f 66  lloc(pRc, sizeof
1450: 28 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 29 20  (IdxConstraint) 
1460: 2a 20 6e 43 6f 6c 6c 20 2b 20 31 29 3b 0a 20 20  * nColl + 1);.  
1470: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1480: 70 4e 65 77 2d 3e 7a 43 6f 6c 6c 20 3d 20 28 63  pNew->zColl = (c
1490: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
14a0: 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e     memcpy(pNew->
14b0: 7a 43 6f 6c 6c 2c 20 7a 43 6f 6c 6c 2c 20 6e 43  zColl, zColl, nC
14c0: 6f 6c 6c 2b 31 29 3b 0a 20 20 7d 0a 20 20 72 65  oll+1);.  }.  re
14d0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
14e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  .** SQLITE_DBCON
14f0: 46 49 47 5f 57 48 45 52 45 49 4e 46 4f 20 63 61  FIG_WHEREINFO ca
1500: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
1510: 63 20 76 6f 69 64 20 69 64 78 57 68 65 72 65 49  c void idxWhereI
1520: 6e 66 6f 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  nfo(.  void *pCt
1530: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
1540: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1550: 72 20 74 6f 20 49 64 78 43 6f 6e 74 65 78 74 20  r to IdxContext 
1560: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
1570: 6e 74 20 65 4f 70 2c 20 0a 20 20 63 6f 6e 73 74  nt eOp, .  const
1580: 20 63 68 61 72 20 2a 7a 56 61 6c 2c 20 0a 20 20   char *zVal, .  
1590: 69 6e 74 20 69 56 61 6c 2c 20 0a 20 20 75 36 34  int iVal, .  u64
15a0: 20 6d 61 73 6b 0a 29 7b 0a 20 20 49 64 78 43 6f   mask.){.  IdxCo
15b0: 6e 74 65 78 74 20 2a 70 20 3d 20 28 49 64 78 43  ntext *p = (IdxC
15c0: 6f 6e 74 65 78 74 2a 29 70 43 74 78 3b 0a 0a 23  ontext*)pCtx;..#
15d0: 69 66 20 30 0a 20 20 63 6f 6e 73 74 20 63 68 61  if 0.  const cha
15e0: 72 20 2a 7a 4f 70 20 3d 20 0a 20 20 20 20 65 4f  r *zOp = .    eO
15f0: 70 3d 3d 53 51 4c 49 54 45 5f 57 48 45 52 45 49  p==SQLITE_WHEREI
1600: 4e 46 4f 5f 54 41 42 4c 45 20 3f 20 22 54 41 42  NFO_TABLE ? "TAB
1610: 4c 45 22 20 3a 0a 20 20 20 20 65 4f 70 3d 3d 53  LE" :.    eOp==S
1620: 51 4c 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f  QLITE_WHEREINFO_
1630: 45 51 55 41 4c 53 20 3f 20 22 45 51 55 41 4c 53  EQUALS ? "EQUALS
1640: 22 20 3a 0a 20 20 20 20 65 4f 70 3d 3d 53 51 4c  " :.    eOp==SQL
1650: 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 52 41  ITE_WHEREINFO_RA
1660: 4e 47 45 20 3f 20 22 52 41 4e 47 45 22 20 3a 0a  NGE ? "RANGE" :.
1670: 20 20 20 20 65 4f 70 3d 3d 53 51 4c 49 54 45 5f      eOp==SQLITE_
1680: 57 48 45 52 45 49 4e 46 4f 5f 4f 52 44 45 52 42  WHEREINFO_ORDERB
1690: 59 20 3f 20 22 4f 52 44 45 52 42 59 22 20 3a 0a  Y ? "ORDERBY" :.
16a0: 20 20 20 20 22 21 65 72 72 6f 72 21 22 3b 0a 20      "!error!";. 
16b0: 20 70 72 69 6e 74 66 28 22 6f 70 3d 25 73 20 7a   printf("op=%s z
16c0: 56 61 6c 3d 25 73 20 69 56 61 6c 3d 25 64 20 6d  Val=%s iVal=%d m
16d0: 61 73 6b 3d 25 6c 6c 78 5c 6e 22 2c 20 7a 4f 70  ask=%llx\n", zOp
16e0: 2c 20 7a 56 61 6c 2c 20 69 56 61 6c 2c 20 6d 61  , zVal, iVal, ma
16f0: 73 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  sk);.#endif..  i
1700: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1710: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1720: 74 28 20 65 4f 70 3d 3d 53 51 4c 49 54 45 5f 57  t( eOp==SQLITE_W
1730: 48 45 52 45 49 4e 46 4f 5f 54 41 42 4c 45 20 7c  HEREINFO_TABLE |
1740: 7c 20 70 2d 3e 70 53 63 61 6e 21 3d 30 20 29 3b  | p->pScan!=0 );
1750: 0a 20 20 20 20 73 77 69 74 63 68 28 20 65 4f 70  .    switch( eOp
1760: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
1770: 51 4c 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f  QLITE_WHEREINFO_
1780: 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20  TABLE: {.       
1790: 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 74 72 6c   int nVal = strl
17a0: 65 6e 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  en(zVal);.      
17b0: 20 20 49 64 78 53 63 61 6e 20 2a 70 4e 65 77 20    IdxScan *pNew 
17c0: 3d 20 28 49 64 78 53 63 61 6e 2a 29 69 64 78 4d  = (IdxScan*)idxM
17d0: 61 6c 6c 6f 63 28 26 70 2d 3e 72 63 2c 20 73 69  alloc(&p->rc, si
17e0: 7a 65 6f 66 28 49 64 78 53 63 61 6e 29 20 2b 20  zeof(IdxScan) + 
17f0: 6e 56 61 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20  nVal + 1);.     
1800: 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 72     if( !pNew ) r
1810: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70  eturn;.        p
1820: 4e 65 77 2d 3e 7a 54 61 62 6c 65 20 3d 20 28 63  New->zTable = (c
1830: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
1840: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e         memcpy(pN
1850: 65 77 2d 3e 7a 54 61 62 6c 65 2c 20 7a 56 61 6c  ew->zTable, zVal
1860: 2c 20 6e 56 61 6c 2b 31 29 3b 0a 20 20 20 20 20  , nVal+1);.     
1870: 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 53 63     pNew->pNextSc
1880: 61 6e 20 3d 20 70 2d 3e 70 53 63 61 6e 3b 0a 20  an = p->pScan;. 
1890: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 63 6f 76         pNew->cov
18a0: 65 72 69 6e 67 20 3d 20 6d 61 73 6b 3b 0a 20 20  ering = mask;.  
18b0: 20 20 20 20 20 20 70 2d 3e 70 53 63 61 6e 20 3d        p->pScan =
18c0: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70   pNew;.        p
18d0: 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 26 70 4e  ->pCurrent = &pN
18e0: 65 77 2d 3e 77 68 65 72 65 3b 0a 20 20 20 20 20  ew->where;.     
18f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1900: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  }..      case SQ
1910: 4c 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 4f  LITE_WHEREINFO_O
1920: 52 44 45 52 42 59 3a 20 7b 0a 20 20 20 20 20 20  RDERBY: {.      
1930: 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
1940: 2a 70 4e 65 77 20 3d 20 69 64 78 4e 65 77 43 6f  *pNew = idxNewCo
1950: 6e 73 74 72 61 69 6e 74 28 26 70 2d 3e 72 63 2c  nstraint(&p->rc,
1960: 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
1970: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
1980: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e  turn;.        pN
1990: 65 77 2d 3e 69 43 6f 6c 20 3d 20 69 56 61 6c 3b  ew->iCol = iVal;
19a0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  .        pNew->b
19b0: 44 65 73 63 20 3d 20 28 69 6e 74 29 6d 61 73 6b  Desc = (int)mask
19c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
19d0: 3e 70 53 63 61 6e 2d 3e 70 4f 72 64 65 72 3d 3d  >pScan->pOrder==
19e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
19f0: 2d 3e 70 53 63 61 6e 2d 3e 70 4f 72 64 65 72 20  ->pScan->pOrder 
1a00: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
1a10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a20: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
1a30: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20  pIter;.         
1a40: 20 66 6f 72 28 70 49 74 65 72 3d 70 2d 3e 70 53   for(pIter=p->pS
1a50: 63 61 6e 2d 3e 70 4f 72 64 65 72 3b 20 70 49 74  can->pOrder; pIt
1a60: 65 72 2d 3e 70 4e 65 78 74 3b 20 70 49 74 65 72  er->pNext; pIter
1a70: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 3b 0a  =pIter->pNext);.
1a80: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
1a90: 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20  >pNext = pNew;. 
1aa0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
1ab0: 70 4c 69 6e 6b 20 3d 20 70 4e 65 77 3b 0a 20 20  pLink = pNew;.  
1ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ad0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1ae0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1af0: 45 5f 57 48 45 52 45 49 4e 46 4f 5f 45 51 55 41  E_WHEREINFO_EQUA
1b00: 4c 53 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53  LS:.      case S
1b10: 51 4c 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f  QLITE_WHEREINFO_
1b20: 52 41 4e 47 45 3a 20 7b 0a 20 20 20 20 20 20 20  RANGE: {.       
1b30: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
1b40: 70 4e 65 77 20 3d 20 69 64 78 4e 65 77 43 6f 6e  pNew = idxNewCon
1b50: 73 74 72 61 69 6e 74 28 26 70 2d 3e 72 63 2c 20  straint(&p->rc, 
1b60: 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  zVal);.        i
1b70: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
1b80: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
1b90: 77 2d 3e 69 43 6f 6c 20 3d 20 69 56 61 6c 3b 0a  w->iCol = iVal;.
1ba0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 64 65          pNew->de
1bb0: 70 6d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20  pmask = mask;.. 
1bc0: 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
1bd0: 53 51 4c 49 54 45 5f 57 48 45 52 45 49 4e 46 4f  SQLITE_WHEREINFO
1be0: 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
1bf0: 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
1c00: 3d 20 70 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70  = p->pCurrent->p
1c10: 52 61 6e 67 65 3b 0a 20 20 20 20 20 20 20 20 20  Range;.         
1c20: 20 70 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70 52   p->pCurrent->pR
1c30: 61 6e 67 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  ange = pNew;.   
1c40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c50: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
1c60: 74 20 3d 20 70 2d 3e 70 43 75 72 72 65 6e 74 2d  t = p->pCurrent-
1c70: 3e 70 45 71 3b 0a 20 20 20 20 20 20 20 20 20 20  >pEq;.          
1c80: 70 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70 45 71  p->pCurrent->pEq
1c90: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
1ca0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69   }..        sqli
1cb0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
1cc0: 2d 3e 70 49 6e 73 65 72 74 4d 61 73 6b 2c 20 31  ->pInsertMask, 1
1cd0: 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  , mask);.       
1ce0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
1cf0: 3e 70 49 6e 73 65 72 74 4d 61 73 6b 29 3b 0a 20  >pInsertMask);. 
1d00: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
1d10: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
1d20: 70 49 6e 73 65 72 74 4d 61 73 6b 29 3b 0a 20 20  pInsertMask);.  
1d30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1d50: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  ../*.** An error
1d60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1d70: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1d80: 20 64 62 20 68 61 73 20 6a 75 73 74 20 6f 63 63   db has just occ
1d90: 75 72 72 65 64 2e 20 50 61 73 73 0a 2a 2a 20 74  urred. Pass.** t
1da0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1db0: 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e   to callback fun
1dc0: 63 74 69 6f 6e 20 78 4f 75 74 2e 0a 2a 2f 0a 73  ction xOut..*/.s
1dd0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 78 44 61  tatic void idxDa
1de0: 74 61 62 61 73 65 45 72 72 6f 72 28 0a 20 20 73  tabaseError(.  s
1df0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e10: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
1e20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
1e30: 45 72 72 6d 73 67 20 20 20 20 20 20 20 20 20 20  Errmsg          
1e40: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1e50: 65 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  error here */.){
1e60: 0a 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d 20 73  .  *pzErrmsg = s
1e70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1e80: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
1e90: 6d 73 67 28 64 62 29 29 3b 0a 7d 0a 0a 73 74 61  msg(db));.}..sta
1ea0: 74 69 63 20 63 68 61 72 20 2a 69 64 78 51 75 65  tic char *idxQue
1eb0: 72 79 54 6f 4c 69 73 74 28 0a 20 20 73 71 6c 69  ryToList(.  sqli
1ec0: 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73  te3 *db, .  cons
1ed0: 74 20 63 68 61 72 20 2a 7a 42 69 6e 64 2c 0a 20  t char *zBind,. 
1ee0: 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 63 68 61   int *pRc,.  cha
1ef0: 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a 20 20  r **pzErrmsg,.  
1f00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
1f10: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74  .){.  char *zRet
1f20: 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
1f30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f40: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
1f50: 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  *pStmt = 0;.    
1f60: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1f70: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
1f80: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
1f90: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1fa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1fc0: 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
1fd0: 20 7a 42 69 6e 64 2c 20 2d 31 2c 20 53 51 4c 49   zBind, -1, SQLI
1fe0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1ff0: 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
2000: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c  SQLITE_OK && sql
2010: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2020: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2030: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2040: 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ar *z = (const c
2050: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2060: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
2070: 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  0);.        zRet
2080: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2090: 74 66 28 22 25 7a 25 73 25 51 22 2c 20 7a 52 65  tf("%z%s%Q", zRe
20a0: 74 2c 20 7a 52 65 74 3f 22 2c 20 22 3a 22 22 2c  t, zRet?", ":"",
20b0: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
20c0: 20 7a 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zRet==0 ){.    
20d0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
20f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2100: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
2110: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2120: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
2130: 20 29 7b 0a 20 20 20 20 20 20 69 64 78 44 61 74   ){.      idxDat
2140: 61 62 61 73 65 45 72 72 6f 72 28 64 62 2c 20 70  abaseError(db, p
2150: 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  zErrmsg);.      
2160: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65  sqlite3_free(zRe
2170: 74 29 3b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d  t);.      zRet =
2180: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70   0;.    }.    *p
2190: 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  Rc = rc;.  }..  
21a0: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a  return zRet;.}..
21b0: 73 74 61 74 69 63 20 69 6e 74 20 69 64 78 50 72  static int idxPr
21c0: 65 70 61 72 65 53 74 6d 74 28 0a 20 20 73 71 6c  epareStmt(.  sql
21d0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f0: 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
2200: 74 6f 20 63 6f 6d 70 69 6c 65 20 61 67 61 69 6e  to compile again
2210: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
2220: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 20 20  stmt **ppStmt,  
2230: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2240: 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73 74 61  Compiled SQL sta
2250: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72  tement */.  char
2260: 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 20 20 20 20   **pzErrmsg,    
2270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2280: 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  UT: sqlite3_mall
2290: 6f 63 28 29 65 64 20 65 72 72 6f 72 20 6d 65 73  oc()ed error mes
22a0: 73 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  sage */.  const 
22b0: 63 68 61 72 20 2a 7a 53 71 6c 20 20 20 20 20 20  char *zSql      
22c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
22d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f   statement to co
22e0: 6d 70 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  mpile */.){.  in
22f0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70  t rc = sqlite3_p
2300: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
2310: 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
2320: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
2330: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2340: 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  ppStmt = 0;.    
2350: 69 64 78 44 61 74 61 62 61 73 65 45 72 72 6f 72  idxDatabaseError
2360: 28 64 62 2c 20 70 7a 45 72 72 6d 73 67 29 3b 0a  (db, pzErrmsg);.
2370: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2380: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .}..static int i
2390: 64 78 50 72 69 6e 74 66 50 72 65 70 61 72 65 53  dxPrintfPrepareS
23a0: 74 6d 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  tmt(.  sqlite3 *
23b0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
23c0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
23d0: 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 63 6f 6d  se handle to com
23e0: 70 69 6c 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pile against */.
23f0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2400: 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20 20 20  *ppStmt,        
2410: 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70 69 6c    /* OUT: Compil
2420: 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ed SQL statement
2430: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
2440: 72 72 6d 73 67 2c 20 20 20 20 20 20 20 20 20 20  rrmsg,          
2450: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 73 71        /* OUT: sq
2460: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 65 64  lite3_malloc()ed
2470: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   error message *
2480: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2490: 7a 46 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  zFmt,           
24a0: 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 29 20      /* printf() 
24b0: 66 6f 72 6d 61 74 20 6f 66 20 53 51 4c 20 73 74  format of SQL st
24c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 2e 2e 2e  atement */.  ...
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f0: 54 72 61 69 6c 69 6e 67 20 70 72 69 6e 74 66 28  Trailing printf(
2500: 29 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  ) arguments */.)
2510: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2520: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2530: 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73 74 61   *zSql;.  va_sta
2540: 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
2550: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  zSql = sqlite3_v
2560: 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70  mprintf(zFmt, ap
2570: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
2580: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2590: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
25a0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 69 64 78  se{.    rc = idx
25b0: 50 72 65 70 61 72 65 53 74 6d 74 28 64 62 2c 20  PrepareStmt(db, 
25c0: 70 70 53 74 6d 74 2c 20 70 7a 45 72 72 6d 73 67  ppStmt, pzErrmsg
25d0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c  , zSql);.    sql
25e0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
25f0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
2600: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2610: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  }..static int id
2620: 78 47 65 74 54 61 62 6c 65 49 6e 66 6f 28 0a 20  xGetTableInfo(. 
2630: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
2640: 49 64 78 53 63 61 6e 20 2a 70 53 63 61 6e 2c 0a  IdxScan *pScan,.
2650: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73    char **pzErrms
2660: 67 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  g.){.  const cha
2670: 72 20 2a 7a 54 62 6c 20 3d 20 70 53 63 61 6e 2d  r *zTbl = pScan-
2680: 3e 7a 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74  >zTable;.  sqlit
2690: 65 33 5f 73 74 6d 74 20 2a 70 31 20 3d 20 30 3b  e3_stmt *p1 = 0;
26a0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b  .  int nCol = 0;
26b0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73  .  int nByte = s
26c0: 69 7a 65 6f 66 28 49 64 78 54 61 62 6c 65 29 3b  izeof(IdxTable);
26d0: 0a 20 20 49 64 78 54 61 62 6c 65 20 2a 70 4e 65  .  IdxTable *pNe
26e0: 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 2c  w = 0;.  int rc,
26f0: 20 72 63 32 3b 0a 20 20 63 68 61 72 20 2a 70 43   rc2;.  char *pC
2700: 73 72 3b 0a 0a 20 20 72 63 20 3d 20 69 64 78 50  sr;..  rc = idxP
2710: 72 69 6e 74 66 50 72 65 70 61 72 65 53 74 6d 74  rintfPrepareStmt
2720: 28 64 62 2c 20 26 70 31 2c 20 70 7a 45 72 72 6d  (db, &p1, pzErrm
2730: 73 67 2c 20 22 50 52 41 47 4d 41 20 74 61 62 6c  sg, "PRAGMA tabl
2740: 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 62 6c  e_info=%Q", zTbl
2750: 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
2760: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
2770: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2780: 5f 73 74 65 70 28 70 31 29 20 29 7b 0a 20 20 20  _step(p1) ){.   
2790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
27a0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
27b0: 6d 6e 5f 74 65 78 74 28 70 31 2c 20 31 29 3b 0a  mn_text(p1, 1);.
27c0: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 31 20 2b      nByte += 1 +
27d0: 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20   strlen(zCol);. 
27e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
27f0: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
2800: 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 64  adata(.        d
2810: 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 54 62 6c 2c  b, "main", zTbl,
2820: 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f 6c 2c   zCol, 0, &zCol,
2830: 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a   0, 0, 0.    );.
2840: 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 31 20 2b      nByte += 1 +
2850: 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b 0a 20   strlen(zCol);. 
2860: 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20     nCol++;.  }. 
2870: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72   rc2 = sqlite3_r
2880: 65 73 65 74 28 70 31 29 3b 0a 20 20 69 66 28 20  eset(p1);.  if( 
2890: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
28a0: 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 6e 42 79  rc = rc2;..  nBy
28b0: 74 65 20 2b 3d 20 73 69 7a 65 6f 66 28 49 64 78  te += sizeof(Idx
28c0: 43 6f 6c 75 6d 6e 29 20 2a 20 6e 43 6f 6c 3b 0a  Column) * nCol;.
28d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  _OK ){.    pNew 
28f0: 3d 20 69 64 78 4d 61 6c 6c 6f 63 28 26 72 63 2c  = idxMalloc(&rc,
2900: 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 69   nByte);.  }.  i
2910: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2920: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 43   ){.    pNew->aC
2930: 6f 6c 20 3d 20 28 49 64 78 43 6f 6c 75 6d 6e 2a  ol = (IdxColumn*
2940: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 70  )&pNew[1];.    p
2950: 4e 65 77 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  New->nCol = nCol
2960: 3b 0a 20 20 20 20 70 43 73 72 20 3d 20 28 63 68  ;.    pCsr = (ch
2970: 61 72 2a 29 26 70 4e 65 77 2d 3e 61 43 6f 6c 5b  ar*)&pNew->aCol[
2980: 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20 6e 43  nCol];.  }..  nC
2990: 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ol = 0;.  while(
29a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
29b0: 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
29c0: 6c 69 74 65 33 5f 73 74 65 70 28 70 31 29 20 29  lite3_step(p1) )
29d0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
29e0: 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33   *zCol = sqlite3
29f0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 31 2c  _column_text(p1,
2a00: 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f   1);.    int nCo
2a10: 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a 43 6f 6c  py = strlen(zCol
2a20: 29 20 2b 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d  ) + 1;.    pNew-
2a30: 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[nCol].zNam
2a40: 65 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 70 4e  e = pCsr;.    pN
2a50: 65 77 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 2e 69  ew->aCol[nCol].i
2a60: 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  Pk = sqlite3_col
2a70: 75 6d 6e 5f 69 6e 74 28 70 31 2c 20 35 29 3b 0a  umn_int(p1, 5);.
2a80: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 73 72 2c      memcpy(pCsr,
2a90: 20 7a 43 6f 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20   zCol, nCopy);. 
2aa0: 20 20 20 70 43 73 72 20 2b 3d 20 6e 43 6f 70 79     pCsr += nCopy
2ab0: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2ac0: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
2ad0: 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20 20 20  _metadata(.     
2ae0: 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a     db, "main", z
2af0: 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a  Tbl, zCol, 0, &z
2b00: 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20  Col, 0, 0, 0.   
2b10: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
2b20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b30: 20 20 20 6e 43 6f 70 79 20 3d 20 73 74 72 6c 65     nCopy = strle
2b40: 6e 28 7a 43 6f 6c 29 20 2b 20 31 3b 0a 20 20 20  n(zCol) + 1;.   
2b50: 20 20 20 70 4e 65 77 2d 3e 61 43 6f 6c 5b 6e 43     pNew->aCol[nC
2b60: 6f 6c 5d 2e 7a 43 6f 6c 6c 20 3d 20 70 43 73 72  ol].zColl = pCsr
2b70: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
2b80: 43 73 72 2c 20 7a 43 6f 6c 2c 20 6e 43 6f 70 79  Csr, zCol, nCopy
2b90: 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20 2b 3d  );.      pCsr +=
2ba0: 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 0a 20   nCopy;.    }.. 
2bb0: 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20     nCol++;.  }. 
2bc0: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
2bd0: 69 6e 61 6c 69 7a 65 28 70 31 29 3b 0a 20 20 69  inalize(p1);.  i
2be0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bf0: 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20   ) rc = rc2;..  
2c00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c10: 4b 20 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  K ){.    pScan->
2c20: 70 54 61 62 6c 65 20 3d 20 70 4e 65 77 3b 0a 20  pTable = pNew;. 
2c30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
2c40: 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
2c50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2c60: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
2c70: 69 64 78 43 72 65 61 74 65 54 61 62 6c 65 73 28  idxCreateTables(
2c80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 62     /* User datab
2cb0: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
2cc0: 20 2a 64 62 6d 2c 20 20 20 20 20 20 20 20 20 20   *dbm,          
2cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 2d 6d           /* In-m
2ce0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74  emory database t
2cf0: 6f 20 63 72 65 61 74 65 20 74 61 62 6c 65 73 20  o create tables 
2d00: 69 6e 20 2a 2f 0a 20 20 49 64 78 53 63 61 6e 20  in */.  IdxScan 
2d10: 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 20 20  *pScan,         
2d20: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
2d30: 6f 66 20 73 63 61 6e 73 20 2a 2f 0a 20 20 63 68  of scans */.  ch
2d40: 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 20 20 20  ar **pzErrmsg   
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d60: 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73   OUT: Error mess
2d70: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
2d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d90: 20 20 49 64 78 53 63 61 6e 20 2a 70 49 74 65 72    IdxScan *pIter
2da0: 3b 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 53  ;.  for(pIter=pS
2db0: 63 61 6e 3b 20 70 49 74 65 72 20 26 26 20 72 63  can; pIter && rc
2dc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 49 74  ==SQLITE_OK; pIt
2dd0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 53  er=pIter->pNextS
2de0: 63 61 6e 29 7b 0a 20 20 20 20 72 63 20 3d 20 69  can){.    rc = i
2df0: 64 78 47 65 74 54 61 62 6c 65 49 6e 66 6f 28 64  dxGetTableInfo(d
2e00: 62 2c 20 70 49 74 65 72 2c 20 70 7a 45 72 72 6d  b, pIter, pzErrm
2e10: 73 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 65 73  sg);..    /* Tes
2e20: 74 20 69 66 20 74 61 62 6c 65 20 68 61 73 20 61  t if table has a
2e30: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 72 65 61  lready been crea
2e40: 74 65 64 2e 20 49 66 20 73 6f 2c 20 6a 75 6d 70  ted. If so, jump
2e50: 20 74 6f 20 74 68 65 20 6e 65 78 74 0a 20 20 20   to the next.   
2e60: 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f 66   ** iteration of
2e70: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20   the loop.  */. 
2e80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2ea0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
2eb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2ec0: 20 69 64 78 50 72 69 6e 74 66 50 72 65 70 61 72   idxPrintfPrepar
2ed0: 65 53 74 6d 74 28 64 62 6d 2c 20 26 70 53 71 6c  eStmt(dbm, &pSql
2ee0: 2c 20 70 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  , pzErrmsg, .   
2ef0: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 31         "SELECT 1
2f00: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2f10: 74 65 72 20 57 48 45 52 45 20 74 62 6c 5f 6e 61  ter WHERE tbl_na
2f20: 6d 65 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d  me = %Q", pIter-
2f30: 3e 7a 54 61 62 6c 65 0a 20 20 20 20 20 20 29 3b  >zTable.      );
2f40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f60: 20 20 20 20 69 6e 74 20 62 53 6b 69 70 20 3d 20      int bSkip = 
2f70: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  0;.        if( s
2f80: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
2f90: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  )==SQLITE_ROW ) 
2fa0: 62 53 6b 69 70 20 3d 20 31 3b 0a 20 20 20 20 20  bSkip = 1;.     
2fb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2fc0: 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a  finalize(pSql);.
2fd0: 20 20 20 20 20 20 20 20 69 66 28 20 62 53 6b 69          if( bSki
2fe0: 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
2ff0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3000: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3010: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
3020: 72 63 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rc2;.      sqlit
3030: 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
3040: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 64  0;.      rc = id
3050: 78 50 72 69 6e 74 66 50 72 65 70 61 72 65 53 74  xPrintfPrepareSt
3060: 6d 74 28 64 62 2c 20 26 70 53 71 6c 2c 20 70 7a  mt(db, &pSql, pz
3070: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
3080: 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
3090: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
30a0: 72 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65  r WHERE tbl_name
30b0: 20 3d 20 25 51 22 2c 20 70 49 74 65 72 2d 3e 7a   = %Q", pIter->z
30c0: 54 61 62 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20  Table.      );. 
30d0: 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d       while( rc==
30e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
30f0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
3100: 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
3110: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
3120: 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74  r *zSql = (const
3130: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
3140: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
3150: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   0);.        rc 
3160: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
3170: 62 6d 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  bm, zSql, 0, 0, 
3180: 70 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20 20  pzErrmsg);.     
3190: 20 7d 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73   }.      rc2 = s
31a0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
31b0: 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  pSql);.      if(
31c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31d0: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
31e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
31f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3200: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
3210: 2d 6f 70 20 69 66 20 2a 70 52 63 20 69 73 20 73  -op if *pRc is s
3220: 65 74 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 6f  et to anything o
3230: 74 68 65 72 20 74 68 61 6e 20 0a 2a 2a 20 53 51  ther than .** SQ
3240: 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 69 74 20  LITE_OK when it 
3250: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
3260: 20 49 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74   If *pRc is init
3270: 69 61 6c 6c 79 20 73 65 74 20 74 6f 20 53 51 4c  ially set to SQL
3280: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 65  ITE_OK, then the
3290: 20 74 65 78 74 20 73 70 65 63 69 66 69 65 64 20   text specified 
32a0: 62 79 0a 2a 2a 20 74 68 65 20 70 72 69 6e 74 66  by.** the printf
32b0: 28 29 20 73 74 79 6c 65 20 61 72 67 75 6d 65 6e  () style argumen
32c0: 74 73 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  ts is appended t
32d0: 6f 20 7a 49 6e 20 61 6e 64 20 74 68 65 20 72 65  o zIn and the re
32e0: 73 75 6c 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a  sult returned.**
32f0: 20 69 6e 20 61 20 62 75 66 66 65 72 20 61 6c 6c   in a buffer all
3300: 6f 63 61 74 65 64 20 62 79 20 73 71 6c 69 74 65  ocated by sqlite
3310: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 20 73 71 6c 69  3_malloc(). sqli
3320: 74 65 33 5f 66 72 65 65 28 29 20 69 73 20 63 61  te3_free() is ca
3330: 6c 6c 65 64 20 6f 6e 0a 2a 2a 20 7a 49 6e 20 62  lled on.** zIn b
3340: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
3350: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3360: 2a 69 64 78 41 70 70 65 6e 64 54 65 78 74 28 69  *idxAppendText(i
3370: 6e 74 20 2a 70 52 63 2c 20 63 68 61 72 20 2a 7a  nt *pRc, char *z
3380: 49 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  In, const char *
3390: 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zFmt, ...){.  va
33a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
33b0: 20 2a 7a 41 70 70 65 6e 64 20 3d 20 30 3b 0a 20   *zAppend = 0;. 
33c0: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 30 3b   char *zRet = 0;
33d0: 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 7a 49 6e  .  int nIn = zIn
33e0: 20 3f 20 73 74 72 6c 65 6e 28 7a 49 6e 29 20 3a   ? strlen(zIn) :
33f0: 20 30 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e   0;.  int nAppen
3400: 64 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61 72  d = 0;.  va_star
3410: 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 69  t(ap, zFmt);.  i
3420: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
3430: 4f 4b 20 29 7b 0a 20 20 20 20 7a 41 70 70 65 6e  OK ){.    zAppen
3440: 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  d = sqlite3_vmpr
3450: 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
3460: 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64 20      if( zAppend 
3470: 29 7b 0a 20 20 20 20 20 20 6e 41 70 70 65 6e 64  ){.      nAppend
3480: 20 3d 20 73 74 72 6c 65 6e 28 7a 41 70 70 65 6e   = strlen(zAppen
3490: 64 29 3b 0a 20 20 20 20 20 20 7a 52 65 74 20 3d  d);.      zRet =
34a0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
34b0: 6d 61 6c 6c 6f 63 28 6e 49 6e 20 2b 20 6e 41 70  malloc(nIn + nAp
34c0: 70 65 6e 64 20 2b 20 31 29 3b 0a 20 20 20 20 7d  pend + 1);.    }
34d0: 0a 20 20 20 20 69 66 28 20 7a 41 70 70 65 6e 64  .    if( zAppend
34e0: 20 26 26 20 7a 52 65 74 20 29 7b 0a 20 20 20 20   && zRet ){.    
34f0: 20 20 6d 65 6d 63 70 79 28 7a 52 65 74 2c 20 7a    memcpy(zRet, z
3500: 49 6e 2c 20 6e 49 6e 29 3b 0a 20 20 20 20 20 20  In, nIn);.      
3510: 6d 65 6d 63 70 79 28 26 7a 52 65 74 5b 6e 49 6e  memcpy(&zRet[nIn
3520: 5d 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70  ], zAppend, nApp
3530: 65 6e 64 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  end+1);.    }els
3540: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
3550: 5f 66 72 65 65 28 7a 52 65 74 29 3b 0a 20 20 20  _free(zRet);.   
3560: 20 20 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 20     zRet = 0;.   
3570: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
3580: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
3590: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
35a0: 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 73 71 6c  Append);.    sql
35b0: 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 29 3b 0a  ite3_free(zIn);.
35c0: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
35d0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ;.  return zRet;
35e0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .}..static int i
35f0: 64 78 49 64 65 6e 74 69 66 69 65 72 52 65 71 75  dxIdentifierRequ
3600: 69 72 65 73 51 75 6f 74 65 73 28 63 6f 6e 73 74  iresQuotes(const
3610: 20 63 68 61 72 20 2a 7a 49 64 29 7b 0a 20 20 69   char *zId){.  i
3620: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
3630: 20 7a 49 64 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20   zId[i]; i++){. 
3640: 20 20 20 69 66 28 20 21 28 7a 49 64 5b 69 5d 3d     if( !(zId[i]=
3650: 3d 27 5f 27 29 0a 20 20 20 20 20 26 26 20 21 28  ='_').     && !(
3660: 7a 49 64 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a  zId[i]>='0' && z
3670: 49 64 5b 69 5d 3c 3d 27 39 27 29 0a 20 20 20 20  Id[i]<='9').    
3680: 20 26 26 20 21 28 7a 49 64 5b 69 5d 3e 3d 27 61   && !(zId[i]>='a
3690: 27 20 26 26 20 7a 49 64 5b 69 5d 3c 3d 27 7a 27  ' && zId[i]<='z'
36a0: 29 0a 20 20 20 20 20 26 26 20 21 28 7a 49 64 5b  ).     && !(zId[
36b0: 69 5d 3e 3d 27 41 27 20 26 26 20 7a 49 64 5b 69  i]>='A' && zId[i
36c0: 5d 3c 3d 27 5a 27 29 0a 20 20 20 20 29 7b 0a 20  ]<='Z').    ){. 
36d0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
36e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
36f0: 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  n 0;.}..static c
3700: 68 61 72 20 2a 69 64 78 41 70 70 65 6e 64 43 6f  har *idxAppendCo
3710: 6c 44 65 66 6e 28 0a 20 20 69 6e 74 20 2a 70 52  lDefn(.  int *pR
3720: 63 2c 20 0a 20 20 63 68 61 72 20 2a 7a 49 6e 2c  c, .  char *zIn,
3730: 20 0a 20 20 49 64 78 54 61 62 6c 65 20 2a 70 54   .  IdxTable *pT
3740: 61 62 2c 20 0a 20 20 49 64 78 43 6f 6e 73 74 72  ab, .  IdxConstr
3750: 61 69 6e 74 20 2a 70 43 6f 6e 73 0a 29 7b 0a 20  aint *pCons.){. 
3760: 20 63 68 61 72 20 2a 7a 52 65 74 20 3d 20 7a 49   char *zRet = zI
3770: 6e 3b 0a 20 20 49 64 78 43 6f 6c 75 6d 6e 20 2a  n;.  IdxColumn *
3780: 70 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  p = &pTab->aCol[
3790: 70 43 6f 6e 73 2d 3e 69 43 6f 6c 5d 3b 0a 20 20  pCons->iCol];.  
37a0: 69 66 28 20 7a 52 65 74 20 29 20 7a 52 65 74 20  if( zRet ) zRet 
37b0: 3d 20 69 64 78 41 70 70 65 6e 64 54 65 78 74 28  = idxAppendText(
37c0: 70 52 63 2c 20 7a 52 65 74 2c 20 22 2c 20 22 29  pRc, zRet, ", ")
37d0: 3b 0a 0a 20 20 69 66 28 20 69 64 78 49 64 65 6e  ;..  if( idxIden
37e0: 74 69 66 69 65 72 52 65 71 75 69 72 65 73 51 75  tifierRequiresQu
37f0: 6f 74 65 73 28 70 2d 3e 7a 4e 61 6d 65 29 20 29  otes(p->zName) )
3800: 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 69 64 78  {.    zRet = idx
3810: 41 70 70 65 6e 64 54 65 78 74 28 70 52 63 2c 20  AppendText(pRc, 
3820: 7a 52 65 74 2c 20 22 25 51 22 2c 20 70 2d 3e 7a  zRet, "%Q", p->z
3830: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
3840: 20 20 20 20 7a 52 65 74 20 3d 20 69 64 78 41 70      zRet = idxAp
3850: 70 65 6e 64 54 65 78 74 28 70 52 63 2c 20 7a 52  pendText(pRc, zR
3860: 65 74 2c 20 22 25 73 22 2c 20 70 2d 3e 7a 4e 61  et, "%s", p->zNa
3870: 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  me);.  }..  if( 
3880: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
3890: 70 2d 3e 7a 43 6f 6c 6c 2c 20 70 43 6f 6e 73 2d  p->zColl, pCons-
38a0: 3e 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 69  >zColl) ){.    i
38b0: 66 28 20 69 64 78 49 64 65 6e 74 69 66 69 65 72  f( idxIdentifier
38c0: 52 65 71 75 69 72 65 73 51 75 6f 74 65 73 28 70  RequiresQuotes(p
38d0: 43 6f 6e 73 2d 3e 7a 43 6f 6c 6c 29 20 29 7b 0a  Cons->zColl) ){.
38e0: 20 20 20 20 20 20 7a 52 65 74 20 3d 20 69 64 78        zRet = idx
38f0: 41 70 70 65 6e 64 54 65 78 74 28 70 52 63 2c 20  AppendText(pRc, 
3900: 7a 52 65 74 2c 20 22 20 43 4f 4c 4c 41 54 45 20  zRet, " COLLATE 
3910: 25 51 22 2c 20 70 43 6f 6e 73 2d 3e 7a 43 6f 6c  %Q", pCons->zCol
3920: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
3930: 20 20 20 20 20 7a 52 65 74 20 3d 20 69 64 78 41       zRet = idxA
3940: 70 70 65 6e 64 54 65 78 74 28 70 52 63 2c 20 7a  ppendText(pRc, z
3950: 52 65 74 2c 20 22 20 43 4f 4c 4c 41 54 45 20 25  Ret, " COLLATE %
3960: 73 22 2c 20 70 43 6f 6e 73 2d 3e 7a 43 6f 6c 6c  s", pCons->zColl
3970: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
3980: 69 66 28 20 70 43 6f 6e 73 2d 3e 62 44 65 73 63  if( pCons->bDesc
3990: 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 69   ){.    zRet = i
39a0: 64 78 41 70 70 65 6e 64 54 65 78 74 28 70 52 63  dxAppendText(pRc
39b0: 2c 20 7a 52 65 74 2c 20 22 20 44 45 53 43 22 29  , zRet, " DESC")
39c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
39d0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Ret;.}../*.** Se
39e0: 61 72 63 68 20 64 61 74 61 62 61 73 65 20 64 62  arch database db
39f0: 6d 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 63  m for an index c
3a00: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
3a10: 68 65 20 6f 6e 65 20 69 64 78 43 72 65 61 74 65  he one idxCreate
3a20: 46 72 6f 6d 43 6f 6e 73 28 29 0a 2a 2a 20 77 6f  FromCons().** wo
3a30: 75 6c 64 20 63 72 65 61 74 65 20 66 72 6f 6d 20  uld create from 
3a40: 61 72 67 75 6d 65 6e 74 73 20 70 53 63 61 6e 2c  arguments pScan,
3a50: 20 70 45 71 20 61 6e 64 20 70 54 61 69 6c 2e 20   pEq and pTail. 
3a60: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
3a70: 72 73 20 61 6e 64 20 0a 2a 2a 20 73 75 63 68 20  rs and .** such 
3a80: 61 6e 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  an index is foun
3a90: 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  d, return non-ze
3aa0: 72 6f 2e 20 4f 72 2c 20 69 66 20 6e 6f 20 73 75  ro. Or, if no su
3ab0: 63 68 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e  ch index is foun
3ac0: 64 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 7a 65 72  d,.** return zer
3ad0: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  o..**.** If an e
3ae0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
3af0: 20 2a 70 52 63 20 74 6f 20 61 6e 20 53 51 4c 69   *pRc to an SQLi
3b00: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
3b10: 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a  d return zero..*
3b20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 78  /.static int idx
3b30: 46 69 6e 64 43 6f 6d 70 61 74 69 62 6c 65 28 0a  FindCompatible(.
3b40: 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
3b70: 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
3b80: 33 2a 20 64 62 6d 2c 20 20 20 20 20 20 20 20 20  3* dbm,         
3b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3ba0: 61 62 61 73 65 20 74 6f 20 73 65 61 72 63 68 20  abase to search 
3bb0: 2a 2f 0a 20 20 49 64 78 53 63 61 6e 20 2a 70 53  */.  IdxScan *pS
3bc0: 63 61 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  can,            
3bd0: 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 66 6f 72       /* Scan for
3be0: 20 74 61 62 6c 65 20 74 6f 20 73 65 61 72 63 68   table to search
3bf0: 20 66 6f 72 20 69 6e 64 65 78 20 6f 6e 20 2a 2f   for index on */
3c00: 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74  .  IdxConstraint
3c10: 20 2a 70 45 71 2c 20 20 20 20 20 20 20 20 20 20   *pEq,          
3c20: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 3d 3d     /* List of ==
3c30: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
3c40: 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
3c50: 2a 70 54 61 69 6c 20 20 20 20 20 20 20 20 20 20  *pTail          
3c60: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 72 61 6e    /* List of ran
3c70: 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ge constraints *
3c80: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
3c90: 72 20 2a 7a 54 62 6c 20 3d 20 70 53 63 61 6e 2d  r *zTbl = pScan-
3ca0: 3e 7a 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74  >zTable;.  sqlit
3cb0: 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 4c 69 73  e3_stmt *pIdxLis
3cc0: 74 20 3d 20 30 3b 0a 20 20 49 64 78 43 6f 6e 73  t = 0;.  IdxCons
3cd0: 74 72 61 69 6e 74 20 2a 70 49 74 65 72 3b 0a 20  traint *pIter;. 
3ce0: 20 69 6e 74 20 6e 45 71 20 3d 20 30 3b 20 20 20   int nEq = 0;   
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
3d10: 65 6d 65 6e 74 73 20 69 6e 20 70 45 71 20 2a 2f  ements in pEq */
3d20: 0a 20 20 69 6e 74 20 72 63 2c 20 72 63 32 3b 0a  .  int rc, rc2;.
3d30: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65  ..  /* Count the
3d40: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73   elements in lis
3d50: 74 20 70 45 71 20 2a 2f 0a 20 20 66 6f 72 28 70  t pEq */.  for(p
3d60: 49 74 65 72 3d 70 45 71 3b 20 70 49 74 65 72 3b  Iter=pEq; pIter;
3d70: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4c   pIter=pIter->pL
3d80: 69 6e 6b 29 20 6e 45 71 2b 2b 3b 0a 0a 20 20 72  ink) nEq++;..  r
3d90: 63 20 3d 20 69 64 78 50 72 69 6e 74 66 50 72 65  c = idxPrintfPre
3da0: 70 61 72 65 53 74 6d 74 28 64 62 6d 2c 20 26 70  pareStmt(dbm, &p
3db0: 49 64 78 4c 69 73 74 2c 20 30 2c 20 22 50 52 41  IdxList, 0, "PRA
3dc0: 47 4d 41 20 69 6e 64 65 78 5f 6c 69 73 74 3d 25  GMA index_list=%
3dd0: 51 22 2c 20 7a 54 62 6c 29 3b 0a 20 20 77 68 69  Q", zTbl);.  whi
3de0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
3df0: 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  K && sqlite3_ste
3e00: 70 28 70 49 64 78 4c 69 73 74 29 3d 3d 53 51 4c  p(pIdxList)==SQL
3e10: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
3e20: 6e 74 20 62 4d 61 74 63 68 20 3d 20 31 3b 0a 20  nt bMatch = 1;. 
3e30: 20 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74     IdxConstraint
3e40: 20 2a 70 54 20 3d 20 70 54 61 69 6c 3b 0a 20 20   *pT = pTail;.  
3e50: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
3e60: 70 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 63  pInfo = 0;.    c
3e70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
3e80: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
3e90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
3ea0: 78 74 28 70 49 64 78 4c 69 73 74 2c 20 31 29 3b  xt(pIdxList, 1);
3eb0: 0a 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68  ..    /* Zero th
3ec0: 65 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 2e  e IdxConstraint.
3ed0: 62 46 6c 61 67 20 76 61 6c 75 65 73 20 69 6e 20  bFlag values in 
3ee0: 74 68 65 20 70 45 71 20 6c 69 73 74 20 2a 2f 0a  the pEq list */.
3ef0: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 45      for(pIter=pE
3f00: 71 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  q; pIter; pIter=
3f10: 70 49 74 65 72 2d 3e 70 4c 69 6e 6b 29 20 70 49  pIter->pLink) pI
3f20: 74 65 72 2d 3e 62 46 6c 61 67 20 3d 20 30 3b 0a  ter->bFlag = 0;.
3f30: 0a 20 20 20 20 72 63 20 3d 20 69 64 78 50 72 69  .    rc = idxPri
3f40: 6e 74 66 50 72 65 70 61 72 65 53 74 6d 74 28 64  ntfPrepareStmt(d
3f50: 62 6d 2c 20 26 70 49 6e 66 6f 2c 20 30 2c 20 22  bm, &pInfo, 0, "
3f60: 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 49 6e  PRAGMA index_xIn
3f70: 66 6f 3d 25 51 22 2c 20 7a 49 64 78 29 3b 0a 20  fo=%Q", zIdx);. 
3f80: 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
3f90: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74  LITE_OK && sqlit
3fa0: 65 33 5f 73 74 65 70 28 70 49 6e 66 6f 29 3d 3d  e3_step(pInfo)==
3fb0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
3fc0: 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 73      int iIdx = s
3fd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
3fe0: 74 28 70 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20  t(pInfo, 0);.   
3ff0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 73 71     int iCol = sq
4000: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
4010: 28 70 49 6e 66 6f 2c 20 31 29 3b 0a 20 20 20 20  (pInfo, 1);.    
4020: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
4030: 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  oll = (const cha
4040: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
4050: 6e 5f 74 65 78 74 28 70 49 6e 66 6f 2c 20 34 29  n_text(pInfo, 4)
4060: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 49 64  ;..      if( iId
4070: 78 3c 6e 45 71 20 29 7b 0a 20 20 20 20 20 20 20  x<nEq ){.       
4080: 20 66 6f 72 28 70 49 74 65 72 3d 70 45 71 3b 20   for(pIter=pEq; 
4090: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
40a0: 65 72 2d 3e 70 4c 69 6e 6b 29 7b 0a 20 20 20 20  er->pLink){.    
40b0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
40c0: 3e 62 46 6c 61 67 20 29 20 63 6f 6e 74 69 6e 75  >bFlag ) continu
40d0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
40e0: 20 70 49 74 65 72 2d 3e 69 43 6f 6c 21 3d 69 43   pIter->iCol!=iC
40f0: 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
4100: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
4110: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74  ite3_stricmp(pIt
4120: 65 72 2d 3e 7a 43 6f 6c 6c 2c 20 7a 43 6f 6c 6c  er->zColl, zColl
4130: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
4140: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62          pIter->b
4150: 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  Flag = 1;.      
4160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
4180: 20 70 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20   pIter==0 ){.   
4190: 20 20 20 20 20 20 20 62 4d 61 74 63 68 20 3d 20         bMatch = 
41a0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
41b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
41c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
41d0: 20 20 20 69 66 28 20 70 54 20 29 7b 0a 20 20 20     if( pT ){.   
41e0: 20 20 20 20 20 20 20 69 66 28 20 70 54 2d 3e 69         if( pT->i
41f0: 43 6f 6c 21 3d 69 43 6f 6c 20 7c 7c 20 73 71 6c  Col!=iCol || sql
4200: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 54 2d  ite3_stricmp(pT-
4210: 3e 7a 43 6f 6c 6c 2c 20 7a 43 6f 6c 6c 29 20 29  >zColl, zColl) )
4220: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 4d  {.            bM
4230: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
4240: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4250: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4260: 20 20 20 70 54 20 3d 20 70 54 2d 3e 70 4c 69 6e     pT = pT->pLin
4270: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
4290: 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
42a0: 61 6c 69 7a 65 28 70 49 6e 66 6f 29 3b 0a 20 20  alize(pInfo);.  
42b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
42c0: 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
42d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
42e0: 49 54 45 5f 4f 4b 20 26 26 20 62 4d 61 74 63 68  ITE_OK && bMatch
42f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4300: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 49 64 78 4c  3_finalize(pIdxL
4310: 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ist);.      retu
4320: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
4330: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
4340: 66 69 6e 61 6c 69 7a 65 28 70 49 64 78 4c 69 73  finalize(pIdxLis
4350: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
4360: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
4370: 63 32 3b 0a 0a 20 20 2a 70 52 63 20 3d 20 72 63  c2;..  *pRc = rc
4380: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4390: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 78 43  .static int idxC
43a0: 72 65 61 74 65 46 72 6f 6d 43 6f 6e 73 28 0a 20  reateFromCons(. 
43b0: 20 49 64 78 43 6f 6e 74 65 78 74 20 2a 70 43 74   IdxContext *pCt
43c0: 78 2c 0a 20 20 49 64 78 53 63 61 6e 20 2a 70 53  x,.  IdxScan *pS
43d0: 63 61 6e 2c 0a 20 20 49 64 78 43 6f 6e 73 74 72  can,.  IdxConstr
43e0: 61 69 6e 74 20 2a 70 45 71 2c 20 0a 20 20 49 64  aint *pEq, .  Id
43f0: 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 54 61  xConstraint *pTa
4400: 69 6c 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  il.){.  sqlite3 
4410: 2a 64 62 6d 20 3d 20 70 43 74 78 2d 3e 64 62 6d  *dbm = pCtx->dbm
4420: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
4430: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 28 70  ITE_OK;.  if( (p
4440: 45 71 20 7c 7c 20 70 54 61 69 6c 29 20 26 26 20  Eq || pTail) && 
4450: 30 3d 3d 69 64 78 46 69 6e 64 43 6f 6d 70 61 74  0==idxFindCompat
4460: 69 62 6c 65 28 26 72 63 2c 20 64 62 6d 2c 20 70  ible(&rc, dbm, p
4470: 53 63 61 6e 2c 20 70 45 71 2c 20 70 54 61 69 6c  Scan, pEq, pTail
4480: 29 20 29 7b 0a 20 20 20 20 49 64 78 54 61 62 6c  ) ){.    IdxTabl
4490: 65 20 2a 70 54 61 62 20 3d 20 70 53 63 61 6e 2d  e *pTab = pScan-
44a0: 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61  >pTable;.    cha
44b0: 72 20 2a 7a 43 6f 6c 73 20 3d 20 30 3b 0a 20 20  r *zCols = 0;.  
44c0: 20 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 30    char *zIdx = 0
44d0: 3b 0a 20 20 20 20 49 64 78 43 6f 6e 73 74 72 61  ;.    IdxConstra
44e0: 69 6e 74 20 2a 70 43 6f 6e 73 3b 0a 20 20 20 20  int *pCons;.    
44f0: 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 20 20 63  int h = 0;.    c
4500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 3b  onst char *zFmt;
4510: 0a 0a 20 20 20 20 66 6f 72 28 70 43 6f 6e 73 3d  ..    for(pCons=
4520: 70 45 71 3b 20 70 43 6f 6e 73 3b 20 70 43 6f 6e  pEq; pCons; pCon
4530: 73 3d 70 43 6f 6e 73 2d 3e 70 4c 69 6e 6b 29 7b  s=pCons->pLink){
4540: 0a 20 20 20 20 20 20 7a 43 6f 6c 73 20 3d 20 69  .      zCols = i
4550: 64 78 41 70 70 65 6e 64 43 6f 6c 44 65 66 6e 28  dxAppendColDefn(
4560: 26 72 63 2c 20 7a 43 6f 6c 73 2c 20 70 54 61 62  &rc, zCols, pTab
4570: 2c 20 70 43 6f 6e 73 29 3b 0a 20 20 20 20 7d 0a  , pCons);.    }.
4580: 20 20 20 20 66 6f 72 28 70 43 6f 6e 73 3d 70 54      for(pCons=pT
4590: 61 69 6c 3b 20 70 43 6f 6e 73 3b 20 70 43 6f 6e  ail; pCons; pCon
45a0: 73 3d 70 43 6f 6e 73 2d 3e 70 4c 69 6e 6b 29 7b  s=pCons->pLink){
45b0: 0a 20 20 20 20 20 20 7a 43 6f 6c 73 20 3d 20 69  .      zCols = i
45c0: 64 78 41 70 70 65 6e 64 43 6f 6c 44 65 66 6e 28  dxAppendColDefn(
45d0: 26 72 63 2c 20 7a 43 6f 6c 73 2c 20 70 54 61 62  &rc, zCols, pTab
45e0: 2c 20 70 43 6f 6e 73 29 3b 0a 20 20 20 20 7d 0a  , pCons);.    }.
45f0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
4600: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4610: 2f 2a 20 48 61 73 68 20 74 68 65 20 6c 69 73 74  /* Hash the list
4620: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 63   of columns to c
4630: 6f 6d 65 20 75 70 20 77 69 74 68 20 61 20 6e 61  ome up with a na
4640: 6d 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  me for the index
4650: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
4660: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4670: 7a 43 6f 6c 73 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  zCols[i]; i++){.
4680: 20 20 20 20 20 20 20 20 68 20 2b 3d 20 28 28 68          h += ((h
4690: 3c 3c 33 29 20 2b 20 7a 43 6f 6c 73 5b 69 5d 29  <<3) + zCols[i])
46a0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
46b0: 20 69 66 28 20 69 64 78 49 64 65 6e 74 69 66 69   if( idxIdentifi
46c0: 65 72 52 65 71 75 69 72 65 73 51 75 6f 74 65 73  erRequiresQuotes
46d0: 28 70 53 63 61 6e 2d 3e 7a 54 61 62 6c 65 29 20  (pScan->zTable) 
46e0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20  ){.        zFmt 
46f0: 3d 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20  = "CREATE INDEX 
4700: 27 25 71 5f 69 64 78 5f 25 30 38 78 27 20 4f 4e  '%q_idx_%08x' ON
4710: 20 25 51 28 25 73 29 22 3b 0a 20 20 20 20 20 20   %Q(%s)";.      
4720: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
4730: 46 6d 74 20 3d 20 22 43 52 45 41 54 45 20 49 4e  Fmt = "CREATE IN
4740: 44 45 58 20 25 73 5f 69 64 78 5f 25 30 38 78 20  DEX %s_idx_%08x 
4750: 4f 4e 20 25 73 28 25 73 29 22 3b 0a 20 20 20 20  ON %s(%s)";.    
4760: 20 20 7d 0a 20 20 20 20 20 20 7a 49 64 78 20 3d    }.      zIdx =
4770: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
4780: 28 7a 46 6d 74 2c 20 70 53 63 61 6e 2d 3e 7a 54  (zFmt, pScan->zT
4790: 61 62 6c 65 2c 20 68 2c 20 70 53 63 61 6e 2d 3e  able, h, pScan->
47a0: 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 73 29 3b 0a  zTable, zCols);.
47b0: 20 20 20 20 20 20 69 66 28 20 21 7a 49 64 78 20        if( !zIdx 
47c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
47d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
47e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
47f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4800: 65 78 65 63 28 64 62 6d 2c 20 7a 49 64 78 2c 20  exec(dbm, zIdx, 
4810: 30 2c 20 30 2c 20 70 43 74 78 2d 3e 70 7a 45 72  0, 0, pCtx->pzEr
4820: 72 6d 73 67 29 3b 0a 23 69 66 20 30 0a 20 20 20  rmsg);.#if 0.   
4830: 20 20 20 20 20 70 72 69 6e 74 66 28 22 43 41 4e       printf("CAN
4840: 44 49 44 41 54 45 3a 20 25 73 5c 6e 22 2c 20 7a  DIDATE: %s\n", z
4850: 49 64 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Idx);.#endif.   
4860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
4870: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4880: 20 26 26 20 70 43 74 78 2d 3e 69 49 64 78 52 6f   && pCtx->iIdxRo
4890: 77 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  wid==0 ){.      
48a0: 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 73  int rc2;.      s
48b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4c 61  qlite3_stmt *pLa
48c0: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  st = 0;.      rc
48d0: 20 3d 20 69 64 78 50 72 65 70 61 72 65 53 74 6d   = idxPrepareStm
48e0: 74 28 64 62 6d 2c 20 26 70 4c 61 73 74 2c 20 70  t(dbm, &pLast, p
48f0: 43 74 78 2d 3e 70 7a 45 72 72 6d 73 67 2c 20 0a  Ctx->pzErrmsg, .
4900: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
4910: 54 20 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f  T max(rowid) FRO
4920: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
4930: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
4940: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4950: 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
4960: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 4c  =sqlite3_step(pL
4970: 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ast) ){.        
4980: 70 43 74 78 2d 3e 69 49 64 78 52 6f 77 69 64 20  pCtx->iIdxRowid 
4990: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
49a0: 5f 69 6e 74 36 34 28 70 4c 61 73 74 2c 20 30 29  _int64(pLast, 0)
49b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
49c0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
49d0: 6e 61 6c 69 7a 65 28 70 4c 61 73 74 29 3b 0a 20  nalize(pLast);. 
49e0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
49f0: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
4a00: 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  2;.    }..    sq
4a10: 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 64 78 29  lite3_free(zIdx)
4a20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
4a30: 65 65 28 7a 43 6f 6c 73 29 3b 0a 20 20 7d 0a 20  ee(zCols);.  }. 
4a40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
4a50: 74 61 74 69 63 20 69 6e 74 20 69 64 78 43 72 65  tatic int idxCre
4a60: 61 74 65 46 72 6f 6d 57 68 65 72 65 28 0a 20 20  ateFromWhere(.  
4a70: 20 20 49 64 78 43 6f 6e 74 65 78 74 2a 2c 20 69    IdxContext*, i
4a80: 36 34 2c 20 49 64 78 53 63 61 6e 2a 2c 20 49 64  64, IdxScan*, Id
4a90: 78 57 68 65 72 65 2a 2c 20 49 64 78 43 6f 6e 73  xWhere*, IdxCons
4aa0: 74 72 61 69 6e 74 2a 2c 20 49 64 78 43 6f 6e 73  traint*, IdxCons
4ab0: 74 72 61 69 6e 74 2a 0a 29 3b 0a 0a 73 74 61 74  traint*.);..stat
4ac0: 69 63 20 69 6e 74 20 69 64 78 43 72 65 61 74 65  ic int idxCreate
4ad0: 46 6f 72 65 61 63 68 4f 72 28 0a 20 20 49 64 78  ForeachOr(.  Idx
4ae0: 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  Context *pCtx, .
4af0: 20 20 69 36 34 20 6d 61 73 6b 2c 20 20 20 20 20    i64 mask,     
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 6f 6e    /* Consider on
4b20: 6c 79 20 74 68 65 73 65 20 63 6f 6e 73 74 72 61  ly these constra
4b30: 69 6e 74 73 20 2a 2f 0a 20 20 49 64 78 53 63 61  ints */.  IdxSca
4b40: 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20  n *pScan,       
4b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65            /* Cre
4b60: 61 74 65 20 69 6e 64 65 78 65 73 20 66 6f 72 20  ate indexes for 
4b70: 74 68 69 73 20 73 63 61 6e 20 2a 2f 0a 20 20 49  this scan */.  I
4b80: 64 78 57 68 65 72 65 20 2a 70 57 68 65 72 65 2c  dxWhere *pWhere,
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ba0: 2a 20 52 65 61 64 20 63 6f 6e 73 74 72 61 69 6e  * Read constrain
4bb0: 74 73 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  ts from here */.
4bc0: 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
4bd0: 2a 70 45 71 2c 20 20 20 20 20 20 20 20 20 20 20  *pEq,           
4be0: 20 20 2f 2a 20 3d 3d 20 63 6f 6e 73 74 72 61 69    /* == constrai
4bf0: 6e 74 73 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f  nts for inclusio
4c00: 6e 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73 74 72  n */.  IdxConstr
4c10: 61 69 6e 74 20 2a 70 54 61 69 6c 20 20 20 20 20  aint *pTail     
4c20: 20 20 20 20 20 20 20 2f 2a 20 72 61 6e 67 65 2f         /* range/
4c30: 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61  ORDER BY constra
4c40: 69 6e 74 73 20 66 6f 72 20 69 6e 63 6c 75 73 69  ints for inclusi
4c50: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  on */.){.  int r
4c60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4c70: 20 49 64 78 57 68 65 72 65 20 2a 70 31 3b 0a 20   IdxWhere *p1;. 
4c80: 20 49 64 78 57 68 65 72 65 20 2a 70 32 3b 0a 20   IdxWhere *p2;. 
4c90: 20 66 6f 72 28 70 31 3d 70 57 68 65 72 65 2d 3e   for(p1=pWhere->
4ca0: 70 4f 72 3b 20 70 31 20 26 26 20 72 63 3d 3d 53  pOr; p1 && rc==S
4cb0: 51 4c 49 54 45 5f 4f 4b 3b 20 70 31 3d 70 31 2d  QLITE_OK; p1=p1-
4cc0: 3e 70 4e 65 78 74 4f 72 29 7b 0a 20 20 20 20 72  >pNextOr){.    r
4cd0: 63 20 3d 20 69 64 78 43 72 65 61 74 65 46 72 6f  c = idxCreateFro
4ce0: 6d 57 68 65 72 65 28 70 43 74 78 2c 20 6d 61 73  mWhere(pCtx, mas
4cf0: 6b 2c 20 70 53 63 61 6e 2c 20 70 31 2c 20 70 45  k, pScan, p1, pE
4d00: 71 2c 20 70 54 61 69 6c 29 3b 0a 20 20 20 20 66  q, pTail);.    f
4d10: 6f 72 28 70 32 3d 70 31 2d 3e 70 53 69 62 6c 69  or(p2=p1->pSibli
4d20: 6e 67 3b 20 70 32 20 26 26 20 72 63 3d 3d 53 51  ng; p2 && rc==SQ
4d30: 4c 49 54 45 5f 4f 4b 3b 20 70 32 3d 70 32 2d 3e  LITE_OK; p2=p2->
4d40: 70 53 69 62 6c 69 6e 67 29 7b 0a 20 20 20 20 20  pSibling){.     
4d50: 20 72 63 20 3d 20 69 64 78 43 72 65 61 74 65 46   rc = idxCreateF
4d60: 72 6f 6d 57 68 65 72 65 28 70 43 74 78 2c 20 6d  romWhere(pCtx, m
4d70: 61 73 6b 2c 20 70 53 63 61 6e 2c 20 70 32 2c 20  ask, pScan, p2, 
4d80: 70 45 71 2c 20 70 54 61 69 6c 29 3b 0a 20 20 20  pEq, pTail);.   
4d90: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4da0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
4db0: 75 72 6e 20 74 72 75 65 20 69 66 20 6c 69 73 74  urn true if list
4dc0: 20 70 4c 69 73 74 20 28 6c 69 6e 6b 65 64 20 62   pList (linked b
4dd0: 79 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 2e  y IdxConstraint.
4de0: 70 4c 69 6e 6b 29 20 63 6f 6e 74 61 69 6e 73 0a  pLink) contains.
4df0: 2a 2a 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  ** a constraint 
4e00: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
4e10: 2a 70 2e 20 4f 74 68 65 72 77 69 73 65 20 72 65  *p. Otherwise re
4e20: 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73  turn false..*/.s
4e30: 74 61 74 69 63 20 69 6e 74 20 69 64 78 46 69 6e  tatic int idxFin
4e40: 64 43 6f 6e 73 74 72 61 69 6e 74 28 49 64 78 43  dConstraint(IdxC
4e50: 6f 6e 73 74 72 61 69 6e 74 20 2a 70 4c 69 73 74  onstraint *pList
4e60: 2c 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20  , IdxConstraint 
4e70: 2a 70 29 7b 0a 20 20 49 64 78 43 6f 6e 73 74 72  *p){.  IdxConstr
4e80: 61 69 6e 74 20 2a 70 43 6d 70 3b 0a 20 20 66 6f  aint *pCmp;.  fo
4e90: 72 28 70 43 6d 70 3d 70 4c 69 73 74 3b 20 70 43  r(pCmp=pList; pC
4ea0: 6d 70 3b 20 70 43 6d 70 3d 70 43 6d 70 2d 3e 70  mp; pCmp=pCmp->p
4eb0: 4c 69 6e 6b 29 7b 0a 20 20 20 20 69 66 28 20 70  Link){.    if( p
4ec0: 2d 3e 69 43 6f 6c 3d 3d 70 43 6d 70 2d 3e 69 43  ->iCol==pCmp->iC
4ed0: 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ol ) return 1;. 
4ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4ef0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 78  ..static int idx
4f00: 43 72 65 61 74 65 46 72 6f 6d 57 68 65 72 65 28  CreateFromWhere(
4f10: 0a 20 20 49 64 78 43 6f 6e 74 65 78 74 20 2a 70  .  IdxContext *p
4f20: 43 74 78 2c 20 0a 20 20 69 36 34 20 6d 61 73 6b  Ctx, .  i64 mask
4f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f40: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 69          /* Consi
4f50: 64 65 72 20 6f 6e 6c 79 20 74 68 65 73 65 20 63  der only these c
4f60: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
4f70: 49 64 78 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20  IdxScan *pScan, 
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 2f 2a 20 43 72 65 61 74 65 20 69 6e 64 65 78 65  /* Create indexe
4fa0: 73 20 66 6f 72 20 74 68 69 73 20 73 63 61 6e 20  s for this scan 
4fb0: 2a 2f 0a 20 20 49 64 78 57 68 65 72 65 20 2a 70  */.  IdxWhere *p
4fc0: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20  Where,          
4fd0: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e       /* Read con
4fe0: 73 74 72 61 69 6e 74 73 20 66 72 6f 6d 20 68 65  straints from he
4ff0: 72 65 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73 74  re */.  IdxConst
5000: 72 61 69 6e 74 20 2a 70 45 71 2c 20 20 20 20 20  raint *pEq,     
5010: 20 20 20 20 20 20 20 20 2f 2a 20 3d 3d 20 63 6f          /* == co
5020: 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 69 6e  nstraints for in
5030: 63 6c 75 73 69 6f 6e 20 2a 2f 0a 20 20 49 64 78  clusion */.  Idx
5040: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 54 61 69  Constraint *pTai
5050: 6c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l            /* 
5060: 72 61 6e 67 65 2f 4f 52 44 45 52 20 42 59 20 63  range/ORDER BY c
5070: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 69  onstraints for i
5080: 6e 63 6c 75 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  nclusion */.){. 
5090: 20 73 71 6c 69 74 65 33 20 2a 64 62 6d 20 3d 20   sqlite3 *dbm = 
50a0: 70 43 74 78 2d 3e 64 62 6d 3b 0a 20 20 49 64 78  pCtx->dbm;.  Idx
50b0: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 31 20 3d  Constraint *p1 =
50c0: 20 70 45 71 3b 0a 20 20 49 64 78 43 6f 6e 73 74   pEq;.  IdxConst
50d0: 72 61 69 6e 74 20 2a 70 43 6f 6e 3b 0a 20 20 69  raint *pCon;.  i
50e0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 47 61 74  nt rc;..  /* Gat
50f0: 68 65 72 20 75 70 20 61 6c 6c 20 74 68 65 20 3d  her up all the =
5100: 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  = constraints th
5110: 61 74 20 6d 61 74 63 68 20 74 68 65 20 6d 61 73  at match the mas
5120: 6b 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 43 6f 6e  k. */.  for(pCon
5130: 3d 70 57 68 65 72 65 2d 3e 70 45 71 3b 20 70 43  =pWhere->pEq; pC
5140: 6f 6e 3b 20 70 43 6f 6e 3d 70 43 6f 6e 2d 3e 70  on; pCon=pCon->p
5150: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
5160: 6d 61 73 6b 20 26 20 70 43 6f 6e 2d 3e 64 65 70  mask & pCon->dep
5170: 6d 61 73 6b 29 3d 3d 70 43 6f 6e 2d 3e 64 65 70  mask)==pCon->dep
5180: 6d 61 73 6b 20 0a 20 20 20 20 20 26 26 20 69 64  mask .     && id
5190: 78 46 69 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28  xFindConstraint(
51a0: 70 31 2c 20 70 43 6f 6e 29 3d 3d 30 0a 20 20 20  p1, pCon)==0.   
51b0: 20 20 26 26 20 69 64 78 46 69 6e 64 43 6f 6e 73    && idxFindCons
51c0: 74 72 61 69 6e 74 28 70 54 61 69 6c 2c 20 70 43  traint(pTail, pC
51d0: 6f 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  on)==0.    ){.  
51e0: 20 20 20 20 70 43 6f 6e 2d 3e 70 4c 69 6e 6b 20      pCon->pLink 
51f0: 3d 20 70 31 3b 0a 20 20 20 20 20 20 70 31 20 3d  = p1;.      p1 =
5200: 20 70 43 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d   pCon;.    }.  }
5210: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 6e  ..  /* Create an
5220: 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65   index using the
5230: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
5240: 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f 76 65 2e  collected above.
5250: 20 41 6e 64 20 74 68 65 0a 20 20 2a 2a 20 72 61   And the.  ** ra
5260: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2f 4f  nge constraint/O
5270: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
5280: 73 73 65 64 20 69 6e 20 62 79 20 74 68 65 20 63  ssed in by the c
5290: 61 6c 6c 65 72 2c 20 69 66 20 61 6e 79 2e 20 2a  aller, if any. *
52a0: 2f 0a 20 20 72 63 20 3d 20 69 64 78 43 72 65 61  /.  rc = idxCrea
52b0: 74 65 46 72 6f 6d 43 6f 6e 73 28 70 43 74 78 2c  teFromCons(pCtx,
52c0: 20 70 53 63 61 6e 2c 20 70 31 2c 20 70 54 61 69   pScan, p1, pTai
52d0: 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  l);.  if( rc==SQ
52e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
52f0: 63 20 3d 20 69 64 78 43 72 65 61 74 65 46 6f 72  c = idxCreateFor
5300: 65 61 63 68 4f 72 28 70 43 74 78 2c 20 6d 61 73  eachOr(pCtx, mas
5310: 6b 2c 20 70 53 63 61 6e 2c 20 70 57 68 65 72 65  k, pScan, pWhere
5320: 2c 20 70 31 2c 20 70 54 61 69 6c 29 3b 0a 20 20  , p1, pTail);.  
5330: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 72 61  }..  /* If no ra
5340: 6e 67 65 2f 4f 52 44 45 52 20 42 59 20 70 61 73  nge/ORDER BY pas
5350: 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
5360: 72 2c 20 63 72 65 61 74 65 20 61 20 76 65 72 73  r, create a vers
5370: 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
5380: 69 6e 64 65 78 20 66 6f 72 20 65 61 63 68 20 72  index for each r
5390: 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
53a0: 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68 65  that matches the
53b0: 20 6d 61 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20   mask. */.  if( 
53c0: 70 54 61 69 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pTail==0 ){.    
53d0: 66 6f 72 28 70 43 6f 6e 3d 70 57 68 65 72 65 2d  for(pCon=pWhere-
53e0: 3e 70 52 61 6e 67 65 3b 20 72 63 3d 3d 53 51 4c  >pRange; rc==SQL
53f0: 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 3b 20  ITE_OK && pCon; 
5400: 70 43 6f 6e 3d 70 43 6f 6e 2d 3e 70 4e 65 78 74  pCon=pCon->pNext
5410: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
5420: 20 70 43 6f 6e 2d 3e 70 4c 69 6e 6b 3d 3d 30 20   pCon->pLink==0 
5430: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6d 61  );.      if( (ma
5440: 73 6b 20 26 20 70 43 6f 6e 2d 3e 64 65 70 6d 61  sk & pCon->depma
5450: 73 6b 29 3d 3d 70 43 6f 6e 2d 3e 64 65 70 6d 61  sk)==pCon->depma
5460: 73 6b 0a 20 20 20 20 20 20 20 20 26 26 20 69 64  sk.        && id
5470: 78 46 69 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28  xFindConstraint(
5480: 70 45 71 2c 20 70 43 6f 6e 29 3d 3d 30 0a 20 20  pEq, pCon)==0.  
5490: 20 20 20 20 20 20 26 26 20 69 64 78 46 69 6e 64        && idxFind
54a0: 43 6f 6e 73 74 72 61 69 6e 74 28 70 54 61 69 6c  Constraint(pTail
54b0: 2c 20 70 43 6f 6e 29 3d 3d 30 0a 20 20 20 20 20  , pCon)==0.     
54c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
54d0: 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d 43 6f   idxCreateFromCo
54e0: 6e 73 28 70 43 74 78 2c 20 70 53 63 61 6e 2c 20  ns(pCtx, pScan, 
54f0: 70 31 2c 20 70 43 6f 6e 29 3b 0a 20 20 20 20 20  p1, pCon);.     
5500: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5510: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
5520: 20 20 72 63 20 3d 20 69 64 78 43 72 65 61 74 65    rc = idxCreate
5530: 46 6f 72 65 61 63 68 4f 72 28 70 43 74 78 2c 20  ForeachOr(pCtx, 
5540: 6d 61 73 6b 2c 20 70 53 63 61 6e 2c 20 70 57 68  mask, pScan, pWh
5550: 65 72 65 2c 20 70 31 2c 20 70 43 6f 6e 29 3b 0a  ere, p1, pCon);.
5560: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5570: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
5580: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5590: 2a 2a 20 43 72 65 61 74 65 20 63 61 6e 64 69 64  ** Create candid
55a0: 61 74 65 20 69 6e 64 65 78 65 73 20 69 6e 20 64  ate indexes in d
55b0: 61 74 61 62 61 73 65 20 5b 64 62 6d 5d 20 62 61  atabase [dbm] ba
55c0: 73 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 20  sed on the data 
55d0: 69 6e 20 0a 2a 2a 20 6c 69 6e 6b 65 64 2d 6c 69  in .** linked-li
55e0: 73 74 20 70 53 63 61 6e 2e 0a 2a 2f 0a 73 74 61  st pScan..*/.sta
55f0: 74 69 63 20 69 6e 74 20 69 64 78 43 72 65 61 74  tic int idxCreat
5600: 65 43 61 6e 64 69 64 61 74 65 73 28 49 64 78 43  eCandidates(IdxC
5610: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
5620: 20 73 71 6c 69 74 65 33 20 2a 64 62 6d 20 3d 20   sqlite3 *dbm = 
5630: 70 43 74 78 2d 3e 64 62 6d 3b 0a 20 20 69 6e 74  pCtx->dbm;.  int
5640: 20 72 63 32 3b 0a 20 20 69 6e 74 20 72 63 20 3d   rc2;.  int rc =
5650: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
5660: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 70  lite3_stmt *pDep
5670: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a  mask;         /*
5680: 20 46 6f 72 65 61 63 68 20 64 65 70 6d 61 73 6b   Foreach depmask
5690: 20 2a 2f 0a 20 20 49 64 78 53 63 61 6e 20 2a 70   */.  IdxScan *p
56a0: 49 74 65 72 3b 0a 0a 20 20 72 63 20 3d 20 69 64  Iter;..  rc = id
56b0: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 43 74  xPrepareStmt(pCt
56c0: 78 2d 3e 64 62 6d 2c 20 26 70 44 65 70 6d 61 73  x->dbm, &pDepmas
56d0: 6b 2c 20 70 43 74 78 2d 3e 70 7a 45 72 72 6d 73  k, pCtx->pzErrms
56e0: 67 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  g, .      "SELEC
56f0: 54 20 6d 61 73 6b 20 46 52 4f 4d 20 64 65 70 6d  T mask FROM depm
5700: 61 73 6b 22 0a 20 20 29 3b 0a 0a 20 20 66 6f 72  ask".  );..  for
5710: 28 70 49 74 65 72 3d 70 43 74 78 2d 3e 70 53 63  (pIter=pCtx->pSc
5720: 61 6e 3b 20 70 49 74 65 72 20 26 26 20 72 63 3d  an; pIter && rc=
5730: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 49 74 65  =SQLITE_OK; pIte
5740: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 53 63  r=pIter->pNextSc
5750: 61 6e 29 7b 0a 20 20 20 20 49 64 78 57 68 65 72  an){.    IdxWher
5760: 65 20 2a 70 57 68 65 72 65 20 3d 20 26 70 49 74  e *pWhere = &pIt
5770: 65 72 2d 3e 77 68 65 72 65 3b 0a 20 20 20 20 77  er->where;.    w
5780: 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
5790: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
57a0: 44 65 70 6d 61 73 6b 29 20 26 26 20 72 63 3d 3d  Depmask) && rc==
57b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
57c0: 20 20 20 69 36 34 20 6d 61 73 6b 20 3d 20 73 71     i64 mask = sq
57d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
57e0: 36 34 28 70 44 65 70 6d 61 73 6b 2c 20 30 29 3b  64(pDepmask, 0);
57f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 69 64 78 43  .      rc = idxC
5800: 72 65 61 74 65 46 72 6f 6d 57 68 65 72 65 28 70  reateFromWhere(p
5810: 43 74 78 2c 20 6d 61 73 6b 2c 20 70 49 74 65 72  Ctx, mask, pIter
5820: 2c 20 70 57 68 65 72 65 2c 20 30 2c 20 30 29 3b  , pWhere, 0, 0);
5830: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
5840: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65  QLITE_OK && pIte
5850: 72 2d 3e 70 4f 72 64 65 72 20 29 7b 0a 20 20 20  r->pOrder ){.   
5860: 20 20 20 20 20 72 63 20 3d 20 69 64 78 43 72 65       rc = idxCre
5870: 61 74 65 46 72 6f 6d 57 68 65 72 65 28 70 43 74  ateFromWhere(pCt
5880: 78 2c 20 6d 61 73 6b 2c 20 70 49 74 65 72 2c 20  x, mask, pIter, 
5890: 70 57 68 65 72 65 2c 20 30 2c 20 70 49 74 65 72  pWhere, 0, pIter
58a0: 2d 3e 70 4f 72 64 65 72 29 3b 0a 20 20 20 20 20  ->pOrder);.     
58b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
58c0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
58d0: 6e 61 6c 69 7a 65 28 70 44 65 70 6d 61 73 6b 29  nalize(pDepmask)
58e0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
58f0: 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
5900: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5910: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  ..static void id
5920: 78 53 63 61 6e 46 72 65 65 28 49 64 78 53 63 61  xScanFree(IdxSca
5930: 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 49 64 78  n *pScan){.  Idx
5940: 53 63 61 6e 20 2a 70 49 74 65 72 3b 0a 20 20 49  Scan *pIter;.  I
5950: 64 78 53 63 61 6e 20 2a 70 4e 65 78 74 3b 0a 20  dxScan *pNext;. 
5960: 20 66 6f 72 28 70 49 74 65 72 3d 70 53 63 61 6e   for(pIter=pScan
5970: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
5980: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
5990: 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 53   = pIter->pNextS
59a0: 63 61 6e 3b 0a 0a 20 20 7d 0a 7d 0a 0a 69 6e 74  can;..  }.}..int
59b0: 20 69 64 78 46 69 6e 64 49 6e 64 65 78 65 73 28   idxFindIndexes(
59c0: 0a 20 20 49 64 78 43 6f 6e 74 65 78 74 20 2a 70  .  IdxContext *p
59d0: 43 74 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Ctx,.  const cha
59e0: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5a00: 51 4c 20 74 6f 20 66 69 6e 64 20 69 6e 64 65 78  QL to find index
5a10: 65 73 20 66 6f 72 20 2a 2f 0a 20 20 76 6f 69 64  es for */.  void
5a20: 20 28 2a 78 4f 75 74 29 28 76 6f 69 64 2a 2c 20   (*xOut)(void*, 
5a30: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 20 20  const char*),   
5a40: 20 2f 2a 20 4f 75 74 70 75 74 20 63 61 6c 6c 62   /* Output callb
5a50: 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ack */.  void *p
5a60: 4f 75 74 43 74 78 2c 20 20 20 20 20 20 20 20 20  OutCtx,         
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a80: 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 78 4f 75   Context for xOu
5a90: 74 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  t() */.  char **
5aa0: 70 7a 45 72 72 20 20 20 20 20 20 20 20 20 20 20  pzErr           
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ac0: 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73   OUT: Error mess
5ad0: 61 67 65 20 28 73 71 6c 69 74 65 33 5f 6d 61 6c  age (sqlite3_mal
5ae0: 6c 6f 63 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  loc) */.){.  sql
5af0: 69 74 65 33 20 2a 64 62 6d 20 3d 20 70 43 74 78  ite3 *dbm = pCtx
5b00: 2d 3e 64 62 6d 3b 0a 20 20 73 71 6c 69 74 65 33  ->dbm;.  sqlite3
5b10: 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20  _stmt *pExplain 
5b20: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
5b30: 74 6d 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 30  tmt *pSelect = 0
5b40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
5b50: 20 2a 70 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *pInsert = 0;. 
5b60: 20 69 6e 74 20 72 63 2c 20 72 63 32 3b 0a 20 20   int rc, rc2;.  
5b70: 69 6e 74 20 62 46 6f 75 6e 64 20 3d 20 30 3b 0a  int bFound = 0;.
5b80: 0a 20 20 72 63 20 3d 20 69 64 78 50 72 69 6e 74  .  rc = idxPrint
5b90: 66 50 72 65 70 61 72 65 53 74 6d 74 28 64 62 6d  fPrepareStmt(dbm
5ba0: 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 70 7a 45  , &pExplain, pzE
5bb0: 72 72 2c 22 45 58 50 4c 41 49 4e 20 51 55 45 52  rr,"EXPLAIN QUER
5bc0: 59 20 50 4c 41 4e 20 25 73 22 2c 7a 53 71 6c 29  Y PLAN %s",zSql)
5bd0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5be0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
5bf0: 3d 20 69 64 78 50 72 65 70 61 72 65 53 74 6d 74  = idxPrepareStmt
5c00: 28 64 62 6d 2c 20 26 70 53 65 6c 65 63 74 2c 20  (dbm, &pSelect, 
5c10: 70 7a 45 72 72 2c 20 0a 20 20 20 20 20 20 20 20  pzErr, .        
5c20: 22 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 73  "SELECT rowid, s
5c30: 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
5c40: 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65  aster WHERE name
5c50: 20 3d 20 3f 22 0a 20 20 20 20 29 3b 0a 20 20 7d   = ?".    );.  }
5c60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5c70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
5c80: 20 69 64 78 50 72 65 70 61 72 65 53 74 6d 74 28   idxPrepareStmt(
5c90: 64 62 6d 2c 20 26 70 49 6e 73 65 72 74 2c 20 70  dbm, &pInsert, p
5ca0: 7a 45 72 72 2c 0a 20 20 20 20 20 20 20 20 22 49  zErr,.        "I
5cb0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
5cc0: 49 4e 54 4f 20 61 75 78 2e 69 6e 64 65 78 65 73  INTO aux.indexes
5cd0: 20 56 41 4c 55 45 53 28 3f 29 22 0a 20 20 20 20   VALUES(?)".    
5ce0: 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
5cf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5d00: 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
5d10: 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45  Explain)==SQLITE
5d20: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
5d30: 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  i;.    const cha
5d40: 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f  r *zDetail = (co
5d50: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5d60: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45  3_column_text(pE
5d70: 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20  xplain, 3);.    
5d80: 69 6e 74 20 6e 44 65 74 61 69 6c 20 3d 20 73 74  int nDetail = st
5d90: 72 6c 65 6e 28 7a 44 65 74 61 69 6c 29 3b 0a 0a  rlen(zDetail);..
5da0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
5db0: 44 65 74 61 69 6c 3b 20 69 2b 2b 29 7b 0a 20 20  Detail; i++){.  
5dc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5dd0: 7a 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  zIdx = 0;.      
5de0: 69 66 28 20 6d 65 6d 63 6d 70 28 26 7a 44 65 74  if( memcmp(&zDet
5df0: 61 69 6c 5b 69 5d 2c 20 22 20 55 53 49 4e 47 20  ail[i], " USING 
5e00: 49 4e 44 45 58 20 22 2c 20 31 33 29 3d 3d 30 20  INDEX ", 13)==0 
5e10: 29 7b 0a 20 20 20 20 20 20 20 20 7a 49 64 78 20  ){.        zIdx 
5e20: 3d 20 26 7a 44 65 74 61 69 6c 5b 69 2b 31 33 5d  = &zDetail[i+13]
5e30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
5e40: 28 20 6d 65 6d 63 6d 70 28 26 7a 44 65 74 61 69  ( memcmp(&zDetai
5e50: 6c 5b 69 5d 2c 20 22 20 55 53 49 4e 47 20 43 4f  l[i], " USING CO
5e60: 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 2c 20  VERING INDEX ", 
5e70: 32 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  22)==0 ){.      
5e80: 20 20 7a 49 64 78 20 3d 20 26 7a 44 65 74 61 69    zIdx = &zDetai
5e90: 6c 5b 69 2b 32 32 5d 3b 0a 20 20 20 20 20 20 7d  l[i+22];.      }
5ea0: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 64 78 20  .      if( zIdx 
5eb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
5ec0: 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Idx = 0;.       
5ed0: 20 77 68 69 6c 65 28 20 7a 49 64 78 5b 6e 49 64   while( zIdx[nId
5ee0: 78 5d 21 3d 27 5c 30 27 20 26 26 20 28 7a 49 64  x]!='\0' && (zId
5ef0: 78 5b 6e 49 64 78 5d 21 3d 27 20 27 20 7c 7c 20  x[nIdx]!=' ' || 
5f00: 7a 49 64 78 5b 6e 49 64 78 2b 31 5d 21 3d 27 28  zIdx[nIdx+1]!='(
5f10: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
5f20: 6e 49 64 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nIdx++;.        
5f30: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
5f40: 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 65 6c  3_bind_text(pSel
5f50: 65 63 74 2c 20 31 2c 20 7a 49 64 78 2c 20 6e 49  ect, 1, zIdx, nI
5f60: 64 78 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  dx, SQLITE_STATI
5f70: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
5f80: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
5f90: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
5fa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
5fb0: 36 34 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  64 iRowid = sqli
5fc0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
5fd0: 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  (pSelect, 0);.  
5fe0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
5ff0: 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73  ar *zSql = (cons
6000: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
6010: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
6020: 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ect, 1);.       
6030: 20 20 20 69 66 28 20 69 52 6f 77 69 64 3e 3d 70     if( iRowid>=p
6040: 43 74 78 2d 3e 69 49 64 78 52 6f 77 69 64 20 29  Ctx->iIdxRowid )
6050: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
6060: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
6070: 70 49 6e 73 65 72 74 2c 20 31 2c 20 7a 53 71 6c  pInsert, 1, zSql
6080: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
6090: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
60a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
60b0: 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 20  Insert);.       
60c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
60d0: 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29  3_reset(pInsert)
60e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
60f0: 28 20 72 63 20 29 20 67 6f 74 6f 20 66 69 6e 64  ( rc ) goto find
6100: 5f 69 6e 64 65 78 65 73 5f 6f 75 74 3b 0a 20 20  _indexes_out;.  
6110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6120: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
6130: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
6140: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
6150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32 20      }.  }.  rc2 
6170: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6180: 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28  pExplain);.  if(
6190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
61a0: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 69 66 28   rc = rc2;.  if(
61b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
61c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  {.    sqlite3_st
61d0: 6d 74 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 0a 20  mt *pLoop = 0;. 
61e0: 20 20 20 72 63 20 3d 20 69 64 78 50 72 65 70 61     rc = idxPrepa
61f0: 72 65 53 74 6d 74 28 64 62 6d 2c 20 26 70 4c 6f  reStmt(dbm, &pLo
6200: 6f 70 2c 20 70 7a 45 72 72 2c 20 22 53 45 4c 45  op, pzErr, "SELE
6210: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 61 75 78  CT name FROM aux
6220: 2e 69 6e 64 65 78 65 73 22 29 3b 0a 20 20 20 20  .indexes");.    
6230: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6240: 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  K ){.      while
6250: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
6260: 6c 69 74 65 33 5f 73 74 65 70 28 70 4c 6f 6f 70  lite3_step(pLoop
6270: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 46 6f  ) ){.        bFo
6280: 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  und = 1;.       
6290: 20 78 4f 75 74 28 70 4f 75 74 43 74 78 2c 20 73   xOut(pOutCtx, s
62a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
62b0: 78 74 28 70 4c 6f 6f 70 2c 20 30 29 29 3b 0a 20  xt(pLoop, 0));. 
62c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
62d0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
62e0: 7a 65 28 70 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d  ze(pLoop);.    }
62f0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6300: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6310: 69 66 28 20 62 46 6f 75 6e 64 3d 3d 30 20 29 20  if( bFound==0 ) 
6320: 78 4f 75 74 28 70 4f 75 74 43 74 78 2c 20 22 28  xOut(pOutCtx, "(
6330: 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 22  no new indexes)"
6340: 29 3b 0a 20 20 20 20 20 20 78 4f 75 74 28 70 4f  );.      xOut(pO
6350: 75 74 43 74 78 2c 20 22 22 29 3b 0a 20 20 20 20  utCtx, "");.    
6360: 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  }.  }..  while( 
6370: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6380: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45   sqlite3_step(pE
6390: 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f  xplain)==SQLITE_
63a0: 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ROW ){.    int i
63b0: 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c 69 74  Selectid = sqlit
63c0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
63d0: 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
63e0: 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73 71 6c  int iOrder = sql
63f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
6400: 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20  pExplain, 1);.  
6410: 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20 73 71    int iFrom = sq
6420: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
6430: 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b 0a 20  (pExplain, 2);. 
6440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6450: 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20  Detail = (const 
6460: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
6470: 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61  lumn_text(pExpla
6480: 69 6e 2c 20 33 29 3b 0a 20 20 20 20 63 68 61 72  in, 3);.    char
6490: 20 2a 7a 4f 75 74 3b 0a 0a 20 20 20 20 7a 4f 75   *zOut;..    zOu
64a0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  t = sqlite3_mpri
64b0: 6e 74 66 28 22 25 64 7c 25 64 7c 25 64 7c 25 73  ntf("%d|%d|%d|%s
64c0: 22 2c 20 69 53 65 6c 65 63 74 69 64 2c 20 69 4f  ", iSelectid, iO
64d0: 72 64 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65  rder, iFrom, zDe
64e0: 74 61 69 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  tail);.    if( z
64f0: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
6500: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6510: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
6520: 20 20 20 20 78 4f 75 74 28 70 4f 75 74 43 74 78      xOut(pOutCtx
6530: 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 73  , zOut);.      s
6540: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
6550: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 66  );.    }.  }.. f
6560: 69 6e 64 5f 69 6e 64 65 78 65 73 5f 6f 75 74 3a  ind_indexes_out:
6570: 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
6580: 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61  _finalize(pExpla
6590: 69 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  in);.  if( rc==S
65a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
65b0: 72 63 32 3b 0a 20 20 72 63 32 20 3d 20 73 71 6c  rc2;.  rc2 = sql
65c0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
65d0: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63  elect);.  if( rc
65e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
65f0: 20 3d 20 72 63 32 3b 0a 20 20 72 63 32 20 3d 20   = rc2;.  rc2 = 
6600: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6610: 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 69 66 28  (pInsert);.  if(
6620: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6630: 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 72 65   rc = rc2;..  re
6640: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6650: 2a 20 54 68 65 20 78 4f 75 74 20 63 61 6c 6c 62  * The xOut callb
6660: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ack is invoked t
6670: 6f 20 72 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64  o return command
6680: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 75   output to the u
6690: 73 65 72 2e 20 54 68 65 0a 2a 2a 20 73 65 63 6f  ser. The.** seco
66a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
66b0: 6c 77 61 79 73 20 61 20 6e 75 6c 2d 74 65 72 6d  lways a nul-term
66c0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20 54  inated string. T
66d0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
66e0: 74 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 7a  t is.** passed z
66f0: 65 72 6f 20 69 66 20 74 68 65 20 73 74 72 69 6e  ero if the strin
6700: 67 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 72 6d 61  g contains norma
6710: 6c 20 6f 75 74 70 75 74 20 6f 72 20 6e 6f 6e 2d  l output or non-
6720: 7a 65 72 6f 20 69 66 20 69 74 20 69 73 20 61 6e  zero if it is an
6730: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
6740: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 49  e..*/.int shellI
6750: 6e 64 65 78 65 73 43 6f 6d 6d 61 6e 64 28 0a 20  ndexesCommand(. 
6760: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6790: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f  e handle */.  co
67a0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 66 69 6e     /* SQL to fin
67d0: 64 20 69 6e 64 65 78 65 73 20 66 6f 72 20 2a 2f  d indexes for */
67e0: 0a 20 20 76 6f 69 64 20 28 2a 78 4f 75 74 29 28  .  void (*xOut)(
67f0: 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61  void*, const cha
6800: 72 2a 29 2c 20 20 20 20 2f 2a 20 4f 75 74 70 75  r*),    /* Outpu
6810: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
6820: 76 6f 69 64 20 2a 70 4f 75 74 43 74 78 2c 20 20  void *pOutCtx,  
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
6850: 66 6f 72 20 78 4f 75 74 28 29 20 2a 2f 0a 20 20  for xOut() */.  
6860: 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 20  char **pzErrmsg 
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
6890: 6f 72 20 6d 65 73 73 61 67 65 20 28 73 71 6c 69  or message (sqli
68a0: 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 2a 2f 0a 29  te3_malloc) */.)
68b0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
68c0: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
68d0: 33 20 2a 64 62 6d 20 3d 20 30 3b 0a 20 20 49 64  3 *dbm = 0;.  Id
68e0: 78 43 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20  xContext ctx;.  
68f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
6900: 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
6910: 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 63 6f 6d  /* Statement com
6920: 70 69 6c 65 64 20 66 72 6f 6d 20 7a 53 71 6c 20  piled from zSql 
6930: 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 74  */..  memset(&ct
6940: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 64 78  x, 0, sizeof(Idx
6950: 43 6f 6e 74 65 78 74 29 29 3b 0a 20 20 63 74 78  Context));.  ctx
6960: 2e 70 7a 45 72 72 6d 73 67 20 3d 20 70 7a 45 72  .pzErrmsg = pzEr
6970: 72 6d 73 67 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  rmsg;..  /* Open
6980: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
6990: 74 61 62 61 73 65 20 74 6f 20 77 6f 72 6b 20 77  tabase to work w
69a0: 69 74 68 2e 20 54 68 65 20 6d 61 69 6e 20 69 6e  ith. The main in
69b0: 2d 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 64 61  -memory .  ** da
69c0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 63 6f  tabase schema co
69d0: 6e 74 61 69 6e 73 20 74 61 62 6c 65 73 20 73 69  ntains tables si
69e0: 6d 69 6c 61 72 20 74 6f 20 74 68 6f 73 65 20 69  milar to those i
69f0: 6e 20 74 68 65 20 75 73 65 72 73 20 0a 20 20 2a  n the users .  *
6a00: 2a 20 64 61 74 61 62 61 73 65 20 28 68 61 6e 64  * database (hand
6a10: 6c 65 20 64 62 29 2e 20 54 68 65 20 61 74 74 61  le db). The atta
6a20: 63 68 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  ched in-memory d
6a30: 62 20 28 61 75 78 29 20 63 6f 6e 74 61 69 6e 73  b (aux) contains
6a40: 0a 20 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  .  ** applicatio
6a50: 6e 20 74 61 62 6c 65 73 20 75 73 65 64 20 62 79  n tables used by
6a60: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69   the code in thi
6a70: 73 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 72 63  s file.  */.  rc
6a80: 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
6a90: 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 64 62 6d  ":memory:", &dbm
6aa0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6ab0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
6ac0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
6ad0: 64 62 6d 2c 20 0a 20 20 20 20 20 20 20 20 22 41  dbm, .        "A
6ae0: 54 54 41 43 48 20 27 3a 6d 65 6d 6f 72 79 3a 27  TTACH ':memory:'
6af0: 20 41 53 20 61 75 78 3b 22 0a 20 20 20 20 20 20   AS aux;".      
6b00: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
6b10: 61 75 78 2e 64 65 70 6d 61 73 6b 28 6d 61 73 6b  aux.depmask(mask
6b20: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20 57 49   PRIMARY KEY) WI
6b30: 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 0a 20 20  THOUT ROWID;".  
6b40: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
6b50: 42 4c 45 20 61 75 78 2e 69 6e 64 65 78 65 73 28  BLE aux.indexes(
6b60: 6e 61 6d 65 20 50 52 49 4d 41 52 59 20 4b 45 59  name PRIMARY KEY
6b70: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
6b80: 22 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52  ".        "INSER
6b90: 54 20 49 4e 54 4f 20 61 75 78 2e 64 65 70 6d 61  T INTO aux.depma
6ba0: 73 6b 20 56 41 4c 55 45 53 28 30 29 3b 22 0a 20  sk VALUES(0);". 
6bb0: 20 20 20 20 20 20 20 2c 20 30 2c 20 30 2c 20 70         , 0, 0, p
6bc0: 7a 45 72 72 6d 73 67 0a 20 20 20 20 29 3b 0a 20  zErrmsg.    );. 
6bd0: 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65   }..  /* Prepare
6be0: 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65   an INSERT state
6bf0: 6d 65 6e 74 20 66 6f 72 20 77 72 69 74 69 6e 67  ment for writing
6c00: 20 74 6f 20 61 75 78 2e 64 65 70 6d 61 73 6b 20   to aux.depmask 
6c10: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
6c20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
6c30: 20 3d 20 69 64 78 50 72 65 70 61 72 65 53 74 6d   = idxPrepareStm
6c40: 74 28 64 62 6d 2c 20 26 63 74 78 2e 70 49 6e 73  t(dbm, &ctx.pIns
6c50: 65 72 74 4d 61 73 6b 2c 20 70 7a 45 72 72 6d 73  ertMask, pzErrms
6c60: 67 2c 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  g,.        "INSE
6c70: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
6c80: 4f 20 61 75 78 2e 64 65 70 6d 61 73 6b 20 53 45  O aux.depmask SE
6c90: 4c 45 43 54 20 6d 61 73 6b 20 7c 20 3f 31 20 46  LECT mask | ?1 F
6ca0: 52 4f 4d 20 61 75 78 2e 64 65 70 6d 61 73 6b 3b  ROM aux.depmask;
6cb0: 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ".    );.  }..  
6cc0: 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  /* Analyze the S
6cd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
6ce0: 69 6e 20 7a 53 71 6c 2e 20 2a 2f 0a 20 20 69 66  in zSql. */.  if
6cf0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6d00: 29 7b 0a 20 20 20 20 63 74 78 2e 64 62 6d 20 3d  ){.    ctx.dbm =
6d10: 20 64 62 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65   dbm;.    sqlite
6d20: 33 5f 77 68 65 72 65 69 6e 66 6f 5f 68 6f 6f 6b  3_whereinfo_hook
6d30: 28 64 62 2c 20 69 64 78 57 68 65 72 65 49 6e 66  (db, idxWhereInf
6d40: 6f 2c 20 28 76 6f 69 64 2a 29 26 63 74 78 29 3b  o, (void*)&ctx);
6d50: 0a 20 20 20 20 72 63 20 3d 20 69 64 78 50 72 65  .    rc = idxPre
6d60: 70 61 72 65 53 74 6d 74 28 64 62 2c 20 26 70 53  pareStmt(db, &pS
6d70: 74 6d 74 2c 20 70 7a 45 72 72 6d 73 67 2c 20 7a  tmt, pzErrmsg, z
6d80: 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sql);.    sqlite
6d90: 33 5f 77 68 65 72 65 69 6e 66 6f 5f 68 6f 6f 6b  3_whereinfo_hook
6da0: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  (db, 0, 0);.    
6db0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6dc0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20  (pStmt);.  }..  
6dd0: 2f 2a 20 43 72 65 61 74 65 20 74 61 62 6c 65 73  /* Create tables
6de0: 20 77 69 74 68 69 6e 20 74 68 65 20 6d 61 69 6e   within the main
6df0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
6e00: 61 73 65 2e 20 54 68 65 73 65 20 74 61 62 6c 65  ase. These table
6e10: 73 0a 20 20 2a 2a 20 68 61 76 65 20 74 68 65 20  s.  ** have the 
6e20: 73 61 6d 65 20 6e 61 6d 65 73 2c 20 63 6f 6c 75  same names, colu
6e30: 6d 6e 73 20 61 6e 64 20 64 65 63 6c 61 72 65 64  mns and declared
6e40: 20 74 79 70 65 73 20 61 73 20 74 68 65 20 74 61   types as the ta
6e50: 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  bles in.  ** the
6e60: 20 75 73 65 72 20 64 61 74 61 62 61 73 65 2e 20   user database. 
6e70: 41 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  All constraints 
6e80: 65 78 63 65 70 74 20 66 6f 72 20 50 52 49 4d 41  except for PRIMA
6e90: 52 59 20 4b 45 59 20 61 72 65 0a 20 20 2a 2a 20  RY KEY are.  ** 
6ea0: 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
6eb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6ec0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 64 78 43  ){.    rc = idxC
6ed0: 72 65 61 74 65 54 61 62 6c 65 73 28 64 62 2c 20  reateTables(db, 
6ee0: 64 62 6d 2c 20 63 74 78 2e 70 53 63 61 6e 2c 20  dbm, ctx.pScan, 
6ef0: 70 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a  pzErrmsg);.  }..
6f00: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 61 6e 64    /* Create cand
6f10: 69 64 61 74 65 20 69 6e 64 65 78 65 73 20 77 69  idate indexes wi
6f20: 74 68 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  thin the in-memo
6f30: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
6f40: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
6f50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6f60: 63 20 3d 20 69 64 78 43 72 65 61 74 65 43 61 6e  c = idxCreateCan
6f70: 64 69 64 61 74 65 73 28 26 63 74 78 29 3b 0a 20  didates(&ctx);. 
6f80: 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
6f90: 6f 75 74 20 77 68 69 63 68 20 6f 66 20 74 68 65  out which of the
6fa0: 20 63 61 6e 64 69 64 61 74 65 20 69 6e 64 65 78   candidate index
6fb0: 65 73 20 61 72 65 20 70 72 65 66 65 72 72 65 64  es are preferred
6fc0: 20 62 79 20 74 68 65 20 71 75 65 72 79 0a 20 20   by the query.  
6fd0: 2a 2a 20 70 6c 61 6e 6e 65 72 20 61 6e 64 20 72  ** planner and r
6fe0: 65 70 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74  eport the result
6ff0: 73 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20  s to the user.  
7000: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
7010: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
7020: 20 3d 20 69 64 78 46 69 6e 64 49 6e 64 65 78 65   = idxFindIndexe
7030: 73 28 26 63 74 78 2c 20 7a 53 71 6c 2c 20 78 4f  s(&ctx, zSql, xO
7040: 75 74 2c 20 70 4f 75 74 43 74 78 2c 20 70 7a 45  ut, pOutCtx, pzE
7050: 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 69  rrmsg);.  }..  i
7060: 64 78 53 63 61 6e 46 72 65 65 28 63 74 78 2e 70  dxScanFree(ctx.p
7070: 53 63 61 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  Scan);.  sqlite3
7080: 5f 66 69 6e 61 6c 69 7a 65 28 63 74 78 2e 70 49  _finalize(ctx.pI
7090: 6e 73 65 72 74 4d 61 73 6b 29 3b 0a 20 20 73 71  nsertMask);.  sq
70a0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 6d 29  lite3_close(dbm)
70b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
70c0: 0a 0a 0a                                         ...