/ Hex Artifact Content
Login

Artifact e10b3c2c4bc9a87f7bff1cf622473717b1a00698:


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 0a 74 79 70 65 64 65 66 20 73 74  i64;..typedef st
01a0: 72 75 63 74 20 49 64 78 43 6f 6e 73 74 72 61 69  ruct IdxConstrai
01b0: 6e 74 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74  nt IdxConstraint
01c0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
01d0: 20 49 64 78 43 6f 6e 74 65 78 74 20 49 64 78 43   IdxContext IdxC
01e0: 6f 6e 74 65 78 74 3b 0a 74 79 70 65 64 65 66 20  ontext;.typedef 
01f0: 73 74 72 75 63 74 20 49 64 78 53 63 61 6e 20 49  struct IdxScan I
0200: 64 78 53 63 61 6e 3b 0a 74 79 70 65 64 65 66 20  dxScan;.typedef 
0210: 73 74 72 75 63 74 20 49 64 78 57 68 65 72 65 20  struct IdxWhere 
0220: 49 64 78 57 68 65 72 65 3b 0a 0a 74 79 70 65 64  IdxWhere;..typed
0230: 65 66 20 73 74 72 75 63 74 20 49 64 78 43 6f 6c  ef struct IdxCol
0240: 75 6d 6e 20 49 64 78 43 6f 6c 75 6d 6e 3b 0a 74  umn IdxColumn;.t
0250: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 64  ypedef struct Id
0260: 78 54 61 62 6c 65 20 49 64 78 54 61 62 6c 65 3b  xTable IdxTable;
0270: 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ../*.** A single
0280: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 45 71 75   constraint. Equ
0290: 69 76 61 6c 65 6e 74 20 74 6f 20 65 69 74 68 65  ivalent to eithe
02a0: 72 20 22 63 6f 6c 20 3d 20 3f 22 20 6f 72 20 22  r "col = ?" or "
02b0: 63 6f 6c 20 3c 20 3f 22 2e 0a 2a 2a 0a 2a 2a 20  col < ?"..**.** 
02c0: 70 4c 69 6e 6b 3a 0a 2a 2a 20 20 20 55 73 65 64  pLink:.**   Used
02d0: 20 74 6f 20 74 65 6d 70 6f 72 61 72 69 6c 79 20   to temporarily 
02e0: 6c 69 6e 6b 20 49 64 78 43 6f 6e 73 74 72 61 69  link IdxConstrai
02f0: 6e 74 20 6f 62 6a 65 63 74 73 20 69 6e 74 6f 20  nt objects into 
0300: 6c 69 73 74 73 20 77 68 69 6c 65 0a 2a 2a 20 20  lists while.**  
0310: 20 63 72 65 61 74 69 6e 67 20 63 61 6e 64 69 64   creating candid
0320: 61 74 65 20 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a  ate indexes..*/.
0330: 73 74 72 75 63 74 20 49 64 78 43 6f 6e 73 74 72  struct IdxConstr
0340: 61 69 6e 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a  aint {.  char *z
0350: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
0360: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
0370: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
0380: 2f 0a 20 20 69 6e 74 20 62 52 61 6e 67 65 3b 20  /.  int bRange; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
03b0: 72 61 6e 67 65 2c 20 66 61 6c 73 65 20 66 6f 72  range, false for
03c0: 20 65 71 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   eq */.  int iCo
03d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
03e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73           /* Cons
03f0: 74 72 61 69 6e 65 64 20 74 61 62 6c 65 20 63 6f  trained table co
0400: 6c 75 6d 6e 20 2a 2f 0a 20 20 69 36 34 20 64 65  lumn */.  i64 de
0410: 70 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pmask;          
0420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70            /* Dep
0430: 65 6e 64 65 6e 63 79 20 6d 61 73 6b 20 2a 2f 0a  endency mask */.
0440: 20 20 69 6e 74 20 62 46 6c 61 67 3b 20 20 20 20    int bFlag;    
0450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0460: 20 20 2f 2a 20 55 73 65 64 20 62 79 20 69 64 78    /* Used by idx
0470: 46 69 6e 64 43 6f 6d 70 61 74 69 62 6c 65 28 29  FindCompatible()
0480: 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 3b   */.  int bDesc;
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
04b0: 20 4f 52 44 45 52 20 42 59 20 3c 65 78 70 72 3e   ORDER BY <expr>
04c0: 20 44 45 53 43 20 2a 2f 0a 20 20 49 64 78 43 6f   DESC */.  IdxCo
04d0: 6e 73 74 72 61 69 6e 74 20 2a 70 4e 65 78 74 3b  nstraint *pNext;
04e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
04f0: 78 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  xt constraint in
0500: 20 70 45 71 20 6f 72 20 70 52 61 6e 67 65 20 6c   pEq or pRange l
0510: 69 73 74 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73  ist */.  IdxCons
0520: 74 72 61 69 6e 74 20 2a 70 4c 69 6e 6b 3b 20 20  traint *pLink;  
0530: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
0540: 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  above */.};../*.
0550: 2a 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73  ** A WHERE claus
0560: 65 2e 20 4d 61 64 65 20 75 70 20 6f 66 20 49 64  e. Made up of Id
0570: 78 43 6f 6e 73 74 72 61 69 6e 74 20 6f 62 6a 65  xConstraint obje
0580: 63 74 73 2e 20 45 78 61 6d 70 6c 65 20 57 48 45  cts. Example WHE
0590: 52 45 20 63 6c 61 75 73 65 3a 0a 2a 2a 0a 2a 2a  RE clause:.**.**
05a0: 20 20 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 41     a=? AND b=? A
05b0: 4e 44 20 28 28 63 3d 3f 20 41 4e 44 20 64 3d 3f  ND ((c=? AND d=?
05c0: 29 20 4f 52 20 65 3d 3f 29 20 41 4e 44 20 28 66  ) OR e=?) AND (f
05d0: 3d 3f 20 4f 52 20 67 3d 3f 29 20 41 4e 44 20 68  =? OR g=?) AND h
05e0: 3e 3f 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f  >?.**.** The abo
05f0: 76 65 20 69 73 20 64 65 63 6f 6d 70 6f 73 65 64  ve is decomposed
0600: 20 69 6e 74 6f 20 35 20 41 4e 44 20 63 6f 6e 6e   into 5 AND conn
0610: 65 63 74 65 64 20 63 6c 61 75 73 65 73 2e 20 54  ected clauses. T
0620: 68 65 20 66 69 72 73 74 20 74 77 6f 20 61 72 65  he first two are
0630: 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65  .** added to the
0640: 20 49 64 78 57 68 65 72 65 2e 70 45 71 20 6c 69   IdxWhere.pEq li
0650: 6e 6b 65 64 20 6c 69 73 74 2c 20 74 68 65 20 66  nked list, the f
0660: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 69 6e 74  ollowing two int
0670: 6f 20 0a 2a 2a 20 49 64 78 57 68 65 72 65 2e 70  o .** IdxWhere.p
0680: 4f 72 20 61 6e 64 20 74 68 65 20 6c 61 73 74 20  Or and the last 
0690: 69 6e 74 6f 20 49 64 78 57 68 65 72 65 2e 70 52  into IdxWhere.pR
06a0: 61 6e 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 64 78 57  ange..**.** IdxW
06b0: 68 65 72 65 2e 70 45 71 20 61 6e 64 20 49 64 78  here.pEq and Idx
06c0: 57 68 65 72 65 2e 70 52 61 6e 67 65 20 61 72 65  Where.pRange are
06d0: 20 73 69 6d 70 6c 65 20 6c 69 6e 6b 65 64 20 6c   simple linked l
06e0: 69 73 74 73 20 6f 66 20 49 64 78 43 6f 6e 73 74  ists of IdxConst
06f0: 72 61 69 6e 74 0a 2a 2a 20 6f 62 6a 65 63 74 73  raint.** objects
0700: 20 6c 69 6e 6b 65 64 20 62 79 20 74 68 65 20 49   linked by the I
0710: 64 78 43 6f 6e 73 74 72 61 69 6e 74 2e 70 4e 65  dxConstraint.pNe
0720: 78 74 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  xt field..**.** 
0730: 54 68 65 20 6c 69 73 74 20 68 65 61 64 65 64 20  The list headed 
0740: 61 74 20 49 64 78 57 68 65 72 65 2e 70 4f 72 20  at IdxWhere.pOr 
0750: 61 6e 64 20 6c 69 6e 6b 65 64 20 62 79 20 49 64  and linked by Id
0760: 78 57 68 65 72 65 2e 70 4e 65 78 74 4f 72 20 63  xWhere.pNextOr c
0770: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 6c 6c 20 22  ontains.** all "
0780: 4f 52 22 20 74 65 72 6d 73 20 74 68 61 74 20 62  OR" terms that b
0790: 65 6c 6f 6e 67 20 74 6f 20 74 68 65 20 63 75 72  elong to the cur
07a0: 72 65 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  rent WHERE claus
07b0: 65 2e 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c  e. In the exampl
07c0: 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 72  e.** above, ther
07d0: 65 20 61 72 65 20 74 77 6f 20 4f 52 20 74 65 72  e are two OR ter
07e0: 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 28 63 3d  ms:.**.**   ((c=
07f0: 3f 20 41 4e 44 20 64 3d 3f 29 20 4f 52 20 65 3d  ? AND d=?) OR e=
0800: 3f 29 0a 2a 2a 20 20 20 28 66 3d 3f 20 4f 52 20  ?).**   (f=? OR 
0810: 67 3d 3f 29 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  g=?).**.** Withi
0820: 6e 20 61 6e 20 4f 52 20 74 65 72 6d 2c 20 74 68  n an OR term, th
0830: 65 20 4f 52 20 63 6f 6e 6e 65 63 74 65 64 20 73  e OR connected s
0840: 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ub-expressions a
0850: 72 65 20 74 65 72 6d 65 64 20 73 69 62 6c 69 6e  re termed siblin
0860: 67 73 2e 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  gs..** These are
0870: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 74 6f 20   connected into 
0880: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62 79  a linked list by
0890: 20 74 68 65 20 70 53 69 62 6c 69 6e 67 20 70 6f   the pSibling po
08a0: 69 6e 74 65 72 73 2e 20 45 61 63 68 20 4f 52 0a  inters. Each OR.
08b0: 2a 2a 20 74 65 72 6d 20 61 62 6f 76 65 20 63 6f  ** term above co
08c0: 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 73 69  nsists of two si
08d0: 62 6c 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  blings..**.**   
08e0: 70 4f 72 20 2d 3e 20 28 63 3d 3f 20 41 4e 44 20  pOr -> (c=? AND 
08f0: 64 3d 3f 29 20 2d 3e 20 70 4e 65 78 74 4f 72 20  d=?) -> pNextOr 
0900: 2d 3e 20 28 66 3d 3f 29 0a 2a 2a 20 20 20 20 20  -> (f=?).**     
0910: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
0940: 20 20 20 70 53 69 62 6c 69 6e 67 20 20 20 20 20     pSibling     
0950: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
0960: 6c 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ling.**         
0970: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
0990: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09a0: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
09b0: 20 20 20 20 20 20 20 20 20 20 20 56 0a 2a 2a 20             V.** 
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 65 3d 3f              (e=?
09d0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
09e0: 20 20 20 20 20 28 67 3d 3f 29 0a 2a 2a 0a 2a 2a       (g=?).**.**
09f0: 20 49 64 78 57 68 65 72 65 2e 70 50 61 72 65 6e   IdxWhere.pParen
0a00: 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  t is only used w
0a10: 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 69 6e  hile constructin
0a20: 67 20 61 20 74 72 65 65 20 6f 66 20 49 64 78 57  g a tree of IdxW
0a30: 68 65 72 65 20 0a 2a 2a 20 73 74 72 75 63 74 75  here .** structu
0a40: 72 65 73 2e 20 49 74 20 69 73 20 4e 55 4c 4c 20  res. It is NULL 
0a50: 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 49 64 78  for the root Idx
0a60: 57 68 65 72 65 2e 20 46 6f 72 20 61 6c 6c 20 6f  Where. For all o
0a70: 74 68 65 72 73 2c 20 74 68 65 20 70 61 72 65 6e  thers, the paren
0a80: 74 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  t.** WHERE claus
0a90: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 49 64 78  e..*/.struct Idx
0aa0: 57 68 65 72 65 20 7b 0a 20 20 49 64 78 43 6f 6e  Where {.  IdxCon
0ab0: 73 74 72 61 69 6e 74 20 2a 70 45 71 3b 20 20 20  straint *pEq;   
0ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
0ad0: 74 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69  t of == constrai
0ae0: 6e 74 73 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73  nts */.  IdxCons
0af0: 74 72 61 69 6e 74 20 2a 70 52 61 6e 67 65 3b 20  traint *pRange; 
0b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
0b10: 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e 74   of < constraint
0b20: 73 20 2a 2f 0a 20 20 49 64 78 57 68 65 72 65 20  s */.  IdxWhere 
0b30: 2a 70 4f 72 3b 20 20 20 20 20 20 20 20 20 20 20  *pOr;           
0b40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
0b50: 66 20 4f 52 20 63 6f 6e 73 74 72 61 69 6e 74 73  f OR constraints
0b60: 20 2a 2f 0a 20 20 49 64 78 57 68 65 72 65 20 2a   */.  IdxWhere *
0b70: 70 4e 65 78 74 4f 72 3b 20 20 20 20 20 20 20 20  pNextOr;        
0b80: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e        /* Next in
0b90: 20 4f 52 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   OR constraints 
0ba0: 6f 66 20 73 61 6d 65 20 49 64 78 57 68 65 72 65  of same IdxWhere
0bb0: 20 2a 2f 0a 20 20 49 64 78 57 68 65 72 65 20 2a   */.  IdxWhere *
0bc0: 70 53 69 62 6c 69 6e 67 3b 20 20 20 20 20 20 20  pSibling;       
0bd0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 62 72        /* Next br
0be0: 61 6e 63 68 20 69 6e 20 73 69 6e 67 6c 65 20 4f  anch in single O
0bf0: 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  R constraint */.
0c00: 20 20 49 64 78 57 68 65 72 65 20 2a 70 50 61 72    IdxWhere *pPar
0c10: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
0c20: 20 20 2f 2a 20 50 61 72 65 6e 74 20 6f 62 6a 65    /* Parent obje
0c30: 63 74 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ct (or NULL) */.
0c40: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 69 6e 67  };../*.** A sing
0c50: 6c 65 20 73 63 61 6e 20 6f 66 20 61 20 73 69 6e  le scan of a sin
0c60: 67 6c 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  gle table..*/.st
0c70: 72 75 63 74 20 49 64 78 53 63 61 6e 20 7b 0a 20  ruct IdxScan {. 
0c80: 20 49 64 78 54 61 62 6c 65 20 2a 70 54 61 62 6c   IdxTable *pTabl
0c90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0ca0: 20 2f 2a 20 54 61 62 6c 65 2d 69 6e 66 6f 20 2a   /* Table-info *
0cb0: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  /.  char *zTable
0cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0cd0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
0ce0: 61 62 6c 65 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  able to scan */.
0cf0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
0d20: 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 20 7a  ntaining table z
0d30: 54 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 63  Table */.  i64 c
0d40: 6f 76 65 72 69 6e 67 3b 20 20 20 20 20 20 20 20  overing;        
0d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
0d60: 73 6b 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  sk of columns re
0d70: 71 75 69 72 65 64 20 66 6f 72 20 63 6f 76 2e 20  quired for cov. 
0d80: 69 6e 64 65 78 20 2a 2f 0a 20 20 49 64 78 43 6f  index */.  IdxCo
0d90: 6e 73 74 72 61 69 6e 74 20 2a 70 4f 72 64 65 72  nstraint *pOrder
0da0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52  ;          /* OR
0db0: 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 73 20 2a  DER BY columns *
0dc0: 2f 0a 20 20 49 64 78 57 68 65 72 65 20 77 68 65  /.  IdxWhere whe
0dd0: 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
0de0: 20 20 20 20 2f 2a 20 57 48 45 52 45 20 43 6f 6e      /* WHERE Con
0df0: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 49 64  straints */.  Id
0e00: 78 53 63 61 6e 20 2a 70 4e 65 78 74 53 63 61 6e  xScan *pNextScan
0e10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0e20: 20 4e 65 78 74 20 49 64 78 53 63 61 6e 20 6f 62   Next IdxScan ob
0e30: 6a 65 63 74 20 66 6f 72 20 73 61 6d 65 20 71 75  ject for same qu
0e40: 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ery */.};../*.**
0e50: 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   Context object 
0e60: 70 61 73 73 65 64 20 74 6f 20 69 64 78 57 68 65  passed to idxWhe
0e70: 72 65 49 6e 66 6f 28 29 20 61 6e 64 20 6f 74 68  reInfo() and oth
0e80: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
0e90: 0a 73 74 72 75 63 74 20 49 64 78 43 6f 6e 74 65  .struct IdxConte
0ea0: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 2a 70 7a  xt {.  char **pz
0eb0: 45 72 72 6d 73 67 3b 0a 20 20 49 64 78 57 68 65  Errmsg;.  IdxWhe
0ec0: 72 65 20 2a 70 43 75 72 72 65 6e 74 3b 20 20 20  re *pCurrent;   
0ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
0ee0: 72 65 6e 74 20 77 68 65 72 65 20 63 6c 61 75 73  rent where claus
0ef0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
0f20: 63 6f 64 65 20 28 69 66 20 65 72 72 6f 72 20 68  code (if error h
0f30: 61 73 20 6f 63 63 75 72 72 65 64 29 20 2a 2f 0a  as occurred) */.
0f40: 20 20 49 64 78 53 63 61 6e 20 2a 70 53 63 61 6e    IdxScan *pScan
0f50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0f60: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 73 63 61    /* List of sca
0f70: 6e 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 73  n objects */.  s
0f80: 71 6c 69 74 65 33 20 2a 64 62 6d 3b 20 20 20 20  qlite3 *dbm;    
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0fa0: 2a 20 49 6e 2d 6d 65 6d 6f 72 79 20 64 62 20 66  * In-memory db f
0fb0: 6f 72 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  or this analysis
0fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
0fd0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0fe0: 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
0ff0: 74 61 62 61 73 65 20 75 6e 64 65 72 20 61 6e 61  tabase under ana
1000: 6c 79 73 69 73 20 2a 2f 0a 20 20 73 71 6c 69 74  lysis */.  sqlit
1010: 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74  e3_stmt *pInsert
1020: 4d 61 73 6b 3b 20 20 20 20 20 20 2f 2a 20 54 6f  Mask;      /* To
1030: 20 77 72 69 74 65 20 74 6f 20 61 75 78 2e 64 65   write to aux.de
1040: 70 6d 61 73 6b 20 2a 2f 0a 20 20 69 36 34 20 69  pmask */.  i64 i
1050: 49 64 78 52 6f 77 69 64 3b 20 20 20 20 20 20 20  IdxRowid;       
1060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1070: 77 69 64 20 6f 66 20 66 69 72 73 74 20 69 6e 64  wid of first ind
1080: 65 78 20 63 72 65 61 74 65 64 20 2a 2f 0a 7d 3b  ex created */.};
1090: 0a 0a 2f 2a 0a 2a 2a 20 44 61 74 61 20 72 65 67  ../*.** Data reg
10a0: 61 72 64 69 6e 67 20 61 20 64 61 74 61 62 61 73  arding a databas
10b0: 65 20 74 61 62 6c 65 2e 20 45 78 74 72 61 63 74  e table. Extract
10c0: 65 64 20 66 72 6f 6d 20 22 50 52 41 47 4d 41 20  ed from "PRAGMA 
10d0: 74 61 62 6c 65 5f 69 6e 66 6f 22 0a 2a 2f 0a 73  table_info".*/.s
10e0: 74 72 75 63 74 20 49 64 78 43 6f 6c 75 6d 6e 20  truct IdxColumn 
10f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
1100: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a  .  char *zColl;.
1110: 20 20 69 6e 74 20 69 50 6b 3b 0a 7d 3b 0a 73 74    int iPk;.};.st
1120: 72 75 63 74 20 49 64 78 54 61 62 6c 65 20 7b 0a  ruct IdxTable {.
1130: 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 49 64    int nCol;.  Id
1140: 78 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 3b 0a 7d  xColumn *aCol;.}
1150: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  ;../*.** Allocat
1160: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 42 79  e and return nBy
1170: 74 65 20 62 79 74 65 73 20 6f 66 20 7a 65 72 6f  te bytes of zero
1180: 65 64 20 6d 65 6d 6f 72 79 20 75 73 69 6e 67 20  ed memory using 
1190: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
11a0: 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 61 6c 6c  . .** If the all
11b0: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 73  ocation fails, s
11c0: 65 74 20 2a 70 52 63 20 74 6f 20 53 51 4c 49 54  et *pRc to SQLIT
11d0: 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 72 65 74 75  E_NOMEM and retu
11e0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
11f0: 69 63 20 76 6f 69 64 20 2a 69 64 78 4d 61 6c 6c  ic void *idxMall
1200: 6f 63 28 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74  oc(int *pRc, int
1210: 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20   nByte){.  void 
1220: 2a 70 52 65 74 3b 0a 20 20 61 73 73 65 72 74 28  *pRet;.  assert(
1230: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
1240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
1250: 79 74 65 3e 30 20 29 3b 0a 20 20 70 52 65 74 20  yte>0 );.  pRet 
1260: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1270: 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 70  (nByte);.  if( p
1280: 52 65 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  Ret ){.    memse
1290: 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65  t(pRet, 0, nByte
12a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12b0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
12c0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
12d0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
12e0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
12f0: 74 75 72 6e 20 61 20 6e 65 77 20 49 64 78 43 6f  turn a new IdxCo
1300: 6e 73 74 72 61 69 6e 74 20 6f 62 6a 65 63 74 2e  nstraint object.
1310: 20 53 65 74 20 74 68 65 20 49 64 78 43 6f 6e 73   Set the IdxCons
1320: 74 72 61 69 6e 74 2e 7a 43 6f 6c 6c 0a 2a 2a 20  traint.zColl.** 
1330: 76 61 72 69 61 62 6c 65 20 74 6f 20 70 6f 69 6e  variable to poin
1340: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 6e  t to a copy of n
1350: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
1360: 72 69 6e 67 20 7a 43 6f 6c 6c 2e 0a 2a 2f 0a 73  ring zColl..*/.s
1370: 74 61 74 69 63 20 49 64 78 43 6f 6e 73 74 72 61  tatic IdxConstra
1380: 69 6e 74 20 2a 69 64 78 4e 65 77 43 6f 6e 73 74  int *idxNewConst
1390: 72 61 69 6e 74 28 69 6e 74 20 2a 70 52 63 2c 20  raint(int *pRc, 
13a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
13b0: 6c 29 7b 0a 20 20 49 64 78 43 6f 6e 73 74 72 61  l){.  IdxConstra
13c0: 69 6e 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  int *pNew;.  int
13d0: 20 6e 43 6f 6c 6c 20 3d 20 73 74 72 6c 65 6e 28   nColl = strlen(
13e0: 7a 43 6f 6c 6c 29 3b 0a 0a 20 20 61 73 73 65 72  zColl);..  asser
13f0: 74 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  t( *pRc==SQLITE_
1400: 4f 4b 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28  OK );.  pNew = (
1410: 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 2a 29 69  IdxConstraint*)i
1420: 64 78 4d 61 6c 6c 6f 63 28 70 52 63 2c 20 73 69  dxMalloc(pRc, si
1430: 7a 65 6f 66 28 49 64 78 43 6f 6e 73 74 72 61 69  zeof(IdxConstrai
1440: 6e 74 29 20 2a 20 6e 43 6f 6c 6c 20 2b 20 31 29  nt) * nColl + 1)
1450: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
1460: 20 20 20 20 70 4e 65 77 2d 3e 7a 43 6f 6c 6c 20      pNew->zColl 
1470: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
1480: 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e  ];.    memcpy(pN
1490: 65 77 2d 3e 7a 43 6f 6c 6c 2c 20 7a 43 6f 6c 6c  ew->zColl, zColl
14a0: 2c 20 6e 43 6f 6c 6c 2b 31 29 3b 0a 20 20 7d 0a  , nColl+1);.  }.
14b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
14c0: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  ../*.** SQLITE_D
14d0: 42 43 4f 4e 46 49 47 5f 57 48 45 52 45 49 4e 46  BCONFIG_WHEREINF
14e0: 4f 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  O callback..*/.s
14f0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 78 57 68  tatic void idxWh
1500: 65 72 65 49 6e 66 6f 28 0a 20 20 76 6f 69 64 20  ereInfo(.  void 
1510: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
1520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1530: 69 6e 74 65 72 20 74 6f 20 49 64 78 43 6f 6e 74  inter to IdxCont
1540: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ext structure */
1550: 0a 20 20 69 6e 74 20 65 4f 70 2c 20 0a 20 20 63  .  int eOp, .  c
1560: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 2c  onst char *zVal,
1570: 20 0a 20 20 69 6e 74 20 69 56 61 6c 2c 20 0a 20   .  int iVal, . 
1580: 20 69 36 34 20 6d 61 73 6b 0a 29 7b 0a 20 20 49   i64 mask.){.  I
1590: 64 78 43 6f 6e 74 65 78 74 20 2a 70 20 3d 20 28  dxContext *p = (
15a0: 49 64 78 43 6f 6e 74 65 78 74 2a 29 70 43 74 78  IdxContext*)pCtx
15b0: 3b 0a 0a 23 69 66 20 30 0a 20 20 63 6f 6e 73 74  ;..#if 0.  const
15c0: 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 0a 20 20   char *zOp = .  
15d0: 20 20 65 4f 70 3d 3d 53 51 4c 49 54 45 5f 57 48    eOp==SQLITE_WH
15e0: 45 52 45 49 4e 46 4f 5f 54 41 42 4c 45 20 3f 20  EREINFO_TABLE ? 
15f0: 22 54 41 42 4c 45 22 20 3a 0a 20 20 20 20 65 4f  "TABLE" :.    eO
1600: 70 3d 3d 53 51 4c 49 54 45 5f 57 48 45 52 45 49  p==SQLITE_WHEREI
1610: 4e 46 4f 5f 45 51 55 41 4c 53 20 3f 20 22 45 51  NFO_EQUALS ? "EQ
1620: 55 41 4c 53 22 20 3a 0a 20 20 20 20 65 4f 70 3d  UALS" :.    eOp=
1630: 3d 53 51 4c 49 54 45 5f 57 48 45 52 45 49 4e 46  =SQLITE_WHEREINF
1640: 4f 5f 52 41 4e 47 45 20 3f 20 22 52 41 4e 47 45  O_RANGE ? "RANGE
1650: 22 20 3a 0a 20 20 20 20 65 4f 70 3d 3d 53 51 4c  " :.    eOp==SQL
1660: 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 4f 52  ITE_WHEREINFO_OR
1670: 44 45 52 42 59 20 3f 20 22 4f 52 44 45 52 42 59  DERBY ? "ORDERBY
1680: 22 20 3a 0a 20 20 20 20 65 4f 70 3d 3d 53 51 4c  " :.    eOp==SQL
1690: 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 4e 45  ITE_WHEREINFO_NE
16a0: 58 54 4f 52 20 3f 20 22 4e 45 58 54 4f 52 22 20  XTOR ? "NEXTOR" 
16b0: 3a 0a 20 20 20 20 65 4f 70 3d 3d 53 51 4c 49 54  :.    eOp==SQLIT
16c0: 45 5f 57 48 45 52 45 49 4e 46 4f 5f 45 4e 44 4f  E_WHEREINFO_ENDO
16d0: 52 20 3f 20 22 45 4e 44 4f 52 22 20 3a 0a 20 20  R ? "ENDOR" :.  
16e0: 20 20 65 4f 70 3d 3d 53 51 4c 49 54 45 5f 57 48    eOp==SQLITE_WH
16f0: 45 52 45 49 4e 46 4f 5f 42 45 47 49 4e 4f 52 20  EREINFO_BEGINOR 
1700: 3f 20 22 42 45 47 49 4e 4f 52 22 20 3a 0a 20 20  ? "BEGINOR" :.  
1710: 20 20 22 21 65 72 72 6f 72 21 22 3b 0a 20 20 70    "!error!";.  p
1720: 72 69 6e 74 66 28 22 6f 70 3d 25 73 20 7a 56 61  rintf("op=%s zVa
1730: 6c 3d 25 73 20 69 56 61 6c 3d 25 64 20 6d 61 73  l=%s iVal=%d mas
1740: 6b 3d 25 6c 6c 78 5c 6e 22 2c 20 7a 4f 70 2c 20  k=%llx\n", zOp, 
1750: 7a 56 61 6c 2c 20 69 56 61 6c 2c 20 6d 61 73 6b  zVal, iVal, mask
1760: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
1770: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1780: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1790: 20 65 4f 70 3d 3d 53 51 4c 49 54 45 5f 57 48 45   eOp==SQLITE_WHE
17a0: 52 45 49 4e 46 4f 5f 54 41 42 4c 45 20 7c 7c 20  REINFO_TABLE || 
17b0: 70 2d 3e 70 53 63 61 6e 21 3d 30 20 29 3b 0a 20  p->pScan!=0 );. 
17c0: 20 20 20 73 77 69 74 63 68 28 20 65 4f 70 20 29     switch( eOp )
17d0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  {.      case SQL
17e0: 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 54 41  ITE_WHEREINFO_TA
17f0: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  BLE: {.        i
1800: 6e 74 20 6e 56 61 6c 20 3d 20 73 74 72 6c 65 6e  nt nVal = strlen
1810: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  (zVal);.        
1820: 49 64 78 53 63 61 6e 20 2a 70 4e 65 77 20 3d 20  IdxScan *pNew = 
1830: 28 49 64 78 53 63 61 6e 2a 29 69 64 78 4d 61 6c  (IdxScan*)idxMal
1840: 6c 6f 63 28 26 70 2d 3e 72 63 2c 20 73 69 7a 65  loc(&p->rc, size
1850: 6f 66 28 49 64 78 53 63 61 6e 29 20 2b 20 6e 56  of(IdxScan) + nV
1860: 61 6c 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20  al + 1);.       
1870: 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 65 74   if( !pNew ) ret
1880: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  urn;.        pNe
1890: 77 2d 3e 7a 54 61 62 6c 65 20 3d 20 28 63 68 61  w->zTable = (cha
18a0: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
18b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77       memcpy(pNew
18c0: 2d 3e 7a 54 61 62 6c 65 2c 20 7a 56 61 6c 2c 20  ->zTable, zVal, 
18d0: 6e 56 61 6c 2b 31 29 3b 0a 20 20 20 20 20 20 20  nVal+1);.       
18e0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 53 63 61 6e   pNew->pNextScan
18f0: 20 3d 20 70 2d 3e 70 53 63 61 6e 3b 0a 20 20 20   = p->pScan;.   
1900: 20 20 20 20 20 70 4e 65 77 2d 3e 63 6f 76 65 72       pNew->cover
1910: 69 6e 67 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  ing = mask;.    
1920: 20 20 20 20 70 2d 3e 70 53 63 61 6e 20 3d 20 70      p->pScan = p
1930: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  New;.        p->
1940: 70 43 75 72 72 65 6e 74 20 3d 20 26 70 4e 65 77  pCurrent = &pNew
1950: 2d 3e 77 68 65 72 65 3b 0a 20 20 20 20 20 20 20  ->where;.       
1960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1970: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
1980: 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 4f 52 44  TE_WHEREINFO_ORD
1990: 45 52 42 59 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERBY: {.        
19a0: 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  IdxConstraint *p
19b0: 4e 65 77 20 3d 20 69 64 78 4e 65 77 43 6f 6e 73  New = idxNewCons
19c0: 74 72 61 69 6e 74 28 26 70 2d 3e 72 63 2c 20 7a  traint(&p->rc, z
19d0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Val);.        if
19e0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
19f0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
1a00: 2d 3e 69 43 6f 6c 20 3d 20 69 56 61 6c 3b 0a 20  ->iCol = iVal;. 
1a10: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 44 65         pNew->bDe
1a20: 73 63 20 3d 20 28 69 6e 74 29 6d 61 73 6b 3b 0a  sc = (int)mask;.
1a30: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1a40: 53 63 61 6e 2d 3e 70 4f 72 64 65 72 3d 3d 30 20  Scan->pOrder==0 
1a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
1a60: 70 53 63 61 6e 2d 3e 70 4f 72 64 65 72 20 3d 20  pScan->pOrder = 
1a70: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 65  pNew;.        }e
1a80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 49  lse{.          I
1a90: 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49  dxConstraint *pI
1aa0: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ter;.          f
1ab0: 6f 72 28 70 49 74 65 72 3d 70 2d 3e 70 53 63 61  or(pIter=p->pSca
1ac0: 6e 2d 3e 70 4f 72 64 65 72 3b 20 70 49 74 65 72  n->pOrder; pIter
1ad0: 2d 3e 70 4e 65 78 74 3b 20 70 49 74 65 72 3d 70  ->pNext; pIter=p
1ae0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 3b 0a 20 20  Iter->pNext);.  
1af0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
1b00: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1b10: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
1b20: 69 6e 6b 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ink = pNew;.    
1b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
1b40: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
1b50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b60: 57 48 45 52 45 49 4e 46 4f 5f 45 51 55 41 4c 53  WHEREINFO_EQUALS
1b70: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  :.      case SQL
1b80: 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 52 41  ITE_WHEREINFO_RA
1b90: 4e 47 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 49  NGE: {.        I
1ba0: 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 4e  dxConstraint *pN
1bb0: 65 77 20 3d 20 69 64 78 4e 65 77 43 6f 6e 73 74  ew = idxNewConst
1bc0: 72 61 69 6e 74 28 26 70 2d 3e 72 63 2c 20 7a 56  raint(&p->rc, zV
1bd0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
1be0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1bf0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  n;.        pNew-
1c00: 3e 69 43 6f 6c 20 3d 20 69 56 61 6c 3b 0a 20 20  >iCol = iVal;.  
1c10: 20 20 20 20 20 20 70 4e 65 77 2d 3e 64 65 70 6d        pNew->depm
1c20: 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20  ask = mask;..   
1c30: 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 51       if( eOp==SQ
1c40: 4c 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f 52  LITE_WHEREINFO_R
1c50: 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ANGE ){.        
1c60: 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20    pNew->pNext = 
1c70: 70 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70 52 61  p->pCurrent->pRa
1c80: 6e 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  nge;.          p
1c90: 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70 52 61 6e  ->pCurrent->pRan
1ca0: 67 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ge = pNew;.     
1cb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc0: 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
1cd0: 3d 20 70 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70  = p->pCurrent->p
1ce0: 45 71 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  Eq;.          p-
1cf0: 3e 70 43 75 72 72 65 6e 74 2d 3e 70 45 71 20 3d  >pCurrent->pEq =
1d00: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   pNew;.        }
1d10: 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
1d20: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
1d30: 70 49 6e 73 65 72 74 4d 61 73 6b 2c 20 31 2c 20  pInsertMask, 1, 
1d40: 6d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  mask);.        s
1d50: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
1d60: 49 6e 73 65 72 74 4d 61 73 6b 29 3b 0a 20 20 20  InsertMask);.   
1d70: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
1d80: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49  ite3_reset(p->pI
1d90: 6e 73 65 72 74 4d 61 73 6b 29 3b 0a 20 20 20 20  nsertMask);.    
1da0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1db0: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 53   }..      case S
1dc0: 51 4c 49 54 45 5f 57 48 45 52 45 49 4e 46 4f 5f  QLITE_WHEREINFO_
1dd0: 42 45 47 49 4e 4f 52 3a 20 7b 0a 20 20 20 20 20  BEGINOR: {.     
1de0: 20 20 20 49 64 78 57 68 65 72 65 20 2a 70 4e 65     IdxWhere *pNe
1df0: 77 20 3d 20 28 49 64 78 57 68 65 72 65 2a 29 69  w = (IdxWhere*)i
1e00: 64 78 4d 61 6c 6c 6f 63 28 26 70 2d 3e 72 63 2c  dxMalloc(&p->rc,
1e10: 20 73 69 7a 65 6f 66 28 49 64 78 57 68 65 72 65   sizeof(IdxWhere
1e20: 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1e30: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1e40: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1e50: 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 43 75  pParent = p->pCu
1e60: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  rrent;.        p
1e70: 4e 65 77 2d 3e 70 4e 65 78 74 4f 72 20 3d 20 70  New->pNextOr = p
1e80: 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70 4f 72 3b  ->pCurrent->pOr;
1e90: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 43 75 72  .        p->pCur
1ea0: 72 65 6e 74 2d 3e 70 4f 72 20 3d 20 70 4e 65 77  rent->pOr = pNew
1eb0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 43 75  ;.        p->pCu
1ec0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 3b 0a 20 20  rrent = pNew;.  
1ed0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ee0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65     }..      case
1ef0: 20 53 51 4c 49 54 45 5f 57 48 45 52 45 49 4e 46   SQLITE_WHEREINF
1f00: 4f 5f 4e 45 58 54 4f 52 3a 20 7b 0a 20 20 20 20  O_NEXTOR: {.    
1f10: 20 20 20 20 49 64 78 57 68 65 72 65 20 2a 70 4e      IdxWhere *pN
1f20: 65 77 20 3d 20 28 49 64 78 57 68 65 72 65 2a 29  ew = (IdxWhere*)
1f30: 69 64 78 4d 61 6c 6c 6f 63 28 26 70 2d 3e 72 63  idxMalloc(&p->rc
1f40: 2c 20 73 69 7a 65 6f 66 28 49 64 78 57 68 65 72  , sizeof(IdxWher
1f50: 65 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e));.        if(
1f60: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1f70: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  n;.        pNew-
1f80: 3e 70 50 61 72 65 6e 74 20 3d 20 70 2d 3e 70 43  >pParent = p->pC
1f90: 75 72 72 65 6e 74 2d 3e 70 50 61 72 65 6e 74 3b  urrent->pParent;
1fa0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fb0: 20 70 2d 3e 70 43 75 72 72 65 6e 74 2d 3e 70 53   p->pCurrent->pS
1fc0: 69 62 6c 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  ibling==0 );.   
1fd0: 20 20 20 20 20 70 2d 3e 70 43 75 72 72 65 6e 74       p->pCurrent
1fe0: 2d 3e 70 53 69 62 6c 69 6e 67 20 3d 20 70 4e 65  ->pSibling = pNe
1ff0: 77 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 43  w;.        p->pC
2000: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 3b 0a 20  urrent = pNew;. 
2010: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2020: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
2030: 65 20 53 51 4c 49 54 45 5f 57 48 45 52 45 49 4e  e SQLITE_WHEREIN
2040: 46 4f 5f 45 4e 44 4f 52 3a 20 7b 0a 20 20 20 20  FO_ENDOR: {.    
2050: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
2060: 43 75 72 72 65 6e 74 2d 3e 70 50 61 72 65 6e 74  Current->pParent
2070: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   );.        p->p
2080: 43 75 72 72 65 6e 74 20 3d 20 70 2d 3e 70 43 75  Current = p->pCu
2090: 72 72 65 6e 74 2d 3e 70 50 61 72 65 6e 74 3b 0a  rrent->pParent;.
20a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 72 72  .}../*.** An err
20d0: 6f 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  or associated wi
20e0: 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
20f0: 6c 65 20 64 62 20 68 61 73 20 6a 75 73 74 20 6f  le db has just o
2100: 63 63 75 72 72 65 64 2e 20 50 61 73 73 0a 2a 2a  ccurred. Pass.**
2110: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2120: 67 65 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20 66  ge to callback f
2130: 75 6e 63 74 69 6f 6e 20 78 4f 75 74 2e 0a 2a 2f  unction xOut..*/
2140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 78  .static void idx
2150: 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 0a 20  DatabaseError(. 
2160: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
2190: 64 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  dle */.  char **
21a0: 70 7a 45 72 72 6d 73 67 20 20 20 20 20 20 20 20  pzErrmsg        
21b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
21c0: 65 20 65 72 72 6f 72 20 68 65 72 65 20 2a 2f 0a  e error here */.
21d0: 29 7b 0a 20 20 2a 70 7a 45 72 72 6d 73 67 20 3d  ){.  *pzErrmsg =
21e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
21f0: 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  ("%s", sqlite3_e
2200: 72 72 6d 73 67 28 64 62 29 29 3b 0a 7d 0a 0a 73  rrmsg(db));.}..s
2210: 74 61 74 69 63 20 63 68 61 72 20 2a 69 64 78 51  tatic char *idxQ
2220: 75 65 72 79 54 6f 4c 69 73 74 28 0a 20 20 73 71  ueryToList(.  sq
2230: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f  lite3 *db, .  co
2240: 6e 73 74 20 63 68 61 72 20 2a 7a 42 69 6e 64 2c  nst char *zBind,
2250: 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 63  .  int *pRc,.  c
2260: 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 0a  har **pzErrmsg,.
2270: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2280: 71 6c 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  ql.){.  char *zR
2290: 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  et = 0;.  if( *p
22a0: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
22b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
22c0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
22d0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
22e0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
22f0: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2300: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
2310: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2320: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
2330: 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
2340: 31 2c 20 7a 42 69 6e 64 2c 20 2d 31 2c 20 53 51  1, zBind, -1, SQ
2350: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2360: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63  .      while( rc
2370: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
2380: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2390: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
23a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
23b0: 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
23c0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
23d0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
23e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 52  , 0);.        zR
23f0: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  et = sqlite3_mpr
2400: 69 6e 74 66 28 22 25 7a 25 73 25 51 22 2c 20 7a  intf("%z%s%Q", z
2410: 52 65 74 2c 20 7a 52 65 74 3f 22 2c 20 22 3a 22  Ret, zRet?", ":"
2420: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ", z);.        i
2430: 66 28 20 7a 52 65 74 3d 3d 30 20 29 7b 0a 20 20  f( zRet==0 ){.  
2440: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2450: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2460: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2470: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2480: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2490: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
24a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 64 78 44  rc ){.      idxD
24b0: 61 74 61 62 61 73 65 45 72 72 6f 72 28 64 62 2c  atabaseError(db,
24c0: 20 70 7a 45 72 72 6d 73 67 29 3b 0a 20 20 20 20   pzErrmsg);.    
24d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24e0: 52 65 74 29 3b 0a 20 20 20 20 20 20 7a 52 65 74  Ret);.      zRet
24f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
2500: 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 0a  *pRc = rc;.  }..
2510: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
2520: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 78  ..static int idx
2530: 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20 73  PrepareStmt(.  s
2540: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2560: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
2570: 65 20 74 6f 20 63 6f 6d 70 69 6c 65 20 61 67 61  e to compile aga
2580: 69 6e 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  inst */.  sqlite
2590: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c  3_stmt **ppStmt,
25a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25b0: 3a 20 43 6f 6d 70 69 6c 65 64 20 53 51 4c 20 73  : Compiled SQL s
25c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 68  tatement */.  ch
25d0: 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 2c 20 20  ar **pzErrmsg,  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f0: 20 4f 55 54 3a 20 73 71 6c 69 74 65 33 5f 6d 61   OUT: sqlite3_ma
2600: 6c 6c 6f 63 28 29 65 64 20 65 72 72 6f 72 20 6d  lloc()ed error m
2610: 65 73 73 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73  essage */.  cons
2620: 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 20 20 20  t char *zSql    
2630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2640: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
2650: 63 6f 6d 70 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  compile */.){.  
2660: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2670: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
2680: 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74  zSql, -1, ppStmt
2690: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
26a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26b0: 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
26c0: 20 20 69 64 78 44 61 74 61 62 61 73 65 45 72 72    idxDatabaseErr
26d0: 6f 72 28 64 62 2c 20 70 7a 45 72 72 6d 73 67 29  or(db, pzErrmsg)
26e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26f0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
2700: 20 69 64 78 50 72 69 6e 74 66 50 72 65 70 61 72   idxPrintfPrepar
2710: 65 53 74 6d 74 28 0a 20 20 73 71 6c 69 74 65 33  eStmt(.  sqlite3
2720: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
2730: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2740: 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 63  base handle to c
2750: 6f 6d 70 69 6c 65 20 61 67 61 69 6e 73 74 20 2a  ompile against *
2760: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2770: 20 2a 2a 70 70 53 74 6d 74 2c 20 20 20 20 20 20   **ppStmt,      
2780: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6d 70      /* OUT: Comp
2790: 69 6c 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65  iled SQL stateme
27a0: 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  nt */.  char **p
27b0: 7a 45 72 72 6d 73 67 2c 20 20 20 20 20 20 20 20  zErrmsg,        
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
27d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
27e0: 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
27f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2800: 20 2a 7a 46 6d 74 2c 20 20 20 20 20 20 20 20 20   *zFmt,         
2810: 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28        /* printf(
2820: 29 20 66 6f 72 6d 61 74 20 6f 66 20 53 51 4c 20  ) format of SQL 
2830: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 2e  statement */.  .
2840: 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2860: 2a 20 54 72 61 69 6c 69 6e 67 20 70 72 69 6e 74  * Trailing print
2870: 66 28 29 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  f() arguments */
2880: 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2890: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
28a0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73  ar *zSql;.  va_s
28b0: 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a  tart(ap, zFmt);.
28c0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
28d0: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20  _vmprintf(zFmt, 
28e0: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
28f0: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
2900: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2910: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 69  else{.    rc = i
2920: 64 78 50 72 65 70 61 72 65 53 74 6d 74 28 64 62  dxPrepareStmt(db
2930: 2c 20 70 70 53 74 6d 74 2c 20 70 7a 45 72 72 6d  , ppStmt, pzErrm
2940: 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  sg, zSql);.    s
2950: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
2960: 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  );.  }.  va_end(
2970: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
2980: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
2990: 69 64 78 47 65 74 54 61 62 6c 65 49 6e 66 6f 28  idxGetTableInfo(
29a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
29b0: 20 20 49 64 78 53 63 61 6e 20 2a 70 53 63 61 6e    IdxScan *pScan
29c0: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
29d0: 6d 73 67 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  msg.){.  const c
29e0: 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 53 63 61  har *zTbl = pSca
29f0: 6e 2d 3e 7a 54 61 62 6c 65 3b 0a 20 20 73 71 6c  n->zTable;.  sql
2a00: 69 74 65 33 5f 73 74 6d 74 20 2a 70 31 20 3d 20  ite3_stmt *p1 = 
2a10: 30 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  0;.  int nCol = 
2a20: 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  0;.  int nByte =
2a30: 20 73 69 7a 65 6f 66 28 49 64 78 54 61 62 6c 65   sizeof(IdxTable
2a40: 29 3b 0a 20 20 49 64 78 54 61 62 6c 65 20 2a 70  );.  IdxTable *p
2a50: 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  New = 0;.  int r
2a60: 63 2c 20 72 63 32 3b 0a 20 20 63 68 61 72 20 2a  c, rc2;.  char *
2a70: 70 43 73 72 3b 0a 0a 20 20 72 63 20 3d 20 69 64  pCsr;..  rc = id
2a80: 78 50 72 69 6e 74 66 50 72 65 70 61 72 65 53 74  xPrintfPrepareSt
2a90: 6d 74 28 64 62 2c 20 26 70 31 2c 20 70 7a 45 72  mt(db, &p1, pzEr
2aa0: 72 6d 73 67 2c 20 22 50 52 41 47 4d 41 20 74 61  rmsg, "PRAGMA ta
2ab0: 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54  ble_info=%Q", zT
2ac0: 62 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  bl);.  while( rc
2ad0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
2ae0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2af0: 65 33 5f 73 74 65 70 28 70 31 29 20 29 7b 0a 20  e3_step(p1) ){. 
2b00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b10: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Col = sqlite3_co
2b20: 6c 75 6d 6e 5f 74 65 78 74 28 70 31 2c 20 31 29  lumn_text(p1, 1)
2b30: 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 31  ;.    nByte += 1
2b40: 20 2b 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b   + strlen(zCol);
2b50: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b60: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
2b70: 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
2b80: 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 54 62   db, "main", zTb
2b90: 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20 26 7a 43 6f  l, zCol, 0, &zCo
2ba0: 6c 2c 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 29  l, 0, 0, 0.    )
2bb0: 3b 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 31  ;.    nByte += 1
2bc0: 20 2b 20 73 74 72 6c 65 6e 28 7a 43 6f 6c 29 3b   + strlen(zCol);
2bd0: 0a 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 7d  .    nCol++;.  }
2be0: 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
2bf0: 5f 72 65 73 65 74 28 70 31 29 3b 0a 20 20 69 66  _reset(p1);.  if
2c00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c10: 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 6e  ) rc = rc2;..  n
2c20: 42 79 74 65 20 2b 3d 20 73 69 7a 65 6f 66 28 49  Byte += sizeof(I
2c30: 64 78 43 6f 6c 75 6d 6e 29 20 2a 20 6e 43 6f 6c  dxColumn) * nCol
2c40: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2c50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65  TE_OK ){.    pNe
2c60: 77 20 3d 20 69 64 78 4d 61 6c 6c 6f 63 28 26 72  w = idxMalloc(&r
2c70: 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  c, nByte);.  }. 
2c80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c90: 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  OK ){.    pNew->
2ca0: 61 43 6f 6c 20 3d 20 28 49 64 78 43 6f 6c 75 6d  aCol = (IdxColum
2cb0: 6e 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  n*)&pNew[1];.   
2cc0: 20 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pNew->nCol = nC
2cd0: 6f 6c 3b 0a 20 20 20 20 70 43 73 72 20 3d 20 28  ol;.    pCsr = (
2ce0: 63 68 61 72 2a 29 26 70 4e 65 77 2d 3e 61 43 6f  char*)&pNew->aCo
2cf0: 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a 20 20  l[nCol];.  }..  
2d00: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nCol = 0;.  whil
2d10: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2d20: 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
2d30: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 31 29  sqlite3_step(p1)
2d40: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d50: 61 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ar *zCol = sqlit
2d60: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2d70: 31 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e  1, 1);.    int n
2d80: 43 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 7a 43  Copy = strlen(zC
2d90: 6f 6c 29 20 2b 20 31 3b 0a 20 20 20 20 70 4e 65  ol) + 1;.    pNe
2da0: 77 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 2e 7a 4e  w->aCol[nCol].zN
2db0: 61 6d 65 20 3d 20 70 43 73 72 3b 0a 20 20 20 20  ame = pCsr;.    
2dc0: 70 4e 65 77 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d  pNew->aCol[nCol]
2dd0: 2e 69 50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63  .iPk = sqlite3_c
2de0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 31 2c 20 35 29  olumn_int(p1, 5)
2df0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 73  ;.    memcpy(pCs
2e00: 72 2c 20 7a 43 6f 6c 2c 20 6e 43 6f 70 79 29 3b  r, zCol, nCopy);
2e10: 0a 20 20 20 20 70 43 73 72 20 2b 3d 20 6e 43 6f  .    pCsr += nCo
2e20: 70 79 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  py;..    rc = sq
2e30: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
2e40: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 20  mn_metadata(.   
2e50: 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22 2c       db, "main",
2e60: 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 30 2c 20   zTbl, zCol, 0, 
2e70: 26 7a 43 6f 6c 2c 20 30 2c 20 30 2c 20 30 0a 20  &zCol, 0, 0, 0. 
2e80: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
2e90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ea0: 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 73 74 72       nCopy = str
2eb0: 6c 65 6e 28 7a 43 6f 6c 29 20 2b 20 31 3b 0a 20  len(zCol) + 1;. 
2ec0: 20 20 20 20 20 70 4e 65 77 2d 3e 61 43 6f 6c 5b       pNew->aCol[
2ed0: 6e 43 6f 6c 5d 2e 7a 43 6f 6c 6c 20 3d 20 70 43  nCol].zColl = pC
2ee0: 73 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  sr;.      memcpy
2ef0: 28 70 43 73 72 2c 20 7a 43 6f 6c 2c 20 6e 43 6f  (pCsr, zCol, nCo
2f00: 70 79 29 3b 0a 20 20 20 20 20 20 70 43 73 72 20  py);.      pCsr 
2f10: 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
2f20: 0a 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 7d  .    nCol++;.  }
2f30: 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  .  rc2 = sqlite3
2f40: 5f 66 69 6e 61 6c 69 7a 65 28 70 31 29 3b 0a 20  _finalize(p1);. 
2f50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f60: 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a  OK ) rc = rc2;..
2f70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53 63 61 6e  _OK ){.    pScan
2f90: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 4e 65 77 3b  ->pTable = pNew;
2fa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2fb0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
2fc0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2fd0: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  rc;.}...static i
2fe0: 6e 74 20 69 64 78 43 72 65 61 74 65 54 61 62 6c  nt idxCreateTabl
2ff0: 65 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  es(.  sqlite3 *d
3000: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
3010: 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 64 61        /* User da
3020: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
3030: 74 65 33 20 2a 64 62 6d 2c 20 20 20 20 20 20 20  te3 *dbm,       
3040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3050: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3060: 65 20 74 6f 20 63 72 65 61 74 65 20 74 61 62 6c  e to create tabl
3070: 65 73 20 69 6e 20 2a 2f 0a 20 20 49 64 78 53 63  es in */.  IdxSc
3080: 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20  an *pScan,      
3090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
30a0: 73 74 20 6f 66 20 73 63 61 6e 73 20 2a 2f 0a 20  st of scans */. 
30b0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67   char **pzErrmsg
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
30e0: 65 73 73 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  essage */.){.  i
30f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
3100: 4b 3b 0a 20 20 49 64 78 53 63 61 6e 20 2a 70 49  K;.  IdxScan *pI
3110: 74 65 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 72  ter;.  for(pIter
3120: 3d 70 53 63 61 6e 3b 20 70 49 74 65 72 20 26 26  =pScan; pIter &&
3130: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
3140: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
3150: 78 74 53 63 61 6e 29 7b 0a 20 20 20 20 72 63 20  xtScan){.    rc 
3160: 3d 20 69 64 78 47 65 74 54 61 62 6c 65 49 6e 66  = idxGetTableInf
3170: 6f 28 64 62 2c 20 70 49 74 65 72 2c 20 70 7a 45  o(db, pIter, pzE
3180: 72 72 6d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrmsg);.    if( 
3190: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31a0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
31b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
31c0: 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20  mt *pSql = 0;.  
31d0: 20 20 20 20 72 63 20 3d 20 69 64 78 50 72 69 6e      rc = idxPrin
31e0: 74 66 50 72 65 70 61 72 65 53 74 6d 74 28 64 62  tfPrepareStmt(db
31f0: 2c 20 26 70 53 71 6c 2c 20 70 7a 45 72 72 6d 73  , &pSql, pzErrms
3200: 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 53  g, .          "S
3210: 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
3220: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
3230: 52 45 20 74 62 6c 5f 6e 61 6d 65 20 3d 20 25 51  RE tbl_name = %Q
3240: 22 2c 20 70 49 74 65 72 2d 3e 7a 54 61 62 6c 65  ", pIter->zTable
3250: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
3260: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
3270: 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
3280: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
3290: 28 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20  (pSql) ){.      
32a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
32b0: 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
32c0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
32d0: 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a  _text(pSql, 0);.
32e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32f0: 69 74 65 33 5f 65 78 65 63 28 64 62 6d 2c 20 7a  ite3_exec(dbm, z
3300: 53 71 6c 2c 20 30 2c 20 30 2c 20 70 7a 45 72 72  Sql, 0, 0, pzErr
3310: 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  msg);.      }.  
3320: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
3330: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29  3_finalize(pSql)
3340: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
3350: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
3360: 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   rc2;.    }.  }.
3370: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3380: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3390: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
33a0: 66 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  f *pRc is set to
33b0: 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20   anything other 
33c0: 74 68 61 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  than .** SQLITE_
33d0: 4f 4b 20 77 68 65 6e 20 69 74 20 69 73 20 63 61  OK when it is ca
33e0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  lled..**.** If *
33f0: 70 52 63 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRc is initially
3400: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
3410: 4b 2c 20 74 68 65 6e 20 74 68 65 20 74 65 78 74  K, then the text
3420: 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 2a 2a   specified by.**
3430: 20 74 68 65 20 70 72 69 6e 74 66 28 29 20 73 74   the printf() st
3440: 79 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 69 73  yle arguments is
3450: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 7a 49 6e   appended to zIn
3460: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
3470: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 61  returned.** in a
3480: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
3490: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6d 61 6c  d by sqlite3_mal
34a0: 6c 6f 63 28 29 2e 20 73 71 6c 69 74 65 33 5f 66  loc(). sqlite3_f
34b0: 72 65 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ree() is called 
34c0: 6f 6e 0a 2a 2a 20 7a 49 6e 20 62 65 66 6f 72 65  on.** zIn before
34d0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
34e0: 74 61 74 69 63 20 63 68 61 72 20 2a 69 64 78 41  tatic char *idxA
34f0: 70 70 65 6e 64 54 65 78 74 28 69 6e 74 20 2a 70  ppendText(int *p
3500: 52 63 2c 20 63 68 61 72 20 2a 7a 49 6e 2c 20 63  Rc, char *zIn, c
3510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c  onst char *zFmt,
3520: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
3530: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 41 70   ap;.  char *zAp
3540: 70 65 6e 64 20 3d 20 30 3b 0a 20 20 63 68 61 72  pend = 0;.  char
3550: 20 2a 7a 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *zRet = 0;.  in
3560: 74 20 6e 49 6e 20 3d 20 7a 49 6e 20 3f 20 73 74  t nIn = zIn ? st
3570: 72 6c 65 6e 28 7a 49 6e 29 20 3a 20 30 3b 0a 20  rlen(zIn) : 0;. 
3580: 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d 20 30   int nAppend = 0
3590: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
35a0: 20 7a 46 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70   zFmt);.  if( *p
35b0: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
35c0: 0a 20 20 20 20 7a 41 70 70 65 6e 64 20 3d 20 73  .    zAppend = s
35d0: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
35e0: 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 69  zFmt, ap);.    i
35f0: 66 28 20 7a 41 70 70 65 6e 64 20 29 7b 0a 20 20  f( zAppend ){.  
3600: 20 20 20 20 6e 41 70 70 65 6e 64 20 3d 20 73 74      nAppend = st
3610: 72 6c 65 6e 28 7a 41 70 70 65 6e 64 29 3b 0a 20  rlen(zAppend);. 
3620: 20 20 20 20 20 7a 52 65 74 20 3d 20 28 63 68 61       zRet = (cha
3630: 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  r*)sqlite3_mallo
3640: 63 28 6e 49 6e 20 2b 20 6e 41 70 70 65 6e 64 20  c(nIn + nAppend 
3650: 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  + 1);.    }.    
3660: 69 66 28 20 7a 41 70 70 65 6e 64 20 26 26 20 7a  if( zAppend && z
3670: 52 65 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  Ret ){.      mem
3680: 63 70 79 28 7a 52 65 74 2c 20 7a 49 6e 2c 20 6e  cpy(zRet, zIn, n
3690: 49 6e 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  In);.      memcp
36a0: 79 28 26 7a 52 65 74 5b 6e 49 6e 5d 2c 20 7a 41  y(&zRet[nIn], zA
36b0: 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 2b 31  ppend, nAppend+1
36c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
36d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
36e0: 28 7a 52 65 74 29 3b 0a 20 20 20 20 20 20 7a 52  (zRet);.      zR
36f0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70  et = 0;.      *p
3700: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
3710: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  M;.    }.    sql
3720: 69 74 65 33 5f 66 72 65 65 28 7a 41 70 70 65 6e  ite3_free(zAppen
3730: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
3740: 66 72 65 65 28 7a 49 6e 29 3b 0a 20 20 7d 0a 20  free(zIn);.  }. 
3750: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
3760: 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 73  eturn zRet;.}..s
3770: 74 61 74 69 63 20 69 6e 74 20 69 64 78 49 64 65  tatic int idxIde
3780: 6e 74 69 66 69 65 72 52 65 71 75 69 72 65 73 51  ntifierRequiresQ
3790: 75 6f 74 65 73 28 63 6f 6e 73 74 20 63 68 61 72  uotes(const char
37a0: 20 2a 7a 49 64 29 7b 0a 20 20 69 6e 74 20 69 3b   *zId){.  int i;
37b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49 64 5b  .  for(i=0; zId[
37c0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
37d0: 28 20 21 28 7a 49 64 5b 69 5d 3d 3d 27 5f 27 29  ( !(zId[i]=='_')
37e0: 0a 20 20 20 20 20 26 26 20 21 28 7a 49 64 5b 69  .     && !(zId[i
37f0: 5d 3e 3d 27 30 27 20 26 26 20 7a 49 64 5b 69 5d  ]>='0' && zId[i]
3800: 3c 3d 27 39 27 29 0a 20 20 20 20 20 26 26 20 21  <='9').     && !
3810: 28 7a 49 64 5b 69 5d 3e 3d 27 61 27 20 26 26 20  (zId[i]>='a' && 
3820: 7a 49 64 5b 69 5d 3c 3d 27 7a 27 29 0a 20 20 20  zId[i]<='z').   
3830: 20 20 26 26 20 21 28 7a 49 64 5b 69 5d 3e 3d 27    && !(zId[i]>='
3840: 41 27 20 26 26 20 7a 49 64 5b 69 5d 3c 3d 27 5a  A' && zId[i]<='Z
3850: 27 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ').    ){.      
3860: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3870: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3880: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
3890: 69 64 78 41 70 70 65 6e 64 43 6f 6c 44 65 66 6e  idxAppendColDefn
38a0: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
38b0: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 0a 20 20 49   char *zIn, .  I
38c0: 64 78 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 0a  dxTable *pTab, .
38d0: 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
38e0: 2a 70 43 6f 6e 73 0a 29 7b 0a 20 20 63 68 61 72  *pCons.){.  char
38f0: 20 2a 7a 52 65 74 20 3d 20 7a 49 6e 3b 0a 20 20   *zRet = zIn;.  
3900: 49 64 78 43 6f 6c 75 6d 6e 20 2a 70 20 3d 20 26  IdxColumn *p = &
3910: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 43 6f 6e 73  pTab->aCol[pCons
3920: 2d 3e 69 43 6f 6c 5d 3b 0a 20 20 69 66 28 20 7a  ->iCol];.  if( z
3930: 52 65 74 20 29 20 7a 52 65 74 20 3d 20 69 64 78  Ret ) zRet = idx
3940: 41 70 70 65 6e 64 54 65 78 74 28 70 52 63 2c 20  AppendText(pRc, 
3950: 7a 52 65 74 2c 20 22 2c 20 22 29 3b 0a 0a 20 20  zRet, ", ");..  
3960: 69 66 28 20 69 64 78 49 64 65 6e 74 69 66 69 65  if( idxIdentifie
3970: 72 52 65 71 75 69 72 65 73 51 75 6f 74 65 73 28  rRequiresQuotes(
3980: 70 2d 3e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  p->zName) ){.   
3990: 20 7a 52 65 74 20 3d 20 69 64 78 41 70 70 65 6e   zRet = idxAppen
39a0: 64 54 65 78 74 28 70 52 63 2c 20 7a 52 65 74 2c  dText(pRc, zRet,
39b0: 20 22 25 51 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29   "%Q", p->zName)
39c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
39d0: 52 65 74 20 3d 20 69 64 78 41 70 70 65 6e 64 54  Ret = idxAppendT
39e0: 65 78 74 28 70 52 63 2c 20 7a 52 65 74 2c 20 22  ext(pRc, zRet, "
39f0: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
3a00: 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74    }..  if( sqlit
3a10: 65 33 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a 43  e3_stricmp(p->zC
3a20: 6f 6c 6c 2c 20 70 43 6f 6e 73 2d 3e 7a 43 6f 6c  oll, pCons->zCol
3a30: 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 69 64  l) ){.    if( id
3a40: 78 49 64 65 6e 74 69 66 69 65 72 52 65 71 75 69  xIdentifierRequi
3a50: 72 65 73 51 75 6f 74 65 73 28 70 43 6f 6e 73 2d  resQuotes(pCons-
3a60: 3e 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20  >zColl) ){.     
3a70: 20 7a 52 65 74 20 3d 20 69 64 78 41 70 70 65 6e   zRet = idxAppen
3a80: 64 54 65 78 74 28 70 52 63 2c 20 7a 52 65 74 2c  dText(pRc, zRet,
3a90: 20 22 20 43 4f 4c 4c 41 54 45 20 25 51 22 2c 20   " COLLATE %Q", 
3aa0: 70 43 6f 6e 73 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20  pCons->zColl);. 
3ab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3ac0: 7a 52 65 74 20 3d 20 69 64 78 41 70 70 65 6e 64  zRet = idxAppend
3ad0: 54 65 78 74 28 70 52 63 2c 20 7a 52 65 74 2c 20  Text(pRc, zRet, 
3ae0: 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 70  " COLLATE %s", p
3af0: 43 6f 6e 73 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20  Cons->zColl);.  
3b00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
3b10: 43 6f 6e 73 2d 3e 62 44 65 73 63 20 29 7b 0a 20  Cons->bDesc ){. 
3b20: 20 20 20 7a 52 65 74 20 3d 20 69 64 78 41 70 70     zRet = idxApp
3b30: 65 6e 64 54 65 78 74 28 70 52 63 2c 20 7a 52 65  endText(pRc, zRe
3b40: 74 2c 20 22 20 44 45 53 43 22 29 3b 0a 20 20 7d  t, " DESC");.  }
3b50: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
3b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
3b70: 64 61 74 61 62 61 73 65 20 64 62 6d 20 66 6f 72  database dbm for
3b80: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6d 70 61 74   an index compat
3b90: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 6f 6e  ible with the on
3ba0: 65 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d 43  e idxCreateFromC
3bb0: 6f 6e 73 28 29 0a 2a 2a 20 77 6f 75 6c 64 20 63  ons().** would c
3bc0: 72 65 61 74 65 20 66 72 6f 6d 20 61 72 67 75 6d  reate from argum
3bd0: 65 6e 74 73 20 70 53 63 61 6e 2c 20 70 45 71 20  ents pScan, pEq 
3be0: 61 6e 64 20 70 54 61 69 6c 2e 20 49 66 20 6e 6f  and pTail. If no
3bf0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
3c00: 64 20 0a 2a 2a 20 73 75 63 68 20 61 6e 20 69 6e  d .** such an in
3c10: 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 20 72 65  dex is found, re
3c20: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 4f  turn non-zero. O
3c30: 72 2c 20 69 66 20 6e 6f 20 73 75 63 68 20 69 6e  r, if no such in
3c40: 64 65 78 20 69 73 20 66 6f 75 6e 64 2c 0a 2a 2a  dex is found,.**
3c50: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2a   return zero..**
3c60: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
3c70: 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 52 63  occurs, set *pRc
3c80: 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 65 72   to an SQLite er
3c90: 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 74  ror code and ret
3ca0: 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  urn zero..*/.sta
3cb0: 74 69 63 20 69 6e 74 20 69 64 78 46 69 6e 64 43  tic int idxFindC
3cc0: 6f 6d 70 61 74 69 62 6c 65 28 0a 20 20 69 6e 74  ompatible(.  int
3cd0: 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3cf0: 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
3d00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  */.  sqlite3* db
3d10: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
3d20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3d30: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
3d40: 49 64 78 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20  IdxScan *pScan, 
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 2f 2a 20 53 63 61 6e 20 66 6f 72 20 74 61 62 6c  /* Scan for tabl
3d70: 65 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  e to search for 
3d80: 69 6e 64 65 78 20 6f 6e 20 2a 2f 0a 20 20 49 64  index on */.  Id
3d90: 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 45 71  xConstraint *pEq
3da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
3db0: 20 4c 69 73 74 20 6f 66 20 3d 3d 20 63 6f 6e 73   List of == cons
3dc0: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 49 64 78  traints */.  Idx
3dd0: 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 54 61 69  Constraint *pTai
3de0: 6c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l            /* 
3df0: 4c 69 73 74 20 6f 66 20 72 61 6e 67 65 20 63 6f  List of range co
3e00: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 29 7b 0a  nstraints */.){.
3e10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
3e20: 62 6c 20 3d 20 70 53 63 61 6e 2d 3e 7a 54 61 62  bl = pScan->zTab
3e30: 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  le;.  sqlite3_st
3e40: 6d 74 20 2a 70 49 64 78 4c 69 73 74 20 3d 20 30  mt *pIdxList = 0
3e50: 3b 0a 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e  ;.  IdxConstrain
3e60: 74 20 2a 70 49 74 65 72 3b 0a 20 20 69 6e 74 20  t *pIter;.  int 
3e70: 6e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nEq = 0;        
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3e90: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3ea0: 73 20 69 6e 20 70 45 71 20 2a 2f 0a 20 20 69 6e  s in pEq */.  in
3eb0: 74 20 72 63 2c 20 72 63 32 3b 0a 0a 0a 20 20 2f  t rc, rc2;...  /
3ec0: 2a 20 43 6f 75 6e 74 20 74 68 65 20 65 6c 65 6d  * Count the elem
3ed0: 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 70 45 71  ents in list pEq
3ee0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d   */.  for(pIter=
3ef0: 70 45 71 3b 20 70 49 74 65 72 3b 20 70 49 74 65  pEq; pIter; pIte
3f00: 72 3d 70 49 74 65 72 2d 3e 70 4c 69 6e 6b 29 20  r=pIter->pLink) 
3f10: 6e 45 71 2b 2b 3b 0a 0a 20 20 72 63 20 3d 20 69  nEq++;..  rc = i
3f20: 64 78 50 72 69 6e 74 66 50 72 65 70 61 72 65 53  dxPrintfPrepareS
3f30: 74 6d 74 28 64 62 6d 2c 20 26 70 49 64 78 4c 69  tmt(dbm, &pIdxLi
3f40: 73 74 2c 20 30 2c 20 22 50 52 41 47 4d 41 20 69  st, 0, "PRAGMA i
3f50: 6e 64 65 78 5f 6c 69 73 74 3d 25 51 22 2c 20 7a  ndex_list=%Q", z
3f60: 54 62 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  Tbl);.  while( r
3f70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
3f80: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49 64  sqlite3_step(pId
3f90: 78 4c 69 73 74 29 3d 3d 53 51 4c 49 54 45 5f 52  xList)==SQLITE_R
3fa0: 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4d  OW ){.    int bM
3fb0: 61 74 63 68 20 3d 20 31 3b 0a 20 20 20 20 49 64  atch = 1;.    Id
3fc0: 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70 54 20  xConstraint *pT 
3fd0: 3d 20 70 54 61 69 6c 3b 0a 20 20 20 20 73 71 6c  = pTail;.    sql
3fe0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 66 6f  ite3_stmt *pInfo
3ff0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
4000: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 28 63 6f  char *zIdx = (co
4010: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
4020: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 49  3_column_text(pI
4030: 64 78 4c 69 73 74 2c 20 31 29 3b 0a 0a 20 20 20  dxList, 1);..   
4040: 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 49 64 78   /* Zero the Idx
4050: 43 6f 6e 73 74 72 61 69 6e 74 2e 62 46 6c 61 67  Constraint.bFlag
4060: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 70   values in the p
4070: 45 71 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 66  Eq list */.    f
4080: 6f 72 28 70 49 74 65 72 3d 70 45 71 3b 20 70 49  or(pIter=pEq; pI
4090: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
40a0: 2d 3e 70 4c 69 6e 6b 29 20 70 49 74 65 72 2d 3e  ->pLink) pIter->
40b0: 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20  bFlag = 0;..    
40c0: 72 63 20 3d 20 69 64 78 50 72 69 6e 74 66 50 72  rc = idxPrintfPr
40d0: 65 70 61 72 65 53 74 6d 74 28 64 62 6d 2c 20 26  epareStmt(dbm, &
40e0: 70 49 6e 66 6f 2c 20 30 2c 20 22 50 52 41 47 4d  pInfo, 0, "PRAGM
40f0: 41 20 69 6e 64 65 78 5f 78 49 6e 66 6f 3d 25 51  A index_xInfo=%Q
4100: 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 77 68  ", zIdx);.    wh
4110: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
4120: 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
4130: 65 70 28 70 49 6e 66 6f 29 3d 3d 53 51 4c 49 54  ep(pInfo)==SQLIT
4140: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
4150: 6e 74 20 69 49 64 78 20 3d 20 73 71 6c 69 74 65  nt iIdx = sqlite
4160: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 6e  3_column_int(pIn
4170: 66 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 6e  fo, 0);.      in
4180: 74 20 69 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  t iCol = sqlite3
4190: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 49 6e 66  _column_int(pInf
41a0: 6f 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e  o, 1);.      con
41b0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
41c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
41d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
41e0: 74 28 70 49 6e 66 6f 2c 20 34 29 3b 0a 0a 20 20  t(pInfo, 4);..  
41f0: 20 20 20 20 69 66 28 20 69 49 64 78 3c 6e 45 71      if( iIdx<nEq
4200: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
4210: 70 49 74 65 72 3d 70 45 71 3b 20 70 49 74 65 72  pIter=pEq; pIter
4220: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
4230: 4c 69 6e 6b 29 7b 0a 20 20 20 20 20 20 20 20 20  Link){.         
4240: 20 69 66 28 20 70 49 74 65 72 2d 3e 62 46 6c 61   if( pIter->bFla
4250: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
4260: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
4270: 72 2d 3e 69 43 6f 6c 21 3d 69 43 6f 6c 20 29 20  r->iCol!=iCol ) 
4280: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4290: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
42a0: 73 74 72 69 63 6d 70 28 70 49 74 65 72 2d 3e 7a  stricmp(pIter->z
42b0: 43 6f 6c 6c 2c 20 7a 43 6f 6c 6c 29 20 29 20 63  Coll, zColl) ) c
42c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
42d0: 20 20 20 70 49 74 65 72 2d 3e 62 46 6c 61 67 20     pIter->bFlag 
42e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
42f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4300: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
4310: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
4320: 20 20 62 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    bMatch = 0;.  
4330: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4340: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4350: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
4360: 28 20 70 54 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pT ){.        
4370: 20 20 69 66 28 20 70 54 2d 3e 69 43 6f 6c 21 3d    if( pT->iCol!=
4380: 69 43 6f 6c 20 7c 7c 20 73 71 6c 69 74 65 33 5f  iCol || sqlite3_
4390: 73 74 72 69 63 6d 70 28 70 54 2d 3e 7a 43 6f 6c  stricmp(pT->zCol
43a0: 6c 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  l, zColl) ){.   
43b0: 20 20 20 20 20 20 20 20 20 62 4d 61 74 63 68 20           bMatch 
43c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
43d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
43e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54    }.          pT
43f0: 20 3d 20 70 54 2d 3e 70 4c 69 6e 6b 3b 0a 20 20   = pT->pLink;.  
4400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4410: 20 20 20 20 7d 0a 20 20 20 20 72 63 32 20 3d 20      }.    rc2 = 
4420: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
4430: 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  (pInfo);.    if(
4440: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4450: 20 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 20 20   rc = rc2;..    
4460: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4470: 4b 20 26 26 20 62 4d 61 74 63 68 20 29 7b 0a 20  K && bMatch ){. 
4480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
4490: 61 6c 69 7a 65 28 70 49 64 78 4c 69 73 74 29 3b  alize(pIdxList);
44a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
44b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32  .    }.  }.  rc2
44c0: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
44d0: 69 7a 65 28 70 49 64 78 4c 69 73 74 29 3b 0a 20  ize(pIdxList);. 
44e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
44f0: 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 0a  OK ) rc = rc2;..
4500: 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 72    *pRc = rc;.  r
4510: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74  eturn 0;.}..stat
4520: 69 63 20 69 6e 74 20 69 64 78 43 72 65 61 74 65  ic int idxCreate
4530: 46 72 6f 6d 43 6f 6e 73 28 0a 20 20 49 64 78 43  FromCons(.  IdxC
4540: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
4550: 49 64 78 53 63 61 6e 20 2a 70 53 63 61 6e 2c 0a  IdxScan *pScan,.
4560: 20 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20    IdxConstraint 
4570: 2a 70 45 71 2c 20 0a 20 20 49 64 78 43 6f 6e 73  *pEq, .  IdxCons
4580: 74 72 61 69 6e 74 20 2a 70 54 61 69 6c 0a 29 7b  traint *pTail.){
4590: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 6d 20  .  sqlite3 *dbm 
45a0: 3d 20 70 43 74 78 2d 3e 64 62 6d 3b 0a 20 20 69  = pCtx->dbm;.  i
45b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
45c0: 4b 3b 0a 20 20 69 66 28 20 28 70 45 71 20 7c 7c  K;.  if( (pEq ||
45d0: 20 70 54 61 69 6c 29 20 26 26 20 30 3d 3d 69 64   pTail) && 0==id
45e0: 78 46 69 6e 64 43 6f 6d 70 61 74 69 62 6c 65 28  xFindCompatible(
45f0: 26 72 63 2c 20 64 62 6d 2c 20 70 53 63 61 6e 2c  &rc, dbm, pScan,
4600: 20 70 45 71 2c 20 70 54 61 69 6c 29 20 29 7b 0a   pEq, pTail) ){.
4610: 20 20 20 20 49 64 78 54 61 62 6c 65 20 2a 70 54      IdxTable *pT
4620: 61 62 20 3d 20 70 53 63 61 6e 2d 3e 70 54 61 62  ab = pScan->pTab
4630: 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  le;.    char *zC
4640: 6f 6c 73 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ols = 0;.    cha
4650: 72 20 2a 7a 49 64 78 20 3d 20 30 3b 0a 20 20 20  r *zIdx = 0;.   
4660: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
4670: 70 43 6f 6e 73 3b 0a 20 20 20 20 69 6e 74 20 68  pCons;.    int h
4680: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
4690: 63 68 61 72 20 2a 7a 46 6d 74 3b 0a 0a 20 20 20  char *zFmt;..   
46a0: 20 66 6f 72 28 70 43 6f 6e 73 3d 70 45 71 3b 20   for(pCons=pEq; 
46b0: 70 43 6f 6e 73 3b 20 70 43 6f 6e 73 3d 70 43 6f  pCons; pCons=pCo
46c0: 6e 73 2d 3e 70 4c 69 6e 6b 29 7b 0a 20 20 20 20  ns->pLink){.    
46d0: 20 20 7a 43 6f 6c 73 20 3d 20 69 64 78 41 70 70    zCols = idxApp
46e0: 65 6e 64 43 6f 6c 44 65 66 6e 28 26 72 63 2c 20  endColDefn(&rc, 
46f0: 7a 43 6f 6c 73 2c 20 70 54 61 62 2c 20 70 43 6f  zCols, pTab, pCo
4700: 6e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ns);.    }.    f
4710: 6f 72 28 70 43 6f 6e 73 3d 70 54 61 69 6c 3b 20  or(pCons=pTail; 
4720: 70 43 6f 6e 73 3b 20 70 43 6f 6e 73 3d 70 43 6f  pCons; pCons=pCo
4730: 6e 73 2d 3e 70 4c 69 6e 6b 29 7b 0a 20 20 20 20  ns->pLink){.    
4740: 20 20 7a 43 6f 6c 73 20 3d 20 69 64 78 41 70 70    zCols = idxApp
4750: 65 6e 64 43 6f 6c 44 65 66 6e 28 26 72 63 2c 20  endColDefn(&rc, 
4760: 7a 43 6f 6c 73 2c 20 70 54 61 62 2c 20 70 43 6f  zCols, pTab, pCo
4770: 6e 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ns);.    }..    
4780: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4790: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 48 61  K ){.      /* Ha
47a0: 73 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  sh the list of c
47b0: 6f 6c 75 6d 6e 73 20 74 6f 20 63 6f 6d 65 20 75  olumns to come u
47c0: 70 20 77 69 74 68 20 61 20 6e 61 6d 65 20 66 6f  p with a name fo
47d0: 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
47e0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
47f0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 43 6f 6c 73    for(i=0; zCols
4800: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
4810: 20 20 20 68 20 2b 3d 20 28 28 68 3c 3c 33 29 20     h += ((h<<3) 
4820: 2b 20 7a 43 6f 6c 73 5b 69 5d 29 3b 0a 20 20 20  + zCols[i]);.   
4830: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
4840: 69 64 78 49 64 65 6e 74 69 66 69 65 72 52 65 71  idxIdentifierReq
4850: 75 69 72 65 73 51 75 6f 74 65 73 28 70 53 63 61  uiresQuotes(pSca
4860: 6e 2d 3e 7a 54 61 62 6c 65 29 20 29 7b 0a 20 20  n->zTable) ){.  
4870: 20 20 20 20 20 20 7a 46 6d 74 20 3d 20 22 43 52        zFmt = "CR
4880: 45 41 54 45 20 49 4e 44 45 58 20 27 25 71 5f 69  EATE INDEX '%q_i
4890: 64 78 5f 25 30 38 78 27 20 4f 4e 20 25 51 28 25  dx_%08x' ON %Q(%
48a0: 73 29 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  s)";.      }else
48b0: 7b 0a 20 20 20 20 20 20 20 20 7a 46 6d 74 20 3d  {.        zFmt =
48c0: 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 25   "CREATE INDEX %
48d0: 73 5f 69 64 78 5f 25 30 38 78 20 4f 4e 20 25 73  s_idx_%08x ON %s
48e0: 28 25 73 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  (%s)";.      }. 
48f0: 20 20 20 20 20 7a 49 64 78 20 3d 20 73 71 6c 69       zIdx = sqli
4900: 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 46 6d 74  te3_mprintf(zFmt
4910: 2c 20 70 53 63 61 6e 2d 3e 7a 54 61 62 6c 65 2c  , pScan->zTable,
4920: 20 68 2c 20 70 53 63 61 6e 2d 3e 7a 54 61 62 6c   h, pScan->zTabl
4930: 65 2c 20 7a 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e, zCols);.     
4940: 20 69 66 28 20 21 7a 49 64 78 20 29 7b 0a 20 20   if( !zIdx ){.  
4950: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4960: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
4970: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
4980: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
4990: 64 62 6d 2c 20 7a 49 64 78 2c 20 30 2c 20 30 2c  dbm, zIdx, 0, 0,
49a0: 20 70 43 74 78 2d 3e 70 7a 45 72 72 6d 73 67 29   pCtx->pzErrmsg)
49b0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69  ;.        /* pri
49c0: 6e 74 66 28 22 25 73 5c 6e 22 2c 20 7a 49 64 78  ntf("%s\n", zIdx
49d0: 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ); */.      }.  
49e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
49f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 74  SQLITE_OK && pCt
4a00: 78 2d 3e 69 49 64 78 52 6f 77 69 64 3d 3d 30 20  x->iIdxRowid==0 
4a10: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
4a20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4a30: 73 74 6d 74 20 2a 70 4c 61 73 74 20 3d 20 30 3b  stmt *pLast = 0;
4a40: 0a 20 20 20 20 20 20 72 63 20 3d 20 69 64 78 50  .      rc = idxP
4a50: 72 65 70 61 72 65 53 74 6d 74 28 64 62 6d 2c 20  repareStmt(dbm, 
4a60: 26 70 4c 61 73 74 2c 20 70 43 74 78 2d 3e 70 7a  &pLast, pCtx->pz
4a70: 45 72 72 6d 73 67 2c 20 0a 20 20 20 20 20 20 20  Errmsg, .       
4a80: 20 20 20 22 53 45 4c 45 43 54 20 6d 61 78 28 72     "SELECT max(r
4a90: 6f 77 69 64 29 20 46 52 4f 4d 20 73 71 6c 69 74  owid) FROM sqlit
4aa0: 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
4ab0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
4ac0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
4ad0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
4ae0: 33 5f 73 74 65 70 28 70 4c 61 73 74 29 20 29 7b  3_step(pLast) ){
4af0: 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69  .        pCtx->i
4b00: 49 64 78 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  IdxRowid = sqlit
4b10: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
4b20: 70 4c 61 73 74 2c 20 30 29 3b 0a 20 20 20 20 20  pLast, 0);.     
4b30: 20 7d 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73   }.      rc2 = s
4b40: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
4b50: 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pLast);.      if
4b60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4b70: 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ) rc = rc2;.    
4b80: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  }..    sqlite3_f
4b90: 72 65 65 28 7a 49 64 78 29 3b 0a 20 20 20 20 73  ree(zIdx);.    s
4ba0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
4bb0: 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
4bc0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
4bd0: 6e 74 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d  nt idxCreateFrom
4be0: 57 68 65 72 65 28 0a 20 20 20 20 49 64 78 43 6f  Where(.    IdxCo
4bf0: 6e 74 65 78 74 2a 2c 20 69 36 34 2c 20 49 64 78  ntext*, i64, Idx
4c00: 53 63 61 6e 2a 2c 20 49 64 78 57 68 65 72 65 2a  Scan*, IdxWhere*
4c10: 2c 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 2a  , IdxConstraint*
4c20: 2c 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 2a  , IdxConstraint*
4c30: 0a 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .);..static int 
4c40: 69 64 78 43 72 65 61 74 65 46 6f 72 65 61 63 68  idxCreateForeach
4c50: 4f 72 28 0a 20 20 49 64 78 43 6f 6e 74 65 78 74  Or(.  IdxContext
4c60: 20 2a 70 43 74 78 2c 20 0a 20 20 69 36 34 20 6d   *pCtx, .  i64 m
4c70: 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ask,            
4c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
4c90: 6e 73 69 64 65 72 20 6f 6e 6c 79 20 74 68 65 73  nsider only thes
4ca0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  e constraints */
4cb0: 0a 20 20 49 64 78 53 63 61 6e 20 2a 70 53 63 61  .  IdxScan *pSca
4cc0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
4cd0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 64     /* Create ind
4ce0: 65 78 65 73 20 66 6f 72 20 74 68 69 73 20 73 63  exes for this sc
4cf0: 61 6e 20 2a 2f 0a 20 20 49 64 78 57 68 65 72 65  an */.  IdxWhere
4d00: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
4d10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
4d20: 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 72 6f 6d  constraints from
4d30: 20 68 65 72 65 20 2a 2f 0a 20 20 49 64 78 43 6f   here */.  IdxCo
4d40: 6e 73 74 72 61 69 6e 74 20 2a 70 45 71 2c 20 20  nstraint *pEq,  
4d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 3d 3d             /* ==
4d60: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
4d70: 20 69 6e 63 6c 75 73 69 6f 6e 20 2a 2f 0a 20 20   inclusion */.  
4d80: 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  IdxConstraint *p
4d90: 54 61 69 6c 20 20 20 20 20 20 20 20 20 20 20 20  Tail            
4da0: 2f 2a 20 72 61 6e 67 65 2f 4f 52 44 45 52 20 42  /* range/ORDER B
4db0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  Y constraints fo
4dc0: 72 20 69 6e 63 6c 75 73 69 6f 6e 20 2a 2f 0a 29  r inclusion */.)
4dd0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4de0: 49 54 45 5f 4f 4b 3b 0a 20 20 49 64 78 57 68 65  ITE_OK;.  IdxWhe
4df0: 72 65 20 2a 70 31 3b 0a 20 20 49 64 78 57 68 65  re *p1;.  IdxWhe
4e00: 72 65 20 2a 70 32 3b 0a 20 20 66 6f 72 28 70 31  re *p2;.  for(p1
4e10: 3d 70 57 68 65 72 65 2d 3e 70 4f 72 3b 20 70 31  =pWhere->pOr; p1
4e20: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
4e30: 4b 3b 20 70 31 3d 70 31 2d 3e 70 4e 65 78 74 4f  K; p1=p1->pNextO
4e40: 72 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 64 78  r){.    rc = idx
4e50: 43 72 65 61 74 65 46 72 6f 6d 57 68 65 72 65 28  CreateFromWhere(
4e60: 70 43 74 78 2c 20 6d 61 73 6b 2c 20 70 53 63 61  pCtx, mask, pSca
4e70: 6e 2c 20 70 31 2c 20 70 45 71 2c 20 70 54 61 69  n, p1, pEq, pTai
4e80: 6c 29 3b 0a 20 20 20 20 66 6f 72 28 70 32 3d 70  l);.    for(p2=p
4e90: 31 2d 3e 70 53 69 62 6c 69 6e 67 3b 20 70 32 20  1->pSibling; p2 
4ea0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
4eb0: 3b 20 70 32 3d 70 32 2d 3e 70 53 69 62 6c 69 6e  ; p2=p2->pSiblin
4ec0: 67 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  g){.      rc = i
4ed0: 64 78 43 72 65 61 74 65 46 72 6f 6d 57 68 65 72  dxCreateFromWher
4ee0: 65 28 70 43 74 78 2c 20 6d 61 73 6b 2c 20 70 53  e(pCtx, mask, pS
4ef0: 63 61 6e 2c 20 70 32 2c 20 70 45 71 2c 20 70 54  can, p2, pEq, pT
4f00: 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ail);.    }.  }.
4f10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4f20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
4f30: 65 20 69 66 20 6c 69 73 74 20 70 4c 69 73 74 20  e if list pList 
4f40: 28 6c 69 6e 6b 65 64 20 62 79 20 49 64 78 43 6f  (linked by IdxCo
4f50: 6e 73 74 72 61 69 6e 74 2e 70 4c 69 6e 6b 29 20  nstraint.pLink) 
4f60: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
4f70: 6e 73 74 72 61 69 6e 74 20 63 6f 6d 70 61 74 69  nstraint compati
4f80: 62 6c 65 20 77 69 74 68 20 2a 70 2e 20 4f 74 68  ble with *p. Oth
4f90: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 66 61  erwise return fa
4fa0: 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lse..*/.static i
4fb0: 6e 74 20 69 64 78 46 69 6e 64 43 6f 6e 73 74 72  nt idxFindConstr
4fc0: 61 69 6e 74 28 49 64 78 43 6f 6e 73 74 72 61 69  aint(IdxConstrai
4fd0: 6e 74 20 2a 70 4c 69 73 74 2c 20 49 64 78 43 6f  nt *pList, IdxCo
4fe0: 6e 73 74 72 61 69 6e 74 20 2a 70 29 7b 0a 20 20  nstraint *p){.  
4ff0: 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a 70  IdxConstraint *p
5000: 43 6d 70 3b 0a 20 20 66 6f 72 28 70 43 6d 70 3d  Cmp;.  for(pCmp=
5010: 70 4c 69 73 74 3b 20 70 43 6d 70 3b 20 70 43 6d  pList; pCmp; pCm
5020: 70 3d 70 43 6d 70 2d 3e 70 4c 69 6e 6b 29 7b 0a  p=pCmp->pLink){.
5030: 20 20 20 20 69 66 28 20 70 2d 3e 69 43 6f 6c 3d      if( p->iCol=
5040: 3d 70 43 6d 70 2d 3e 69 43 6f 6c 20 29 20 72 65  =pCmp->iCol ) re
5050: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
5060: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
5070: 63 20 69 6e 74 20 69 64 78 43 72 65 61 74 65 46  c int idxCreateF
5080: 72 6f 6d 57 68 65 72 65 28 0a 20 20 49 64 78 43  romWhere(.  IdxC
5090: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
50a0: 20 69 36 34 20 6d 61 73 6b 2c 20 20 20 20 20 20   i64 mask,      
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 6f 6e 6c   /* Consider onl
50d0: 79 20 74 68 65 73 65 20 63 6f 6e 73 74 72 61 69  y these constrai
50e0: 6e 74 73 20 2a 2f 0a 20 20 49 64 78 53 63 61 6e  nts */.  IdxScan
50f0: 20 2a 70 53 63 61 6e 2c 20 20 20 20 20 20 20 20   *pScan,        
5100: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 72 65 61           /* Crea
5110: 74 65 20 69 6e 64 65 78 65 73 20 66 6f 72 20 74  te indexes for t
5120: 68 69 73 20 73 63 61 6e 20 2a 2f 0a 20 20 49 64  his scan */.  Id
5130: 78 57 68 65 72 65 20 2a 70 57 68 65 72 65 2c 20  xWhere *pWhere, 
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5150: 20 52 65 61 64 20 63 6f 6e 73 74 72 61 69 6e 74   Read constraint
5160: 73 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 20  s from here */. 
5170: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
5180: 70 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  pEq,            
5190: 20 2f 2a 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e   /* == constrain
51a0: 74 73 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f 6e  ts for inclusion
51b0: 20 2a 2f 0a 20 20 49 64 78 43 6f 6e 73 74 72 61   */.  IdxConstra
51c0: 69 6e 74 20 2a 70 54 61 69 6c 20 20 20 20 20 20  int *pTail      
51d0: 20 20 20 20 20 20 2f 2a 20 72 61 6e 67 65 2f 4f        /* range/O
51e0: 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69  RDER BY constrai
51f0: 6e 74 73 20 66 6f 72 20 69 6e 63 6c 75 73 69 6f  nts for inclusio
5200: 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  n */.){.  sqlite
5210: 33 20 2a 64 62 6d 20 3d 20 70 43 74 78 2d 3e 64  3 *dbm = pCtx->d
5220: 62 6d 3b 0a 20 20 49 64 78 43 6f 6e 73 74 72 61  bm;.  IdxConstra
5230: 69 6e 74 20 2a 70 31 20 3d 20 70 45 71 3b 0a 20  int *p1 = pEq;. 
5240: 20 49 64 78 43 6f 6e 73 74 72 61 69 6e 74 20 2a   IdxConstraint *
5250: 70 43 6f 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  pCon;.  int rc;.
5260: 0a 20 20 2f 2a 20 47 61 74 68 65 72 20 75 70 20  .  /* Gather up 
5270: 61 6c 6c 20 74 68 65 20 3d 3d 20 63 6f 6e 73 74  all the == const
5280: 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61 74 63  raints that matc
5290: 68 20 74 68 65 20 6d 61 73 6b 2e 20 2a 2f 0a 20  h the mask. */. 
52a0: 20 66 6f 72 28 70 43 6f 6e 3d 70 57 68 65 72 65   for(pCon=pWhere
52b0: 2d 3e 70 45 71 3b 20 70 43 6f 6e 3b 20 70 43 6f  ->pEq; pCon; pCo
52c0: 6e 3d 70 43 6f 6e 2d 3e 70 4e 65 78 74 29 7b 0a  n=pCon->pNext){.
52d0: 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
52e0: 70 43 6f 6e 2d 3e 64 65 70 6d 61 73 6b 29 3d 3d  pCon->depmask)==
52f0: 70 43 6f 6e 2d 3e 64 65 70 6d 61 73 6b 20 0a 20  pCon->depmask . 
5300: 20 20 20 20 26 26 20 69 64 78 46 69 6e 64 43 6f      && idxFindCo
5310: 6e 73 74 72 61 69 6e 74 28 70 31 2c 20 70 43 6f  nstraint(p1, pCo
5320: 6e 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 69 64  n)==0.     && id
5330: 78 46 69 6e 64 43 6f 6e 73 74 72 61 69 6e 74 28  xFindConstraint(
5340: 70 54 61 69 6c 2c 20 70 43 6f 6e 29 3d 3d 30 0a  pTail, pCon)==0.
5350: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 6f      ){.      pCo
5360: 6e 2d 3e 70 4c 69 6e 6b 20 3d 20 70 31 3b 0a 20  n->pLink = p1;. 
5370: 20 20 20 20 20 70 31 20 3d 20 70 43 6f 6e 3b 0a       p1 = pCon;.
5380: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5390: 43 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 20  Create an index 
53a0: 75 73 69 6e 67 20 74 68 65 20 3d 3d 20 63 6f 6e  using the == con
53b0: 73 74 72 61 69 6e 74 73 20 63 6f 6c 6c 65 63 74  straints collect
53c0: 65 64 20 61 62 6f 76 65 2e 20 41 6e 64 20 74 68  ed above. And th
53d0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 20 63 6f 6e  e.  ** range con
53e0: 73 74 72 61 69 6e 74 2f 4f 52 44 45 52 20 42 59  straint/ORDER BY
53f0: 20 74 65 72 6d 73 20 70 61 73 73 65 64 20 69 6e   terms passed in
5400: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2c 20   by the caller, 
5410: 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 72 63 20  if any. */.  rc 
5420: 3d 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d 43  = idxCreateFromC
5430: 6f 6e 73 28 70 43 74 78 2c 20 70 53 63 61 6e 2c  ons(pCtx, pScan,
5440: 20 70 31 2c 20 70 54 61 69 6c 29 3b 0a 20 20 69   p1, pTail);.  i
5450: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5460: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 64 78   ){.    rc = idx
5470: 43 72 65 61 74 65 46 6f 72 65 61 63 68 4f 72 28  CreateForeachOr(
5480: 70 43 74 78 2c 20 6d 61 73 6b 2c 20 70 53 63 61  pCtx, mask, pSca
5490: 6e 2c 20 70 57 68 65 72 65 2c 20 70 31 2c 20 70  n, pWhere, p1, p
54a0: 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Tail);.  }..  /*
54b0: 20 49 66 20 6e 6f 20 72 61 6e 67 65 2f 4f 52 44   If no range/ORD
54c0: 45 52 20 42 59 20 70 61 73 73 65 64 20 62 79 20  ER BY passed by 
54d0: 74 68 65 20 63 61 6c 6c 65 72 2c 20 63 72 65 61  the caller, crea
54e0: 74 65 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  te a version of 
54f0: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 66  the.  ** index f
5500: 6f 72 20 65 61 63 68 20 72 61 6e 67 65 20 63 6f  or each range co
5510: 6e 73 74 72 61 69 6e 74 20 74 68 61 74 20 6d 61  nstraint that ma
5520: 74 63 68 65 73 20 74 68 65 20 6d 61 73 6b 2e 20  tches the mask. 
5530: 2a 2f 0a 20 20 69 66 28 20 70 54 61 69 6c 3d 3d  */.  if( pTail==
5540: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 43 6f  0 ){.    for(pCo
5550: 6e 3d 70 57 68 65 72 65 2d 3e 70 52 61 6e 67 65  n=pWhere->pRange
5560: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
5570: 26 26 20 70 43 6f 6e 3b 20 70 43 6f 6e 3d 70 43  && pCon; pCon=pC
5580: 6f 6e 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  on->pNext){.    
5590: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e 2d 3e    assert( pCon->
55a0: 70 4c 69 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  pLink==0 );.    
55b0: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 43    if( (mask & pC
55c0: 6f 6e 2d 3e 64 65 70 6d 61 73 6b 29 3d 3d 70 43  on->depmask)==pC
55d0: 6f 6e 2d 3e 64 65 70 6d 61 73 6b 0a 20 20 20 20  on->depmask.    
55e0: 20 20 20 20 26 26 20 69 64 78 46 69 6e 64 43 6f      && idxFindCo
55f0: 6e 73 74 72 61 69 6e 74 28 70 45 71 2c 20 70 43  nstraint(pEq, pC
5600: 6f 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26  on)==0.        &
5610: 26 20 69 64 78 46 69 6e 64 43 6f 6e 73 74 72 61  & idxFindConstra
5620: 69 6e 74 28 70 54 61 69 6c 2c 20 70 43 6f 6e 29  int(pTail, pCon)
5630: 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
5640: 20 20 20 20 20 72 63 20 3d 20 69 64 78 43 72 65       rc = idxCre
5650: 61 74 65 46 72 6f 6d 43 6f 6e 73 28 70 43 74 78  ateFromCons(pCtx
5660: 2c 20 70 53 63 61 6e 2c 20 70 31 2c 20 70 43 6f  , pScan, p1, pCo
5670: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
5680: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5690: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
56a0: 69 64 78 43 72 65 61 74 65 46 6f 72 65 61 63 68  idxCreateForeach
56b0: 4f 72 28 70 43 74 78 2c 20 6d 61 73 6b 2c 20 70  Or(pCtx, mask, p
56c0: 53 63 61 6e 2c 20 70 57 68 65 72 65 2c 20 70 31  Scan, pWhere, p1
56d0: 2c 20 70 43 6f 6e 29 3b 0a 20 20 20 20 20 20 20  , pCon);.       
56e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
56f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
5700: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
5710: 74 65 20 63 61 6e 64 69 64 61 74 65 20 69 6e 64  te candidate ind
5720: 65 78 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  exes in database
5730: 20 5b 64 62 6d 5d 20 62 61 73 65 64 20 6f 6e 20   [dbm] based on 
5740: 74 68 65 20 64 61 74 61 20 69 6e 20 0a 2a 2a 20  the data in .** 
5750: 6c 69 6e 6b 65 64 2d 6c 69 73 74 20 70 53 63 61  linked-list pSca
5760: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
5770: 20 69 64 78 43 72 65 61 74 65 43 61 6e 64 69 64   idxCreateCandid
5780: 61 74 65 73 28 49 64 78 43 6f 6e 74 65 78 74 20  ates(IdxContext 
5790: 2a 70 43 74 78 29 7b 0a 20 20 73 71 6c 69 74 65  *pCtx){.  sqlite
57a0: 33 20 2a 64 62 6d 20 3d 20 70 43 74 78 2d 3e 64  3 *dbm = pCtx->d
57b0: 62 6d 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20  bm;.  int rc2;. 
57c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
57d0: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  _OK;.  sqlite3_s
57e0: 74 6d 74 20 2a 70 44 65 70 6d 61 73 6b 3b 20 20  tmt *pDepmask;  
57f0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 65 61 63         /* Foreac
5800: 68 20 64 65 70 6d 61 73 6b 20 2a 2f 0a 20 20 49  h depmask */.  I
5810: 64 78 53 63 61 6e 20 2a 70 49 74 65 72 3b 0a 0a  dxScan *pIter;..
5820: 20 20 72 63 20 3d 20 69 64 78 50 72 65 70 61 72    rc = idxPrepar
5830: 65 53 74 6d 74 28 70 43 74 78 2d 3e 64 62 6d 2c  eStmt(pCtx->dbm,
5840: 20 26 70 44 65 70 6d 61 73 6b 2c 20 70 43 74 78   &pDepmask, pCtx
5850: 2d 3e 70 7a 45 72 72 6d 73 67 2c 20 0a 20 20 20  ->pzErrmsg, .   
5860: 20 20 20 22 53 45 4c 45 43 54 20 6d 61 73 6b 20     "SELECT mask 
5870: 46 52 4f 4d 20 64 65 70 6d 61 73 6b 22 0a 20 20  FROM depmask".  
5880: 29 3b 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d  );..  for(pIter=
5890: 70 43 74 78 2d 3e 70 53 63 61 6e 3b 20 70 49 74  pCtx->pScan; pIt
58a0: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
58b0: 5f 4f 4b 3b 20 70 49 74 65 72 3d 70 49 74 65 72  _OK; pIter=pIter
58c0: 2d 3e 70 4e 65 78 74 53 63 61 6e 29 7b 0a 20 20  ->pNextScan){.  
58d0: 20 20 49 64 78 57 68 65 72 65 20 2a 70 57 68 65    IdxWhere *pWhe
58e0: 72 65 20 3d 20 26 70 49 74 65 72 2d 3e 77 68 65  re = &pIter->whe
58f0: 72 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53  re;.    while( S
5900: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
5910: 65 33 5f 73 74 65 70 28 70 44 65 70 6d 61 73 6b  e3_step(pDepmask
5920: 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
5930: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  OK ){.      i64 
5940: 6d 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63  mask = sqlite3_c
5950: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 44 65 70  olumn_int64(pDep
5960: 6d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  mask, 0);.      
5970: 72 63 20 3d 20 69 64 78 43 72 65 61 74 65 46 72  rc = idxCreateFr
5980: 6f 6d 57 68 65 72 65 28 70 43 74 78 2c 20 6d 61  omWhere(pCtx, ma
5990: 73 6b 2c 20 70 49 74 65 72 2c 20 70 57 68 65 72  sk, pIter, pWher
59a0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
59b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
59c0: 4b 20 26 26 20 70 49 74 65 72 2d 3e 70 4f 72 64  K && pIter->pOrd
59d0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  er ){.        rc
59e0: 20 3d 20 69 64 78 43 72 65 61 74 65 46 72 6f 6d   = idxCreateFrom
59f0: 57 68 65 72 65 28 70 43 74 78 2c 20 6d 61 73 6b  Where(pCtx, mask
5a00: 2c 20 70 49 74 65 72 2c 20 70 57 68 65 72 65 2c  , pIter, pWhere,
5a10: 20 30 2c 20 70 49 74 65 72 2d 3e 70 4f 72 64 65   0, pIter->pOrde
5a20: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
5a30: 7d 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73  }.  }..  rc2 = s
5a40: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
5a50: 70 44 65 70 6d 61 73 6b 29 3b 0a 20 20 69 66 28  pDepmask);.  if(
5a60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5a70: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 72 65 74   rc = rc2;.  ret
5a80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
5a90: 63 20 76 6f 69 64 20 69 64 78 53 63 61 6e 46 72  c void idxScanFr
5aa0: 65 65 28 49 64 78 53 63 61 6e 20 2a 70 53 63 61  ee(IdxScan *pSca
5ab0: 6e 29 7b 0a 20 20 49 64 78 53 63 61 6e 20 2a 70  n){.  IdxScan *p
5ac0: 49 74 65 72 3b 0a 20 20 49 64 78 53 63 61 6e 20  Iter;.  IdxScan 
5ad0: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 49  *pNext;.  for(pI
5ae0: 74 65 72 3d 70 53 63 61 6e 3b 20 70 49 74 65 72  ter=pScan; pIter
5af0: 3b 20 70 49 74 65 72 3d 70 4e 65 78 74 29 7b 0a  ; pIter=pNext){.
5b00: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 74 65      pNext = pIte
5b10: 72 2d 3e 70 4e 65 78 74 53 63 61 6e 3b 0a 0a 20  r->pNextScan;.. 
5b20: 20 7d 0a 7d 0a 0a 69 6e 74 20 69 64 78 46 69 6e   }.}..int idxFin
5b30: 64 49 6e 64 65 78 65 73 28 0a 20 20 49 64 78 43  dIndexes(.  IdxC
5b40: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
5b50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
5b60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5b70: 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 66       /* SQL to f
5b80: 69 6e 64 20 69 6e 64 65 78 65 73 20 66 6f 72 20  ind indexes for 
5b90: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 4f 75 74  */.  void (*xOut
5ba0: 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 63  )(void*, const c
5bb0: 68 61 72 2a 29 2c 20 20 20 20 2f 2a 20 4f 75 74  har*),    /* Out
5bc0: 70 75 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  put callback */.
5bd0: 20 20 76 6f 69 64 20 2a 70 4f 75 74 43 74 78 2c    void *pOutCtx,
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
5c00: 74 20 66 6f 72 20 78 4f 75 74 28 29 20 2a 2f 0a  t for xOut() */.
5c10: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20    char **pzErr  
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
5c40: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 73 71  rror message (sq
5c50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 2a 2f  lite3_malloc) */
5c60: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
5c70: 62 6d 20 3d 20 70 43 74 78 2d 3e 64 62 6d 3b 0a  bm = pCtx->dbm;.
5c80: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
5c90: 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  pExplain = 0;.  
5ca0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
5cb0: 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 69 6e 74  elect = 0;.  int
5cc0: 20 72 63 2c 20 72 63 32 3b 0a 20 20 69 6e 74 20   rc, rc2;.  int 
5cd0: 62 46 6f 75 6e 64 20 3d 20 30 3b 0a 0a 20 20 72  bFound = 0;..  r
5ce0: 63 20 3d 20 69 64 78 50 72 69 6e 74 66 50 72 65  c = idxPrintfPre
5cf0: 70 61 72 65 53 74 6d 74 28 64 62 6d 2c 20 26 70  pareStmt(dbm, &p
5d00: 45 78 70 6c 61 69 6e 2c 20 70 7a 45 72 72 2c 22  Explain, pzErr,"
5d10: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
5d20: 41 4e 20 25 73 22 2c 7a 53 71 6c 29 3b 0a 20 20  AN %s",zSql);.  
5d30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5d40: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 64  K ){.    rc = id
5d50: 78 50 72 65 70 61 72 65 53 74 6d 74 28 64 62 6d  xPrepareStmt(dbm
5d60: 2c 20 26 70 53 65 6c 65 63 74 2c 20 70 7a 45 72  , &pSelect, pzEr
5d70: 72 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c  r, .        "SEL
5d80: 45 43 54 20 72 6f 77 69 64 2c 20 73 71 6c 20 46  ECT rowid, sql F
5d90: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
5da0: 72 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 3f  r WHERE name = ?
5db0: 22 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  ".    );.  }..  
5dc0: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
5dd0: 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f  E_OK && sqlite3_
5de0: 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d  step(pExplain)==
5df0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
5e00: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e    int i;.    con
5e10: 73 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c  st char *zDetail
5e20: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
5e30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5e40: 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
5e50: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 65 74 61 69  ;.    int nDetai
5e60: 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 44 65 74 61  l = strlen(zDeta
5e70: 69 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  il);..    for(i=
5e80: 30 3b 20 69 3c 6e 44 65 74 61 69 6c 3b 20 69 2b  0; i<nDetail; i+
5e90: 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
5ea0: 63 68 61 72 20 2a 7a 49 64 78 20 3d 20 30 3b 0a  char *zIdx = 0;.
5eb0: 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
5ec0: 28 26 7a 44 65 74 61 69 6c 5b 69 5d 2c 20 22 20  (&zDetail[i], " 
5ed0: 55 53 49 4e 47 20 49 4e 44 45 58 20 22 2c 20 31  USING INDEX ", 1
5ee0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
5ef0: 20 7a 49 64 78 20 3d 20 26 7a 44 65 74 61 69 6c   zIdx = &zDetail
5f00: 5b 69 2b 31 33 5d 3b 0a 20 20 20 20 20 20 7d 65  [i+13];.      }e
5f10: 6c 73 65 20 69 66 28 20 6d 65 6d 63 6d 70 28 26  lse if( memcmp(&
5f20: 7a 44 65 74 61 69 6c 5b 69 5d 2c 20 22 20 55 53  zDetail[i], " US
5f30: 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
5f40: 45 58 20 22 2c 20 32 32 29 3d 3d 30 20 29 7b 0a  EX ", 22)==0 ){.
5f50: 20 20 20 20 20 20 20 20 7a 49 64 78 20 3d 20 26          zIdx = &
5f60: 7a 44 65 74 61 69 6c 5b 69 2b 32 32 5d 3b 0a 20  zDetail[i+22];. 
5f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
5f80: 20 7a 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20   zIdx ){.       
5f90: 20 69 6e 74 20 6e 49 64 78 20 3d 20 30 3b 0a 20   int nIdx = 0;. 
5fa0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 49         while( zI
5fb0: 64 78 5b 6e 49 64 78 5d 21 3d 27 5c 30 27 20 26  dx[nIdx]!='\0' &
5fc0: 26 20 28 7a 49 64 78 5b 6e 49 64 78 5d 21 3d 27  & (zIdx[nIdx]!='
5fd0: 20 27 20 7c 7c 20 7a 49 64 78 5b 6e 49 64 78 2b   ' || zIdx[nIdx+
5fe0: 31 5d 21 3d 27 28 27 29 20 29 7b 0a 20 20 20 20  1]!='(') ){.    
5ff0: 20 20 20 20 20 20 6e 49 64 78 2b 2b 3b 0a 20 20        nIdx++;.  
6000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6010: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
6020: 74 28 70 53 65 6c 65 63 74 2c 20 31 2c 20 7a 49  t(pSelect, 1, zI
6030: 64 78 2c 20 6e 49 64 78 2c 20 53 51 4c 49 54 45  dx, nIdx, SQLITE
6040: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
6050: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
6060: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
6070: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
6080: 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
6090: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
60a0: 5f 69 6e 74 36 34 28 70 53 65 6c 65 63 74 2c 20  _int64(pSelect, 
60b0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  0);.          co
60c0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
60d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
60e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
60f0: 74 28 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  t(pSelect, 1);. 
6100: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
6110: 77 69 64 3e 3d 70 43 74 78 2d 3e 69 49 64 78 52  wid>=pCtx->iIdxR
6120: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
6130: 20 20 20 20 78 4f 75 74 28 70 4f 75 74 43 74 78      xOut(pOutCtx
6140: 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
6150: 20 20 20 20 20 62 46 6f 75 6e 64 20 3d 20 31 3b       bFound = 1;
6160: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
6180: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6190: 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  t(pSelect);.    
61a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
61b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
61c0: 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  c2 = sqlite3_res
61d0: 65 74 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  et(pExplain);.  
61e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
61f0: 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
6200: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6210: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 62 46 6f  K ){.    if( bFo
6220: 75 6e 64 3d 3d 30 20 29 20 78 4f 75 74 28 70 4f  und==0 ) xOut(pO
6230: 75 74 43 74 78 2c 20 22 28 6e 6f 20 6e 65 77 20  utCtx, "(no new 
6240: 69 6e 64 65 78 65 73 29 22 29 3b 0a 20 20 20 20  indexes)");.    
6250: 78 4f 75 74 28 70 4f 75 74 43 74 78 2c 20 22 22  xOut(pOutCtx, ""
6260: 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
6270: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6280: 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  & sqlite3_step(p
6290: 45 78 70 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45  Explain)==SQLITE
62a0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
62b0: 69 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c 69  iSelectid = sqli
62c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
62d0: 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
62e0: 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73 71   int iOrder = sq
62f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
6300: 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20  (pExplain, 1);. 
6310: 20 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20 73     int iFrom = s
6320: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
6330: 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b 0a  t(pExplain, 2);.
6340: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6350: 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74  zDetail = (const
6360: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
6370: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
6380: 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20 63 68 61  ain, 3);.    cha
6390: 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 20 20 7a 4f  r *zOut;..    zO
63a0: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ut = sqlite3_mpr
63b0: 69 6e 74 66 28 22 25 64 7c 25 64 7c 25 64 7c 25  intf("%d|%d|%d|%
63c0: 73 22 2c 20 69 53 65 6c 65 63 74 69 64 2c 20 69  s", iSelectid, i
63d0: 4f 72 64 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44  Order, iFrom, zD
63e0: 65 74 61 69 6c 29 3b 0a 20 20 20 20 69 66 28 20  etail);.    if( 
63f0: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zOut==0 ){.     
6400: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6410: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
6420: 20 20 20 20 20 78 4f 75 74 28 70 4f 75 74 43 74       xOut(pOutCt
6430: 78 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  x, zOut);.      
6440: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
6450: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
6460: 66 69 6e 64 5f 69 6e 64 65 78 65 73 5f 6f 75 74  find_indexes_out
6470: 3a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65  :.  rc2 = sqlite
6480: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
6490: 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ain);.  if( rc==
64a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
64b0: 20 72 63 32 3b 0a 20 20 72 63 32 20 3d 20 73 71   rc2;.  rc2 = sq
64c0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
64d0: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72  Select);.  if( r
64e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
64f0: 63 20 3d 20 72 63 32 3b 0a 0a 20 20 72 65 74 75  c = rc2;..  retu
6500: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6510: 54 68 65 20 78 4f 75 74 20 63 61 6c 6c 62 61 63  The xOut callbac
6520: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  k is invoked to 
6530: 72 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 6f  return command o
6540: 75 74 70 75 74 20 74 6f 20 74 68 65 20 75 73 65  utput to the use
6550: 72 2e 20 54 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  r. The.** second
6560: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6c 77   argument is alw
6570: 61 79 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ays a nul-termin
6580: 61 74 65 64 20 73 74 72 69 6e 67 2e 20 54 68 65  ated string. The
6590: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
65a0: 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 7a 65 72  is.** passed zer
65b0: 6f 20 69 66 20 74 68 65 20 73 74 72 69 6e 67 20  o if the string 
65c0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 72 6d 61 6c 20  contains normal 
65d0: 6f 75 74 70 75 74 20 6f 72 20 6e 6f 6e 2d 7a 65  output or non-ze
65e0: 72 6f 20 69 66 20 69 74 20 69 73 20 61 6e 0a 2a  ro if it is an.*
65f0: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  * error message.
6600: 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 49 6e 64  .*/.int shellInd
6610: 65 78 65 73 43 6f 6d 6d 61 6e 64 28 0a 20 20 73  exesCommand(.  s
6620: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6650: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
6660: 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 2f 2a 20 53 51 4c 20 74 6f 20 66 69 6e 64 20   /* SQL to find 
6690: 69 6e 64 65 78 65 73 20 66 6f 72 20 2a 2f 0a 20  indexes for */. 
66a0: 20 76 6f 69 64 20 28 2a 78 4f 75 74 29 28 76 6f   void (*xOut)(vo
66b0: 69 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  id*, const char*
66c0: 29 2c 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  ),    /* Output 
66d0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f  callback */.  vo
66e0: 69 64 20 2a 70 4f 75 74 43 74 78 2c 20 20 20 20  id *pOutCtx,    
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6700: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f     /* Context fo
6710: 72 20 78 4f 75 74 28 29 20 2a 2f 0a 20 20 63 68  r xOut() */.  ch
6720: 61 72 20 2a 2a 70 7a 45 72 72 6d 73 67 20 20 20  ar **pzErrmsg   
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
6750: 20 6d 65 73 73 61 67 65 20 28 73 71 6c 69 74 65   message (sqlite
6760: 33 5f 6d 61 6c 6c 6f 63 29 20 2a 2f 0a 29 7b 0a  3_malloc) */.){.
6770: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6780: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 20  E_OK;.  sqlite3 
6790: 2a 64 62 6d 20 3d 20 30 3b 0a 20 20 49 64 78 43  *dbm = 0;.  IdxC
67a0: 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 73 71  ontext ctx;.  sq
67b0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
67c0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
67d0: 20 53 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70 69   Statement compi
67e0: 6c 65 64 20 66 72 6f 6d 20 7a 53 71 6c 20 2a 2f  led from zSql */
67f0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 63 74 78 2c  ..  memset(&ctx,
6800: 20 30 2c 20 73 69 7a 65 6f 66 28 49 64 78 43 6f   0, sizeof(IdxCo
6810: 6e 74 65 78 74 29 29 3b 0a 20 20 63 74 78 2e 70  ntext));.  ctx.p
6820: 7a 45 72 72 6d 73 67 20 3d 20 70 7a 45 72 72 6d  zErrmsg = pzErrm
6830: 73 67 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61  sg;..  /* Open a
6840: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
6850: 62 61 73 65 20 74 6f 20 77 6f 72 6b 20 77 69 74  base to work wit
6860: 68 2e 20 54 68 65 20 6d 61 69 6e 20 69 6e 2d 6d  h. The main in-m
6870: 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 64 61 74 61  emory .  ** data
6880: 62 61 73 65 20 73 63 68 65 6d 61 20 63 6f 6e 74  base schema cont
6890: 61 69 6e 73 20 74 61 62 6c 65 73 20 73 69 6d 69  ains tables simi
68a0: 6c 61 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 20  lar to those in 
68b0: 74 68 65 20 75 73 65 72 73 20 0a 20 20 2a 2a 20  the users .  ** 
68c0: 64 61 74 61 62 61 73 65 20 28 68 61 6e 64 6c 65  database (handle
68d0: 20 64 62 29 2e 20 54 68 65 20 61 74 74 61 63 68   db). The attach
68e0: 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 20  ed in-memory db 
68f0: 28 61 75 78 29 20 63 6f 6e 74 61 69 6e 73 0a 20  (aux) contains. 
6900: 20 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   ** application 
6910: 74 61 62 6c 65 73 20 75 73 65 64 20 62 79 20 74  tables used by t
6920: 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  he code in this 
6930: 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  file.  */.  rc =
6940: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a   sqlite3_open(":
6950: 6d 65 6d 6f 72 79 3a 22 2c 20 26 64 62 6d 29 3b  memory:", &dbm);
6960: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6970: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
6980: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
6990: 6d 2c 20 0a 20 20 20 20 20 20 20 20 22 41 54 54  m, .        "ATT
69a0: 41 43 48 20 27 3a 6d 65 6d 6f 72 79 3a 27 20 41  ACH ':memory:' A
69b0: 53 20 61 75 78 3b 22 0a 20 20 20 20 20 20 20 20  S aux;".        
69c0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75  "CREATE TABLE au
69d0: 78 2e 64 65 70 6d 61 73 6b 28 6d 61 73 6b 20 50  x.depmask(mask P
69e0: 52 49 4d 41 52 59 20 4b 45 59 29 20 57 49 54 48  RIMARY KEY) WITH
69f0: 4f 55 54 20 52 4f 57 49 44 3b 22 0a 20 20 20 20  OUT ROWID;".    
6a00: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
6a10: 45 20 61 75 78 2e 69 6e 64 65 78 65 73 28 6e 61  E aux.indexes(na
6a20: 6d 65 20 50 52 49 4d 41 52 59 20 4b 45 59 29 20  me PRIMARY KEY) 
6a30: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 22 0a  WITHOUT ROWID;".
6a40: 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
6a50: 49 4e 54 4f 20 61 75 78 2e 64 65 70 6d 61 73 6b  INTO aux.depmask
6a60: 20 56 41 4c 55 45 53 28 30 29 3b 22 0a 20 20 20   VALUES(0);".   
6a70: 20 20 20 20 20 2c 20 30 2c 20 30 2c 20 70 7a 45       , 0, 0, pzE
6a80: 72 72 6d 73 67 0a 20 20 20 20 29 3b 0a 20 20 7d  rrmsg.    );.  }
6a90: 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61  ..  /* Prepare a
6aa0: 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  n INSERT stateme
6ab0: 6e 74 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  nt for writing t
6ac0: 6f 20 61 75 78 2e 64 65 70 6d 61 73 6b 20 2a 2f  o aux.depmask */
6ad0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6ae0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
6af0: 20 69 64 78 50 72 65 70 61 72 65 53 74 6d 74 28   idxPrepareStmt(
6b00: 64 62 6d 2c 20 26 63 74 78 2e 70 49 6e 73 65 72  dbm, &ctx.pInser
6b10: 74 4d 61 73 6b 2c 20 70 7a 45 72 72 6d 73 67 2c  tMask, pzErrmsg,
6b20: 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
6b30: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
6b40: 64 65 70 6d 61 73 6b 20 53 45 4c 45 43 54 20 6d  depmask SELECT m
6b50: 61 73 6b 20 7c 20 3f 31 20 46 52 4f 4d 20 64 65  ask | ?1 FROM de
6b60: 70 6d 61 73 6b 3b 22 0a 20 20 20 20 29 3b 0a 20  pmask;".    );. 
6b70: 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65   }..  /* Analyze
6b80: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
6b90: 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 2a  ement in zSql. *
6ba0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6bb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 74 78  TE_OK ){.    ctx
6bc0: 2e 64 62 6d 20 3d 20 64 62 6d 3b 0a 20 20 20 20  .dbm = dbm;.    
6bd0: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
6be0: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
6bf0: 4f 4e 46 49 47 5f 57 48 45 52 45 49 4e 46 4f 2c  ONFIG_WHEREINFO,
6c00: 20 69 64 78 57 68 65 72 65 49 6e 66 6f 2c 20 28   idxWhereInfo, (
6c10: 76 6f 69 64 2a 29 26 63 74 78 29 3b 0a 20 20 20  void*)&ctx);.   
6c20: 20 72 63 20 3d 20 69 64 78 50 72 65 70 61 72 65   rc = idxPrepare
6c30: 53 74 6d 74 28 64 62 2c 20 26 70 53 74 6d 74 2c  Stmt(db, &pStmt,
6c40: 20 70 7a 45 72 72 6d 73 67 2c 20 7a 53 71 6c 29   pzErrmsg, zSql)
6c50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
6c60: 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
6c70: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 48 45 52  TE_DBCONFIG_WHER
6c80: 45 49 4e 46 4f 2c 20 28 76 6f 69 64 2a 29 30 2c  EINFO, (void*)0,
6c90: 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20   (void*)0);.    
6ca0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6cb0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 0a 20 20  (pStmt);.  }..  
6cc0: 2f 2a 20 43 72 65 61 74 65 20 74 61 62 6c 65 73  /* Create tables
6cd0: 20 77 69 74 68 69 6e 20 74 68 65 20 6d 61 69 6e   within the main
6ce0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
6cf0: 61 73 65 2e 20 54 68 65 73 65 20 74 61 62 6c 65  ase. These table
6d00: 73 0a 20 20 2a 2a 20 68 61 76 65 20 74 68 65 20  s.  ** have the 
6d10: 73 61 6d 65 20 6e 61 6d 65 73 2c 20 63 6f 6c 75  same names, colu
6d20: 6d 6e 73 20 61 6e 64 20 64 65 63 6c 61 72 65 64  mns and declared
6d30: 20 74 79 70 65 73 20 61 73 20 74 68 65 20 74 61   types as the ta
6d40: 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  bles in.  ** the
6d50: 20 75 73 65 72 20 64 61 74 61 62 61 73 65 2e 20   user database. 
6d60: 41 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  All constraints 
6d70: 65 78 63 65 70 74 20 66 6f 72 20 50 52 49 4d 41  except for PRIMA
6d80: 52 59 20 4b 45 59 20 61 72 65 0a 20 20 2a 2a 20  RY KEY are.  ** 
6d90: 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69 66  removed. */.  if
6da0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6db0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 69 64 78 43  ){.    rc = idxC
6dc0: 72 65 61 74 65 54 61 62 6c 65 73 28 64 62 2c 20  reateTables(db, 
6dd0: 64 62 6d 2c 20 63 74 78 2e 70 53 63 61 6e 2c 20  dbm, ctx.pScan, 
6de0: 70 7a 45 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a  pzErrmsg);.  }..
6df0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 61 6e 64    /* Create cand
6e00: 69 64 61 74 65 20 69 6e 64 65 78 65 73 20 77 69  idate indexes wi
6e10: 74 68 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  thin the in-memo
6e20: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
6e30: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
6e40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6e50: 63 20 3d 20 69 64 78 43 72 65 61 74 65 43 61 6e  c = idxCreateCan
6e60: 64 69 64 61 74 65 73 28 26 63 74 78 29 3b 0a 20  didates(&ctx);. 
6e70: 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
6e80: 6f 75 74 20 77 68 69 63 68 20 6f 66 20 74 68 65  out which of the
6e90: 20 63 61 6e 64 69 64 61 74 65 20 69 6e 64 65 78   candidate index
6ea0: 65 73 20 61 72 65 20 70 72 65 66 65 72 72 65 64  es are preferred
6eb0: 20 62 79 20 74 68 65 20 71 75 65 72 79 0a 20 20   by the query.  
6ec0: 2a 2a 20 70 6c 61 6e 6e 65 72 20 61 6e 64 20 72  ** planner and r
6ed0: 65 70 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74  eport the result
6ee0: 73 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 20  s to the user.  
6ef0: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
6f00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
6f10: 20 3d 20 69 64 78 46 69 6e 64 49 6e 64 65 78 65   = idxFindIndexe
6f20: 73 28 26 63 74 78 2c 20 7a 53 71 6c 2c 20 78 4f  s(&ctx, zSql, xO
6f30: 75 74 2c 20 70 4f 75 74 43 74 78 2c 20 70 7a 45  ut, pOutCtx, pzE
6f40: 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 69  rrmsg);.  }..  i
6f50: 64 78 53 63 61 6e 46 72 65 65 28 63 74 78 2e 70  dxScanFree(ctx.p
6f60: 53 63 61 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  Scan);.  sqlite3
6f70: 5f 66 69 6e 61 6c 69 7a 65 28 63 74 78 2e 70 49  _finalize(ctx.pI
6f80: 6e 73 65 72 74 4d 61 73 6b 29 3b 0a 20 20 73 71  nsertMask);.  sq
6f90: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 6d 29  lite3_close(dbm)
6fa0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6fb0: 0a 0a 0a                                         ...