/ Hex Artifact Content
Login

Artifact 0b370db8ce08fac93a098f27eaf425d2269be376:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you 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 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45  while( pScan->iE
1950: 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv<=pScan->nEq
1960: 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20  uiv ){.    iCur 
1970: 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70  = pScan->aiCur[p
1980: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
1990: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
19a0: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
19b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
19c0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
19d0: 3d 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63  ==XN_EXPR && pSc
19e0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20  an->pIdxExpr==0 
19f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a00: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
1a10: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
1a20: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a30: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a40: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a50: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a60: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a70: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a80: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a90: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1aa0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1ab0: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1ac0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ad0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ae0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
1af0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
1b00: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1b10: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1b20: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1b30: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1b40: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1b50: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1b60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1b70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1b80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b90: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1ba0: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
1bb0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
1bc0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
1bd0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
1be0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1bf0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
1c00: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1c10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1c20: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1c30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1c50: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1c60: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1c80: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1c90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1ca0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
1cb0: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
1cc0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1d20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1d30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1d40: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1d60: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1d70: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1d80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1d90: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1da0: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1db0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1dc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1dd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1de0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e00: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1e10: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1e20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e30: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1e40: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1e50: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1e60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e70: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1eb0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1ec0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1ed0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ee0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1ef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1f00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1f10: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1f20: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f70: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1fa0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1fb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1ff0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
2000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2010: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
2020: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2030: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2060: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
2070: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2090: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
20d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
20e0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2100: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
2110: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
2120: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
2130: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
2140: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
2150: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
2160: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
2170: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
2180: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
2190: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21c0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
21d0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
2200: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
2210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2220: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
2230: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2240: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
2250: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
2260: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
2270: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
2280: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
2290: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
22a0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
22b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
22c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
22e0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
22f0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
2300: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2310: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2320: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2330: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2340: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2360: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2370: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2380: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2390: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
23a0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
23b0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
23c0: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
23d0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
23e0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
23f0: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
2400: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
2410: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
2420: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
2430: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2440: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
2450: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2460: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2470: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2480: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2490: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
24a0: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
24b0: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
24c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24d0: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
24e0: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
24f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2500: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2510: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
2520: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
2530: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
2540: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
2550: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2560: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2570: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2580: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2590: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
25a0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
25b0: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
25c0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
25d0: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
25e0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
25f0: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2600: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2610: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
2620: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
2630: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
2640: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
2650: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2660: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2670: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2680: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
26b0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
26f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2700: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2710: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
2720: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
2730: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
2740: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
2750: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2760: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2770: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2780: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2790: 0a 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b  .){.  int j = 0;
27a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
27b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
27c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
27d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
27e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
27f0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2800: 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20  >pIdxExpr = 0;. 
2810: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2820: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
2830: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
2840: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2850: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2860: 58 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d  XN_EXPR ) pScan-
2870: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2880: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
28a0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
28b0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
28c0: 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
28d0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  D;.  }.  if( pId
28e0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
28f0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
2900: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
2910: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
2930: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2940: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2950: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
2960: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
2970: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
2980: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2990: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
29a0: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
29b0: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
29c0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
29d0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
29e0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
29f0: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
2a00: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
2a10: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
2a20: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
2a30: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2a50: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
2a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2a70: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
2a80: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2a90: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2aa0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ab0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2ac0: 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66 20  able iCur or of 
2ad0: 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69 66  index pIdx.** if
2ae0: 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70   pIdx!=0 and <op
2af0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  > is one of the 
2b00: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
2b10: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
2b20: 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72 61  y.** the op para
2b30: 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61  meter.  Return a
2b40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b50: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
2b60: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2b70: 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20 74  .** If pIdx!=0 t
2b80: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 6f  hen it must be o
2b90: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65  ne of the indexe
2ba0: 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  s of table iCur.
2bb0: 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72    .** Search for
2bc0: 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20   terms matching 
2bd0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
2be0: 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a  olumn of pIdx.**
2bf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
2c00: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
2c10: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2c30: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
2c40: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
2c50: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
2c60: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
2c70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c80: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
2c90: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
2ca0: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
2cb0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
2cc0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
2cd0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
2ce0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
2cf0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
2d00: 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75  * aiCur[]/iaColu
2d10: 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64  mn[] arrays hold
2d20: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
2d30: 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72  quivalents. Ther
2d40: 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74  e are 11.** slot
2d50: 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43  s in aiCur[]/aiC
2d60: 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20  olumn[] so that 
2d70: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f  means we can loo
2d80: 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20  k for X plus up 
2d90: 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65  to 10.** other e
2da0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
2db0: 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  .  Hence a searc
2dc0: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
2dd0: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
2de0: 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20  A1.** and A1=A2 
2df0: 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e  and A2=A3 and ..
2e00: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
2e10: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
2e20: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
2e30: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
2e40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2e50: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
2e60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
2e70: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
2e80: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
2e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
2ea0: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
2eb0: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
2ec0: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
2ed0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
2ee0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
2ef0: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
2f00: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
2f10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
2f20: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
2f30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
2f40: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
2f50: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
2f60: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
2f70: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
2f80: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
2f90: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
2fa0: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
2fb0: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
2fc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
2fd0: 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54  EQUIV..*/.WhereT
2fe0: 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72  erm *sqlite3Wher
2ff0: 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  eFindTerm(.  Whe
3000: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3010: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3020: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
3030: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3040: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3050: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3060: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3070: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3080: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3090: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
30a0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
30b0: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
30c0: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
30d0: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
30e0: 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20  .  u32 op,      
30f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
3100: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
3110: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
3120: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
3130: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3140: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3150: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3160: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3170: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3180: 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20  Term *pResult = 
3190: 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  0;.  WhereTerm *
31a0: 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  p;.  WhereScan s
31b0: 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72  can;..  p = wher
31c0: 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
31d0: 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c   pWC, iCur, iCol
31e0: 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a  umn, op, pIdx);.
31f0: 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f    op &= WO_EQ|WO
3200: 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  _IS;.  while( p 
3210: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  ){.    if( (p->p
3220: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3230: 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
3240: 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71     if( p->prereq
3250: 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e  Right==0 && (p->
3260: 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30  eOperator&op)!=0
3270: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
3280: 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74  case( p->eOperat
3290: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
32a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
32b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32c0: 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70  ( pResult==0 ) p
32d0: 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20  Result = p;.    
32e0: 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53  }.    p = whereS
32f0: 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a  canNext(&scan);.
3300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3310: 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  sult;.}../*.** T
3320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
3330: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
3340: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  an entry that ma
3350: 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
3360: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
3370: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
3380: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
3390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
33a0: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
33b0: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
33c0: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
33d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
33e0: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
33f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3400: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
3410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3440: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3450: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
3460: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3470: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
3480: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
3490: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
34a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34b0: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
34c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
34d0: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
34e0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3500: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
3510: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
3520: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3540: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
3550: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
3560: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
3570: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
3580: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
3590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
35a0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
35b0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
35c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
35d0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
35e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
35f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3600: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
3610: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
3620: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
3630: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
3640: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
3650: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
3660: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3670: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
3680: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
3690: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
36a0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
36b0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
36c0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
36d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
36e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3710: 54 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c  TRUE if the iCol
3720: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
3730: 64 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20  dex pIdx is NOT 
3740: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
3750: 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  nt indexColumnNo
3760: 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64  tNull(Index *pId
3770: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
3780: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
3790: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73   pIdx!=0 );.  as
37a0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
37b0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
37c0: 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64  umn );.  j = pId
37d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
37e0: 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b  ];.  if( j>=0 ){
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78  .    return pIdx
3800: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
3810: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c  ].notNull;.  }el
3820: 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29  se if( j==(-1) )
3830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3850: 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a  ert( j==(-2) );.
3860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
3870: 2a 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65  * Assume an inde
3880: 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63  xed expression c
3890: 61 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20  an always yield 
38a0: 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d  a NULL */..  }.}
38b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
38c0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
38d0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
38e0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
38f0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
3900: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
3910: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
3920: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
3930: 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73  dant if any subs
3940: 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  et of the column
3950: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54  s in the.** DIST
3960: 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f  INCT list are co
3970: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
3980: 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  e and individual
3990: 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  ly non-null..*/.
39a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
39b0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
39c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
39e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
39f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
3a00: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
3a10: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
3a20: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a30: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
3a40: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3a50: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
3a60: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
3a70: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
3a80: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
3a90: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
3aa0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3ab0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
3ac0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
3af0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
3b00: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
3b10: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
3b20: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
3b30: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
3b40: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
3b50: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
3b60: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
3b70: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
3b80: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
3b90: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
3ba0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
3bb0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
3bc0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
3bd0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
3be0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
3bf0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
3c00: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
3c10: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
3c20: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
3c30: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
3c40: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
3c50: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
3c60: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
3c70: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
3c80: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
3c90: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
3ca0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
3cb0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
3cc0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
3cd0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
3ce0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
3cf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3d00: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
3d10: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
3d20: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
3d30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
3d40: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3d50: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
3d60: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
3d70: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
3d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
3d90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
3da0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
3db0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
3dc0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
3dd0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
3de0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3df0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
3e00: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
3e10: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
3e20: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
3e30: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
3e40: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
3e50: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3e60: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
3e70: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
3e80: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
3e90: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
3ea0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3eb0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
3ec0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
3ed0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
3ee0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
3ef0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
3f00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
3f10: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
3f20: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
3f30: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
3f40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
3f50: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
3f60: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
3f70: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
3f80: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
3f90: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
3fa0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3fb0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
3fc0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
3fd0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
3fe0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
3ff0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
4000: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
4010: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
4020: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
4030: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4040: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
4050: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
4060: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4070: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
4080: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4090: 30 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46  0==sqlite3WhereF
40a0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
40b0: 73 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b  se, i, ~(Bitmask
40c0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
40d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
40e0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
40f0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
4100: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c  iBase, pIdx, i)<
4110: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4120: 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75     if( indexColu
4130: 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20  mnNotNull(pIdx, 
4140: 69 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i)==0 ) break;. 
4150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4160: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
4170: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
4180: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
4190: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
41a0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
41b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
41c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
41e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
41f0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
4200: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
4210: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
4220: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
4230: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
4240: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
4250: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
4260: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
4270: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
4280: 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d  Convert OP_Colum
4290: 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f  n opcodes to OP_
42a0: 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73  Copy in previous
42b0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ly generated cod
42c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
42d0: 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20  utine runs over 
42e0: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
42f0: 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74  ode and translat
4300: 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20  es OP_Column.** 
4310: 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f  opcodes into OP_
4320: 43 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61  Copy when the ta
4330: 62 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63  ble is being acc
4340: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
4350: 74 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64  tine .** instead
4360: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
4370: 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  okup..**.** If t
4380: 68 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61  he bIncrRowid pa
4390: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
43a0: 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20  en any OP_Rowid 
43b0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a  instructions on.
43c0: 2a 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75  ** cursor iTabCu
43d0: 72 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65  r are transforme
43e0: 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20  d into OP_Null. 
43f0: 4f 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69  Or, if bIncrRowi
4400: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a  d is non-zero,.*
4410: 2a 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52  * then each OP_R
4420: 6f 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72  owid is transfor
4430: 6d 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  med into an inst
4440: 72 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65  ruction to incre
4450: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ment the.** valu
4460: 65 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20  e stored in its 
4470: 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e  output register.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
44a0: 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76  oCopy(.  Vdbe *v
44b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
44c0: 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e  The VDBE contain
44d0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e  ing code to tran
44e0: 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  slate */.  int i
44f0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4500: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4520: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4530: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4540: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4550: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4560: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4570: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4580: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4590: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
45a0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
45c0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
45d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
45e0: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
45f0: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4600: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
4610: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4620: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4630: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4640: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4650: 64 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20  ddr(v);.  for(; 
4660: 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74  iStart<iEnd; iSt
4670: 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  art++, pOp++){. 
4680: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
4690: 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
46a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ue;.    if( pOp-
46b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
46c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  mn ){.      pOp-
46d0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
46e0: 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  y;.      pOp->p1
46f0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65   = pOp->p2 + iRe
4700: 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f  gister;.      pO
4710: 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b  p->p2 = pOp->p3;
4720: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  .      pOp->p3 =
4730: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
4740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
4750: 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
4760: 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20   if( bIncrRowid 
4770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
4780: 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
4790: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
47a0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P2 operand of th
47b0: 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20  e OP_Rowid. */. 
47c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
47d0: 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a  de = OP_AddImm;.
47e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
47f0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
4800: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a     pOp->p2 = 1;.
4810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4820: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4830: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
4840: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b      pOp->p1 = 0;
4850: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
4860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4870: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4880: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
4890: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
48a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
48b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
48c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
48d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
48e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
48f0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
4900: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
4910: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
4920: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
4930: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
4940: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
4950: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
4960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4970: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
4980: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
4990: 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
49a0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
49b0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
49c0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
49d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
49e0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
49f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4a00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4a10: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4a20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4a30: 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
4a40: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
4a50: 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
4a60: 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
4a70: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
4a80: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4a90: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
4aa0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4ab0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
4ac0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4ad0: 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
4ae0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4af0: 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
4b00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4b10: 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4b30: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4b40: 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
4b50: 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
4b60: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4b70: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
4b80: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
4b90: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
4ba0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
4bb0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
4bc0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
4bd0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
4be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
4bf0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
4c00: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4c10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4c20: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4c30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c40: 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
4c50: 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
4c60: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4c70: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4c80: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
4c90: 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
4ca0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4cb0: 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
4cc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
4cd0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
4ce0: 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
4cf0: 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
4d00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d10: 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
4d20: 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
4d30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4d40: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
4d50: 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
4d60: 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
4d70: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4d80: 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
4d90: 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
4da0: 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71  matedCost);.  sq
4db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4dc0: 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77  ("  estimatedRow
4dd0: 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73  s=%lld\n", p->es
4de0: 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a  timatedRows);.}.
4df0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
4e00: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
4e10: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
4e20: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
4e30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
4e50: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
4e60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4e70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4e80: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
4e90: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
4ea0: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
4eb0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
4ec0: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
4ed0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
4ee0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
4ef0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
4f00: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
4f10: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
4f20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
4f50: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
4f60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4f70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
4f80: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
4f90: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
4fa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4fb0: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
4fc0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
4fd0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
4fe0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
4ff0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
5000: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
5010: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
5020: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
5030: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
5040: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
5050: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75  O_IS))==0 ) retu
5060: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5070: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5080: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
5090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
50a0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
50b0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
50c0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
50d0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
50e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
50f0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
5100: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
5110: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
5120: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
5130: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
5140: 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
5150: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
5160: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5170: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
5180: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5190: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
51a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
51b0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
51c0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
51d0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
51e0: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
51f0: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
5200: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
5210: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
5220: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
5230: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
5240: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
5250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5260: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
5270: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
5280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
52a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
52b0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
52c0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
52d0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
52e0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
52f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5300: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
5310: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
5320: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
5330: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
5340: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
5350: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
5360: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
5370: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
5380: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
5390: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
53a0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
53b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
53c0: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
53d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
53e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
53f0: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
5400: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
5410: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
5430: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
5440: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
5450: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
5460: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
5470: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
5480: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
5490: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
54a0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
54b0: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
54c0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
54d0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54f0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
5500: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
5510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
5520: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
5530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5540: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
5550: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
5560: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
5570: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
5580: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5590: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
55a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
55b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
55c0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
55d0: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
55e0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
55f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5600: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5610: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
5620: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
5650: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5660: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5670: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5680: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5690: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
56b0: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
56c0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
56d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56f0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5700: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
5710: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
5720: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
5730: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
5740: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
5750: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
5760: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5770: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
5780: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
5790: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
57a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
57b0: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
57c0: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
57d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
57e0: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
57f0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
5800: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5810: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
5820: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
5830: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
5840: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
5850: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
5860: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
5870: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
5880: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
5890: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
58a0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
58b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
58c0: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
58d0: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73  uded rows */.  s
58e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58f0: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
5900: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
5910: 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  rm being indexed
5920: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
5930: 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  unter = 0;      
5940: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65    /* Address whe
5950: 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74  re integer count
5960: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5970: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5980: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5990: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
59a0: 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72  egisters where r
59b0: 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c  ecord is assembl
59c0: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
59d0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
59e0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
59f0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
5a00: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
5a10: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
5a20: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
5a30: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
5a40: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
5a50: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
5a60: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
5a70: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
5a80: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
5a90: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
5aa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5ab0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
5ac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5ad0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
5ae0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
5af0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
5b00: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
5b10: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
5b20: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
5b30: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
5b40: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
5b50: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
5b60: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
5b70: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
5b80: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
5b90: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5ba0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5bb0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5bc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
5bd0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
5be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
5bf0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5c00: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
5c10: 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20  n)    /* prereq 
5c20: 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20  always non-zero 
5c30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
5c40: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
5c50: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
5c60: 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20  rsor   /*   for 
5c70: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20  the right-hand  
5c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
5c90: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30  pLoop->prereq!=0
5ca0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
5cb0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62          /*   tab
5cc0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
5cd0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  N */.    if( pLo
5ce0: 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20  op->prereq==0.  
5cf0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
5d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
5d10: 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26  TUAL)==0.     &&
5d20: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5d30: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
5d40: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71  Join).     && sq
5d50: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
5d60: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20  Constant(pExpr, 
5d70: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29  pSrc->iCursor) )
5d80: 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c  {.      pPartial
5d90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
5da0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  d(pParse->db, pP
5db0: 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20  artial,.        
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5de0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5df0: 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  b, pExpr, 0));. 
5e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
5e10: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
5e20: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
5e30: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
5e40: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
5e50: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
5e60: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
5e70: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
5e80: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
5e90: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
5ea0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5eb0: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
5ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5ed0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5ee0: 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e     if( !sentWarn
5ef0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
5f00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5f10: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
5f20: 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DEX,.           
5f30: 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65   "automatic inde
5f40: 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54  x on %s(%s)", pT
5f50: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
5f60: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
5f70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
5f80: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74  e);.        sent
5f90: 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Warning = 1;.   
5fa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
5fb0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
5fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
5fd0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
5fe0: 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
5ff0: 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  Loop, nKeyCol+1)
6000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
6010: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6020: 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20  x_create;.      
6030: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
6040: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
6050: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
6060: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
6070: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
6080: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6090: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
60a0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
60b0: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
60c0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
60d0: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
60e0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
60f0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
6100: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
6110: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
6120: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
6130: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
6140: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
6150: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
6160: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6170: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
6180: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
6190: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
61a0: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
61b0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
61c0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
61d0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
61e0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
61f0: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
6200: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
6210: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
6220: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
6230: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
6240: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
6250: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
6260: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
6270: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
6280: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
6290: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
62a0: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
62b0: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
62c0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
62d0: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
62e0: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
62f0: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
6300: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
6310: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
6320: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
6330: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
6340: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28   mxBitCol = MIN(
6350: 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43  BMS-1,pTable->nC
6360: 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ol);.  testcase(
6370: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
6380: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
6390: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
63a0: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
63b0: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
63c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
63d0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
63e0: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
63f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
6400: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
6410: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
6420: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
6430: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
6440: 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  S + 1;.  }..  /*
6450: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
6460: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
6470: 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
6480: 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  ex */.  pIdx = s
6490: 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
64a0: 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65  dexObject(pParse
64b0: 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c  ->db, nKeyCol+1,
64c0: 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a   0, &zNotUsed);.
64d0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
64e0: 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e  goto end_auto_in
64f0: 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c  dex_create;.  pL
6500: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
6510: 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
6520: 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
6530: 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
6540: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
6550: 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
6560: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
6570: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
6580: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
6590: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
65a0: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
65b0: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
65c0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
65d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
65e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
65f0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
6600: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
6610: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
6620: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
6630: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6640: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
6650: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6660: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
6670: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
6680: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
6690: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
66a0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
66b0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
66c0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
66d0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
66e0: 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
66f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
6700: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
6710: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
6720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
6730: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
6740: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
6750: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6760: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
6770: 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65  ->zName : sqlite
6780: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6790: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
67a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
67b0: 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f  ert( (u32)n==pLo
67c0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
67d0: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
67e0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
67f0: 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
6800: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6810: 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
6820: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
6830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
6840: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
6850: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
6860: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a  & MASKBIT(i) ){.
6870: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6880: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
6890: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
68a0: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
68b0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
68c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
68d0: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
68e0: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
68f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
6900: 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
6910: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6920: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6930: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6940: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6950: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6960: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6970: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
6980: 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20   n==nKeyCol );. 
6990: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
69a0: 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  n] = XN_ROWID;. 
69b0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
69d0: 41 52 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ARY;..  /* Creat
69e0: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
69f0: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
6a00: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
6a10: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
6a20: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
6a30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
6a40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6a50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
6a60: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
6a70: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
6a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6a90: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
6aa0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
6ab0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
6ac0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
6ad0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
6ae0: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
6af0: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
6b00: 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tent */.  sqlite
6b10: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
6b20: 50 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74  Parse);.  pTabIt
6b30: 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66  em = &pWC->pWInf
6b40: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
6b50: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
6b60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6b70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6b80: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
6b90: 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
6ba0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64  egReturn;.    ad
6bb0: 64 72 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  drCounter = sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6bd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6be0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6bf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c00: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
6c10: 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
6c20: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
6c30: 62 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  b);.    addrTop 
6c40: 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
6c50: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
6c60: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
6c70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6c80: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
6c90: 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
6ca0: 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
6cb0: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
6cc0: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
6cd0: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
6ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6cf0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
6d00: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64  el->iTabCur); Vd
6d10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6d20: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61   }.  if( pPartia
6d30: 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e  l ){.    iContin
6d40: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
6d50: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
6d70: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61  alse(pParse, pPa
6d80: 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65  rtial, iContinue
6d90: 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
6da0: 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  ULL);.    pLoop-
6db0: 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
6dc0: 45 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20  E_PARTIALIDX;.  
6dd0: 7d 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  }.  regRecord = 
6de0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6df0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6e00: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
6e10: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a  nerateIndexKey(.
6e20: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49        pParse, pI
6e30: 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
6e40: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
6e50: 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  0, 0, 0, 0.  );.
6e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e70: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6e80: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
6e90: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
6ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
6eb0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6ec0: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
6ed0: 3b 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  ;.  if( pPartial
6ee0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
6ef0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
6f00: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
6f10: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6f20: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6f30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6f40: 67 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e  geP2(v, addrCoun
6f50: 74 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b  ter, regBase+n);
6f60: 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f  .    translateCo
6f70: 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64  lumnToCopy(v, ad
6f80: 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  drTop, pLevel->i
6f90: 54 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d  TabCur, pTabItem
6fa0: 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  ->regResult, 1);
6fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6fc0: 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
6fd0: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
6fe0: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6ff0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7010: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
7020: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
7030: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
7040: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7050: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
7060: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
7070: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
7080: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
7090: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
70a0: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
70b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
70c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
70d0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
70e0: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
70f0: 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
7100: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
7110: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
7120: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
7130: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7140: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
7150: 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
7160: 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
7170: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7180: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
7190: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
71a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
71b0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
71c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
71d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
71e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
71f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
7200: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7210: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
7220: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
7230: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
7240: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
7250: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
7260: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
7270: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
7280: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
7290: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
72a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
72b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
72c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
72d0: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
72e0: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
72f0: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
7300: 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d  use *pWC,.  Bitm
7310: 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20  ask mUnusable,  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7330: 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68  gnore terms with
7340: 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a   these prereqs *
7350: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7360: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20  st_item *pSrc,. 
7370: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7380: 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  rBy.){.  int i, 
7390: 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  j;.  int nTerm;.
73a0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
73b0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
73c0: 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
73d0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
73e0: 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64  dex_orderby *pId
73f0: 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75  xOrderBy;.  stru
7400: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7410: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
7420: 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
7430: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
7440: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
7450: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7460: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a  nfo *pIdxInfo;..
7470: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
7480: 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
7490: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
74a0: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
74b0: 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
74c0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
74d0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
74e0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
74f0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7500: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7510: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
7520: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
7530: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
7540: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
7550: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
7560: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
7570: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
7580: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
7590: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
75a0: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
75b0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
75c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
75d0: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
75e0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
75f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7600: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7610: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7620: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7630: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7640: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7650: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
7660: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
7670: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
7680: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
7690: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f  |WO_IS))==0 ) co
76a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
76b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
76c0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
76d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
76e0: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
76f0: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
7700: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
7710: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
7720: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
7730: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
7740: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
7750: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
7760: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
7770: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7780: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
7790: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
77a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
77b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
77c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
77d0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
77e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
77f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
7800: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
7820: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
7830: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
7840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7850: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
7860: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
7870: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
7880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7890: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
78a0: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
78b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
78c0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
78d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
78e0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
78f0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
7900: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7910: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
7920: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
7930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7940: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
7950: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
7960: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
7970: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
79a0: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
79b0: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
79c0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
79d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
79e0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
79f0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
7a00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7a10: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
7a20: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
7a30: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7a40: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
7a50: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
7a60: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
7a70: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
7a80: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
7a90: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
7aa0: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
7ab0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
7ac0: 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
7ad0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
7ae0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
7af0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
7b00: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
7b10: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b20: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7b30: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
7b40: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
7b50: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b60: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
7b70: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
7b80: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
7b90: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7ba0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7bb0: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
7bc0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
7bd0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
7be0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
7bf0: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
7c00: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
7c10: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
7c20: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7c30: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7c40: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
7c50: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
7c60: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
7c70: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7c80: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
7c90: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
7ca0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
7cb0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7cc0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7cd0: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
7ce0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
7cf0: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
7d40: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
7d50: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7d60: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7d70: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
7d80: 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54  8 op;.    if( pT
7d90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7da0: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7db0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7dc0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
7dd0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
7de0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
7df0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
7e00: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
7e10: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7e20: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7e30: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7e40: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7e50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7e60: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7e70: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
7e80: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7e90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ea0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
7eb0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7ec0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7ed0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
7ee0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7ef0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
7f00: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
7f10: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7f20: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7f30: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7f40: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7f50: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7f60: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7f70: 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78  (-1) );.    pIdx
7f80: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
7f90: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
7fa0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
7fb0: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
7fc0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
7fd0: 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
7fe0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
7ff0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
8000: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
8010: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d      if( op==WO_M
8020: 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 6f 70  ATCH ){.      op
8030: 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68   = pTerm->eMatch
8040: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  Op;.    }.    pI
8050: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
8060: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
8070: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
8080: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8090: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
80a0: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
80b0: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
80c0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
80d0: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
80e0: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
80f0: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
8100: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
8110: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
8120: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
8130: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
8140: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
8150: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
8160: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
8170: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
8180: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8190: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
81a0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
81b0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
81c0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
81d0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
81e0: 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
81f0: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
8200: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
8210: 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
8220: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
8230: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8240: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
8250: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8260: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
8270: 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
8280: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8290: 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
82a0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
82b0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
82c0: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
82d0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
82e0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
82f0: 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
8300: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
8310: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
8320: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
8330: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
8340: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
8350: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8360: 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
8370: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
8380: 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
8390: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
83a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
83b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
83c0: 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
83d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
83e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
83f0: 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
8400: 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
8410: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
8420: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
8430: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8440: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
8450: 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
8460: 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
8470: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8480: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8490: 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
84a0: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
84b0: 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
84c0: 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
84d0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
84e0: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
84f0: 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
8500: 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
8510: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
8520: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8530: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8540: 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
8550: 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
8560: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
8570: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
8580: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
8590: 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
85a0: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
85b0: 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
85c0: 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
85d0: 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
85e0: 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
85f0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
8600: 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
8610: 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
8620: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
8630: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
8640: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
8650: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
8660: 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
8670: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
8680: 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
8690: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
86a0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
86b0: 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
86c0: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
86d0: 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
86e0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
86f0: 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
8700: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8710: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8720: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
8730: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
8740: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
8750: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
8760: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
8770: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8780: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
8790: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
87a0: 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
87b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
87c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
87d0: 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
87e0: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
87f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8800: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
8810: 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
8820: 67 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20  g = 0;..#if 0.  
8830: 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73  /* This error is
8840: 20 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74   now caught by t
8850: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20  he caller..  ** 
8860: 53 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73  Search for "xBes
8870: 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
8880: 6f 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66  on" below */.  f
8890: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
88a0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
88b0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
88c0: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
88d0: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
88e0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
88f0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
8900: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8910: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8920: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
8930: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
8940: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
8950: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
8960: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
8970: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50  dif..  return pP
8980: 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
8990: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
89a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
89b0: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
89c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
89d0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
89e0: 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
89f0: 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
8a00: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
8a10: 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
8a20: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
8a30: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
8a40: 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
8a50: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
8a60: 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
8a70: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8a80: 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
8a90: 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Rec.**    aStat[
8aa0: 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
8ab0: 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
8ac0: 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20  l to pRec.**.** 
8ad0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
8ae0: 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74   of the sample t
8af0: 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  hat is the small
8b00: 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a  est sample that.
8b10: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
8b20: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
8b30: 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  Rec. Note that t
8b40: 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  his index is not
8b50: 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74   an index.** int
8b60: 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  o the aSample[] 
8b70: 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e  array - it is an
8b80: 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69   index into a vi
8b90: 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d  rtual set of sam
8ba0: 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ples.** based on
8bb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
8bc0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74   aSample[] and t
8bd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
8be0: 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a  lds in record .*
8bf0: 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74  * pRec. .*/.stat
8c00: 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
8c10: 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
8c20: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8c30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8c40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
8c50: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8c70: 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
8c80: 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
8c90: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
8ca0: 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56  pRec,       /* V
8cb0: 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20  ector of values 
8cc0: 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20  to consider */. 
8cd0: 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20   int roundUp,   
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8cf0: 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65  Round up if true
8d00: 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66  .  Round down if
8d10: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77   false */.  tRow
8d20: 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20  cnt *aStat      
8d30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8d40: 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65  stats written he
8d50: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
8d60: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
8d70: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
8d80: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8da0: 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69  * Index of requi
8db0: 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45  red stats in anE
8dc0: 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  q[] etc. */.  in
8dd0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8df0: 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70  ex of first samp
8e00: 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20  le >= pRec */.  
8e10: 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20  int iSample;    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8e30: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
8e40: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
8e50: 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
8e60: 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e80: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
8e90: 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
8ea0: 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
8ed0: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
8ee0: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
8ef0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
8f00: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
8f10: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
8f20: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
8f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f40: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
8f50: 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77  n pRec */.  tRow
8f60: 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20  cnt iLower = 0; 
8f70: 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b          /* anLt[
8f80: 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61  ] + anEq[] of la
8f90: 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65  rgest sample pRe
8fa0: 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64  c is > */..#ifnd
8fb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8fc0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8fd0: 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
8fe0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
8ff0: 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Rec!=0 );.  asse
9000: 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
9010: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
9020: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
9030: 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c  && pRec->nField<
9040: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  =pIdx->nSampleCo
9050: 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20  l );..  /* Do a 
9060: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
9070: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
9080: 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74  sample greater t
9090: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a  han or equal.  *
90a0: 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52  * to pRec. If pR
90b0: 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ec contains a si
90c0: 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20  ngle field, the 
90d0: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74  set of samples t
90e0: 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73  o search.  ** is
90f0: 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d   simply the aSam
9100: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ple[] array. If 
9110: 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61  the samples in a
9120: 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e  Sample[] contain
9130: 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20   more.  ** than 
9140: 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20  one fields, all 
9150: 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  fields following
9160: 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69   the first are i
9170: 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  gnored..  **.  *
9180: 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  * If pRec contai
9190: 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65  ns N fields, whe
91a0: 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61  re N is more tha
91b0: 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77  n one, then as w
91c0: 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ell as the.  ** 
91d0: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
91e0: 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20  le[] (truncated 
91f0: 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68  to N fields), th
9200: 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61  e search also ha
9210: 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  s to.  ** consid
9220: 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74  er prefixes of t
9230: 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f  hose samples. Fo
9240: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
9250: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
9260: 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65  .  ** in aSample
9270: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
9280: 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20     aSample[0] = 
9290: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
92a0: 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61   aSample[1] = (a
92b0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
92c0: 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c  aSample[2] = (b,
92d0: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53   5) .  **     aS
92e0: 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31  ample[3] = (c, 1
92f0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  00) .  **     aS
9300: 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31  ample[4] = (c, 1
9310: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  05).  **.  ** Th
9320: 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70  en the search sp
9330: 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c  ace should ideal
9340: 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65  ly be the sample
9350: 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20  s above and the 
9360: 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65  .  ** unique pre
9370: 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61  fixes [a], [b] a
9380: 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63  nd [c]. But sinc
9390: 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74  e that is hard t
93a0: 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a  o organize, .  *
93b0: 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61  * the code actua
93c0: 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69  lly searches thi
93d0: 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s set:.  **.  **
93e0: 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a       0: (a) .  *
93f0: 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20  *     1: (a, 5) 
9400: 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c  .  **     2: (a,
9410: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33   10) .  **     3
9420: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
9430: 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a      4: (b) .  **
9440: 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a       5: (b, 5) .
9450: 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20    **     6: (c) 
9460: 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c  .  **     7: (c,
9470: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9480: 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a  8: (c, 105).  **
9490: 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29       9: (c, 105)
94a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
94b0: 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ach sample in th
94c0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
94d0: 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65  y, N samples are
94e0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a   present in the.
94f0: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73    ** effective s
9500: 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20  ample array. In 
9510: 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c  the above, sampl
9520: 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62  es 0 and 1 are b
9530: 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61  ased on .  ** sa
9540: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  mple aSample[0].
9550: 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   Samples 2 and 3
9560: 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65   on aSample[1] e
9570: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  tc..  **.  ** Of
9580: 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66  ten, sample i of
9590: 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e   each block of N
95a0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
95b0: 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65  es has (i+1) fie
95c0: 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74  lds..  ** Except
95d0: 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61  , each sample ma
95e0: 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  y be extended to
95f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20   ensure that it 
9600: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
9610: 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  or.  ** equal to
9620: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61   the previous sa
9630: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61  mple in the arra
9640: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
9650: 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20  in the above, . 
9660: 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20   ** sample 2 is 
9670: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
9680: 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e   of a block of N
9690: 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20   samples, so at 
96a0: 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61  first it .  ** a
96b0: 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73  ppears that it s
96c0: 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64  hould be 1 field
96d0: 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65   in size. Howeve
96e0: 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  r, that would ma
96f0: 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c  ke it .  ** smal
9700: 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ler than sample 
9710: 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79  1, so the binary
9720: 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f   search would no
9730: 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73  t work. As a res
9740: 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73  ult, .  ** it is
9750: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f   extended to two
9760: 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70   fields. The dup
9770: 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69  licates that thi
9780: 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74  s creates do not
9790: 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79   .  ** cause any
97a0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
97b0: 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d    nField = pRec-
97c0: 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20  >nField;.  iCol 
97d0: 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d  = 0;.  iSample =
97e0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a   pIdx->nSample *
97f0: 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20   nField;.  do{. 
9800: 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20     int iSamp;   
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61   /* Index in aSa
9830: 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73  mple[] of test s
9840: 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ample */.    int
9850: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
9860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9870: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
9880: 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  n test sample */
9890: 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  ..    iTest = (i
98a0: 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a  Min+iSample)/2;.
98b0: 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73      iSamp = iTes
98c0: 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  t / nField;.    
98d0: 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20  if( iSamp>0 ){. 
98e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70       /* The prop
98f0: 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73  osed effective s
9900: 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69  ample is a prefi
9910: 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d  x of sample aSam
9920: 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20  ple[iSamp]..    
9930: 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c    ** Specificall
9940: 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20  y, the shortest 
9950: 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61  prefix of at lea
9960: 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46  st (1 + iTest%nF
9970: 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20  ield) .      ** 
9980: 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67  fields that is g
9990: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
99a0: 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69  previous effecti
99b0: 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20  ve sample.  */. 
99c0: 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73       for(n=(iTes
99d0: 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b  t % nField) + 1;
99e0: 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b   n<nField; n++){
99f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
9a00: 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e  mple[iSamp-1].an
9a10: 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65  Lt[n-1]!=aSample
9a20: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
9a30: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
9a40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9a50: 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20      n = iTest + 
9a60: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52  1;.    }..    pR
9a70: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a  ec->nField = n;.
9a80: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
9a90: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
9aa0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  re(aSample[iSamp
9ab0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61  ].n, aSample[iSa
9ac0: 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  mp].p, pRec);.  
9ad0: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
9ae0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9af0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9b00: 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65  t[n-1] + aSample
9b10: 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31  [iSamp].anEq[n-1
9b20: 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ];.      iMin = 
9b30: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
9b40: 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  se if( res==0 &&
9b50: 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20   n<nField ){.   
9b60: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
9b70: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9b80: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9b90: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9ba0: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
9bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61  }else{.      iSa
9bc0: 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20  mple = iTest;.  
9bd0: 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a      iCol = n-1;.
9be0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9bf0: 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d  res && iMin<iSam
9c00: 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61  ple );.  i = iSa
9c10: 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a  mple / nField;..
9c20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9c30: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
9c40: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
9c50: 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
9c60: 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
9c70: 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
9c80: 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
9c90: 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
9ca0: 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
9cb0: 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
9cc0: 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
9cd0: 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
9ce0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
9cf0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9d00: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iled==0 ){.    i
9d10: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
9d20: 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30     /* If (res==0
9d30: 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ) is true, then 
9d40: 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75  pRec must be equ
9d50: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20  al to sample i. 
9d60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9d70: 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
9d80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9d90: 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31  ( iCol==nField-1
9da0: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9db0: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
9dc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
9dd0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
9de0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9df0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
9e00: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20  [i].p, pRec) .  
9e10: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
9e20: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9e30: 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20  iled .      );. 
9e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e50: 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64  /* Unless i==pId
9e60: 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69  x->nSample, indi
9e70: 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63  cating that pRec
9e80: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
9e90: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d        ** all sam
9ea0: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d  ples in the aSam
9eb0: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65  ple[] array, pRe
9ec0: 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
9ed0: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
9ee0: 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65   ** (iCol+1) fie
9ef0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
9f00: 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20  ple i.  */.     
9f10: 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78   assert( i<=pIdx
9f20: 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d  ->nSample && i>=
9f30: 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  0 );.      pRec-
9f40: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31  >nField = iCol+1
9f50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9f60: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9f70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
9f80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9f90: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9fa0: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9fb0: 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
9fc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9fd0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9fe0: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  led );..      /*
9ff0: 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f   if i==0 and iCo
a000: 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72  l==0, then recor
a010: 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65  d pRec is smalle
a020: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
a030: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  es.      ** in t
a040: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
a050: 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
a060: 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20  f (iCol>0) then 
a070: 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20  pRec must.      
a080: 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ** be greater th
a090: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
a0a0: 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20  he (iCol) field 
a0b0: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
a0c0: 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   i..      ** If 
a0d0: 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63  (i>0), then pRec
a0e0: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72   must also be gr
a0f0: 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  eater than sampl
a100: 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20  e (i-1).  */.   
a110: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
a120: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a130: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20  Field = iCol;.  
a140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a150: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a160: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a170: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
a180: 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20  p, pRec)<=0.    
a190: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
a1a0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
a1b0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  iled );.      }.
a1c0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
a1d0: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a1e0: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
a1f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a200: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
a210: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
a220: 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  [i-1].n, aSample
a230: 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30  [i-1].p, pRec)<0
a240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a250: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a260: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
a280: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
a290: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
a2a0: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
a2b0: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52      /* Record pR
a2c0: 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73  ec is equal to s
a2d0: 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61  ample i */.    a
a2e0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
a2f0: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74  eld-1 );.    aSt
a300: 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
a310: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
a320: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
a330: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
a340: 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol];.  }else{.  
a350: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
a360: 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29  nt, the (iCol+1)
a370: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
a380: 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
a390: 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a  he first .    **
a3a0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
a3b0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65  greater than pRe
a3c0: 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64  c. Or, if i==pId
a3d0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20  x->nSample then 
a3e0: 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c  pRec.    ** is l
a3f0: 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  arger than all s
a400: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72  amples in the ar
a410: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ray. */.    tRow
a420: 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70  cnt iUpper, iGap
a430: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  ;.    if( i>=pId
a440: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  x->nSample ){.  
a450: 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c      iUpper = sql
a460: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
a470: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
a480: 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t[0]);.    }else
a490: 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
a4a0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
a4b0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCol];.    }.. 
a4c0: 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
a4d0: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
a4e0: 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
a4f0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
a500: 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
a510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a520: 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
a530: 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
a540: 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
a550: 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
a560: 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
a570: 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
a580: 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61  + iGap;.    aSta
a590: 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76  t[1] = pIdx->aAv
a5a0: 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a  gEq[iCol];.  }..
a5b0: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
a5c0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
a5d0: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
a5e0: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
a5f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
a600: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
a610: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a620: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
a630: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
a640: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
a650: 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
a660: 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
a670: 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
a680: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
a690: 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
a6a0: 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
a6b0: 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
a6c0: 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
a6d0: 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
a6e0: 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
a6f0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a700: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
a710: 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
a720: 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
a730: 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
a740: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
a750: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
a760: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
a770: 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
a780: 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
a790: 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
a7a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
a7b0: 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
a7c0: 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
a7d0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
a7e0: 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
a7f0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
a800: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
a810: 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
a820: 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
a830: 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
a840: 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
a850: 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
a860: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
a870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
a880: 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
a890: 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
a8a0: 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
a8b0: 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
a8c0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
a8d0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
a8e0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
a8f0: 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
a900: 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
a910: 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
a920: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
a930: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
a940: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
a950: 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
a960: 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
a970: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
a980: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
a990: 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a  eturn nRet;.}...
a9a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a9b0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a9c0: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
a9d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f   the affinity fo
a9e0: 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  r a single colum
a9f0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  n of an index..*
aa00: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71  /.static char sq
aa10: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
aa20: 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33  Affinity(sqlite3
aa30: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
aa40: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
aa50: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
aa60: 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43  && iCol<pIdx->nC
aa70: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21  olumn );.  if( !
aa80: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  pIdx->zColAff ){
aa90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
aaa0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
aab0: 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20  (db, pIdx)==0 ) 
aac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
aad0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
aae0: 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41  turn pIdx->zColA
aaf0: 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64  ff[iCol];.}.#end
ab00: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
ab10: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ab20: 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20  OR_STAT4./* .** 
ab30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ab40: 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d   called to estim
ab50: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
ab60: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  f rows visited b
ab70: 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61  y a.** range-sca
ab80: 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e  n on a skip-scan
ab90: 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d   index. For exam
aba0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ple:.**.**   CRE
abb0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
abc0: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20  t1(a, b, c);.** 
abd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
abe0: 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  t1 WHERE a=? AND
abf0: 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44   c BETWEEN ? AND
ac00: 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20   ?;.**.** Value 
ac10: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63  pLoop->nOut is c
ac20: 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
ac30: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
ac40: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a  mber of rows .**
ac50: 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61   visited for sca
ac60: 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62  nning (a=? AND b
ac70: 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69  =?). This functi
ac80: 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20  on reduces that 
ac90: 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20  estimate .** by 
aca0: 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61  some factor to a
acb0: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28  ccount for the (
acc0: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
acd0: 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61  ?) expression ba
ace0: 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  sed.** on the st
acf0: 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65  at4 data for the
ad00: 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61   index. this sca
ad10: 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d  n will be peform
ad20: 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
ad30: 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20  times (once for 
ad40: 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69  each (a,b) combi
ad50: 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63  nation that matc
ad60: 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c  hes a=?) is deal
ad70: 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68  t with .** by th
ad80: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
ad90: 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20  It does this by 
ada0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
adb0: 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c   all stat4 sampl
adc0: 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61  es, comparing va
add0: 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65  lues.** extracte
ade0: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
adf0: 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68  d pUpper with th
ae00: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
ae10: 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a  column in each.*
ae20: 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61  * sample. If L a
ae30: 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d  nd U are the num
ae40: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66  ber of samples f
ae50: 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20  ound to be less 
ae60: 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c  than or.** equal
ae70: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65   to the values e
ae80: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
ae90: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
aea0: 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e  respectively, an
aeb0: 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f  d.** N is the to
aec0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
aed0: 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70  mples, the pLoop
aee0: 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20  ->nOut value is 
aef0: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66  adjusted.** as f
af00: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
af10: 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20  nOut = nOut * ( 
af20: 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20  min(U - L, 1) / 
af30: 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f  N ).**.** If pLo
af40: 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  wer is NULL, or 
af50: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
af60: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
af70: 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a   the term, L is.
af80: 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ** set to zero. 
af90: 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c  If pUpper is NUL
afa0: 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61  L, or a value ca
afb0: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
afc0: 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20  d from it,.** U 
afd0: 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a  is set to N..**.
afe0: 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  ** Normally, thi
aff0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
b000: 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66  *pbDone to 1 bef
b010: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48  ore returning. H
b020: 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f  owever,.** if no
b030: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78   value can be ex
b040: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74  tracted from eit
b050: 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55  her pLower or pU
b060: 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65  pper (and so the
b070: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20  .** estimate of 
b080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b090: 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d  ws delivered rem
b0a0: 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c  ains unchanged),
b0b0: 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c   *pbDone.** is l
b0c0: 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a  eft as is..**.**
b0d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
b0e0: 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
b0f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
b100: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
b110: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  , .** SQLITE_OK.
b120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b130: 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61  hereRangeSkipSca
b140: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
b150: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
b160: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
b170: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
b180: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
b190: 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
b1a0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
b1b0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
b1c0: 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
b1d0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
b1e0: 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
b1f0: 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
b200: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
b210: 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
b220: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ULL */.  WhereLo
b230: 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a  op *pLoop,    /*
b240: 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75   Update the .nOu
b250: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  t value of this 
b260: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  loop */.  int *p
b270: 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f  bDone          /
b280: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
b290: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78   at least one ex
b2a0: 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63  pr. value extrac
b2b0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ted */.){.  Inde
b2c0: 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
b2d0: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
b2e0: 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
b2f0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
b300: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b310: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b320: 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69  nLower = -1;.  i
b330: 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e  nt nUpper = p->n
b340: 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20  Sample+1;.  int 
b350: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b360: 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74    u8 aff = sqlit
b370: 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66  e3IndexColumnAff
b380: 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71  inity(db, p, nEq
b390: 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  );.  CollSeq *pC
b3a0: 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  oll;.  .  sqlite
b3b0: 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b  3_value *p1 = 0;
b3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
b3d0: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
b3e0: 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71  m pLower */.  sq
b3f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20  lite3_value *p2 
b400: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
b410: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
b420: 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a   from pUpper */.
b430: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
b440: 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pVal = 0;      
b450: 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
b460: 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64  cted from record
b470: 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73   */..  pColl = s
b480: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b490: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61  Seq(pParse, p->a
b4a0: 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69  zColl[nEq]);.  i
b4b0: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
b4c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
b4d0: 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
b4e0: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e  pParse, pLower->
b4f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
b500: 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c  ff, &p1);.    nL
b510: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ower = 0;.  }.  
b520: 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63  if( pUpper && rc
b530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b550: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b560: 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72  r(pParse, pUpper
b570: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b580: 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20   aff, &p2);.    
b590: 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20  nUpper = p2 ? 0 
b5a0: 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20  : p->nSample;.  
b5b0: 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70  }..  if( p1 || p
b5c0: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
b5d0: 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20      int nDiff;. 
b5e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
b5f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
b600: 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
b610: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b620: 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64  te3Stat4Column(d
b630: 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  b, p->aSample[i]
b640: 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  .p, p->aSample[i
b650: 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29  ].n, nEq, &pVal)
b660: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
b670: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20  SQLITE_OK && p1 
b680: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b690: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b6a0: 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c  ompare(p1, pVal,
b6b0: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b6c0: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c   if( res>=0 ) nL
b6d0: 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ower++;.      }.
b6e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b6f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b  LITE_OK && p2 ){
b700: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
b710: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
b720: 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70  pare(p2, pVal, p
b730: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
b740: 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70  f( res>=0 ) nUpp
b750: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
b760: 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20    }.    nDiff = 
b770: 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72  (nUpper - nLower
b780: 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66  );.    if( nDiff
b790: 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b  <=0 ) nDiff = 1;
b7a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
b7b0: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
b7c0: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  er and lower bou
b7d0: 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e  nd specified, an
b7e0: 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  d the .    ** co
b7f0: 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61  mparisons indica
b800: 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65  te that they are
b810: 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c   close together,
b820: 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63   use the fallbac
b830: 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20  k.    ** method 
b840: 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65  (assume that the
b850: 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36   scan visits 1/6
b860: 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66  4 of the rows) f
b870: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20  or estimating.  
b880: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
b890: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e  of rows visited.
b8a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69   Otherwise, esti
b8b0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
b8c0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75  of rows.    ** u
b8d0: 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20  sing the method 
b8e0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
b8f0: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
b900: 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
b910: 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44  n. */.    if( nD
b920: 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72  iff!=1 || pUpper
b930: 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30  ==0 || pLower==0
b940: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
b950: 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33  djust = (sqlite3
b960: 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c  LogEst(p->nSampl
b970: 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45  e) - sqlite3LogE
b980: 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20  st(nDiff));.    
b990: 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d    pLoop->nOut -=
b9a0: 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20   nAdjust;.      
b9b0: 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  *pbDone = 1;.   
b9c0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
b9d0: 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70  10, ("range skip
b9e0: 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25  -scan regions: %
b9f0: 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64  u..%u  adjust=%d
ba00: 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e         nLower, n
ba30: 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d  Upper, nAdjust*-
ba40: 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29  1, pLoop->nOut))
ba50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
ba60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  {.    assert( *p
ba70: 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a  bDone==0 );.  }.
ba80: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
ba90: 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74  ree(p1);.  sqlit
baa0: 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b  e3ValueFree(p2);
bab0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
bac0: 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
bad0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
bae0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
baf0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
bb00: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  4 */../*.** This
bb10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
bb20: 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
bb30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
bb40: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
bb50: 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
bb60: 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
bb70: 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
bb80: 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
bb90: 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
bba0: 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
bbb0: 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
bbc0: 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
bbd0: 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
bbe0: 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
bbf0: 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
bc00: 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
bc10: 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
bc20: 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
bc30: 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
bc40: 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
bc50: 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
bc60: 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
bc70: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
bc80: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
bc90: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
bca0: 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
bcb0: 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
bce0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
bcf0: 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
bd00: 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
bd10: 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
bd20: 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
bd30: 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
bd40: 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
bd50: 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
bd60: 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
bd70: 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
bd80: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
bd90: 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64  value in (pBuild
bda0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
bdb0: 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75  e.nEq) is the nu
bdc0: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
bdd0: 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  x.** column subj
bde0: 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65  ect to the range
bdf0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c   constraint. Or,
be00: 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74   equivalently, t
be10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
be20: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
be30: 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62  ints optimized b
be40: 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69  y the proposed i
be50: 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65  ndex scan. For e
be60: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d  xample,.** assum
be70: 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f  ing index p is o
be80: 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20  n t1(a, b), and 
be90: 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73  the SQL query is
bea0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
beb0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
bec0: 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20  ? AND b > ? AND 
bed0: 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  b < ? ....**.** 
bee0: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
bef0: 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  to 1 (as the ran
bf00: 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
bf10: 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20  lumn, b, is the 
bf20: 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d  second .** left-
bf30: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
bf40: 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69  he index). Or, i
bf50: 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
bf60: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
bf70: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
bf80: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
bf90: 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
bfa0: 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
bfb0: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
bfc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
bfd0: 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
bfe0: 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  he sqlite3LogEst
bff0: 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  () of the.** num
c000: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
c010: 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
c020: 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76  is expected to v
c030: 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a  isit without .**
c040: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65   considering the
c050: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
c060: 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c  ts. If nEq is 0,
c070: 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20   then *pnOut is 
c080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
c090: 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * rows in the in
c0a0: 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
c0b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
c0c0: 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65  pnOut is adjuste
c0d0: 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74  d (reduced).** t
c0e0: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
c0f0: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
c100: 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  nts pLower and p
c110: 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e  Upper..** .** In
c120: 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
c130: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41  sqlite_stat4 ANA
c140: 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66  LYZE data, or if
c150: 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f   such data canno
c160: 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20  t be.** used, a 
c170: 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65  single range ine
c180: 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
c190: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
c1a0: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
c1b0: 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69  4. .** and a pai
c1c0: 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
c1d0: 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
c1e0: 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63  educes the expec
c1f0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  ted number of.**
c200: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
c210: 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e   a factor of 64.
c220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c230: 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
c240: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c250: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
c260: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
c270: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
c280: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
c290: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
c2a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
c2b0: 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
c2c0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c2d0: 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
c2e0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c2f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
c300: 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
c310: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
c320: 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
c330: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c340: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
c350: 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66  oop     /* Modif
c360: 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20  y the .nOut and 
c370: 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c  maybe .rRun fiel
c380: 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ds */.){.  int r
c390: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c3a0: 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f   int nOut = pLoo
c3b0: 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73  p->nOut;.  LogEs
c3c0: 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  t nNew;..#ifdef 
c3d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c3e0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49  AT3_OR_STAT4.  I
c3f0: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
c400: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
c410: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
c420: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
c430: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  ..  if( p->nSamp
c440: 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e  le>0 && nEq<p->n
c450: 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20  SampleCol ){.   
c460: 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64   if( nEq==pBuild
c470: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b  er->nRecValid ){
c480: 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52  .      UnpackedR
c490: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
c4a0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
c4b0: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
c4c0: 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a  ;.      u8 aff;.
c4d0: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
c4e0: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
c4f0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c500: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c510: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
c520: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
c530: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
c540: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c550: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
c560: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
c570: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
c580: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
c590: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
c5a0: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
c5b0: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
c5c0: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
c5d0: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
c5e0: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
c5f0: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
c600: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
c610: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c620: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
c630: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
c640: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
c650: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
c660: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
c670: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
c680: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
c690: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
c6a0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
c6b0: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
c6c0: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
c6d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
c6e0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c6f0: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
c700: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
c710: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
c720: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
c730: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
c740: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
c750: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c760: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
c770: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
c780: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
c790: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
c7a0: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
c7b0: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
c7c0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c7d0: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
c7e0: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
c7f0: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
c800: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
c810: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
c820: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
c830: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
c840: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
c850: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
c860: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
c870: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
c880: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
c890: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
c8a0: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
c8b0: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
c8c0: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
c8d0: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
c8e0: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
c8f0: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
c900: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c910: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
c920: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
c930: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
c940: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
c950: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
c960: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
c970: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
c980: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
c990: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
c9a0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
c9b0: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
c9c0: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
c9d0: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
c9e0: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
c9f0: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
ca00: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
ca10: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ca20: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
ca30: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
ca40: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
ca50: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
ca60: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
ca70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ca80: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
ca90: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
caa0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
cab0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
cac0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
cad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
cae0: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
caf0: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
cb00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e  pParse->db, p, n
cb10: 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
cb20: 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79 43  t( nEq!=p->nKeyC
cb30: 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ol || aff==SQLIT
cb40: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
cb50: 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
cb60: 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
cb70: 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
cb80: 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
cb90: 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20  if( nEq==0 ){.  
cba0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
cbb0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
cbc0: 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a   = p->nRowEst0;.
cbd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cbe0: 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
cbf0: 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
cc00: 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
cc10: 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
cc20: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
cc30: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
cc40: 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
cc50: 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
cc60: 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
cc70: 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
cc80: 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
cc90: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
cca0: 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
ccb0: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
ccc0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
ccd0: 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
cce0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
ccf0: 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30  ssert( pLower==0
cd00: 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   || (pLower->eOp
cd10: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
cd20: 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
cd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
cd40: 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
cd50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
cd60: 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
cd70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cd80: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d   p->aSortOrder!=
cd90: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
cda0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
cdb0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
cdc0: 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f  The roles of pLo
cdd0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61  wer and pUpper a
cde0: 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61  re swapped for a
cdf0: 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20   DESC index */. 
ce00: 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72         SWAP(Wher
ce10: 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20  eTerm*, pLower, 
ce20: 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d  pUpper);.      }
ce30: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
ce40: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
ce50: 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
ce60: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
ce70: 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
ce80: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
ce90: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
cec0: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
ced0: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
cee0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
cef0: 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
cf00: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
cf10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
cf20: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
cf30: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
cf40: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
cf50: 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
cf60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cf70: 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
cf80: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
cf90: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cfa0: 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
cfb0: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
cfc0: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
cfe0: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
cff0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
d000: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
d010: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d020: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
d030: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
d040: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d050: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d060: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
d070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d080: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
d090: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
d0a0: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
d0b0: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
d0c0: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
d0d0: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
d0e0: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
d110: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
d120: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
d130: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
d140: 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
d150: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
d160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
d170: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
d180: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
d190: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
d1a0: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
d1b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d1c0: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
d1d0: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
d1e0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d1f0: 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iUprIdx = whereK
d200: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d210: 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
d220: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
d230: 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
d240: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
d250: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
d260: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
d270: 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70      if( iNew<iUp
d280: 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69  per ) iUpper = i
d290: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
d2a0: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
d2b0: 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20   pUpper = 0;.   
d2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
d2d0: 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
d2e0: 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
d2f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d310: 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
d320: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  r ){.          n
d330: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  New = sqlite3Log
d340: 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  Est(iUpper - iLo
d350: 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wer);.          
d360: 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62  /* TUNING:  If b
d370: 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69  oth iUpper and i
d380: 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65  Lower are derive
d390: 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  d from the same.
d3a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
d3b0: 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  ple, then assume
d3c0: 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72   they are 4x mor
d3d0: 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68  e selective.  Th
d3e0: 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20  is brings.      
d3f0: 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d      ** the estim
d400: 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79  ated selectivity
d410: 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69   more in line wi
d420: 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64  th what it would
d430: 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
d440: 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69   if estimated wi
d450: 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66  thout the use of
d460: 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e   STAT3/4 tables.
d470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d480: 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49  ( iLwrIdx==iUprI
d490: 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  dx ) nNew -= 20;
d4a0: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
d4b0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
d4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
d4e0: 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 10;        ass
d4f0: 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
d500: 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
d510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d520: 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
d530: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d            nOut =
d540: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
d550: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
d560: 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54  ACE(0x10, ("STAT
d570: 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75  4 range scan: %u
d580: 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c  ..%u  est=%d\n",
d590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
d5b0: 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
d5c0: 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
d5d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d5e0: 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65  .      int bDone
d5f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
d600: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
d610: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
d620: 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70  Lower, pUpper, p
d630: 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20  Loop, &bDone);. 
d640: 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29       if( bDone )
d650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d660: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
d670: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d680: 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
d690: 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c  _PARAMETER(pBuil
d6a0: 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  der);.  assert( 
d6b0: 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
d6c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
d6d0: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
d6e0: 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61  | (pUpper->wtFla
d6f0: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
d700: 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  ==0 );.  nNew = 
d710: 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
d720: 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a  (pLower, nOut);.
d730: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
d740: 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72  ngeAdjust(pUpper
d750: 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54  , nNew);..  /* T
d760: 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
d770: 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
d780: 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74   and lower limit
d790: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d   and neither lim
d7a0: 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61  it.  ** has an a
d7b0: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
d7c0: 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  ed likelihood(),
d7d0: 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
d7e0: 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
d7f0: 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
d800: 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
d810: 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
d820: 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
d830: 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
d840: 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
d850: 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
d860: 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
d870: 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
d880: 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
d890: 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
d8a0: 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
d8b0: 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
d8c0: 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
d8d0: 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
d8e0: 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
d8f0: 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77  ( pLower && pLow
d900: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
d910: 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70  && pUpper && pUp
d920: 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  per->truthProb>0
d930: 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
d940: 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20  20;.  }..  nOut 
d950: 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b  -= (pLower!=0) +
d960: 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20   (pUpper!=0);.  
d970: 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e  if( nNew<10 ) nN
d980: 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e  ew = 10;.  if( n
d990: 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20  New<nOut ) nOut 
d9a0: 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69  = nNew;.#if defi
d9b0: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
d9c0: 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c  NABLED).  if( pL
d9d0: 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  oop->nOut>nOut )
d9e0: 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
d9f0: 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63  (0x10,("Range sc
da00: 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66  an lowers nOut f
da10: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
da20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da30: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
da40: 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65  , nOut));.  }.#e
da50: 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ndif.  pLoop->nO
da60: 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
da70: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
da80: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
da90: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
daa0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
dab0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
dac0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
dad0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
dae0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
daf0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
db00: 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
db10: 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
db20: 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
db30: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
db40: 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
db50: 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
db60: 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
db70: 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
db80: 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
db90: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
dba0: 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
dbb0: 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
dbc0: 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
dbd0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
dbe0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
dbf0: 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
dc00: 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
dc10: 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
dc20: 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
dc30: 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
dc40: 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
dc50: 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
dc60: 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
dc70: 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
dc80: 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
dc90: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
dca0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
dcb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
dcc0: 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
dcd0: 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
dce0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
dcf0: 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
dd00: 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
dd10: 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
dd20: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
dd30: 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
dd40: 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
dd50: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
dd60: 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
dd70: 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
dd80: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
dd90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
dda0: 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
ddb0: 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
ddc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ddd0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
dde0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
ddf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
de00: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
de10: 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
de20: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
de30: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
de40: 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
de50: 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
de60: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
de70: 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
de80: 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
de90: 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
dea0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
deb0: 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
dec0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
ded0: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
dee0: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
def0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
df00: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
df10: 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
df20: 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
df50: 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
df60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df70: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
df80: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
df90: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
dfa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dfb0: 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
dfc0: 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
dfd0: 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
dfe0: 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
dff0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
e000: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e010: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e020: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
e030: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
e040: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
e050: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
e060: 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
e070: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
e080: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
e090: 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
e0a0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
e0b0: 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
e0c0: 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
e0d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e0e0: 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
e0f0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e100: 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
e110: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e120: 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
e130: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
e140: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
e150: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
e160: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e170: 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
e180: 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
e190: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
e1a0: 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
e1b0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
e1c0: 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
e1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e1e0: 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 73  ;.  }..  aff = s
e1f0: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
e200: 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  nAffinity(pParse
e210: 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29 3b  ->db, p, nEq-1);
e220: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
e230: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e240: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
e250: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
e260: 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
e270: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
e280: 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
e290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e2a0: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
e2b0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
e2c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
e2d0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e2e0: 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
e2f0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
e300: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
e310: 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
e320: 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
e330: 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25  y scan regions %
e340: 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20  s(%d): %d\n",.  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31   p->zName, nEq-1
e370: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
e380: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
e390: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
e3a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e3b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e3c0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
e3d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e3e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e3f0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e400: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
e410: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
e420: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
e430: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
e440: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
e450: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e460: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e470: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
e480: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
e490: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
e4a0: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
e4b0: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
e4c0: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
e4d0: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
e4e0: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
e4f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
e500: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
e510: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
e520: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
e530: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
e540: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
e550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e560: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
e570: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
e580: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
e590: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
e5a0: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
e5b0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
e5c0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
e5d0: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
e5e0: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
e5f0: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
e600: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
e610: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
e620: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
e630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
e640: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
e650: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
e660: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e670: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
e680: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
e690: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e6a0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
e6b0: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
e6c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
e6d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
e6e0: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
e6f0: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
e700: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
e710: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
e720: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
e730: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
e740: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
e750: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
e760: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
e770: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
e780: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
e790: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
e7a0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
e7b0: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
e7c0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e7d0: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
e7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
e7f0: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
e800: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
e810: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
e820: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e830: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
e840: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
e850: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
e860: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
e870: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
e880: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
e890: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e8a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e8b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e8c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
e8d0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
e8e0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e8f0: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
e900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e910: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
e920: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
e930: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
e940: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
e950: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
e960: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
e970: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
e980: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e990: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
e9a0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
e9b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e9c0: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
e9d0: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
e9e0: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
e9f0: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
ea00: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
ea10: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
ea20: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
ea30: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
ea40: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ea50: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
ea60: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
ea70: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
ea80: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
ea90: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
eaa0: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
eab0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
eac0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
ead0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
eae0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
eaf0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
eb00: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
eb10: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
eb20: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
eb30: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
eb40: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
eb50: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
eb60: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
eb70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
eb80: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68  zType[4];.    ch
eb90: 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20  ar zLeft[50];.  
eba0: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
ebb0: 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
ebc0: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
ebd0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
ebe0: 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
ebf0: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
ec00: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
ec10: 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
ec20: 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
ec30: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ec40: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
ec50: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
ec60: 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
ec70: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ec80: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
ec90: 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  GLE ){.      sql
eca0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
ecb0: 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66  zeof(zLeft),zLef
ecc0: 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22  t,"left={%d:%d}"
ecd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ece0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
ecf0: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
ed00: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29  m->u.leftColumn)
ed10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ed20: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
ed30: 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26  r & WO_OR)!=0 &&
ed40: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
ed50: 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o!=0 ){.      sq
ed60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
ed70: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ed80: 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30 78  ft,"indexable=0x
ed90: 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20 20  %lld", .        
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
edb0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
edc0: 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20 20  >indexable);.   
edd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ede0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
edf0: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ee00: 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70 54  ft,"left=%d", pT
ee10: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
ee20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ee30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
ee40: 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33         "TERM-%-3
ee50: 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70 72  d %p %s %-12s pr
ee60: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
ee70: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
ee80: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72  \n",.       iTer
ee90: 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
eea0: 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74   zLeft, pTerm->t
eeb0: 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20  ruthProb,.      
eec0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
eed0: 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  r, pTerm->wtFlag
eee0: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  s);.    sqlite3T
eef0: 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 70  reeViewExpr(0, p
ef00: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Term->pExpr, 0);
ef10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
ef20: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
ef30: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
ef40: 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  how the complete
ef50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68   content of a Wh
ef60: 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69  ereClause.*/.voi
ef70: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c  d sqlite3WhereCl
ef80: 61 75 73 65 50 72 69 6e 74 28 57 68 65 72 65 43  ausePrint(WhereC
ef90: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
efa0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
efb0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
efc0: 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65 54 65  ++){.    whereTe
efd0: 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b  rmPrint(&pWC->a[
efe0: 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65  i], i);.  }.}.#e
eff0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45  ndif..#ifdef WHE
f000: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f010: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68  /*.** Print a Wh
f020: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66  ereLoop object f
f030: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72  or debugging pur
f040: 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
f050: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72  void whereLoopPr
f060: 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  int(WhereLoop *p
f070: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
f080: 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  WC){.  WhereInfo
f090: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
f0a0: 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62  pWInfo;.  int nb
f0b0: 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54   = 1+(pWInfo->pT
f0c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f  abList->nSrc+3)/
f0d0: 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  4;.  struct SrcL
f0e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
f0f0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
f100: 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b  st->a + p->iTab;
f110: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
f120: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
f130: 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28  Bitmask mAll = (
f140: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e  ((Bitmask)1)<<(n
f150: 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c  b*4)) - 1;.  sql
f160: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f170: 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
f180: 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
f1b0: 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
f1c0: 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20 6d 41  , p->prereq & mA
f1d0: 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ll);.  sqlite3De
f1e0: 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
f1f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f200: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
f210: 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
f220: 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
f230: 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
f240: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f250: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
f260: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
f270: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
f280: 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
f290: 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
f2a0: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
f2b0: 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
f2c0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
f2d0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
f2e0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
f2f0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
f300: 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
f310: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
f320: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
f330: 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
f340: 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
f350: 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
f360: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f370: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
f380: 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
f390: 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
f3a0: 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
f3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f3c0: 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
f3d0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
f3e0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
f3f0: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
f400: 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
f410: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f420: 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
f430: 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
f440: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
f450: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
f460: 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
f470: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
f480: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f490: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f4a0: 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
f4b0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
f4c0: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
f4d0: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
f4e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f4f0: 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
f500: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f510: 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
f520: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
f530: 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
f540: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
f550: 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
f560: 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
f570: 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
f580: 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
f590: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
f5a0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
f5b0: 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
f5c0: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
f5d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
f5e0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
f5f0: 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
f600: 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
f610: 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
f620: 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
f630: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
f640: 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
f650: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
f660: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f670: 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
f680: 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
f690: 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
f6a0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
f6b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
f6c0: 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
f6d0: 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
f6e0: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
f6f0: 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
f700: 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
f710: 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
f720: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f730: 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
f740: 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
f750: 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
f760: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
f770: 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
f780: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
f790: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
f7a0: 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
f7b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
f7c0: 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
f7d0: 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
f7e0: 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
f7f0: 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
f800: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
f810: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
f820: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f830: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
f840: 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
f850: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
f860: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
f870: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
f880: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f890: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
f8a0: 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
f8b0: 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
f8c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
f8d0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
f8e0: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
f8f0: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
f900: 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
f910: 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
f920: 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
f930: 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
f940: 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
f950: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
f960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f980: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
f990: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
f9a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f9b0: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
f9c0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
f9d0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
f9e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
f9f0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
fa00: 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
fa10: 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
fa20: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
fa30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
fa40: 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
fa50: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
fa60: 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
fa70: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fa80: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fa90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
faa0: 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
fab0: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
fac0: 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
fad0: 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
fae0: 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
faf0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
fb00: 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
fb10: 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
fb20: 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
fb30: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
fb40: 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
fb50: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
fb60: 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
fb70: 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
fb80: 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
fb90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fba0: 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
fbb0: 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
fbc0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
fbd0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  NN(db, sizeof(p-
fbe0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
fbf0: 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
fc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fc10: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
fc20: 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
fc30: 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
fc40: 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
fc50: 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
fc60: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fc70: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fc80: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
fc90: 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
fca0: 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
fcb0: 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
fcc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fcd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
fce0: 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
fcf0: 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
fd00: 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
fd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
fd20: 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
fd30: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
fd40: 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
fd50: 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
fd60: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
fd70: 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
fd80: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
fd90: 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
fda0: 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
fdb0: 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
fdc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
fdd0: 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
fde0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
fdf0: 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  PT;.  }.  memcpy
fe00: 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45  (pTo, pFrom, WHE
fe10: 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29  RE_LOOP_XFER_SZ)
fe20: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
fe30: 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61  aLTerm, pFrom->a
fe40: 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65  LTerm, pTo->nLTe
fe50: 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61  rm*sizeof(pTo->a
fe60: 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66  LTerm[0]));.  if
fe70: 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73  ( pFrom->wsFlags
fe80: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
fe90: 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72  TABLE ){.    pFr
fea0: 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  om->u.vtab.needF
feb0: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
fec0: 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46   if( (pFrom->wsF
fed0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
fee0: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
fef0: 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65     pFrom->u.btre
ff00: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
ff10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ff20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ff30: 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f  elete a WhereLoo
ff40: 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  p object.*/.stat
ff50: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
ff60: 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  pDelete(sqlite3 
ff70: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
ff80: 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  p){.  whereLoopC
ff90: 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73  lear(db, p);.  s
ffa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ffb0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
ffc0: 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
ffd0: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
ffe0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
fff0: 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
10000 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
10010 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
10020 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
10030 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10040 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
10050 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
10060 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20       WhereLevel 
10070 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
10080 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  o->a[i];.      i
10090 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
100a0 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
100b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
100c0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
100d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
100e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
100f0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
10100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10110 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
10120 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
10130 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
10140 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
10150 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
10160 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
10170 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
10180 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
10190 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
101a0 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
101b0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
101c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
101d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
101e0 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nfo);.  }.}../*.
101f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10200 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
10210 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10220 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
10230 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
10240 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
10250 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
10260 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10270 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20   of Y.**   (3)  
10280 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74  X skips at least
10290 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   as many columns
102a0 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   as Y.**.** By "
102b0 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
102c0 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
102d0 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
102e0 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
102f0 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
10300 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
10310 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
10320 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
10330 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
10340 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
10350 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
10360 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
10370 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
10380 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
10390 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
103a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
103b0 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
103c0 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
103d0 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
103e0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
103f0 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69  justed.  The thi
10400 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61  rd rule.** was a
10410 64 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20  dded because if 
10420 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e  X uses skip-scan
10430 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20   less than Y it 
10440 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64  still might.** d
10450 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63  eserve a lower c
10460 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69  ost even if it i
10470 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10480 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  t of Y..*/.stati
10490 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
104a0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
104b0 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
104c0 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
104d0 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
104e0 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
104f0 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
10500 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
10510 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
10520 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
10530 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
10540 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
10550 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d  erm-pX->nSkip >=
10560 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e   pY->nLTerm-pY->
10570 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74  nSkip ){.    ret
10580 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e  urn 0; /* X is n
10590 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
105a0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59   */.  }.  if( pY
105b0 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53  ->nSkip > pX->nS
105c0 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  kip ) return 0;.
105d0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
105e0 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
105f0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
10600 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
10610 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
10620 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
10630 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
10640 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
10650 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
10660 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
10670 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
10680 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
10690 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
106a0 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d    if( pX->aLTerm
106b0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
106c0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  e;.    for(j=pY-
106d0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
106e0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
106f0 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
10700 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
10710 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10720 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
10730 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
10740 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
10750 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
10760 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
10770 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
10780 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
10790 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
107a0 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
107b0 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
107c0 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
107d0 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
107e0 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
107f0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
10800 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
10810 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
10820 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
10830 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
10840 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
10850 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
10860 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
10870 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10880 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
10890 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
108a0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
108b0 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
108c0 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
108d0 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
108e0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
108f0 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
10900 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
10910 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
10920 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
10930 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
10940 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10950 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
10960 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
10970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10980 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
10990 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
109a0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
109b0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
109c0 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
109d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
109e0 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
109f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
10a00 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
10a10 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
10a20 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
10a30 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
10a40 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
10a50 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10a60 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
10a70 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
10a80 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
10a90 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
10aa0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
10ab0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
10ac0 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
10ad0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
10ae0 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
10af0 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
10b00 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45   p. */.      WHE
10b10 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
10b20 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
10b30 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
10b40 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
10b70 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10b80 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
10b90 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut-1));.      pT
10ba0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
10bb0 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
10bc0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
10bd0 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
10be0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
10bf0 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
10c00 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
10c10 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
10c20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
10c30 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
10c40 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
10c50 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
10c60 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
10c70 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
10c80 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
10c90 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10ca0 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10cb0 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10cc0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10cd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10ce0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
10cf0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
10d00 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
10d10 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29  rRun, p->nOut+1)
10d20 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
10d30 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
10d40 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10d50 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10d60 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  Out + 1;.    }. 
10d70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72   }.}../*.** Sear
10d80 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  ch the list of W
10d90 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70  hereLoops in *pp
10da0 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  Prev looking for
10db0 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65   one that can be
10dc0 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62  .** supplanted b
10dd0 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  y pTemplate..**.
10de0 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
10df0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
10e00 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  list contains an
10e10 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20   entry that can 
10e20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d  supplant.** pTem
10e30 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20  plate, in other 
10e40 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
10e50 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
10e60 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ng on the list..
10e70 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61  **.** If pX is a
10e80 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
10e90 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75  pTemplate can su
10ea0 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74  pplant, then ret
10eb0 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20  urn the.** link 
10ec0 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  that points to p
10ed0 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d  X..**.** If pTem
10ee0 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70  plate cannot sup
10ef0 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69  plant any existi
10f00 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
10f10 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73  e list but needs
10f20 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20  .** to be added 
10f30 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65  to the list, the
10f40 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
10f50 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f  er to the tail o
10f60 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  f the list..*/.s
10f70 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20  tatic WhereLoop 
10f80 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  **whereLoopFindL
10f90 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f  esser(.  WhereLo
10fa0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63  op **ppPrev,.  c
10fb0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10fc0 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57  pTemplate.){.  W
10fd0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66  hereLoop *p;.  f
10fe0 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20  or(p=(*ppPrev); 
10ff0 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
11000 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
11010 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
11020 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
11030 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
11040 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
11050 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
11060 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
11070 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
11080 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
11090 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
110a0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
110b0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
110c0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
110d0 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
110e0 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
110f0 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
11100 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
11110 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
11120 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
11130 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
11140 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
11150 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
11160 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
11170 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
11180 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
11190 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
111a0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
111b0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
111c0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
111d0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
111e0 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
111f0 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
11200 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11210 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
11220 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11240 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
11250 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11260 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
11270 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
11280 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
11290 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
112a0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
112b0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
112c0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
112d0 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
112e0 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
112f0 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
11300 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
11310 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
11320 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
11330 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
11340 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
11350 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79  p );..    /* Any
11360 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61   loop using an a
11370 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65  ppliation-define
11380 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d  d index (or PRIM
11390 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a  ARY KEY or.    *
113a0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
113b0 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72  int) with one or
113c0 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61   more == constra
113d0 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20  ints is better. 
113e0 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75     ** than an au
113f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55  tomatic index. U
11400 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b  nless it is a sk
11410 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ip-scan. */.    
11420 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
11430 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
11440 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EX)!=0.     && (
11450 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70  pTemplate->nSkip
11460 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
11470 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11480 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11490 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
114a0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
114b0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
114c0 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EQ)!=0.     && (
114d0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
114e0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
114f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11500 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  q.    ){.      b
11510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11520 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20   /* If existing 
11530 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
11540 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
11550 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20  late, pTemplate 
11560 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69  can be.    ** di
11570 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c  scarded.  WhereL
11580 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
11590 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
115a0 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20    p has no more 
115b0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
115c0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64  n pTemplate, and
115d0 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
115e0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
115f0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11600 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a   pTemplate.    *
11610 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
11620 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
11630 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
11640 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20  ereq    /* (1)  
11650 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  */.     && p->rS
11660 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
11670 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20  >rSetup         
11680 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
11690 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
116a0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
116b0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
116c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
116d0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
116e0 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
116f0 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11710 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  c) */.    ){.   
11720 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
11730 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61   Discard pTempla
11740 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  te */.    }..   
11750 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65   /* If pTemplate
11760 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65   is always bette
11770 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63  r than p, then c
11780 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
11790 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20  rwritten.    ** 
117a0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20  with pTemplate. 
117b0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65   pTemplate is be
117c0 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a  tter than p if:.
117d0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54      **   (1)  pT
117e0 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d  emplate has no m
117f0 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20  ore dependences 
11800 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20  than p, and.    
11810 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c  **   (2)  pTempl
11820 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c  ate has an equal
11830 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11840 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  han p..    */.  
11850 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
11860 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
11870 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
11880 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31  ->prereq   /* (1
11890 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
118a0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
118b0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
118e0 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
118f0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11920 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  b) */.    ){.   
11930 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11940 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
11950 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
11960 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
11970 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ove */.      bre
11980 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70  ak;   /* Cause p
11990 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
119a0 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  en by pTemplate 
119b0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
119c0 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a  eturn ppPrev;.}.
119d0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
119e0 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
119f0 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
11a00 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
11a10 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
11a20 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11a30 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
11a40 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
11a50 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
11a60 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
11a70 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
11a80 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
11a90 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
11aa0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
11ab0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
11ac0 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
11ad0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
11ae0 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
11af0 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
11b00 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
11b10 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
11b20 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
11b30 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
11b40 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ded based on the
11b50 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a   template..**.**
11b60 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
11b70 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rSet is not NULL
11b80 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62   then we care ab
11b90 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
11ba0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
11bb0 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
11bc0 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
11bd0 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
11be0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
11bf0 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
11c00 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
11c10 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
11c20 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
11c30 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
11c40 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
11c50 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
11c60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
11c70 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
11c80 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
11c90 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11ca0 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
11cb0 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
11cc0 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
11cd0 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
11ce0 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
11cf0 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74  e.** new templat
11d00 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
11d10 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
11d20 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
11d30 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
11d40 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
11d50 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
11d60 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11d70 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
11d80 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
11d90 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
11da0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
11db0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
11dc0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
11dd0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
11de0 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
11df0 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
11e00 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
11e10 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11e20 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
11e30 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69  loop.*/.static i
11e40 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
11e50 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
11e60 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
11e70 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
11e80 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
11e90 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a  p **ppPrev, *p;.
11ea0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
11eb0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
11ec0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
11ed0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
11ee0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
11ef0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  t rc;..  /* If p
11f00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11f10 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
11f20 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
11f30 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
11f40 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
11f50 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
11f60 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
11f70 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c  {.    if( pTempl
11f80 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23  ate->nLTerm ){.#
11f90 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11fa0 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20  ABLED.      u16 
11fb0 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  n = pBuilder->pO
11fc0 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69  rSet->n;.      i
11fd0 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20  nt x =.#endif.  
11fe0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
11ff0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
12000 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
12010 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
12020 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
12050 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
12060 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12070 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
12080 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12090 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
120a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
120b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
120c0 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
120d0 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
120e0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
120f0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
12100 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
12110 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
12120 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  f.    }.    retu
12130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12140 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  }..  /* Look for
12150 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
12160 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63  reLoop to replac
12170 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  e with pTemplate
12180 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f  .  */.  whereLoo
12190 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e  pAdjustCost(pWIn
121a0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
121b0 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76  plate);.  ppPrev
121c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
121d0 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e  Lesser(&pWInfo->
121e0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
121f0 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65  e);..  if( ppPre
12200 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  v==0 ){.    /* T
12210 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
12220 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  sts a WhereLoop 
12230 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  on the list that
12240 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
12250 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  * than pTemplate
12260 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65  , so just ignore
12270 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69   pTemplate */.#i
12280 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12290 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
122a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
122b0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
122c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
122d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73  ebugPrintf("   s
122e0 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  kip: ");.      w
122f0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12300 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12310 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23  r->pWC);.    }.#
12320 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
12330 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20   SQLITE_OK;  .  
12340 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a  }else{.    p = *
12350 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f  ppPrev;.  }..  /
12360 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
12370 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
12380 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
12390 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
123a0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
123b0 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
123c0 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
123d0 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
123e0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
123f0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
12400 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
12410 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
12420 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
12430 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
12440 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
12450 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
12460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12470 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65  3DebugPrintf("re
12480 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20  place: ");.     
12490 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
124a0 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  p, pBuilder->pWC
124b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
124c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
124d0 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20  "    add: ");.  
124e0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
124f0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12500 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
12510 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
12520 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
12530 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
12540 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
12550 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
12560 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
12570 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
12580 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
12590 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
125a0 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
125b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
125c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
125d0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
125e0 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  p);.    p->pNext
125f0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Loop = 0;.  }els
12600 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c  e{.    /* We wil
12610 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67  l be overwriting
12620 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20   WhereLoop p[]. 
12630 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64   But before we d
12640 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  o, first.    ** 
12650 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  go through the r
12660 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  est of the list 
12670 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f  and delete any o
12680 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73  ther entries bes
12690 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20  ides.    ** p[] 
126a0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75  that are also su
126b0 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70  pplated by pTemp
126c0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72  late */.    Wher
126d0 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d  eLoop **ppTail =
126e0 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a   &p->pNextLoop;.
126f0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
12700 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65  ToDel;.    while
12710 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20  ( *ppTail ){.   
12720 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72     ppTail = wher
12730 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12740 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74  ppTail, pTemplat
12750 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70  e);.      if( pp
12760 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tail==0 ) break;
12770 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
12780 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
12790 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
127a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
127b0 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
127c0 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
127d0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
127e0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
127f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
12800 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
12810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
12820 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65  bugPrintf(" dele
12830 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  te: ");.        
12840 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12850 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
12860 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
12870 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
12880 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
12890 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
128a0 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c   }.  rc = whereL
128b0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
128c0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
128d0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
128e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
128f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
12900 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
12910 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
12920 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12930 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
12940 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
12950 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
12960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12980 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
12990 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
129a0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
129b0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
129c0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
129d0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
129e0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
129f0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
12a00 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
12a10 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65  ndex..*.** For e
12a20 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12a30 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12a40 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12a50 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12a60 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72  h has a truth pr
12a70 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e  obability assign
12a80 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
12a90 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a   likelihood(),.*
12aa0 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75  * likely(), or u
12ab0 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75  nlikely() SQL fu
12ac0 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20  nctions, reduce 
12ad0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
12ae0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75  mber.** of outpu
12af0 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72  t rows by the pr
12b00 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66  obability specif
12b10 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e  ied..**.** TUNIN
12b20 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48  G:  For every WH
12b30 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12b40 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
12b50 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
12b60 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20   and which does 
12b70 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69  not have an assi
12b80 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61  gned truth proba
12b90 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69  bility, heuristi
12ba0 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  cs.** described 
12bb0 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74  below are used t
12bc0 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
12bd0 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12be0 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f  ability..** TODO
12bf0 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69   --> Perhaps thi
12c00 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
12c10 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  hat could be imp
12c20 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a  roved by better.
12c30 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74  ** table statist
12c40 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  ics..**.** Heuri
12c50 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74  stic 1:  Estimat
12c60 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12c70 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35  ability as 93.75
12c80 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a  %.  The 93.75%.*
12c90 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f  * value correspo
12ca0 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67  nds to -1 in Log
12cb0 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f  Est notation, so
12cc0 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72   this means decr
12cd0 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65  ement.** the Whe
12ce0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c  reLoop.nOut fiel
12cf0 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68  d for every such
12d00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12d10 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  rm..**.** Heuris
12d20 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65  tic 2:  If there
12d30 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
12d40 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
12d50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12d60 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20   form "x==EXPR" 
12d70 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20  and EXPR is not 
12d80 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20  a constant 0 or 
12d90 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  1, then make sur
12da0 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f  e the.** final o
12db0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
12dc0 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72  te is no greater
12dd0 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65   than 1/4 of the
12de0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a   total number.**
12df0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
12e00 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
12e10 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74   words, assume t
12e20 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c  hat x==EXPR will
12e30 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61   filter.** out a
12e40 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66  t least 3 out of
12e50 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50   4 rows.  If EXP
12e60 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20  R is -1 or 0 or 
12e70 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68  1, then maybe th
12e80 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20  e.** "x" column 
12e90 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c  is boolean or el
12ea0 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20  se -1 or 0 or 1 
12eb0 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61  is a common defa
12ec0 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20  ult value.** on 
12ed0 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61  the "x" column a
12ee0 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  nd so in that ca
12ef0 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20  se only cap the 
12f00 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
12f10 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e  ate.** at 1/2 in
12f20 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f  stead of 1/4..*/
12f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
12f40 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
12f50 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  st(.  WhereClaus
12f60 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
12f70 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
12f80 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
12f90 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20  *pLoop,      /* 
12fa0 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75  The loop to adju
12fb0 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20  st downward */. 
12fc0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20   LogEst nRow    
12fd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12fe0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
12ff0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
13000 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
13010 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
13020 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
13030 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
13040 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
13050 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
13060 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52  , k;.  LogEst iR
13070 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a  educe = 0;    /*
13080 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f   pLoop->nOut sho
13090 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e  uld not exceed n
130a0 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a  Row-iReduce */..
130b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
130c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
130d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
130e0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   );.  for(i=pWC-
130f0 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
13100 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
13110 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
13120 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
13130 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
13140 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
13150 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13160 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
13170 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
13180 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13190 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
131a0 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
131b0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
131c0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
131d0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
131e0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
131f0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
13200 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
13210 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
13220 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
13230 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13240 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
13250 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
13260 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
13270 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
13280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
13290 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
132a0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
132b0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
132c0 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f  * If a truth pro
132d0 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63  bability is spec
132e0 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  ified using the 
132f0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e  likelihood() hin
13300 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts,.        ** t
13310 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62  hen use the prob
13320 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64  ability provided
13330 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
13340 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
13350 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
13360 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
13370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13380 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
13390 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69  absence of expli
133a0 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62  cit truth probab
133b0 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75  ilities, use heu
133c0 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20  ristics to.     
133d0 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65     ** guess a re
133e0 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70  asonable truth p
133f0 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20  robability. */. 
13400 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
13410 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  ut--;.        if
13420 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13430 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
13440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
13450 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
13460 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13470 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
13480 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
13490 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
134a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
134b0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
134c0 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29  eger(pRight, &k)
134d0 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b   && k>=(-1) && k
134e0 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=1 ){.         
134f0 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20     k = 10;.     
13500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13510 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a          k = 20;.
13520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13530 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63        if( iReduc
13540 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20  e<k ) iReduce = 
13550 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13570 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
13580 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20   > nRow-iReduce 
13590 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  )  pLoop->nOut =
135a0 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b   nRow - iReduce;
135b0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20  .}../* .** Term 
135c0 70 54 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f  pTerm is a vecto
135d0 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73  r range comparis
135e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  on operation. Th
135f0 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73  e first comparis
13600 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63  on.** in the vec
13610 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  tor can be optim
13620 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d  ized using colum
13630 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64  n nEq of the ind
13640 65 78 2e 20 20 0a 2a 2f 0a 69 6e 74 20 77 68 65  ex.  .*/.int whe
13650 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e  reRangeVectorLen
13660 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13670 65 2c 20 69 6e 74 20 69 43 75 72 2c 20 49 6e 64  e, int iCur, Ind
13680 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 6e 45  ex *pIdx, int nE
13690 71 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  q, WhereTerm *pT
136a0 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d  erm.){.  int nCm
136b0 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  p = sqlite3ExprV
136c0 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d 2d  ectorSize(pTerm-
136d0 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
136e0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d 70    int i;..  nCmp
136f0 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70 49   = MIN(nCmp, (pI
13700 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e 45  dx->nColumn - nE
13710 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  q));.  for(i=1; 
13720 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCmp; i++){.  
13730 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f 6d    /* Test if com
13740 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54 65  parison i of pTe
13750 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65  rm is compatible
13760 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69 2b   with column (i+
13770 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66 20  nEq) .    ** of 
13780 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f  the index. If no
13790 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f 70  t, exit the loop
137a0 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 61  .  */.    char a
137b0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
137c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
137d0 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20 2a  rison affinity *
137e0 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78 61 66  /.    char idxaf
137f0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
13800 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20 63      /* Indexed c
13810 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
13820 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
13830 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
13840 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
13850 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  on collation seq
13860 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78 70  uence */.    Exp
13870 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d 2d  r *pLhs = pTerm-
13880 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 78  >pExpr->pLeft->x
13890 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
138a0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  pr;.    Expr *pR
138b0 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  hs = pTerm->pExp
138c0 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69  r->pRight;.    i
138d0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
138e0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29 7b   EP_xIsSelect ){
138f0 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52  .      pRhs = pR
13900 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70  hs->x.pSelect->p
13910 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
13920 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
13930 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73 2d      pRhs = pRhs-
13940 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
13950 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Expr;.    }..   
13960 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
13970 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63 6f  he LHS of the co
13980 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f  mparison is a co
13990 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 74  lumn reference t
139a0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  o.    ** the rig
139b0 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ht column of the
139c0 20 72 69 67 68 74 20 73 6f 75 72 63 65 20 74 61   right source ta
139d0 62 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ble. .    */.   
139e0 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21 3d 54   if( pLhs->op!=T
139f0 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20 20 7c  K_COLUMN .     |
13a00 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65 21 3d  | pLhs->iTable!=
13a10 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20 70 4c  iCur .     || pL
13a20 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64  hs->iColumn!=pId
13a30 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b 6e 45  x->aiColumn[i+nE
13a40 71 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  q] .    ){.     
13a50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
13a60 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
13a70 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
13a80 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45 78 70  pRhs, sqlite3Exp
13a90 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73 29 29  rAffinity(pLhs))
13aa0 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d 20 70  ;.    idxaff = p
13ab0 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
13ac0 6c 5b 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 5d  l[pLhs->iColumn]
13ad0 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 69  .affinity;.    i
13ae0 66 28 20 61 66 66 21 3d 69 64 78 61 66 66 20 29  f( aff!=idxaff )
13af0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f   break;..    pCo
13b00 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
13b10 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
13b20 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
13b30 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 73 71  Rhs);.    if( sq
13b40 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
13b50 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
13b60 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20  >azColl[i+nEq]) 
13b70 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
13b80 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
13b90 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f 73  * Adjust the cos
13ba0 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74 4d  t C by the costM
13bb0 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20 54  ult facter T.  T
13bc0 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  his only occurs 
13bd0 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77  if.** compiled w
13be0 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41  ith -DSQLITE_ENA
13bf0 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a  BLE_COSTMULT.*/.
13c00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
13c10 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20  ABLE_COSTMULT.# 
13c20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
13c30 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 20  Multiplier(C,T) 
13c40 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20   C += T.#else.# 
13c50 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73 74  define ApplyCost
13c60 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29 0a  Multiplier(C,T).
13c70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
13c80 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61 74   have so far mat
13c90 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e 70  ched pBuilder->p
13ca0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
13cb0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a   terms of the .*
13cc0 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e 20  * index pIndex. 
13cd0 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65  Try to match one
13ce0 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   more..**.** Whe
13cf0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
13d00 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c  is called, pBuil
13d10 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20  der->pNew->nOut 
13d20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a  contains the .**
13d30 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13d40 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20 76  expected to be v
13d50 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65 72  isited by filter
13d60 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e 45  ing using the nE
13d70 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79  q .** terms only
13d80 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69 66  . If it is modif
13d90 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65 20  ied, this value 
13da0 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  is restored befo
13db0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
13dc0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tion returns..**
13dd0 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e 74  .** If pProbe->t
13de0 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  num==0, that mea
13df0 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20 66  ns pIndex is a f
13e00 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20 66  ake index used f
13e10 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45  or the.** INTEGE
13e20 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a  R PRIMARY KEY..*
13e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13e40 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
13e50 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dex(.  WhereLoop
13e60 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
13e70 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  r,     /* The Wh
13e80 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20  ereLoop factory 
13e90 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
13ea0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
13eb0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
13ec0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 61  use term being a
13ed0 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64  nalyzed */.  Ind
13ee0 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20 20  ex *pProbe,     
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f00 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72 63  An index on pSrc
13f10 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e   */.  LogEst nIn
13f20 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  Mul             
13f30 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d        /* log(Num
13f40 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
13f50 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a  s due to IN) */.
13f60 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
13f70 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
13f80 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57  r->pWInfo;  /* W
13f90 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e  HERE analyse con
13fa0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
13fb0 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f  *pParse = pWInfo
13fc0 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20 20  ->pParse;       
13fd0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13fe0 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ext */.  sqlite3
13ff0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14000 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
14010 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14020 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a  malloc context *
14030 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  /.  WhereLoop *p
14040 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
14050 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20      /* Template 
14060 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20  WhereLoop under 
14070 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
14080 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
14090 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
140a0 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72 6d    /* A WhereTerm
140b0 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72 61   under considera
140c0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tion */.  int op
140d0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
140e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
140f0 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  id operators for
14100 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
14110 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61 6e    WhereScan scan
14120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14130 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
14140 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a 2f  r WHERE terms */
14150 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65 64  .  Bitmask saved
14160 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20 20  _prereq;        
14170 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
14180 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72  alue of pNew->pr
14190 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  ereq */.  u16 sa
141a0 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20  ved_nLTerm;     
141b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
141c0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
141d0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20  New->nLTerm */. 
141e0 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b 20   u16 saved_nEq; 
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14210 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74  ue of pNew->u.bt
14220 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36  ree.nEq */.  u16
14230 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20 20   saved_nBtm;    
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14250 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
14260 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  f pNew->u.btree.
14270 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61  nBtm */.  u16 sa
14280 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20 20  ved_nTop;       
14290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
142a0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
142b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f  New->u.btree.nTo
142c0 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  p */.  u16 saved
142d0 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20  _nSkip;         
142e0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
142f0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14300 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32  ->nSkip */.  u32
14310 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 20   saved_wsFlags; 
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14330 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
14340 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  f pNew->wsFlags 
14350 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76 65  */.  LogEst save
14360 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  d_nOut;         
14370 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
14380 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
14390 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nOut */.  int rc
143a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
143b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
143c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f  urn code */.  Lo
143d0 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
143f0 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
14400 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
14410 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a    LogEst rLogSiz
14420 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
14430 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f    /* Logarithm o
14440 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a  f table size */.
14450 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 6f    WhereTerm *pTo
14460 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30  p = 0, *pBtm = 0
14470 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74  ; /* Top and bot
14480 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  tom range constr
14490 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77  aints */..  pNew
144a0 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65   = pBuilder->pNe
144b0 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  w;.  if( db->mal
144c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
144d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
144e0 42 4b 50 54 3b 0a 0a 20 20 61 73 73 65 72 74 28  BKPT;..  assert(
144f0 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
14500 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
14510 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ABLE)==0 );.  as
14520 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46  sert( (pNew->wsF
14530 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
14540 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20  _LIMIT)==0 );.  
14550 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
14560 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
14570 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73  MIT ){.    opMas
14580 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  k = WO_LT|WO_LE;
14590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
145a0 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74  sert( pNew->u.bt
145b0 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a 20  ree.nBtm==0 );. 
145c0 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45     opMask = WO_E
145d0 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f  Q|WO_IN|WO_GT|WO
145e0 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _GE|WO_LT|WO_LE|
145f0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b  WO_ISNULL|WO_IS;
14600 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62  .  }.  if( pProb
14610 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20  e->bUnordered ) 
14620 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47  opMask &= ~(WO_G
14630 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f  T|WO_GE|WO_LT|WO
14640 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  _LE);..  assert(
14650 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14660 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
14670 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f 6e  mn );..  saved_n
14680 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  Eq = pNew->u.btr
14690 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f  ee.nEq;.  saved_
146a0 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  nBtm = pNew->u.b
146b0 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61 76  tree.nBtm;.  sav
146c0 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d 3e  ed_nTop = pNew->
146d0 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20 20  u.btree.nTop;.  
146e0 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e  saved_nSkip = pN
146f0 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76  ew->nSkip;.  sav
14700 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77  ed_nLTerm = pNew
14710 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65  ->nLTerm;.  save
14720 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77  d_wsFlags = pNew
14730 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76  ->wsFlags;.  sav
14740 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77  ed_prereq = pNew
14750 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65  ->prereq;.  save
14760 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e  d_nOut = pNew->n
14770 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77  Out;.  pTerm = w
14780 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63  hereScanInit(&sc
14790 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  an, pBuilder->pW
147a0 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  C, pSrc->iCursor
147b0 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20  , saved_nEq,.   
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147d0 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72       opMask, pPr
147e0 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53  obe);.  pNew->rS
147f0 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a  etup = 0;.  rSiz
14800 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  e = pProbe->aiRo
14810 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c  wLogEst[0];.  rL
14820 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28  ogSize = estLog(
14830 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20  rSize);.  for(; 
14840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14850 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d   pTerm!=0; pTerm
14860 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74   = whereScanNext
14870 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31  (&scan)){.    u1
14880 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65  6 eOp = pTerm->e
14890 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53  Operator;   /* S
148a0 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65  horthand for pTe
148b0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f  rm->eOperator */
148c0 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73  .    LogEst rCos
148d0 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74  tIdx;.    LogEst
148e0 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b   nOutUnadjusted;
148f0 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20          /* nOut 
14900 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20  before IN() and 
14910 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74  WHERE adjustment
14920 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e  s */.    int nIn
14930 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
14940 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
14950 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e  _OR_STAT4.    in
14960 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42  t nRecValid = pB
14970 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
14980 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  d;.#endif.    if
14990 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c  ( (eOp==WO_ISNUL
149a0 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46  L || (pTerm->wtF
149b0 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29  lags&TERM_VNULL)
149c0 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69 6e 64  !=0).     && ind
149d0 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28  exColumnNotNull(
149e0 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45  pProbe, saved_nE
149f0 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  q).    ){.      
14a00 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e  continue; /* ign
14a10 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c  ore IS [NOT] NUL
14a20 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  L constraints on
14a30 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
14a40 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  s */.    }.    i
14a50 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
14a60 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
14a70 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
14a80 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  e;..    /* Do no
14a90 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70 70 65  t allow the uppe
14aa0 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b  r bound of a LIK
14ab0 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72  E optimization r
14ac0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a  ange constraint.
14ad0 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69      ** to mix wi
14ae0 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e 67 65  th a lower range
14af0 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65   bound from some
14b00 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20 2a 2f   other source */
14b10 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
14b20 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
14b30 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72 6d 2d  IKEOPT && pTerm-
14b40 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
14b50 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  T ) continue;.. 
14b60 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
14b70 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69 6e 74  ow IS constraint
14b80 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45  s from the WHERE
14b90 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73   clause to be us
14ba0 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  ed by the.    **
14bb0 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
14bc0 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e  a LEFT JOIN.  On
14bd0 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  ly constraints i
14be0 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  n the ON clause 
14bf0 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77  are.    ** allow
14c00 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70  ed */.    if( (p
14c10 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  Src->fg.jointype
14c20 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20   & JT_LEFT)!=0. 
14c30 20 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50      && !ExprHasP
14c40 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
14c50 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
14c60 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f 70 20  n).     && (eOp 
14c70 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e 55  & (WO_IS|WO_ISNU
14c80 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  LL))!=0.    ){. 
14c90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
14ca0 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  Op & WO_IS );.  
14cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
14cc0 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  p & WO_ISNULL );
14cd0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
14ce0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 65 77  .    }..    pNew
14cf0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65  ->wsFlags = save
14d00 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  d_wsFlags;.    p
14d10 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14d20 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20   = saved_nEq;.  
14d30 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
14d40 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74  nBtm = saved_nBt
14d50 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  m;.    pNew->u.b
14d60 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65  tree.nTop = save
14d70 64 5f 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77  d_nTop;.    pNew
14d80 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64  ->nLTerm = saved
14d90 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28  _nLTerm;.    if(
14da0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
14db0 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
14dc0 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
14dd0 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
14de0 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70    pNew->aLTerm[p
14df0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d  New->nLTerm++] =
14e00 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77   pTerm;.    pNew
14e10 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76 65  ->prereq = (save
14e20 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d  d_prereq | pTerm
14e30 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20 26  ->prereqRight) &
14e40 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66   ~pNew->maskSelf
14e50 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ;..    assert( n
14e60 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20  InMul==0.       
14e70 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61   || (pNew->wsFla
14e80 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
14e90 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20  N_NULL)!=0 .    
14ea0 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73      || (pNew->ws
14eb0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
14ec0 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20  LUMN_IN)!=0 .   
14ed0 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
14ee0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53  sFlags & WHERE_S
14ef0 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20  KIPSCAN)!=0 .   
14f00 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70   );..    if( eOp
14f10 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
14f20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
14f30 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
14f40 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
14f50 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
14f60 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20  N_IN;.      if( 
14f70 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
14f80 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
14f90 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
14fa0 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54  /* "x IN (SELECT
14fb0 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a   ...)":  TUNING:
14fc0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74 75   the SELECT retu
14fd0 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20  rns 25 rows */. 
14fe0 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
14ff0 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
15000 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
15010 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
15020 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72 2d  f( ALWAYS(pExpr-
15030 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45 78 70  >x.pList && pExp
15040 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
15050 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
15060 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76   "x IN (value, v
15070 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20  alue, ...)" */. 
15080 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73 71 6c         nIn = sql
15090 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78 70 72  ite3LogEst(pExpr
150a0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
150b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
150c0 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29   assert( nIn>0 )
150d0 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73  ;  /* RHS always
150e0 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74   has 2 or more t
150f0 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72  erms...  The par
15100 73 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ser.            
15110 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
15120 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f 29  hanges "x IN (?)
15130 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a 2f  " into "x=?". */
15140 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ..    }else if( 
15150 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  eOp & (WO_EQ|WO_
15160 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  IS) ){.      int
15170 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e   iCol = pProbe->
15180 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e  aiColumn[saved_n
15190 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  Eq];.      pNew-
151a0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
151b0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
151c0 20 20 20 61 73 73 65 72 74 28 20 73 61 76 65 64     assert( saved
151d0 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74  _nEq==pNew->u.bt
151e0 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20  ree.nEq );.     
151f0 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f   if( iCol==XN_RO
15200 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  WID .       || (
15210 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c  iCol>0 && nInMul
15220 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71  ==0 && saved_nEq
15230 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  ==pProbe->nKeyCo
15240 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  l-1).      ){.  
15250 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
15260 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69  0 && pProbe->uni
15270 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  qNotNull==0 ){. 
15280 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77           pNew->w
15290 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
152a0 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20  UNQ_WANTED;.    
152b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
152c0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
152d0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52  gs |= WHERE_ONER
152e0 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OW;.        }.  
152f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
15300 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
15310 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ULL ){.      pNe
15320 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
15330 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b  ERE_COLUMN_NULL;
15340 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
15350 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47  Op & (WO_GT|WO_G
15360 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  E) ){.      test
15370 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47  case( eOp & WO_G
15380 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
15390 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45  ase( eOp & WO_GE
153a0 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   );.      pNew->
153b0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
153c0 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
153d0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20  ERE_BTM_LIMIT;. 
153e0 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
153f0 65 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52  ee.nBtm = whereR
15400 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20  angeVectorLen(. 
15410 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
15420 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
15430 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45  pProbe, saved_nE
15440 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29  q, pTerm.      )
15450 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70  ;.      pBtm = p
15460 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70  Term;.      pTop
15470 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
15480 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
15490 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b   TERM_LIKEOPT ){
154a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67  .        /* Rang
154b0 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61  e contraints tha
154c0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20  t come from the 
154d0 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
154e0 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  n are.        **
154f0 20 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20   always used in 
15500 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20  pairs. */.      
15510 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b    pTop = &pTerm[
15520 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1];.        asse
15530 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d  rt( (pTop-(pTerm
15540 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d  ->pWC->a))<pTerm
15550 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a  ->pWC->nTerm );.
15560 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15570 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20  pTop->wtFlags & 
15580 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a  TERM_LIKEOPT );.
15590 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
155a0 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pTop->eOperator=
155b0 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =WO_LT );.      
155c0 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
155d0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
155e0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
155f0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
15600 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
15610 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
15620 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a  Term++] = pTop;.
15630 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
15640 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  Flags |= WHERE_T
15650 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
15660 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
15670 6e 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  nTop = 1;.      
15680 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
15690 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26     assert( eOp &
156a0 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29   (WO_LT|WO_LE) )
156b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
156c0 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b  ( eOp & WO_LT );
156d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
156e0 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a   eOp & WO_LE );.
156f0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
15700 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
15710 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
15720 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  TOP_LIMIT;.     
15730 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
15740 54 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65  Top = whereRange
15750 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20  VectorLen(.     
15760 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72       pParse, pSr
15770 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f  c->iCursor, pPro
15780 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70  be, saved_nEq, p
15790 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20  Term.      );.  
157a0 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d      pTop = pTerm
157b0 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28  ;.      pBtm = (
157c0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
157d0 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29  WHERE_BTM_LIMIT)
157e0 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
157f0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
15800 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c  >aLTerm[pNew->nL
15810 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20  Term-2] : 0;.   
15820 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
15830 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e  is point pNew->n
15840 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
15850 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
15860 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20   expected to.   
15870 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62   ** be visited b
15880 79 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e  y the index scan
15890 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72   before consider
158a0 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20  ing term pTerm, 
158b0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61  or the.    ** va
158c0 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20  lues of nIn and 
158d0 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72  nInMul. In other
158e0 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67   words, assuming
158f0 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a   that all .    *
15900 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65  * "x IN(...)" te
15910 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64  rms are replaced
15920 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54   with "x = ?". T
15930 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  his block update
15940 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  s.    ** the val
15950 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74  ue of pNew->nOut
15960 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
15970 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e  pTerm (but not n
15980 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a  In/nInMul).  */.
15990 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
159a0 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f  ->nOut==saved_nO
159b0 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ut );.    if( pN
159c0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
159d0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
159e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a   ){.      /* Adj
159f0 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73  ust nOut using s
15a00 74 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e  tat3/stat4 data.
15a10 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73   Or, if there is
15a20 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a   no stat3/stat4.
15a30 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75        ** data, u
15a40 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20  sing some other 
15a50 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20  estimate.  */.  
15a60 20 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63      whereRangeSc
15a70 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
15a80 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54  uilder, pBtm, pT
15a90 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d  op, pNew);.    }
15aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
15ab0 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e  nEq = ++pNew->u.
15ac0 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20  btree.nEq;.     
15ad0 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28   assert( eOp & (
15ae0 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c  WO_ISNULL|WO_EQ|
15af0 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a  WO_IN|WO_IS) );.
15b00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15b10 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64  New->nOut==saved
15b20 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69  _nOut );.      i
15b30 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
15b40 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65  rob<=0 && pProbe
15b50 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64  ->aiColumn[saved
15b60 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20  _nEq]>=0 ){.    
15b70 20 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70      assert( (eOp
15b80 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e   & WO_IN) || nIn
15b90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ==0 );.        t
15ba0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
15bb0 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  O_IN );.        
15bc0 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54  pNew->nOut += pT
15bd0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
15be0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
15bf0 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20  ut -= nIn;.     
15c00 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
15c10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
15c20 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
15c30 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74      tRowcnt nOut
15c40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
15c50 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20  ( nInMul==0 .   
15c60 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
15c70 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20  >nSample .      
15c80 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
15c90 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d  ree.nEq<=pProbe-
15ca0 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20  >nSampleCol.    
15cb0 20 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20       && ((eOp & 
15cc0 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78  WO_IN)==0 || !Ex
15cd0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54  prHasProperty(pT
15ce0 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  erm->pExpr, EP_x
15cf0 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20  IsSelect)).     
15d00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
15d10 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
15d20 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
15d30 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
15d40 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c   (WO_EQ|WO_ISNUL
15d50 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a  L|WO_IS))!=0 ){.
15d60 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
15d70 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45  case( eOp & WO_E
15d80 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Q );.           
15d90 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
15da0 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20   WO_IS );.      
15db0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15dc0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
15dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
15de0 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63  c = whereEqualSc
15df0 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42  anEst(pParse, pB
15e00 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70  uilder, pExpr->p
15e10 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20  Right, &nOut);. 
15e20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
15e30 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
15e40 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28   whereInScanEst(
15e50 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72  pParse, pBuilder
15e60 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
15e70 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
15e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15e90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
15ea0 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
15eb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
15ec0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15ed0 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20  TE_OK ) break;  
15ee0 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
15ef0 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d  out of the pTerm
15f00 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20   loop */.       
15f10 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20     if( nOut ){. 
15f20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
15f30 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c  >nOut = sqlite3L
15f40 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20  ogEst(nOut);.   
15f50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
15f60 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f  w->nOut>saved_nO
15f70 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  ut ) pNew->nOut 
15f80 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
15f90 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
15fa0 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
15fb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15fc0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
15fd0 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a  Out==0 ).#endif.
15fe0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
15ff0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b      pNew->nOut +
16000 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77  = (pProbe->aiRow
16010 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50  LogEst[nEq] - pP
16020 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
16030 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20  t[nEq-1]);.     
16040 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57       if( eOp & W
16050 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
16060 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
16070 47 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  G: If there is n
16080 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  o likelihood() v
16090 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61  alue, assume tha
160a0 74 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20  t a .           
160b0 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c   ** "col IS NULL
160c0 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74  " expression mat
160d0 63 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61  ches twice as ma
160e0 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20  ny rows .       
160f0 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d       ** as (col=
16100 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ?). */.         
16110 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
16120 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   10;.          }
16130 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16140 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
16150 20 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f   Set rCostIdx to
16160 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   the cost of vis
16170 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72  iting selected r
16180 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64  ows in index. Ad
16190 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70  d.    ** it to p
161a0 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68  New->rRun, which
161b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65   is currently se
161c0 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66  t to the cost of
161d0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
161e0 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65  * seek only. The
161f0 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  n, if this is a 
16200 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
16210 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74  ex, add the cost
16220 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74   of.    ** visit
16230 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20  ing the rows in 
16240 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20  the main table. 
16250 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78   */.    rCostIdx
16260 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20   = pNew->nOut + 
16270 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
16280 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e  szIdxRow)/pSrc->
16290 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a  pTab->szTabRow;.
162a0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
162b0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
162c0 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73  d(rLogSize, rCos
162d0 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28  tIdx);.    if( (
162e0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
162f0 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c  (WHERE_IDX_ONLY|
16300 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29  WHERE_IPK))==0 )
16310 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52  {.      pNew->rR
16320 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  un = sqlite3LogE
16330 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e  stAdd(pNew->rRun
16340 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  , pNew->nOut + 1
16350 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70  6);.    }.    Ap
16360 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
16370 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50  r(pNew->rRun, pP
16380 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f  robe->pTable->co
16390 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f  stMult);..    nO
163a0 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70  utUnadjusted = p
163b0 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70  New->nOut;.    p
163c0 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e  New->rRun += nIn
163d0 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70  Mul + nIn;.    p
163e0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e  New->nOut += nIn
163f0 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77  Mul + nIn;.    w
16400 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
16410 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  just(pBuilder->p
16420 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
16430 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
16440 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
16450 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20  der, pNew);..   
16460 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61   if( pNew->wsFla
16470 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d  gs & WHERE_COLUM
16480 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  N_RANGE ){.     
16490 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61   pNew->nOut = sa
164a0 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65  ved_nOut;.    }e
164b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
164c0 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64  >nOut = nOutUnad
164d0 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  justed;.    }.. 
164e0 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73     if( (pNew->ws
164f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
16500 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20  P_LIMIT)==0.    
16510 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   && pNew->u.btre
16520 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  e.nEq<pProbe->nC
16530 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20  olumn.    ){.   
16540 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42     whereLoopAddB
16550 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64  treeIndex(pBuild
16560 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65  er, pSrc, pProbe
16570 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20  , nInMul+nIn);. 
16580 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e     }.    pNew->n
16590 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
165a0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
165b0 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f  ENABLE_STAT3_OR_
165c0 53 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64  STAT4.    pBuild
165d0 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
165e0 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69  nRecValid;.#endi
165f0 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72  f.  }.  pNew->pr
16600 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65  ereq = saved_pre
16610 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  req;.  pNew->u.b
16620 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
16630 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  _nEq;.  pNew->u.
16640 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76  btree.nBtm = sav
16650 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d  ed_nBtm;.  pNew-
16660 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
16670 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e  saved_nTop;.  pN
16680 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65  ew->nSkip = save
16690 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d  d_nSkip;.  pNew-
166a0 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
166b0 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77  _wsFlags;.  pNew
166c0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
166d0 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54  Out;.  pNew->nLT
166e0 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65  erm = saved_nLTe
166f0 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64  rm;..  /* Consid
16700 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d  er using a skip-
16710 73 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72  scan if there ar
16720 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
16730 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
16740 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
16750 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74   the left-most t
16760 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65  erms of the inde
16770 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76  x, and if the av
16780 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  erage.  ** numbe
16790 72 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20  r of repeats in 
167a0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
167b0 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20  rms is at least 
167c0 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  18. .  **.  ** T
167d0 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20  he magic number 
167e0 31 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f  18 is selected o
167f0 6e 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74  n the basis that
16800 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77   scanning 17 row
16810 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74  s.  ** is almost
16820 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20   always quicker 
16830 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65  than an index se
16840 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20  ek (even though 
16850 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  if the index.  *
16860 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  * contains fewer
16870 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20   than 2^17 rows 
16880 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77  we assume otherw
16890 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72  ise in other par
168a0 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ts of.  ** the c
168b0 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20  ode). And, even 
168c0 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74  if it is not, it
168d0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74   should not be t
168e0 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20  oo much slower. 
168f0 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68  .  ** On the oth
16900 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74  er hand, the ext
16910 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65  ra seeks could e
16920 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e  nd up being sign
16930 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d  ificantly.  ** m
16940 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20  ore expensive.  
16950 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d  */.  assert( 42=
16960 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
16970 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65  8) );.  if( save
16980 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b  d_nEq==saved_nSk
16990 69 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e  ip.   && saved_n
169a0 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65  Eq+1<pProbe->nKe
169b0 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62  yCol.   && pProb
169c0 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30  e->noSkipScan==0
169d0 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61  .   && pProbe->a
169e0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
169f0 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20  _nEq+1]>=42  /* 
16a00 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20  TUNING: Minimum 
16a10 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f  for skip-scan */
16a20 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65  .   && (rc = whe
16a30 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c  reLoopResize(db,
16a40 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54   pNew, pNew->nLT
16a50 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f  erm+1))==SQLITE_
16a60 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45  OK.  ){.    LogE
16a70 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e  st nIter;.    pN
16a80 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b  ew->u.btree.nEq+
16a90 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b  +;.    pNew->nSk
16aa0 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ip++;.    pNew->
16ab0 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
16ac0 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20  erm++] = 0;.    
16ad0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
16ae0 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b   WHERE_SKIPSCAN;
16af0 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72  .    nIter = pPr
16b00 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
16b10 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50  [saved_nEq] - pP
16b20 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
16b30 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a  t[saved_nEq+1];.
16b40 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d      pNew->nOut -
16b50 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20  = nIter;.    /* 
16b60 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65  TUNING:  Because
16b70 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69   uncertainties i
16b80 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20  n the estimates 
16b90 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75  for skip-scan qu
16ba0 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64  eries,.    ** ad
16bb0 64 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20  d a 1.375 fudge 
16bc0 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73  factor to make s
16bd0 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c  kip-scan slightl
16be0 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a  y less likely. *
16bf0 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35  /.    nIter += 5
16c00 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41  ;.    whereLoopA
16c10 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75  ddBtreeIndex(pBu
16c20 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72  ilder, pSrc, pPr
16c30 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e  obe, nIter + nIn
16c40 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Mul);.    pNew->
16c50 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
16c60 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  t;.    pNew->u.b
16c70 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64  tree.nEq = saved
16c80 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  _nEq;.    pNew->
16c90 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53  nSkip = saved_nS
16ca0 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  kip;.    pNew->w
16cb0 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77  sFlags = saved_w
16cc0 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 72  sFlags;.  }..  r
16cd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16ce0 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65 20 69  ** Return True i
16cf0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
16d00 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67   that pIndex mig
16d10 68 74 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a  ht be useful in.
16d20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20  ** implementing 
16d30 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
16d40 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e  use in pBuilder.
16d50 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61  .**.** Return Fa
16d60 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65 72 20  lse if pBuilder 
16d70 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
16d80 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
16d90 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65  use or.** if the
16da0 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72  re is no way for
16db0 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73   pIndex to be us
16dc0 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e  eful in implemen
16dd0 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44  ting that.** ORD
16de0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f  ER BY clause..*/
16df0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65  .static int inde
16e00 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
16e10 64 65 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f  derBy(.  WhereLo
16e20 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
16e30 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49  der,.  Index *pI
16e40 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72  ndex,.  int iCur
16e50 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73  sor.){.  ExprLis
16e60 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69  t *pOB;.  ExprLi
16e70 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20  st *aColExpr;.  
16e80 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69  int ii, jj;..  i
16e90 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  f( pIndex->bUnor
16ea0 64 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30  dered ) return 0
16eb0 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70  ;.  if( (pOB = p
16ec0 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d  Builder->pWInfo-
16ed0 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20  >pOrderBy)==0 ) 
16ee0 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
16ef0 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45  ii=0; ii<pOB->nE
16f00 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
16f10 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71  Expr *pExpr = sq
16f20 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
16f30 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e  late(pOB->a[ii].
16f40 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
16f50 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
16f60 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69  LUMN && pExpr->i
16f70 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29  Table==iCursor )
16f80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
16f90 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72  r->iColumn<0 ) r
16fa0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66  eturn 1;.      f
16fb0 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
16fc0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
16fd0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16fe0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
16ff0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
17000 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b  [jj] ) return 1;
17010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
17020 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72  se if( (aColExpr
17030 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45   = pIndex->aColE
17040 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  xpr)!=0 ){.     
17050 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
17060 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
17070 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
17080 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
17090 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20  mn[jj]!=XN_EXPR 
170a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
170b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
170c0 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78 70 72  xprCompare(pExpr
170d0 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d  ,aColExpr->a[jj]
170e0 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d  .pExpr,iCursor)=
170f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17100 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
17110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17120 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
17130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17140 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
17150 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
17160 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
17170 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
17180 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
17190 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
171a0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
171b0 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
171c0 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
171d0 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
171e0 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
171f0 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
17200 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
17210 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
17220 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
17230 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
17240 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
17250 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
17260 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
17270 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
17280 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
17290 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
172a0 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
172b0 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
172c0 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
172d0 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
172e0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
172f0 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
17300 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
17310 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
17320 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
17330 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
17340 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
17350 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
17360 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
17370 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
17380 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
17390 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
173a0 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
173b0 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
173c0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
173d0 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  Term;.  while( p
173e0 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  Where->op==TK_AN
173f0 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21 77 68  D ){.    if( !wh
17400 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c  ereUsablePartial
17410 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43 2c 70  Index(iTab,pWC,p
17420 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20 29 20  Where->pLeft) ) 
17430 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 57  return 0;.    pW
17440 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70  here = pWhere->p
17450 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66 6f 72  Right;.  }.  for
17460 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  (i=0, pTerm=pWC-
17470 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
17480 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
17490 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
174a0 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
174b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
174c0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
174d0 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c 20 69  pExpr, pWhere, i
174e0 54 61 62 29 20 0a 20 20 20 20 20 26 26 20 28 21  Tab) .     && (!
174f0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17500 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
17510 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52  in) || pExpr->iR
17520 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69  ightJoinTable==i
17530 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Tab).    ){.    
17540 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
17550 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
17560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
17570 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  ll WhereLoop obj
17580 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ects for a singl
17590 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  e table of the j
175a0 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20 74 61  oin where the ta
175b0 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69  ble.** is identi
175c0 66 69 65 64 20 62 79 20 70 42 75 69 6c 64 65 72  fied by pBuilder
175d0 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
175e0 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
175f0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a  ranteed to be.**
17600 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c   a b-tree table,
17610 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74   not a virtual t
17620 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
17630 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70  costs (WhereLoop
17640 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d  .rRun) of the b-
17650 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64  tree loops added
17660 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
17670 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61  n.** are calcula
17680 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
17690 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c  **.** For a full
176a0 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20   scan, assuming 
176b0 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e  the table (or in
176c0 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52  dex) contains nR
176d0 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  ow rows:.**.**  
176e0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
176f0 20 33 2e 30 20 20 20 20 20 20 20 20 20 20 20 20   3.0            
17700 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d          // full-
17710 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20  table scan.**   
17720 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20    cost = nRow * 
17730 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
17740 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f         // scan o
17750 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  f covering index
17760 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
17770 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20  Row * (K+3.0)   
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
17790 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65  scan of non-cove
177a0 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a  ring index.**.**
177b0 20 77 68 65 72 65 20 4b 20 69 73 20 61 20 76 61   where K is a va
177c0 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20  lue between 1.1 
177d0 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61 73 65  and 3.0 set base
177e0 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  d on the relativ
177f0 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  e .** estimated 
17800 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
17810 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61  the index and ta
17820 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ble records..**.
17830 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  ** For an index 
17840 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73  scan, where nVis
17850 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  it is the number
17860 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76   of index rows v
17870 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  isited.** by the
17880 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b   scan, and nSeek
17890 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
178a0 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  f seek operation
178b0 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a  s required on .*
178c0 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  * the index b-tr
178d0 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ee:.**.**     co
178e0 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f  st = nSeek * (lo
178f0 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56  g(nRow) + K * nV
17900 69 73 69 74 29 20 20 20 20 20 20 20 20 20 20 2f  isit)          /
17910 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  / covering index
17920 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e  .**     cost = n
17930 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77  Seek * (log(nRow
17940 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56  ) + (K+3.0) * nV
17950 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d  isit)    // non-
17960 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
17970 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e  *.** Normally, n
17980 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b  Seek is 1. nSeek
17990 20 76 61 6c 75 65 73 20 67 72 65 61 74 65 72 20   values greater 
179a0 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75  than 1 come abou
179b0 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45  t if the .** WHE
179c0 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64  RE clause includ
179d0 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22  es "x IN (....)"
179e0 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70   terms used in p
179f0 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f  lace of "x=?". O
17a00 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69  r when .** impli
17a10 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43  cit "x IN (SELEC
17a20 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74  T x FROM tbl)" t
17a30 65 72 6d 73 20 61 72 65 20 61 64 64 65 64 20 66  erms are added f
17a40 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a  or skip-scans..*
17a50 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74  *.** The estimat
17a60 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c  ed values (nRow,
17a70 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20   nVisit, nSeek) 
17a80 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20  often contain a 
17a90 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  large amount.** 
17aa0 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20  of uncertainty. 
17ab0 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e   For this reason
17ac0 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73  , scoring is des
17ad0 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c  igned to pick pl
17ae0 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20  ans that.** "do 
17af0 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20  the least harm" 
17b00 69 66 20 74 68 65 20 65 73 74 69 6d 61 74 65 73  if the estimates
17b10 20 61 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e   are inaccurate.
17b20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61    For example, a
17b30 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61  .** log(nRow) fa
17b40 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20  ctor is omitted 
17b50 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72  from a non-cover
17b60 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69  ing index scan i
17b70 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69  n order to.** bi
17b80 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69  as the scoring i
17b90 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67  n favor of using
17ba0 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65   an index, since
17bb0 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a   the worst-case.
17bc0 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  ** performance o
17bd0 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
17be0 20 69 73 20 66 61 72 20 62 65 74 74 65 72 20 74   is far better t
17bf0 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61  han the worst-ca
17c00 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  se performance.*
17c10 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c  * of a full tabl
17c20 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  e scan..*/.stati
17c30 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
17c40 64 64 42 74 72 65 65 28 0a 20 20 57 68 65 72 65  ddBtree(.  Where
17c50 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
17c60 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20  ilder, /* WHERE 
17c70 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69  clause informati
17c80 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  on */.  Bitmask 
17c90 6d 50 72 65 72 65 71 20 20 20 20 20 20 20 20 20  mPrereq         
17ca0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65      /* Extra pre
17cb0 72 65 71 75 65 73 69 74 65 73 20 66 6f 72 20 75  requesites for u
17cc0 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  sing this table 
17cd0 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  */.){.  WhereInf
17ce0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20  o *pWInfo;      
17cf0 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
17d00 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
17d10 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65  .  Index *pProbe
17d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17d30 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72  * An index we ar
17d40 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a  e evaluating */.
17d50 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20    Index sPk;    
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d70 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62   A fake index ob
17d80 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70 72 69  ject for the pri
17d90 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f  mary key */.  Lo
17da0 67 45 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b  gEst aiRowEstPk[
17db0 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2];       /* The
17dc0 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76   aiRowLogEst[] v
17dd0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b  alue for the sPk
17de0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20   index */.  i16 
17df0 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b  aiColumnPk = -1;
17e00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
17e10 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66  Column[] value f
17e20 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78  or the sPk index
17e30 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
17e40 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
17e50 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
17e60 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
17e70 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
17e80 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src;  /* The FRO
17e90 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65 20 74  M clause btree t
17ea0 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  erm to add */.  
17eb0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b  WhereLoop *pNew;
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17ed0 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f  emplate WhereLoo
17ee0 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  p object */.  in
17ef0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17f00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ;         /* Ret
17f10 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
17f20 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20  t iSortIdx = 1; 
17f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17f40 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ex number */.  i
17f50 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20 20 20  nt b;           
17f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
17f70 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f  boolean value */
17f80 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b  .  LogEst rSize;
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17fa0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
17fb0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
17fc0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
17fd0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
17fe0 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
17ff0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
18000 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
18010 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
18020 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
18030 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20 57 48  /* The parsed WH
18040 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
18050 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
18060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18070 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
18080 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20  ed */.  .  pNew 
18090 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
180a0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75  ;.  pWInfo = pBu
180b0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20  ilder->pWInfo;. 
180c0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e   pTabList = pWIn
180d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
180e0 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d  pSrc = pTabList-
180f0 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b  >a + pNew->iTab;
18100 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e  .  pTab = pSrc->
18110 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42  pTab;.  pWC = pB
18120 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61  uilder->pWC;.  a
18130 73 73 65 72 74 28 20 21 49 73 56 69 72 74 75 61  ssert( !IsVirtua
18140 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b  l(pSrc->pTab) );
18150 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
18160 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a  BIndex ){.    /*
18170 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   An INDEXED BY c
18180 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73 20  lause specifies 
18190 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
181a0 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20  ex to use */.   
181b0 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
181c0 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73  pIBIndex;.  }els
181d0 65 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28  e if( !HasRowid(
181e0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72  pTab) ){.    pPr
181f0 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  obe = pTab->pInd
18200 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ex;.  }else{.   
18210 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
18220 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
18230 65 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b  e.  Create a fak
18240 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  e Index object i
18250 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76  n local.    ** v
18260 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72  ariable sPk to r
18270 65 70 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77  epresent the row
18280 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  id primary key i
18290 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73  ndex.  Make this
182a0 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64  .    ** fake ind
182b0 65 78 20 74 68 65 20 66 69 72 73 74 20 69 6e 20  ex the first in 
182c0 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78  a chain of Index
182d0 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c   objects with al
182e0 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20  l of the real.  
182f0 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20    ** indices to 
18300 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e  follow */.    In
18310 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20  dex *pFirst;    
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18330 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69   First of real i
18340 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61  ndices on the ta
18350 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ble */.    memse
18360 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f  t(&sPk, 0, sizeo
18370 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73  f(Index));.    s
18380 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a  Pk.nKeyCol = 1;.
18390 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20      sPk.nColumn 
183a0 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43  = 1;.    sPk.aiC
183b0 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d  olumn = &aiColum
183c0 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52  nPk;.    sPk.aiR
183d0 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77  owLogEst = aiRow
183e0 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f  EstPk;.    sPk.o
183f0 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c  nError = OE_Repl
18400 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61  ace;.    sPk.pTa
18410 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  ble = pTab;.    
18420 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70  sPk.szIdxRow = p
18430 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
18440 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d     aiRowEstPk[0]
18450 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67   = pTab->nRowLog
18460 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73  Est;.    aiRowEs
18470 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  tPk[1] = 0;.    
18480 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70  pFirst = pSrc->p
18490 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
184a0 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f   if( pSrc->fg.no
184b0 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20  tIndexed==0 ){. 
184c0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c       /* The real
184d0 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20   indices of the 
184e0 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63  table are only c
184f0 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65  onsidered if the
18500 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e  .      ** NOT IN
18510 44 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20  DEXED qualifier 
18520 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
18530 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
18540 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  */.      sPk.pNe
18550 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
18560 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20   }.    pProbe = 
18570 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a  &sPk;.  }.  rSiz
18580 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  e = pTab->nRowLo
18590 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65  gEst;.  rLogSize
185a0 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29   = estLog(rSize)
185b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
185c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
185d0 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f  _INDEX.  /* Auto
185e0 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f  matic indexes */
185f0 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64 65 72  .  if( !pBuilder
18600 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a  ->pOrSet      /*
18610 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20   Not part of an 
18620 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OR optimization 
18630 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f  */.   && (pWInfo
18640 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
18650 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
18660 45 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49  E)==0.   && (pWI
18670 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  nfo->pParse->db-
18680 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
18690 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20  AutoIndex)!=0.  
186a0 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64   && pSrc->pIBInd
186b0 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61  ex==0      /* Ha
186c0 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20  s no INDEXED BY 
186d0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20  clause */.   && 
186e0 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64  !pSrc->fg.notInd
186f0 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f  exed   /* Has no
18700 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
18710 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73  use */.   && Has
18720 52 6f 77 69 64 28 70 54 61 62 29 20 20 20 20 20  Rowid(pTab)     
18730 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f      /* Not WITHO
18740 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20  UT ROWID table. 
18750 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f  (FIXME: Why not?
18760 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  ) */.   && !pSrc
18770 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65  ->fg.isCorrelate
18780 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65  d /* Not a corre
18790 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 20 2a  lated subquery *
187a0 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66  /.   && !pSrc->f
187b0 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 20 2f  g.isRecursive  /
187c0 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76  * Not a recursiv
187d0 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65  e common table e
187e0 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
187f0 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ){.    /* Genera
18800 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68  te auto-index Wh
18810 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  ereLoops */.    
18820 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
18830 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
18840 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61  *pWCEnd = pWC->a
18850 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20   + pWC->nTerm;. 
18860 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43     for(pTerm=pWC
18870 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ->a; rc==SQLITE_
18880 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45  OK && pTerm<pWCE
18890 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
188a0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
188b0 72 65 72 65 71 52 69 67 68 74 20 26 20 70 4e 65  rereqRight & pNe
188c0 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f  w->maskSelf ) co
188d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
188e0 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
188f0 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
18900 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70   0) ){.        p
18910 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
18920 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
18930 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20  ew->nSkip = 0;. 
18940 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62         pNew->u.b
18950 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b  tree.pIndex = 0;
18960 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
18970 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
18980 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
18990 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
189a0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f      /* TUNING: O
189b0 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72  ne-time cost for
189c0 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61   computing the a
189d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
189e0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74  s.        ** est
189f0 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e  imated to be X*N
18a00 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e  *log2(N) where N
18a10 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18a20 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20  f rows in.      
18a30 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
18a40 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64  eing indexed and
18a50 20 77 68 65 72 65 20 58 20 69 73 20 37 20 28 4c   where X is 7 (L
18a60 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f  ogEst=28) for no
18a70 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rmal.        ** 
18a80 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20  tables or 1.375 
18a90 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76  (LogEst=4) for v
18aa0 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
18ab0 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a  ies.  The value.
18ac0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20          ** of X 
18ad0 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76  is smaller for v
18ae0 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65 72  iews and subquer
18af0 69 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ies so that the 
18b00 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20  query planner.  
18b10 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
18b20 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69 76 65   more aggressive
18b30 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e   about generatin
18b40 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  g automatic inde
18b50 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20  xes for.        
18b60 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73  ** those objects
18b70 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  , since there is
18b80 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   no opportunity 
18b90 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20  to add schema.  
18ba0 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73        ** indexes
18bb0 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73 20 61   on subqueries a
18bc0 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20  nd views. */.   
18bd0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
18be0 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72  p = rLogSize + r
18bf0 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20  Size + 4;.      
18c00 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
18c10 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d  ect==0 && (pTab-
18c20 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
18c30 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a  phemeral)==0 ){.
18c40 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
18c50 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20  rSetup += 24;.  
18c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18c70 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
18c80 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70  ier(pNew->rSetup
18c90 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74  , pTab->costMult
18ca0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
18cb0 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30 20 29 20  New->rSetup<0 ) 
18cc0 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30  pNew->rSetup = 0
18cd0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e  ;.        /* TUN
18ce0 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20  ING: Each index 
18cf0 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30  lookup yields 20
18d00 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
18d10 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20  le.  This.      
18d20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61    ** is more tha
18d30 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75 65 73  n the usual gues
18d40 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69  s of 10 rows, si
18d50 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77  nce we have no w
18d60 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ay.        ** of
18d70 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c   knowing how sel
18d80 65 63 74 69 76 65 20 74 68 65 20 69 6e 64 65 78  ective the index
18d90 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
18da0 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20   be.  It would. 
18db0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65         ** not be
18dc0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f   unreasonable to
18dd0 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65   make this value
18de0 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f   much larger. */
18df0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
18e00 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72  Out = 43;  asser
18e10 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 43==sqlite3Lo
18e20 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20  gEst(20) );.    
18e30 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
18e40 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
18e50 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d  d(rLogSize,pNew-
18e60 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  >nOut);.        
18e70 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
18e80 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58  WHERE_AUTO_INDEX
18e90 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
18ea0 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71  prereq = mPrereq
18eb0 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71   | pTerm->prereq
18ec0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72  Right;.        r
18ed0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
18ee0 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
18ef0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
18f00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
18f10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18f20 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a  OMATIC_INDEX */.
18f30 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
18f40 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f  all indices.  */
18f50 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c  .  for(; rc==SQL
18f60 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65  ITE_OK && pProbe
18f70 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d  ; pProbe=pProbe-
18f80 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78  >pNext, iSortIdx
18f90 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72  ++){.    if( pPr
18fa0 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
18fb0 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77  re!=0.     && !w
18fc0 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69 61  hereUsablePartia
18fd0 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75  lIndex(pSrc->iCu
18fe0 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62  rsor, pWC, pProb
18ff0 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
19000 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
19010 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21  ase( pNew->iTab!
19020 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29  =pSrc->iCursor )
19030 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74  ;  /* See ticket
19040 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f   [98d973b8f5] */
19050 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
19060 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64    /* Partial ind
19070 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ex inappropriate
19080 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 20   for this query 
19090 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69  */.    }.    rSi
190a0 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52  ze = pProbe->aiR
190b0 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20  owLogEst[0];.   
190c0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
190d0 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  Eq = 0;.    pNew
190e0 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d  ->u.btree.nBtm =
190f0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e   0;.    pNew->u.
19100 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a  btree.nTop = 0;.
19110 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20      pNew->nSkip 
19120 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 0;.    pNew->n
19130 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70  LTerm = 0;.    p
19140 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20  New->iSortIdx = 
19150 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65  0;.    pNew->rSe
19160 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  tup = 0;.    pNe
19170 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65  w->prereq = mPre
19180 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  req;.    pNew->n
19190 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20  Out = rSize;.   
191a0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70   pNew->u.btree.p
191b0 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a  Index = pProbe;.
191c0 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67      b = indexMig
191d0 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
191e0 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f  y(pBuilder, pPro
191f0 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  be, pSrc->iCurso
19200 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f  r);.    /* The O
19210 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 66  NEPASS_DESIRED f
19220 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72  lags never occur
19230 73 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  s together with 
19240 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20  ORDER BY */.    
19250 61 73 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d  assert( (pWInfo-
19260 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
19270 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
19280 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20  RED)==0 || b==0 
19290 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  );.    if( pProb
192a0 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20  e->tnum<=0 ){.  
192b0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70      /* Integer p
192c0 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
192d0 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
192e0 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
192f0 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  IPK;..      /* F
19300 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
19310 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53  /.      pNew->iS
19320 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f  ortIdx = b ? iSo
19330 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20  rtIdx : 0;.     
19340 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74   /* TUNING: Cost
19350 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73   of full table s
19360 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20  can is (N*3.0). 
19370 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72  */.      pNew->r
19380 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36  Run = rSize + 16
19390 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73  ;.      ApplyCos
193a0 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
193b0 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f  ->rRun, pTab->co
193c0 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77  stMult);.      w
193d0 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64  hereLoopOutputAd
193e0 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20  just(pWC, pNew, 
193f0 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63  rSize);.      rc
19400 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65   = whereLoopInse
19410 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65  rt(pBuilder, pNe
19420 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  w);.      pNew->
19430 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20  nOut = rSize;.  
19440 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
19450 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
19460 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a       Bitmask m;.
19470 20 20 20 20 20 20 69 66 28 20 70 50 72 6f 62 65        if( pProbe
19480 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a  ->isCovering ){.
19490 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
194a0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44  Flags = WHERE_ID
194b0 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49  X_ONLY | WHERE_I
194c0 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20  NDEXED;.        
194d0 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  m = 0;.      }el
194e0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20  se{.        m = 
194f0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
19500 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28  ~columnsInIndex(
19510 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20  pProbe);.       
19520 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
19530 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45   (m==0) ? (WHERE
19540 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f  _IDX_ONLY|WHERE_
19550 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45 52 45  INDEXED) : WHERE
19560 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
19570 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  }..      /* Full
19580 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20   scan via index 
19590 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20  */.      if( b. 
195a0 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77        || !HasRow
195b0 69 64 28 70 54 61 62 29 0a 20 20 20 20 20 20 20  id(pTab).       
195c0 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74  || pProbe->pPart
195d0 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20  IdxWhere!=0.    
195e0 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20     || ( m==0.   
195f0 20 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d        && pProbe-
19600 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20  >bUnordered==0. 
19610 20 20 20 20 20 20 20 20 26 26 20 28 70 50 72 6f          && (pPro
19620 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  be->szIdxRow<pTa
19630 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20  b->szTabRow).   
19640 20 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f        && (pWInfo
19650 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
19660 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
19670 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20  IRED)==0.       
19680 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62    && sqlite3Glob
19690 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
196a0 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74  .         && Opt
196b0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
196c0 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d  (pWInfo->pParse-
196d0 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65  >db, SQLITE_Cove
196e0 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20  rIdxScan).      
196f0 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20      ).      ){. 
19700 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f         pNew->iSo
19710 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72  rtIdx = b ? iSor
19720 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20  tIdx : 0;..     
19730 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
19740 66 20 76 69 73 69 74 69 6e 67 20 74 68 65 20 69  f visiting the i
19750 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b  ndex rows is N*K
19760 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20  , where K is.   
19770 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
19780 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70  1.1 and 3.0, dep
19790 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65  ending on the re
197a0 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
197b0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
197c0 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
197d0 6f 77 73 2e 20 49 66 20 74 68 69 73 20 69 73 20  ows. If this is 
197e0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
197f0 6e 64 65 78 20 73 63 61 6e 2c 0a 20 20 20 20 20  ndex scan,.     
19800 20 20 20 2a 2a 20 61 6c 73 6f 20 61 64 64 20 74     ** also add t
19810 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69 74  he cost of visit
19820 69 6e 67 20 74 61 62 6c 65 20 72 6f 77 73 20 28  ing table rows (
19830 4e 2a 33 2e 30 29 2e 20 20 2a 2f 0a 20 20 20 20  N*3.0).  */.    
19840 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
19850 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35   rSize + 1 + (15
19860 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
19870 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  w)/pTab->szTabRo
19880 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  w;.        if( m
19890 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
198a0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
198b0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
198c0 4e 65 77 2d 3e 72 52 75 6e 2c 20 72 53 69 7a 65  New->rRun, rSize
198d0 2b 31 36 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +16);.        }.
198e0 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73          ApplyCos
198f0 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77  tMultiplier(pNew
19900 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f  ->rRun, pTab->co
19910 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  stMult);.       
19920 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
19930 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
19940 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , rSize);.      
19950 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
19960 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
19970 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
19980 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69  pNew->nOut = rSi
19990 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
199a0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
199b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
199c0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
199d0 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
199e0 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
199f0 65 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53 51  e, 0);.#ifdef SQ
19a00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
19a10 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73  3_OR_STAT4.    s
19a20 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
19a30 46 72 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70  Free(pBuilder->p
19a40 52 65 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64  Rec);.    pBuild
19a50 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20  er->nRecValid = 
19a60 30 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  0;.    pBuilder-
19a70 3e 70 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69  >pRec = 0;.#endi
19a80 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
19a90 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45  re was an INDEXE
19aa0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
19ab0 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65 20  n only that one 
19ac0 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a 20  index is.    ** 
19ad0 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a 20  considered. */. 
19ae0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42     if( pSrc->pIB
19af0 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 20  Index ) break;. 
19b00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19b10 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
19b20 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
19b30 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLE../*.** Argum
19b40 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69 73 20  ent pIdxInfo is 
19b50 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
19b60 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74  d with all const
19b70 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61 79 0a  raints that may.
19b80 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20 74 68  ** be used by th
19b90 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
19ba0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 42  identified by pB
19bb0 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54  uilder->pNew->iT
19bc0 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ab. This.** func
19bd0 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75 62  tion marks a sub
19be0 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  set of those con
19bf0 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2c  straints usable,
19c00 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
19c10 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f  xBestIndex metho
19c20 64 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 72  d and adds the r
19c30 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f 20  eturned plan to 
19c40 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  pBuilder..**.** 
19c50 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  A constraint is 
19c60 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20 69 66  marked usable if
19c70 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67 75  :.**.**   * Argu
19c80 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e 64  ment mUsable ind
19c90 69 63 61 74 65 73 20 74 68 61 74 20 69 74 73 20  icates that its 
19ca0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72  prerequisites ar
19cb0 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e 64  e available, and
19cc0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69 73  .**.**   * It is
19cd0 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   not one of the 
19ce0 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63 69 66  operators specif
19cf0 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78 63 6c  ied in the mExcl
19d00 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65 64 0a  ude mask passed.
19d10 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20 66 6f  **     as the fo
19d20 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 28 77  urth argument (w
19d30 68 69 63 68 20 69 6e 20 70 72 61 63 74 69 63 65  hich in practice
19d40 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f 49 4e   is either WO_IN
19d50 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41 72   or 0)..**.** Ar
19d60 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71 20 69  gument mPrereq i
19d70 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62 6c  s a mask of tabl
19d80 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  es that must be 
19d90 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74  scanned before t
19da0 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  he.** virtual ta
19db0 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e  ble in question.
19dc0 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65 64   These are added
19dd0 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70 72   to the plans pr
19de0 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20 62  erequisites.** b
19df0 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64 65  efore it is adde
19e00 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a  d to pBuilder..*
19e10 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72 61  *.** Output para
19e20 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20 73  meter *pbIn is s
19e30 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  et to true if th
19e40 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f 20  e plan added to 
19e50 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65 73  pBuilder.** uses
19e60 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f 5f   one or more WO_
19e70 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61 6c  IN terms, or fal
19e80 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
19e90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
19ea0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
19eb0 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ne(.  WhereLoopB
19ec0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
19ed0 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65  ,.  Bitmask mPre
19ee0 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  req,            
19ef0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74      /* Mask of t
19f00 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
19f10 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42 69  be used. */.  Bi
19f20 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20 20  tmask mUsable,  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19f40 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20   Mask of usable 
19f50 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36 20  tables */.  u16 
19f60 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20 20 20  mExclude,       
19f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
19f80 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75 73 69  xclude terms usi
19f90 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61 74 6f  ng these operato
19fa0 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rs */.  sqlite3_
19fb0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
19fc0 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75 6c  Info,   /* Popul
19fd0 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f 72 20  ated object for 
19fe0 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20  xBestIndex */.  
19ff0 69 6e 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20  int *pbIn       
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20  /* OUT: True if 
1a020 70 6c 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28  plan uses an IN(
1a030 2e 2e 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20  ...) op */.){.  
1a040 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1a050 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1a060 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
1a070 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
1a080 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
1a090 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
1a0a0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
1a0b0 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d  _usage *pUsage =
1a0c0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
1a0d0 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69  traintUsage;.  i
1a0e0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65  nt i;.  int mxTe
1a0f0 72 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  rm;.  int rc = S
1a100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
1a110 65 4c 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42  eLoop *pNew = pB
1a120 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
1a130 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1a140 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1a150 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75  ->pParse;.  stru
1a160 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1a170 2a 70 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65  *pSrc = &pBuilde
1a180 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c  r->pWInfo->pTabL
1a190 69 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61  ist->a[pNew->iTa
1a1a0 62 5d 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74  b];.  int nConst
1a1b0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
1a1c0 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->nConstraint;..
1a1d0 20 20 61 73 73 65 72 74 28 20 28 6d 55 73 61 62    assert( (mUsab
1a1e0 6c 65 20 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d  le & mPrereq)==m
1a1f0 50 72 65 72 65 71 20 29 3b 0a 20 20 2a 70 62 49  Prereq );.  *pbI
1a200 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  n = 0;.  pNew->p
1a210 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b  rereq = mPrereq;
1a220 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75  ..  /* Set the u
1a230 73 61 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68  sable flag on th
1a240 65 20 73 75 62 73 65 74 20 6f 66 20 63 6f 6e 73  e subset of cons
1a250 74 72 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69  traints identifi
1a260 65 64 20 62 79 20 0a 20 20 2a 2a 20 61 72 67 75  ed by .  ** argu
1a270 6d 65 6e 74 73 20 6d 55 73 61 62 6c 65 20 61 6e  ments mUsable an
1a280 64 20 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20  d mExclude. */. 
1a290 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
1a2a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1a2b0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
1a2c0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
1a2d0 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d  traint;.  for(i=
1a2e0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1a2f0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
1a300 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72  +){.    WhereTer
1a310 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  m *pTerm = &pWC-
1a320 3e 61 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65  >a[pIdxCons->iTe
1a330 72 6d 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70  rmOffset];.    p
1a340 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
1a350 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 70 54  = 0;.    if( (pT
1a360 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1a370 20 26 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65   & mUsable)==pTe
1a380 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
1a390 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d  .     && (pTerm-
1a3a0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 45 78  >eOperator & mEx
1a3b0 63 6c 75 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b  clude)==0.    ){
1a3c0 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  .      pIdxCons-
1a3d0 3e 75 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  >usable = 1;.   
1a3e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69   }.  }..  /* Ini
1a3f0 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
1a400 75 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ut fields of the
1a410 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
1a420 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f  nfo structure */
1a430 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65  .  memset(pUsage
1a440 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61  , 0, sizeof(pUsa
1a450 67 65 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69  ge[0])*nConstrai
1a460 6e 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nt);.  assert( p
1a470 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  IdxInfo->needToF
1a480 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a  reeIdxStr==0 );.
1a490 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
1a4a0 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  tr = 0;.  pIdxIn
1a4b0 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
1a4c0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
1a4d0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
1a4e0 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
1a4f0 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c  imatedCost = SQL
1a500 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64  ITE_BIG_DBL / (d
1a510 6f 75 62 6c 65 29 32 3b 0a 20 20 70 49 64 78 49  ouble)2;.  pIdxI
1a520 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
1a530 77 73 20 3d 20 32 35 3b 0a 20 20 70 49 64 78 49  ws = 25;.  pIdxI
1a540 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20  nfo->idxFlags = 
1a550 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63  0;.  pIdxInfo->c
1a560 6f 6c 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65  olUsed = (sqlite
1a570 33 5f 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f  3_int64)pSrc->co
1a580 6c 55 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76  lUsed;..  /* Inv
1a590 6f 6b 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  oke the virtual 
1a5a0 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78  table xBestIndex
1a5b0 28 29 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72  () method */.  r
1a5c0 63 20 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65  c = vtabBestInde
1a5d0 78 28 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e  x(pParse, pSrc->
1a5e0 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  pTab, pIdxInfo);
1a5f0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1a600 72 6e 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d  rn rc;..  mxTerm
1a610 20 3d 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28   = -1;.  assert(
1a620 20 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e   pNew->nLSlot>=n
1a630 43 6f 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20  Constraint );.  
1a640 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1a650 74 72 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65  traint; i++) pNe
1a660 77 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30  w->aLTerm[i] = 0
1a670 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1a680 2e 6f 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  .omitMask = 0;. 
1a690 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74   pIdxCons = *(st
1a6a0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
1a6b0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
1a6c0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
1a6d0 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d  traint;.  for(i=
1a6e0 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74  0; i<nConstraint
1a6f0 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
1a700 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72  +){.    int iTer
1a710 6d 3b 0a 20 20 20 20 69 66 28 20 28 69 54 65 72  m;.    if( (iTer
1a720 6d 20 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72  m = pUsage[i].ar
1a730 67 76 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20  gvIndex - 1)>=0 
1a740 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
1a750 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20  rm *pTerm;.     
1a760 20 69 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e   int j = pIdxCon
1a770 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
1a780 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e        if( iTerm>
1a790 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20  =nConstraint.   
1a7a0 20 20 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20      || j<0.     
1a7b0 20 20 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65    || j>=pWC->nTe
1a7c0 72 6d 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65  rm.       || pNe
1a7d0 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d  w->aLTerm[iTerm]
1a7e0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  !=0.       || pI
1a7f0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d  dxCons->usable==
1a800 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
1a810 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1a820 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 73 71  RROR;.        sq
1a830 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1a840 61 72 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e  arse,"%s.xBestIn
1a850 64 65 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22  dex malfunction"
1a860 2c 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61  ,pSrc->pTab->zNa
1a870 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  me);.        ret
1a880 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1a890 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a8a0 69 54 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69  iTerm==nConstrai
1a8b0 6e 74 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  nt-1 );.      te
1a8c0 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a  stcase( j==0 );.
1a8d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a8e0 6a 3d 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20  j==pWC->nTerm-1 
1a8f0 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  );.      pTerm =
1a900 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
1a910 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
1a920 7c 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  |= pTerm->prereq
1a930 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
1a940 65 72 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d  ert( iTerm<pNew-
1a950 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20  >nLSlot );.     
1a960 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54   pNew->aLTerm[iT
1a970 65 72 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  erm] = pTerm;.  
1a980 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78      if( iTerm>mx
1a990 54 65 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20  Term ) mxTerm = 
1a9a0 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 74 65 73  iTerm;.      tes
1a9b0 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35  tcase( iTerm==15
1a9c0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1a9d0 73 65 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b  se( iTerm==16 );
1a9e0 0a 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d  .      if( iTerm
1a9f0 3c 31 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d  <16 && pUsage[i]
1aa00 2e 6f 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e  .omit ) pNew->u.
1aa10 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d  vtab.omitMask |=
1aa20 20 31 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20   1<<iTerm;.     
1aa30 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
1aa40 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21  erator & WO_IN)!
1aa50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1aa60 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
1aa70 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
1aa80 69 6e 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c  ined by an IN cl
1aa90 61 75 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20  ause may not.   
1aaa0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20       ** consume 
1aab0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1aac0 75 73 65 20 62 65 63 61 75 73 65 20 28 31 29 20  use because (1) 
1aad0 74 68 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20  the order of IN 
1aae0 74 65 72 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a  terms.        **
1aaf0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1ab00 69 6c 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74  ily related to t
1ab10 68 65 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70  he order of outp
1ab20 75 74 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20  ut terms and.   
1ab30 20 20 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74       ** (2) Mult
1ab40 69 70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f  iple outputs fro
1ab50 6d 20 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61  m a single IN va
1ab60 6c 75 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72  lue will not mer
1ab70 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
1ab80 67 65 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20  gether.  */.    
1ab90 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72      pIdxInfo->or
1aba0 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
1abb0 30 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 49  0;.        pIdxI
1abc0 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d  nfo->idxFlags &=
1abd0 20 7e 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53   ~SQLITE_INDEX_S
1abe0 43 41 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  CAN_UNIQUE;.    
1abf0 20 20 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61      *pbIn = 1; a
1ac00 73 73 65 72 74 28 20 28 6d 45 78 63 6c 75 64 65  ssert( (mExclude
1ac10 20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a   & WO_IN)==0 );.
1ac20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ac30 7d 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  }..  pNew->nLTer
1ac40 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20  m = mxTerm+1;.  
1ac50 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
1ac60 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c  Term<=pNew->nLSl
1ac70 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  ot );.  pNew->u.
1ac80 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49  vtab.idxNum = pI
1ac90 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a  dxInfo->idxNum;.
1aca0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1acb0 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
1acc0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1acd0 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f  xStr;.  pIdxInfo
1ace0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1acf0 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  tr = 0;.  pNew->
1ad00 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
1ad10 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
1ad20 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1ad30 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38  .isOrdered = (i8
1ad40 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  )(pIdxInfo->orde
1ad50 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20  rByConsumed ?.  
1ad60 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f      pIdxInfo->nO
1ad70 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70  rderBy : 0);.  p
1ad80 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1ad90 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20  .  pNew->rRun = 
1ada0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f  sqlite3LogEstFro
1adb0 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
1adc0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
1add0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
1ade0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
1adf0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1ae00 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53  edRows);..  /* S
1ae10 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  et the WHERE_ONE
1ae20 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65 20  ROW flag if the 
1ae30 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74  xBestIndex() met
1ae40 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20  hod indicated.  
1ae50 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
1ae60 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d   will visit at m
1ae70 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65  ost one row. Cle
1ae80 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e  ar it otherwise.
1ae90 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e   */.  if( pIdxIn
1aea0 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53  fo->idxFlags & S
1aeb0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
1aec0 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70  _UNIQUE ){.    p
1aed0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
1aee0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1aef0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
1af00 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
1af10 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20  RE_ONEROW;.  }. 
1af20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1af30 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1af40 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65  pNew);.  if( pNe
1af50 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
1af60 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
1af70 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76  3_free(pNew->u.v
1af80 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1af90 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
1afa0 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  edFree = 0;.  }.
1afb0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
1afc0 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20  fff, ("  bIn=%d 
1afd0 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20  prereqIn=%04llx 
1afe0 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78  prereqOut=%04llx
1aff0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1b000 20 20 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e             *pbIn
1b010 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  , (sqlite3_uint6
1b020 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20  4)mPrereq,.     
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
1b050 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26  )(pNew->prereq &
1b060 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20   ~mPrereq)));.. 
1b070 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1b080 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
1b090 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
1b0a0 66 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74  for a table of t
1b0b0 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69  he join identifi
1b0c0 65 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65  ed by.** pBuilde
1b0d0 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20  r->pNew->iTab.  
1b0e0 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75  That table is gu
1b0f0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1b100 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
1b110 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
1b120 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52  re no LEFT or CR
1b130 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69  OSS JOIN joins i
1b140 6e 20 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74  n the query, bot
1b150 68 20 6d 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a  h mPrereq and.**
1b160 20 6d 55 6e 75 73 61 62 6c 65 20 61 72 65 20 73   mUnusable are s
1b170 65 74 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69  et to 0. Otherwi
1b180 73 65 2c 20 6d 50 72 65 72 65 71 20 69 73 20 61  se, mPrereq is a
1b190 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f   mask of all FRO
1b1a0 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72  M clause.** entr
1b1b0 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  ies that occur b
1b1c0 65 66 6f 72 65 20 74 68 65 20 76 69 72 74 75 61  efore the virtua
1b1d0 6c 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  l table in the F
1b1e0 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 61  ROM clause and a
1b1f0 72 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 64 20  re.** separated 
1b200 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65  from it by at le
1b210 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20  ast one LEFT or 
1b220 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69  CROSS JOIN. Simi
1b230 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55  larly, the.** mU
1b240 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e  nusable mask con
1b250 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63  tains all FROM c
1b260 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20 74 68  lause entries th
1b270 61 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74  at occur after t
1b280 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  he.** virtual ta
1b290 62 6c 65 20 61 6e 64 20 61 72 65 20 73 65 70 61  ble and are sepa
1b2a0 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79  rated from it by
1b2b0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45   at least one LE
1b2c0 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20  FT or .** CROSS 
1b2d0 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  JOIN. .**.** For
1b2e0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
1b2f0 20 71 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a   query were:.**.
1b300 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  **   ... FROM t1
1b310 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74  , t2 LEFT JOIN t
1b320 33 2c 20 74 34 2c 20 76 74 20 43 52 4f 53 53 20  3, t4, vt CROSS 
1b330 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a  JOIN t5, t6;.**.
1b340 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72 65 71 20  ** then mPrereq 
1b350 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 28  corresponds to (
1b360 74 31 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e 75  t1, t2) and mUnu
1b370 73 61 62 6c 65 20 74 6f 20 28 74 35 2c 20 74 36  sable to (t5, t6
1b380 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65  )..**.** All the
1b390 20 74 61 62 6c 65 73 20 69 6e 20 6d 50 72 65 72   tables in mPrer
1b3a0 65 71 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  eq must be scann
1b3b0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ed before the cu
1b3c0 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a  rrent virtual .*
1b3d0 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20  * table. So any 
1b3e0 74 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20  terms for which 
1b3f0 61 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74 65  all prerequisite
1b400 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20  s are satisfied 
1b410 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d  by .** mPrereq m
1b420 61 79 20 62 65 20 73 70 65 63 69 66 69 65 64 20  ay be specified 
1b430 61 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61  as "usable" in a
1b440 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  ll calls to xBes
1b450 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76  tIndex. .** Conv
1b460 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c  ersely, all tabl
1b470 65 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20  es in mUnusable 
1b480 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1b490 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
1b4a0 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62  t.** virtual tab
1b4b0 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73  le, so any terms
1b4c0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70   for which the p
1b4d0 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 76 65  rerequisites ove
1b4e0 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e  rlap with.** mUn
1b4f0 75 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c  usable should al
1b500 77 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72  ways be configur
1b510 65 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c  ed as "not-usabl
1b520 65 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65  e" for xBestInde
1b530 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
1b540 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1b550 74 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f  tual(.  WhereLoo
1b560 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1b570 65 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  er,  /* WHERE cl
1b580 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
1b590 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
1b5a0 72 65 72 65 71 2c 20 20 20 20 20 20 20 20 20 20  rereq,          
1b5b0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
1b5c0 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
1b5d0 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e  d before this on
1b5e0 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d  e */.  Bitmask m
1b5f0 55 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20 20  Unusable        
1b600 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68      /* Tables th
1b610 61 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  at must be scann
1b620 65 64 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e  ed after this on
1b630 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1b640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1b650 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1b660 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65   code */.  Where
1b670 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
1b680 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
1b690 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78   analysis contex
1b6a0 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
1b6b0 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
1b6c0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1b6d0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1b6e0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1b6f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b700 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1b710 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1b720 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b  List_item *pSrc;
1b730 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1b740 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
1b750 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65  arch */.  sqlite
1b760 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b  3_index_info *p;
1b770 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
1b780 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 65 73   to pass to xBes
1b790 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e  tIndex() */.  in
1b7a0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20  t nConstraint;  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b7c0 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  mber of constrai
1b7d0 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e  nts in p */.  in
1b7e0 74 20 62 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t bIn;          
1b7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b800 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20  ue if plan uses 
1b810 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  IN(...) operator
1b820 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
1b830 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b  *pNew;.  Bitmask
1b840 20 6d 42 65 73 74 3b 20 20 20 20 20 20 20 20 20   mBest;         
1b850 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1b860 75 73 65 64 20 62 79 20 62 65 73 74 20 70 6f 73  used by best pos
1b870 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a 0a 20  sible plan */.. 
1b880 20 61 73 73 65 72 74 28 20 28 6d 50 72 65 72 65   assert( (mPrere
1b890 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29 3d 3d  q & mUnusable)==
1b8a0 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20  0 );.  pWInfo = 
1b8b0 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1b8c0 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ;.  pParse = pWI
1b8d0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70  nfo->pParse;.  p
1b8e0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
1b8f0 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  WC;.  pNew = pBu
1b900 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
1b910 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70  Src = &pWInfo->p
1b920 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65 77 2d  TabList->a[pNew-
1b930 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65 72 74  >iTab];.  assert
1b940 28 20 49 73 56 69 72 74 75 61 6c 28 70 53 72 63  ( IsVirtual(pSrc
1b950 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70 20 3d  ->pTab) );.  p =
1b960 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e   allocateIndexIn
1b970 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20  fo(pParse, pWC, 
1b980 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72 63 2c  mUnusable, pSrc,
1b990 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 64 65   pBuilder->pOrde
1b9a0 72 42 79 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  rBy);.  if( p==0
1b9b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b9c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70  _NOMEM_BKPT;.  p
1b9d0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1b9e0 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  .  pNew->wsFlags
1b9f0 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
1ba00 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e  TABLE;.  pNew->n
1ba10 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 4e 65  LTerm = 0;.  pNe
1ba20 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
1ba30 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f 6e 73 74  ee = 0;.  nConst
1ba40 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73  raint = p->nCons
1ba50 74 72 61 69 6e 74 3b 0a 20 20 69 66 28 20 77 68  traint;.  if( wh
1ba60 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 70 50  ereLoopResize(pP
1ba70 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c 20  arse->db, pNew, 
1ba80 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20 29 7b 0a  nConstraint) ){.
1ba90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1baa0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 29  e(pParse->db, p)
1bab0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1bac0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1bad0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
1bae0 63 61 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 28  call xBestIndex(
1baf0 29 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73 74  ) with all const
1bb00 72 61 69 6e 74 73 20 75 73 61 62 6c 65 2e 20 2a  raints usable. *
1bb10 2f 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  /.  WHERETRACE(0
1bb20 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1bb30 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 5c  One: all usable\
1bb40 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20 77 68 65  n"));.  rc = whe
1bb50 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1bb60 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50  One(pBuilder, mP
1bb70 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c 20  rereq, ALLBITS, 
1bb80 30 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 0a 20 20  0, p, &bIn);..  
1bb90 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74  /* If the call t
1bba0 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77  o xBestIndex() w
1bbb0 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65 6e  ith all terms en
1bbc0 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20 61  abled produced a
1bbd0 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74 20   plan.  ** that 
1bbe0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
1bbf0 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62 6c   any source tabl
1bc00 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e 20  es (IOW: a plan 
1bc10 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c 0a  with mBest==0),.
1bc20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
1bc30 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 6d  is no point in m
1bc40 61 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68 65  aking any furthe
1bc50 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  r calls to xBest
1bc60 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73 69  Index() .  ** si
1bc70 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61 6c  nce they will al
1bc80 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  l return the sam
1bc90 65 20 72 65 73 75 6c 74 20 28 69 66 20 74 68 65  e result (if the
1bca0 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20 20   xBestIndex().  
1bcb0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
1bcc0 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a 20  n is sane). */. 
1bcd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bce0 4f 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20 28  OK && (mBest = (
1bcf0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e  pNew->prereq & ~
1bd00 6d 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b 0a  mPrereq))!=0 ){.
1bd10 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f      int seenZero
1bd20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1bd30 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 70    /* True if a p
1bd40 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72  lan with no prer
1bd50 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20  eqs seen */.    
1bd60 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  int seenZeroNoIN
1bd70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
1bd80 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72   Plan with no pr
1bd90 65 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e 28  ereqs and no IN(
1bda0 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20 20  ...) seen */.   
1bdb0 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20 3d   Bitmask mPrev =
1bdc0 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20   0;.    Bitmask 
1bdd0 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a  mBestNoIn = 0;..
1bde0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 6c      /* If the pl
1bdf0 61 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20 74  an produced by t
1be00 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  he earlier call 
1be10 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  uses an IN(...) 
1be20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20 2a  term, call.    *
1be30 2a 20 78 42 65 73 74 49 6e 64 65 78 20 61 67 61  * xBestIndex aga
1be40 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77 69  in, this time wi
1be50 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 73  th IN(...) terms
1be60 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20   disabled. */.  
1be70 20 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20 20    if( bIn ){.   
1be80 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1be90 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f  40, ("  VirtualO
1bea0 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20 77  ne: all usable w
1beb0 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20 20  /o IN\n"));.    
1bec0 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1bed0 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42  AddVirtualOne(pB
1bee0 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1bef0 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e 2c   ALLBITS, WO_IN,
1bf00 20 70 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20   p, &bIn);.     
1bf10 20 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20   assert( bIn==0 
1bf20 29 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f  );.      mBestNo
1bf30 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  In = pNew->prere
1bf40 71 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20  q & ~mPrereq;.  
1bf50 20 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49      if( mBestNoI
1bf60 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1bf70 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1bf80 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f        seenZeroNo
1bf90 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1bfa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
1bfb0 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e  ll xBestIndex on
1bfc0 63 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ce for each dist
1bfd0 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70  inct value of (p
1bfe0 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50  rereqRight & ~mP
1bff0 72 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69  rereq) .    ** i
1c000 6e 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72  n the set of ter
1c010 6d 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f  ms that apply to
1c020 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1c030 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  tual table.  */.
1c040 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
1c050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c060 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42    int i;.      B
1c070 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41  itmask mNext = A
1c080 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73  LLBITS;.      as
1c090 73 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b  sert( mNext>0 );
1c0a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1c0b0 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1c0c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ++){.        Bit
1c0d0 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20  mask mThis = (. 
1c0e0 20 20 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e             pWC->
1c0f0 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  a[p->aConstraint
1c100 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d  [i].iTermOffset]
1c110 2e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e  .prereqRight & ~
1c120 6d 50 72 65 72 65 71 0a 20 20 20 20 20 20 20 20  mPrereq.        
1c130 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1c140 54 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54  This>mPrev && mT
1c150 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78  his<mNext ) mNex
1c160 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20  t = mThis;.     
1c170 20 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d   }.      mPrev =
1c180 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66   mNext;.      if
1c190 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53  ( mNext==ALLBITS
1c1a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1c1b0 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74  if( mNext==mBest
1c1c0 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74   || mNext==mBest
1c1d0 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NoIn ) continue;
1c1e0 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1c1f0 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1c200 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30  ualOne: mPrev=%0
1c210 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c  4llx mNext=%04ll
1c220 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1c240 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72  lite3_uint64)mPr
1c250 65 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  ev, (sqlite3_uin
1c260 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20  t64)mNext));.   
1c270 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1c280 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70  pAddVirtualOne(p
1c290 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1c2a0 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c  , mNext|mPrereq,
1c2b0 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20 20   0, p, &bIn);.  
1c2c0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 72      if( pNew->pr
1c2d0 65 72 65 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b  ereq==mPrereq ){
1c2e0 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1c2f0 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  o = 1;.        i
1c300 66 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e  f( bIn==0 ) seen
1c310 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20  ZeroNoIN = 1;.  
1c320 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c330 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1c340 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1c350 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 6c 6f   in the above lo
1c360 6f 70 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20  op did not find 
1c370 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68  a plan.    ** th
1c380 61 74 20 72 65 71 75 69 72 65 73 20 6e 6f 20 73  at requires no s
1c390 6f 75 72 63 65 20 74 61 62 6c 65 73 20 61 74 20  ource tables at 
1c3a0 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75  all (i.e. one gu
1c3b0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a 20  aranteed to be. 
1c3c0 20 20 20 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d     ** usable), m
1c3d0 61 6b 65 20 61 20 63 61 6c 6c 20 68 65 72 65 20  ake a call here 
1c3e0 77 69 74 68 20 61 6c 6c 20 73 6f 75 72 63 65 20  with all source 
1c3f0 74 61 62 6c 65 73 20 64 69 73 61 62 6c 65 64 20  tables disabled 
1c400 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1c410 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e  QLITE_OK && seen
1c420 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Zero==0 ){.     
1c430 20 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30   WHERETRACE(0x40
1c440 2c 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65  , ("  VirtualOne
1c450 3a 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e  : all disabled\n
1c460 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "));.      rc = 
1c470 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1c480 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1c490 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65   mPrereq, mPrere
1c4a0 71 2c 20 30 2c 20 70 2c 20 26 62 49 6e 29 3b 0a  q, 0, p, &bIn);.
1c4b0 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d 30        if( bIn==0
1c4c0 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20   ) seenZeroNoIN 
1c4d0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
1c4e0 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20  /* If the calls 
1c4f0 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1c500 68 61 76 65 20 73 6f 20 66 61 72 20 66 61 69 6c  have so far fail
1c510 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 6c 61  ed to find a pla
1c520 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65  n.    ** that re
1c530 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65  quires no source
1c540 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 61   tables at all a
1c550 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  nd does not use 
1c560 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a  an IN(...).    *
1c570 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65  * operator, make
1c580 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f   a final call to
1c590 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65 72 65   obtain one here
1c5a0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
1c5b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
1c5c0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29  eenZeroNoIN==0 )
1c5d0 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1c5e0 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1c5f0 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73  tualOne: all dis
1c600 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49 4e  abled and w/o IN
1c610 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63 20  \n"));.      rc 
1c620 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69  = whereLoopAddVi
1c630 72 74 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65  rtualOne(pBuilde
1c640 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50 72 65  r, mPrereq, mPre
1c650 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 26  req, WO_IN, p, &
1c660 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bIn);.    }.  }.
1c670 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f  .  if( p->needTo
1c680 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71 6c  FreeIdxStr ) sql
1c690 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78  ite3_free(p->idx
1c6a0 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Str);.  sqlite3D
1c6b0 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
1c6c0 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  , p);.  return r
1c6d0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
1c6e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1c6f0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
1c700 2a 20 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20  * Add WhereLoop 
1c710 65 6e 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c  entries to handl
1c720 65 20 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69  e OR terms.  Thi
1c730 73 20 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68  s works for eith
1c740 65 72 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20  er.** btrees or 
1c750 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a  virtual tables..
1c760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
1c770 65 72 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20  ereLoopAddOr(.  
1c780 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1c790 20 2a 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42   *pBuilder, .  B
1c7a0 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20  itmask mPrereq, 
1c7b0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
1c7c0 61 62 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49  able.){.  WhereI
1c7d0 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42  nfo *pWInfo = pB
1c7e0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
1c7f0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
1c800 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  WC;.  WhereLoop 
1c810 2a 70 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65  *pNew;.  WhereTe
1c820 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45  rm *pTerm, *pWCE
1c830 6e 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  nd;.  int rc = S
1c840 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
1c850 69 43 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61  iCur;.  WhereCla
1c860 75 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68  use tempWC;.  Wh
1c870 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
1c880 53 75 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72  SubBuild;.  Wher
1c890 65 4f 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75  eOrSet sSum, sCu
1c8a0 72 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  r;.  struct SrcL
1c8b0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1c8c0 0a 20 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69  .  .  pWC = pBui
1c8d0 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43  lder->pWC;.  pWC
1c8e0 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70  End = pWC->a + p
1c8f0 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65  WC->nTerm;.  pNe
1c900 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1c910 65 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  ew;.  memset(&sS
1c920 75 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  um, 0, sizeof(sS
1c930 75 6d 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  um));.  pItem = 
1c940 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1c950 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62  ->a + pNew->iTab
1c960 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d  ;.  iCur = pItem
1c970 2d 3e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f  ->iCursor;..  fo
1c980 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
1c990 70 54 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20  pTerm<pWCEnd && 
1c9a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70  rc==SQLITE_OK; p
1c9b0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
1c9c0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1c9d0 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20  or & WO_OR)!=0. 
1c9e0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75      && (pTerm->u
1c9f0 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61  .pOrInfo->indexa
1ca00 62 6c 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ble & pNew->mask
1ca10 53 65 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b  Self)!=0 .    ){
1ca20 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
1ca30 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
1ca40 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
1ca50 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
1ca60 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
1ca70 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
1ca80 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
1ca90 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
1caa0 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
1cab0 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d        int once =
1cac0 20 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   1;.      int i,
1cad0 20 6a 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73   j;.    .      s
1cae0 53 75 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69  SubBuild = *pBui
1caf0 6c 64 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62  lder;.      sSub
1cb00 42 75 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d  Build.pOrderBy =
1cb10 20 30 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75   0;.      sSubBu
1cb20 69 6c 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43  ild.pOrSet = &sC
1cb30 75 72 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45  ur;..      WHERE
1cb40 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 42  TRACE(0x200, ("B
1cb50 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  egin processing 
1cb60 4f 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c  OR-clause %p\n",
1cb70 20 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20   pTerm));.      
1cb80 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57  for(pOrTerm=pOrW
1cb90 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f  C->a; pOrTerm<pO
1cba0 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b  rWCEnd; pOrTerm+
1cbb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1cbc0 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61  (pOrTerm->eOpera
1cbd0 74 6f 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30  tor & WO_AND)!=0
1cbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53   ){.          sS
1cbf0 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70  ubBuild.pWC = &p
1cc00 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e  OrTerm->u.pAndIn
1cc10 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
1cc20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
1cc30 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
1cc40 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
1cc50 20 74 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d   tempWC.pWInfo =
1cc60 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20   pWC->pWInfo;.  
1cc70 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
1cc80 4f 75 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20  Outer = pWC;.   
1cc90 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
1cca0 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
1ccb0 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72       tempWC.nTer
1ccc0 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
1ccd0 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
1cce0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  erm;.          s
1ccf0 53 75 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26  SubBuild.pWC = &
1cd00 74 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20  tempWC;.        
1cd10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1cd20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1cd30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75     }.        sCu
1cd40 72 2e 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  r.n = 0;.#ifdef 
1cd50 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
1cd60 45 44 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ED.        WHERE
1cd70 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f  TRACE(0x200, ("O
1cd80 52 2d 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20  R-term %d of %p 
1cd90 68 61 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a  has %d subterms:
1cda0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1cdb0 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
1cdc0 4f 72 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29  OrTerm-pOrWC->a)
1cdd0 2c 20 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69  , pTerm, sSubBui
1cde0 6c 64 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b  ld.pWC->nTerm));
1cdf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1ce00 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
1ce10 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
1ce20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1ce30 43 6c 61 75 73 65 50 72 69 6e 74 28 73 53 75 62  ClausePrint(sSub
1ce40 42 75 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20  Build.pWC);.    
1ce50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
1ce60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ce70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1ce80 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
1ce90 75 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29  ual(pItem->pTab)
1cea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1ceb0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1cec0 69 72 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c  irtual(&sSubBuil
1ced0 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  d, mPrereq, mUnu
1cee0 73 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  sable);.        
1cef0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1cf00 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
1cf10 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41   rc = whereLoopA
1cf20 64 64 42 74 72 65 65 28 26 73 53 75 62 42 75 69  ddBtree(&sSubBui
1cf30 6c 64 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20  ld, mPrereq);.  
1cf40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cf50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cf60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1cf70 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1cf80 4f 72 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d  Or(&sSubBuild, m
1cf90 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c  Prereq, mUnusabl
1cfa0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1cfb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1cfc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  ==SQLITE_OK || s
1cfd0 43 75 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  Cur.n==0 );.    
1cfe0 20 20 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d      if( sCur.n==
1cff0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
1d000 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  Sum.n = 0;.     
1d010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d020 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
1d030 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
1d040 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75  whereOrMove(&sSu
1d050 6d 2c 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20  m, &sCur);.     
1d060 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1d070 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d080 20 20 20 20 20 20 20 20 57 68 65 72 65 4f 72 53          WhereOrS
1d090 65 74 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20  et sPrev;.      
1d0a0 20 20 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28      whereOrMove(
1d0b0 26 73 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a  &sPrev, &sSum);.
1d0c0 20 20 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e            sSum.n
1d0d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1d0e0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76  for(i=0; i<sPrev
1d0f0 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .n; i++){.      
1d100 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1d110 3c 73 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20  <sCur.n; j++){. 
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
1d130 72 65 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d  reOrInsert(&sSum
1d140 2c 20 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65  , sPrev.a[i].pre
1d150 72 65 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e  req | sCur.a[j].
1d160 70 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20  prereq,.        
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73      sqlite3LogEs
1d190 74 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e  tAdd(sPrev.a[i].
1d1a0 72 52 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e  rRun, sCur.a[j].
1d1b0 72 52 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  rRun),.         
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 20 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74     sqlite3LogEst
1d1e0 41 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e  Add(sPrev.a[i].n
1d1f0 4f 75 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e  Out, sCur.a[j].n
1d200 4f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Out));.         
1d210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1d220 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d230 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e   }.      pNew->n
1d240 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  LTerm = 1;.     
1d250 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
1d260 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
1d270 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20  pNew->wsFlags = 
1d280 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a  WHERE_MULTI_OR;.
1d290 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74        pNew->rSet
1d2a0 75 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e  up = 0;.      pN
1d2b0 65 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30  ew->iSortIdx = 0
1d2c0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1d2d0 70 4e 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65  pNew->u, 0, size
1d2e0 6f 66 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20  of(pNew->u));.  
1d2f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
1d300 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
1d310 73 53 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  sSum.n; i++){.  
1d320 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
1d330 20 43 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e   Currently sSum.
1d340 61 5b 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74  a[i].rRun is set
1d350 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74   to the sum of t
1d360 68 65 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20  he costs.       
1d370 20 2a 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73   ** of all sub-s
1d380 63 61 6e 73 20 72 65 71 75 69 72 65 64 20 62 79  cans required by
1d390 20 74 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f   the OR-scan. Ho
1d3a0 77 65 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f  wever, due to ro
1d3b0 75 6e 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  unding.        *
1d3c0 2a 20 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79  * errors, it may
1d3d0 20 62 65 20 74 68 61 74 20 74 68 65 20 63 6f 73   be that the cos
1d3e0 74 20 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e  t of the OR-scan
1d3f0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73   is equal to its
1d400 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74  .        ** most
1d410 20 65 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73   expensive sub-s
1d420 63 61 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61  can. Add the sma
1d430 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  llest possible p
1d440 65 6e 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20  enalty .        
1d450 2a 2a 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74  ** (equivalent t
1d460 6f 20 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68  o multiplying th
1d470 65 20 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20  e cost by 1.07) 
1d480 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a  to ensure that .
1d490 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
1d4a0 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e  does not happen.
1d4b0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1d4c0 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 73 75  WHERE clauses su
1d4d0 63 68 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ch as the.      
1d4e0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
1d4f0 68 65 72 65 20 74 68 65 72 65 20 69 73 20 61 6e  here there is an
1d500 20 69 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20   index on "y":. 
1d510 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1d520 20 20 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c    **     WHERE l
1d530 69 6b 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30  ikelihood(x=?, 0
1d540 2e 39 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20  .99) OR y=?.    
1d550 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1d560 2a 20 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61  * the planner ma
1d570 79 20 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20  y elect to "OR" 
1d580 74 6f 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d  together a full-
1d590 74 61 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61  table scan and a
1d5a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  n.        ** ind
1d5b0 65 78 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f  ex lookup. And o
1d5c0 74 68 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f  ther similarly o
1d5d0 64 64 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  dd results.  */.
1d5e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52          pNew->rR
1d5f0 75 6e 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72  un = sSum.a[i].r
1d600 52 75 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  Run + 1;.       
1d610 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53   pNew->nOut = sS
1d620 75 6d 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20  um.a[i].nOut;.  
1d630 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72        pNew->prer
1d640 65 71 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70  eq = sSum.a[i].p
1d650 72 65 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72  rereq;.        r
1d660 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1d670 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1d680 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
1d690 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1d6a0 32 30 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65  200, ("End proce
1d6b0 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20  ssing OR-clause 
1d6c0 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a  %p\n", pTerm));.
1d6d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d6e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d6f0 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f  Add all WhereLoo
1d700 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c  p objects for al
1d710 6c 20 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61  l tables .*/.sta
1d720 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
1d730 70 41 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f  pAddAll(WhereLoo
1d740 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1d750 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
1d760 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
1d770 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42  der->pWInfo;.  B
1d780 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d  itmask mPrereq =
1d790 20 30 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   0;.  Bitmask mP
1d7a0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rior = 0;.  int 
1d7b0 69 54 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20  iTab;.  SrcList 
1d7c0 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e  *pTabList = pWIn
1d7d0 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20  fo->pTabList;.  
1d7e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1d7f0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74  tem *pItem;.  st
1d800 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1d810 6d 20 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c  m *pEnd = &pTabL
1d820 69 73 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e  ist->a[pWInfo->n
1d830 4c 65 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65  Level];.  sqlite
1d840 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
1d850 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
1d860 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d870 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1d880 4e 65 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a  New;.  u8 priorJ
1d890 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20  ointype = 0;..  
1d8a0 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65  /* Loop over the
1d8b0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
1d8c0 6f 69 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74  oin, from left t
1d8d0 6f 20 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65  o right */.  pNe
1d8e0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
1d8f0 65 77 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49  ew;.  whereLoopI
1d900 6e 69 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72  nit(pNew);.  for
1d910 28 69 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70  (iTab=0, pItem=p
1d920 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65  TabList->a; pIte
1d930 6d 3c 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20  m<pEnd; iTab++, 
1d940 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69  pItem++){.    Bi
1d950 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20  tmask mUnusable 
1d960 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  = 0;.    pNew->i
1d970 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Tab = iTab;.    
1d980 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  pNew->maskSelf =
1d990 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
1d9a0 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
1d9b0 61 73 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69  askSet, pItem->i
1d9c0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
1d9d0 20 28 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   ((pItem->fg.joi
1d9e0 6e 74 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74  ntype|priorJoint
1d9f0 79 70 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c  ype) & (JT_LEFT|
1da00 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b  JT_CROSS))!=0 ){
1da10 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
1da20 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65  ondition is true
1da30 20 77 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74   when pItem is t
1da40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1da50 65 72 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  erm on the.     
1da60 20 2a 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73   ** right-hand-s
1da70 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72  ide of a LEFT or
1da80 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f   CROSS JOIN.  */
1da90 0a 20 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d  .      mPrereq =
1daa0 20 6d 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20   mPrior;.    }. 
1dab0 20 20 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65     priorJointype
1dac0 20 3d 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69   = pItem->fg.joi
1dad0 6e 74 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53  ntype;.#ifndef S
1dae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1daf0 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
1db00 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d  IsVirtual(pItem-
1db10 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
1db20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1db30 74 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  tem *p;.      fo
1db40 72 28 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70  r(p=&pItem[1]; p
1db50 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20  <pEnd; p++){.   
1db60 20 20 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62       if( mUnusab
1db70 6c 65 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69  le || (p->fg.joi
1db80 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
1db90 7c 4a 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20  |JT_CROSS)) ){. 
1dba0 20 20 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62           mUnusab
1dbb0 6c 65 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65  le |= sqlite3Whe
1dbc0 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66  reGetMask(&pWInf
1dbd0 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  o->sMaskSet, p->
1dbe0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1dbf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1dc00 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1dc10 41 64 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c  AddVirtual(pBuil
1dc20 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55  der, mPrereq, mU
1dc30 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65  nusable);.    }e
1dc40 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1dc50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1dc60 4c 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a  LTABLE */.    {.
1dc70 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1dc80 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 70 42 75  LoopAddBtree(pBu
1dc90 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b  ilder, mPrereq);
1dca0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1dcb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dcc0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1dcd0 4c 6f 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64  LoopAddOr(pBuild
1dce0 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e  er, mPrereq, mUn
1dcf0 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  usable);.    }. 
1dd00 20 20 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65     mPrior |= pNe
1dd10 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  w->maskSelf;.   
1dd20 20 69 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d   if( rc || db->m
1dd30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
1dd40 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72  eak;.  }..  wher
1dd50 65 4c 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70  eLoopClear(db, p
1dd60 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  New);.  return r
1dd70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d  c;.}../*.** Exam
1dd80 69 6e 65 20 61 20 57 68 65 72 65 50 61 74 68 20  ine a WherePath 
1dd90 28 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69  (with the additi
1dda0 6f 6e 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  on of the extra 
1ddb0 57 68 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65  WhereLoop of the
1ddc0 20 35 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65   5th.** paramete
1ddd0 72 73 29 20 74 6f 20 73 65 65 20 69 66 20 69 74  rs) to see if it
1dde0 20 6f 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e   outputs rows in
1ddf0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 4f   the requested O
1de00 52 44 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47  RDER BY.** (or G
1de10 52 4f 55 50 20 42 59 29 20 77 69 74 68 6f 75 74  ROUP BY) without
1de20 20 72 65 71 75 69 72 69 6e 67 20 61 20 73 65 70   requiring a sep
1de30 61 72 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61  arate sort opera
1de40 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a  tion.  Return N:
1de50 0a 2a 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20  .** .**   N>0:  
1de60 20 4e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20   N terms of the 
1de70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1de80 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
1de90 20 20 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72     N==0:  No ter
1dea0 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
1deb0 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61  BY clause are sa
1dec0 74 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30  tisfied.**   N<0
1ded0 3a 20 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20  :   Unknown yet 
1dee0 68 6f 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f  how many terms o
1def0 66 20 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74  f ORDER BY might
1df00 20 62 65 20 73 61 74 69 73 66 69 65 64 2e 20 20   be satisfied.  
1df10 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
1df20 74 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  t processing for
1df30 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61   WHERE_GROUPBY a
1df40 6e 64 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  nd WHERE_DISTINC
1df50 54 42 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a  TBY is not as.**
1df60 20 73 74 72 69 63 74 2e 20 20 57 69 74 68 20 47   strict.  With G
1df70 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
1df80 49 4e 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65  INCT the only re
1df90 71 75 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61  quirement is tha
1dfa0 74 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20  t.** equivalent 
1dfb0 72 6f 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65  rows appear imme
1dfc0 64 69 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74  diately adjacent
1dfd0 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e   to one another.
1dfe0 20 20 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e    GROUP BY.** an
1dff0 64 20 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f  d DISTINCT do no
1e000 74 20 72 65 71 75 69 72 65 20 72 6f 77 73 20 74  t require rows t
1e010 6f 20 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20  o appear in any 
1e020 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72  particular order
1e030 20 61 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65   as long.** as e
1e040 71 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61  quivalent rows a
1e050 72 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74  re grouped toget
1e060 68 65 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47  her.  Thus for G
1e070 52 4f 55 50 20 42 59 20 61 6e 64 20 44 49 53 54  ROUP BY and DIST
1e080 49 4e 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64  INCT.** the pOrd
1e090 65 72 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62  erBy terms can b
1e0a0 65 20 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79  e matched in any
1e0b0 20 6f 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52   order.  With OR
1e0c0 44 45 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20  DER BY, the .** 
1e0d0 70 4f 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d  pOrderBy terms m
1e0e0 75 73 74 20 62 65 20 6d 61 74 63 68 65 64 20 69  ust be matched i
1e0f0 6e 20 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f  n strict left-to
1e100 2d 72 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f  -right order..*/
1e110 0a 73 74 61 74 69 63 20 69 38 20 77 68 65 72 65  .static i8 where
1e120 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
1e130 65 72 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66  erBy(.  WhereInf
1e140 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a  o *pWInfo,    /*
1e150 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1e160 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1e170 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
1e180 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
1e190 50 20 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54  P BY or DISTINCT
1e1a0 20 63 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b   clause to check
1e1b0 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20   */.  WherePath 
1e1c0 2a 70 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54  *pPath,     /* T
1e1d0 68 65 20 57 68 65 72 65 50 61 74 68 20 74 6f 20  he WherePath to 
1e1e0 63 68 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77  check */.  u16 w
1e1f0 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
1e200 20 2f 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42   /* WHERE_GROUPB
1e210 59 20 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59  Y or _DISTINCTBY
1e220 20 6f 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d   or _ORDERBY_LIM
1e230 49 54 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f  IT */.  u16 nLoo
1e240 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1e250 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1e260 65 73 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f  es in pPath->aLo
1e270 6f 70 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  op[] */.  WhereL
1e280 6f 6f 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20  oop *pLast,     
1e290 2f 2a 20 41 64 64 20 74 68 69 73 20 57 68 65 72  /* Add this Wher
1e2a0 65 4c 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64  eLoop to the end
1e2b0 20 6f 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   of pPath->aLoop
1e2c0 5b 5d 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  [] */.  Bitmask 
1e2d0 2a 70 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a  *pRevMask     /*
1e2e0 20 4f 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68   OUT: Mask of Wh
1e2f0 65 72 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20  ereLoops to run 
1e300 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
1e310 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53   */.){.  u8 revS
1e320 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
1e330 2a 20 54 72 75 65 20 69 66 20 72 65 76 20 69 73  * True if rev is
1e340 20 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72   known */.  u8 r
1e350 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
1e360 20 20 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73    /* Composite s
1e370 6f 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75  ort order */.  u
1e380 38 20 72 65 76 49 64 78 3b 20 20 20 20 20 20 20  8 revIdx;       
1e390 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f       /* Index so
1e3a0 72 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38  rt order */.  u8
1e3b0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
1e3c0 3b 20 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72  ;   /* All prior
1e3d0 20 57 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20   WhereLoops are 
1e3e0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a  order-distinct *
1e3f0 2f 0a 20 20 75 38 20 64 69 73 74 69 6e 63 74 43  /.  u8 distinctC
1e400 6f 6c 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75  olumns;   /* Tru
1e410 65 20 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61  e if the loop ha
1e420 73 20 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c  s UNIQUE NOT NUL
1e430 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  L columns */.  u
1e440 38 20 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20  8 isMatch;      
1e450 20 20 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20       /* iColumn 
1e460 6d 61 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f  matches a term o
1e470 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1e480 6c 61 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65  lause */.  u16 e
1e490 71 4f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  qOpMask;        
1e4a0 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61   /* Allowed equa
1e4b0 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a  lity operators *
1e4c0 2f 0a 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b  /.  u16 nKeyCol;
1e4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e4e0 62 65 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d  ber of key colum
1e4f0 6e 73 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a  ns in pIndex */.
1e500 20 20 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20    u16 nColumn;  
1e510 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
1e520 20 6e 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72   number of order
1e530 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
1e540 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36  e index */.  u16
1e550 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
1e560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72     /* Number ter
1e570 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ms in the ORDER 
1e580 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
1e590 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt iLoop;       
1e5a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1e5b0 20 57 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50   WhereLoop in pP
1e5c0 61 74 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73  ath being proces
1e5d0 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  sed */.  int i, 
1e5e0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
1e5f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
1e600 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20  */.  int iCur;  
1e610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1e620 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
1e630 63 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  current WhereLoo
1e640 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  p */.  int iColu
1e650 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn;          /* 
1e660 41 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  A column number 
1e670 77 69 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75  within table iCu
1e680 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  r */.  WhereLoop
1e690 20 2a 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20   *pLoop = 0; /* 
1e6a0 43 75 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f  Current WhereLoo
1e6b0 70 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  p being processe
1e6c0 64 2e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  d. */.  WhereTer
1e6d0 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a  m *pTerm;     /*
1e6e0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
1e6f0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1e700 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  se */.  Expr *pO
1e710 42 45 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a  BExpr;        /*
1e720 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
1e730 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
1e740 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c   clause */.  Col
1e750 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
1e760 20 20 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75     /* COLLATE fu
1e770 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f  nction from an O
1e780 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
1e790 65 72 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  erm */.  Index *
1e7a0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f  pIndex;        /
1e7b0 2a 20 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f  * The index asso
1e7c0 63 69 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f  ciated with pLoo
1e7d0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  p */.  sqlite3 *
1e7e0 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  db = pWInfo->pPa
1e7f0 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
1e800 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1e810 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62   */.  Bitmask ob
1e820 53 61 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d  Sat = 0;    /* M
1e830 61 73 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ask of ORDER BY 
1e840 74 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20  terms satisfied 
1e850 73 6f 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d  so far */.  Bitm
1e860 61 73 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20  ask obDone;     
1e870 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c    /* Mask of all
1e880 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
1e890 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64  */.  Bitmask ord
1e8a0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20  erDistinctMask; 
1e8b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20   /* Mask of all 
1e8c0 77 65 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f  well-ordered loo
1e8d0 70 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ps */.  Bitmask 
1e8e0 72 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  ready;          
1e8f0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69      /* Mask of i
1e900 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20  nner loops */.. 
1e910 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20   /*.  ** We say 
1e920 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  the WhereLoop is
1e930 20 22 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74   "one-row" if it
1e940 20 67 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f   generates no mo
1e950 72 65 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a  re than one.  **
1e960 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20   row of output. 
1e970 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20   A WhereLoop is 
1e980 6f 6e 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f  one-row if all o
1e990 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1e9a0 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20  are true:.  **  
1e9b0 28 61 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f  (a) All index co
1e9c0 6c 75 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68  lumns match with
1e9d0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1e9e0 2e 0a 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20  ..  **  (b) The 
1e9f0 69 6e 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a  index is unique.
1ea00 20 20 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f    ** Any WhereLo
1ea10 6f 70 20 77 69 74 68 20 61 6e 20 57 48 45 52 45  op with an WHERE
1ea20 5f 43 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74  _COLUMN_EQ const
1ea30 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77  raint on the row
1ea40 69 64 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20  id is one-row.. 
1ea50 20 2a 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f   ** Every one-ro
1ea60 77 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c  w WhereLoop will
1ea70 20 68 61 76 65 20 74 68 65 20 57 48 45 52 45 5f   have the WHERE_
1ea80 4f 4e 45 52 4f 57 20 62 69 74 20 73 65 74 20 69  ONEROW bit set i
1ea90 6e 20 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a  n wsFlags..  **.
1eaa0 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20    ** We say the 
1eab0 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72  WhereLoop is "or
1eac0 64 65 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66  der-distinct" if
1ead0 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75   the set of colu
1eae0 6d 6e 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  mns from.  ** th
1eaf0 61 74 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61  at WhereLoop tha
1eb00 74 20 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44  t are in the ORD
1eb10 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65  ER BY clause are
1eb20 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
1eb30 76 65 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66  very.  ** row of
1eb40 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20   the WhereLoop. 
1eb50 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57   Every one-row W
1eb60 68 65 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f  hereLoop is auto
1eb70 6d 61 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f  matically.  ** o
1eb80 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20  rder-distinct.  
1eb90 20 41 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61   A WhereLoop tha
1eba0 74 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73  t has no columns
1ebb0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1ebc0 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20   clause.  ** is 
1ebd0 6e 6f 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e  not order-distin
1ebe0 63 74 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d  ct. To be order-
1ebf0 64 69 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20  distinct is not 
1ec00 71 75 69 74 65 20 74 68 65 20 73 61 6d 65 20 61  quite the same a
1ec10 73 20 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49  s being.  ** UNI
1ec20 51 55 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51  QUE since a UNIQ
1ec30 55 45 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64  UE column or ind
1ec40 65 78 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  ex can have mult
1ec50 69 70 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a  iple rows that .
1ec60 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e    ** are NULL an
1ec70 64 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  d NULL values ar
1ec80 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72  e equivalent for
1ec90 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   the purpose of 
1eca0 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a  order-distinct..
1ecb0 20 20 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72    ** To be order
1ecc0 2d 64 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63  -distinct, the c
1ecd0 6f 6c 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55  olumns must be U
1ece0 4e 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55  NIQUE and NOT NU
1ecf0 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  LL..  **.  ** Th
1ed00 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61  e rowid for a ta
1ed10 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e  ble is always UN
1ed20 49 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c  IQUE and NOT NUL
1ed30 4c 20 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68  L so whenever th
1ed40 65 0a 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70  e.  ** rowid app
1ed50 65 61 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ears in the ORDE
1ed60 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
1ed70 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57   corresponding W
1ed80 68 65 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a  hereLoop is.  **
1ed90 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f   automatically o
1eda0 72 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20  rder-distinct.. 
1edb0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1edc0 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1edd0 69 66 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74  if( nLoop && Opt
1ede0 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65  imizationDisable
1edf0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64  d(db, SQLITE_Ord
1ee00 65 72 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72  erByIdxJoin) ) r
1ee10 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64  eturn 0;..  nOrd
1ee20 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
1ee30 3e 6e 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61  >nExpr;.  testca
1ee40 73 65 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d  se( nOrderBy==BM
1ee50 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72  S-1 );.  if( nOr
1ee60 64 65 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65  derBy>BMS-1 ) re
1ee70 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e  turn 0;  /* Cann
1ee80 6f 74 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72  ot optimize over
1ee90 6c 79 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42  ly large ORDER B
1eea0 59 73 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44  Ys */.  isOrderD
1eeb0 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f  istinct = 1;.  o
1eec0 62 44 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28  bDone = MASKBIT(
1eed0 6e 4f 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f  nOrderBy)-1;.  o
1eee0 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
1eef0 20 3d 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20   = 0;.  ready = 
1ef00 30 3b 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20  0;.  eqOpMask = 
1ef10 57 4f 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20  WO_EQ | WO_IS | 
1ef20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28  WO_ISNULL;.  if(
1ef30 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
1ef40 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
1ef50 54 20 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20  T ) eqOpMask |= 
1ef60 57 4f 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f  WO_IN;.  for(iLo
1ef70 6f 70 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73  op=0; isOrderDis
1ef80 74 69 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f  tinct && obSat<o
1ef90 62 44 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d  bDone && iLoop<=
1efa0 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
1efb0 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30  .    if( iLoop>0
1efc0 20 29 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f   ) ready |= pLoo
1efd0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
1efe0 20 69 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70   if( iLoop<nLoop
1eff0 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20   ){.      pLoop 
1f000 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
1f010 4c 6f 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28  Loop];.      if(
1f020 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
1f030 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
1f040 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  T ) continue;.  
1f050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f060 4c 6f 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Loop = pLast;.  
1f070 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
1f080 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
1f090 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  RE_VIRTUALTABLE 
1f0a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  ){.      if( pLo
1f0b0 6f 70 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64  op->u.vtab.isOrd
1f0c0 65 72 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f  ered ) obSat = o
1f0d0 62 44 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65  bDone;.      bre
1f0e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43  ak;.    }.    iC
1f0f0 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  ur = pWInfo->pTa
1f100 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e  bList->a[pLoop->
1f110 69 54 61 62 5d 2e 69 43 75 72 73 6f 72 3b 0a 0a  iTab].iCursor;..
1f120 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f 66 66 20      /* Mark off 
1f130 61 6e 79 20 4f 52 44 45 52 20 42 59 20 74 65 72  any ORDER BY ter
1f140 6d 20 58 20 74 68 61 74 20 69 73 20 61 20 63 6f  m X that is a co
1f150 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
1f160 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
1f170 63 75 72 72 65 6e 74 20 6c 6f 6f 70 20 66 6f 72  current loop for
1f180 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73 20   which there is 
1f190 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
1f1a0 45 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  E.    ** clause 
1f1b0 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 53  of the form X IS
1f1c0 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f 20 74 68 61   NULL or X=? tha
1f1d0 74 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79  t reference only
1f1e0 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 6c 6f   outer.    ** lo
1f1f0 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ops..    */.    
1f200 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
1f210 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
1f220 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
1f230 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
1f240 75 65 3b 0a 20 20 20 20 20 20 70 4f 42 45 78 70  ue;.      pOBExp
1f250 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
1f260 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65  kipCollate(pOrde
1f270 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  rBy->a[i].pExpr)
1f280 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42 45  ;.      if( pOBE
1f290 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
1f2a0 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  MN ) continue;. 
1f2b0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
1f2c0 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
1f2d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f2e0 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
1f2f0 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 26 70  WhereFindTerm(&p
1f300 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 69 43 75 72  WInfo->sWC, iCur
1f310 2c 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  , pOBExpr->iColu
1f320 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
1f330 20 20 20 20 20 20 20 20 20 20 20 7e 72 65 61 64             ~read
1f340 79 2c 20 65 71 4f 70 4d 61 73 6b 2c 20 30 29 3b  y, eqOpMask, 0);
1f350 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1f360 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1f370 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1f380 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
1f390 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26  EQ|WO_IS))!=0 &&
1f3a0 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
1f3b0 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
1f3c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
1f3d0 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
1f3e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
1f3f0 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
1f400 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1f410 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
1f420 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
1f430 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
1f440 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
1f450 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
1f460 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
1f470 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
1f480 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
1f490 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
1f4a0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1f4b0 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
1f4c0 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
1f4d0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
1f4e0 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
1f4f0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1f500 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
1f510 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
1f520 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1f530 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
1f540 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
1f550 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
1f560 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
1f570 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1f580 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
1f590 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
1f5a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1f5b0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
1f5c0 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
1f5d0 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
1f5e0 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
1f5f0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
1f600 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
1f610 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
1f620 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
1f630 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
1f640 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
1f650 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
1f660 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1f670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f680 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
1f690 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
1f6a0 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
1f6b0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
1f6c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
1f6d0 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
1f6e0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
1f6f0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
1f700 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f710 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1f720 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e  n[nColumn-1]==XN
1f730 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
1f760 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a  ndex->pTable));.
1f770 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
1f780 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71  istinct = IsUniq
1f790 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  ueIndex(pIndex);
1f7a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1f7b0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
1f7c0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
1f7d0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
1f7e0 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
1f7f0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
1f800 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
1f810 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
1f820 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1f830 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
1f840 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
1f850 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
1f860 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
1f870 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
1f880 20 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b     u8 bOnce = 1;
1f890 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
1f8a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
1f8b0 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
1f8c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d       assert( j>=
1f8d0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
1f8e0 45 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Eq .            
1f8f0 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  || (pLoop->aLTer
1f900 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f  m[j]==0)==(j<pLo
1f910 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20  op->nSkip).     
1f920 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1f930 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
1f940 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f  ee.nEq && j>=pLo
1f950 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  op->nSkip ){.   
1f960 20 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d         u16 eOp =
1f970 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
1f980 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20  ]->eOperator;.. 
1f990 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
1f9a0 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
1f9b0 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73  and ISNULL terms
1f9c0 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e  .  (Also skip IN
1f9d0 20 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20   terms when.    
1f9e0 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57        ** doing W
1f9f0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
1fa00 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20  IT processing). 
1fa10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
1fa20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
1fa30 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
1fa40 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  s a column of an
1fa50 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45   ((?,?) IN (SELE
1fa60 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20  CT...)) .       
1fa70 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
1fa80 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53   for which the S
1fa90 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f  ELECT returns mo
1faa0 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
1fab0 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mn,.          **
1fac0 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
1fad0 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d  s the only colum
1fae0 6e 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c  n used by this l
1faf0 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  oop. Otherwise,.
1fb00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
1fb10 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f  it is one of two
1fb20 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f   or more, none o
1fb30 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61  f the columns ca
1fb40 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  n be.          *
1fb50 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
1fb60 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42  match an ORDER B
1fb70 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  Y term.  */.    
1fb80 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
1fb90 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b   eqOpMask)!=0 ){
1fba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fbb0 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
1fbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fbd0 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
1fbe0 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
1fc00 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
1fc10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1fc30 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
1fc40 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20    }else if( eOp 
1fc50 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
1fc60 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
1fc70 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
1fc80 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  j]->pExpr;.     
1fc90 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 2b 31         for(i=j+1
1fca0 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ; i<pLoop->u.btr
1fcb0 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20  ee.nEq; i++){.  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1fcd0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  pLoop->aLTerm[i]
1fce0 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b 0a 20  ->pExpr==pX ){. 
1fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1fd00 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 61  ssert( (pLoop->a
1fd10 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65 72 61  LTerm[i]->eOpera
1fd20 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29 3b 0a  tor & WO_IN) );.
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
1fd50 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1fd60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fd70 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
1fd80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fd90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1fda0 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  * Get the column
1fdb0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
1fdc0 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29 20 61  able (iColumn) a
1fdd0 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a 20 20  nd sort order.  
1fde0 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49 64 78        ** (revIdx
1fdf0 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68 20 63  ) for the j-th c
1fe00 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1fe10 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ex..        */. 
1fe20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
1fe30 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  x ){.          i
1fe40 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d  Column = pIndex-
1fe50 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
1fe60 20 20 20 20 20 20 20 20 72 65 76 49 64 78 20 3d          revIdx =
1fe70 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
1fe80 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
1fe90 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70    if( iColumn==p
1fea0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 69  Index->pTable->i
1feb0 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e 20 3d  PKey ) iColumn =
1fec0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1fed0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 43  se{.          iC
1fee0 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44  olumn = XN_ROWID
1fef0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
1ff00 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dx = 0;.        
1ff10 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
1ff20 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 63   unconstrained c
1ff30 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69 67 68 74  olumn that might
1ff40 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 74   be NULL means t
1ff50 68 61 74 20 74 68 69 73 0a 20 20 20 20 20 20 20  hat this.       
1ff60 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 69 73   ** WhereLoop is
1ff70 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64 65 72 65   not well-ordere
1ff80 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  d.        */.   
1ff90 20 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72       if( isOrder
1ffa0 44 69 73 74 69 6e 63 74 0a 20 20 20 20 20 20 20  Distinct.       
1ffb0 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 0a    && iColumn>=0.
1ffc0 20 20 20 20 20 20 20 20 20 26 26 20 6a 3e 3d 70           && j>=p
1ffd0 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
1ffe0 71 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49  q.         && pI
1fff0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43  ndex->pTable->aC
20000 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f 74 4e  ol[iColumn].notN
20010 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ull==0.        )
20020 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
20030 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
20040 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20050 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
20060 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 74 68  ORDER BY term th
20070 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
20080 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f 6c 75 6d  o the j-th colum
20090 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  n.        ** of 
200a0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6d 61  the index and ma
200b0 72 6b 20 74 68 61 74 20 4f 52 44 45 52 20 42 59  rk that ORDER BY
200c0 20 74 65 72 6d 20 6f 66 66 20 0a 20 20 20 20 20   term off .     
200d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 73     */.        is
200e0 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
200f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 62 4f 6e 63     for(i=0; bOnc
20100 65 20 26 26 20 69 3c 6e 4f 72 64 65 72 42 79 3b  e && i<nOrderBy;
20110 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
20120 20 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20   if( MASKBIT(i) 
20130 26 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e  & obSat ) contin
20140 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ue;.          pO
20150 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
20160 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
20170 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
20180 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
20190 74 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46  testcase( wctrlF
201a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
201b0 55 50 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20  UPBY );.        
201c0 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74 72    testcase( wctr
201d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44  lFlags & WHERE_D
201e0 49 53 54 49 4e 43 54 42 59 20 29 3b 0a 20 20 20  ISTINCTBY );.   
201f0 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74 72         if( (wctr
20200 6c 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  lFlags & (WHERE_
20210 47 52 4f 55 50 42 59 7c 57 48 45 52 45 5f 44 49  GROUPBY|WHERE_DI
20220 53 54 49 4e 43 54 42 59 29 29 3d 3d 30 20 29 20  STINCTBY))==0 ) 
20230 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  bOnce = 0;.     
20240 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
20250 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  >=(-1) ){.      
20260 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70        if( pOBExp
20270 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
20280 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20290 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
202a0 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
202b0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
202c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
202d0 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21  OBExpr->iColumn!
202e0 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69  =iColumn ) conti
202f0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
20300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20310 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
20320 72 43 6f 6d 70 61 72 65 28 70 4f 42 45 78 70 72  rCompare(pOBExpr
20330 2c 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70  ,pIndex->aColExp
20340 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 69 43  r->a[j].pExpr,iC
20350 75 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ur) ){.         
20360 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
20370 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20390 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d     if( iColumn>=
203a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
203b0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
203c0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e  ExprCollSeq(pWIn
203d0 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f 72 64  fo->pParse, pOrd
203e0 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
203f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
20400 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
20410 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
20420 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  l;.            i
20430 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
20440 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
20450 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a  pIndex->azColl[j
20460 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ])!=0 ) continue
20470 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20480 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
20490 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
204a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
204b0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
204c0 74 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61  tch && (wctrlFla
204d0 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
204e0 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  BY)==0 ){.      
204f0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
20500 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
20510 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e  is compatible in
20520 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
20530 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  use..          *
20540 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20  * Sort order is 
20550 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61  irrelevant for a
20560 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
20570 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
20580 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20  f( revSet ){.   
20590 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
205a0 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72  v ^ revIdx)!=pOr
205b0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
205c0 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63 68 20  Order ) isMatch 
205d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
205e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
205f0 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e    rev = revIdx ^
20600 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
20610 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
20620 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29         if( rev )
20630 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41   *pRevMask |= MA
20640 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20  SKBIT(iLoop);.  
20650 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74            revSet
20660 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
20670 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20680 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
20690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
206a0 20 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20   iColumn<0 ){.  
206b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
206c0 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75  se( distinctColu
206d0 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mns==0 );.      
206e0 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
206f0 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  lumns = 1;.     
20700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20710 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42 49   obSat |= MASKBI
20720 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  T(i);.        }e
20730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
20740 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75 6e 64  * No match found
20750 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
20760 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b 65 79  ( j==0 || j<nKey
20770 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
20780 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
20790 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d 30 20  rderDistinct!=0 
207a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
207b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
207c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
207d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
207e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
207f0 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70 20 6f   } /* end Loop o
20800 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20 63 6f  ver all index co
20810 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69  lumns */.      i
20820 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d  f( distinctColum
20830 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ns ){.        te
20840 73 74 63 61 73 65 28 20 69 73 4f 72 64 65 72 44  stcase( isOrderD
20850 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
20860 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
20870 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20 20 20  tinct = 1;.     
20880 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 2d   }.    } /* end-
20890 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77 20 2a  if not one-row *
208a0 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20 6f  /..    /* Mark o
208b0 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f 52 44  ff any other ORD
208c0 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
208d0 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f 6f 70   reference pLoop
208e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 72   */.    if( isOr
208f0 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  derDistinct ){. 
20900 20 20 20 20 20 6f 72 64 65 72 44 69 73 74 69 6e       orderDistin
20910 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f 70 2d  ctMask |= pLoop-
20920 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
20930 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
20940 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
20950 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
20960 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 65       Bitmask mTe
20970 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rm;.        if( 
20980 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
20990 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
209a0 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72 64 65         p = pOrde
209b0 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
209c0 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d 20 3d  .        mTerm =
209d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70   sqlite3WhereExp
209e0 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f 2d 3e  rUsage(&pWInfo->
209f0 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20 20 20  sMaskSet,p);.   
20a00 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d 3d 3d       if( mTerm==
20a10 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  0 && !sqlite3Exp
20a20 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29 20 29  rIsConstant(p) )
20a30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20a40 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26 7e 6f     if( (mTerm&~o
20a50 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b  rderDistinctMask
20a60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
20a70 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b 42    obSat |= MASKB
20a80 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  IT(i);.        }
20a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20aa0 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20 6c 6f   } /* End the lo
20ab0 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68 65 72  op over all Wher
20ac0 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75 74 65  eLoops from oute
20ad0 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f 20 69  r-most down to i
20ae0 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20 20 69  nner-most */.  i
20af0 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f 6e 65  f( obSat==obDone
20b00 20 29 20 72 65 74 75 72 6e 20 28 69 38 29 6e 4f   ) return (i8)nO
20b10 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 21 69  rderBy;.  if( !i
20b20 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29  sOrderDistinct )
20b30 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f 72 64  {.    for(i=nOrd
20b40 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  erBy-1; i>0; i--
20b50 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
20b60 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69 29 20   m = MASKBIT(i) 
20b70 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 28  - 1;.      if( (
20b80 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20 72 65  obSat&m)==m ) re
20b90 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a 20 20  turn i;.    }.  
20ba0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
20bb0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
20bc0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  ./*.** If the WH
20bd0 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
20be0 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 6d   is set in the m
20bf0 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20 73 71  ask passed to sq
20c00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
20c10 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e 6e 65  ),.** the planne
20c20 72 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  r assumes that t
20c30 68 65 20 73 70 65 63 69 66 69 65 64 20 70 4f 72  he specified pOr
20c40 64 65 72 42 79 20 6c 69 73 74 20 69 73 20 61 63  derBy list is ac
20c50 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50 0a 2a  tually a GROUP.*
20c60 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20 61 6e  * BY clause - an
20c70 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72 20 74  d so any order t
20c80 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77 73 20  hat groups rows 
20c90 61 73 20 72 65 71 75 69 72 65 64 20 73 61 74 69  as required sati
20ca0 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72 65 71  sfies the.** req
20cb0 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  uest..**.** Norm
20cc0 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20 63 61  ally, in this ca
20cd0 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
20ce0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 61  sible for the ca
20cf0 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e  ller to determin
20d00 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20  e.** whether or 
20d10 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61 72 65  not the rows are
20d20 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20 64 65   really being de
20d30 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72 74 65  livered in sorte
20d40 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a 20 6a  d order, or.** j
20d50 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ust in some othe
20d60 72 20 6f 72 64 65 72 20 74 68 61 74 20 70 72 6f  r order that pro
20d70 76 69 64 65 73 20 74 68 65 20 72 65 71 75 69 72  vides the requir
20d80 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48 6f 77  ed grouping. How
20d90 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  ever,.** if the 
20da0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
20db0 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20 70  P flag is also p
20dc0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
20dd0 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20 74 68  WhereBegin(), th
20de0 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
20df0 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
20e00 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  d on the returne
20e10 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62 6a 65  d WhereInfo obje
20e20 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73 0a 2a  ct. It returns.*
20e30 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 72 6f  * true if the ro
20e40 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c 20 62  ws really will b
20e50 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68 65 20  e sorted in the 
20e60 73 70 65 63 69 66 69 65 64 20 6f 72 64 65 72 2c  specified order,
20e70 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f 74 68   or false.** oth
20e80 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  erwise..**.** Fo
20e90 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  r example, assum
20ea0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ing:.**.**   CRE
20eb0 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
20ec0 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a 2a 20  t1(x, Y);.**.** 
20ed0 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  then.**.**   SEL
20ee0 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 47 52  ECT * FROM t1 GR
20ef0 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44 45 52  OUP BY x,y ORDER
20f00 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20 49 73   BY x,y;   -- Is
20f10 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a 20 20  Sorted()==1.**  
20f20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
20f30 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78 20 4f  1 GROUP BY y,x O
20f40 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20 20 2d  RDER BY y,x;   -
20f50 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 30 0a  - IsSorted()==0.
20f60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68  */.int sqlite3Wh
20f70 65 72 65 49 73 53 6f 72 74 65 64 28 57 68 65 72  ereIsSorted(Wher
20f80 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a  eInfo *pWInfo){.
20f90 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
20fa0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
20fb0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
20fc0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
20fd0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
20fe0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
20ff0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
21000 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d 0a 0a  nfo->sorted;.}..
21010 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
21020 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46 6f 72  E_ENABLED./* For
21030 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f   debugging use o
21040 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63 20 63  nly: */.static c
21050 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65 72 65  onst char *where
21060 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65 50 61  PathName(WherePa
21070 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74 20 6e  th *pPath, int n
21080 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  Loop, WhereLoop 
21090 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61 74 69  *pLast){.  stati
210a0 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36 35 5d  c char zName[65]
210b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
210c0 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b 20 69  (i=0; i<nLoop; i
210d0 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  ++){ zName[i] = 
210e0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 5d 2d  pPath->aLoop[i]-
210f0 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20 70 4c  >cId; }.  if( pL
21100 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b 2b 5d  ast ) zName[i++]
21110 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b 0a 20   = pLast->cId;. 
21120 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b 0a 20   zName[i] = 0;. 
21130 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
21140 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
21150 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
21160 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77 20 72  f sorting nRow r
21170 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  ows, assuming th
21180 61 74 20 74 68 65 20 6b 65 79 73 20 68 61 76 65  at the keys have
21190 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20 63 6f   .** nOrderby co
211a0 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74 20 74  lumns and that t
211b0 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74 65 64  he first nSorted
211c0 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 6c 72   columns are alr
211d0 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  eady in.** order
211e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
211f0 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e 67 43  st whereSortingC
21200 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f  ost(.  WhereInfo
21210 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f 67 45   *pWInfo,.  LogE
21220 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74 20 6e  st nRow,.  int n
21230 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74 20 6e  OrderBy,.  int n
21240 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a 20 54  Sorted.){.  /* T
21250 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74 65 64  UNING: Estimated
21260 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20   cost of a full 
21270 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c 20 77  external sort, w
21280 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a 2a 20  here N is .  ** 
21290 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
212a0 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a 0a 20  ws to sort is:. 
212b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20   **.  **   cost 
212c0 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67  = (3.0 * N * log
212d0 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2a  (N))..  ** .  **
212e0 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72 64 65   Or, if the orde
212f0 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61 73 20  r-by clause has 
21300 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e 6c 79  X terms but only
21310 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20 20 2a   the last Y .  *
21320 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75 74 20  * terms are out 
21330 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 62  of order, then b
21340 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77 69 6c  lock-sorting wil
21350 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a 20 20  l reduce the .  
21360 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 20  ** sorting cost 
21370 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
21380 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20  cost = (3.0 * N 
21390 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59 2f 58  * log(N)) * (Y/X
213a0 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ).  **.  ** The 
213b0 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20 69 6d  (Y/X) term is im
213c0 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
213d0 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 72  stack variable r
213e0 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c 6f 77  Scale.  ** below
213f0 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  .  */.  LogEst r
21400 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f 73 74  Scale, rSortCost
21410 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64  ;.  assert( nOrd
21420 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d 73 71  erBy>0 && 66==sq
21430 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
21440 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d 20 73   );.  rScale = s
21450 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 6e 4f  qlite3LogEst((nO
21460 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64 29 2a  rderBy-nSorted)*
21470 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20 2d 20  100/nOrderBy) - 
21480 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73 74 20  66;.  rSortCost 
21490 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c 65 20  = nRow + rScale 
214a0 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75 6c 74  + 16;..  /* Mult
214b0 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29 20 77  iple by log(M) w
214c0 68 65 72 65 20 4d 20 69 73 20 74 68 65 20 6e 75  here M is the nu
214d0 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
214e0 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68  ows..  ** Use th
214f0 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20 69 66  e LIMIT for M if
21500 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 2a   it is smaller *
21510 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d  /.  if( (pWInfo-
21520 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
21530 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 21 3d  ERE_USE_LIMIT)!=
21540 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69 4c 69  0 && pWInfo->iLi
21550 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20 20 20  mit<nRow ){.    
21560 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d 3e 69  nRow = pWInfo->i
21570 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 53 6f  Limit;.  }.  rSo
21580 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c 6f 67  rtCost += estLog
21590 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75 72 6e  (nRow);.  return
215a0 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a 0a 2f   rSortCost;.}../
215b0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6c  *.** Given the l
215c0 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ist of WhereLoop
215d0 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57 49 6e   objects at pWIn
215e0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68 69 73  fo->pLoops, this
215f0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74 74 65   routine.** atte
21600 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74 68 65  mpts to find the
21610 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
21620 68 20 74 68 61 74 20 76 69 73 69 74 73 20 65 61  h that visits ea
21630 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a 2a 20  ch WhereLoop.** 
21640 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61 74 68  once.  This path
21650 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65 64 20   is then loaded 
21660 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66 6f 2d  into the pWInfo-
21670 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69 65 6c  >a[].pWLoop fiel
21680 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75 6d 65  ds..**.** Assume
21690 20 74 68 61 74 20 74 68 65 20 74 6f 74 61 6c 20   that the total 
216a0 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
216b0 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20   rows that will 
216c0 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72 74 65  need to be sorte
216d0 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e 52 6f  d.** will be nRo
216e0 77 45 73 74 20 28 69 6e 20 74 68 65 20 31 30 2a  wEst (in the 10*
216f0 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74 61 74  log2 representat
21700 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e 6f 72  ion).  Or, ignor
21710 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63 6f 73  e sorting.** cos
21720 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d 3d 30  ts if nRowEst==0
21730 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
21740 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
21750 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  ess or SQLITE_NO
21760 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72 79 20  MEM of a memory 
21770 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 65 72  allocation.** er
21780 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
21790 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 50  tatic int whereP
217a0 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72 65 49  athSolver(WhereI
217b0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c 6f 67  nfo *pWInfo, Log
217c0 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a 20 20  Est nRowEst){.  
217d0 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20 20 20  int mxChoice;   
217e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
217f0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
21800 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61 74 68  imultaneous path
21810 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20 20 69  s tracked */.  i
21820 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20 20 20  nt nLoop;       
21830 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21840 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
21850 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50 61 72  he join */.  Par
21860 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
21870 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
21880 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73  g context */.  s
21890 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
218a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
218b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
218c0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ion */.  int iLo
218d0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
218e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
218f0 65 72 20 6f 76 65 72 20 74 68 65 20 74 65 72 6d  er over the term
21900 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
21910 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 20 20  .  int ii, jj;  
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21930 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
21940 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30 3b 20  .  int mxI = 0; 
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21960 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 65 6e  Index of next en
21970 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65 20 2a  try to replace *
21980 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  /.  int nOrderBy
21990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
219a0 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
219b0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
219c0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78 43   */.  LogEst mxC
219d0 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ost = 0;        
219e0 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73 74 20  /* Maximum cost 
219f0 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61 74 68  of a set of path
21a00 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d 78  s */.  LogEst mx
21a10 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20 20 20  Unsorted = 0;   
21a20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e 73 6f   /* Maximum unso
21a30 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 73  rted cost of a s
21a40 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a 20 20  et of path */.  
21a50 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d 3b 20  int nTo, nFrom; 
21a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21a70 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65 6e 74  ber of valid ent
21a80 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20 61 6e  ries in aTo[] an
21a90 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20 20 57  d aFrom[] */.  W
21aa0 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f 6d 3b  herePath *aFrom;
21ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
21ac0 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74 20 74  nFrom paths at t
21ad0 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65 76 65  he previous leve
21ae0 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  l */.  WherePath
21af0 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20 20 20   *aTo;          
21b00 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65 73 74   /* The nTo best
21b10 20 70 61 74 68 73 20 61 74 20 74 68 65 20 63 75   paths at the cu
21b20 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  rrent level */. 
21b30 20 57 68 65 72 65 50 61 74 68 20 2a 70 46 72 6f   WherePath *pFro
21b40 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  m;         /* An
21b50 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46 72 6f   element of aFro
21b60 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20  m[] that we are 
21b70 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20  working on */.  
21b80 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f 3b 20  WherePath *pTo; 
21b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
21ba0 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f 5b 5d  element of aTo[]
21bb0 20 74 68 61 74 20 77 65 20 61 72 65 20 77 6f 72   that we are wor
21bc0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57 68 65  king on */.  Whe
21bd0 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70 3b 20  reLoop *pWLoop; 
21be0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
21bf0 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f   the WhereLoop o
21c00 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68 65 72  bjects */.  Wher
21c10 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20 20 20  eLoop **pX;     
21c20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
21c30 20 64 69 76 79 20 75 70 20 74 68 65 20 70 53 70   divy up the pSp
21c40 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  ace memory */.  
21c50 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43 6f 73  LogEst *aSortCos
21c60 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 6f 72  t = 0;    /* Sor
21c70 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69 61 6c  ting and partial
21c80 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73 20 2a   sorting costs *
21c90 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
21ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21cb0 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d 6f 72   Temporary memor
21cc0 79 20 75 73 65 64 20 62 79 20 74 68 69 73 20 72  y used by this r
21cd0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
21ce0 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  nSpace;         
21cf0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
21d00 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
21d10 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f 0a 0a  d at pSpace */..
21d20 20 20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66    pParse = pWInf
21d30 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20  o->pParse;.  db 
21d40 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
21d50 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e  nLoop = pWInfo->
21d60 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54 55 4e  nLevel;.  /* TUN
21d70 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c 65 20  ING: For simple 
21d80 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20 74 68  queries, only th
21d90 65 20 62 65 73 74 20 70 61 74 68 20 69 73 20 74  e best path is t
21da0 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46 6f 72  racked..  ** For
21db0 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20 74 68   2-way joins, th
21dc0 65 20 35 20 62 65 73 74 20 70 61 74 68 73 20 61  e 5 best paths a
21dd0 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20 20 2a  re followed..  *
21de0 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66 20 33  * For joins of 3
21df0 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65 73 2c   or more tables,
21e00 20 74 72 61 63 6b 20 74 68 65 20 31 30 20 62 65   track the 10 be
21e10 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20 6d 78  st paths */.  mx
21e20 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f 70 3c  Choice = (nLoop<
21e30 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f 6f 70  =1) ? 1 : (nLoop
21e40 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b 0a 20  ==2 ? 5 : 10);. 
21e50 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70 3c 3d   assert( nLoop<=
21e60 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
21e70 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48 45 52  ->nSrc );.  WHER
21e80 45 54 52 41 43 45 28 30 78 30 30 32 2c 20 28 22  ETRACE(0x002, ("
21e90 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c 76 65  ---- begin solve
21ea0 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25 64 29  r.  (nRowEst=%d)
21eb0 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a  \n", nRowEst));.
21ec0 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45 73 74  .  /* If nRowEst
21ed0 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
21ee0 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
21ef0 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f 72 65  Y clause, ignore
21f00 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20 20 2a   it. In this.  *
21f10 2a 20 63 61 73 65 20 74 68 65 20 70 75 72 70 6f  * case the purpo
21f20 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20  se of this call 
21f30 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74  is to estimate t
21f40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
21f50 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  s returned.  ** 
21f60 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 71  by the overall q
21f70 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69 73 20  uery. Once this 
21f80 65 73 74 69 6d 61 74 65 20 68 61 73 20 62 65 65  estimate has bee
21f90 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 20  n obtained, the 
21fa0 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69 6c 6c  caller.  ** will
21fb0 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66 75 6e   invoke this fun
21fc0 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64 20 74  ction a second t
21fd0 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74 68 65  ime, passing the
21fe0 20 65 73 74 69 6d 61 74 65 20 61 73 20 74 68 65   estimate as the
21ff0 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20 70 61  .  ** nRowEst pa
22000 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20 20 69  rameter.  */.  i
22010 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  f( pWInfo->pOrde
22020 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77 45 73  rBy==0 || nRowEs
22030 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f 72 64  t==0 ){.    nOrd
22040 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  erBy = 0;.  }els
22050 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  e{.    nOrderBy 
22060 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  = pWInfo->pOrder
22070 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 0a  By->nExpr;.  }..
22080 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
22090 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 70 61  d initialize spa
220a0 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46 72 6f  ce for aTo, aFro
220b0 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73 74 5b  m and aSortCost[
220c0 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20 3d 20  ] */.  nSpace = 
220d0 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50 61 74  (sizeof(WherePat
220e0 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  h)+sizeof(WhereL
220f0 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d 78 43  oop*)*nLoop)*mxC
22100 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70 61 63  hoice*2;.  nSpac
22110 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  e += sizeof(LogE
22120 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 3b 0a  st) * nOrderBy;.
22130 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74    pSpace = sqlit
22140 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
22150 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  db, nSpace);.  i
22160 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29 20 72  f( pSpace==0 ) r
22170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22180 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f 20 3d  EM_BKPT;.  aTo =
22190 20 28 57 68 65 72 65 50 61 74 68 2a 29 70 53 70   (WherePath*)pSp
221a0 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d 20 61  ace;.  aFrom = a
221b0 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20 20 6d  To+mxChoice;.  m
221c0 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30 2c 20  emset(aFrom, 0, 
221d0 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30 5d 29  sizeof(aFrom[0])
221e0 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65 72 65  );.  pX = (Where
221f0 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b 6d 78  Loop**)(aFrom+mx
22200 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72 28 69  Choice);.  for(i
22210 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20 70 46  i=mxChoice*2, pF
22220 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b 20 69  rom=aTo; ii>0; i
22230 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20 70 58  i--, pFrom++, pX
22240 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20 20 20   += nLoop){.    
22250 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d 20 70  pFrom->aLoop = p
22260 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 72  X;.  }.  if( nOr
22270 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a 20  derBy ){.    /* 
22280 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
22290 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
222a0 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62 65 69  nd it is not bei
222b0 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65 74 20  ng ignored, set 
222c0 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  up.    ** space 
222d0 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43 6f 73  for the aSortCos
222e0 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63 68 20  t[] array. Each 
222f0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 61  element of the a
22300 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79 0a 20  SortCost array. 
22310 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
22320 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67 20 69  zero - meaning i
22330 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
22340 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2d  en initialized -
22350 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   or the.    ** c
22360 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e  ost of sorting n
22370 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66 20 64  RowEst rows of d
22380 61 74 61 20 77 68 65 72 65 20 74 68 65 20 66 69  ata where the fi
22390 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66 0a 20  rst X terms of. 
223a0 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20     ** the ORDER 
223b0 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c  BY clause are al
223c0 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72 2c 20  ready in order, 
223d0 77 68 65 72 65 20 58 20 69 73 20 74 68 65 20 61  where X is the a
223e0 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69 6e 64  rray .    ** ind
223f0 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53 6f 72  ex.  */.    aSor
22400 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a  tCost = (LogEst*
22410 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  )pX;.    memset(
22420 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20 73 69  aSortCost, 0, si
22430 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e  zeof(LogEst) * n
22440 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20  OrderBy);.  }.  
22450 61 73 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73  assert( aSortCos
22460 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b  t==0 || &pSpace[
22470 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29  nSpace]==(char*)
22480 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72 64 65  &aSortCost[nOrde
22490 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  rBy] );.  assert
224a0 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30 20 7c  ( aSortCost!=0 |
224b0 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65  | &pSpace[nSpace
224c0 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29 3b 0a  ]==(char*)pX );.
224d0 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65 20 73  .  /* Seed the s
224e0 65 61 72 63 68 20 77 69 74 68 20 61 20 73 69 6e  earch with a sin
224f0 67 6c 65 20 57 68 65 72 65 50 61 74 68 20 63 6f  gle WherePath co
22500 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20 57 68  ntaining zero Wh
22510 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a 0a 20  ereLoops..  **. 
22520 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f 20 6e   ** TUNING: Do n
22530 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d 62 65  ot let the numbe
22540 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20  r of iterations 
22550 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20 49 66  go above 28.  If
22560 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a 20 6f   the cost.  ** o
22570 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 61  f computing an a
22580 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69  utomatic index i
22590 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63 6b 20  s not paid back 
225a0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
225b0 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c 20 74   28.  ** rows, t
225c0 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hen do not use t
225d0 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
225e0 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d 5b 30  ex. */.  aFrom[0
225f0 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70 50 61  ].nRow = MIN(pPa
22600 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 2c  rse->nQueryLoop,
22610 20 34 38 29 3b 20 20 61 73 73 65 72 74 28 20 34   48);  assert( 4
22620 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  8==sqlite3LogEst
22630 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f 6d 20  (28) );.  nFrom 
22640 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 61  = 1;.  assert( a
22650 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65  From[0].isOrdere
22660 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4f  d==0 );.  if( nO
22670 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f 2a  rderBy ){.    /*
22680 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a 65 72   If nLoop is zer
22690 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20 61 72  o, then there ar
226a0 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d 73 20  e no FROM terms 
226b0 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20 53 69  in the query. Si
226c0 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  nce.    ** in th
226d0 69 73 20 63 61 73 65 20 74 68 65 20 71 75 65 72  is case the quer
226e0 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61 20 6d  y may return a m
226f0 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 72 6f  aximum of one ro
22700 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  w, the results. 
22710 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65 61 64     ** are alread
22720 79 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  y in the request
22730 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20 69 73  ed order. Set is
22740 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72 64 65  Ordered to nOrde
22750 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e  rBy to.    ** in
22760 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f 72 2c  dicate this. Or,
22770 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67 72 65   if nLoop is gre
22780 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
22790 73 65 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f  set isOrdered to
227a0 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e 64 69  .    ** -1, indi
227b0 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20  cating that the 
227c0 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79 20 6f  result set may o
227d0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 72 64  r may not be ord
227e0 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20 64 65  ered, .    ** de
227f0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 6c  pending on the l
22800 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20 74 68  oops added to th
22810 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e 2e 20  e current plan. 
22820 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b 30 5d   */.    aFrom[0]
22830 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e 4c 6f  .isOrdered = nLo
22840 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f 72 64  op>0 ? -1 : nOrd
22850 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  erBy;.  }..  /* 
22860 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 69  Compute successi
22870 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68 65 72  vely longer Wher
22880 65 50 61 74 68 73 20 75 73 69 6e 67 20 74 68 65  ePaths using the
22890 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65 72 61   previous genera
228a0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57 68 65  tion.  ** of Whe
228b0 72 65 50 61 74 68 73 20 61 73 20 74 68 65 20 62  rePaths as the b
228c0 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e 65 78  asis for the nex
228d0 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f  t.  Keep track o
228e0 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20  f the mxChoice. 
228f0 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73 20 61   ** best paths a
22900 74 20 65 61 63 68 20 67 65 6e 65 72 61 74 69 6f  t each generatio
22910 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  n */.  for(iLoop
22920 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b  =0; iLoop<nLoop;
22930 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 6e   iLoop++){.    n
22940 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  To = 0;.    for(
22950 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46 72 6f  ii=0, pFrom=aFro
22960 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b  m; ii<nFrom; ii+
22970 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
22980 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d 70 57     for(pWLoop=pW
22990 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20 70 57  Info->pLoops; pW
229a0 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70 57 4c  Loop; pWLoop=pWL
229b0 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  oop->pNextLoop){
229c0 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20  .        LogEst 
229d0 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nOut;           
229e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
229f0 77 73 20 76 69 73 69 74 65 64 20 62 79 20 28 70  ws visited by (p
22a00 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
22a10 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72          LogEst r
22a20 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cost;           
22a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
22a40 74 20 6f 66 20 70 61 74 68 20 28 70 46 72 6f 6d  t of path (pFrom
22a50 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
22a60 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e 73 6f      LogEst rUnso
22a70 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
22a80 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72 74 65        /* Unsorte
22a90 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72 6f 6d  d cost of (pFrom
22aa0 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20  +pWLoop) */.    
22ab0 20 20 20 20 69 38 20 69 73 4f 72 64 65 72 65 64      i8 isOrdered
22ac0 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65   = pFrom->isOrde
22ad0 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64 65 72  red;  /* isOrder
22ae0 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b 70 57  ed for (pFrom+pW
22af0 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20  Loop) */.       
22b00 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e 65 77   Bitmask maskNew
22b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22b20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 72     /* Mask of sr
22b30 63 20 76 69 73 69 74 65 64 20 62 79 20 28 2e 2e  c visited by (..
22b40 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42 69 74  ) */.        Bit
22b50 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30  mask revMask = 0
22b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22b70 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d 6f 72  * Mask of rev-or
22b80 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20 28 2e  der loops for (.
22b90 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 69  .) */..        i
22ba0 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72 65 72  f( (pWLoop->prer
22bb0 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d 61 73  eq & ~pFrom->mas
22bc0 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
22bd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
22be0 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  ( (pWLoop->maskS
22bf0 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d 61 73  elf & pFrom->mas
22c00 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f 6e 74  kLoop)!=0 ) cont
22c10 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
22c20 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ( (pWLoop->wsFla
22c30 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
22c40 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 46 72  INDEX)!=0 && pFr
22c50 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b 0a 20  om->nRow<10 ){. 
22c60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
22c70 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f 6d 61  ot use an automa
22c80 74 69 63 20 69 6e 64 65 78 20 69 66 20 74 68 65  tic index if the
22c90 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 65 78   this loop is ex
22ca0 70 65 63 74 65 64 0a 20 20 20 20 20 20 20 20 20  pected.         
22cb0 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73 73 20   ** to run less 
22cc0 74 68 61 6e 20 32 20 74 69 6d 65 73 2e 20 2a 2f  than 2 times. */
22cd0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22ce0 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 10==sqlite3Lo
22cf0 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20 20 20  gEst(2) );.     
22d00 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
22d10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
22d30 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 63  t, pWLoop is a c
22d40 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
22d50 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20 0a 20  he next loop. . 
22d60 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70 75 74         ** Comput
22d70 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a 20 20  e its cost */.  
22d80 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
22d90 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
22da0 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65 74 75  dd(pWLoop->rSetu
22db0 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e 20 2b  p,pWLoop->rRun +
22dc0 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b 0a 20   pFrom->nRow);. 
22dd0 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64         rUnsorted
22de0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
22df0 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 70  Add(rUnsorted, p
22e00 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65 64 29  From->rUnsorted)
22e10 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d  ;.        nOut =
22e20 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b 20 70   pFrom->nRow + p
22e30 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 20  WLoop->nOut;.   
22e40 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d 20 70       maskNew = p
22e50 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
22e60 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
22e70 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  f;.        if( i
22e80 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a 20 20  sOrdered<0 ){.  
22e90 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65          isOrdere
22ea0 64 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74  d = wherePathSat
22eb0 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57  isfiesOrderBy(pW
22ec0 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
22ee0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70  nfo->pOrderBy, p
22ef0 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e 77 63  From, pWInfo->wc
22f00 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  trlFlags,.      
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 2c 20   iLoop, pWLoop, 
22f30 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20 20 20  &revMask);.     
22f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22f50 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20 70 46      revMask = pF
22f60 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20  rom->revLoop;.  
22f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22f80 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e 3d 30  if( isOrdered>=0
22f90 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c 6e 4f   && isOrdered<nO
22fa0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
22fb0 20 20 20 20 69 66 28 20 61 53 6f 72 74 43 6f 73      if( aSortCos
22fc0 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d 30 20  t[isOrdered]==0 
22fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
22fe0 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72  SortCost[isOrder
22ff0 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72 74 69  ed] = whereSorti
23000 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20 20 20  ngCost(.        
23010 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2c 20          pWInfo, 
23020 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65 72 42  nRowEst, nOrderB
23030 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20 20 20  y, isOrdered.   
23040 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
23050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23060 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69 74 65    rCost = sqlite
23070 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73 6f  3LogEstAdd(rUnso
23080 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73 74 5b  rted, aSortCost[
23090 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a 20 20  isOrdered]);..  
230a0 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52 41          WHERETRA
230b0 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20 20 20  CE(0x002,.      
230c0 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d 20 73          ("---- s
230d0 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20 28 25  ort cost=%-3d (%
230e0 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65 73 20  d/%d) increases 
230f0 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d 33 64  cost %3d to %-3d
23100 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23110 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73      aSortCost[is
23120 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72 64 65  Ordered], (nOrde
23130 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29 2c 20  rBy-isOrdered), 
23140 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20 20 20  nOrderBy, .     
23150 20 20 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72            rUnsor
23160 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a 20 20  ted, rCost));.  
23170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23180 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 72         rCost = r
23190 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20 20 20  Unsorted;.      
231a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
231b0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
231c0 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20 62 65  pWLoop should be
231d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65   added to the se
231e0 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t of.        ** 
231f0 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d 73 6f  mxChoice best-so
23200 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20 20 20  -far paths..    
23210 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
23220 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66 6f 72  * First look for
23230 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 74   an existing pat
23240 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73 6f 2d  h among best-so-
23250 66 61 72 20 70 61 74 68 73 0a 20 20 20 20 20 20  far paths.      
23260 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65 72 73    ** that covers
23270 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
23280 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73 20 74   loops and has t
23290 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65 72 65  he same isOrdere
232a0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  d.        ** set
232b0 74 69 6e 67 20 61 73 20 74 68 65 20 63 75 72 72  ting as the curr
232c0 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69 64 61  ent path candida
232d0 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  te..        **. 
232e0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 65         ** The te
232f0 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f 72 64  rm "((pTo->isOrd
23300 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26  ered^isOrdered)&
23310 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65 71 75  0x80)==0" is equ
23320 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20  ivalent.        
23330 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73 4f 72  ** to (pTo->isOr
23340 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d 28 69  dered==(-1))==(i
23350 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 22  sOrdered==(-1))"
23360 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65 0a 20   for the range. 
23370 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c 65 67         ** of leg
23380 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 69 73  al values for is
23390 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36 34 2e  Ordered, -1..64.
233a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
233b0 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20 70 54      for(jj=0, pT
233c0 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b 20 6a  o=aTo; jj<nTo; j
233d0 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20  j++, pTo++){.   
233e0 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e         if( pTo->
233f0 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b 4e 65  maskLoop==maskNe
23400 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
23410 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64  ((pTo->isOrdered
23420 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78 38 30  ^isOrdered)&0x80
23430 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 29  )==0.          )
23440 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
23450 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54 6f 2d  stcase( jj==nTo-
23460 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1 );.           
23470 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23480 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
23490 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d 6e 54        if( jj>=nT
234a0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  o ){.          /
234b0 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 65 78  * None of the ex
234c0 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f 2d 66  isting best-so-f
234d0 61 72 20 70 61 74 68 73 20 6d 61 74 63 68 20 74  ar paths match t
234e0 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f  he candidate. */
234f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
23500 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20 20 20  To>=mxChoice.   
23510 20 20 20 20 20 20 20 20 26 26 20 28 72 43 6f 73          && (rCos
23520 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72 43 6f  t>mxCost || (rCo
23530 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20 72 55  st==mxCost && rU
23540 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73 6f 72  nsorted>=mxUnsor
23550 74 65 64 29 29 0a 20 20 20 20 20 20 20 20 20 20  ted)).          
23560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
23570 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 61  * The current ca
23580 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20 62 65  ndidate is no be
23590 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20 6f 66  tter than any of
235a0 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a 20 20   the mxChoice.  
235b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 74            ** pat
235c0 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  hs currently in 
235d0 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61 72 20  the best-so-far 
235e0 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69 73 63  buffer.  So disc
235f0 61 72 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ard.            
23600 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64 61 74  ** this candidat
23610 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c 65 2e  e as not viable.
23620 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52 45   */.#ifdef WHERE
23630 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
23640 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
23650 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
23660 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
23670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
23680 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23690 66 28 22 53 6b 69 70 20 20 20 25 73 20 63 6f 73  f("Skip   %s cos
236a0 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
236b0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
236c0 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
236d0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
236e0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
236f0 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20 20  Cost, nOut,.    
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
23710 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f  Ordered>=0 ? isO
23720 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
23730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
23740 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
23750 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
23760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23770 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61      /* If we rea
23780 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20 69  ch this points i
23790 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
237a0 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20 70   new candidate p
237b0 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ath.          **
237c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 64   needs to be add
237d0 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66  ed to the set of
237e0 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
237f0 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  hs. */.         
23800 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69 63   if( nTo<mxChoic
23810 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
23820 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
23830 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54 6f   size of the aTo
23840 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a 20   set by one */. 
23850 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20             jj = 
23860 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  nTo++;.         
23870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23880 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68 20      /* New path 
23890 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72 69  replaces the pri
238a0 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65 70  or worst to keep
238b0 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78 43   count below mxC
238c0 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  hoice */.       
238d0 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a 20       jj = mxI;. 
238e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
238f0 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f 5b       pTo = &aTo[
23900 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45 52  jj];.#ifdef WHER
23910 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
23920 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
23930 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
23940 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
23950 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23960 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23970 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d 25  New    %s cost=%
23980 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63  -3d,%3d order=%c
23990 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
239a0 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
239b0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
239c0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
239d0 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
239e0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
239f0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
23a00 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
23a10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
23a20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23a30 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
23a40 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
23a50 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  if best-so-far p
23a60 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20  ath pTo=aTo[jj] 
23a70 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20  covers the.     
23a80 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74       ** same set
23a90 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
23aa0 73 20 74 68 65 20 73 61 6d 20 69 73 4f 72 64 65  s the sam isOrde
23ab0 72 65 64 20 73 65 74 74 69 6e 67 20 61 73 20 74  red setting as t
23ac0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
23ad0 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e 20  candidate path. 
23ae0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23af0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 73   the candidate s
23b00 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20 20  hould replace.  
23b10 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 6f          ** pTo o
23b20 72 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  r if the candida
23b30 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b 69  te should be ski
23b40 70 70 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  pped */.        
23b50 20 20 69 66 28 20 70 54 6f 2d 3e 72 43 6f 73 74    if( pTo->rCost
23b60 3c 72 43 6f 73 74 20 7c 7c 20 28 70 54 6f 2d 3e  <rCost || (pTo->
23b70 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 26 26 20  rCost==rCost && 
23b80 70 54 6f 2d 3e 6e 52 6f 77 3c 3d 6e 4f 75 74 29  pTo->nRow<=nOut)
23b90 20 29 7b 0a 23 69 66 64 65 66 20 57 48 45 52 45   ){.#ifdef WHERE
23ba0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a  TRACE_ENABLED /*
23bb0 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20 20   0x4 */.        
23bc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
23bd0 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
23be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
23bf0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
23c00 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f(.             
23c10 20 20 20 20 20 22 53 6b 69 70 20 20 20 25 73 20       "Skip   %s 
23c20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72  cost=%-3d,%3d or
23c30 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20  der=%c",.       
23c40 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
23c50 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20  PathName(pFrom, 
23c60 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20  iLoop, pWLoop), 
23c70 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20 20 20  rCost, nOut,.   
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23c90 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
23ca0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
23cb0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
23cc0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23cd0 69 6e 74 66 28 22 20 20 20 76 73 20 25 73 20 63  intf("   vs %s c
23ce0 6f 73 74 3d 25 2d 33 64 2c 25 64 20 6f 72 64 65  ost=%-3d,%d orde
23cf0 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  r=%c\n",.       
23d00 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
23d10 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
23d20 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
23d30 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
23d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23d50 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72      pTo->isOrder
23d60 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f  ed>=0 ? pTo->isO
23d70 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27  rdered+'0' : '?'
23d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
23d90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
23da0 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
23db0 68 65 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  he candidate pat
23dc0 68 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63  h from further c
23dd0 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a  onsideration */.
23de0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
23df0 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74  case( pTo->rCost
23e00 3d 3d 72 43 6f 73 74 20 29 3b 0a 20 20 20 20 20  ==rCost );.     
23e10 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
23e20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23e30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23e40 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f   pTo->rCost==rCo
23e50 73 74 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  st+1 );.        
23e60 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61    /* Control rea
23e70 63 68 65 73 20 68 65 72 65 20 69 66 20 74 68 65  ches here if the
23e80 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20   candidate path 
23e90 69 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  is better than t
23ea0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
23eb0 70 54 6f 20 70 61 74 68 2e 20 20 52 65 70 6c 61  pTo path.  Repla
23ec0 63 65 20 70 54 6f 20 77 69 74 68 20 74 68 65 20  ce pTo with the 
23ed0 63 61 6e 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69  candidate. */.#i
23ee0 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f  fdef WHERETRACE_
23ef0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a  ENABLED /* 0x4 *
23f00 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
23f10 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
23f20 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
23f30 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
23f40 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  gPrintf(.       
23f50 20 20 20 20 20 20 20 20 20 22 55 70 64 61 74 65           "Update
23f60 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33   %s cost=%-3d,%3
23f70 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20 20  d order=%c",.   
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
23f90 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
23fa0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
23fb0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23fd0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
23fe0 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
23ff0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
24000 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
24010 74 66 28 22 20 20 77 61 73 20 25 73 20 63 6f 73  tf("  was %s cos
24020 74 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72  t=%-3d,%3d order
24030 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
24040 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
24050 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
24060 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
24070 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24090 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
240a0 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
240b0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
240c0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
240d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
240e0 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
240f0 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
24100 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
24110 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
24120 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
24130 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
24140 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
24150 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
24160 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
24170 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
24180 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e     pTo->nRow = n
24190 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
241a0 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
241b0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55  .        pTo->rU
241c0 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72  nsorted = rUnsor
241d0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ted;.        pTo
241e0 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
241f0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
24200 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
24210 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
24220 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
24230 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
24240 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
24250 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
24260 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
24270 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
24280 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b          mxI = 0;
24290 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
242a0 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
242b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e  ;.          mxUn
242c0 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e  sorted = aTo[0].
242d0 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
242e0 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
242f0 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
24300 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
24310 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
24320 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
24330 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
24340 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74    || (pTo->rCost
24350 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
24360 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73  >rUnsorted>mxUns
24370 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20  orted) .        
24380 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
24390 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54       mxCost = pT
243a0 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  o->rCost;.      
243b0 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
243c0 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  ed = pTo->rUnsor
243d0 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ted;.           
243e0 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20     mxI = jj;.   
243f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
24410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24420 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
24430 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d  E_ENABLED  /* >=
24440 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  2 */.    if( sql
24450 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
24460 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73   0x02 ){.      s
24470 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
24480 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f  f("---- after ro
24490 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20  und %d ----\n", 
244a0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f  iLoop);.      fo
244b0 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(ii=0, pTo=aTo;
244c0 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70   ii<nTo; ii++, p
244d0 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  To++){.        s
244e0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
244f0 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  f(" %s cost=%-3d
24500 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72   nrow=%-3d order
24510 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
24520 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
24530 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
24540 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
24550 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
24560 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
24570 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  d>=0 ? (pTo->isO
24580 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f  rdered+'0') : '?
24590 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
245a0 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30  pTo->isOrdered>0
245b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
245c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
245d0 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
245e0 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
245f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
24600 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24610 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
24620 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
24630 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
24640 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
24650 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
24660 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
24670 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
24680 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
24690 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
246a0 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
246b0 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
246c0 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
246d0 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
246e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
246f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24700 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
24710 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
24720 44 62 46 72 65 65 28 64 62 2c 20 70 53 70 61 63  DbFree(db, pSpac
24730 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
24740 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
24750 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  .  .  /* Find th
24760 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61  e lowest cost pa
24770 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20  th.  pFrom will 
24780 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  be left pointing
24790 20 74 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f   to that path */
247a0 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d  .  pFrom = aFrom
247b0 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
247c0 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20  <nFrom; ii++){. 
247d0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43     if( pFrom->rC
247e0 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43  ost>aFrom[ii].rC
247f0 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61  ost ) pFrom = &a
24800 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20  From[ii];.  }.  
24810 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
24820 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b  nLevel==nLoop );
24830 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c  .  /* Load the l
24840 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 20  owest cost path 
24850 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20  into pWInfo */. 
24860 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c   for(iLoop=0; iL
24870 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70  oop<nLoop; iLoop
24880 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65  ++){.    WhereLe
24890 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57  vel *pLevel = pW
248a0 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b  Info->a + iLoop;
248b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  .    pLevel->pWL
248c0 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70  oop = pWLoop = p
248d0 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f  From->aLoop[iLoo
248e0 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  p];.    pLevel->
248f0 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e  iFrom = pWLoop->
24900 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iTab;.    pLevel
24910 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e  ->iTabCur = pWIn
24920 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b  fo->pTabList->a[
24930 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69  pLevel->iFrom].i
24940 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  Cursor;.  }.  if
24950 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
24960 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41  Flags & WHERE_WA
24970 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a  NT_DISTINCT)!=0.
24980 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77     && (pWInfo->w
24990 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
249a0 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30  E_DISTINCTBY)==0
249b0 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65  .   && pWInfo->e
249c0 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
249d0 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20  DISTINCT_NOOP.  
249e0 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b   && nRowEst.  ){
249f0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  .    Bitmask not
24a00 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  Used;.    int rc
24a10 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
24a20 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
24a30 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 44 69  nfo, pWInfo->pDi
24a40 73 74 69 6e 63 74 53 65 74 2c 20 70 46 72 6f 6d  stinctSet, pFrom
24a50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24a60 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
24a70 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
24a80 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
24a90 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
24aa0 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
24ab0 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53 65 74  fo->pDistinctSet
24ac0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
24ad0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
24ae0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
24af0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
24b00 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
24b10 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  nfo->pOrderBy ){
24b20 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
24b30 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
24b40 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29  ERE_DISTINCTBY )
24b50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 6f  {.      if( pFro
24b60 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57  m->isOrdered==pW
24b70 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
24b80 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
24b90 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
24ba0 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
24bb0 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20  NCT_ORDERED;.   
24bc0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
24bd0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
24be0 42 53 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  BSat = pFrom->is
24bf0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 70  Ordered;.      p
24c00 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
24c10 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b   pFrom->revLoop;
24c20 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
24c30 6f 2d 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a  o->nOBSat<=0 ){.
24c40 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e          pWInfo->
24c50 6e 4f 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20  nOBSat = 0;.    
24c60 20 20 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30 20      if( nLoop>0 
24c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 42 69 74  ){.          Bit
24c80 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 20 20  mask m = 0;.    
24c90 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
24ca0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
24cb0 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
24cc0 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
24cd0 79 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  y, pFrom,.      
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
24d00 4d 49 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  MIT, nLoop-1, pF
24d10 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
24d20 2d 31 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20  -1], &m);.      
24d30 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
24d40 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
24d50 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
24d60 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64 65     pWInfo->bOrde
24d70 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 31  redInnerLoop = 1
24d80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 57  ;.            pW
24d90 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
24da0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  m;.          }. 
24db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24dc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
24dd0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
24de0 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42  gs & WHERE_SORTB
24df0 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20 20  YGROUP).        
24e00 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  && pWInfo->nOBSa
24e10 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  t==pWInfo->pOrde
24e20 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e 4c  rBy->nExpr && nL
24e30 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20  oop>0.    ){.   
24e40 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61     Bitmask revMa
24e50 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  sk = 0;.      in
24e60 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72 65  t nOrder = where
24e70 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
24e80 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
24e90 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a  nfo->pOrderBy, .
24ea0 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2c            pFrom,
24eb0 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72   0, nLoop-1, pFr
24ec0 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
24ed0 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20 20  1], &revMask.   
24ee0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
24ef0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74  rt( pWInfo->sort
24f00 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ed==0 );.      i
24f10 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e 66  f( nOrder==pWInf
24f20 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
24f30 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 57  pr ){.        pW
24f40 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20 31  Info->sorted = 1
24f50 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
24f60 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76 4d  ->revMask = revM
24f70 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
24f80 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e 66   }.  }...  pWInf
24f90 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46 72  o->nRowOut = pFr
24fa0 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a 20  om->nRow;..  /* 
24fb0 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20 6d  Free temporary m
24fc0 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72 6e  emory and return
24fd0 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73 71   success */.  sq
24fe0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24ff0 70 53 70 61 63 65 29 3b 0a 20 20 72 65 74 75 72  pSpace);.  retur
25000 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
25010 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75 65 72 69  /*.** Most queri
25020 65 73 20 75 73 65 20 6f 6e 6c 79 20 61 20 73 69  es use only a si
25030 6e 67 6c 65 20 74 61 62 6c 65 20 28 74 68 65 79  ngle table (they
25040 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e 73 29 20   are not joins) 
25050 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73 69 6d 70  and have.** simp
25060 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  le == constraint
25070 73 20 61 67 61 69 6e 73 74 20 69 6e 64 65 78 65  s against indexe
25080 64 20 66 69 65 6c 64 73 2e 20 20 54 68 69 73 20  d fields.  This 
25090 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
250a0 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74 68 6f 73  .** to plan thos
250b0 65 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20 75  e simple cases u
250c0 73 69 6e 67 20 6d 75 63 68 20 6c 65 73 73 20 63  sing much less c
250d0 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20 74 68 65  eremony than the
250e0 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70 75 72 70  .** general-purp
250f0 6f 73 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65  ose query planne
25100 72 2c 20 61 6e 64 20 74 68 65 72 65 62 79 20 79  r, and thereby y
25110 69 65 6c 64 20 66 61 73 74 65 72 20 73 71 6c 69  ield faster sqli
25120 74 65 33 5f 70 72 65 70 61 72 65 28 29 0a 2a 2a  te3_prepare().**
25130 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65 20 63   times for the c
25140 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a 2a 0a 2a  ommon case..**.*
25150 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * Return non-zer
25160 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 69 66  o on success, if
25170 20 74 68 69 73 20 71 75 65 72 79 20 63 61 6e 20   this query can 
25180 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
25190 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c 6c 73 20  is.** no-frills 
251a0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 20 20  query planner.  
251b0 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 74  Return zero if t
251c0 68 69 73 20 71 75 65 72 79 20 6e 65 65 64 73 20  his query needs 
251d0 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d  the .** general-
251e0 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c  purpose query pl
251f0 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  anner..*/.static
25200 20 69 6e 74 20 77 68 65 72 65 53 68 6f 72 74 43   int whereShortC
25210 75 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  ut(WhereLoopBuil
25220 64 65 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a  der *pBuilder){.
25230 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
25240 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 53 72  nfo;.  struct Sr
25250 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
25260 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  m;.  WhereClause
25270 20 2a 70 57 43 3b 0a 20 20 57 68 65 72 65 54 65   *pWC;.  WhereTe
25280 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 57 68 65  rm *pTerm;.  Whe
25290 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20  reLoop *pLoop;. 
252a0 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
252b0 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   j;.  Table *pTa
252c0 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  b;.  Index *pIdx
252d0 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70 42  ;..  pWInfo = pB
252e0 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a  uilder->pWInfo;.
252f0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
25300 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
25310 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 29 20  _OR_SUBCLAUSE ) 
25320 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73 65  return 0;.  asse
25330 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  rt( pWInfo->pTab
25340 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31 20 29 3b  List->nSrc>=1 );
25350 0a 20 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  .  pItem = pWInf
25360 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a  o->pTabList->a;.
25370 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
25380 70 54 61 62 3b 0a 20 20 69 66 28 20 49 73 56 69  pTab;.  if( IsVi
25390 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
253a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
253b0 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  tem->fg.isIndexe
253c0 64 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  dBy ) return 0;.
253d0 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
253e0 69 43 75 72 73 6f 72 3b 0a 20 20 70 57 43 20 3d  iCursor;.  pWC =
253f0 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
25400 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69 6c 64 65   pLoop = pBuilde
25410 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c 6f 6f 70  r->pNew;.  pLoop
25420 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30 3b 0a 20  ->wsFlags = 0;. 
25430 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70 20 3d 20   pLoop->nSkip = 
25440 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20 73 71 6c  0;.  pTerm = sql
25450 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
25460 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
25470 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 53 2c   0, WO_EQ|WO_IS,
25480 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d   0);.  if( pTerm
25490 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65   ){.    testcase
254a0 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
254b0 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
254c0 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
254d0 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
254e0 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c 57 48 45  EQ|WHERE_IPK|WHE
254f0 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20 20 70  RE_ONEROW;.    p
25500 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20  Loop->aLTerm[0] 
25510 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4c 6f  = pTerm;.    pLo
25520 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a  op->nLTerm = 1;.
25530 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
25540 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20  ee.nEq = 1;.    
25550 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20  /* TUNING: Cost 
25560 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f 6f 6b 75  of a rowid looku
25570 70 20 69 73 20 31 30 20 2a 2f 0a 20 20 20 20 70  p is 10 */.    p
25580 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 33 3b  Loop->rRun = 33;
25590 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69 74 65 33    /* 33==sqlite3
255a0 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f 0a 20 20  LogEst(10) */.  
255b0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70  }else{.    for(p
255c0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
255d0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
255e0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
255f0 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a 20 20 20   int opMask;.   
25600 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
25610 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3d 3d 70  ->aLTermSpace==p
25620 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20 29 3b 0a  Loop->aLTerm );.
25630 20 20 20 20 20 20 69 66 28 20 21 49 73 55 6e 69        if( !IsUni
25640 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 0a 20  queIndex(pIdx). 
25650 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d 3e 70        || pIdx->p
25660 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 20  PartIdxWhere!=0 
25670 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 2d  .       || pIdx-
25680 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61 79 53 69  >nKeyCol>ArraySi
25690 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  ze(pLoop->aLTerm
256a0 53 70 61 63 65 29 20 0a 20 20 20 20 20 20 29 20  Space) .      ) 
256b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
256c0 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78 2d 3e 75  opMask = pIdx->u
256d0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20 28 57 4f  niqNotNull ? (WO
256e0 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20 57 4f 5f  _EQ|WO_IS) : WO_
256f0 45 51 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  EQ;.      for(j=
25700 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43  0; j<pIdx->nKeyC
25710 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
25720 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65    pTerm = sqlite
25730 33 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 70  3WhereFindTerm(p
25740 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 30 2c 20  WC, iCur, j, 0, 
25750 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20  opMask, pIdx);. 
25760 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
25770 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
25780 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
25790 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
257a0 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
257b0 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d     pLoop->aLTerm
257c0 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  [j] = pTerm;.   
257d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
257e0 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  !=pIdx->nKeyCol 
257f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25800 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73    pLoop->wsFlags
25810 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   = WHERE_COLUMN_
25820 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 7c  EQ|WHERE_ONEROW|
25830 57 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20  WHERE_INDEXED;. 
25840 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 69       if( pIdx->i
25850 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20 28 70 49  sCovering || (pI
25860 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e  tem->colUsed & ~
25870 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70  columnsInIndex(p
25880 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Idx))==0 ){.    
25890 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61      pLoop->wsFla
258a0 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f  gs |= WHERE_IDX_
258b0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ONLY;.      }.  
258c0 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72      pLoop->nLTer
258d0 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f  m = j;.      pLo
258e0 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
258f0 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  = j;.      pLoop
25900 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
25910 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 2f   = pIdx;.      /
25920 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
25930 66 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  f a unique index
25940 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35 20 2a 2f   lookup is 15 */
25950 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  .      pLoop->rR
25960 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20 33 39 3d  un = 39;  /* 39=
25970 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
25980 35 29 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  5) */.      brea
25990 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
259a0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
259b0 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  s ){.    pLoop->
259c0 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 31  nOut = (LogEst)1
259d0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b  ;.    pWInfo->a[
259e0 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70 4c 6f 6f  0].pWLoop = pLoo
259f0 70 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61  p;.    pLoop->ma
25a00 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33  skSelf = sqlite3
25a10 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
25a20 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
25a30 69 43 75 72 29 3b 0a 20 20 20 20 70 57 49 6e 66  iCur);.    pWInf
25a40 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72 20  o->a[0].iTabCur 
25a50 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49 6e  = iCur;.    pWIn
25a60 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31 3b  fo->nRowOut = 1;
25a70 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  .    if( pWInfo-
25a80 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e  >pOrderBy ) pWIn
25a90 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70 57  fo->nOBSat =  pW
25aa0 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
25ab0 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  nExpr;.    if( p
25ac0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
25ad0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
25ae0 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20  ISTINCT ){.     
25af0 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e   pWInfo->eDistin
25b00 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  ct = WHERE_DISTI
25b10 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  NCT_UNIQUE;.    
25b20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
25b30 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70 2d  DEBUG.    pLoop-
25b40 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e 64  >cId = '0';.#end
25b50 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  if.    return 1;
25b60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
25b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
25b80 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
25b90 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
25ba0 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
25bb0 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
25bc0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
25bd0 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
25be0 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
25bf0 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
25c00 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
25c10 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
25c20 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
25c30 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
25c40 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
25c50 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
25c60 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
25c70 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
25c80 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
25c90 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
25ca0 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
25cb0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25cc0 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
25cd0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
25ce0 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
25cf0 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
25d00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
25d10 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
25d20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
25d30 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
25d40 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
25d50 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
25d60 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
25d70 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
25d80 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
25d90 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
25da0 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
25db0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
25dc0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25dd0 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
25de0 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
25df0 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
25e00 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
25e10 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
25e20 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
25e30 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
25e40 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
25e50 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
25e60 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
25e70 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
25e80 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
25e90 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
25ea0 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
25eb0 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
25ec0 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
25ed0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
25ee0 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
25ef0 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
25f00 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
25f10 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
25f20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
25f50 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
25f60 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
25f70 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
25f80 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
25f90 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
25fc0 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
25fd0 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
25fe0 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
25ff0 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
26000 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
26010 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
26020 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
26030 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
26040 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
26050 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
26060 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
26070 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
26080 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
26090 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
260a0 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
260b0 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
260c0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
260d0 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
260e0 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
260f0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
26100 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
26110 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
26120 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
26130 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
26140 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
26150 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
26160 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
26170 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
26180 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
26190 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
261a0 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
261b0 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
261c0 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
261d0 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
261e0 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
261f0 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
26200 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
26210 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
26220 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
26230 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
26240 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
26250 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
26260 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
26270 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
26280 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
26290 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
262a0 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
262b0 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
262c0 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
262d0 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
262e0 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
262f0 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
26300 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
26310 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
26320 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
26330 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
26340 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
26350 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
26360 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
26370 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
26380 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
26390 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
263a0 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
263b0 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
263c0 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
263d0 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
263e0 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
263f0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
26400 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
26410 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
26420 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
26430 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
26440 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
26450 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
26460 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
26470 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
26480 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
26490 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
264a0 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
264b0 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
264c0 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
264d0 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
264e0 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
264f0 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
26500 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
26510 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
26520 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
26530 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
26540 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
26550 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
26560 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
26570 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
26580 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
26590 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
265a0 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
265b0 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
265c0 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
265d0 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
265e0 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
265f0 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
26600 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
26610 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
26620 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
26630 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
26640 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
26650 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
26660 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
26670 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
26680 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
26690 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
266a0 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
266b0 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
266c0 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
266d0 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
266e0 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
266f0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
26700 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
26710 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
26720 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
26730 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
26740 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
26750 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
26760 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
26770 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
26780 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
26790 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
267a0 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
267b0 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
267c0 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
267d0 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
267e0 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
267f0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
26800 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
26810 75 73 65 20 28 6f 72 20 74 68 65 20 47 52 4f 55  use (or the GROU
26820 50 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69  P BY clause.** i
26830 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
26840 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
26850 69 6e 20 77 63 74 72 6c 46 6c 61 67 73 29 20 6f  in wctrlFlags) o
26860 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
26870 6d 65 6e 74 0a 2a 2a 20 69 66 20 74 68 65 72 65  ment.** if there
26880 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
26890 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
268a0 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
268b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
268c0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
268d0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
268e0 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
268f0 6e 20 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55  n pOrderBy is NU
26900 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49  LL..**.** The iI
26910 64 78 43 75 72 20 70 61 72 61 6d 65 74 65 72 20  dxCur parameter 
26920 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  is the cursor nu
26930 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65 78  mber of an index
26940 2e 20 20 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f  .  If .** WHERE_
26950 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20  OR_SUBCLAUSE is 
26960 73 65 74 2c 20 69 49 64 78 43 75 72 20 69 73 20  set, iIdxCur is 
26970 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
26980 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  r of an index.**
26990 20 74 6f 20 75 73 65 20 66 6f 72 20 4f 52 20 63   to use for OR c
269a0 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
269b0 2e 20 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  .  The WHERE cla
269c0 75 73 65 20 73 68 6f 75 6c 64 20 75 73 65 20 74  use should use t
269d0 68 69 73 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  his.** specific 
269e0 63 75 72 73 6f 72 2e 20 20 49 66 20 57 48 45 52  cursor.  If WHER
269f0 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
26a00 44 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69  D is set, then i
26a10 49 64 78 43 75 72 20 69 73 0a 2a 2a 20 74 68 65  IdxCur is.** the
26a20 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 69 6e   first cursor in
26a30 20 61 6e 20 61 72 72 61 79 20 6f 66 20 63 75 72   an array of cur
26a40 73 6f 72 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  sors for all ind
26a50 69 63 65 73 2e 20 20 69 49 64 78 43 75 72 20 73  ices.  iIdxCur s
26a60 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64  hould.** be used
26a70 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
26a80 61 70 70 72 6f 70 72 69 61 74 65 20 63 75 72 73  appropriate curs
26a90 6f 72 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  or depending on 
26aa0 77 68 69 63 68 20 69 6e 64 65 78 20 69 73 0a 2a  which index is.*
26ab0 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  * used..*/.Where
26ac0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
26ad0 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
26ae0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
26af0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
26b00 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
26b10 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
26b20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
26b30 61 75 73 65 3a 20 41 20 6c 69 73 74 20 6f 66 20  ause: A list of 
26b40 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
26b50 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
26b60 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
26b70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
26b80 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
26b90 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
26ba0 79 2c 20 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44  y,     /* An ORD
26bb0 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20  ER BY (or GROUP 
26bc0 42 59 29 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  BY) clause, or N
26bd0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
26be0 74 20 2a 70 44 69 73 74 69 6e 63 74 53 65 74 2c  t *pDistinctSet,
26bf0 20 2f 2a 20 54 72 79 20 6e 6f 74 20 74 6f 20 6f   /* Try not to o
26c00 75 74 70 75 74 20 74 77 6f 20 72 6f 77 73 20 74  utput two rows t
26c10 68 61 74 20 64 75 70 6c 69 63 61 74 65 20 74 68  hat duplicate th
26c20 65 73 65 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  ese */.  u16 wct
26c30 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  rlFlags,        
26c40 20 2f 2a 20 54 68 65 20 57 48 45 52 45 5f 2a 20   /* The WHERE_* 
26c50 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
26c60 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
26c70 20 20 69 6e 74 20 69 41 75 78 41 72 67 20 20 20    int iAuxArg   
26c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
26c90 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
26ca0 53 45 20 69 73 20 73 65 74 2c 20 69 6e 64 65 78  SE is set, index
26cb0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a 20   cursor number. 
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 57           ** If W
26ce0 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c 20  HERE_USE_LIMIT, 
26cf0 74 68 65 6e 20 74 68 65 20 6c 69 6d 69 74 20 61  then the limit a
26d00 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  mount */.){.  in
26d10 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20  t nByteWInfo;   
26d20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e           /* Num.
26d30 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
26d40 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73   for WhereInfo s
26d50 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  truct */.  int n
26d60 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20  TabList;        
26d70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26d80 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70  of elements in p
26d90 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65  TabList */.  Whe
26da0 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
26db0 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
26dc0 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
26dd0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
26de0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
26df0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
26e00 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
26e10 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
26e20 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74   engine */.  Bit
26e30 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20  mask notReady;  
26e40 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
26e50 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
26e60 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a  yet positioned *
26e70 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
26e80 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20 2f  lder sWLB;     /
26e90 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  * The WhereLoop 
26ea0 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68 65  builder */.  Whe
26eb0 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
26ec0 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65  Set;    /* The e
26ed0 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
26ee0 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  et */.  WhereLev
26ef0 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20  el *pLevel;     
26f00 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
26f10 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d 3e  evel in pWInfo->
26f20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  a[] */.  WhereLo
26f30 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20  op *pLoop;      
26f40 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
26f50 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65  o a single Where
26f60 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Loop object */. 
26f70 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
26f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26f90 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
26fa0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
26fc0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
26fd0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ff0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27000 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64 65  e */.  u8 bForde
27010 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  lete = 0;       
27020 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52 44    /* OPFLAG_FORD
27030 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20 61  ELETE or zero, a
27040 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
27050 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  ..  assert( (wct
27060 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
27070 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57  ONEPASS_MULTIROW
27080 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20 20  )==0 || (.      
27090 20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20    (wctrlFlags & 
270a0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
270b0 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20 20  SIRED)!=0 .     
270c0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
270d0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
270e0 55 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a 0a  USE)==0 .  ));..
270f0 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f 66    /* Only one of
27100 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
27110 55 53 45 20 6f 72 20 57 48 45 52 45 5f 55 53 45  USE or WHERE_USE
27120 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73 65  _LIMIT */.  asse
27130 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
27140 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
27150 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 20 20 20  AUSE)==0.       
27160 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46 6c       || (wctrlFl
27170 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
27180 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20 20  LIMIT)==0 );..  
27190 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69 74  /* Variable init
271a0 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  ialization */.  
271b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
271c0 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42 2c  .  memset(&sWLB,
271d0 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42 29   0, sizeof(sWLB)
271e0 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44 45  );..  /* An ORDE
271f0 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  R/GROUP BY claus
27200 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 36  e of more than 6
27210 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20 62  3 terms cannot b
27220 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a 20  e optimized */. 
27230 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64 65   testcase( pOrde
27240 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d  rBy && pOrderBy-
27250 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29 3b  >nExpr==BMS-1 );
27260 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
27270 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  && pOrderBy->nEx
27280 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65 72  pr>=BMS ) pOrder
27290 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e 70  By = 0;.  sWLB.p
272a0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
272b0 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  By;..  /* Disabl
272c0 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
272d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
272e0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
272f0 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
27300 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
27310 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
27320 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
27330 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
27340 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
27350 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
27360 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b 0a  DistinctOpt) ){.
27370 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 26      wctrlFlags &
27380 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44 49  = ~WHERE_WANT_DI
27390 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20 2f  STINCT;.  }..  /
273a0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
273b0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
273c0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
273d0 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
273e0 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
273f0 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
27400 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  */.  testcase( p
27410 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42  TabList->nSrc==B
27420 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62  MS );.  if( pTab
27430 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29  List->nSrc>BMS )
27440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
27450 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
27460 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73  t most %d tables
27470 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53   in a join", BMS
27480 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
27490 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
274a0 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c  function normall
274b0 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65  y generates a ne
274c0 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c  sted loop for al
274d0 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a  l tables in .  *
274e0 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74  * pTabList.  But
274f0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 52   if the WHERE_OR
27500 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67 20  _SUBCLAUSE flag 
27510 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
27520 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
27530 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
27540 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
27550 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
27560 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
27570 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
27580 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27590 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
275a0 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
275b0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
275c0 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
275d0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
275e0 42 43 4c 41 55 53 45 29 20 3f 20 31 20 3a 20 70  BCLAUSE) ? 1 : p
275f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 0a  TabList->nSrc;..
27600 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
27610 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
27620 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
27630 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
27640 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
27650 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
27660 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
27670 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
27680 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
27690 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
276a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
276b0 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
276c0 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
276d0 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
276e0 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
276f0 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
27700 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
27710 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
27720 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
27730 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
27740 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
27750 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
27760 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
27770 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
27780 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
27790 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
277a0 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55  nByteWInfo = ROU
277b0 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65  ND8(sizeof(Where
277c0 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d  Info)+(nTabList-
277d0 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  1)*sizeof(WhereL
277e0 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f  evel));.  pWInfo
277f0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
27800 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
27810 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66 28 57  WInfo + sizeof(W
27820 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 69 66  hereLoop));.  if
27830 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
27840 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
27850 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e  3DbFree(db, pWIn
27860 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20  fo);.    pWInfo 
27870 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68  = 0;.    goto wh
27880 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
27890 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 61 69 43   }.  pWInfo->aiC
278a0 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20 70  urOnePass[0] = p
278b0 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50  WInfo->aiCurOneP
278c0 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  ass[1] = -1;.  p
278d0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
278e0 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  nTabList;.  pWIn
278f0 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61  fo->pParse = pPa
27900 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  rse;.  pWInfo->p
27910 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  TabList = pTabLi
27920 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  st;.  pWInfo->pO
27930 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
27940 79 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 44 69  y;.  pWInfo->pDi
27950 73 74 69 6e 63 74 53 65 74 20 3d 20 70 44 69 73  stinctSet = pDis
27960 74 69 6e 63 74 53 65 74 3b 0a 20 20 70 57 49 6e  tinctSet;.  pWIn
27970 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70 57 49  fo->iBreak = pWI
27980 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d  nfo->iContinue =
27990 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
279a0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
279b0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d  fo->wctrlFlags =
279c0 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70   wctrlFlags;.  p
279d0 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20 3d 20  WInfo->iLimit = 
279e0 69 41 75 78 41 72 67 3b 0a 20 20 70 57 49 6e 66  iAuxArg;.  pWInf
279f0 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
27a00 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
27a10 65 72 79 4c 6f 6f 70 3b 0a 20 20 61 73 73 65 72  eryLoop;.  asser
27a20 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  t( pWInfo->eOneP
27a30 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
27a40 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53 53 20   );  /* ONEPASS 
27a50 64 65 66 61 75 6c 74 73 20 74 6f 20 4f 46 46 20  defaults to OFF 
27a60 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  */.  pMaskSet = 
27a70 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  &pWInfo->sMaskSe
27a80 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e 66 6f  t;.  sWLB.pWInfo
27a90 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73 57 4c   = pWInfo;.  sWL
27aa0 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d  B.pWC = &pWInfo-
27ab0 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70 4e 65  >sWC;.  sWLB.pNe
27ac0 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 29  w = (WhereLoop*)
27ad0 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66 6f 29  (((char*)pWInfo)
27ae0 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a 20 20  +nByteWInfo);.  
27af0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
27b00 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73 57 4c  TE_ALIGNMENT(sWL
27b10 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77 68 65  B.pNew) );.  whe
27b20 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c 42 2e  reLoopInit(sWLB.
27b30 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20 53 51  pNew);.#ifdef SQ
27b40 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 57 4c  LITE_DEBUG.  sWL
27b50 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20 27 2a  B.pNew->cId = '*
27b60 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  ';.#endif..  /* 
27b70 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
27b80 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
27b90 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
27ba0 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
27bb0 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
27bc0 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
27bd0 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
27be0 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
27bf0 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
27c00 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43  .  sqlite3WhereC
27c10 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49 6e 66  lauseInit(&pWInf
27c20 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f 29 3b  o->sWC, pWInfo);
27c30 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 53  .  sqlite3WhereS
27c40 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  plit(&pWInfo->sW
27c50 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41 4e  C, pWhere, TK_AN
27c60 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 53 70  D);.    .  /* Sp
27c70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
27c80 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
27c90 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
27ca0 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
27cb0 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
27cc0 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
27cd0 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
27ce0 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
27cf0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
27d00 69 3c 73 57 4c 42 2e 70 57 43 2d 3e 6e 54 65 72  i<sWLB.pWC->nTer
27d10 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  m; ii++){.    if
27d20 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c  ( nTabList==0 ||
27d30 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
27d40 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 73 57  nstantNotJoin(sW
27d50 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d 2e 70 45  LB.pWC->a[ii].pE
27d60 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  xpr) ){.      sq
27d70 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
27d80 28 70 50 61 72 73 65 2c 20 73 57 4c 42 2e 70 57  (pParse, sWLB.pW
27d90 43 2d 3e 61 5b 69 69 5d 2e 70 45 78 70 72 2c 20  C->a[ii].pExpr, 
27da0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 0a  pWInfo->iBreak,.
27db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
27dd0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
27de0 20 20 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69     sWLB.pWC->a[i
27df0 69 5d 2e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45  i].wtFlags |= TE
27e00 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a  RM_CODED;.    }.
27e10 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
27e20 6c 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20  l case: No FROM 
27e30 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  clause.  */.  if
27e40 28 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b  ( nTabList==0 ){
27e50 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
27e60 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
27e70 61 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  at = pOrderBy->n
27e80 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63  Expr;.    if( wc
27e90 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27ea0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
27eb0 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
27ec0 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
27ed0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
27ee0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
27ef0 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
27f00 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
27f10 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
27f20 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
27f30 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
27f40 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68   N-th term of th
27f50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
27f60 20 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d   assigned a bitm
27f70 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a  ask of 1<<N..  *
27f80 2a 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20  *.  ** The rule 
27f90 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
27fa0 73 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73  sentence ensures
27fb0 20 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68   thta if X is th
27fc0 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20  e bitmask for.  
27fd0 2a 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74 68  ** a table T, th
27fe0 65 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62 69  en X-1 is the bi
27ff0 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74  tmask for all ot
28000 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68  her tables to th
28010 65 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a  e left of T..  *
28020 2a 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69  * Knowing the bi
28030 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
28040 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
28050 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20   of a left join 
28060 69 73 0a 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e  is.  ** importan
28070 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
28080 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65  ..  **.  ** Note
28090 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
280a0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
280b0 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
280c0 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a  c tables in.  **
280d0 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
280e0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
280f0 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
28100 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
28110 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20  ally.  ** equal 
28120 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  to pTabList->nSr
28130 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73  c but might be s
28140 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66  hortened to 1 if
28150 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f   the.  ** WHERE_
28160 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61  OR_SUBCLAUSE fla
28170 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  g is set..  */. 
28180 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54   for(ii=0; ii<pT
28190 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69  abList->nSrc; ii
281a0 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
281b0 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54  ask(pMaskSet, pT
281c0 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43  abList->a[ii].iC
281d0 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  ursor);.    sqli
281e0 74 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41  te3WhereTabFuncA
281f0 72 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61  rgs(pParse, &pTa
28200 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70  bList->a[ii], &p
28210 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d  WInfo->sWC);.  }
28220 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
28230 45 42 55 47 0a 20 20 66 6f 72 28 69 69 3d 30 3b  EBUG.  for(ii=0;
28240 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53   ii<pTabList->nS
28250 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 42  rc; ii++){.    B
28260 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74  itmask m = sqlit
28270 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70  e3WhereGetMask(p
28280 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
28290 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72  t->a[ii].iCursor
282a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
282b0 3d 3d 4d 41 53 4b 42 49 54 28 69 69 29 20 29 3b  ==MASKBIT(ii) );
282c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
282d0 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66  * Analyze all of
282e0 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69   the subexpressi
282f0 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
28300 33 57 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a  3WhereExprAnalyz
28310 65 28 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  e(pTabList, &pWI
28320 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28  nfo->sWC);.  if(
28330 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28340 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
28350 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 69 66 28  ginError;..  if(
28360 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
28370 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
28380 54 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44  T ){.    if( isD
28390 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74  istinctRedundant
283a0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
283b0 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c  t, &pWInfo->sWC,
283c0 20 70 44 69 73 74 69 6e 63 74 53 65 74 29 20 29   pDistinctSet) )
283d0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 44  {.      /* The D
283e0 49 53 54 49 4e 43 54 20 6d 61 72 6b 69 6e 67 20  ISTINCT marking 
283f0 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49  is pointless.  I
28400 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20  gnore it. */.   
28410 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74     pWInfo->eDist
28420 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53  inct = WHERE_DIS
28430 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20  TINCT_UNIQUE;.  
28440 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 64    }else if( pOrd
28450 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
28460 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52 44 45 52   /* Try to ORDER
28470 20 42 59 20 74 68 65 20 72 65 73 75 6c 74 20 73   BY the result s
28480 65 74 20 74 6f 20 6d 61 6b 65 20 64 69 73 74 69  et to make disti
28490 6e 63 74 20 70 72 6f 63 65 73 73 69 6e 67 20 65  nct processing e
284a0 61 73 69 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  asier */.      p
284b0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
284c0 73 20 7c 3d 20 57 48 45 52 45 5f 44 49 53 54 49  s |= WHERE_DISTI
284d0 4e 43 54 42 59 3b 0a 20 20 20 20 20 20 70 57 49  NCTBY;.      pWI
284e0 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  nfo->pOrderBy = 
284f0 70 44 69 73 74 69 6e 63 74 53 65 74 3b 0a 20 20  pDistinctSet;.  
28500 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
28510 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65 72  nstruct the Wher
28520 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f  eLoop objects */
28530 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48 45  .#if defined(WHE
28540 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 29  RETRACE_ENABLED)
28550 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68  .  if( sqlite3Wh
28560 65 72 65 54 72 61 63 65 20 26 20 30 78 66 66 66  ereTrace & 0xfff
28570 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  f ){.    sqlite3
28580 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a 2a  DebugPrintf("***
28590 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74   Optimizer Start
285a0 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67 73   *** (wctrlFlags
285b0 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c 61  : 0x%x",wctrlFla
285c0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63 74  gs);.    if( wct
285d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
285e0 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  USE_LIMIT ){.   
285f0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
28600 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a 20  rintf(", limit: 
28610 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a 20  %d", iAuxArg);. 
28620 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
28630 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c 6e  DebugPrintf(")\n
28640 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  ");.  }.  if( sq
28650 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
28660 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44 69  & 0x100 ){ /* Di
28670 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73 20  splay all terms 
28680 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
28690 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  use */.    sqlit
286a0 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
286b0 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  nt(sWLB.pWC);.  
286c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
286d0 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20 77  nTabList!=1 || w
286e0 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73 57  hereShortCut(&sW
286f0 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  LB)==0 ){.    rc
28700 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41   = whereLoopAddA
28710 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20 69  ll(&sWLB);.    i
28720 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65  f( rc ) goto whe
28730 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
28740 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
28750 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
28760 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
28770 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44 69  race ){    /* Di
28780 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68 65  splay all of the
28790 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
287a0 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65 72  ts */.      Wher
287b0 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20 20  eLoop *p;.      
287c0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74 61  int i;.      sta
287d0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
287e0 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33 34  Label[] = "01234
287f0 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a 6b  56789abcdefghijk
28800 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 22  lmnopqrstuvwyxz"
28810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
28840 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
28850 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20 20  RSTUVWYXZ";.    
28860 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d 3e    for(p=pWInfo->
28870 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b 20  pLoops, i=0; p; 
28880 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20  p=p->pNextLoop, 
28890 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  i++){.        p-
288a0 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69 25  >cId = zLabel[i%
288b0 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 5d 3b  sizeof(zLabel)];
288c0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
288d0 6f 70 50 72 69 6e 74 28 70 2c 20 73 57 4c 42 2e  opPrint(p, sWLB.
288e0 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pWC);.      }.  
288f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
28900 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
28910 72 28 70 57 49 6e 66 6f 2c 20 30 29 3b 0a 20 20  r(pWInfo, 0);.  
28920 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
28930 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
28940 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
28950 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70     if( pWInfo->p
28960 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
28970 20 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65    wherePathSolve
28980 72 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f  r(pWInfo, pWInfo
28990 2d 3e 6e 52 6f 77 4f 75 74 2b 31 29 3b 0a 20 20  ->nRowOut+1);.  
289a0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
289b0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
289c0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
289d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
289e0 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
289f0 42 79 3d 3d 30 20 26 26 20 28 64 62 2d 3e 66 6c  By==0 && (db->fl
28a00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76  ags & SQLITE_Rev
28a10 65 72 73 65 4f 72 64 65 72 29 21 3d 30 20 29 7b  erseOrder)!=0 ){
28a20 0a 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65  .     pWInfo->re
28a30 76 4d 61 73 6b 20 3d 20 41 4c 4c 42 49 54 53 3b  vMask = ALLBITS;
28a40 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
28a50 65 2d 3e 6e 45 72 72 20 7c 7c 20 4e 45 56 45 52  e->nErr || NEVER
28a60 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
28a70 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  d) ){.    goto w
28a80 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
28a90 20 20 7d 0a 23 69 66 64 65 66 20 57 48 45 52 45    }.#ifdef WHERE
28aa0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
28ab0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
28ac0 54 72 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  Trace ){.    sql
28ad0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
28ae0 22 2d 2d 2d 2d 20 53 6f 6c 75 74 69 6f 6e 20 6e  "---- Solution n
28af0 52 6f 77 3d 25 64 22 2c 20 70 57 49 6e 66 6f 2d  Row=%d", pWInfo-
28b00 3e 6e 52 6f 77 4f 75 74 29 3b 0a 20 20 20 20 69  >nRowOut);.    i
28b10 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
28b20 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  t>0 ){.      sql
28b30 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
28b40 22 20 4f 52 44 45 52 42 59 3d 25 64 2c 30 78 25  " ORDERBY=%d,0x%
28b50 6c 6c 78 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 4f  llx", pWInfo->nO
28b60 42 53 61 74 2c 20 70 57 49 6e 66 6f 2d 3e 72 65  BSat, pWInfo->re
28b70 76 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  vMask);.    }.  
28b80 20 20 73 77 69 74 63 68 28 20 70 57 49 6e 66 6f    switch( pWInfo
28b90 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ->eDistinct ){. 
28ba0 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
28bb0 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a  DISTINCT_UNIQUE:
28bc0 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
28bd0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
28be0 20 44 49 53 54 49 4e 43 54 3d 75 6e 69 71 75 65   DISTINCT=unique
28bf0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
28c00 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
28c10 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
28c20 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
28c30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
28c40 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
28c50 53 54 49 4e 43 54 3d 6f 72 64 65 72 65 64 22 29  STINCT=ordered")
28c60 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
28c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
28c80 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
28c90 43 54 5f 55 4e 4f 52 44 45 52 45 44 3a 20 7b 0a  CT_UNORDERED: {.
28ca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
28cb0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 44 49  ebugPrintf("  DI
28cc0 53 54 49 4e 43 54 3d 75 6e 6f 72 64 65 72 65 64  STINCT=unordered
28cd0 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
28ce0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
28cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
28d00 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
28d10 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
28d20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
28d30 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65  ii++){.      whe
28d40 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 57 49 6e  reLoopPrint(pWIn
28d50 66 6f 2d 3e 61 5b 69 69 5d 2e 70 57 4c 6f 6f 70  fo->a[ii].pWLoop
28d60 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20  , sWLB.pWC);.   
28d70 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
28d80 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 6d  /* Attempt to om
28d90 69 74 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74  it tables from t
28da0 68 65 20 6a 6f 69 6e 20 74 68 61 74 20 64 6f 20  he join that do 
28db0 6e 6f 74 20 65 66 66 65 63 74 20 74 68 65 20 72  not effect the r
28dc0 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 70  esult */.  if( p
28dd0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
28de0 0a 20 20 20 26 26 20 70 44 69 73 74 69 6e 63 74  .   && pDistinct
28df0 53 65 74 21 3d 30 0a 20 20 20 26 26 20 4f 70 74  Set!=0.   && Opt
28e00 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
28e10 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d 69 74  (db, SQLITE_Omit
28e20 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b 0a 20  NoopJoin).  ){. 
28e30 20 20 20 42 69 74 6d 61 73 6b 20 74 61 62 55 73     Bitmask tabUs
28e40 65 64 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ed = sqlite3Wher
28e50 65 45 78 70 72 4c 69 73 74 55 73 61 67 65 28 70  eExprListUsage(p
28e60 4d 61 73 6b 53 65 74 2c 20 70 44 69 73 74 69 6e  MaskSet, pDistin
28e70 63 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ctSet);.    if( 
28e80 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29 7b  sWLB.pOrderBy ){
28e90 0a 20 20 20 20 20 20 74 61 62 55 73 65 64 20 7c  .      tabUsed |
28ea0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
28eb0 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
28ec0 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64 65  kSet, sWLB.pOrde
28ed0 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rBy);.    }.    
28ee0 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 6e  while( pWInfo->n
28ef0 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20 20  Level>=2 ){.    
28f00 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
28f10 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20  rm, *pEnd;.     
28f20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d   pLoop = pWInfo-
28f30 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  >a[pWInfo->nLeve
28f40 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20 20  l-1].pWLoop;.   
28f50 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
28f60 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f 6f  pTabList->a[pLoo
28f70 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f 69 6e  p->iTab].fg.join
28f80 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d  type & JT_LEFT)=
28f90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
28fa0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
28fb0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
28fc0 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20  ISTINCT)==0.    
28fd0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
28fe0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
28ff0 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29  EROW)==0.      )
29000 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
29010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29020 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70 4c  f( (tabUsed & pL
29030 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  oop->maskSelf)!=
29040 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
29050 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57 43   pEnd = sWLB.pWC
29060 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d 3e  ->a + sWLB.pWC->
29070 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f 72  nTerm;.      for
29080 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43 2d  (pTerm=sWLB.pWC-
29090 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b 20  >a; pTerm<pEnd; 
290a0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
290b0 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
290c0 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
290d0 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20 20  >maskSelf)!=0.  
290e0 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72 48         && !ExprH
290f0 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
29100 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
29110 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29 7b  Join).        ){
29120 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
29130 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29140 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 54    }.      if( pT
29150 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61 6b  erm<pEnd ) break
29160 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  ;.      WHERETRA
29170 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e 20  CE(0xffff, ("-> 
29180 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f 74  drop loop %c not
29190 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70 2d   used\n", pLoop-
291a0 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70 57  >cId));.      pW
291b0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b 0a  Info->nLevel--;.
291c0 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d 2d        nTabList--
291d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  ;.    }.  }.  WH
291e0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
291f0 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
29200 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29  Finished ***\n")
29210 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61  );.  pWInfo->pPa
29220 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
29230 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  += pWInfo->nRowO
29240 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ut;..  /* If the
29250 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50   caller is an UP
29260 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
29270 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
29280 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a   requesting.  **
29290 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61   to use a one-pa
292a0 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65  ss algorithm, de
292b0 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20  termine if this 
292c0 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  is appropriate..
292d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
292e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
292f0 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
29300 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66 6f  ED)==0 || pWInfo
29310 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a 20  ->nLevel==1 );. 
29320 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
29330 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
29340 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b 0a  _DESIRED)!=0 ){.
29350 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 20      int wsFlags 
29360 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70  = pWInfo->a[0].p
29370 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a  WLoop->wsFlags;.
29380 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77 20      int bOnerow 
29390 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  = (wsFlags & WHE
293a0 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a 20  RE_ONEROW)!=0;. 
293b0 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 0a 20     if( bOnerow. 
293c0 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c 46 6c      || ((wctrlFl
293d0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
293e0 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21 3d 30  ASS_MULTIROW)!=0
293f0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 30  .           && 0
29400 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48 45  ==(wsFlags & WHE
29410 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
29420 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
29430 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 20  WInfo->eOnePass 
29440 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45 50  = bOnerow ? ONEP
29450 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e 45  ASS_SINGLE : ONE
29460 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20 20  PASS_MULTI;.    
29470 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
29480 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54  TabList->a[0].pT
29490 61 62 29 20 26 26 20 28 77 73 46 6c 61 67 73 20  ab) && (wsFlags 
294a0 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
294b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
294c0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
294d0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
294e0 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20  IROW ){.        
294f0 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 4f    bFordelete = O
29500 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 3b  PFLAG_FORDELETE;
29510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29520 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
29530 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
29540 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57 48  = (wsFlags & ~WH
29550 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a 20  ERE_IDX_ONLY);. 
29560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29570 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20  ..  /* Open all 
29580 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54  tables in the pT
29590 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69  abList and any i
295a0 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20  ndices selected 
295b0 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69  for.  ** searchi
295c0 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e  ng those tables.
295d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
295e0 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d  , pLevel=pWInfo-
295f0 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  >a; ii<nTabList;
29600 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29   ii++, pLevel++)
29610 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
29620 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  b;     /* Table 
29630 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  to open */.    i
29640 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
29650 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61  /* Index of data
29660 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
29670 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20  table/index */. 
29680 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
29690 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
296a0 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ;..    pTabItem 
296b0 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
296c0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
296d0 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74     pTab = pTabIt
296e0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44  em->pTab;.    iD
296f0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
29700 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
29710 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
29720 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
29730 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28  >pWLoop;.    if(
29740 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
29750 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
29760 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
29770 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
29780 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
29790 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
297a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
297b0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
297c0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
297d0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
297e0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
297f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
29800 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
29810 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
29820 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
29830 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
29840 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
29850 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
29860 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
29870 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
29880 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
29890 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
298a0 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
298b0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  pTab) ){.      /
298c0 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 65  * noop */.    }e
298d0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  lse.#endif.    i
298e0 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
298f0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
29900 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  NLY)==0.        
29910 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
29920 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
29930 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AUSE)==0 ){.    
29940 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70    int op = OP_Op
29950 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66  enRead;.      if
29960 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
29970 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss!=ONEPASS_OFF 
29980 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
29990 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20 20  OP_OpenWrite;.  
299a0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 69        pWInfo->ai
299b0 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d 20  CurOnePass[0] = 
299c0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
299d0 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  r;.      };.    
299e0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
299f0 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
29a00 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
29a10 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
29a20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
29a30 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 70  Item->iCursor==p
29a40 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
29a50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
29a60 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
29a70 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
29a80 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
29a90 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65  MS-1 );.      te
29aa0 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d 3e  stcase( pWInfo->
29ab0 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53  eOnePass==ONEPAS
29ac0 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e  S_OFF && pTab->n
29ad0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
29ae0 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f    if( pWInfo->eO
29af0 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
29b00 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  OFF && pTab->nCo
29b10 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77 69  l<BMS && HasRowi
29b20 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  d(pTab) ){.     
29b30 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70     Bitmask b = p
29b40 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
29b50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20  ;.        int n 
29b60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
29b70 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b  (; b; b=b>>1, n+
29b80 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c  +){}.        sql
29b90 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
29ba0 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 49  (v, -1, SQLITE_I
29bb0 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34  NT_TO_PTR(n), P4
29bc0 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20  _INT32);.       
29bd0 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62   assert( n<=pTab
29be0 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20  ->nCol );.      
29bf0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
29c00 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
29c10 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 70 4c  NTS.      if( pL
29c20 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
29c30 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dex!=0 ){.      
29c40 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
29c50 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
29c60 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65 74  SEEKEQ|bFordelet
29c70 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  e);.      }else.
29c80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
29c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
29ca0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 62 46  beChangeP5(v, bF
29cb0 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  ordelete);.     
29cc0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
29cd0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55  _ENABLE_COLUMN_U
29ce0 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 73  SED_MASK.      s
29cf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
29d00 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
29d10 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74 65 6d  nsUsed, pTabItem
29d20 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c  ->iCursor, 0, 0,
29d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
29d50 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49 74 65  nst u8*)&pTabIte
29d60 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f 49  m->colUsed, P4_I
29d70 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NT64);.#endif.  
29d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
29d90 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
29da0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
29db0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
29dc0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
29dd0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
29de0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
29df0 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
29e00 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 6f  Index *pIx = pLo
29e10 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
29e20 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ex;.      int iI
29e30 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 69  ndexCur;.      i
29e40 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52  nt op = OP_OpenR
29e50 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69 41  ead;.      /* iA
29e60 75 78 41 72 67 20 69 73 20 61 6c 77 61 79 73 20  uxArg is always 
29e70 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73 69  set if to a posi
29e80 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f 4e  tive value if ON
29e90 45 50 41 53 53 20 69 73 20 70 6f 73 73 69 62 6c  EPASS is possibl
29ea0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
29eb0 74 28 20 69 41 75 78 41 72 67 21 3d 30 20 7c 7c  t( iAuxArg!=0 ||
29ec0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
29ed0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
29ee0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
29ef0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48   );.      if( !H
29f00 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
29f10 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64   IsPrimaryKeyInd
29f20 65 78 28 70 49 78 29 0a 20 20 20 20 20 20 20 26  ex(pIx).       &
29f30 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  & (wctrlFlags & 
29f40 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
29f50 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29 7b 0a  SE)!=0.      ){.
29f60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
29f70 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61  is one term of a
29f80 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69 6f  n OR-optimizatio
29f90 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52 49 4d  n using the PRIM
29fa0 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20 20  ARY KEY of a.   
29fb0 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54 20       ** WITHOUT 
29fc0 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e 6f  ROWID table.  No
29fd0 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70 61   need for a sepa
29fe0 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  rate index */.  
29ff0 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
2a000 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  = pLevel->iTabCu
2a010 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  r;.        op = 
2a020 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
2a030 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
2a040 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass!=ONEPASS_OFF
2a050 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65   ){.        Inde
2a060 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65 6d  x *pJ = pTabItem
2a070 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  ->pTab->pIndex;.
2a080 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75          iIndexCu
2a090 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 20  r = iAuxArg;.   
2a0a0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63 74       assert( wct
2a0b0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2a0c0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20  ONEPASS_DESIRED 
2a0d0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
2a0e0 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26 20  ( ALWAYS(pJ) && 
2a0f0 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20 20  pJ!=pIx ){.     
2a100 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b 2b       iIndexCur++
2a110 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20 3d  ;.          pJ =
2a120 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   pJ->pNext;.    
2a130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 70      }.        op
2a140 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b   = OP_OpenWrite;
2a150 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
2a160 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d  >aiCurOnePass[1]
2a170 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20   = iIndexCur;.  
2a180 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 41      }else if( iA
2a190 75 78 41 72 67 20 26 26 20 28 77 63 74 72 6c 46  uxArg && (wctrlF
2a1a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
2a1b0 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20 29 7b  SUBCLAUSE)!=0 ){
2a1c0 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2a1d0 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20  ur = iAuxArg;.  
2a1e0 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65        op = OP_Re
2a1f0 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20 7d  openIdx;.      }
2a200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 49  else{.        iI
2a210 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72 73 65  ndexCur = pParse
2a220 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
2a230 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  }.      pLevel->
2a240 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65 78  iIdxCur = iIndex
2a250 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Cur;.      asser
2a260 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d  t( pIx->pSchema=
2a270 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
2a280 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a290 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b 0a  iIndexCur>=0 );.
2a2a0 20 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b 0a        if( op ){.
2a2b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a2c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
2a2d0 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78 2d   iIndexCur, pIx-
2a2e0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
2a2f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a300 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
2a310 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20  rse, pIx);.     
2a320 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77     if( (pLoop->w
2a330 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
2a340 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20 20  ONSTRAINT)!=0.  
2a350 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70         && (pLoop
2a360 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  ->wsFlags & (WHE
2a370 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
2a380 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 29  WHERE_SKIPSCAN))
2a390 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
2a3a0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
2a3b0 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42  ags&WHERE_ORDERB
2a3c0 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20  Y_MIN)==0.      
2a3d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
2a3e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2a3f0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45  P5(v, OPFLAG_SEE
2a400 4b 45 51 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f  KEQ); /* Hint to
2a410 20 43 4f 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20   COMDB2 */.     
2a420 20 20 20 7d 0a 20 20 20 20 20 20 20 20 56 64 62     }.        Vdb
2a430 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2a440 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
2a450 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2a460 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45  NABLE_COLUMN_USE
2a470 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20 20 20 7b  D_MASK.        {
2a480 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20 63  .          u64 c
2a490 6f 6c 55 73 65 64 20 3d 20 30 3b 0a 20 20 20 20  olUsed = 0;.    
2a4a0 20 20 20 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a        int ii, jj
2a4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2a4c0 69 69 3d 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43  ii=0; ii<pIx->nC
2a4d0 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20  olumn; ii++){.  
2a4e0 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 70            jj = p
2a4f0 49 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d  Ix->aiColumn[ii]
2a500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a510 28 20 6a 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75  ( jj<0 ) continu
2a520 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
2a530 66 28 20 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20  f( jj>63 ) jj = 
2a540 36 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  63;.            
2a550 69 66 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63  if( (pTabItem->c
2a560 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54  olUsed & MASKBIT
2a570 28 6a 6a 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  (jj))==0 ) conti
2a580 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2a590 20 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 75 36   colUsed |= ((u6
2a5a0 34 29 31 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69  4)1)<<(ii<63 ? i
2a5b0 69 20 3a 20 36 33 29 3b 0a 20 20 20 20 20 20 20  i : 63);.       
2a5c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2a5d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2a5e0 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  Dup8(v, OP_Colum
2a5f0 6e 73 55 73 65 64 2c 20 69 49 6e 64 65 78 43 75  nsUsed, iIndexCu
2a600 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a620 20 20 20 20 20 20 20 20 20 28 75 38 2a 29 26 63           (u8*)&c
2a630 6f 6c 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34  olUsed, P4_INT64
2a640 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
2a650 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
2a660 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44  ABLE_COLUMN_USED
2a670 5f 4d 41 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d  _MASK */.      }
2a680 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2a690 44 62 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 43  Db>=0 ) sqlite3C
2a6a0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
2a6b0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
2a6c0 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  }.  pWInfo->iTop
2a6d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2a6e0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2a6f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2a700 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
2a710 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20  eBeginError;..  
2a720 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
2a730 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73  code to do the s
2a740 65 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65  earch.  Each ite
2a750 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f  ration of the fo
2a760 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f  r.  ** loop belo
2a770 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  w generates code
2a780 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65   for a single ne
2a790 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
2a7a0 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d   VM.  ** program
2a7b0 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
2a7c0 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
2a7d0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
2a7e0 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b  nTabList; ii++){
2a7f0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 78 70  .    int addrExp
2a800 6c 61 69 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73  lain;.    int ws
2a810 46 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65  Flags;.    pLeve
2a820 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2a830 69 5d 3b 0a 20 20 20 20 77 73 46 6c 61 67 73 20  i];.    wsFlags 
2a840 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2a850 2d 3e 77 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64  ->wsFlags;.#ifnd
2a860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2a870 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
2a880 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2a890 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  pWLoop->wsFlags 
2a8a0 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
2a8b0 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  EX)!=0 ){.      
2a8c0 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
2a8d0 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  icIndex(pParse, 
2a8e0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20  &pWInfo->sWC,.  
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
2a900 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2a910 6c 2d 3e 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65  l->iFrom], notRe
2a920 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20  ady, pLevel);.  
2a930 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2a940 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2a950 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2a960 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2a970 20 20 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20    addrExplain = 
2a980 73 71 6c 69 74 65 33 57 68 65 72 65 45 78 70 6c  sqlite3WhereExpl
2a990 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20  ainOneScan(.    
2a9a0 20 20 20 20 70 50 61 72 73 65 2c 20 70 54 61 62      pParse, pTab
2a9b0 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69  List, pLevel, ii
2a9c0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
2a9d0 20 77 63 74 72 6c 46 6c 61 67 73 0a 20 20 20 20   wctrlFlags.    
2a9e0 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  );.    pLevel->a
2a9f0 64 64 72 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  ddrBody = sqlite
2aa00 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2aa10 28 76 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64  (v);.    notRead
2aa20 79 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  y = sqlite3Where
2aa30 43 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74  CodeOneLoopStart
2aa40 28 70 57 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74  (pWInfo, ii, not
2aa50 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57 49 6e  Ready);.    pWIn
2aa60 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20  fo->iContinue = 
2aa70 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
2aa80 3b 0a 20 20 20 20 69 66 28 20 28 77 73 46 6c 61  ;.    if( (wsFla
2aa90 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
2aaa0 52 29 3d 3d 30 20 26 26 20 28 77 63 74 72 6c 46  R)==0 && (wctrlF
2aab0 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 5f 53 55  lags&WHERE_OR_SU
2aac0 42 43 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20  BCLAUSE)==0 ){. 
2aad0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2aae0 65 41 64 64 53 63 61 6e 53 74 61 74 75 73 28 76  eAddScanStatus(v
2aaf0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65 76  , pTabList, pLev
2ab00 65 6c 2c 20 61 64 64 72 45 78 70 6c 61 69 6e 29  el, addrExplain)
2ab10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2ab20 2a 20 44 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62  * Done. */.  Vdb
2ab30 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
2ab40 76 2c 20 22 42 65 67 69 6e 20 57 48 45 52 45 2d  v, "Begin WHERE-
2ab50 63 6f 72 65 22 29 29 3b 0a 20 20 72 65 74 75 72  core"));.  retur
2ab60 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20  n pWInfo;..  /* 
2ab70 4a 75 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c  Jump here if mal
2ab80 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65  loc fails */.whe
2ab90 72 65 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20  reBeginError:.  
2aba0 69 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20  if( pWInfo ){.  
2abb0 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
2abc0 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73  Loop = pWInfo->s
2abd0 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a  avedNQueryLoop;.
2abe0 20 20 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65      whereInfoFre
2abf0 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20  e(db, pWInfo);. 
2ac00 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2ac10 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
2ac20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2ac30 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
2ac40 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
2ac50 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2ac60 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
2ac70 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
2ac80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2ac90 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
2aca0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50  fo *pWInfo){.  P
2acb0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
2acc0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
2acd0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2ace0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2acf0 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
2ad00 2a 70 4c 65 76 65 6c 3b 0a 20 20 57 68 65 72 65  *pLevel;.  Where
2ad10 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53  Loop *pLoop;.  S
2ad20 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2ad30 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
2ad40 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
2ad50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2ad60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
2ad70 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
2ad80 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64   code..  */.  Vd
2ad90 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
2ada0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 63  (v, "End WHERE-c
2adb0 6f 72 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ore"));.  sqlite
2adc0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2add0 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69  pParse);.  for(i
2ade0 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2adf0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2ae00 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
2ae10 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
2ae20 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f  o->a[i];.    pLo
2ae30 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
2ae40 6f 6f 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  oop;.    sqlite3
2ae50 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2ae60 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2ae70 43 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Cont);.    if( p
2ae80 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
2ae90 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
2aea0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2aeb0 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65   pLevel->op, pLe
2aec0 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d  vel->p1, pLevel-
2aed0 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29  >p2, pLevel->p3)
2aee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2aef0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
2af00 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
2af10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
2af20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
2af30 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
2af40 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b  l->op==OP_Next);
2af50 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2af60 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
2af70 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20  >op==OP_Prev);. 
2af80 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2af90 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2afa0 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 20 20  p==OP_VNext);.  
2afb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f    }.    if( pLoo
2afc0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2afd0 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26 20 70 4c  RE_IN_ABLE && pL
2afe0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30  evel->u.in.nIn>0
2aff0 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
2b000 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20   InLoop *pIn;.  
2b010 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
2b020 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2b030 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2b040 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b 0a 20 20  el->addrNxt);.  
2b050 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65 6c      for(j=pLevel
2b060 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d  ->u.in.nIn, pIn=
2b070 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49  &pLevel->u.in.aI
2b080 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b  nLoop[j-1]; j>0;
2b090 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20   j--, pIn--){.  
2b0a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b0b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
2b0c0 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31 29 3b 0a  ->addrInTop+1);.
2b0d0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 2d          if( pIn-
2b0e0 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d 4f 50 5f  >eEndLoopOp!=OP_
2b0f0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
2b100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b110 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64  Op2(v, pIn->eEnd
2b120 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e 69 43 75  LoopOp, pIn->iCu
2b130 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  r, pIn->addrInTo
2b140 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  p);.          Vd
2b150 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2b160 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
2b170 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
2b180 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 50  eEndLoopOp==OP_P
2b190 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20  revIfOpen);.    
2b1a0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2b1b0 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e 65 45 6e  geIf(v, pIn->eEn
2b1c0 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e 65 78 74  dLoopOp==OP_Next
2b1d0 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  IfOpen);.       
2b1e0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2b1f0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2b200 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70  , pIn->addrInTop
2b210 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
2b220 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2b230 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2b240 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
2b250 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
2b260 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20 29 7b 0a  el->addrSkip ){.
2b270 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b280 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d  eGoto(v, pLevel-
2b290 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20  >addrSkip);.    
2b2a0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2b2b0 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d 73 63 61  , "next skip-sca
2b2c0 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f 6f 70 2d  n on %s", pLoop-
2b2d0 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
2b2e0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2b2f0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2b300 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
2b310 64 64 72 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  ddrSkip);.      
2b320 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2b330 65 72 65 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  ere(v, pLevel->a
2b340 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20 20 20 20  ddrSkip-2);.    
2b350 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
2b360 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f 4d 41 54  _LIKE_DOESNT_MAT
2b370 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20 69 66 28  CH_BLOBS.    if(
2b380 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b   pLevel->addrLik
2b390 65 52 65 70 20 29 7b 0a 20 20 20 20 20 20 73 71  eRep ){.      sq
2b3a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b3b0 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
2b3c0 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65 76 65 6c  ro, (int)(pLevel
2b3d0 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74 72 3e 3e  ->iLikeRepCntr>>
2b3e0 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1),.            
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76              pLev
2b400 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 29  el->addrLikeRep)
2b410 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2b420 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 23  rage(v);.    }.#
2b430 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4c  endif.    if( pL
2b440 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
2b450 29 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ){.      addr = 
2b460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b470 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
2b480 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
2b490 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
2b4a0 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  v);.      assert
2b4b0 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ( (pLoop->wsFlag
2b4c0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
2b4d0 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  LY)==0.         
2b4e0 20 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 77 73 46    || (pLoop->wsF
2b4f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
2b500 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20  EXED)!=0 );.    
2b510 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73    if( (pLoop->ws
2b520 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
2b530 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
2b540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b550 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
2b560 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
2b570 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
2b580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b590 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2b5a0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2b5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2b5c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2b5d0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65   OP_NullRow, pLe
2b5e0 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20  vel->iIdxCur);. 
2b5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b600 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2b610 52 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20  Return ){.      
2b620 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b630 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2b640 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
2b650 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b  vel->addrFirst);
2b660 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2b670 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b680 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d  eGoto(v, pLevel-
2b690 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20  >addrFirst);.   
2b6a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2b6b0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2b6c0 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20  , addr);.    }. 
2b6d0 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
2b6e0 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48  ment((v, "End WH
2b6f0 45 52 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c  ERE-loop%d: %s",
2b700 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
2b710 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
2b720 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
2b730 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62  vel->iFrom].pTab
2b740 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
2b750 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
2b760 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
2b770 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
2b780 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
2b790 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
2b7a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
2b7b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2b7c0 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
2b7d0 61 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ak);..  assert( 
2b7e0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d  pWInfo->nLevel<=
2b7f0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
2b800 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65  ;.  for(i=0, pLe
2b810 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69  vel=pWInfo->a; i
2b820 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
2b830 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b   i++, pLevel++){
2b840 0a 20 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74  .    int k, last
2b850 3b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  ;.    VdbeOp *pO
2b860 70 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  p;.    Index *pI
2b870 64 78 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75  dx = 0;.    stru
2b880 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2b890 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
2b8a0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2b8b0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
2b8c0 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
2b8d0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
2b8e0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
2b8f0 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c  ;.    pLoop = pL
2b900 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20  evel->pWLoop;.. 
2b910 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72     /* For a co-r
2b920 6f 75 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61  outine, change a
2b930 6c 6c 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66  ll OP_Column ref
2b940 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74  erences to the t
2b950 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  able of.    ** t
2b960 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e  he co-routine in
2b970 74 6f 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65  to OP_Copy of re
2b980 73 75 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69  sult contained i
2b990 6e 20 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20  n a register..  
2b9a0 20 20 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65    ** OP_Rowid be
2b9b0 63 6f 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20  comes OP_Null.. 
2b9c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
2b9d0 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f  abItem->fg.viaCo
2b9e0 72 6f 75 74 69 6e 65 20 26 26 20 21 64 62 2d 3e  routine && !db->
2b9f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2ba00 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43        translateC
2ba10 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 70  olumnToCopy(v, p
2ba20 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 2c  Level->addrBody,
2ba30 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2ba40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2ba60 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c  abItem->regResul
2ba70 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 6f 6e  t, 0);.      con
2ba80 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2ba90 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f    /* Close all o
2baa0 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68  f the cursors th
2bab0 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62  at were opened b
2bac0 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
2bad0 67 69 6e 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  gin..    ** Exce
2bae0 70 74 2c 20 64 6f 20 6e 6f 74 20 63 6c 6f 73 65  pt, do not close
2baf0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77 69   cursors that wi
2bb00 6c 6c 20 62 65 20 72 65 75 73 65 64 20 62 79 20  ll be reused by 
2bb10 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74  the OR optimizat
2bb20 69 6f 6e 0a 20 20 20 20 2a 2a 20 28 57 48 45 52  ion.    ** (WHER
2bb30 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 2e  E_OR_SUBCLAUSE).
2bb40 20 20 41 6e 64 20 64 6f 20 6e 6f 74 20 63 6c 6f    And do not clo
2bb50 73 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 57 72  se the OP_OpenWr
2bb60 69 74 65 20 63 75 72 73 6f 72 73 0a 20 20 20 20  ite cursors.    
2bb70 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
2bb80 68 65 20 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d  he ONEPASS optim
2bb90 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ization..    */.
2bba0 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
2bbb0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
2bbc0 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20 20 20 20  emeral)==0.     
2bbd0 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
2bbe0 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 57 49  ==0.     && (pWI
2bbf0 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
2bc00 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
2bc10 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  AUSE)==0.    ){.
2bc20 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20 70        int ws = p
2bc30 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b 0a 20  Loop->wsFlags;. 
2bc40 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2bc50 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2bc60 53 53 5f 4f 46 46 20 26 26 20 28 77 73 20 26 20  SS_OFF && (ws & 
2bc70 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2bc80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2bc90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2bca0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
2bcb0 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
2bcc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2bcd0 66 28 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  f( (ws & WHERE_I
2bce0 4e 44 45 58 45 44 29 21 3d 30 0a 20 20 20 20 20  NDEXED)!=0.     
2bcf0 20 20 26 26 20 28 77 73 20 26 20 28 57 48 45 52    && (ws & (WHER
2bd00 45 5f 49 50 4b 7c 57 48 45 52 45 5f 41 55 54 4f  E_IPK|WHERE_AUTO
2bd10 5f 49 4e 44 45 58 29 29 3d 3d 30 20 0a 20 20 20  _INDEX))==0 .   
2bd20 20 20 20 20 26 26 20 70 4c 65 76 65 6c 2d 3e 69      && pLevel->i
2bd30 49 64 78 43 75 72 21 3d 70 57 49 6e 66 6f 2d 3e  IdxCur!=pWInfo->
2bd40 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 0a  aiCurOnePass[1].
2bd50 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bd60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bd70 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
2bd80 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
2bd90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bda0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2bdb0 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
2bdc0 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63 6f  ex, make VDBE co
2bdd0 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
2bde0 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
2bdf0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
2be00 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20 66  dex instead of f
2be10 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77 68  rom the table wh
2be20 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20 49  ere possible.  I
2be30 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20 20  n some cases.   
2be40 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69 7a   ** this optimiz
2be50 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20 74  ation prevents t
2be60 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65 76  he table from ev
2be70 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20 77  er being read, w
2be80 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a 20  hich can.    ** 
2be90 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69 63  yield a signific
2bea0 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ant performance 
2beb0 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a 20  boost..    ** . 
2bec0 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
2bed0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
2bee0 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
2bef0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
2bf00 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
2bf10 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
2bf20 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
2bf30 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
2bf40 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
2bf50 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
2bf60 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
2bf70 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
2bf80 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
2bf90 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
2bfa0 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
2bfb0 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
2bfc0 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
2bfd0 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
2bfe0 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
2bff0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
2c000 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  oop->wsFlags & (
2c010 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48  WHERE_INDEXED|WH
2c020 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b  ERE_IDX_ONLY) ){
2c030 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70 4c  .      pIdx = pL
2c040 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2c050 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  dex;.    }else i
2c060 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
2c070 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s & WHERE_MULTI_
2c080 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  OR ){.      pIdx
2c090 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f   = pLevel->u.pCo
2c0a0 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  vidx;.    }.    
2c0b0 69 66 28 20 70 49 64 78 0a 20 20 20 20 20 26 26  if( pIdx.     &&
2c0c0 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61   (pWInfo->eOnePa
2c0d0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2c0e0 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 64  || !HasRowid(pId
2c0f0 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20 20  x->pTable)).    
2c100 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
2c110 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20 20  ailed.    ){.   
2c120 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65     last = sqlite
2c130 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2c140 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20 70  (v);.      k = p
2c150 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 3b  Level->addrBody;
2c160 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
2c170 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
2c180 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b   k);.      for(;
2c190 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f   k<last; k++, pO
2c1a0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
2c1b0 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
2c1c0 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
2c1d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
2c1e0 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
2c1f0 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  OP_Column ){.   
2c200 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70         int x = p
2c210 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20  Op->p2;.        
2c220 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
2c230 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a  pTable==pTab );.
2c240 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48            if( !H
2c250 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
2c260 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64  .            Ind
2c270 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74 65  ex *pPk = sqlite
2c280 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
2c290 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20  (pTab);.        
2c2a0 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43      x = pPk->aiC
2c2b0 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20 20  olumn[x];.      
2c2c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 3e        assert( x>
2c2d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2c2e0 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d 20  }.          x = 
2c2f0 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
2c300 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a 20  ndex(pIdx, x);. 
2c310 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e 3d           if( x>=
2c320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c330 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20 20   pOp->p2 = x;.  
2c340 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
2c350 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
2c360 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Cur;.          }
2c370 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c380 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  t( (pLoop->wsFla
2c390 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
2c3a0 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30 20  NLY)==0 || x>=0 
2c3b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2c3c0 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
2c3d0 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20  ==OP_Rowid ){.  
2c3e0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
2c3f0 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
2c400 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  r;.          pOp
2c410 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64  ->opcode = OP_Id
2c420 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  xRowid;.        
2c430 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2c440 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20    }..  /* Final 
2c450 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70  cleanup.  */.  p
2c460 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2c470 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
2c480 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77  dNQueryLoop;.  w
2c490 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c  hereInfoFree(db,
2c4a0 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75   pWInfo);.  retu
2c4b0 72 6e 3b 0a 7d 0a                                rn;.}.