/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 9742731e325768332d67df217eb636556c8605f895d518ee61e4d13029f8aed8:


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: 61 73 73 65 72 74 28 20 70 53 63 61 6e 2d 3e 69  assert( pScan->i
1950: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
1960: 71 75 69 76 20 29 3b 0a 20 20 70 57 43 20 3d 20  quiv );.  pWC = 
1970: 70 53 63 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68  pScan->pWC;.  wh
1980: 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c  ile(1){.    iCol
1990: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  umn = pScan->aiC
19a0: 6f 6c 75 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71  olumn[pScan->iEq
19b0: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72  uiv-1];.    iCur
19c0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b   = pScan->aiCur[
19d0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
19e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
19f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a  C!=0 );.    do{.
1a00: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a10: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a20: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a30: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a40: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a50: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a60: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1a80: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1a90: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1aa0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ab0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ac0: 70 61 72 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e  pareSkip(pTerm->
1ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64 78       pScan->pIdx
1b10: 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20  Expr,iCur)==0). 
1b20: 20 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61          && (pSca
1b30: 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20  n->iEquiv<=1 || 
1b40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b50: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
1b60: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
1b70: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b80: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1b90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
1ba0: 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  IV)!=0.         
1bb0: 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75    && pScan->nEqu
1bc0: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63  iv<ArraySize(pSc
1bd0: 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20  an->aiCur).     
1be0: 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 73        && (pX = s
1bf0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c00: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
1c10: 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70  pr->pRight))->op
1c20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1c30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c40: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1c50: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1c60: 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76   j<pScan->nEquiv
1c70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1c80: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1c90: 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69  >aiCur[j]==pX->i
1ca0: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
1cb0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61       && pScan->a
1cc0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e  iColumn[j]==pX->
1cd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1cf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d20: 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  ( j==pScan->nEqu
1d30: 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  iv ){.          
1d40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72      pScan->aiCur
1d50: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
1d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d70: 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  pScan->aiColumn[
1d80: 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  j] = pX->iColumn
1d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1da0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b  pScan->nEquiv++;
1db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1dc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1de0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
1df0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
1e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e10: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
1e20: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
1e30: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
1e40: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
1e50: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
1e60: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
1e70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e80: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
1ea0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1eb0: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
1ec0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
1ed0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
1ef0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f10: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
1f20: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
1f30: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1f80: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
1f90: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1fa0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1fb0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1fc0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
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 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
2000: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2020: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
2030: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2040: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2050: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2070: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
2080: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20d0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
20e0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
20f0: 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  Q|WO_IS))!=0.   
2100: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
2110: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
2120: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
2130: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
2140: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
2150: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72  le==pScan->aiCur
2160: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
2170: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
2180: 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e  =pScan->aiColumn
2190: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
21a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21b0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21d0: 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
21e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2200: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2210: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  pWC = pWC;.     
2220: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
2230: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
2240: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
2250: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2270: 20 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e       pWC = pWC->
2280: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
2290: 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
22a0: 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pWC!=0 );.    i
22b0: 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  f( pScan->iEquiv
22c0: 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  >=pScan->nEquiv 
22d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 57 43  ) break;.    pWC
22e0: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
22f0: 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  C;.    k = 0;.  
2300: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b    pScan->iEquiv+
2310: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
2330: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
2340: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
2350: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2370: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
2380: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
2390: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
23a0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
23b0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
23c0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
23e0: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
23f0: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
2400: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2410: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
2430: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
2440: 2e 20 20 20 4f 72 20 69 66 20 70 49 64 78 21 3d  .   Or if pIdx!=
2450: 30 20 74 68 65 6e 20 58 20 69 73 20 63 6f 6c 75  0 then X is colu
2460: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e  mn iColumn of in
2470: 64 65 78 20 70 49 64 78 2e 20 20 70 49 64 78 0a  dex pIdx.  pIdx.
2480: 2a 2a 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  ** must be one o
2490: 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66  f the indexes of
24a0: 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a   table iCur..**.
24b0: 2a 2a 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  ** The <op> must
24c0: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
24d0: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
24e0: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
24f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
2500: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
2510: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2520: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
2530: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
2540: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
2550: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
2560: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
2570: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
2580: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
2590: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
25a0: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
25b0: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
25c0: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
25d0: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
25e0: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
25f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
2600: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
2610: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
2620: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
2630: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
2640: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
2650: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
2660: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
2670: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
2680: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
2690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
26a0: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
26b0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
26c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
26d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
26e0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26f0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
2700: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2720: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
2730: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
2740: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2750: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
2760: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
2770: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
2780: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
2790: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
27a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
27c0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
27d0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
27e0: 20 2a 2f 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e   */.){.  pScan->
27f0: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
2800: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
2810: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64 78  C;.  pScan->pIdx
2820: 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 63 61  Expr = 0;.  pSca
2830: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
2840: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2850: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 64  e = 0;.  if( pId
2860: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  x ){.    int j =
2870: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43   iColumn;.    iC
2880: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
2890: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
28a0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45  f( iColumn==XN_E
28b0: 58 50 52 20 29 7b 0a 20 20 20 20 20 20 70 53 63  XPR ){.      pSc
28c0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 70  an->pIdxExpr = p
28d0: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
28e0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
28f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2900: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2910: 5b 6a 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [j];.    }else i
2920: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
2930: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2940: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
2950: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
2960: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75   }else if( iColu
2970: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  mn>=0 ){.      p
2980: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70  Scan->idxaff = p
2990: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
29a0: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
29b0: 69 74 79 3b 0a 20 20 20 20 20 20 70 53 63 61 6e  ity;.      pScan
29c0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
29d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
29e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29f0: 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50   iColumn==XN_EXP
2a00: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
2a10: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2a20: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2a30: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2a40: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2a50: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
2a60: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
2a70: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
2a80: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
2a90: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
2aa0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
2ab0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2ac0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2ad0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2ae0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2af0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2b00: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2b10: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2b20: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2b30: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2b40: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 6f 72  of table iCur or
2b50: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 0a 2a   of index pIdx.*
2b60: 2a 20 69 66 20 70 49 64 78 21 3d 30 20 61 6e 64  * if pIdx!=0 and
2b70: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2b80: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
2b90: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
2ba0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20  ed by.** the op 
2bb0: 70 61 72 61 6d 65 74 65 72 2e 20 20 52 65 74 75  parameter.  Retu
2bc0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2bd0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
2be0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21  ..**.** If pIdx!
2c00: 3d 30 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  =0 then it must 
2c10: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  be one of the in
2c20: 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69  dexes of table i
2c30: 43 75 72 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68  Cur.  .** Search
2c40: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2c50: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2c60: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2c70: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2c80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2ca0: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2cb0: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
2cc0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
2cd0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
2ce0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
2cf0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2d00: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
2d10: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2d20: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2d30: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2d40: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2d50: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2d60: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2d70: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2d80: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2d90: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2da0: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2db0: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2dc0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2dd0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2de0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2df0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2e00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2e10: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2e20: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2e30: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2e40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2e50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2e60: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2e70: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2e80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2e90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2eb0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ec0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2ed0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2ee0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2ef0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2f00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2f10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2f20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2f30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2f40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2f50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2f60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2f70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2f80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2f90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2fa0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2fb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2fc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2fd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2fe0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2ff0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
3000: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
3010: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
3020: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
3030: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
3040: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
3050: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
3060: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
3070: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
3080: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3090: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
30a0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
30b0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
30c0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
30d0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
30e0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
30f0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
3100: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3110: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
3120: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
3130: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
3140: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
3150: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
3160: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
3190: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
31a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
31b0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
31c0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
31d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
31e0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
31f0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
3200: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
3210: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
3220: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
3230: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
3240: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
3250: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
3260: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
3270: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
3280: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
3290: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
32a0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
32b0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
32c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
32d0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
32e0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
32f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3300: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
3310: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3320: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3330: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3340: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3350: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3360: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3370: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3380: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3390: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
33c0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
33d0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
33e0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
33f0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
3400: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
3410: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3420: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3430: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3440: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3450: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3460: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3470: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3480: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3490: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
34a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
34b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
34c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
34d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
3500: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
3510: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3540: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3550: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3560: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3580: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3590: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
35a0: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
35d0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
35e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
35f0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
3600: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
3610: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3640: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3650: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3660: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3670: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3680: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3690: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
36a0: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
36b0: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
36c0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
36d0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
36e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
36f0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
3700: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
3710: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
3720: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
3730: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
3740: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
3750: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20     return i;.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3770: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
3780: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
3790: 45 20 69 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  E if the iCol-th
37a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
37b0: 20 70 49 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c   pIdx is NOT NUL
37c0: 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  L.*/.static int 
37d0: 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
37e0: 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  ll(Index *pIdx, 
37f0: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74  int iCol){.  int
3800: 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   j;.  assert( pI
3810: 64 78 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  dx!=0 );.  asser
3820: 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
3830: 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ol<pIdx->nColumn
3840: 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e   );.  j = pIdx->
3850: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a  aiColumn[iCol];.
3860: 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20    if( j>=0 ){.  
3870: 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 70    return pIdx->p
3880: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e  Table->aCol[j].n
3890: 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20  otNull;.  }else 
38a0: 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( j==(-1) ){. 
38b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
38c0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
38d0: 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20  ( j==(-2) );.   
38e0: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41   return 0;  /* A
38f0: 73 73 75 6d 65 20 61 6e 20 69 6e 64 65 78 65 64  ssume an indexed
3900: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
3910: 61 6c 77 61 79 73 20 79 69 65 6c 64 20 61 20 4e  always yield a N
3920: 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f  ULL */..  }.}../
3930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
3940: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
3950: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
3960: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
3970: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  hird argument.**
3980: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a   is redundant..*
3990: 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20  *.** A DISTINCT 
39a0: 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e  list is redundan
39b0: 74 20 69 66 20 61 6e 79 20 73 75 62 73 65 74 20  t if any subset 
39c0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
39d0: 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43  n the.** DISTINC
39e0: 54 20 6c 69 73 74 20 61 72 65 20 63 6f 6c 6c 65  T list are colle
39f0: 63 74 69 76 65 6c 79 20 75 6e 69 71 75 65 20 61  ctively unique a
3a00: 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20  nd individually 
3a10: 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61  non-null..*/.sta
3a20: 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e  tic int isDistin
3a30: 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50  ctRedundant(.  P
3a40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
3a60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
3a70: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
3a80: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  st,        /* Th
3a90: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3aa0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3ab0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
3ac0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
3ad0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3ae0: 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20  pDistinct       
3af0: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
3b00: 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  t that needs to 
3b10: 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29  be DISTINCT */.)
3b20: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
3b30: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
3b40: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a    .  int iBase;.
3b70: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
3b80: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3b90: 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c  table or sub-sel
3ba0: 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
3bb0: 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74  clause of.  ** t
3bc0: 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
3bd0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
3be0: 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20  ossible to show 
3bf0: 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
3c00: 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  T .  ** clause i
3c10: 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a  s redundant. */.
3c20: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
3c30: 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
3c40: 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54   0;.  iBase = pT
3c50: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
3c60: 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70  rsor;.  pTab = p
3c70: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54  TabList->a[0].pT
3c80: 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  ab;..  /* If any
3c90: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
3ca0: 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f  ons is an IPK co
3cb0: 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42  lumn on table iB
3cc0: 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ase, then return
3cd0: 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74   .  ** true. Not
3ce0: 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c  e: The (p->iTabl
3cf0: 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f  e==iBase) part o
3d00: 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20  f this test may 
3d10: 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a  be false if the.
3d20: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c    ** current SEL
3d30: 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ECT is a correla
3d40: 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  ted sub-query.. 
3d50: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
3d60: 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70  <pDistinct->nExp
3d70: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
3d80: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
3d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
3da0: 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45  istinct->a[i].pE
3db0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
3dc0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
3dd0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
3de0: 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  se && p->iColumn
3df0: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
3e00: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68   }..  /* Loop th
3e10: 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65  rough all indice
3e20: 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s on the table, 
3e30: 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f  checking each to
3e40: 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73   see if it makes
3e50: 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e  .  ** the DISTIN
3e60: 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65 64  CT qualifier red
3e70: 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20  undant. It does 
3e80: 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  so if:.  **.  **
3e90: 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20     1. The index 
3ea0: 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45  is itself UNIQUE
3eb0: 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , and.  **.  ** 
3ec0: 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20    2. All of the 
3ed0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
3ee0: 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72 20  ndex are either 
3ef0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69 73  part of the pDis
3f00: 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20  tinct.  **      
3f10: 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68  list, or else th
3f20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
3f30: 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f  ontains a term o
3f40: 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d  f the form "col=
3f50: 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68  X",.  **      wh
3f60: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74  ere X is a const
3f70: 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63  ant value. The c
3f80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
3f90: 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20  es of the.  **  
3fa0: 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61      comparison a
3fb0: 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65  nd select-list e
3fc0: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
3fd0: 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74  match those of t
3fe0: 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  he index..  **. 
3ff0: 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20   **   3. All of 
4000: 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75  those index colu
4010: 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  mns for which th
4020: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  e WHERE clause d
4030: 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20  oes not.  **    
4040: 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c    contain a "col
4050: 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75 62  =X" term are sub
4060: 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55  ject to a NOT NU
4070: 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  LL constraint.. 
4080: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
4090: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
40a0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
40b0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 21 49  ext){.    if( !I
40c0: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
40d0: 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  x) ) continue;. 
40e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
40f0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  dx->nKeyCol; i++
4100: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
4110: 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
4120: 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
4130: 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c   i, ~(Bitmask)0,
4140: 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b   WO_EQ, pIdx) ){
4150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e  .        if( fin
4160: 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
4170: 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
4180: 73 65 2c 20 70 49 64 78 2c 20 69 29 3c 30 20 29  se, pIdx, i)<0 )
4190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
41a0: 69 66 28 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e  if( indexColumnN
41b0: 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20 69 29 3d  otNull(pIdx, i)=
41c0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
41d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
41e0: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( i==pIdx->nKeyC
41f0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ol ){.      /* T
4200: 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65  his index implie
4210: 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  s that the DISTI
4220: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73  NCT qualifier is
4230: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
4240: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4250: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
4260: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
4270: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67  Estimate the log
4280: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
4290: 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73  put value to bas
42a0: 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  e 2..*/.static L
42b0: 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67  ogEst estLog(Log
42c0: 45 73 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e  Est N){.  return
42d0: 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c   N<=10 ? 0 : sql
42e0: 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20  ite3LogEst(N) - 
42f0: 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  33;.}../*.** Con
4300: 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f  vert OP_Column o
4310: 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f 43 6f 70  pcodes to OP_Cop
4320: 79 20 69 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  y in previously 
4330: 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 2e 0a  generated code..
4340: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4350: 6e 65 20 72 75 6e 73 20 6f 76 65 72 20 67 65 6e  ne runs over gen
4360: 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65  erated VDBE code
4370: 20 61 6e 64 20 74 72 61 6e 73 6c 61 74 65 73 20   and translates 
4380: 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63  OP_Column.** opc
4390: 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f 43 6f 70  odes into OP_Cop
43a0: 79 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  y when the table
43b0: 20 69 73 20 62 65 69 6e 67 20 61 63 63 65 73 73   is being access
43c0: 65 64 20 76 69 61 20 63 6f 2d 72 6f 75 74 69 6e  ed via co-routin
43d0: 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  e .** instead of
43e0: 20 76 69 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75   via table looku
43f0: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
4400: 62 49 6e 63 72 52 6f 77 69 64 20 70 61 72 61 6d  bIncrRowid param
4410: 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
4420: 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20 69 6e 73  any OP_Rowid ins
4430: 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20  tructions on.** 
4440: 63 75 72 73 6f 72 20 69 54 61 62 43 75 72 20 61  cursor iTabCur a
4450: 72 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  re transformed i
4460: 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20 4f 72 2c  nto OP_Null. Or,
4470: 20 69 66 20 62 49 6e 63 72 52 6f 77 69 64 20 69   if bIncrRowid i
4480: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74  s non-zero,.** t
4490: 68 65 6e 20 65 61 63 68 20 4f 50 5f 52 6f 77 69  hen each OP_Rowi
44a0: 64 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  d is transformed
44b0: 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 72 75 63   into an instruc
44c0: 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65 6d 65 6e  tion to incremen
44d0: 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73  t the.** value s
44e0: 74 6f 72 65 64 20 69 6e 20 69 74 73 20 6f 75 74  tored in its out
44f0: 70 75 74 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  put register..*/
4500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
4510: 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f  nslateColumnToCo
4520: 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  py(.  Parse *pPa
4530: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
4540: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
4550: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
4560: 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61        /* Transla
4570: 74 65 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63  te from this opc
4580: 6f 64 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  ode to the end *
4590: 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
45a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f          /* OP_Co
45b0: 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65  lumn/OP_Rowid re
45c0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
45d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
45e0: 69 52 65 67 69 73 74 65 72 2c 20 20 20 20 20 20  iRegister,      
45f0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c  /* The first col
4600: 75 6d 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72  umn is in this r
4610: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
4620: 20 62 49 6e 63 72 52 6f 77 69 64 20 20 20 20 20   bIncrRowid     
4630: 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
4640: 20 74 72 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f   transform OP_ro
4650: 77 69 64 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d  wid to OP_AddImm
4660: 28 31 29 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  (1) */.){.  Vdbe
4670: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4680: 64 62 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  dbe;.  VdbeOp *p
4690: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
46a0: 47 65 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29  GetOp(v, iStart)
46b0: 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73  ;.  int iEnd = s
46c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
46d0: 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
46e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
46f0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
4700: 6e 3b 0a 20 20 66 6f 72 28 3b 20 69 53 74 61 72  n;.  for(; iStar
4710: 74 3c 69 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b  t<iEnd; iStart++
4720: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66  , pOp++){.    if
4730: 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43  ( pOp->p1!=iTabC
4740: 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
4750: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
4760: 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
4770: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  .      pOp->opco
4780: 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20  de = OP_Copy;.  
4790: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f      pOp->p1 = pO
47a0: 70 2d 3e 70 32 20 2b 20 69 52 65 67 69 73 74 65  p->p2 + iRegiste
47b0: 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  r;.      pOp->p2
47c0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
47d0: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
47e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
47f0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
4800: 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  id ){.      if( 
4810: 62 49 6e 63 72 52 6f 77 69 64 20 29 7b 0a 20 20  bIncrRowid ){.  
4820: 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
4830: 6e 74 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  nt the value sto
4840: 72 65 64 20 69 6e 20 74 68 65 20 50 32 20 6f 70  red in the P2 op
4850: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f  erand of the OP_
4860: 52 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20  Rowid. */.      
4870: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
4880: 4f 50 5f 41 64 64 49 6d 6d 3b 0a 20 20 20 20 20  OP_AddImm;.     
4890: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70     pOp->p1 = pOp
48a0: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 70 4f  ->p2;.        pO
48b0: 70 2d 3e 70 32 20 3d 20 31 3b 0a 20 20 20 20 20  p->p2 = 1;.     
48c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
48d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
48e0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
48f0: 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20  Op->p1 = 0;.    
4900: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
4910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4920: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20   }.}../*.** Two 
4930: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
4940: 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
4950: 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
4960: 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
4970: 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
4980: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
4990: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
49a0: 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
49b0: 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
49c0: 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
49d0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
49e0: 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
49f0: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
4a00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4a10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4a20: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57  LE) && defined(W
4a30: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
4a40: 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  D).static void T
4a50: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
4a60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
4a70: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
4a80: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
4a90: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
4aa0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
4ab0: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
4ac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
4ad0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4ae0: 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
4af0: 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
4b00: 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
4b10: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
4b20: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
4b30: 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
4b40: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
4b50: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
4b60: 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
4b70: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
4b80: 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
4b90: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
4ba0: 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
4bb0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
4bc0: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
4bd0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4be0: 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
4bf0: 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
4c00: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
4c10: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
4c20: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
4c30: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
4c40: 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
4c50: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
4c60: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
4c70: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
4c80: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
4c90: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
4ca0: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
4cb0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
4cc0: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
4cd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
4ce0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4cf0: 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
4d00: 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
4d10: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
4d20: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4d30: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
4d40: 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
4d50: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
4d60: 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
4d70: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
4d80: 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
4d90: 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
4da0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4db0: 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
4dc0: 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
4dd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
4de0: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4df0: 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
4e00: 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
4e10: 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
4e20: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
4e30: 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
4e40: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
4e50: 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cost);.  sqlite3
4e60: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
4e70: 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c  stimatedRows=%ll
4e80: 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  d\n", p->estimat
4e90: 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  edRows);.}.#else
4ea0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
4eb0: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
4ec0: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
4ed0: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
4ee0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4ef0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
4f00: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
4f10: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
4f20: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4f30: 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
4f40: 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
4f50: 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
4f60: 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
4f70: 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
4f80: 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
4f90: 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
4fa0: 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
4fb0: 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
4fc0: 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
4fd0: 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
4fe0: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
4ff0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
5000: 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
5010: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
5020: 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
5030: 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
5040: 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
5050: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5070: 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
5080: 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
5090: 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
50a0: 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
50b0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
50c0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
50d0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
50e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
50f0: 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29   & (WO_EQ|WO_IS)
5100: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
5110: 0a 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67  .  if( (pSrc->fg
5120: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
5130: 45 46 54 29 20 0a 20 20 20 26 26 20 21 45 78 70  EFT) .   && !Exp
5140: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
5150: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
5160: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 28 70  omJoin).   && (p
5170: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
5180: 26 20 57 4f 5f 49 53 29 0a 20 20 29 7b 0a 20 20  & WO_IS).  ){.  
5190: 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20    /* Cannot use 
51a0: 61 6e 20 49 53 20 74 65 72 6d 20 66 72 6f 6d 20  an IS term from 
51b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
51c0: 20 61 73 20 61 6e 20 69 6e 64 65 78 20 64 72 69   as an index dri
51d0: 76 65 72 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74  ver for.    ** t
51e0: 68 65 20 52 48 53 20 6f 66 20 61 20 4c 45 46 54  he RHS of a LEFT
51f0: 20 4a 4f 49 4e 2e 20 53 75 63 68 20 61 20 74 65   JOIN. Such a te
5200: 72 6d 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  rm can only be u
5210: 73 65 64 20 69 66 20 69 74 20 69 73 20 66 72 6f  sed if it is fro
5220: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20  m.    ** the ON 
5230: 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20  clause.  */.    
5240: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5250: 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
5260: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
5270: 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
5280: 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  0;.  if( pTerm->
5290: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29  u.leftColumn<0 )
52a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66   return 0;.  aff
52b0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61   = pSrc->pTab->a
52c0: 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  Col[pTerm->u.lef
52d0: 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  tColumn].affinit
52e0: 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  y;.  if( !sqlite
52f0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
5300: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61  (pTerm->pExpr, a
5310: 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ff) ) return 0;.
5320: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
5330: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
5340: 5f 49 53 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _IS );.  return 
5350: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  1;.}.#endif...#i
5360: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5370: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
5380: 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
5390: 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
53a0: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
53b0: 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
53c0: 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
53d0: 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
53e0: 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
53f0: 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
5400: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
5410: 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
5420: 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
5430: 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
5440: 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
5450: 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
5460: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5480: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
5490: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
54a0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
54b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
54c0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
54d0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
54e0: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
54f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
5500: 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
5510: 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
5520: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
5530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5540: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
5550: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
5560: 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
5570: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
5580: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
5590: 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
55a0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f  .){.  int nKeyCo
55b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
55c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
55d0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
55e0: 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
55f0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
5600: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
5610: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
5620: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
5630: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5640: 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
5650: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
5660: 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49   pWC->a[] */.  I
5670: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
5680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
5690: 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
56a0: 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
56b0: 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
56c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56d0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
56e0: 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
56f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
5700: 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5720: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
5730: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
5740: 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
5750: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5770: 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
5780: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
5790: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
57a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
57b0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c  of the index fil
57c0: 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  l loop */.  int 
57d0: 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
57e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
57f0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69  ter holding an i
5800: 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
5810: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5830: 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a  Column counter *
5840: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
5870: 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f  */.  int mxBitCo
5880: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
5890: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75   /* Maximum colu
58a0: 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55  mn in pSrc->colU
58b0: 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  sed */.  CollSeq
58c0: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
58d0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
58e0: 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e  g sequence to on
58f0: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57   a column */.  W
5900: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
5910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5920: 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  e Loop object */
5930: 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65  .  char *zNotUse
5940: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
5950: 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f 6e  * Extra space on
5960: 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64 78   the end of pIdx
5970: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64   */.  Bitmask id
5980: 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  xCols;          
5990: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63    /* Bitmap of c
59a0: 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20  olumns used for 
59b0: 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
59c0: 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b  tmask extraCols;
59d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
59e0: 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  map of additiona
59f0: 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  l columns */.  u
5a00: 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20  8 sentWarning = 
5a10: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
5a20: 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e 67  ue if a warnning
5a30: 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65 64   has been issued
5a40: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 61 72   */.  Expr *pPar
5a50: 74 69 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  tial = 0;       
5a60: 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 49 6e 64    /* Partial Ind
5a70: 65 78 20 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ex Expression */
5a80: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
5a90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
5aa0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
5ab0: 6b 69 70 20 65 78 63 6c 75 64 65 64 20 72 6f 77  kip excluded row
5ac0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
5ad0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
5ae0: 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
5af0: 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
5b00: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
5b10: 74 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d 20  t addrCounter = 
5b20: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  0;        /* Add
5b30: 72 65 73 73 20 77 68 65 72 65 20 69 6e 74 65 67  ress where integ
5b40: 65 72 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e  er counter is in
5b50: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
5b60: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
5b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
5b80: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
5b90: 20 77 68 65 72 65 20 72 65 63 6f 72 64 20 69 73   where record is
5ba0: 20 61 73 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20   assembled */.. 
5bb0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5bc0: 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
5bd0: 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
5be0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
5bf0: 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
5c00: 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
5c10: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
5c20: 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
5c30: 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
5c40: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5c50: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
5c60: 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
5c70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c80: 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
5c90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5ca0: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
5cb0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
5cc0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
5cd0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
5ce0: 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
5cf0: 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
5d00: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
5d10: 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d  s */.  nKeyCol =
5d20: 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
5d30: 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
5d40: 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
5d50: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f  C->nTerm];.  pLo
5d60: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
5d70: 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  oop;.  idxCols =
5d80: 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
5d90: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
5da0: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
5db0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
5dc0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
5dd0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
5de0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5df0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5e00: 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20 61 6c      /* prereq al
5e10: 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  ways non-zero */
5e20: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78  .         || pEx
5e30: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
5e40: 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
5e50: 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20 74 68  or   /*   for th
5e60: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20 20 2a  e right-hand   *
5e70: 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4c  /.         || pL
5e80: 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30 20 29  oop->prereq!=0 )
5e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ea0: 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62 6c 65        /*   table
5eb0: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
5ec0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
5ed0: 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20 20 20  ->prereq==0.    
5ee0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   && (pTerm->wtFl
5ef0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
5f00: 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 21  AL)==0.     && !
5f10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5f20: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
5f30: 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  in).     && sqli
5f40: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
5f50: 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20 70 53  nstant(pExpr, pS
5f60: 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a  rc->iCursor) ){.
5f70: 20 20 20 20 20 20 70 50 61 72 74 69 61 6c 20 3d        pPartial =
5f80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
5f90: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72  pParse->db, pPar
5fa0: 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tial,.          
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5fd0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
5fe0: 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20   pExpr, 0));.   
5ff0: 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43   }.    if( termC
6000: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
6010: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
6020: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
6030: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
6040: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
6050: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
6060: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
6070: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
6080: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
6090: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
60a0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
60b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
60c0: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
60d0: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
60e0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
60f0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6100: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
6110: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
6120: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6130: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
6140: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
6150: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
6160: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
6170: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
6180: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
6190: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
61a0: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
61b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
61c0: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
61d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
61e0: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
61f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
6200: 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f   end_auto_index_
6210: 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20 20 20  create;.        
6220: 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  }.        pLoop-
6230: 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b  >aLTerm[nKeyCol+
6240: 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
6250: 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
6260: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
6270: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6280: 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20  ( nKeyCol>0 );. 
6290: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
62a0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  nEq = pLoop->nLT
62b0: 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20  erm = nKeyCol;. 
62c0: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
62d0: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
62e0: 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
62f0: 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58  LY | WHERE_INDEX
6300: 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED.             
6310: 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f          | WHERE_
6320: 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f  AUTO_INDEX;..  /
6330: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
6340: 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
6350: 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
6360: 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
6370: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
6380: 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
6390: 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
63a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
63b0: 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
63c0: 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
63d0: 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
63e0: 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
63f0: 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
6400: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
6410: 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
6420: 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
6430: 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
6440: 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
6450: 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
6460: 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
6470: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
6480: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
6490: 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
64a0: 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
64b0: 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
64c0: 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
64d0: 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
64e0: 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
64f0: 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
6500: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
6510: 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b  (~idxCols | MASK
6520: 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d  BIT(BMS-1));.  m
6530: 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d  xBitCol = MIN(BM
6540: 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  S-1,pTable->nCol
6550: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
6560: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
6570: 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
6580: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
6590: 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
65a0: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
65b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
65c0: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
65d0: 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b  T(i) ) nKeyCol++
65e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
65f0: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
6600: 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
6610: 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61    nKeyCol += pTa
6620: 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
6630: 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  + 1;.  }..  /* C
6640: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
6650: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
6660: 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
6670: 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c   */.  pIdx = sql
6680: 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
6690: 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e  xObject(pParse->
66a0: 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30  db, nKeyCol+1, 0
66b0: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  , &zNotUsed);.  
66c0: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 67 6f  if( pIdx==0 ) go
66d0: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
66e0: 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f  x_create;.  pLoo
66f0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
6700: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
6710: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
6720: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
6730: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
6740: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
6750: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
6760: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
6770: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
6780: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
6790: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
67a0: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
67b0: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
67c0: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
67d0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
67e0: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
67f0: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
6800: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
6810: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
6820: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6830: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
6840: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6850: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
6860: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
6870: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
6880: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
6890: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
68a0: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
68b0: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
68c0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
68d0: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
68e0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
68f0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6900: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
6910: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
6920: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
6930: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
6940: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
6950: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
6960: 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65 33 53  zName : sqlite3S
6970: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
6980: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
6990: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
69a0: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
69b0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
69c0: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
69d0: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
69e0: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
69f0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
6a00: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
6a10: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
6a20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
6a30: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
6a40: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
6a50: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
6a60: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
6a70: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
6a80: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6a90: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
6aa0: 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  ARY;.      n++;.
6ab0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6ac0: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
6ad0: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
6ae0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
6af0: 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
6b00: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
6b10: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
6b20: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
6b30: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71  ->azColl[n] = sq
6b40: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
6b50: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
6b60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
6b70: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
6b80: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
6b90: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70   = XN_ROWID;.  p
6ba0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
6bb0: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
6bc0: 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  Y;..  /* Create 
6bd0: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
6be0: 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
6bf0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
6c00: 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d  >=0 );.  pLevel-
6c10: 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
6c20: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
6c30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6c40: 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
6c50: 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
6c60: 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b  Cur, nKeyCol+1);
6c70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
6c80: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
6c90: 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65  e, pIdx);.  Vdbe
6ca0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
6cb0: 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
6cc0: 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
6cd0: 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
6ce0: 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
6cf0: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  nt */.  sqlite3E
6d00: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
6d10: 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74 65 6d  rse);.  pTabItem
6d20: 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d   = &pWC->pWInfo-
6d30: 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
6d40: 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
6d50: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
6d60: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
6d70: 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
6d80: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
6d90: 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64 64 72  Return;.    addr
6da0: 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  Counter = sqlite
6db0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6dc0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
6dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6de0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6df0: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
6e00: 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74  Yield, 0, pTabIt
6e10: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
6e20: 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  ;.    addrTop = 
6e30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6e40: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
6e50: 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
6e60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6e70: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
6e80: 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
6e90: 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74   \"%s\"", pTabIt
6ea0: 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
6eb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6ec0: 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
6ed0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6ee0: 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c  P_Rewind, pLevel
6ef0: 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62 65  ->iTabCur); Vdbe
6f00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
6f10: 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
6f20: 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75 65  ){.    iContinue
6f30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6f40: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
6f50: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
6f60: 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  se(pParse, pPart
6f70: 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  ial, iContinue, 
6f80: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
6f90: 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  L);.    pLoop->w
6fa0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
6fb0: 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a  PARTIALIDX;.  }.
6fc0: 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
6fd0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6fe0: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 42 61  pParse);.  regBa
6ff0: 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65  se = sqlite3Gene
7000: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a 20 20  rateIndexKey(.  
7010: 20 20 20 20 70 50 61 72 73 65 2c 20 70 49 64 78      pParse, pIdx
7020: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
7030: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c  r, regRecord, 0,
7040: 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20   0, 0, 0.  );.  
7050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7060: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
7070: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t, pLevel->iIdxC
7080: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ur, regRecord);.
7090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
70a0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
70b0: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
70c0: 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20 29    if( pPartial )
70d0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
70e0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
70f0: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 54  tinue);.  if( pT
7100: 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f  abItem->fg.viaCo
7110: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73  routine ){.    s
7120: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7130: 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e 74 65  P2(v, addrCounte
7140: 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b 0a 20  r, regBase+n);. 
7150: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
7160: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
7170: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 74 72 61  ailed );.    tra
7180: 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f  nslateColumnToCo
7190: 70 79 28 70 50 61 72 73 65 2c 20 61 64 64 72 54  py(pParse, addrT
71a0: 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  op, pLevel->iTab
71b0: 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
71d0: 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75  TabItem->regResu
71e0: 6c 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  lt, 1);.    sqli
71f0: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
7200: 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61  ddrTop);.    pTa
7210: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
7220: 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  outine = 0;.  }e
7230: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7240: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7250: 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
7260: 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
7270: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
7280: 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
7290: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
72a0: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
72b0: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
72c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
72d0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
72e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
72f0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7300: 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
7310: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
7320: 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
7330: 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
7340: 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
7350: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
7360: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
7370: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
7380: 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74  rInit);..end_aut
7390: 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a  o_index_create:.
73a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
73b0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
73c0: 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e  pPartial);.}.#en
73d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
73e0: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
73f0: 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EX */..#ifndef S
7400: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7410: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c  ALTABLE./*.** Al
7420: 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
7430: 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69  ate an sqlite3_i
7440: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
7450: 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ure. It is the .
7460: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
7470: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
7480: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  to eventually re
7490: 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74  lease the struct
74a0: 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e  ure.** by passin
74b0: 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65  g the pointer re
74c0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
74d0: 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74  unction to sqlit
74e0: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
74f0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64  atic sqlite3_ind
7500: 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74  ex_info *allocat
7510: 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61  eIndexInfo(.  Pa
7520: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57  rse *pParse,.  W
7530: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
7540: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
7550: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
7560: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72     /* Ignore ter
7570: 6d 73 20 77 69 74 68 20 74 68 65 73 65 20 70 72  ms with these pr
7580: 65 72 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63  ereqs */.  struc
7590: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
75a0: 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74  pSrc,.  ExprList
75b0: 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 75 31   *pOrderBy,.  u1
75c0: 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20 20  6 *pmNoOmit     
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
75e0: 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20 6e   Mask of terms n
75f0: 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b  ot to omit */.){
7600: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
7610: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
7620: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7630: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
7640: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
7650: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
7660: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
7670: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
7680: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7690: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
76a0: 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
76b0: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
76c0: 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
76d0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
76e0: 49 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d  IdxInfo;.  u16 m
76f0: 4e 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f  NoOmit = 0;..  /
7700: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
7710: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
7720: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
7730: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
7740: 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
7750: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
7760: 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
7770: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
7780: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
7790: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
77a0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
77b0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
77c0: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
77d0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
77e0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
77f0: 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74  mUnusable ) cont
7800: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
7810: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
7820: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7830: 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
7840: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7850: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7860: 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
7870: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7880: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
7890: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
78a0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
78b0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
78c0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
78d0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
78e0: 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20   & WO_ALL );.   
78f0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
7900: 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51  erator & ~(WO_EQ
7910: 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  UIV))==0 ) conti
7920: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
7930: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
7940: 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
7950: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7960: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
7970: 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20  lumn>=(-1) );.  
7980: 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
7990: 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
79a0: 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
79b0: 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
79c0: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
79d0: 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
79e0: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
79f0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
7a00: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
7a10: 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
7a20: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
7a30: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
7a40: 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
7a50: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
7a60: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
7a70: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
7a80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
7a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
7aa0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
7ab0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
7ac0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
7ad0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
7ae0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
7af0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
7b00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7b10: 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
7b20: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
7b30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7b40: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
7b50: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7b60: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
7b70: 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
7b80: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7b90: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
7ba0: 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
7bd0: 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
7be0: 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
7bf0: 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
7c20: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
7c30: 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
7c40: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
7c50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7c60: 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
7c70: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75  mory");.    retu
7c80: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
7c90: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
7ca0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
7cb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7cc0: 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
7cd0: 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
7ce0: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
7cf0: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
7d00: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
7d10: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
7d20: 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
7d30: 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
7d40: 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
7d50: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
7d60: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
7d70: 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
7d80: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
7d90: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7da0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
7db0: 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
7dc0: 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
7dd0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7de0: 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
7df0: 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
7e00: 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
7e10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
7e20: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
7e30: 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
7e40: 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
7e50: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
7e60: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
7e70: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
7e80: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
7e90: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
7ea0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7eb0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
7ec0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
7ed0: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
7ee0: 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
7ef0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
7f00: 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
7f10: 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
7f20: 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
7f30: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7f40: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
7f50: 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
7f60: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
7f70: 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
7fc0: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
7fd0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
7fe0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
7ff0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 31 36 20  erm++){.    u16 
8000: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
8010: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
8020: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
8030: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8040: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
8050: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
8060: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8070: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
8080: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
8090: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
80a0: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
80b0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
80c0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
80d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
80e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
80f0: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
8100: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
8110: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8120: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
8130: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
8140: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
8150: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
8160: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8170: 20 7e 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30   ~(WO_EQUIV))==0
8180: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8190: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
81a0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
81b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
81c0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
81d0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d  u.leftColumn>=(-
81e0: 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78 43 6f  1) );.    pIdxCo
81f0: 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
8200: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
8210: 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  umn;.    pIdxCon
8220: 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
8230: 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 70   = i;.    op = p
8240: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8250: 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  & WO_ALL;.    if
8260: 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70  ( op==WO_IN ) op
8270: 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 69 66   = WO_EQ;.    if
8280: 28 20 6f 70 3d 3d 57 4f 5f 41 55 58 20 29 7b 0a  ( op==WO_AUX ){.
8290: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
82a0: 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d  ].op = pTerm->eM
82b0: 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  atchOp;.    }els
82c0: 65 20 69 66 28 20 6f 70 20 26 20 28 57 4f 5f 49  e if( op & (WO_I
82d0: 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 20 29 7b 0a  SNULL|WO_IS) ){.
82e0: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f        if( op==WO
82f0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
8300: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
8310: 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  p = SQLITE_INDEX
8320: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e 55  _CONSTRAINT_ISNU
8330: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LL;.      }else{
8340: 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
8350: 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45  s[j].op = SQLITE
8360: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8370: 54 5f 49 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  T_IS;.      }.  
8380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
8390: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
83a0: 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 2f 2a  (u8)op;.      /*
83b0: 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
83c0: 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
83d0: 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
83e0: 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
83f0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
8400: 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45  e WO_ and SQLITE
8410: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8420: 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65  T_ codes are ide
8430: 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  ntical.  The.   
8440: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
8450: 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
8460: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
8470: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51     assert( WO_EQ
8480: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8490: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a  ONSTRAINT_EQ );.
84a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
84b0: 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
84c0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
84d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
84e0: 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
84f0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8500: 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LE );.      asse
8510: 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
8520: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8530: 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 61  NT_GT );.      a
8540: 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51  ssert( WO_GE==SQ
8550: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8560: 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20  RAINT_GE );.    
8570: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8580: 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 49  >eOperator&(WO_I
8590: 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f  N|WO_EQ|WO_LT|WO
85a0: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
85b0: 57 4f 5f 41 55 58 29 20 29 3b 0a 0a 20 20 20 20  WO_AUX) );..    
85c0: 20 20 69 66 28 20 6f 70 20 26 20 28 57 4f 5f 4c    if( op & (WO_L
85d0: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
85e0: 5f 47 45 29 0a 20 20 20 20 20 20 20 26 26 20 73  _GE).       && s
85f0: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
8600: 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  or(pTerm->pExpr-
8610: 3e 70 52 69 67 68 74 29 20 0a 20 20 20 20 20 20  >pRight) .      
8620: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
8630: 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d  <16 ) mNoOmit |=
8640: 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20   (1 << i);.     
8650: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54     if( op==WO_LT
8660: 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f   ) pIdxCons[j].o
8670: 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  p = WO_LE;.     
8680: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 47 54     if( op==WO_GT
8690: 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f   ) pIdxCons[j].o
86a0: 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20 20  p = WO_GE;.     
86b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 2b   }.    }..    j+
86c0: 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
86d0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
86e0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
86f0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
8700: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8710: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
8720: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
8730: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
8740: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
8750: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8760: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
8770: 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69 74 20 3d 20  ..  *pmNoOmit = 
8780: 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72 65 74 75 72  mNoOmit;.  retur
8790: 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
87a0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
87b0: 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
87c0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
87d0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
87e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
87f0: 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
8800: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
8810: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
8820: 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
8830: 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
8840: 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
8850: 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
8860: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8870: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
8880: 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
8890: 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
88a0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
88b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
88c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
88d0: 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
88e0: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
88f0: 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
8900: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
8910: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
8920: 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
8930: 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
8940: 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
8950: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
8960: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
8970: 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
8980: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
8990: 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
89a0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
89b0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
89c0: 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
89d0: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
89e0: 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
89f0: 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
8a00: 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
8a10: 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
8a20: 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
8a30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
8a40: 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
8a50: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
8a60: 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
8a70: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
8a80: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
8a90: 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
8aa0: 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
8ab0: 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
8ac0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54  ;.  int rc;..  T
8ad0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
8ae0: 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  p);.  rc = pVtab
8af0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74  ->pModule->xBest
8b00: 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b  Index(pVtab, p);
8b10: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
8b20: 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20  PUTS(p);..  if( 
8b30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8b40: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8b50: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
8b60: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
8b70: 6c 74 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  lt(pParse->db);.
8b80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
8b90: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
8ba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8bb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8bc0: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
8bd0: 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
8be0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8bf0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8c00: 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
8c10: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
8c20: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
8c30: 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
8c40: 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
8c50: 4d 73 67 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a  Msg = 0;..#if 0.
8c60: 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
8c70: 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 62 79  is now caught by
8c80: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
8c90: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 22 78 42  * Search for "xB
8ca0: 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63  estIndex malfunc
8cb0: 74 69 6f 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20  tion" below */. 
8cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8cd0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
8ce0: 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
8cf0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
8d00: 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
8d10: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
8d20: 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
8d30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8d40: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8d50: 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
8d60: 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
8d70: 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
8d80: 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
8d90: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  me);.    }.  }.#
8da0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
8db0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
8dc0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
8dd0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8de0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
8df0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e00: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
8e10: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
8e20: 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
8e30: 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
8e40: 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
8e50: 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
8e60: 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
8e70: 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
8e80: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
8e90: 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
8ea0: 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
8eb0: 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
8ec0: 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61   pRec.**    aSta
8ed0: 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
8ee0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
8ef0: 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a  ual to pRec.**.*
8f00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
8f10: 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65  ex of the sample
8f20: 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61   that is the sma
8f30: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61  llest sample tha
8f40: 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
8f50: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8f60: 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74   pRec. Note that
8f70: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   this index is n
8f80: 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69  ot an index.** i
8f90: 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  nto the aSample[
8fa0: 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20  ] array - it is 
8fb0: 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20  an index into a 
8fc0: 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73  virtual set of s
8fd0: 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20  amples.** based 
8fe0: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
8ff0: 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64  of aSample[] and
9000: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
9010: 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20  ields in record 
9020: 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74  .** pRec. .*/.st
9030: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
9040: 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
9050: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9060: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9070: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9080: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
90a0: 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
90b0: 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
90c0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
90d0: 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
90e0: 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
90f0: 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
9100: 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9120: 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
9130: 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
9140: 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
9150: 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
9160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
9170: 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
9180: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
9190: 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
91a0: 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
91b0: 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
91e0: 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
91f0: 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
9200: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9220: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61  ndex of first sa
9230: 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a  mple >= pRec */.
9240: 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20    int iSample;  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9260: 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
9270: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
9280: 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
9290: 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
92b0: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
92c0: 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
92d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
9300: 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
9310: 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
9320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
9330: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
9340: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
9350: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9370: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9380: 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52   in pRec */.  tR
9390: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30  owcnt iLower = 0
93a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c  ;         /* anL
93b0: 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20  t[] + anEq[] of 
93c0: 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70  largest sample p
93d0: 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66  Rec is > */..#if
93e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
93f0: 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
9400: 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
9410: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
9420: 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73   pRec!=0 );.  as
9430: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
9440: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
9450: 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
9460: 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c  0 && pRec->nFiel
9470: 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  d<=pIdx->nSample
9480: 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  Col );..  /* Do 
9490: 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
94a0: 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  to find the firs
94b0: 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72  t sample greater
94c0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20   than or equal. 
94d0: 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20   ** to pRec. If 
94e0: 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20  pRec contains a 
94f0: 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68  single field, th
9500: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
9510: 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20   to search.  ** 
9520: 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53  is simply the aS
9530: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49  ample[] array. I
9540: 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e  f the samples in
9550: 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61   aSample[] conta
9560: 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61  in more.  ** tha
9570: 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c  n one fields, al
9580: 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69  l fields followi
9590: 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65  ng the first are
95a0: 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20   ignored..  **. 
95b0: 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74   ** If pRec cont
95c0: 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77  ains N fields, w
95d0: 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74  here N is more t
95e0: 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73  han one, then as
95f0: 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a   well as the.  *
9600: 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  * samples in aSa
9610: 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65  mple[] (truncate
9620: 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20  d to N fields), 
9630: 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20  the search also 
9640: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73  has to.  ** cons
9650: 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66  ider prefixes of
9660: 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20   those samples. 
9670: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
9680: 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
9690: 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70  es.  ** in aSamp
96a0: 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  le is:.  **.  **
96b0: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20       aSample[0] 
96c0: 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (a, 5) .  **  
96d0: 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20     aSample[1] = 
96e0: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
96f0: 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28    aSample[2] = (
9700: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
9710: 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c  aSample[3] = (c,
9720: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9730: 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c  aSample[4] = (c,
9740: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
9750: 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20  Then the search 
9760: 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65  space should ide
9770: 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70  ally be the samp
9780: 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68  les above and th
9790: 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70  e .  ** unique p
97a0: 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d  refixes [a], [b]
97b0: 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69   and [c]. But si
97c0: 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64  nce that is hard
97d0: 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20   to organize, . 
97e0: 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74   ** the code act
97f0: 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74  ually searches t
9800: 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20  his set:.  **.  
9810: 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20  **     0: (a) . 
9820: 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35   **     1: (a, 5
9830: 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28  ) .  **     2: (
9840: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
9850: 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   3: (a, 10) .  *
9860: 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20  *     4: (b) .  
9870: 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29  **     5: (b, 5)
9880: 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63   .  **     6: (c
9890: 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28  ) .  **     7: (
98a0: 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
98b0: 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20    8: (c, 105).  
98c0: 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30  **     9: (c, 10
98d0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  5).  **.  ** For
98e0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20   each sample in 
98f0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9900: 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61  ray, N samples a
9910: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
9920: 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  e.  ** effective
9930: 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49   sample array. I
9940: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d  n the above, sam
9950: 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65  ples 0 and 1 are
9960: 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20   based on .  ** 
9970: 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30  sample aSample[0
9980: 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64  ]. Samples 2 and
9990: 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d   3 on aSample[1]
99a0: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
99b0: 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20  Often, sample i 
99c0: 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66  of each block of
99d0: 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d   N effective sam
99e0: 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66  ples has (i+1) f
99f0: 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65  ields..  ** Exce
9a00: 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20  pt, each sample 
9a10: 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20  may be extended 
9a20: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  to ensure that i
9a30: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
9a40: 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20  n or.  ** equal 
9a50: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
9a60: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72  sample in the ar
9a70: 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ray. For example
9a80: 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  , in the above, 
9a90: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69  .  ** sample 2 i
9aa0: 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
9ab0: 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66  le of a block of
9ac0: 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61   N samples, so a
9ad0: 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a  t first it .  **
9ae0: 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74   appears that it
9af0: 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65   should be 1 fie
9b00: 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65  ld in size. Howe
9b10: 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20  ver, that would 
9b20: 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d  make it .  ** sm
9b30: 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  aller than sampl
9b40: 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61  e 1, so the bina
9b50: 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20  ry search would 
9b60: 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72  not work. As a r
9b70: 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20  esult, .  ** it 
9b80: 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74  is extended to t
9b90: 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64  wo fields. The d
9ba0: 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74  uplicates that t
9bb0: 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e  his creates do n
9bc0: 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61  ot .  ** cause a
9bd0: 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
9be0: 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65  /.  nField = pRe
9bf0: 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f  c->nField;.  iCo
9c00: 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65  l = 0;.  iSample
9c10: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
9c20: 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b   * nField;.  do{
9c30: 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20  .    int iSamp; 
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
9c60: 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74  Sample[] of test
9c70: 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69   sample */.    i
9c80: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ca0: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9cb0: 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20   in test sample 
9cc0: 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20  */..    iTest = 
9cd0: 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32  (iMin+iSample)/2
9ce0: 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54  ;.    iSamp = iT
9cf0: 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20  est / nField;.  
9d00: 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b    if( iSamp>0 ){
9d10: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  .      /* The pr
9d20: 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65  oposed effective
9d30: 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65   sample is a pre
9d40: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53  fix of sample aS
9d50: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20  ample[iSamp]..  
9d60: 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61      ** Specifica
9d70: 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73  lly, the shortes
9d80: 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c  t prefix of at l
9d90: 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25  east (1 + iTest%
9da0: 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a  nField) .      *
9db0: 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73  * fields that is
9dc0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
9dd0: 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63  e previous effec
9de0: 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f  tive sample.  */
9df0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54  .      for(n=(iT
9e00: 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20  est % nField) + 
9e10: 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b  1; n<nField; n++
9e20: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
9e30: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e  Sample[iSamp-1].
9e40: 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70  anLt[n-1]!=aSamp
9e50: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9e60: 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  -1] ) break;.   
9e70: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9e80: 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20        n = iTest 
9e90: 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  + 1;.    }..    
9ea0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
9eb0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
9ec0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
9ed0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61  pare(aSample[iSa
9ee0: 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  mp].n, aSample[i
9ef0: 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Samp].p, pRec);.
9f00: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
9f10: 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
9f20: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
9f30: 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70  nLt[n-1] + aSamp
9f40: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e  le[iSamp].anEq[n
9f50: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
9f60: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d  = iTest+1;.    }
9f70: 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20  else if( res==0 
9f80: 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20  && n<nField ){. 
9f90: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9fa0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9fb0: 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  t[n-1];.      iM
9fc0: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
9fd0: 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20      res = -1;.  
9fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
9ff0: 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a  Sample = iTest;.
a000: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31        iCol = n-1
a010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
a020: 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53  ( res && iMin<iS
a030: 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69  ample );.  i = i
a040: 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b  Sample / nField;
a050: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a060: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
a070: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
a080: 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
a090: 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
a0a0: 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
a0b0: 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
a0c0: 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
a0d0: 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
a0e0: 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
a0f0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
a100: 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
a110: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  ts.  */.  if( pP
a120: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
a130: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
a140: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
a150: 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d       /* If (res=
a160: 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65  =0) is true, the
a170: 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65  n pRec must be e
a180: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
a190: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
a1a0: 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  t( i<pIdx->nSamp
a1b0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  le );.      asse
a1c0: 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64  rt( iCol==nField
a1d0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  -1 );.      pRec
a1e0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
a1f0: 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  d;.      assert(
a200: 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52   0==sqlite3VdbeR
a210: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
a220: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
a230: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a  le[i].p, pRec) .
a240: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
a250: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
a260: 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b  Failed .      );
a270: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a280: 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70    /* Unless i==p
a290: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e  Idx->nSample, in
a2a0: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52  dicating that pR
a2b0: 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ec is larger tha
a2c0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73  n.      ** all s
a2d0: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53  amples in the aS
a2e0: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70  ample[] array, p
a2f0: 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c  Rec must be smal
a300: 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20  ler than the.   
a310: 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66     ** (iCol+1) f
a320: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
a330: 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20  ample i.  */.   
a340: 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49     assert( i<=pI
a350: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69  dx->nSample && i
a360: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  >=0 );.      pRe
a370: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
a380: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
a390: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i==pIdx->nSamp
a3a0: 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  le .           |
a3b0: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
a3c0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
a3d0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
a3e0: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20  [i].p, pRec)>0. 
a3f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
a400: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
a410: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20  ailed );..      
a420: 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69  /* if i==0 and i
a430: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63  Col==0, then rec
a440: 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c  ord pRec is smal
a450: 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ler than all sam
a460: 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ples.      ** in
a470: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
a480: 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
a490: 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65   if (iCol>0) the
a4a0: 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20  n pRec must.    
a4b0: 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20    ** be greater 
a4c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
a4d0: 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c   the (iCol) fiel
a4e0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
a4f0: 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49  le i..      ** I
a500: 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52  f (i>0), then pR
a510: 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ec must also be 
a520: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d  greater than sam
a530: 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20  ple (i-1).  */. 
a540: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
a550: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
a560: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a  >nField = iCol;.
a570: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a580: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
a590: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
a5a0: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
a5b0: 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20  ].p, pRec)<=0.  
a5c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
a5d0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
a5e0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
a5f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  }.      if( i>0 
a600: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
a610: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
a620: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a630: 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
a640: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
a650: 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70  le[i-1].n, aSamp
a660: 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29  le[i-1].p, pRec)
a670: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <0.             
a680: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
a690: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
a6a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a6b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
a6c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
a6d0: 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
a6e0: 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  {.    /* Record 
a6f0: 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f  pRec is equal to
a700: 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20   sample i */.   
a710: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
a720: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61  Field-1 );.    a
a730: 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
a740: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a750: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a760: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b  aSample[i].anEq[
a770: 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol];.  }else{.
a780: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
a790: 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b  oint, the (iCol+
a7a0: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
a7b0: 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  of aSample[i] is
a7c0: 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
a7d0: 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  ** sample that i
a7e0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  s greater than p
a7f0: 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70  Rec. Or, if i==p
a800: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65  Idx->nSample the
a810: 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73  n pRec.    ** is
a820: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
a830: 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
a840: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52  array. */.    tR
a850: 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47  owcnt iUpper, iG
a860: 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70  ap;.    if( i>=p
a870: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  Idx->nSample ){.
a880: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73        iUpper = s
a890: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
a8a0: 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
a8b0: 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  Est[0]);.    }el
a8c0: 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
a8d0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
a8e0: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  Lt[iCol];.    }.
a8f0: 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
a900: 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
a910: 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
a920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
a930: 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
a940: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
a950: 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
a960: 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
a970: 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
a980: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
a990: 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
a9a0: 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
a9b0: 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53  r + iGap;.    aS
a9c0: 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
a9d0: 41 76 67 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b  AvgEq[nField-1];
a9e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
a9f0: 72 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69  re the pRec->nFi
aa00: 65 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65  eld value before
aa10: 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a   returning.  */.
aa20: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
aa30: 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72   nField;.  retur
aa40: 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n i;.}.#endif /*
aa50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
aa60: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
aa70: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ../*.** If it is
aa80: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d   not NULL, pTerm
aa90: 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20   is a term that 
aaa0: 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65  provides an uppe
aab0: 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f  r or lower.** bo
aac0: 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73  und on a range s
aad0: 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e  can. Without con
aae0: 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20  sidering pTerm, 
aaf0: 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  it is estimated 
ab00: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61  .** that the sca
ab10: 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65  n will visit nNe
ab20: 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  w rows. This fun
ab30: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
ab40: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69  e number.** esti
ab50: 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  mated to be visi
ab60: 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67  ted after taking
ab70: 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f   pTerm into acco
ab80: 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  unt..**.** If th
ab90: 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c  e user explicitl
aba0: 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69  y specified a li
abb0: 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65  kelihood() value
abc0: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a   for this term,.
abd0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  ** then the retu
abe0: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
abf0: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69  likelihood multi
ac00: 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d  plied by the num
ac10: 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20  ber of.** input 
ac20: 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  rows. Otherwise,
ac30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
ac40: 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22  ssumes that an "
ac50: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72  IS NOT NULL" ter
ac60: 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c  m.** has a likel
ac70: 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61  ihood of 0.50, a
ac80: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72  nd any other ter
ac90: 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  m a likelihood o
aca0: 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69  f 0.25..*/.stati
acb0: 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61  c LogEst whereRa
acc0: 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54  ngeAdjust(WhereT
acd0: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45  erm *pTerm, LogE
ace0: 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45  st nNew){.  LogE
acf0: 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a  st nRet = nNew;.
ad00: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
ad10: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
ad20: 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
ad30: 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72      nRet += pTer
ad40: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
ad50: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
ad60: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
ad70: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
ad80: 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30        nRet -= 20
ad90: 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
ada0: 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
adb0: 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20  st(4) );.    }. 
adc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
add0: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
ade0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
adf0: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
ae00: 52 65 74 75 72 6e 20 74 68 65 20 61 66 66 69 6e  Return the affin
ae10: 69 74 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ity for a single
ae20: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
ae30: 64 65 78 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  dex..*/.char sql
ae40: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
ae50: 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20  ffinity(sqlite3 
ae60: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
ae70: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61  , int iCol){.  a
ae80: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
ae90: 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f  & iCol<pIdx->nCo
aea0: 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21 70  lumn );.  if( !p
aeb0: 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a  Idx->zColAff ){.
aec0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
aed0: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
aee0: 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20 72  db, pIdx)==0 ) r
aef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
af00: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
af10: 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66  urn pIdx->zColAf
af20: 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69  f[iCol];.}.#endi
af30: 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f...#ifdef SQLIT
af40: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
af50: 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54  R_STAT4./* .** T
af60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
af70: 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61  called to estima
af80: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
af90: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
afa0: 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e   a.** range-scan
afb0: 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20   on a skip-scan 
afc0: 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
afd0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  le:.**.**   CREA
afe0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
aff0: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20  1(a, b, c);.**  
b000: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
b010: 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
b020: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
b030: 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70  ?;.**.** Value p
b040: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75  Loop->nOut is cu
b050: 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
b060: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
b070: 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20  ber of rows .** 
b080: 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e  visited for scan
b090: 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d  ning (a=? AND b=
b0a0: 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ?). This functio
b0b0: 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65  n reduces that e
b0c0: 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73  stimate .** by s
b0d0: 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63  ome factor to ac
b0e0: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63  count for the (c
b0f0: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
b100: 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73  ) expression bas
b110: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ed.** on the sta
b120: 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  t4 data for the 
b130: 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e  index. this scan
b140: 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65   will be peforme
b150: 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
b160: 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65  imes (once for e
b170: 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e  ach (a,b) combin
b180: 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68  ation that match
b190: 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74  es a=?) is dealt
b1a0: 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65   with .** by the
b1b0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
b1c0: 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73  t does this by s
b1d0: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
b1e0: 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65  all stat4 sample
b1f0: 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c  s, comparing val
b200: 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  ues.** extracted
b210: 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
b220: 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65   pUpper with the
b230: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
b240: 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a  olumn in each.**
b250: 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e   sample. If L an
b260: 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62  d U are the numb
b270: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f  er of samples fo
b280: 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  und to be less t
b290: 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20  han or.** equal 
b2a0: 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78  to the values ex
b2b0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
b2c0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
b2d0: 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64  espectively, and
b2e0: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74  .** N is the tot
b2f0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  al number of sam
b300: 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d  ples, the pLoop-
b310: 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61  >nOut value is a
b320: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f  djusted.** as fo
b330: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  llows:.**.**   n
b340: 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d  Out = nOut * ( m
b350: 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e  in(U - L, 1) / N
b360: 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77   ).**.** If pLow
b370: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
b380: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
b390: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b3a0: 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a  the term, L is.*
b3b0: 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49  * set to zero. I
b3c0: 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c  f pUpper is NULL
b3d0: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
b3e0: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
b3f0: 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69   from it,.** U i
b400: 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a  s set to N..**.*
b410: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  * Normally, this
b420: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
b430: 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f  pbDone to 1 befo
b440: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f  re returning. Ho
b450: 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20  wever,.** if no 
b460: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
b470: 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68  racted from eith
b480: 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70  er pLower or pUp
b490: 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a  per (and so the.
b4a0: 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ** estimate of t
b4b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
b4c0: 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61  s delivered rema
b4d0: 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20  ins unchanged), 
b4e0: 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65  *pbDone.** is le
b4f0: 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ft as is..**.** 
b500: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
b510: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
b520: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
b530: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
b540: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
b550: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
b560: 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
b570: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
b580: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
b590: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
b5a0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
b5b0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
b5c0: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
b5d0: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
b5e0: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
b5f0: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
b600: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
b610: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
b620: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
b630: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
b640: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
b650: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
b660: 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20  p *pLoop,    /* 
b670: 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74  Update the .nOut
b680: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c   value of this l
b690: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  oop */.  int *pb
b6a0: 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Done          /*
b6b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
b6c0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70  at least one exp
b6d0: 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  r. value extract
b6e0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ed */.){.  Index
b6f0: 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
b700: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
b710: 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
b720: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
b730: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b740: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
b750: 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Lower = -1;.  in
b760: 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53  t nUpper = p->nS
b770: 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72  ample+1;.  int r
b780: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b790: 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65   u8 aff = sqlite
b7a0: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
b7b0: 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71 29  nity(db, p, nEq)
b7c0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
b7d0: 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  ll;.  .  sqlite3
b7e0: 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20  _value *p1 = 0; 
b7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
b800: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
b810: 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c   pLower */.  sql
b820: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d  ite3_value *p2 =
b830: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b840: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b850: 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20  from pUpper */. 
b860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b870: 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pVal = 0;       
b880: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b890: 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20  ted from record 
b8a0: 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  */..  pColl = sq
b8b0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b8c0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a  eq(pParse, p->az
b8d0: 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66  Coll[nEq]);.  if
b8e0: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
b8f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
b900: 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
b910: 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70  Parse, pLower->p
b920: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
b930: 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f  f, &p1);.    nLo
b940: 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  wer = 0;.  }.  i
b950: 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d  f( pUpper && rc=
b960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
b980: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
b990: 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d  (pParse, pUpper-
b9a0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
b9b0: 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e  aff, &p2);.    n
b9c0: 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a  Upper = p2 ? 0 :
b9d0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d   p->nSample;.  }
b9e0: 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32  ..  if( p1 || p2
b9f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ba00: 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20     int nDiff;.  
ba10: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
ba20: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
ba30: 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
ba40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ba50: 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62  e3Stat4Column(db
ba60: 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
ba70: 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  p, p->aSample[i]
ba80: 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b  .n, nEq, &pVal);
ba90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
baa0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29  QLITE_OK && p1 )
bab0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
bac0: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
bad0: 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20  mpare(p1, pVal, 
bae0: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
baf0: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f  if( res>=0 ) nLo
bb00: 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  wer++;.      }. 
bb10: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bb20: 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a  ITE_OK && p2 ){.
bb30: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
bb40: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
bb50: 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43  are(p2, pVal, pC
bb60: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
bb70: 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65  ( res>=0 ) nUppe
bb80: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
bb90: 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28   }.    nDiff = (
bba0: 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29  nUpper - nLower)
bbb0: 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c  ;.    if( nDiff<
bbc0: 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a  =0 ) nDiff = 1;.
bbd0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
bbe0: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
bbf0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  r and lower boun
bc00: 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64  d specified, and
bc10: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d   the .    ** com
bc20: 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74  parisons indicat
bc30: 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
bc40: 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20  close together, 
bc50: 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  use the fallback
bc60: 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28  .    ** method (
bc70: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
bc80: 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34  scan visits 1/64
bc90: 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f   of the rows) fo
bca0: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20  r estimating.   
bcb0: 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
bcc0: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20  f rows visited. 
bcd0: 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d  Otherwise, estim
bce0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
bcf0: 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73  f rows.    ** us
bd00: 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64  ing the method d
bd10: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
bd20: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
bd30: 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
bd40: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69  . */.    if( nDi
bd50: 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d  ff!=1 || pUpper=
bd60: 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20  =0 || pLower==0 
bd70: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64  ){.      int nAd
bd80: 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c  just = (sqlite3L
bd90: 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65  ogEst(p->nSample
bda0: 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ) - sqlite3LogEs
bdb0: 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20  t(nDiff));.     
bdc0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20   pLoop->nOut -= 
bdd0: 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a  nAdjust;.      *
bde0: 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  pbDone = 1;.    
bdf0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
be00: 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d  0, ("range skip-
be10: 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
be20: 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20  ..%u  adjust=%d 
be30: 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55        nLower, nU
be60: 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31  pper, nAdjust*-1
be70: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  , pLoop->nOut));
be80: 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
be90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62  .    assert( *pb
bea0: 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  Done==0 );.  }..
beb0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
bec0: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
bed0: 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a  3ValueFree(p2);.
bee0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
bef0: 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
bf00: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
bf10: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
bf20: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
bf30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
bf40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
bf50: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
bf60: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
bf70: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
bf80: 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
bf90: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
bfa0: 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
bfb0: 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
bfc0: 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
bfd0: 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
bfe0: 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
bff0: 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
c000: 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
c010: 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
c020: 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
c030: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
c040: 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
c050: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
c060: 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
c070: 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
c080: 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
c090: 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
c0a0: 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
c0b0: 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
c0c0: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
c0d0: 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
c0e0: 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
c110: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c120: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
c130: 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
c140: 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
c150: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
c160: 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
c170: 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
c180: 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
c190: 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
c1a0: 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
c1b0: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  erm..**.** The v
c1c0: 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65  alue in (pBuilde
c1d0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
c1e0: 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d  .nEq) is the num
c1f0: 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
c200: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65  .** column subje
c210: 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20  ct to the range 
c220: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
c230: 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
c240: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
c250: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
c260: 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  nts optimized by
c270: 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
c280: 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
c290: 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69  ample,.** assumi
c2a0: 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  ng index p is on
c2b0: 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
c2c0: 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
c2d0: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
c2e0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
c2f0: 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
c300: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
c310: 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
c320: 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  o 1 (as the rang
c330: 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
c340: 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73  umn, b, is the s
c350: 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d  econd .** left-m
c360: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
c370: 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
c380: 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
c390: 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
c3a0: 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
c3b0: 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
c3c0: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
c3d0: 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57  et to 0..**.** W
c3e0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c3f0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
c400: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
c410: 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  e sqlite3LogEst(
c420: 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ) of the.** numb
c430: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
c440: 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69  the index scan i
c450: 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69  s expected to vi
c460: 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20  sit without .** 
c470: 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20  considering the 
c480: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
c490: 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20  s. If nEq is 0, 
c4a0: 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74  then *pnOut is t
c4b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
c4c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
c4d0: 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
c4e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
c4f0: 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
c500: 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
c510: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
c520: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
c530: 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  ts pLower and pU
c540: 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20  pper..** .** In 
c550: 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
c560: 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c  qlite_stat4 ANAL
c570: 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20  YZE data, or if 
c580: 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74  such data cannot
c590: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73   be.** used, a s
c5a0: 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71  ingle range ineq
c5b0: 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
c5c0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
c5d0: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
c5e0: 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72  . .** and a pair
c5f0: 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
c600: 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
c610: 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
c620: 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
c630: 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
c640: 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a  a factor of 64..
c650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
c660: 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
c670: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c680: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
c690: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
c6a0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
c6b0: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
c6c0: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
c6d0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
c6e0: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
c6f0: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
c700: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
c710: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
c720: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
c730: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
c740: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c750: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
c760: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c770: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
c780: 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79  op     /* Modify
c790: 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d   the .nOut and m
c7a0: 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64  aybe .rRun field
c7b0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
c7c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c7d0: 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70  int nOut = pLoop
c7e0: 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74  ->nOut;.  LogEst
c7f0: 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
c800: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
c810: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e  T3_OR_STAT4.  In
c820: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
c830: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
c840: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
c850: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
c860: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
c870: 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53  e>0 && nEq<p->nS
c880: 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20  ampleCol ){.    
c890: 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65  if( nEq==pBuilde
c8a0: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a  r->nRecValid ){.
c8b0: 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65        UnpackedRe
c8c0: 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
c8d0: 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
c8e0: 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
c8f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d 20  .      int nBtm 
c900: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
c910: 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74  .nBtm;.      int
c920: 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75   nTop = pLoop->u
c930: 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20  .btree.nTop;..  
c940: 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20      /* Variable 
c950: 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73  iLower will be s
c960: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
c970: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
c980: 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20   of rows in .   
c990: 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
c9a0: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
c9b0: 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  an the lower bou
c9c0: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
c9d0: 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20  query. The.     
c9e0: 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   ** lower bound 
c9f0: 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74  being the concat
ca00: 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e  enation of $P an
ca10: 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69  d $L, where $P i
ca20: 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b  s the.      ** k
ca30: 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64  ey-prefix formed
ca40: 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75   by the nEq valu
ca50: 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  es matched again
ca60: 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d  st the nEq left-
ca70: 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  most.      ** co
ca80: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
ca90: 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68  ex, and $L is th
caa0: 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65  e value in pLowe
cab0: 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
cac0: 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
cad0: 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
cae0: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
caf0: 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
cb00: 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a  cause it.      *
cb10: 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  * is not a simpl
cb20: 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69  e variable or li
cb30: 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68  teral value), th
cb40: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66  e lower bound of
cb50: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61   the.      ** ra
cb60: 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74  nge is $P. Due t
cb70: 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65  o a quirk in the
cb80: 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61   way whereKeySta
cb90: 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e  ts() works, even
cba0: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20  .      ** if $L 
cbb0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68  is available, wh
cbc0: 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73  ereKeyStats() is
cbd0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68   called for both
cbe0: 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20   ($P) and .     
cbf0: 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20   ** ($P:$L) and 
cc00: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68  the larger of th
cc10: 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76  e two returned v
cc20: 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20  alues is used.. 
cc30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
cc40: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70   Similarly, iUpp
cc50: 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20  er is to be set 
cc60: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
cc70: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
cc80: 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c   rows.      ** l
cc90: 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70  ess than the upp
cca0: 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
ccb0: 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65  range query. Whe
ccc0: 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  re the upper bou
ccd0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  nd.      ** is e
cce0: 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24  ither ($P) or ($
ccf0: 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76  P:$U). Again, ev
cd00: 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69  en if $U is avai
cd10: 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75  lable, both valu
cd20: 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69  es.      ** of i
cd30: 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73  Upper are reques
cd40: 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53  ted of whereKeyS
cd50: 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73  tats() and the s
cd60: 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20  maller used..   
cd70: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
cd80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
cd90: 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  s between the tw
cda0: 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e  o bounds is then
cdb0: 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f   just iUpper-iLo
cdc0: 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  wer..      */.  
cdd0: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
cde0: 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20  er;     /* Rows 
cdf0: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
ce00: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ce10: 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
ce20: 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c  r;     /* Rows l
ce30: 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70  ess than the upp
ce40: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
ce50: 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20    int iLwrIdx = 
ce60: 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65  -2;   /* aSample
ce70: 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72  [] for the lower
ce80: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
ce90: 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31  int iUprIdx = -1
cea0: 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d  ;   /* aSample[]
ceb0: 20 66 6f 72 20 74 68 65 20 75 70 70 65 72 20 62   for the upper b
cec0: 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69  ound */..      i
ced0: 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20  f( pRec ){.     
cee0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65     testcase( pRe
cef0: 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c  c->nField!=pBuil
cf00: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
cf10: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  ;.        pRec->
cf20: 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65  nField = pBuilde
cf30: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
cf40: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44      }.      /* D
cf50: 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20  etermine iLower 
cf60: 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67  and iUpper using
cf70: 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20   ($P) only. */. 
cf80: 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20       if( nEq==0 
cf90: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  ){.        iLowe
cfa0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
cfb0: 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45  Upper = p->nRowE
cfc0: 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st0;.      }else
cfd0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  {.        /* Not
cfe0: 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75  e: this call cou
cff0: 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ld be optimized 
d000: 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65  away - since the
d010: 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73   same values mus
d020: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  t .        ** ha
d030: 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
d040: 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b  d when testing k
d050: 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71  ey $P in whereEq
d060: 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a  ualScanEst().  *
d070: 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b  /.        whereK
d080: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d090: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
d0a0: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
d0b0: 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69   a[0];.        i
d0c0: 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61  Upper = a[0] + a
d0d0: 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  [1];.      }..  
d0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77      assert( pLow
d0f0: 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72  er==0 || (pLower
d100: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
d110: 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20  O_GT|WO_GE))!=0 
d120: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d130: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
d140: 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
d150: 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
d160: 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )!=0 );.      as
d170: 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72  sert( p->aSortOr
d180: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
d190: 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65  if( p->aSortOrde
d1a0: 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20  r[nEq] ){.      
d1b0: 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f    /* The roles o
d1c0: 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  f pLower and pUp
d1d0: 70 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20  per are swapped 
d1e0: 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78  for a DESC index
d1f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50   */.        SWAP
d200: 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f  (WhereTerm*, pLo
d210: 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20  wer, pUpper);.  
d220: 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20        SWAP(int, 
d230: 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20  nBtm, nTop);.   
d240: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
d250: 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
d260: 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
d270: 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
d280: 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
d290: 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
d2a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20  .        int n; 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74     /* Values ext
d2d0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
d2e0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
d2f0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
d300: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
d310: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
d320: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
d330: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
d340: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
d350: 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29  , nBtm, nEq, &n)
d360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
d370: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
d380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52   ){.          tR
d390: 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
d3a0: 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d        u16 mask =
d3b0: 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_GT|WO_LE;.  
d3c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
d3d0: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
d3e0: 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73  e(pExpr)>n ) mas
d3f0: 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54  k = (WO_LE|WO_LT
d400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77  );.          iLw
d410: 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53  rIdx = whereKeyS
d420: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
d430: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
d440: 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
d450: 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65  0] + ((pLower->e
d460: 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29  Operator & mask)
d470: 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
d480: 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
d490: 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72  >iLower ) iLower
d4a0: 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
d4b0: 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
d4c0: 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b       pLower = 0;
d4d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d4e0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
d4f0: 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
d500: 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
d510: 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
d520: 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20  $P:$U). */.     
d530: 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
d540: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20         int n;   
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61   /* Values extra
d570: 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
d580: 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
d590: 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d  *pExpr = pUpper-
d5a0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
d5b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d5c0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
d5d0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
d5e0: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
d5f0: 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a  nTop, nEq, &n);.
d600: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
d610: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29  SQLITE_OK && n )
d620: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
d630: 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
d640: 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57      u16 mask = W
d650: 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20  O_GT|WO_LE;.    
d660: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d670: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
d680: 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20  pExpr)>n ) mask 
d690: 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b  = (WO_LE|WO_LT);
d6a0: 0a 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49  .          iUprI
d6b0: 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  dx = whereKeySta
d6c0: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
d6d0: 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 1, a);.     
d6e0: 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
d6f0: 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70   + ((pUpper->eOp
d700: 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f  erator & mask) ?
d710: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
d720: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69        if( iNew<i
d730: 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d  Upper ) iUpper =
d740: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
d750: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
d760: 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20     pUpper = 0;. 
d770: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d780: 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  ..      pBuilder
d790: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
d7a0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d7b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d7c0: 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f    if( iUpper>iLo
d7d0: 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wer ){.         
d7e0: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c   nNew = sqlite3L
d7f0: 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69  ogEst(iUpper - i
d800: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Lower);.        
d810: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66    /* TUNING:  If
d820: 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64   both iUpper and
d830: 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69   iLower are deri
d840: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ved from the sam
d850: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
d860: 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75  ample, then assu
d870: 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d  me they are 4x m
d880: 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20  ore selective.  
d890: 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20  This brings.    
d8a0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74        ** the est
d8b0: 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69  imated selectivi
d8c0: 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20  ty more in line 
d8d0: 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75  with what it wou
d8e0: 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  ld be.          
d8f0: 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20  ** if estimated 
d900: 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20  without the use 
d910: 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65  of STAT3/4 table
d920: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
d930: 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70  if( iLwrIdx==iUp
d940: 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32  rIdx ) nNew -= 2
d950: 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d  0;  assert( 20==
d960: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
d970: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
d980: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  e{.          nNe
d990: 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
d9a0: 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
d9b0: 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
d9c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d9d0: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
d9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  {.          nOut
d9f0: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20   = nNew;.       
da00: 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45   }.        WHERE
da10: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54  TRACE(0x10, ("ST
da20: 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20  AT4 range scan: 
da30: 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
da40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
da60: 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
da70: 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
da80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
da90: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f  e{.      int bDo
daa0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ne = 0;.      rc
dab0: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69   = whereRangeSki
dac0: 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  pScanEst(pParse,
dad0: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c   pLower, pUpper,
dae0: 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b   pLoop, &bDone);
daf0: 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65  .      if( bDone
db00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
db10: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
db20: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
db30: 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
db40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75  ED_PARAMETER(pBu
db50: 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74  ilder);.  assert
db60: 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
db70: 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  er );.#endif.  a
db80: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
db90: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46   || (pUpper->wtF
dba0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
dbb0: 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20  L)==0 );.  nNew 
dbc0: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
dbd0: 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29  st(pLower, nOut)
dbe0: 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
dbf0: 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70  RangeAdjust(pUpp
dc00: 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a  er, nNew);..  /*
dc10: 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
dc20: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
dc30: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d  er and lower lim
dc40: 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c  it and neither l
dc50: 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e  imit.  ** has an
dc60: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66   application-def
dc70: 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ined likelihood(
dc80: 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61  ), assume the ra
dc90: 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75  nge is.  ** redu
dca0: 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69  ced by an additi
dcb0: 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d  onal 75%. This m
dcc0: 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65  eans that, by de
dcd0: 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65  fault, an open-e
dce0: 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20  nded.  ** range 
dcf0: 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20  query (e.g. col 
dd00: 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20  > ?) is assumed 
dd10: 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20  to match 1/4 of 
dd20: 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a  the rows in the.
dd30: 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c    ** index. Whil
dd40: 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65  e a closed range
dd50: 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45   (e.g. col BETWE
dd60: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65  EN ? AND ?) is e
dd70: 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a  stimated to.  **
dd80: 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74   match 1/64 of t
dd90: 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20  he index. */ .  
dda0: 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c  if( pLower && pL
ddb0: 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  ower->truthProb>
ddc0: 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70  0 && pUpper && p
ddd0: 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Upper->truthProb
dde0: 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  >0 ){.    nNew -
ddf0: 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75  = 20;.  }..  nOu
de00: 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29  t -= (pLower!=0)
de10: 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a   + (pUpper!=0);.
de20: 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
de30: 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
de40: 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
de50: 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65  t = nNew;.#if de
de60: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
de70: 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
de80: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  pLoop->nOut>nOut
de90: 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
dea0: 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20  CE(0x10,("Range 
deb0: 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74  scan lowers nOut
dec0: 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e   from %d to %d\n
ded0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
dee0: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
def0: 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a  ut, nOut));.  }.
df00: 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e  #endif.  pLoop->
df10: 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
df20: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Out;.  return rc
df30: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
df40: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
df50: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
df60: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
df70: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
df80: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
df90: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
dfa0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
dfb0: 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20  int x=VALUE and 
dfc0: 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45  where that VALUE
dfd0: 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68   occurs in.** th
dfe0: 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  e histogram data
dff0: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
e000: 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65  ks when x is the
e010: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f   left-most.** co
e020: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
e030: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
e040: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
e050: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   is available.**
e060: 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
e070: 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55    When pExpr==NU
e080: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
e090: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a  e constraint is.
e0a0: 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69  ** "x IS NULL" i
e0b0: 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c  nstead of "x=VAL
e0c0: 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  UE"..**.** Write
e0d0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
e0e0: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
e0f0: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
e100: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
e110: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
e120: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
e130: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
e140: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
e150: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
e160: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e170: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
e180: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
e190: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
e1a0: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
e1b0: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
e1c0: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
e1d0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
e1e0: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
e1f0: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
e200: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
e210: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
e220: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
e230: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
e240: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
e250: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71  atic int whereEq
e260: 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ualScanEst(.  Pa
e270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e280: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
e290: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
e2a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
e2b0: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
e2c0: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20  Builder,.  Expr 
e2d0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
e2e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
e2f0: 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
e300: 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
e310: 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  t */.  tRowcnt *
e320: 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
e330: 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
e340: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
e350: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
e360: 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
e370: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
e380: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
e390: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
e3a0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
e3b0: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
e3c0: 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
e3d0: 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72 63  ->pRec;.  int rc
e3e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e3f0: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
e400: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
e410: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
e420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e430: 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
e440: 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
e450: 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
e460: 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
e470: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
e480: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e490: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e4a0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
e4b0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
e4c0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
e4d0: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
e4e0: 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
e4f0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
e500: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
e510: 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
e520: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
e530: 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
e540: 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
e550: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e560: 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
e570: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e580: 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
e590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e5a0: 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
e5b0: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
e5c0: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
e5d0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
e5e0: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e5f0: 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
e600: 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
e610: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
e620: 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
e630: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
e640: 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
e650: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e660: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
e670: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
e680: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
e690: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
e6a0: 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29   1, nEq-1, &bOk)
e6b0: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
e6c0: 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
e6d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e6e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
e6f0: 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
e700: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e710: 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
e720: 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
e730: 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
e740: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
e750: 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
e760: 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75  TRACE(0x10,("equ
e770: 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
e780: 6e 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e 22  ns %s(%d): %d\n"
e790: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e7a0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e       p->zName, n
e7b0: 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29  Eq-1, (int)a[1])
e7c0: 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  );.  *pnRow = a[
e7d0: 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  1];.  .  return 
e7e0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
e7f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e800: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
e810: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e820: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
e830: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
e840: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
e850: 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
e860: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
e870: 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
e880: 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
e890: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
e8a0: 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
e8b0: 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
e8c0: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
e8d0: 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
e8e0: 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
e8f0: 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
e900: 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
e910: 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
e920: 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
e930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
e940: 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
e950: 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
e960: 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
e970: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
e980: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
e990: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
e9a0: 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
e9b0: 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
e9c0: 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
e9d0: 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
e9e0: 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
e9f0: 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
ea00: 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
ea10: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
ea20: 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
ea30: 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
ea40: 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
ea50: 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
ea60: 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
ea70: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
ea80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ea90: 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
eaa0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
eab0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
eac0: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
ead0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
eae0: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
eaf0: 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
eb00: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
eb10: 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
eb20: 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20  list on the RHS 
eb30: 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c  of "x IN (v1,v2,
eb40: 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52  v3,...)" */.  tR
eb50: 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
eb60: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
eb70: 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
eb80: 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
eb90: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
eba0: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
ebb0: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
ebc0: 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74  64 nRow0 = sqlit
ebd0: 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d  e3LogEstToInt(p-
ebe0: 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
ebf0: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69  ;.  int nRecVali
ec00: 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
ec10: 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72  ecValid;.  int r
ec20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ec30: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
ec40: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
ec50: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b  .  tRowcnt nEst;
ec60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ec70: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
ec80: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
ec90: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  /.  tRowcnt nRow
eca0: 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Est = 0;    /* N
ecb0: 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
ecc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
ecd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ecf0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ed00: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
ed10: 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
ed20: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
ed30: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
ed40: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
ed50: 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30      nEst = nRow0
ed60: 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
ed70: 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
ed80: 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
ed90: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
eda0: 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
edb0: 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
edc0: 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
edd0: 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
ede0: 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  id;.  }..  if( r
edf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ee00: 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
ee10: 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73  > nRow0 ) nRowEs
ee20: 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a  t = nRow0;.    *
ee30: 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
ee40: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
ee50: 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  0x10,("IN row es
ee60: 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e  timate: est=%d\n
ee70: 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
ee80: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
ee90: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
eea0: 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
eeb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
eec0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
eed0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
eee0: 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20  AT4 */...#ifdef 
eef0: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
ef00: 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  ED./*.** Print t
ef10: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
ef20: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
ef30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ef40: 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57  whereTermPrint(W
ef50: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
ef60: 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69   int iTerm){.  i
ef70: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
ef80: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
ef90: 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64  rintf("TERM-%-3d
efa0: 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29   NULL\n", iTerm)
efb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
efc0: 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20  har zType[4];.  
efd0: 20 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d    char zLeft[50]
efe0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
eff0: 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20  pe, "...", 4);. 
f000: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
f010: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
f020: 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20  TUAL ) zType[0] 
f030: 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'V';.    if( p
f040: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f050: 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
f060: 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
f070: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f080: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
f090: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
f0a0: 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
f0b0: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
f0c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f0d0: 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20  _SINGLE ){.     
f0e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f0f0: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
f100: 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a  zLeft,"left={%d:
f110: 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d}",.          
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
f130: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20  rm->leftCursor, 
f140: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
f150: 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  umn);.    }else 
f160: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
f170: 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
f180: 30 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f  0 && pTerm->u.pO
f190: 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20  rInfo!=0 ){.    
f1a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f1b0: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29  tf(sizeof(zLeft)
f1c0: 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62 6c  ,zLeft,"indexabl
f1d0: 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20  e=0x%lld", .    
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49     pTerm->u.pOrI
f200: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b  nfo->indexable);
f210: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f220: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f230: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29  tf(sizeof(zLeft)
f240: 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64 22  ,zLeft,"left=%d"
f250: 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  , pTerm->leftCur
f260: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
f270: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f280: 74 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d  tf(.       "TERM
f290: 2d 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31 32  -%-3d %p %s %-12
f2a0: 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30  s prob=%-3d op=0
f2b0: 78 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78  x%03x wtFlags=0x
f2c0: 25 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69 54  %04x",.       iT
f2d0: 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70  erm, pTerm, zTyp
f2e0: 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d  e, zLeft, pTerm-
f2f0: 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20  >truthProb,.    
f300: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
f310: 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c  tor, pTerm->wtFl
f320: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ags);.    if( pT
f330: 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20  erm->iField ){. 
f340: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f350: 67 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c 64  gPrintf(" iField
f360: 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69  =%d\n", pTerm->i
f370: 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Field);.    }els
f380: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
f390: 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
f3a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f3b0: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
f3c0: 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (0, pTerm->pExpr
f3d0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 0);.  }.}.#end
f3e0: 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  if..#ifdef WHERE
f3f0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
f400: 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d  .** Show the com
f410: 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
f420: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a 2a   a WhereClause.*
f430: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
f440: 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 57  ereClausePrint(W
f450: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
f460: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
f470: 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  (i=0; i<pWC->nTe
f480: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68  rm; i++){.    wh
f490: 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70 57  ereTermPrint(&pW
f4a0: 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d  C->a[i], i);.  }
f4b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
f4c0: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
f4d0: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
f4e0: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
f4f0: 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ect for debuggin
f500: 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
f510: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
f520: 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f  oopPrint(WhereLo
f530: 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75  op *p, WhereClau
f540: 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
f550: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
f560: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  pWC->pWInfo;.  i
f570: 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66  nt nb = 1+(pWInf
f580: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
f590: 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63 74  c+3)/4;.  struct
f5a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
f5b0: 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
f5c0: 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
f5d0: 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
f5e0: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
f5f0: 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c  b;.  Bitmask mAl
f600: 6c 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31  l = (((Bitmask)1
f610: 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a  )<<(nb*4)) - 1;.
f620: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f630: 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c  intf("%c%2d.%0*l
f640: 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63  lx.%0*llx", p->c
f650: 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Id,.            
f660: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62           p->iTab
f670: 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c  , nb, p->maskSel
f680: 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71  f, nb, p->prereq
f690: 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69   & mAll);.  sqli
f6a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f6b0: 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20   %12s",.        
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
f6d0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
f6e0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
f6f0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
f700: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
f710: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
f720: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  E)==0 ){.    con
f730: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
f740: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72      if( p->u.btr
f750: 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e  ee.pIndex && (zN
f760: 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  ame = p->u.btree
f770: 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21  .pIndex->zName)!
f780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
f790: 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  strncmp(zName, "
f7a0: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
f7b0: 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  _", 17)==0 ){.  
f7c0: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71        int i = sq
f7d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
f7e0: 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  ame) - 1;.      
f7f0: 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69    while( zName[i
f800: 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20  ]!='_' ) i--;.  
f810: 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69        zName += i
f820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f830: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f840: 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c  tf(".%-16s %2d",
f850: 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72   zName, p->u.btr
f860: 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c  ee.nEq);.    }el
f870: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f880: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32  3DebugPrintf("%2
f890: 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20  0s","");.    }. 
f8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
f8b0: 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   *z;.    if( p->
f8c0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b  u.vtab.idxStr ){
f8d0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
f8e0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
f8f0: 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20  \"%s\",%x)",.   
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
f910: 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
f920: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
f930: 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
f940: 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ask);.    }else{
f950: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
f960: 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
f970: 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  %x)", p->u.vtab.
f980: 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
f990: 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
f9a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
f9b0: 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39  bugPrintf(" %-19
f9c0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  s", z);.    sqli
f9d0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d  te3_free(z);.  }
f9e0: 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
f9f0: 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
fa00: 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  AN ){.    sqlite
fa10: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66  3DebugPrintf(" f
fa20: 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d   %05x %d-%d", p-
fa30: 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
fa40: 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20  erm,p->nSkip);. 
fa50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
fa60: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fa70: 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70   f %05x N %d", p
fa80: 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
fa90: 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Term);.  }.  sql
faa0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fab0: 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c  " cost %d,%d,%d\
fac0: 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70  n", p->rSetup, p
fad0: 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29  ->rRun, p->nOut)
fae0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72  ;.  if( p->nLTer
faf0: 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65  m && (sqlite3Whe
fb00: 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29  reTrace & 0x100)
fb10: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
fb20: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
fb30: 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29  <p->nLTerm; i++)
fb40: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72  {.      whereTer
fb50: 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d  mPrint(p->aLTerm
fb60: 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  [i], i);.    }. 
fb70: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
fb80: 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20  ** Convert bulk 
fb90: 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61  memory into a va
fba0: 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  lid WhereLoop th
fbb0: 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64  at can be passed
fbc0: 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70  .** to whereLoop
fbd0: 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79  Clear harmlessly
fbe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fbf0: 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57   whereLoopInit(W
fc00: 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
fc10: 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61  p->aLTerm = p->a
fc20: 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d  LTermSpace;.  p-
fc30: 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
fc40: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79  ->nLSlot = Array
fc50: 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70  Size(p->aLTermSp
fc60: 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61  ace);.  p->wsFla
fc70: 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gs = 0;.}../*.**
fc80: 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65   Clear the Where
fc90: 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c  Loop.u union.  L
fca0: 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70  eave WhereLoop.p
fcb0: 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f  LTerm intact..*/
fcc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
fcd0: 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
fce0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fcf0: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
fd00: 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
fd10: 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  (WHERE_VIRTUALTA
fd20: 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  BLE|WHERE_AUTO_I
fd30: 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28  NDEX) ){.    if(
fd40: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
fd50: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
fd60: 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74  E)!=0 && p->u.vt
fd70: 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
fd80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
fd90: 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  e(p->u.vtab.idxS
fda0: 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  tr);.      p->u.
fdb0: 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
fdc0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  0;.      p->u.vt
fdd0: 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  ab.idxStr = 0;. 
fde0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
fdf0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
fe00: 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
fe10: 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
fe20: 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  ndex!=0 ){.     
fe30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fe40: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
fe50: 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ndex->zColAff);.
fe60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
fe70: 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62  reeNN(db, p->u.b
fe80: 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20  tree.pIndex);.  
fe90: 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
fea0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
feb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
fec0: 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61  allocate interna
fed0: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
fee0: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
fef0: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
ff00: 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
ff10: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
ff20: 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
ff30: 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
ff40: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
ff50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
ff60: 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
ff70: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
ff80: 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
ff90: 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
ffa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
ffb0: 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
ffc0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
ffd0: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
ffe0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
fff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
10000 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
10010 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10020 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
10030 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
10040 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
10050 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
10060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
10070 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
10080 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
10090 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
100a0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
100b0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
100c0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
100d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
100e0 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  PT;.  memcpy(paN
100f0 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
10100 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
10110 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
10120 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
10130 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
10140 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e  ) sqlite3DbFreeN
10150 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  N(db, p->aLTerm)
10160 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
10170 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
10180 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
10190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
101a0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
101b0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
101c0 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
101d0 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
101e0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
101f0 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
10200 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
10210 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
10220 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
10230 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
10240 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
10250 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
10260 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
10270 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
10280 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
10290 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
102a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
102b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
102c0 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
102d0 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
102e0 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
102f0 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
10300 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
10310 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
10320 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
10330 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
10340 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
10350 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
10360 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
10370 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
10380 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
10390 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
103a0 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
103b0 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
103c0 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
103d0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
103e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
103f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10400 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
10410 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
10420 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
10430 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
10440 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
10450 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
10460 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
10470 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
10480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
10490 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
104a0 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
104b0 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
104c0 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
104d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
104e0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  o){.  int i;.  a
104f0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 21 3d 30  ssert( pWInfo!=0
10500 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
10510 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
10520 20 69 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65   i++){.    Where
10530 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
10540 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
10550 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
10560 57 4c 6f 6f 70 20 26 26 20 28 70 4c 65 76 65 6c  WLoop && (pLevel
10570 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
10580 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  s & WHERE_IN_ABL
10590 45 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  E) ){.      sqli
105a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
105b0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
105c0 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  op);.    }.  }. 
105d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61   sqlite3WhereCla
105e0 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66 6f  useClear(&pWInfo
105f0 2d 3e 73 57 43 29 3b 0a 20 20 77 68 69 6c 65 28  ->sWC);.  while(
10600 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
10610 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  ){.    WhereLoop
10620 20 2a 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4c   *p = pWInfo->pL
10630 6f 6f 70 73 3b 0a 20 20 20 20 70 57 49 6e 66 6f  oops;.    pWInfo
10640 2d 3e 70 4c 6f 6f 70 73 20 3d 20 70 2d 3e 70 4e  ->pLoops = p->pN
10650 65 78 74 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65  extLoop;.    whe
10660 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c  reLoopDelete(db,
10670 20 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   p);.  }.  sqlit
10680 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
10690 57 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  WInfo);.}../*.**
106a0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
106b0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
106c0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
106d0 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68 61  *.**   (1)  X ha
106e0 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c 6f  s the same or lo
106f0 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59 0a  wer cost that Y.
10700 2a 2a 20 20 20 28 32 29 20 20 58 20 75 73 65 73  **   (2)  X uses
10710 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c 61   fewer WHERE cla
10720 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59  use terms than Y
10730 0a 2a 2a 20 20 20 28 33 29 20 20 45 76 65 72 79  .**   (3)  Every
10740 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
10750 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 20  rm used by X is 
10760 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 0a 2a  also used by Y.*
10770 2a 20 20 20 28 34 29 20 20 58 20 73 6b 69 70 73  *   (4)  X skips
10780 20 61 74 20 6c 65 61 73 74 20 61 73 20 6d 61 6e   at least as man
10790 79 20 63 6f 6c 75 6d 6e 73 20 61 73 20 59 0a 2a  y columns as Y.*
107a0 2a 20 20 20 28 35 29 20 20 49 66 20 58 20 69 73  *   (5)  If X is
107b0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
107c0 78 2c 20 74 68 61 6e 20 59 20 69 73 20 74 6f 6f  x, than Y is too
107d0 0a 2a 2a 0a 2a 2a 20 43 6f 6e 64 69 74 69 6f 6e  .**.** Condition
107e0 73 20 28 32 29 20 61 6e 64 20 28 33 29 20 6d 65  s (2) and (3) me
107f0 61 6e 20 74 68 61 74 20 58 20 69 73 20 61 20 22  an that X is a "
10800 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 6f  proper subset" o
10810 66 20 59 2e 0a 2a 2a 20 49 66 20 58 20 69 73 20  f Y..** If X is 
10820 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
10830 6f 66 20 59 20 74 68 65 6e 20 59 20 69 73 20 61  of Y then Y is a
10840 20 62 65 74 74 65 72 20 63 68 6f 69 63 65 20 61   better choice a
10850 6e 64 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 68  nd ought.** to h
10860 61 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74  ave a lower cost
10870 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10880 72 65 74 75 72 6e 73 20 54 52 55 45 20 77 68 65  returns TRUE whe
10890 6e 20 74 68 61 74 20 63 6f 73 74 20 0a 2a 2a 20  n that cost .** 
108a0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 69 73 20  relationship is 
108b0 69 6e 76 65 72 74 65 64 20 61 6e 64 20 6e 65 65  inverted and nee
108c0 64 73 20 74 6f 20 62 65 20 61 64 6a 75 73 74 65  ds to be adjuste
108d0 64 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 28  d.  Constraint (
108e0 34 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  4).** was added 
108f0 62 65 63 61 75 73 65 20 69 66 20 58 20 75 73 65  because if X use
10900 73 20 73 6b 69 70 2d 73 63 61 6e 20 6c 65 73 73  s skip-scan less
10910 20 74 68 61 6e 20 59 20 69 74 20 73 74 69 6c 6c   than Y it still
10920 20 6d 69 67 68 74 0a 2a 2a 20 64 65 73 65 72 76   might.** deserv
10930 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 20 65  e a lower cost e
10940 76 65 6e 20 69 66 20 69 74 20 69 73 20 61 20 70  ven if it is a p
10950 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
10960 59 2e 20 20 43 6f 6e 73 74 72 61 69 6e 74 20 28  Y.  Constraint (
10970 35 29 0a 2a 2a 20 77 61 73 20 61 64 64 65 64 20  5).** was added 
10980 62 65 63 61 75 73 65 20 61 20 63 6f 76 65 72 69  because a coveri
10990 6e 67 20 69 6e 64 65 78 20 70 72 6f 62 61 62 6c  ng index probabl
109a0 79 20 64 65 73 65 72 76 65 73 20 74 6f 20 68 61  y deserves to ha
109b0 76 65 20 61 20 6c 6f 77 65 72 20 63 6f 73 74 0a  ve a lower cost.
109c0 2a 2a 20 74 68 61 6e 20 61 20 6e 6f 6e 2d 63 6f  ** than a non-co
109d0 76 65 72 69 6e 67 20 69 6e 64 65 78 20 65 76 65  vering index eve
109e0 6e 20 69 66 20 69 74 20 69 73 20 61 20 70 72 6f  n if it is a pro
109f0 70 65 72 20 73 75 62 73 65 74 2e 0a 2a 2f 0a 73  per subset..*/.s
10a00 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
10a10 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
10a20 53 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20  Subset(.  const 
10a30 57 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20  WhereLoop *pX,  
10a40 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68       /* First Wh
10a50 65 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61  ereLoop to compa
10a60 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68  re */.  const Wh
10a70 65 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20  ereLoop *pY     
10a80 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67     /* Compare ag
10a90 61 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65  ainst this Where
10aa0 4c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Loop */.){.  int
10ab0 20 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d   i, j;.  if( pX-
10ac0 3e 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69  >nLTerm-pX->nSki
10ad0 70 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d  p >= pY->nLTerm-
10ae0 70 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  pY->nSkip ){.   
10af0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20   return 0; /* X 
10b00 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20  is not a subset 
10b10 6f 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  of Y */.  }.  if
10b20 28 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58  ( pY->nSkip > pX
10b30 2d 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e  ->nSkip ) return
10b40 20 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52   0;.  if( pX->rR
10b50 75 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29  un >= pY->rRun )
10b60 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52  {.    if( pX->rR
10b70 75 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20  un > pY->rRun ) 
10b80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
10b90 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61  X costs more tha
10ba0 6e 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  n Y */.    if( p
10bb0 58 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f  X->nOut > pY->nO
10bc0 75 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ut ) return 0;  
10bd0 20 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72    /* X costs mor
10be0 65 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a  e than Y */.  }.
10bf0 20 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65    for(i=pX->nLTe
10c00 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rm-1; i>=0; i--)
10c10 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c  {.    if( pX->aL
10c20 54 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Term[i]==0 ) con
10c30 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a  tinue;.    for(j
10c40 3d 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  =pY->nLTerm-1; j
10c50 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
10c60 20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b   if( pY->aLTerm[
10c70 6a 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69  j]==pX->aLTerm[i
10c80 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ] ) break;.    }
10c90 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72  .    if( j<0 ) r
10ca0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e  eturn 0;  /* X n
10cb0 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
10cc0 20 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d   since term X[i]
10cd0 20 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a   not used by Y *
10ce0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 58 2d  /.  }.  if( (pX-
10cf0 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 49  >wsFlags&WHERE_I
10d00 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20  DX_ONLY)!=0 .   
10d10 26 26 20 28 70 59 2d 3e 77 73 46 6c 61 67 73 26  && (pY->wsFlags&
10d20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
10d30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10d40 20 30 3b 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69   0;  /* Constrai
10d50 6e 74 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  nt (5) */.  }.  
10d60 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c  return 1;  /* Al
10d70 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 65 65  l conditions mee
10d80 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  t */.}../*.** Tr
10d90 79 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  y to adjust the 
10da0 63 6f 73 74 20 6f 66 20 57 68 65 72 65 4c 6f 6f  cost of WhereLoo
10db0 70 20 70 54 65 6d 70 6c 61 74 65 20 75 70 77 61  p pTemplate upwa
10dc0 72 64 73 20 6f 72 20 64 6f 77 6e 77 61 72 64 73  rds or downwards
10dd0 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a   so.** that:.**.
10de0 2a 2a 20 20 20 28 31 29 20 70 54 65 6d 70 6c 61  **   (1) pTempla
10df0 74 65 20 63 6f 73 74 73 20 6c 65 73 73 20 74 68  te costs less th
10e00 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65  an any other Whe
10e10 72 65 4c 6f 6f 70 73 20 74 68 61 74 20 61 72 65  reLoops that are
10e20 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20 20 20 20   a proper.**    
10e30 20 20 20 73 75 62 73 65 74 20 6f 66 20 70 54 65     subset of pTe
10e40 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 28  mplate.**.**   (
10e50 32 29 20 70 54 65 6d 70 6c 61 74 65 20 63 6f 73  2) pTemplate cos
10e60 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 79  ts more than any
10e70 20 6f 74 68 65 72 20 57 68 65 72 65 4c 6f 6f 70   other WhereLoop
10e80 73 20 66 6f 72 20 77 68 69 63 68 20 70 54 65 6d  s for which pTem
10e90 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 69  plate.**       i
10ea0 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10eb0 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73 61 79 20  t..**.** To say 
10ec0 22 57 68 65 72 65 4c 6f 6f 70 20 58 20 69 73 20  "WhereLoop X is 
10ed0 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
10ee0 6f 66 20 59 22 20 6d 65 61 6e 73 20 74 68 61 74  of Y" means that
10ef0 20 58 20 75 73 65 73 20 66 65 77 65 72 0a 2a 2a   X uses fewer.**
10f00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
10f10 72 6d 73 20 74 68 61 6e 20 59 20 61 6e 64 20 74  rms than Y and t
10f20 68 61 74 20 65 76 65 72 79 20 57 48 45 52 45 20  hat every WHERE 
10f30 63 6c 61 75 73 65 20 74 65 72 6d 20 75 73 65 64  clause term used
10f40 20 62 79 20 58 20 69 73 0a 2a 2a 20 61 6c 73 6f   by X is.** also
10f50 20 75 73 65 64 20 62 79 20 59 2e 0a 2a 2f 0a 73   used by Y..*/.s
10f60 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65  tatic void where
10f70 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 63  LoopAdjustCost(c
10f80 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10f90 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54  p, WhereLoop *pT
10fa0 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69 66 28 20  emplate){.  if( 
10fb0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
10fc0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
10fd0 58 45 44 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  XED)==0 ) return
10fe0 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20 70 3d 70  ;.  for(; p; p=p
10ff0 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b 0a 20 20  ->pNextLoop){.  
11000 20 20 69 66 28 20 70 2d 3e 69 54 61 62 21 3d 70    if( p->iTab!=p
11010 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61 62 20 29  Template->iTab )
11020 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
11030 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
11040 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d   WHERE_INDEXED)=
11050 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
11060 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70     if( whereLoop
11070 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62  CheaperProperSub
11080 73 65 74 28 70 2c 20 70 54 65 6d 70 6c 61 74 65  set(p, pTemplate
11090 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  ) ){.      /* Ad
110a0 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20 63  just pTemplate c
110b0 6f 73 74 20 64 6f 77 6e 77 61 72 64 20 73 6f 20  ost downward so 
110c0 74 68 61 74 20 69 74 20 69 73 20 63 68 65 61 70  that it is cheap
110d0 65 72 20 74 68 61 6e 20 69 74 73 20 0a 20 20 20  er than its .   
110e0 20 20 20 2a 2a 20 73 75 62 73 65 74 20 70 2e 20     ** subset p. 
110f0 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
11100 41 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65  ACE(0x80,("subse
11110 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e  t cost adjustmen
11120 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64  t %d,%d to %d,%d
11130 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
11140 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
11150 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65  plate->rRun, pTe
11160 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d  mplate->nOut, p-
11170 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2d 31  >rRun, p->nOut-1
11180 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  ));.      pTempl
11190 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72  ate->rRun = p->r
111a0 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  Run;.      pTemp
111b0 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e  late->nOut = p->
111c0 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20 20 7d 65  nOut - 1;.    }e
111d0 6c 73 65 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  lse if( whereLoo
111e0 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53 75  pCheaperProperSu
111f0 62 73 65 74 28 70 54 65 6d 70 6c 61 74 65 2c 20  bset(pTemplate, 
11200 70 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  p) ){.      /* A
11210 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74 65 20  djust pTemplate 
11220 63 6f 73 74 20 75 70 77 61 72 64 20 73 6f 20 74  cost upward so t
11230 68 61 74 20 69 74 20 69 73 20 63 6f 73 74 6c 69  hat it is costli
11240 65 72 20 74 68 61 6e 20 70 20 73 69 6e 63 65 0a  er than p since.
11250 20 20 20 20 20 20 2a 2a 20 70 54 65 6d 70 6c 61        ** pTempla
11260 74 65 20 69 73 20 61 20 70 72 6f 70 65 72 20 73  te is a proper s
11270 75 62 73 65 74 20 6f 66 20 70 20 2a 2f 0a 20 20  ubset of p */.  
11280 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
11290 78 38 30 2c 28 22 73 75 62 73 65 74 20 63 6f 73  x80,("subset cos
112a0 74 20 61 64 6a 75 73 74 6d 65 6e 74 20 25 64 2c  t adjustment %d,
112b0 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a  %d to %d,%d\n",.
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65         pTemplate
112e0 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70 6c 61 74  ->rRun, pTemplat
112f0 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72 52 75 6e  e->nOut, p->rRun
11300 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29 3b 0a 20  , p->nOut+1));. 
11310 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e       pTemplate->
11320 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a  rRun = p->rRun;.
11330 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74 65 2d        pTemplate-
11340 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f 75 74 20  >nOut = p->nOut 
11350 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  + 1;.    }.  }.}
11360 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
11370 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
11380 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50 72 65 76  Loops in *ppPrev
11390 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 6e 65   looking for one
113a0 20 74 68 61 74 20 63 61 6e 20 62 65 0a 2a 2a 20   that can be.** 
113b0 72 65 70 6c 61 63 65 64 20 62 79 20 70 54 65 6d  replaced by pTem
113c0 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  plate..**.** Ret
113d0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 70 54 65 6d  urn NULL if pTem
113e0 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f 74 20 62  plate does not b
113f0 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20 57 68 65  elong on the Whe
11400 72 65 4c 6f 6f 70 20 6c 69 73 74 2e 0a 2a 2a 20  reLoop list..** 
11410 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  In other words i
11420 66 20 70 54 65 6d 70 6c 61 74 65 20 6f 75 67 68  f pTemplate ough
11430 74 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 20  t to be dropped 
11440 66 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e  from further con
11450 73 69 64 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  sideration..**.*
11460 2a 20 49 66 20 70 58 20 69 73 20 61 20 57 68 65  * If pX is a Whe
11470 72 65 4c 6f 6f 70 20 74 68 61 74 20 70 54 65 6d  reLoop that pTem
11480 70 6c 61 74 65 20 63 61 6e 20 72 65 70 6c 61 63  plate can replac
11490 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  e, then return t
114a0 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68 61 74 20  he.** link that 
114b0 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e 0a 2a 2a  points to pX..**
114c0 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65  .** If pTemplate
114d0 20 63 61 6e 6e 6f 74 20 72 65 70 6c 61 63 65 20   cannot replace 
114e0 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65 6c 65  any existing ele
114f0 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74  ment of the list
11500 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a 20 74 6f   but needs.** to
11510 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
11520 20 6c 69 73 74 20 61 73 20 61 20 6e 65 77 20 65   list as a new e
11530 6e 74 72 79 2c 20 74 68 65 6e 20 72 65 74 75 72  ntry, then retur
11540 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
11550 68 65 0a 2a 2a 20 74 61 69 6c 20 6f 66 20 74 68  he.** tail of th
11560 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
11570 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 77 68  c WhereLoop **wh
11580 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65  ereLoopFindLesse
11590 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  r(.  WhereLoop *
115a0 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f 6e 73 74  *ppPrev,.  const
115b0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d   WhereLoop *pTem
115c0 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68 65 72 65  plate.){.  Where
115d0 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Loop *p;.  for(p
115e0 3d 28 2a 70 70 50 72 65 76 29 3b 20 70 3b 20 70  =(*ppPrev); p; p
115f0 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65 78 74 4c  pPrev=&p->pNextL
11600 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65 76 29 7b  oop, p=*ppPrev){
11610 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
11620 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
11630 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74 49 64 78  b || p->iSortIdx
11640 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 53 6f  !=pTemplate->iSo
11650 72 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 2f  rtIdx ){.      /
11660 2a 20 49 66 20 65 69 74 68 65 72 20 74 68 65 20  * If either the 
11670 69 54 61 62 20 6f 72 20 69 53 6f 72 74 49 64 78  iTab or iSortIdx
11680 20 76 61 6c 75 65 73 20 66 6f 72 20 74 77 6f 20   values for two 
11690 57 68 65 72 65 4c 6f 6f 70 20 61 72 65 20 64 69  WhereLoop are di
116a0 66 66 65 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a  fferent.      **
116b0 20 74 68 65 6e 20 74 68 6f 73 65 20 57 68 65 72   then those Wher
116c0 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74 6f 20 62  eLoops need to b
116d0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 73 65 70  e considered sep
116e0 61 72 61 74 65 6c 79 2e 20 20 4e 65 69 74 68 65  arately.  Neithe
116f0 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  r is.      ** a 
11700 63 61 6e 64 69 64 61 74 65 20 74 6f 20 72 65 70  candidate to rep
11710 6c 61 63 65 20 74 68 65 20 6f 74 68 65 72 2e 20  lace the other. 
11720 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
11730 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  e;.    }.    /* 
11740 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
11750 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74  mplementation, t
11760 68 65 20 72 53 65 74 75 70 20 76 61 6c 75 65 20  he rSetup value 
11770 69 73 20 65 69 74 68 65 72 20 7a 65 72 6f 0a 20  is either zero. 
11780 20 20 20 2a 2a 20 6f 72 20 74 68 65 20 63 6f 73     ** or the cos
11790 74 20 6f 66 20 62 75 69 6c 64 69 6e 67 20 61 6e  t of building an
117a0 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
117b0 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20 74 68 65   (NlogN) and the
117c0 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a 20 69 73   NlogN.    ** is
117d0 20 74 68 65 20 73 61 6d 65 20 66 6f 72 20 63 6f   the same for co
117e0 6d 70 61 74 69 62 6c 65 20 57 68 65 72 65 4c 6f  mpatible WhereLo
117f0 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ops. */.    asse
11800 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3d 3d 30  rt( p->rSetup==0
11810 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72   || pTemplate->r
11820 53 65 74 75 70 3d 3d 30 20 0a 20 20 20 20 20 20  Setup==0 .      
11830 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
11840 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d 70 6c 61  >rSetup==pTempla
11850 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 0a 0a 20  te->rSetup );.. 
11860 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f 6f 70 41     /* whereLoopA
11870 64 64 42 74 72 65 65 28 29 20 61 6c 77 61 79 73  ddBtree() always
11880 20 67 65 6e 65 72 61 74 65 73 20 61 6e 64 20 69   generates and i
11890 6e 73 65 72 74 73 20 74 68 65 20 61 75 74 6f 6d  nserts the autom
118a0 61 74 69 63 20 69 6e 64 65 78 0a 20 20 20 20 2a  atic index.    *
118b0 2a 20 63 61 73 65 20 66 69 72 73 74 2e 20 20 48  * case first.  H
118c0 65 6e 63 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  ence compatible 
118d0 63 61 6e 64 69 64 61 74 65 20 57 68 65 72 65 4c  candidate WhereL
118e0 6f 6f 70 73 20 6e 65 76 65 72 20 68 61 76 65 20  oops never have 
118f0 61 20 6c 61 72 67 65 72 0a 20 20 20 20 2a 2a 20  a larger.    ** 
11900 72 53 65 74 75 70 2e 20 43 61 6c 6c 20 74 68 69  rSetup. Call thi
11910 73 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e  s SETUP-INVARIAN
11920 54 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  T */.    assert(
11930 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d   p->rSetup>=pTem
11940 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
11950 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20 6c 6f 6f  ..    /* Any loo
11960 70 20 75 73 69 6e 67 20 61 6e 20 61 70 70 6c 69  p using an appli
11970 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 69 6e  ation-defined in
11980 64 65 78 20 28 6f 72 20 50 52 49 4d 41 52 59 20  dex (or PRIMARY 
11990 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a 20 55 4e  KEY or.    ** UN
119a0 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 29  IQUE constraint)
119b0 20 77 69 74 68 20 6f 6e 65 20 6f 72 20 6d 6f 72   with one or mor
119c0 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  e == constraints
119d0 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
119e0 2a 20 74 68 61 6e 20 61 6e 20 61 75 74 6f 6d 61  * than an automa
119f0 74 69 63 20 69 6e 64 65 78 2e 20 55 6e 6c 65 73  tic index. Unles
11a00 73 20 69 74 20 69 73 20 61 20 73 6b 69 70 2d 73  s it is a skip-s
11a10 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  can. */.    if( 
11a20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  (p->wsFlags & WH
11a30 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21  ERE_AUTO_INDEX)!
11a40 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d  =0.     && (pTem
11a50 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29 3d 3d 30  plate->nSkip)==0
11a60 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
11a70 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
11a80 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
11a90 0a 20 20 20 20 20 26 26 20 28 70 54 65 6d 70 6c  .     && (pTempl
11aa0 61 74 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ate->wsFlags & W
11ab0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 21  HERE_COLUMN_EQ)!
11ac0 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 70  =0.     && (p->p
11ad0 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74  rereq & pTemplat
11ae0 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d  e->prereq)==pTem
11af0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 0a 20 20  plate->prereq.  
11b00 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
11b10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11b20 49 66 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  If existing Wher
11b30 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65  eLoop p is bette
11b40 72 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  r than pTemplate
11b50 2c 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20  , pTemplate can 
11b60 62 65 0a 20 20 20 20 2a 2a 20 64 69 73 63 61 72  be.    ** discar
11b70 64 65 64 2e 20 20 57 68 65 72 65 4c 6f 6f 70 20  ded.  WhereLoop 
11b80 70 20 69 73 20 62 65 74 74 65 72 20 69 66 3a 0a  p is better if:.
11b90 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 20      **   (1)  p 
11ba0 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64 65 70 65  has no more depe
11bb0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 70 54  ndencies than pT
11bc0 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a 20 20 20  emplate, and.   
11bd0 20 2a 2a 20 20 20 28 32 29 20 20 70 20 68 61 73   **   (2)  p has
11be0 20 61 6e 20 65 71 75 61 6c 20 6f 72 20 6c 6f 77   an equal or low
11bf0 65 72 20 63 6f 73 74 20 74 68 61 6e 20 70 54 65  er cost than pTe
11c00 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f 0a 20 20  mplate.    */.  
11c10 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
11c20 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
11c30 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71  ereq)==p->prereq
11c40 20 20 20 20 2f 2a 20 28 31 29 20 20 2a 2f 0a 20      /* (1)  */. 
11c50 20 20 20 20 26 26 20 70 2d 3e 72 53 65 74 75 70      && p->rSetup
11c60 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  <=pTemplate->rSe
11c70 74 75 70 20 20 20 20 20 20 20 20 20 20 20 20 20  tup             
11c80 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a       /* (2a) */.
11c90 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75 6e 3c       && p->rRun<
11ca0 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e  =pTemplate->rRun
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a 2f        /* (2b) */
11cd0 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
11ce0 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  <=pTemplate->nOu
11cf0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11d00 20 20 20 20 20 20 20 2f 2a 20 28 32 63 29 20 2a         /* (2c) *
11d10 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  /.    ){.      r
11d20 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 44 69 73  eturn 0;  /* Dis
11d30 63 61 72 64 20 70 54 65 6d 70 6c 61 74 65 20 2a  card pTemplate *
11d40 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  /.    }..    /* 
11d50 49 66 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20  If pTemplate is 
11d60 61 6c 77 61 79 73 20 62 65 74 74 65 72 20 74 68  always better th
11d70 61 6e 20 70 2c 20 74 68 65 6e 20 63 61 75 73 65  an p, then cause
11d80 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69   p to be overwri
11d90 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77 69 74 68  tten.    ** with
11da0 20 70 54 65 6d 70 6c 61 74 65 2e 20 20 70 54 65   pTemplate.  pTe
11db0 6d 70 6c 61 74 65 20 69 73 20 62 65 74 74 65 72  mplate is better
11dc0 20 74 68 61 6e 20 70 20 69 66 3a 0a 20 20 20 20   than p if:.    
11dd0 2a 2a 20 20 20 28 31 29 20 20 70 54 65 6d 70 6c  **   (1)  pTempl
11de0 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20  ate has no more 
11df0 64 65 70 65 6e 64 65 6e 63 65 73 20 74 68 61 6e  dependences than
11e00 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20   p, and.    **  
11e10 20 28 32 29 20 20 70 54 65 6d 70 6c 61 74 65 20   (2)  pTemplate 
11e20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
11e30 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
11e40 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
11e50 28 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  ( (p->prereq & p
11e60 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
11e70 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
11e80 65 72 65 71 20 20 20 2f 2a 20 28 31 29 20 20 2a  ereq   /* (1)  *
11e90 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52 75  /.     && p->rRu
11ea0 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  n>=pTemplate->rR
11eb0 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  un              
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ed0 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20 20 20 26  * (2a) */.     &
11ee0 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54 65 6d 70  & p->nOut>=pTemp
11ef0 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20  late->nOut      
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29 20 2a         /* (2b) *
11f20 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  /.    ){.      a
11f30 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
11f40 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65  >=pTemplate->rSe
11f50 74 75 70 20 29 3b 20 2f 2a 20 53 45 54 55 50 2d  tup ); /* SETUP-
11f60 49 4e 56 41 52 49 41 4e 54 20 61 62 6f 76 65 20  INVARIANT above 
11f70 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  */.      break; 
11f80 20 20 2f 2a 20 43 61 75 73 65 20 70 20 74 6f 20    /* Cause p to 
11f90 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  be overwritten b
11fa0 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
11fb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11fc0 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a 2f 2a 0a  n ppPrev;.}../*.
11fd0 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 70  ** Insert or rep
11fe0 6c 61 63 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lace a WhereLoop
11ff0 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74 68 65   entry using the
12000 20 74 65 6d 70 6c 61 74 65 20 73 75 70 70 6c 69   template suppli
12010 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 69  ed..**.** An exi
12020 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  sting WhereLoop 
12030 65 6e 74 72 79 20 6d 69 67 68 74 20 62 65 20 6f  entry might be o
12040 76 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68  verwritten if th
12050 65 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 0a 2a  e new template.*
12060 2a 20 69 73 20 62 65 74 74 65 72 20 61 6e 64 20  * is better and 
12070 68 61 73 20 66 65 77 65 72 20 64 65 70 65 6e 64  has fewer depend
12080 65 6e 63 69 65 73 2e 20 20 4f 72 20 74 68 65 20  encies.  Or the 
12090 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c 20 62 65  template will be
120a0 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 64 20   ignored.** and 
120b0 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c 6c 20 6f  no insert will o
120c0 63 63 75 72 20 69 66 20 61 6e 20 65 78 69 73 74  ccur if an exist
120d0 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 69 73  ing WhereLoop is
120e0 20 66 61 73 74 65 72 20 61 6e 64 20 68 61 73 0a   faster and has.
120f0 2a 2a 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  ** fewer depende
12100 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 74  ncies than the t
12110 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68 65 72 77  emplate.  Otherw
12120 69 73 65 20 61 20 6e 65 77 20 57 68 65 72 65 4c  ise a new WhereL
12130 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  oop is.** added 
12140 62 61 73 65 64 20 6f 6e 20 74 68 65 20 74 65 6d  based on the tem
12150 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  plate..**.** If 
12160 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12170 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
12180 6e 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  n we care about 
12190 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70 72 65 72  only the.** prer
121a0 65 71 75 69 73 69 74 65 73 20 61 6e 64 20 72 52  equisites and rR
121b0 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63 6f 73 74  un and nOut cost
121c0 73 20 6f 66 20 74 68 65 20 4e 20 62 65 73 74 20  s of the N best 
121d0 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a 2a 2a 20  loops.  That.** 
121e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 67  information is g
121f0 61 74 68 65 72 65 64 20 69 6e 20 74 68 65 20 70  athered in the p
12200 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
12210 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 73 70  object.  This sp
12220 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63 65 73 73  ecial.** process
12230 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
12240 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20 63 6c 61   only for OR cla
12250 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  use processing..
12260 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63 63 75 6d  **.** When accum
12270 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65  ulating multiple
12280 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20 70 42 75   loops (when pBu
12290 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73  ilder->pOrSet is
122a0 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20 73 74 69   NULL) we.** sti
122b0 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ll might overwri
122c0 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f 6f 70 73  te similar loops
122d0 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 65   with the new te
122e0 6d 70 6c 61 74 65 20 69 66 20 74 68 65 0a 2a 2a  mplate if the.**
122f0 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 73   new template is
12300 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f 70 73 20   better.  Loops 
12310 6d 61 79 20 62 65 20 6f 76 65 72 77 72 69 74 74  may be overwritt
12320 65 6e 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  en if the follow
12330 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ing .** conditio
12340 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ns are met:.**.*
12350 2a 20 20 20 20 28 31 29 20 20 54 68 65 79 20 68  *    (1)  They h
12360 61 76 65 20 74 68 65 20 73 61 6d 65 20 69 54 61  ave the same iTa
12370 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20 20 54 68  b..**    (2)  Th
12380 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
12390 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a 20 20 20   iSortIdx..**   
123a0 20 28 33 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (3)  The templa
123b0 74 65 20 68 61 73 20 73 61 6d 65 20 6f 72 20 66  te has same or f
123c0 65 77 65 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ewer dependencie
123d0 73 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  s than the curre
123e0 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20 20 28 34  nt loop.**    (4
123f0 29 20 20 54 68 65 20 74 65 6d 70 6c 61 74 65 20  )  The template 
12400 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
12410 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
12420 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
12430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
12440 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 57  hereLoopInsert(W
12450 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
12460 2a 70 42 75 69 6c 64 65 72 2c 20 57 68 65 72 65  *pBuilder, Where
12470 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29  Loop *pTemplate)
12480 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  {.  WhereLoop **
12490 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20 20 57 68  ppPrev, *p;.  Wh
124a0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
124b0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
124c0 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  fo;.  sqlite3 *d
124d0 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  b = pWInfo->pPar
124e0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63  se->db;.  int rc
124f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42 75 69 6c  ;..  /* If pBuil
12500 64 65 72 2d 3e 70 4f 72 53 65 74 20 69 73 20 64  der->pOrSet is d
12510 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 6f 6e 6c  efined, then onl
12520 79 20 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  y keep track of 
12530 74 68 65 20 63 6f 73 74 73 0a 20 20 2a 2a 20 61  the costs.  ** a
12540 6e 64 20 70 72 65 72 65 71 73 2e 0a 20 20 2a 2f  nd prereqs..  */
12550 0a 20 20 69 66 28 20 70 42 75 69 6c 64 65 72 2d  .  if( pBuilder-
12560 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b 0a 20 20  >pOrSet!=0 ){.  
12570 20 20 69 66 28 20 70 54 65 6d 70 6c 61 74 65 2d    if( pTemplate-
12580 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69 66 20 57  >nLTerm ){.#if W
12590 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
125a0 44 0a 20 20 20 20 20 20 75 31 36 20 6e 20 3d 20  D.      u16 n = 
125b0 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
125c0 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  ->n;.      int x
125d0 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   =.#endif.      
125e0 77 68 65 72 65 4f 72 49 6e 73 65 72 74 28 70 42  whereOrInsert(pB
125f0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 2c 20  uilder->pOrSet, 
12600 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
12610 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52  q, pTemplate->rR
12620 75 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  un,.            
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74          pTemplat
12650 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66 20 57 48  e->nOut);.#if WH
12660 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
12670 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20   /* 0x8 */.     
12680 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
12690 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
126a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
126b0 65 62 75 67 50 72 69 6e 74 66 28 78 3f 22 20 20  ebugPrintf(x?"  
126c0 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20 20 20 6f   or-%d:  ":"   o
126d0 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a 20 20 20  r-X:  ", n);.   
126e0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
126f0 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
12700 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
12710 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
12720 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
12730 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
12740 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 6e 20   /* Look for an 
12750 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
12760 6f 70 20 74 6f 20 72 65 70 6c 61 63 65 20 77 69  op to replace wi
12770 74 68 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 2a  th pTemplate.  *
12780 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a  /.  whereLoopAdj
12790 75 73 74 43 6f 73 74 28 70 57 49 6e 66 6f 2d 3e  ustCost(pWInfo->
127a0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
127b0 65 29 3b 0a 20 20 70 70 50 72 65 76 20 3d 20 77  e);.  ppPrev = w
127c0 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
127d0 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  er(&pWInfo->pLoo
127e0 70 73 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a  ps, pTemplate);.
127f0 0a 20 20 69 66 28 20 70 70 50 72 65 76 3d 3d 30  .  if( ppPrev==0
12800 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
12810 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
12820 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 6e 20 74  a WhereLoop on t
12830 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
12840 62 65 74 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  better.    ** th
12850 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 73 6f  an pTemplate, so
12860 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 70 54 65   just ignore pTe
12870 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66 20 57 48  mplate */.#if WH
12880 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
12890 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 69   /* 0x8 */.    i
128a0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
128b0 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20 20  race & 0x8 ){.  
128c0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
128d0 50 72 69 6e 74 66 28 22 20 20 20 73 6b 69 70 3a  Printf("   skip:
128e0 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65   ");.      where
128f0 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c  LoopPrint(pTempl
12900 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  ate, pBuilder->p
12910 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  WC);.    }.#endi
12920 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
12930 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d 65 6c 73  ITE_OK;  .  }els
12940 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70 70 50 72  e{.    p = *ppPr
12950 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ev;.  }..  /* If
12960 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
12970 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73 20 74 68  oint it means th
12980 61 74 20 65 69 74 68 65 72 20 70 5b 5d 20 73 68  at either p[] sh
12990 6f 75 6c 64 20 62 65 20 6f 76 65 72 77 72 69 74  ould be overwrit
129a0 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68 20 70 54  ten.  ** with pT
129b0 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20 70 5b 5d  emplate[] if p[]
129c0 20 65 78 69 73 74 73 2c 20 6f 72 20 69 66 20 70   exists, or if p
129d0 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 6c 6f  ==NULL then allo
129e0 63 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  cate a new.  ** 
129f0 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64 20 69 6e  WhereLoop and in
12a00 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  sert it..  */.#i
12a10 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12a20 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
12a30 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
12a40 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a  eTrace & 0x8 ){.
12a50 20 20 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a      if( p!=0 ){.
12a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
12a70 75 67 50 72 69 6e 74 66 28 22 72 65 70 6c 61 63  ugPrintf("replac
12a80 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68 65  e: ");.      whe
12a90 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20 70  reLoopPrint(p, p
12aa0 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
12ab0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
12ac0 67 50 72 69 6e 74 66 28 22 20 20 20 77 69 74 68  gPrintf("   with
12ad0 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : ");.    }else{
12ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
12af0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 20 61  bugPrintf("    a
12b00 64 64 3a 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  dd: ");.    }.  
12b10 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12b20 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12b30 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
12b40 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
12b50 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
12b60 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
12b70 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
12b80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
12b90 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
12ba0 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
12bb0 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
12bc0 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
12bd0 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
12be0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
12bf0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
12c00 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
12c10 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  p);.    p->pNext
12c20 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Loop = 0;.  }els
12c30 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c  e{.    /* We wil
12c40 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67  l be overwriting
12c50 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20   WhereLoop p[]. 
12c60 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64   But before we d
12c70 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  o, first.    ** 
12c80 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  go through the r
12c90 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  est of the list 
12ca0 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f  and delete any o
12cb0 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73  ther entries bes
12cc0 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20  ides.    ** p[] 
12cd0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75  that are also su
12ce0 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70  pplated by pTemp
12cf0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72  late */.    Wher
12d00 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d  eLoop **ppTail =
12d10 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a   &p->pNextLoop;.
12d20 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
12d30 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65  ToDel;.    while
12d40 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20  ( *ppTail ){.   
12d50 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72     ppTail = wher
12d60 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12d70 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74  ppTail, pTemplat
12d80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70  e);.      if( pp
12d90 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tail==0 ) break;
12da0 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
12db0 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
12dc0 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
12dd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
12de0 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
12df0 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
12e00 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
12e10 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
12e20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
12e30 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
12e40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
12e50 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65  bugPrintf(" dele
12e60 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  te: ");.        
12e70 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12e80 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
12e90 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
12ea0 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
12eb0 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
12ec0 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
12ed0 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c   }.  rc = whereL
12ee0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
12ef0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
12f00 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
12f10 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
12f20 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
12f30 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
12f40 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
12f50 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12f60 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
12f70 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
12f80 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
12f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12fa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12fb0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
12fc0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
12fd0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
12fe0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
12ff0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
13000 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
13010 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
13020 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
13030 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
13040 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65  ndex..*.** For e
13050 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
13060 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
13070 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
13080 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
13090 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72  h has a truth pr
130a0 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e  obability assign
130b0 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
130c0 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a   likelihood(),.*
130d0 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75  * likely(), or u
130e0 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75  nlikely() SQL fu
130f0 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20  nctions, reduce 
13100 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
13110 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75  mber.** of outpu
13120 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72  t rows by the pr
13130 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66  obability specif
13140 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e  ied..**.** TUNIN
13150 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48  G:  For every WH
13160 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
13170 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
13180 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
13190 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20   and which does 
131a0 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69  not have an assi
131b0 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61  gned truth proba
131c0 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69  bility, heuristi
131d0 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  cs.** described 
131e0 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74  below are used t
131f0 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
13200 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
13210 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f  ability..** TODO
13220 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69   --> Perhaps thi
13230 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
13240 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  hat could be imp
13250 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a  roved by better.
13260 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74  ** table statist
13270 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  ics..**.** Heuri
13280 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74  stic 1:  Estimat
13290 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
132a0 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35  ability as 93.75
132b0 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a  %.  The 93.75%.*
132c0 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f  * value correspo
132d0 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67  nds to -1 in Log
132e0 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f  Est notation, so
132f0 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72   this means decr
13300 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65  ement.** the Whe
13310 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c  reLoop.nOut fiel
13320 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68  d for every such
13330 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13340 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  rm..**.** Heuris
13350 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65  tic 2:  If there
13360 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
13370 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
13380 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
13390 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20   form "x==EXPR" 
133a0 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20  and EXPR is not 
133b0 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20  a constant 0 or 
133c0 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  1, then make sur
133d0 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f  e the.** final o
133e0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
133f0 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72  te is no greater
13400 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65   than 1/4 of the
13410 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a   total number.**
13420 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
13430 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
13440 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74   words, assume t
13450 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c  hat x==EXPR will
13460 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61   filter.** out a
13470 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66  t least 3 out of
13480 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50   4 rows.  If EXP
13490 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20  R is -1 or 0 or 
134a0 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68  1, then maybe th
134b0 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20  e.** "x" column 
134c0 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c  is boolean or el
134d0 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20  se -1 or 0 or 1 
134e0 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61  is a common defa
134f0 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20  ult value.** on 
13500 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61  the "x" column a
13510 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  nd so in that ca
13520 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20  se only cap the 
13530 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
13540 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e  ate.** at 1/2 in
13550 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f  stead of 1/4..*/
13560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
13570 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
13580 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  st(.  WhereClaus
13590 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
135a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
135b0 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
135c0 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20  *pLoop,      /* 
135d0 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75  The loop to adju
135e0 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20  st downward */. 
135f0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20   LogEst nRow    
13600 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13610 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
13620 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
13630 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
13640 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
13650 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
13660 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
13670 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
13680 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
13690 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52  , k;.  LogEst iR
136a0 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a  educe = 0;    /*
136b0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f   pLoop->nOut sho
136c0 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e  uld not exceed n
136d0 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a  Row-iReduce */..
136e0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
136f0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
13700 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
13710 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   );.  for(i=pWC-
13720 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
13730 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
13740 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
13750 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
13760 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
13770 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
13780 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13790 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
137a0 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
137b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
137c0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
137d0 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
137e0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
137f0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
13800 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
13810 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
13820 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
13830 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
13840 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
13850 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
13860 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13870 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
13880 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
13890 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
138a0 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
138b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
138c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
138d0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
138e0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
138f0 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f  * If a truth pro
13900 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63  bability is spec
13910 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  ified using the 
13920 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e  likelihood() hin
13930 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts,.        ** t
13940 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62  hen use the prob
13950 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64  ability provided
13960 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
13970 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
13980 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
13990 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
139a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
139b0 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
139c0 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69  absence of expli
139d0 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62  cit truth probab
139e0 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75  ilities, use heu
139f0 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20  ristics to.     
13a00 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65     ** guess a re
13a10 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70  asonable truth p
13a20 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20  robability. */. 
13a30 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
13a40 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  ut--;.        if
13a50 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13a60 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
13a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
13a80 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
13a90 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13aa0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
13ab0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
13ac0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
13ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
13ae0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
13af0 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29  eger(pRight, &k)
13b00 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b   && k>=(-1) && k
13b10 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=1 ){.         
13b20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20     k = 10;.     
13b30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13b40 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a          k = 20;.
13b50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13b60 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63        if( iReduc
13b70 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20  e<k ) iReduce = 
13b80 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13ba0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
13bb0 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20   > nRow-iReduce 
13bc0 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  )  pLoop->nOut =
13bd0 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b   nRow - iReduce;
13be0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20  .}../* .** Term 
13bf0 70 54 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f  pTerm is a vecto
13c00 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73  r range comparis
13c10 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  on operation. Th
13c20 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73  e first comparis
13c30 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63  on.** in the vec
13c40 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  tor can be optim
13c50 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d  ized using colum
13c60 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64  n nEq of the ind
13c70 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ex. This.** func
13c80 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
13c90 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
13ca0 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73   vector elements
13cb0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
13cc0 64 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  d.** as part of 
13cd0 74 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61 72  the range compar
13ce0 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ison..**.** For 
13cf0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
13d00 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
13d10 20 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e    WHERE a = ? AN
13d20 44 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f  D (b, c, d) > (?
13d30 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e  , ?, ?).**.** an
13d40 64 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a  d the index:.**.
13d50 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
13d60 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20  X ... ON (a, b, 
13d70 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74  c, d, e).**.** t
13d80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
13d90 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b  n would be invok
13da0 65 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20 54  ed with nEq=1. T
13db0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
13dc0 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73  d in.** this cas
13dd0 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74 61 74 69  e is 3..*/.stati
13de0 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
13df0 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 50 61 72  VectorLen(.  Par
13e00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13e10 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
13e20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  text */.  int iC
13e30 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ur,            /
13e40 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
13e50 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78   pIdx */.  Index
13e60 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
13e70 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20  /* The index to 
13e80 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 69 6e  be used for a in
13e90 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
13ea0 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  int */.  int nEq
13eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
13ec0 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72   Number of prior
13ed0 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
13ee0 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65 20 69 6e  aints on same in
13ef0 64 65 78 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  dex */.  WhereTe
13f00 72 6d 20 2a 70 54 65 72 6d 20 20 20 20 20 2f 2a  rm *pTerm     /*
13f10 20 54 68 65 20 76 65 63 74 6f 72 20 69 6e 65 71   The vector ineq
13f20 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
13f30 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  t */.){.  int nC
13f40 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  mp = sqlite3Expr
13f50 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72 6d  VectorSize(pTerm
13f60 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  ->pExpr->pLeft);
13f70 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43 6d  .  int i;..  nCm
13f80 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28 70  p = MIN(nCmp, (p
13f90 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20 6e  Idx->nColumn - n
13fa0 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  Eq));.  for(i=1;
13fb0 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20   i<nCmp; i++){. 
13fc0 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63 6f     /* Test if co
13fd0 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70 54  mparison i of pT
13fe0 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62 6c  erm is compatibl
13ff0 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28 69  e with column (i
14000 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f 66  +nEq) .    ** of
14010 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20 6e   the index. If n
14020 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f 6f  ot, exit the loo
14030 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  p.  */.    char 
14040 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  aff;            
14050 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
14060 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79 20  arison affinity 
14070 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78 61  */.    char idxa
14080 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
14090 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64 20       /* Indexed 
140a0 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
140b0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
140c0 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pColl;         
140d0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
140e0 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  son collation se
140f0 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45 78  quence */.    Ex
14100 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72 6d  pr *pLhs = pTerm
14110 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  ->pExpr->pLeft->
14120 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  x.pList->a[i].pE
14130 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
14140 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  Rhs = pTerm->pEx
14150 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
14160 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
14170 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20 29  & EP_xIsSelect )
14180 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70  {.      pRhs = p
14190 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e  Rhs->x.pSelect->
141a0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
141b0 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
141c0 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68 73       pRhs = pRhs
141d0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ->x.pList->a[i].
141e0 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  pExpr;.    }..  
141f0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
14200 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 63  the LHS of the c
14210 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63  omparison is a c
14220 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20  olumn reference 
14230 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  to.    ** the ri
14240 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ght column of th
14250 65 20 72 69 67 68 74 20 73 6f 75 72 63 65 20 74  e right source t
14260 61 62 6c 65 2e 20 41 6e 64 20 74 68 61 74 20 74  able. And that t
14270 68 65 20 73 6f 72 74 0a 20 20 20 20 2a 2a 20 6f  he sort.    ** o
14280 72 64 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  rder of the inde
14290 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  x column is the 
142a0 73 61 6d 65 20 61 73 20 74 68 65 20 73 6f 72 74  same as the sort
142b0 20 6f 72 64 65 72 20 6f 66 20 74 68 65 0a 20 20   order of the.  
142c0 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74 20 69 6e    ** leftmost in
142d0 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20 2a 2f 0a  dex column.  */.
142e0 20 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70      if( pLhs->op
142f0 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20  !=TK_COLUMN .   
14300 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c    || pLhs->iTabl
14310 65 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c  e!=iCur .     ||
14320 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d   pLhs->iColumn!=
14330 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
14340 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c 7c 20 70  +nEq] .     || p
14350 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
14360 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d 3e 61 53  i+nEq]!=pIdx->aS
14370 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 0a 20 20  ortOrder[nEq].  
14380 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
14390 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65 73  ;.    }..    tes
143a0 74 63 61 73 65 28 20 70 4c 68 73 2d 3e 69 43 6f  tcase( pLhs->iCo
143b0 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29  lumn==XN_ROWID )
143c0 3b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  ;.    aff = sqli
143d0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
143e0 74 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33  ty(pRhs, sqlite3
143f0 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68  ExprAffinity(pLh
14400 73 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20  s));.    idxaff 
14410 3d 20 73 71 6c 69 74 65 33 54 61 62 6c 65 43 6f  = sqlite3TableCo
14420 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28 70 49 64  lumnAffinity(pId
14430 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c 68 73 2d  x->pTable, pLhs-
14440 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 69  >iColumn);.    i
14450 66 28 20 61 66 66 21 3d 69 64 78 61 66 66 20 29  f( aff!=idxaff )
14460 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 43 6f   break;..    pCo
14470 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
14480 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
14490 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c 20 70  (pParse, pLhs, p
144a0 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Rhs);.    if( pC
144b0 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oll==0 ) break;.
144c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
144d0 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
144e0 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
144f0 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62 72 65 61  l[i+nEq]) ) brea
14500 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
14510 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  i;.}../*.** Adju
14520 73 74 20 74 68 65 20 63 6f 73 74 20 43 20 62 79  st the cost C by
14530 20 74 68 65 20 63 6f 73 74 4d 75 6c 74 20 66 61   the costMult fa
14540 63 74 65 72 20 54 2e 20 20 54 68 69 73 20 6f 6e  cter T.  This on
14550 6c 79 20 6f 63 63 75 72 73 20 69 66 0a 2a 2a 20  ly occurs if.** 
14560 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 2d 44  compiled with -D
14570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
14580 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66 64 65 66  STMULT.*/.#ifdef
14590 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
145a0 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66 69 6e 65  OSTMULT.# define
145b0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
145c0 6c 69 65 72 28 43 2c 54 29 20 20 43 20 2b 3d 20  lier(C,T)  C += 
145d0 54 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  T.#else.# define
145e0 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70   ApplyCostMultip
145f0 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e 64 69 66  lier(C,T).#endif
14600 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61 76 65 20  ../*.** We have 
14610 73 6f 20 66 61 72 20 6d 61 74 63 68 65 64 20 70  so far matched p
14620 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75  Builder->pNew->u
14630 2e 62 74 72 65 65 2e 6e 45 71 20 74 65 72 6d 73  .btree.nEq terms
14640 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69 6e 64 65   of the .** inde
14650 78 20 70 49 6e 64 65 78 2e 20 54 72 79 20 74 6f  x pIndex. Try to
14660 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f 72 65 2e   match one more.
14670 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
14680 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
14690 6c 65 64 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70  led, pBuilder->p
146a0 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e 74 61 69  New->nOut contai
146b0 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75 6d 62 65  ns the .** numbe
146c0 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74  r of rows expect
146d0 65 64 20 74 6f 20 62 65 20 76 69 73 69 74 65 64  ed to be visited
146e0 20 62 79 20 66 69 6c 74 65 72 69 6e 67 20 75 73   by filtering us
146f0 69 6e 67 20 74 68 65 20 6e 45 71 20 0a 2a 2a 20  ing the nEq .** 
14700 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49 66 20 69  terms only. If i
14710 74 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 74  t is modified, t
14720 68 69 73 20 76 61 6c 75 65 20 69 73 20 72 65 73  his value is res
14730 74 6f 72 65 64 20 62 65 66 6f 72 65 20 74 68 69  tored before thi
14740 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
14750 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  eturns..**.** If
14760 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d 3d 3d 30   pProbe->tnum==0
14770 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 70 49 6e  , that means pIn
14780 64 65 78 20 69 73 20 61 20 66 61 6b 65 20 69 6e  dex is a fake in
14790 64 65 78 20 75 73 65 64 20 66 6f 72 20 74 68 65  dex used for the
147a0 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
147b0 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73 74 61 74  ARY KEY..*/.stat
147c0 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
147d0 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 0a 20  AddBtreeIndex(. 
147e0 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
147f0 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 20 20  r *pBuilder,    
14800 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f   /* The WhereLoo
14810 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a 20 20 73  p factory */.  s
14820 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
14830 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f  em *pSrc,      /
14840 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
14850 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  rm being analyze
14860 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
14870 72 6f 62 65 2c 20 20 20 20 20 20 20 20 20 20 20  robe,           
14880 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
14890 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f 0a 20 20  ex on pSrc */.  
148a0 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c 20 20 20  LogEst nInMul   
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72 20 6f 66  /* log(Number of
148d0 20 69 74 65 72 61 74 69 6f 6e 73 20 64 75 65 20   iterations due 
148e0 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a 20 20 57  to IN) */.){.  W
148f0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
14900 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
14910 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52 45 20 61  nfo;  /* WHERE a
14920 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78 74 20 2a  nalyse context *
14930 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
14940 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
14950 73 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se;        /* Pa
14960 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14970 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14980 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
14990 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
149a0 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c 6c 6f 63  onnection malloc
149b0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
149c0 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
149e0 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
149f0 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  oop under constr
14a00 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  uction */.  Wher
14a10 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
14a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
14a30 20 57 68 65 72 65 54 65 72 6d 20 75 6e 64 65 72   WhereTerm under
14a40 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 20 2a   consideration *
14a50 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 20  /.  int opMask; 
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 6f 70 65      /* Valid ope
14a80 72 61 74 6f 72 73 20 66 6f 72 20 63 6f 6e 73 74  rators for const
14a90 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57 68 65 72  raints */.  Wher
14aa0 65 53 63 61 6e 20 73 63 61 6e 3b 20 20 20 20 20  eScan scan;     
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14ac0 74 65 72 61 74 6f 72 20 66 6f 72 20 57 48 45 52  terator for WHER
14ad0 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  E terms */.  Bit
14ae0 6d 61 73 6b 20 73 61 76 65 64 5f 70 72 65 72 65  mask saved_prere
14af0 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  q;           /* 
14b00 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
14b10 66 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 2a  f pNew->prereq *
14b20 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 4c  /.  u16 saved_nL
14b30 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
14b40 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14b50 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
14b60 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31 36 20 73  LTerm */.  u16 s
14b70 61 76 65 64 5f 6e 45 71 3b 20 20 20 20 20 20 20  aved_nEq;       
14b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
14b90 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
14ba0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14bb0 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
14bc0 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20 20 20 20  _nBtm;          
14bd0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14be0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14bf0 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 2a  ->u.btree.nBtm *
14c00 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 54  /.  u16 saved_nT
14c10 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
14c20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14c30 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75  value of pNew->u
14c40 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a 2f 0a 20  .btree.nTop */. 
14c50 20 75 31 36 20 73 61 76 65 64 5f 6e 53 6b 69 70   u16 saved_nSkip
14c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14c70 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
14c80 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 53 6b 69  ue of pNew->nSki
14c90 70 20 2a 2f 0a 20 20 75 33 32 20 73 61 76 65 64  p */.  u32 saved
14ca0 5f 77 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  _wsFlags;       
14cb0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14cc0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14cd0 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a 20 20 4c  ->wsFlags */.  L
14ce0 6f 67 45 73 74 20 73 61 76 65 64 5f 6e 4f 75 74  ogEst saved_nOut
14cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14d00 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
14d10 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2a   of pNew->nOut *
14d20 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
14d30 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
14d40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14d50 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72  de */.  LogEst r
14d60 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
14d70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14d80 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
14d90 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
14da0 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
14db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
14dc0 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 61 62 6c  ogarithm of tabl
14dd0 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57 68 65 72  e size */.  Wher
14de0 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 30 2c  eTerm *pTop = 0,
14df0 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f 2a 20 54   *pBtm = 0; /* T
14e00 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 72 61  op and bottom ra
14e10 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nge constraints 
14e20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  */..  pNew = pBu
14e30 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 69  ilder->pNew;.  i
14e40 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
14e50 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
14e60 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
14e70 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 38    WHERETRACE(0x8
14e80 30 30 2c 20 28 22 42 45 47 49 4e 20 61 64 64 42  00, ("BEGIN addB
14e90 74 72 65 65 49 64 78 28 25 73 29 2c 20 6e 45 71  treeIdx(%s), nEq
14ea0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
14ec0 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 65 77  obe->zName, pNew
14ed0 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 29 29 3b  ->u.btree.nEq));
14ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4e 65  ..  assert( (pNe
14ef0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
14f00 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
14f10 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
14f20 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
14f30 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
14f40 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  T)==0 );.  if( p
14f50 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
14f60 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29  HERE_BTM_LIMIT )
14f70 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57  {.    opMask = W
14f80 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 7d 65  O_LT|WO_LE;.  }e
14f90 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
14fa0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14fb0 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 6f 70  Btm==0 );.    op
14fc0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
14fd0 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57  IN|WO_GT|WO_GE|W
14fe0 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 49 53  O_LT|WO_LE|WO_IS
14ff0 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20 20 7d 0a  NULL|WO_IS;.  }.
15000 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 62 55    if( pProbe->bU
15010 6e 6f 72 64 65 72 65 64 20 29 20 6f 70 4d 61 73  nordered ) opMas
15020 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c 57 4f 5f  k &= ~(WO_GT|WO_
15030 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 3b  GE|WO_LT|WO_LE);
15040 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
15050 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70 50  ->u.btree.nEq<pP
15060 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  robe->nColumn );
15070 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71 20 3d 20  ..  saved_nEq = 
15080 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
15090 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42 74 6d 20  q;.  saved_nBtm 
150a0 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e  = pNew->u.btree.
150b0 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64 5f 6e 54  nBtm;.  saved_nT
150c0 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  op = pNew->u.btr
150d0 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61 76 65 64  ee.nTop;.  saved
150e0 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77 2d 3e 6e  _nSkip = pNew->n
150f0 53 6b 69 70 3b 0a 20 20 73 61 76 65 64 5f 6e 4c  Skip;.  saved_nL
15100 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e 6e 4c 54  Term = pNew->nLT
15110 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f 77 73 46  erm;.  saved_wsF
15120 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e 77 73 46  lags = pNew->wsF
15130 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 70 72  lags;.  saved_pr
15140 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e 70 72 65  ereq = pNew->pre
15150 72 65 71 3b 0a 20 20 73 61 76 65 64 5f 6e 4f 75  req;.  saved_nOu
15160 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a  t = pNew->nOut;.
15170 20 20 70 54 65 72 6d 20 3d 20 77 68 65 72 65 53    pTerm = whereS
15180 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c 20 70  canInit(&scan, p
15190 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 53  Builder->pWC, pS
151a0 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 73 61 76  rc->iCursor, sav
151b0 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20 20 20 20  ed_nEq,.        
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b  opMask, pProbe);
151e0 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20  .  pNew->rSetup 
151f0 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20 3d 20 70  = 0;.  rSize = p
15200 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
15210 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67 53 69 7a  st[0];.  rLogSiz
15220 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a 65  e = estLog(rSize
15230 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  );.  for(; rc==S
15240 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 65 72  QLITE_OK && pTer
15250 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d 20 77 68  m!=0; pTerm = wh
15260 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
15270 6e 29 29 7b 0a 20 20 20 20 75 31 36 20 65 4f 70  n)){.    u16 eOp
15280 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61   = pTerm->eOpera
15290 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f 72 74 68  tor;   /* Shorth
152a0 61 6e 64 20 66 6f 72 20 70 54 65 72 6d 2d 3e 65  and for pTerm->e
152b0 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Operator */.    
152c0 4c 6f 67 45 73 74 20 72 43 6f 73 74 49 64 78 3b  LogEst rCostIdx;
152d0 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 4f 75 74  .    LogEst nOut
152e0 55 6e 61 64 6a 75 73 74 65 64 3b 20 20 20 20 20  Unadjusted;     
152f0 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65 66 6f 72     /* nOut befor
15300 65 20 49 4e 28 29 20 61 6e 64 20 57 48 45 52 45  e IN() and WHERE
15310 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 2a 2f 0a   adjustments */.
15320 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30 3b      int nIn = 0;
15330 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15340 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
15350 54 41 54 34 0a 20 20 20 20 69 6e 74 20 6e 52 65  TAT4.    int nRe
15360 63 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65  cValid = pBuilde
15370 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65  r->nRecValid;.#e
15380 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 65 4f  ndif.    if( (eO
15390 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p==WO_ISNULL || 
153a0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 26  (pTerm->wtFlags&
153b0 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d 30 29 0a  TERM_VNULL)!=0).
153c0 20 20 20 20 20 26 26 20 69 6e 64 65 78 43 6f 6c       && indexCol
153d0 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50 72 6f 62  umnNotNull(pProb
153e0 65 2c 20 73 61 76 65 64 5f 6e 45 71 29 0a 20 20  e, saved_nEq).  
153f0 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69    ){.      conti
15400 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72 65 20 49  nue; /* ignore I
15410 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20 63 6f 6e  S [NOT] NULL con
15420 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e 4f 54 20  straints on NOT 
15430 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  NULL columns */.
15440 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 54      }.    if( pT
15450 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
15460 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c   & pNew->maskSel
15470 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  f ) continue;.. 
15480 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
15490 6f 77 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  ow the upper bou
154a0 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20 6f 70 74  nd of a LIKE opt
154b0 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e 67 65 20  imization range 
154c0 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a  constraint.    *
154d0 2a 20 74 6f 20 6d 69 78 20 77 69 74 68 20 61 20  * to mix with a 
154e0 6c 6f 77 65 72 20 72 61 6e 67 65 20 62 6f 75 6e  lower range boun
154f0 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f 74 68 65  d from some othe
15500 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20 20 20 20  r source */.    
15510 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
15520 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50  gs & TERM_LIKEOP
15530 54 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65  T && pTerm->eOpe
15540 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20 29 20 63  rator==WO_LT ) c
15550 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
15560 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 49 53   Do not allow IS
15570 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 72 6f   constraints fro
15580 6d 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  m the WHERE clau
15590 73 65 20 74 6f 20 62 65 20 75 73 65 64 20 62 79  se to be used by
155a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 69 67 68   the.    ** righ
155b0 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46  t table of a LEF
155c0 54 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79 20 63 6f  T JOIN.  Only co
155d0 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65  nstraints in the
155e0 20 4f 4e 20 63 6c 61 75 73 65 20 61 72 65 0a 20   ON clause are. 
155f0 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 20 2a 2f     ** allowed */
15600 0a 20 20 20 20 69 66 28 20 28 70 53 72 63 2d 3e  .    if( (pSrc->
15610 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
15620 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20 26  _LEFT)!=0.     &
15630 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
15640 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
15650 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
15660 20 20 20 26 26 20 28 65 4f 70 20 26 20 28 57 4f     && (eOp & (WO
15670 5f 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c 29 29 21  _IS|WO_ISNULL))!
15680 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
15690 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
156a0 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 74  WO_IS );.      t
156b0 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
156c0 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
156d0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
156e0 7d 0a 0a 20 20 20 20 69 66 28 20 49 73 55 6e 69  }..    if( IsUni
156f0 71 75 65 49 6e 64 65 78 28 70 50 72 6f 62 65 29  queIndex(pProbe)
15700 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70   && saved_nEq==p
15710 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31  Probe->nKeyCol-1
15720 20 29 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64   ){.      pBuild
15730 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20  er->bldFlags |= 
15740 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55 4e 49 51  SQLITE_BLDF_UNIQ
15750 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UE;.    }else{. 
15760 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62       pBuilder->b
15770 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ldFlags |= SQLIT
15780 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 3b 0a  E_BLDF_INDEXED;.
15790 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
157a0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
157b0 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70 4e 65  wsFlags;.    pNe
157c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
157d0 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20 20 20 20   saved_nEq;.    
157e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
157f0 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d 3b  tm = saved_nBtm;
15800 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
15810 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f  ee.nTop = saved_
15820 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nTop;.    pNew->
15830 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e  nLTerm = saved_n
15840 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66 28 20 77  LTerm;.    if( w
15850 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
15860 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
15870 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
15880 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
15890 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65  pNew->aLTerm[pNe
158a0 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70  w->nLTerm++] = p
158b0 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Term;.    pNew->
158c0 70 72 65 72 65 71 20 3d 20 28 73 61 76 65 64 5f  prereq = (saved_
158d0 70 72 65 72 65 71 20 7c 20 70 54 65 72 6d 2d 3e  prereq | pTerm->
158e0 70 72 65 72 65 71 52 69 67 68 74 29 20 26 20 7e  prereqRight) & ~
158f0 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a  pNew->maskSelf;.
15900 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e  .    assert( nIn
15910 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20 20 20 7c  Mul==0.        |
15920 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  | (pNew->wsFlags
15930 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
15940 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20 20 20 20  NULL)!=0 .      
15950 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
15960 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
15970 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20 20 20 20  MN_IN)!=0 .     
15980 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
15990 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b 49  lags & WHERE_SKI
159a0 50 53 43 41 4e 29 21 3d 30 20 0a 20 20 20 20 29  PSCAN)!=0 .    )
159b0 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f 70 20 26  ;..    if( eOp &
159c0 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
159d0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54  Expr *pExpr = pT
159e0 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
159f0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
15a00 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
15a10 49 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78  IN;.      if( Ex
15a20 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
15a30 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
15a40 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  t) ){.        /*
15a50 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
15a60 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47 3a 20 74  ..)":  TUNING: t
15a70 68 65 20 53 45 4c 45 43 54 20 72 65 74 75 72 6e  he SELECT return
15a80 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a 20 20 20  s 25 rows */.   
15a90 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
15aa0 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b 20 20 61      nIn = 46;  a
15ab0 73 73 65 72 74 28 20 34 36 3d 3d 73 71 6c 69 74  ssert( 46==sqlit
15ac0 65 33 4c 6f 67 45 73 74 28 32 35 29 20 29 3b 0a  e3LogEst(25) );.
15ad0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
15ae0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 79 20 61  expression may a
15af0 63 74 75 61 6c 6c 79 20 62 65 20 6f 66 20 74 68  ctually be of th
15b00 65 20 66 6f 72 6d 20 28 78 2c 20 79 29 20 49 4e  e form (x, y) IN
15b10 20 28 53 45 4c 45 43 54 2e 2e 2e 29 2e 0a 20 20   (SELECT...)..  
15b20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
15b30 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 61   case there is a
15b40 20 73 65 70 61 72 61 74 65 20 74 65 72 6d 20 66   separate term f
15b50 6f 72 20 65 61 63 68 20 6f 66 20 28 78 29 20 61  or each of (x) a
15b60 6e 64 20 28 79 29 2e 0a 20 20 20 20 20 20 20 20  nd (y)..        
15b70 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  ** However, the 
15b80 6e 49 6e 20 6d 75 6c 74 69 70 6c 69 65 72 20 73  nIn multiplier s
15b90 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61 70  hould only be ap
15ba0 70 6c 69 65 64 20 6f 6e 63 65 2c 20 6e 6f 74 20  plied once, not 
15bb0 6f 6e 63 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  once.        ** 
15bc0 66 6f 72 20 65 61 63 68 20 73 75 63 68 20 74 65  for each such te
15bd0 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  rm. The followin
15be0 67 20 6c 6f 6f 70 20 63 68 65 63 6b 73 20 74 68  g loop checks th
15bf0 61 74 20 70 54 65 72 6d 20 69 73 20 74 68 65 0a  at pTerm is the.
15c00 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
15c10 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 75 73   such term in us
15c20 65 2c 20 61 6e 64 20 73 65 74 73 20 6e 49 6e 20  e, and sets nIn 
15c30 62 61 63 6b 20 74 6f 20 30 20 69 66 20 69 74 20  back to 0 if it 
15c40 69 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  is not. */.     
15c50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e     for(i=0; i<pN
15c60 65 77 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 69 2b  ew->nLTerm-1; i+
15c70 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
15c80 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69  ( pNew->aLTerm[i
15c90 5d 20 26 26 20 70 4e 65 77 2d 3e 61 4c 54 65 72  ] && pNew->aLTer
15ca0 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 45 78  m[i]->pExpr==pEx
15cb0 70 72 20 29 20 6e 49 6e 20 3d 20 30 3b 0a 20 20  pr ) nIn = 0;.  
15cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
15cd0 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
15ce0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26  Expr->x.pList &&
15cf0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
15d00 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
15d10 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
15d20 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
15d30 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 49 6e 20   */.        nIn 
15d40 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
15d50 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
15d60 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
15d70 61 73 73 65 72 74 28 20 6e 49 6e 3e 30 20 29 3b  assert( nIn>0 );
15d80 20 20 2f 2a 20 52 48 53 20 61 6c 77 61 79 73 20    /* RHS always 
15d90 68 61 73 20 32 20 6f 72 20 6d 6f 72 65 20 74 65  has 2 or more te
15da0 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70 61 72 73  rms...  The pars
15db0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
15dd0 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28 3f  changes "x IN (?
15de0 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20 2a  )" into "x=?". *
15df0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
15e00 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
15e10 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29 7b 0a 20  O_EQ|WO_IS) ){. 
15e20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
15e30 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e  pProbe->aiColumn
15e40 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a 20 20 20  [saved_nEq];.   
15e50 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
15e60 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
15e70 5f 45 51 3b 0a 20 20 20 20 20 20 61 73 73 65 72  _EQ;.      asser
15e80 74 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 4e  t( saved_nEq==pN
15e90 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  ew->u.btree.nEq 
15ea0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
15eb0 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a 20 20 20  l==XN_ROWID .   
15ec0 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20      || (iCol>=0 
15ed0 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26 26 20  && nInMul==0 && 
15ee0 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72 6f 62  saved_nEq==pProb
15ef0 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a 20 20  e->nKeyCol-1).  
15f00 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
15f10 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 70 50  f( iCol>=0 && pP
15f20 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  robe->uniqNotNul
15f30 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
15f40 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
15f50 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57 41 4e  |= WHERE_UNQ_WAN
15f60 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  TED;.        }el
15f70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
15f80 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  ew->wsFlags |= W
15f90 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 20  HERE_ONEROW;.   
15fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15fb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70     }else if( eOp
15fc0 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a   & WO_ISNULL ){.
15fd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
15fe0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
15ff0 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65  UMN_NULL;.    }e
16000 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20 28 57  lse if( eOp & (W
16010 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b 0a 20  O_GT|WO_GE) ){. 
16020 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
16030 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a 20 20  Op & WO_GT );.  
16040 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f      testcase( eO
16050 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20  p & WO_GE );.   
16060 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
16070 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
16080 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42 54 4d  _RANGE|WHERE_BTM
16090 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e  _LIMIT;.      pN
160a0 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
160b0 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56 65 63   = whereRangeVec
160c0 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20  torLen(.        
160d0 20 20 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e    pParse, pSrc->
160e0 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c  iCursor, pProbe,
160f0 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72   saved_nEq, pTer
16100 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  m.      );.     
16110 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b 0a 20   pBtm = pTerm;. 
16120 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b 0a 20       pTop = 0;. 
16130 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
16140 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c  wtFlags & TERM_L
16150 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20 20 20  IKEOPT ){.      
16160 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e 74 72    /* Range contr
16170 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20  aints that come 
16180 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20 6f 70  from the LIKE op
16190 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65 0a 20  timization are. 
161a0 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
161b0 20 75 73 65 64 20 69 6e 20 70 61 69 72 73 2e 20   used in pairs. 
161c0 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f 70 20  */.        pTop 
161d0 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20 20 20  = &pTerm[1];.   
161e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
161f0 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  op-(pTerm->pWC->
16200 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43 2d 3e  a))<pTerm->pWC->
16210 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  nTerm );.       
16220 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 77   assert( pTop->w
16230 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49  tFlags & TERM_LI
16240 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20 20 20  KEOPT );.       
16250 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d 3e 65   assert( pTop->e
16260 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
16270 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  );.        if( w
16280 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
16290 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
162a0 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65 61 6b  LTerm+1) ) break
162b0 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20 20 20  ; /* OOM */.    
162c0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
162d0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
162e0 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20 20 20   = pTop;.       
162f0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
16300 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
16310 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
16320 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20  >u.btree.nTop = 
16330 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16340 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
16350 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 4c 54  rt( eOp & (WO_LT
16360 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20 20 20  |WO_LE) );.     
16370 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
16380 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20   WO_LT );.      
16390 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
163a0 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 70  WO_LE );.      p
163b0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
163c0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
163d0 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  GE|WHERE_TOP_LIM
163e0 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  IT;.      pNew->
163f0 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 77  u.btree.nTop = w
16400 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c  hereRangeVectorL
16410 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  en(.          pP
16420 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  arse, pSrc->iCur
16430 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73 61 76  sor, pProbe, sav
16440 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20  ed_nEq, pTerm.  
16450 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70 54 6f      );.      pTo
16460 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  p = pTerm;.     
16470 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d 3e 77   pBtm = (pNew->w
16480 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42  sFlags & WHERE_B
16490 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f 0a 20  TM_LIMIT)!=0 ?. 
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164b0 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
164c0 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 32 5d  [pNew->nLTerm-2]
164d0 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   : 0;.    }..   
164e0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
164f0 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69 73 20  t pNew->nOut is 
16500 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
16510 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65 63 74  r of rows expect
16520 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
16530 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20 69  visited by the i
16540 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f 72 65  ndex scan before
16550 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 65 72   considering ter
16560 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68 65 0a  m pTerm, or the.
16570 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 6f 66      ** values of
16580 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75 6c 2e   nIn and nInMul.
16590 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
165a0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 61   assuming that a
165b0 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20 49 4e  ll .    ** "x IN
165c0 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61 72 65  (...)" terms are
165d0 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 22   replaced with "
165e0 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62 6c 6f  x = ?". This blo
165f0 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20 20 2a  ck updates.    *
16600 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70  * the value of p
16610 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61 63 63  New->nOut to acc
16620 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d 20 28  ount for pTerm (
16630 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49 6e 4d  but not nIn/nInM
16640 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ul).  */.    ass
16650 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d  ert( pNew->nOut=
16660 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b 0a 20  =saved_nOut );. 
16670 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
16680 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
16690 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
166a0 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 4f 75     /* Adjust nOu
166b0 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f 73 74  t using stat3/st
166c0 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20 69 66  at4 data. Or, if
166d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
166e0 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20 20 2a  t3/stat4.      *
166f0 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20 73 6f  * data, using so
16700 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d 61 74  me other estimat
16710 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 65  e.  */.      whe
16720 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 70  reRangeScanEst(p
16730 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
16740 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70 4e 65   pBtm, pTop, pNe
16750 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  w);.    }else{. 
16760 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 2b       int nEq = +
16770 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  +pNew->u.btree.n
16780 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  Eq;.      assert
16790 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53 4e 55  ( eOp & (WO_ISNU
167a0 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57  LL|WO_EQ|WO_IN|W
167b0 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20 20 20  O_IS) );..      
167c0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
167d0 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29  ut==saved_nOut )
167e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
167f0 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20  m->truthProb<=0 
16800 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c  && pProbe->aiCol
16810 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3e 3d  umn[saved_nEq]>=
16820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
16830 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f 5f 49  ert( (eOp & WO_I
16840 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29 3b 0a  N) || nIn==0 );.
16850 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16860 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 3b  ( eOp & WO_IN );
16870 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
16880 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72  Out += pTerm->tr
16890 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20  uthProb;.       
168a0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e   pNew->nOut -= n
168b0 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  In;.      }else{
168c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
168d0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
168e0 54 41 54 34 0a 20 20 20 20 20 20 20 20 74 52 6f  TAT4.        tRo
168f0 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  wcnt nOut = 0;. 
16900 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e 4d 75         if( nInMu
16910 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  l==0 .         &
16920 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c  & pProbe->nSampl
16930 65 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  e .         && p
16940 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
16950 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d 70 6c  <=pProbe->nSampl
16960 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20 26 26  eCol.         &&
16970 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 3d   ((eOp & WO_IN)=
16980 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72  =0 || !ExprHasPr
16990 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45  operty(pTerm->pE
169a0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
169b0 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  t)).        ){. 
169c0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
169d0 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
169e0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
169f0 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f 45 51  f( (eOp & (WO_EQ
16a00 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53  |WO_ISNULL|WO_IS
16a10 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
16a20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
16a30 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a 20 20  Op & WO_EQ );.  
16a40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
16a50 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 20  se( eOp & WO_IS 
16a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
16a70 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57  estcase( eOp & W
16a80 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
16a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
16aa0 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70  reEqualScanEst(p
16ab0 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
16ac0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
16ad0 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &nOut);.        
16ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16af0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 49       rc = whereI
16b00 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  nScanEst(pParse,
16b10 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72   pBuilder, pExpr
16b20 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f 75 74  ->x.pList, &nOut
16b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
16b40 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
16b50 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
16b60 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
16b70 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  K;.          if(
16b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16b90 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20 20 20   break;         
16ba0 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f 66 20   /* Jump out of 
16bb0 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70 20 2a  the pTerm loop *
16bc0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
16bd0 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  nOut ){.        
16be0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
16bf0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 6e   sqlite3LogEst(n
16c00 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Out);.          
16c10 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f 75 74    if( pNew->nOut
16c20 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20 70 4e  >saved_nOut ) pN
16c30 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
16c40 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  _nOut;.         
16c50 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
16c60 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20 20 20   nIn;.          
16c70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
16c80 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20      if( nOut==0 
16c90 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ).#endif.       
16ca0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65   {.          pNe
16cb0 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50 72 6f  w->nOut += (pPro
16cc0 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
16cd0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
16ce0 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 2d 31  iRowLogEst[nEq-1
16cf0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
16d00 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
16d10 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
16d20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20 74   /* TUNING: If t
16d30 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b 65 6c  here is no likel
16d40 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c 20 61  ihood() value, a
16d50 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a 20 20  ssume that a .  
16d60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22 63 6f            ** "co
16d70 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70 72 65  l IS NULL" expre
16d80 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 77  ssion matches tw
16d90 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f 77 73  ice as many rows
16da0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
16db0 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a 2f 0a   as (col=?). */.
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
16dd0 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a 20 20  ->nOut += 10;.  
16de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16df0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16e00 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 43  }..    /* Set rC
16e10 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20 63 6f  ostIdx to the co
16e20 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 73  st of visiting s
16e30 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69 6e 20  elected rows in 
16e40 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20 20 2a  index. Add.    *
16e50 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e 72 52  * it to pNew->rR
16e60 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63 75 72  un, which is cur
16e70 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74 68  rently set to th
16e80 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 69 6e  e cost of the in
16e90 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65 6b 20  dex.    ** seek 
16ea0 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66 20 74  only. Then, if t
16eb0 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76  his is a non-cov
16ec0 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61 64 64  ering index, add
16ed0 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20   the cost of.   
16ee0 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74 68 65   ** visiting the
16ef0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
16f00 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  n table.  */.   
16f10 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e 65 77   rCostIdx = pNew
16f20 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28 31 35  ->nOut + 1 + (15
16f30 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
16f40 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d 3e 73  w)/pSrc->pTab->s
16f50 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70 4e 65  zTabRow;.    pNe
16f60 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
16f70 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
16f80 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29 3b 0a  ize, rCostIdx);.
16f90 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77      if( (pNew->w
16fa0 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
16fb0 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49  IDX_ONLY|WHERE_I
16fc0 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  PK))==0 ){.     
16fd0 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71   pNew->rRun = sq
16fe0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
16ff0 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65 77 2d  New->rRun, pNew-
17000 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20 20 20  >nOut + 16);.   
17010 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f 73 74   }.    ApplyCost
17020 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d  Multiplier(pNew-
17030 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d 3e 70  >rRun, pProbe->p
17040 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c 74 29  Table->costMult)
17050 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61 64 6a  ;..    nOutUnadj
17060 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e 6e 4f  usted = pNew->nO
17070 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52  ut;.    pNew->rR
17080 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e  un += nInMul + n
17090 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  In;.    pNew->nO
170a0 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b 20 6e  ut += nInMul + n
170b0 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f  In;.    whereLoo
170c0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 42  pOutputAdjust(pB
170d0 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70 4e 65  uilder->pWC, pNe
170e0 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 72  w, rSize);.    r
170f0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
17100 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
17110 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e  ew);..    if( pN
17120 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
17130 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
17140 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
17150 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75  nOut = saved_nOu
17160 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
17170 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
17180 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b   nOutUnadjusted;
17190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
171a0 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26  (pNew->wsFlags &
171b0 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
171c0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 4e 65  )==0.     && pNe
171d0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3c 70  w->u.btree.nEq<p
171e0 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20  Probe->nColumn. 
171f0 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72     ){.      wher
17200 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
17210 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
17220 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e 4d 75  c, pProbe, nInMu
17230 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  l+nIn);.    }.  
17240 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73    pNew->nOut = s
17250 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66 64 65  aved_nOut;.#ifde
17260 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17270 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20  STAT3_OR_STAT4. 
17280 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
17290 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
172a0 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  id;.#endif.  }. 
172b0 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
172c0 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a 20 20  saved_prereq;.  
172d0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
172e0 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
172f0 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
17300 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42 74 6d  Btm = saved_nBtm
17310 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  ;.  pNew->u.btre
17320 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64 5f 6e  e.nTop = saved_n
17330 54 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 6b  Top;.  pNew->nSk
17340 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70  ip = saved_nSkip
17350 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  ;.  pNew->wsFlag
17360 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
17370 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  s;.  pNew->nOut 
17380 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
17390 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73  pNew->nLTerm = s
173a0 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a 20 20  aved_nLTerm;..  
173b0 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73 69 6e  /* Consider usin
173c0 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20 69 66  g a skip-scan if
173d0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48   there are no WH
173e0 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
173f0 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76 61 69  raints.  ** avai
17400 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6c 65  lable for the le
17410 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 6f 66  ft-most terms of
17420 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e 64 20   the index, and 
17430 69 66 20 74 68 65 20 61 76 65 72 61 67 65 0a 20  if the average. 
17440 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65   ** number of re
17450 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c 65 66  peats in the lef
17460 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69 73 20  t-most terms is 
17470 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a 20 20  at least 18. .  
17480 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61 67 69  **.  ** The magi
17490 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73 20 73  c number 18 is s
174a0 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65 20 62  elected on the b
174b0 61 73 69 73 20 74 68 61 74 20 73 63 61 6e 6e 69  asis that scanni
174c0 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a 2a 20  ng 17 rows.  ** 
174d0 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
174e0 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20 61 6e   quicker than an
174f0 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65 76 65   index seek (eve
17500 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68 65 20  n though if the 
17510 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e 74 61  index.  ** conta
17520 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  ins fewer than 2
17530 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73 73 75  ^17 rows we assu
17540 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20  me otherwise in 
17550 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66 0a 20  other parts of. 
17560 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e 20 41   ** the code). A
17570 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74 20 69  nd, even if it i
17580 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75 6c 64  s not, it should
17590 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75 63 68   not be too much
175a0 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a 20 4f   slower. .  ** O
175b0 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
175c0 2c 20 74 68 65 20 65 78 74 72 61 20 73 65 65 6b  , the extra seek
175d0 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70 20 62  s could end up b
175e0 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61 6e 74  eing significant
175f0 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65 78 70  ly.  ** more exp
17600 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20 61 73  ensive.  */.  as
17610 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69 74 65  sert( 42==sqlite
17620 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b 0a 20  3LogEst(18) );. 
17630 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71 3d 3d   if( saved_nEq==
17640 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20 20 26  saved_nSkip.   &
17650 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c 70 50  & saved_nEq+1<pP
17660 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a 20 20  robe->nKeyCol.  
17670 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f 53 6b   && pProbe->noSk
17680 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26 26 20  ipScan==0.   && 
17690 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
176a0 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
176b0 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  >=42  /* TUNING:
176c0 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73 6b 69   Minimum for ski
176d0 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26 26 20  p-scan */.   && 
176e0 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 52  (rc = whereLoopR
176f0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
17700 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 29  pNew->nLTerm+1))
17710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b  ==SQLITE_OK.  ){
17720 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49 74 65  .    LogEst nIte
17730 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  r;.    pNew->u.b
17740 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20 20 20  tree.nEq++;.    
17750 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b 0a 20  pNew->nSkip++;. 
17760 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
17770 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
17780 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77  = 0;.    pNew->w
17790 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
177a0 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20 6e 49  SKIPSCAN;.    nI
177b0 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ter = pProbe->ai
177c0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
177d0 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d 3e 61  nEq] - pProbe->a
177e0 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64  iRowLogEst[saved
177f0 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70 4e 65  _nEq+1];.    pNe
17800 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74 65 72  w->nOut -= nIter
17810 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a  ;.    /* TUNING:
17820 20 20 42 65 63 61 75 73 65 20 75 6e 63 65 72 74    Because uncert
17830 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65 20 65  ainties in the e
17840 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73 6b 69  stimates for ski
17850 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73 2c 0a  p-scan queries,.
17860 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31 2e 33      ** add a 1.3
17870 37 35 20 66 75 64 67 65 20 66 61 63 74 6f 72 20  75 fudge factor 
17880 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73 63 61  to make skip-sca
17890 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73 73 20  n slightly less 
178a0 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 6e  likely. */.    n
178b0 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20 20 77  Iter += 5;.    w
178c0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
178d0 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20  Index(pBuilder, 
178e0 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49  pSrc, pProbe, nI
178f0 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b 0a 20  ter + nInMul);. 
17900 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
17910 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
17920 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
17930 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
17940 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d     pNew->nSkip =
17950 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20   saved_nSkip;.  
17960 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
17970 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  = saved_wsFlags;
17980 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45 54 52 41  .  }..  WHERETRA
17990 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e 44 20  CE(0x800, ("END 
179a0 61 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c  addBtreeIdx(%s),
179b0 20 6e 45 71 3d 25 64 2c 20 72 63 3d 25 64 5c 6e   nEq=%d, rc=%d\n
179c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
179d0 20 20 20 20 20 20 20 20 20 70 50 72 6f 62 65 2d           pProbe-
179e0 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f 6e 45  >zName, saved_nE
179f0 71 2c 20 72 63 29 29 3b 0a 20 20 72 65 74 75 72  q, rc));.  retur
17a00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17a10 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 69 74  eturn True if it
17a20 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
17a30 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74 20 62  t pIndex might b
17a40 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a 20 69  e useful in.** i
17a50 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  mplementing the 
17a60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17a70 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a  in pBuilder..**.
17a80 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73 65 20  ** Return False 
17a90 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f 65 73  if pBuilder does
17aa0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 20   not contain an 
17ab0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
17ac0 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  or.** if there i
17ad0 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70 49 6e  s no way for pIn
17ae0 64 65 78 20 74 6f 20 62 65 20 75 73 65 66 75 6c  dex to be useful
17af0 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   in implementing
17b00 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52 20 42   that.** ORDER B
17b10 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  Y clause..*/.sta
17b20 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d 69 67  tic int indexMig
17b30 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42  htHelpWithOrderB
17b40 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  y(.  WhereLoopBu
17b50 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c  ilder *pBuilder,
17b60 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
17b70 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 0a  ,.  int iCursor.
17b80 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
17b90 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  OB;.  ExprList *
17ba0 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e 74 20  aColExpr;.  int 
17bb0 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28 20 70  ii, jj;..  if( p
17bc0 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65 72 65  Index->bUnordere
17bd0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
17be0 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75 69 6c  if( (pOB = pBuil
17bf0 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 4f 72  der->pWInfo->pOr
17c00 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65 74 75  derBy)==0 ) retu
17c10 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69 3d 30  rn 0;.  for(ii=0
17c20 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70 72 3b  ; ii<pOB->nExpr;
17c30 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   ii++){.    Expr
17c40 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65   *pExpr = sqlite
17c50 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
17c60 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45 78 70  (pOB->a[ii].pExp
17c70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  r);.    if( pExp
17c80 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
17c90 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
17ca0 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  e==iCursor ){.  
17cb0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
17cc0 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72  Column<0 ) retur
17cd0 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  n 1;.      for(j
17ce0 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78 2d 3e  j=0; jj<pIndex->
17cf0 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29 7b 0a  nKeyCol; jj++){.
17d00 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
17d10 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 6e 64  r->iColumn==pInd
17d20 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 6a 5d  ex->aiColumn[jj]
17d30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
17d40 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
17d50 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d 20 70  f( (aColExpr = p
17d60 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29  Index->aColExpr)
17d70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  !=0 ){.      for
17d80 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
17d90 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
17da0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
17db0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
17dc0 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20 63 6f  j]!=XN_EXPR ) co
17dd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
17de0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
17df0 6f 6d 70 61 72 65 53 6b 69 70 28 70 45 78 70 72  ompareSkip(pExpr
17e00 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 6a 5d  ,aColExpr->a[jj]
17e10 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72 29 3d  .pExpr,iCursor)=
17e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17e30 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
17e40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17e50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
17e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17e70 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68 65 72  n a bitmask wher
17e80 65 20 31 73 20 69 6e 64 69 63 61 74 65 20 74 68  e 1s indicate th
17e90 61 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  at the correspon
17ea0 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a  ding column of.*
17eb0 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 75  * the table is u
17ec0 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2e  sed by an index.
17ed0 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
17ee0 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20   63 columns are 
17ef0 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73  considered..*/.s
17f00 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 63 6f  tatic Bitmask co
17f10 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49 6e 64  lumnsInIndex(Ind
17f20 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42 69 74  ex *pIdx){.  Bit
17f30 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 69 6e  mask m = 0;.  in
17f40 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70 49 64  t j;.  for(j=pId
17f50 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e  x->nColumn-1; j>
17f60 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 69 6e  =0; j--){.    in
17f70 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t x = pIdx->aiCo
17f80 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  lumn[j];.    if(
17f90 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74   x>=0 ){.      t
17fa0 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d  estcase( x==BMS-
17fb0 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  1 );.      testc
17fc0 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20 29 3b  ase( x==BMS-2 );
17fd0 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53  .      if( x<BMS
17fe0 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b 42 49  -1 ) m |= MASKBI
17ff0 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T(x);.    }.  }.
18000 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
18010 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
18020 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65  f a partial inde
18030 78 20 77 69 74 68 20 70 50 61 72 74 49 6e 64 65  x with pPartInde
18040 78 57 68 65 72 65 20 63 61 6e 20 62 65 20 75 73  xWhere can be us
18050 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ed.** in the cur
18060 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52 65 74  rent query.  Ret
18070 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 63  urn true if it c
18080 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73 65 20  an be and false 
18090 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
180a0 63 20 69 6e 74 20 77 68 65 72 65 55 73 61 62 6c  c int whereUsabl
180b0 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 6e  ePartialIndex(in
180c0 74 20 69 54 61 62 2c 20 57 68 65 72 65 43 6c 61  t iTab, WhereCla
180d0 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a  use *pWC, Expr *
180e0 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 69  pWhere){.  int i
180f0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
18100 54 65 72 6d 3b 0a 20 20 50 61 72 73 65 20 2a 70  Term;.  Parse *p
18110 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 57 49  Parse = pWC->pWI
18120 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77  nfo->pParse;.  w
18130 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70  hile( pWhere->op
18140 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
18150 69 66 28 20 21 77 68 65 72 65 55 73 61 62 6c 65  if( !whereUsable
18160 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69 54 61  PartialIndex(iTa
18170 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e 70 4c  b,pWC,pWhere->pL
18180 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
18190 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57  .    pWhere = pW
181a0 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a 20 20  here->pRight;.  
181b0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
181c0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
181d0 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 20 29 20  TE_EnableQPSG ) 
181e0 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20 66 6f  pParse = 0;.  fo
181f0 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  r(i=0, pTerm=pWC
18200 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
18210 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
18220 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
18230 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
18240 3b 0a 20 20 20 20 69 66 28 20 28 21 45 78 70 72  ;.    if( (!Expr
18250 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
18260 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
18270 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  || pExpr->iRight
18280 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61 62 29  JoinTable==iTab)
18290 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
182a0 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
182b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
182c0 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a 20 20  Where, iTab) .  
182d0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
182e0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
182f0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18300 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72  .** Add all Wher
18310 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f  eLoop objects fo
18320 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  r a single table
18330 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77 68 65   of the join whe
18340 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  re the table.** 
18350 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
18360 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
18370 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
18380 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
18390 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d 74 72   to be.** a b-tr
183a0 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  ee table, not a 
183b0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
183c0 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73 20 28  *.** The costs (
183d0 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e 29 20  WhereLoop.rRun) 
183e0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6c 6f  of the b-tree lo
183f0 6f 70 73 20 61 64 64 65 64 20 62 79 20 74 68 69  ops added by thi
18400 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  s function.** ar
18410 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  e calculated as 
18420 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 46  follows:.**.** F
18430 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e 2c 20  or a full scan, 
18440 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74 61 62  assuming the tab
18450 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20 63 6f  le (or index) co
18460 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f 77 73  ntains nRow rows
18470 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
18480 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20 20 20   = nRow * 3.0   
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73   // full-table s
184b0 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20  can.**     cost 
184c0 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20 20 20  = nRow * K      
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76 65 72  // scan of cover
184f0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
18500 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 28   cost = nRow * (
18510 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20 20 20  K+3.0)          
18520 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66        // scan of
18530 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
18540 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  dex.**.** where 
18550 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62 65 74  K is a value bet
18560 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30  ween 1.1 and 3.0
18570 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
18580 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a 20 65  e relative .** e
18590 73 74 69 6d 61 74 65 64 20 61 76 65 72 61 67 65  stimated average
185a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
185b0 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 65 63  ex and table rec
185c0 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ords..**.** For 
185d0 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c 20 77  an index scan, w
185e0 68 65 72 65 20 6e 56 69 73 69 74 20 69 73 20 74  here nVisit is t
185f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64  he number of ind
18600 65 78 20 72 6f 77 73 20 76 69 73 69 74 65 64 0a  ex rows visited.
18610 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e 2c 20  ** by the scan, 
18620 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74 68 65  and nSeek is the
18630 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65 6b 20   number of seek 
18640 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71 75 69  operations requi
18650 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 69  red on .** the i
18660 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a 2a 0a  ndex b-tree:.**.
18670 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53  **     cost = nS
18680 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29  eek * (log(nRow)
18690 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29 20 20   + K * nVisit)  
186a0 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76 65 72          // cover
186b0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20 20 20  ing index.**    
186c0 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20   cost = nSeek * 
186d0 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28 4b 2b  (log(nRow) + (K+
186e0 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29 20 20  3.0) * nVisit)  
186f0 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e    // non-coverin
18700 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 4e 6f  g index.**.** No
18710 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20 69 73  rmally, nSeek is
18720 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75 65 73   1. nSeek values
18730 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 20   greater than 1 
18740 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20 74 68  come about if th
18750 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  e .** WHERE clau
18760 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78 20 49  se includes "x I
18770 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d 73 20  N (....)" terms 
18780 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
18790 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65 6e 20   "x=?". Or when 
187a0 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22 78 20  .** implicit "x 
187b0 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
187c0 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20 61 72  M tbl)" terms ar
187d0 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b 69 70  e added for skip
187e0 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  -scans..**.** Th
187f0 65 20 65 73 74 69 6d 61 74 65 64 20 76 61 6c 75  e estimated valu
18800 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73 69 74  es (nRow, nVisit
18810 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e 20 63  , nSeek) often c
18820 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65 20 61  ontain a large a
18830 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e 63 65  mount.** of unce
18840 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20 74 68  rtainty.  For th
18850 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f 72 69  is reason, scori
18860 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ng is designed t
18870 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74 68 61  o pick plans tha
18880 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c 65 61  t.** "do the lea
18890 73 74 20 68 61 72 6d 22 20 69 66 20 74 68 65 20  st harm" if the 
188a0 65 73 74 69 6d 61 74 65 73 20 61 72 65 20 69 6e  estimates are in
188b0 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72 20 65  accurate.  For e
188c0 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c 6f 67  xample, a.** log
188d0 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20 69 73  (nRow) factor is
188e0 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 61 20   omitted from a 
188f0 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64  non-covering ind
18900 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64 65 72  ex scan in order
18910 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68 65 20   to.** bias the 
18920 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76 6f 72  scoring in favor
18930 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
18940 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20 77 6f  ex, since the wo
18950 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65 72 66  rst-case.** perf
18960 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69 6e 67  ormance of using
18970 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66 61 72   an index is far
18980 20 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65   better than the
18990 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65 72 66   worst-case perf
189a0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20 61 20  ormance.** of a 
189b0 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 2e  full table scan.
189c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
189d0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
189e0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
189f0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
18a00 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
18a10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
18a20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65 71   Bitmask mPrereq
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a40 45 78 74 72 61 20 70 72 65 72 65 71 75 65 73 69  Extra prerequesi
18a50 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20 74 68  tes for using th
18a60 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
18a70 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
18a80 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
18a90 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63  WHERE analysis c
18aa0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e 64 65  ontext */.  Inde
18ab0 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
18ac0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
18ad0 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
18ae0 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
18af0 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20 20 20   sPk;           
18b00 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61 6b 65         /* A fake
18b10 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f   index object fo
18b20 72 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  r the primary ke
18b30 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 69  y */.  LogEst ai
18b40 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20 20 20  RowEstPk[2];    
18b50 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f 77 4c     /* The aiRowL
18b60 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f  ogEst[] value fo
18b70 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20  r the sPk index 
18b80 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c 75 6d  */.  i16 aiColum
18b90 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  nPk = -1;       
18ba0 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b   /* The aColumn[
18bb0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
18bc0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 53  sPk index */.  S
18bd0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
18be0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
18bf0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
18c00 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
18c10 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 2f  t_item *pSrc;  /
18c20 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
18c30 65 20 62 74 72 65 65 20 74 65 72 6d 20 74 6f 20  e btree term to 
18c40 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  add */.  WhereLo
18c50 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  op *pNew;       
18c60 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
18c70 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
18c80 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
18c90 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
18ca0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18cb0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74  e */.  int iSort
18cc0 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Idx = 1;        
18cd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62     /* Index numb
18ce0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b 20 20  er */.  int b;  
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65 61 6e      /* A boolean
18d10 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f 67 45   value */.  LogE
18d20 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20  st rSize;       
18d30 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65          /* numbe
18d40 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
18d50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f 67 45   table */.  LogE
18d60 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20 20 20  st rLogSize;    
18d70 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67 61 72          /* Logar
18d80 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62  ithm of the numb
18d90 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
18da0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65  e table */.  Whe
18db0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
18dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18dd0 70 61 72 73 65 64 20 57 48 45 52 45 20 63 6c 61  parsed WHERE cla
18de0 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  use */.  Table *
18df0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
18e00 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
18e10 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
18e20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c   .  pNew = pBuil
18e30 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 57 49  der->pNew;.  pWI
18e40 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
18e50 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62 4c 69  pWInfo;.  pTabLi
18e60 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
18e70 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20 3d 20  bList;.  pSrc = 
18e80 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
18e90 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54 61 62  ew->iTab;.  pTab
18ea0 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20   = pSrc->pTab;. 
18eb0 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
18ec0 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74 28 20  >pWC;.  assert( 
18ed0 21 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d  !IsVirtual(pSrc-
18ee0 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69 66 28  >pTab) );..  if(
18ef0 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20   pSrc->pIBIndex 
18f00 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49 4e 44  ){.    /* An IND
18f10 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 73  EXED BY clause s
18f20 70 65 63 69 66 69 65 73 20 61 20 70 61 72 74 69  pecifies a parti
18f30 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f 20 75  cular index to u
18f40 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f 62 65  se */.    pProbe
18f50 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65   = pSrc->pIBInde
18f60 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  x;.  }else if( !
18f70 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
18f80 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 70  {.    pProbe = p
18f90 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 7d  Tab->pIndex;.  }
18fa0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
18fb0 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58 45 44  re is no INDEXED
18fc0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43 72 65   BY clause.  Cre
18fd0 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64 65 78  ate a fake Index
18fe0 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63 61 6c   object in local
18ff0 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  .    ** variable
19000 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73 65 6e   sPk to represen
19010 74 20 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d  t the rowid prim
19020 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e 20 20  ary key index.  
19030 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  Make this.    **
19040 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68 65 20   fake index the 
19050 66 69 72 73 74 20 69 6e 20 61 20 63 68 61 69 6e  first in a chain
19060 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   of Index object
19070 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20 74 68  s with all of th
19080 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  e real.    ** in
19090 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f 77 20  dices to follow 
190a0 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 46  */.    Index *pF
190b0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
190c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
190d0 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65 73 20  of real indices 
190e0 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  on the table */.
190f0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50 6b 2c      memset(&sPk,
19100 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64 65 78   0, sizeof(Index
19110 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b 65 79  ));.    sPk.nKey
19120 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  Col = 1;.    sPk
19130 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20  .nColumn = 1;.  
19140 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
19150 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
19160 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67 45 73    sPk.aiRowLogEs
19170 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a  t = aiRowEstPk;.
19180 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20      sPk.onError 
19190 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20  = OE_Replace;.  
191a0 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70    sPk.pTable = p
191b0 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73 7a 49  Tab;.    sPk.szI
191c0 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e 73 7a  dxRow = pTab->sz
191d0 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69 52 6f  TabRow;.    aiRo
191e0 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54 61 62  wEstPk[0] = pTab
191f0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20  ->nRowLogEst;.  
19200 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31 5d 20    aiRowEstPk[1] 
19210 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73 74 20  = 0;.    pFirst 
19220 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49  = pSrc->pTab->pI
19230 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53  ndex;.    if( pS
19240 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  rc->fg.notIndexe
19250 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
19260 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
19270 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
19280 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
19290 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
192a0 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
192b0 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
192c0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
192d0 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
192e0 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
192f0 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
19300 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
19310 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70 54 61   }.  rSize = pTa
19320 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  b->nRowLogEst;. 
19330 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c   rLogSize = estL
19340 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69 66 6e  og(rSize);..#ifn
19350 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19360 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
19370 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
19380 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66 28 20  ndexes */.  if( 
19390 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  !pBuilder->pOrSe
193a0 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 61  t      /* Not pa
193b0 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70 74 69  rt of an OR opti
193c0 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 26  mization */.   &
193d0 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
193e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
193f0 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20  _SUBCLAUSE)==0. 
19400 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 70 50    && (pWInfo->pP
19410 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  arse->db->flags 
19420 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  & SQLITE_AutoInd
19430 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70 53 72  ex)!=0.   && pSr
19440 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30 20 20  c->pIBIndex==0  
19450 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 49 4e      /* Has no IN
19460 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
19470 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
19480 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 20 20  fg.notIndexed   
19490 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20 49 4e  /* Has no NOT IN
194a0 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a 2f 0a  DEXED clause */.
194b0 20 20 20 26 26 20 48 61 73 52 6f 77 69 64 28 70     && HasRowid(p
194c0 54 61 62 29 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab)         /* 
194d0 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49  Not WITHOUT ROWI
194e0 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d 45 3a  D table. (FIXME:
194f0 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a 20 20   Why not?) */.  
19500 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73   && !pSrc->fg.is
19510 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20 4e 6f  Correlated /* No
19520 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  t a correlated s
19530 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 26 26  ubquery */.   &&
19540 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52 65 63   !pSrc->fg.isRec
19550 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74 20 61  ursive  /* Not a
19560 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f   recursive commo
19570 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
19580 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  on. */.  ){.    
19590 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75 74 6f  /* Generate auto
195a0 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f 6f 70  -index WhereLoop
195b0 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54 65  s */.    WhereTe
195c0 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 57  rm *pTerm;.    W
195d0 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45 6e 64  hereTerm *pWCEnd
195e0 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43 2d   = pWC->a + pWC-
195f0 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f 72 28  >nTerm;.    for(
19600 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 72 63  pTerm=pWC->a; rc
19610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
19620 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
19630 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  rm++){.      if(
19640 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
19650 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
19660 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
19670 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 43  .      if( termC
19680 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
19690 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29 7b 0a  rm, pSrc, 0) ){.
196a0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
196b0 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
196c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b         pNew->nSk
196d0 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ip = 0;.        
196e0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
196f0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
19700 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
19710 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19720 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54  ->aLTerm[0] = pT
19730 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  erm;.        /* 
19740 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69 6d 65  TUNING: One-time
19750 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70 75 74   cost for comput
19760 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
19770 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 20  c index is.     
19780 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 64 20     ** estimated 
19790 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32 28 4e  to be X*N*log2(N
197a0 29 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  ) where N is the
197b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
197c0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  in.        ** th
197d0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
197e0 64 65 78 65 64 20 61 6e 64 20 77 68 65 72 65 20  dexed and where 
197f0 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74 3d 32  X is 7 (LogEst=2
19800 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  8) for normal.  
19810 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20        ** tables 
19820 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45 73 74  or 1.375 (LogEst
19830 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20 61 6e  =4) for views an
19840 64 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  d subqueries.  T
19850 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  he value.       
19860 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d 61 6c   ** of X is smal
19870 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20 61 6e  ler for views an
19880 64 20 73 75 62 71 75 65 72 69 65 73 20 73 6f 20  d subqueries so 
19890 74 68 61 74 20 74 68 65 20 71 75 65 72 79 20 70  that the query p
198a0 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20 20 2a  lanner.        *
198b0 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 61  * will be more a
198c0 67 67 72 65 73 73 69 76 65 20 61 62 6f 75 74 20  ggressive about 
198d0 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74 6f 6d  generating autom
198e0 61 74 69 63 20 69 6e 64 65 78 65 73 20 66 6f 72  atic indexes for
198f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 73  .        ** thos
19900 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e 63 65  e objects, since
19910 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 70   there is no opp
19920 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64 64 20  ortunity to add 
19930 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20 20 2a  schema.        *
19940 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73 75 62  * indexes on sub
19950 71 75 65 72 69 65 73 20 61 6e 64 20 76 69 65 77  queries and view
19960 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
19970 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72 4c 6f  ew->rSetup = rLo
19980 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20 2b 20  gSize + rSize + 
19990 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  4;.        if( p
199a0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
199b0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
199c0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
199d0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
199e0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
199f0 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20 20 7d  += 24;.        }
19a00 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79 43 6f  .        ApplyCo
19a10 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
19a20 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61 62 2d  w->rSetup, pTab-
19a30 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20  >costMult);.    
19a40 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 72 53      if( pNew->rS
19a50 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d 3e 72  etup<0 ) pNew->r
19a60 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 20  Setup = 0;.     
19a70 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 61     /* TUNING: Ea
19a80 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ch index lookup 
19a90 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73 20 69  yields 20 rows i
19aa0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  n the table.  Th
19ab0 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  is.        ** is
19ac0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 75   more than the u
19ad0 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20 31 30  sual guess of 10
19ae0 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77 65 20   rows, since we 
19af0 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20 20 20  have no way.    
19b00 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77 69 6e      ** of knowin
19b10 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76 65 20  g how selective 
19b20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 75  the index will u
19b30 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20 20 49  ltimately be.  I
19b40 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  t would.        
19b50 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65 61 73  ** not be unreas
19b60 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 74  onable to make t
19b70 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68 20 6c  his value much l
19b80 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
19b90 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 34    pNew->nOut = 4
19ba0 33 3b 20 20 61 73 73 65 72 74 28 20 34 33 3d 3d  3;  assert( 43==
19bb0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 30  sqlite3LogEst(20
19bc0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) );.        pNe
19bd0 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65  w->rRun = sqlite
19be0 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f 67 53  3LogEstAdd(rLogS
19bf0 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74 29 3b  ize,pNew->nOut);
19c00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  .        pNew->w
19c10 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 41  sFlags = WHERE_A
19c20 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20 20 20  UTO_INDEX;.     
19c30 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20     pNew->prereq 
19c40 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54 65 72  = mPrereq | pTer
19c50 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a  m->prereqRight;.
19c60 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
19c70 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
19c80 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
19c90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19ca0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19cb0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
19cc0 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a 20 4c  INDEX */..  /* L
19cd0 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64  oop over all ind
19ce0 69 63 65 73 2e 20 49 66 20 74 68 65 72 65 20 77  ices. If there w
19cf0 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
19d00 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e   clause, then on
19d10 6c 79 20 0a 20 20 2a 2a 20 63 6f 6e 73 69 64 65  ly .  ** conside
19d20 72 20 69 6e 64 65 78 20 70 50 72 6f 62 65 2e 20  r index pProbe. 
19d30 20 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d   */.  for(; rc==
19d40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72  SQLITE_OK && pPr
19d50 6f 62 65 3b 20 0a 20 20 20 20 20 20 70 50 72 6f  obe; .      pPro
19d60 62 65 3d 28 70 53 72 63 2d 3e 70 49 42 49 6e 64  be=(pSrc->pIBInd
19d70 65 78 20 3f 20 30 20 3a 20 70 50 72 6f 62 65 2d  ex ? 0 : pProbe-
19d80 3e 70 4e 65 78 74 29 2c 20 69 53 6f 72 74 49 64  >pNext), iSortId
19d90 78 2b 2b 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  x++.  ){.    if(
19da0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
19db0 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26  xWhere!=0.     &
19dc0 26 20 21 77 68 65 72 65 55 73 61 62 6c 65 50 61  & !whereUsablePa
19dd0 72 74 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d  rtialIndex(pSrc-
19de0 3e 69 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70  >iCursor, pWC, p
19df0 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
19e00 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74  here) ){.      t
19e10 65 73 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69  estcase( pNew->i
19e20 54 61 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  Tab!=pSrc->iCurs
19e30 6f 72 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69  or );  /* See ti
19e40 63 6b 65 74 20 5b 39 38 64 39 37 33 62 38 66 35  cket [98d973b8f5
19e50 5d 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  ] */.      conti
19e60 6e 75 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c  nue;  /* Partial
19e70 20 69 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72   index inappropr
19e80 69 61 74 65 20 66 6f 72 20 74 68 69 73 20 71 75  iate for this qu
19e90 65 72 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ery */.    }.   
19ea0 20 72 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d   rSize = pProbe-
19eb0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b  >aiRowLogEst[0];
19ec0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
19ed0 65 65 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20  ee.nEq = 0;.    
19ee0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
19ef0 74 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  tm = 0;.    pNew
19f00 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
19f10 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53   0;.    pNew->nS
19f20 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  kip = 0;.    pNe
19f30 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20  w->nLTerm = 0;. 
19f40 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
19f50 78 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  x = 0;.    pNew-
19f60 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
19f70 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
19f80 6d 50 72 65 72 65 71 3b 0a 20 20 20 20 70 4e 65  mPrereq;.    pNe
19f90 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
19fa0 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72  .    pNew->u.btr
19fb0 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f  ee.pIndex = pPro
19fc0 62 65 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65  be;.    b = inde
19fd0 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72  xMightHelpWithOr
19fe0 64 65 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20  derBy(pBuilder, 
19ff0 70 50 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43  pProbe, pSrc->iC
1a000 75 72 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54  ursor);.    /* T
1a010 68 65 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  he ONEPASS_DESIR
1a020 45 44 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f  ED flags never o
1a030 63 63 75 72 73 20 74 6f 67 65 74 68 65 72 20 77  ccurs together w
1a040 69 74 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  ith ORDER BY */.
1a050 20 20 20 20 61 73 73 65 72 74 28 20 28 70 57 49      assert( (pWI
1a060 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
1a070 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
1a080 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62  DESIRED)==0 || b
1a090 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
1a0a0 50 72 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29  Probe->tnum<=0 )
1a0b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67  {.      /* Integ
1a0c0 65 72 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  er primary key i
1a0d0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e  ndex */.      pN
1a0e0 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1a0f0 45 52 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20  ERE_IPK;..      
1a100 2f 2a 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63  /* Full table sc
1a110 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  an */.      pNew
1a120 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f  ->iSortIdx = b ?
1a130 20 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20   iSortIdx : 0;. 
1a140 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
1a150 43 6f 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62  Cost of full tab
1a160 6c 65 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e  le scan is (N*3.
1a170 30 29 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  0). */.      pNe
1a180 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20  w->rRun = rSize 
1a190 2b 20 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c  + 16;.      Appl
1a1a0 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
1a1b0 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
1a1c0 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
1a1d0 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70     whereLoopOutp
1a1e0 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e  utAdjust(pWC, pN
1a1f0 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20  ew, rSize);.    
1a200 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1a210 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c  Insert(pBuilder,
1a220 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e   pNew);.      pN
1a230 65 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65  ew->nOut = rSize
1a240 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
1a250 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
1a260 65 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  e{.      Bitmask
1a270 20 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   m;.      if( pP
1a280 72 6f 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67  robe->isCovering
1a290 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
1a2a0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
1a2b0 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45  E_IDX_ONLY | WHE
1a2c0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
1a2d0 20 20 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20      m = 0;.     
1a2e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a2f0 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65  m = pSrc->colUse
1a300 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
1a310 64 65 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20  dex(pProbe);.   
1a320 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
1a330 67 73 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57  gs = (m==0) ? (W
1a340 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48  HERE_IDX_ONLY|WH
1a350 45 52 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57  ERE_INDEXED) : W
1a360 48 45 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20  HERE_INDEXED;.  
1a370 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1a380 46 75 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e  Full scan via in
1a390 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dex */.      if(
1a3a0 20 62 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61   b.       || !Ha
1a3b0 73 52 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20  sRowid(pTab).   
1a3c0 20 20 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70      || pProbe->p
1a3d0 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a  PartIdxWhere!=0.
1a3e0 20 20 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30         || ( m==0
1a3f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 72  .         && pPr
1a400 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  obe->bUnordered=
1a410 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
1a420 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77  pProbe->szIdxRow
1a430 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29  <pTab->szTabRow)
1a440 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57  .         && (pW
1a450 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
1a460 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
1a470 5f 44 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20  _DESIRED)==0.   
1a480 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1a490 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
1a4a0 65 43 69 73 0a 20 20 20 20 20 20 20 20 20 26 26  eCis.         &&
1a4b0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
1a4c0 62 6c 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61  bled(pWInfo->pPa
1a4d0 72 73 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f  rse->db, SQLITE_
1a4e0 43 6f 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20  CoverIdxScan).  
1a4f0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
1a500 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
1a510 3e 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20  >iSortIdx = b ? 
1a520 69 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20  iSortIdx : 0;.. 
1a530 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1a540 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74  st of visiting t
1a550 68 65 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73  he index rows is
1a560 20 4e 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73   N*K, where K is
1a570 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77  .        ** betw
1a580 65 65 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c  een 1.1 and 3.0,
1a590 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
1a5a0 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73  e relative sizes
1a5b0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
1a5c0 2a 2a 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  ** index and tab
1a5d0 6c 65 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20  le rows. */.    
1a5e0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1a5f0 20 72 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35   rSize + 1 + (15
1a600 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f  *pProbe->szIdxRo
1a610 77 29 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  w)/pTab->szTabRo
1a620 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  w;.        if( m
1a630 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1a640 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1a650 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e   non-covering in
1a660 64 65 78 20 73 63 61 6e 2c 20 61 64 64 20 69 6e  dex scan, add in
1a670 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20   the cost of.   
1a680 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20         ** doing 
1a690 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20  table lookups.  
1a6a0 54 68 65 20 63 6f 73 74 20 77 69 6c 6c 20 62 65  The cost will be
1a6b0 20 33 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   3x the number o
1a6c0 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c  f.          ** l
1a6d0 6f 6f 6b 75 70 73 2e 20 20 54 61 6b 65 20 69 6e  ookups.  Take in
1a6e0 74 6f 20 61 63 63 6f 75 6e 74 20 57 48 45 52 45  to account WHERE
1a6f0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68   clause terms th
1a700 61 74 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  at can be.      
1a710 20 20 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64      ** satisfied
1a720 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20   using just the 
1a730 69 6e 64 65 78 2c 20 61 6e 64 20 74 68 61 74 20  index, and that 
1a740 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  do not require a
1a750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61  .          ** ta
1a760 62 6c 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20  ble lookup. */. 
1a770 20 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20           LogEst 
1a780 6e 4c 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20  nLookup = rSize 
1a790 2b 20 31 36 3b 20 20 2f 2a 20 42 61 73 65 20 63  + 16;  /* Base c
1a7a0 6f 73 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20  ost:  N*3 */.   
1a7b0 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
1a7c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 75           int iCu
1a7d0 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f  r = pSrc->iCurso
1a7e0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 57 68 65  r;.          Whe
1a7f0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 32 20 3d  reClause *pWC2 =
1a800 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20   &pWInfo->sWC;. 
1a810 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
1a820 30 3b 20 69 69 3c 70 57 43 32 2d 3e 6e 54 65 72  0; ii<pWC2->nTer
1a830 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  m; ii++){.      
1a840 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1a850 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 32 2d 3e  *pTerm = &pWC2->
1a860 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  a[ii];.         
1a870 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
1a880 78 70 72 43 6f 76 65 72 65 64 42 79 49 6e 64 65  xprCoveredByInde
1a890 78 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  x(pTerm->pExpr, 
1a8a0 69 43 75 72 2c 20 70 50 72 6f 62 65 29 20 29 7b  iCur, pProbe) ){
1a8b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
1a8c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a8d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1a8e0 2f 2a 20 70 54 65 72 6d 20 63 61 6e 20 62 65 20  /* pTerm can be 
1a8f0 65 76 61 6c 75 61 74 65 64 20 75 73 69 6e 67 20  evaluated using 
1a900 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2e 20  just the index. 
1a910 20 53 6f 20 72 65 64 75 63 65 0a 20 20 20 20 20   So reduce.     
1a920 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 78         ** the ex
1a930 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
1a940 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70 73 20 61   table lookups a
1a950 63 63 6f 72 64 69 6e 67 6c 79 20 2a 2f 0a 20 20  ccordingly */.  
1a960 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
1a970 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
1a980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a990 20 20 20 6e 4c 6f 6f 6b 75 70 20 2b 3d 20 70 54     nLookup += pT
1a9a0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a  erm->truthProb;.
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1a9c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1a9d0 20 6e 4c 6f 6f 6b 75 70 2d 2d 3b 0a 20 20 20 20   nLookup--;.    
1a9e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
1a9f0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1aa00 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29   (WO_EQ|WO_IS) )
1aa10 20 6e 4c 6f 6f 6b 75 70 20 2d 3d 20 31 39 3b 0a   nLookup -= 19;.
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1aa30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1aa40 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 70      .          p
1aa50 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
1aa60 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 4e 65  te3LogEstAdd(pNe
1aa70 77 2d 3e 72 52 75 6e 2c 20 6e 4c 6f 6f 6b 75 70  w->rRun, nLookup
1aa80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1aa90 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75       ApplyCostMu
1aaa0 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72  ltiplier(pNew->r
1aab0 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d  Run, pTab->costM
1aac0 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 77 68  ult);.        wh
1aad0 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
1aae0 75 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72  ust(pWC, pNew, r
1aaf0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Size);.        r
1ab00 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73  c = whereLoopIns
1ab10 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e  ert(pBuilder, pN
1ab20 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ew);.        pNe
1ab30 77 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b  w->nOut = rSize;
1ab40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1ab50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
1ab60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 42 75 69  .    }..    pBui
1ab70 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 3d  lder->bldFlags =
1ab80 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65   0;.    rc = whe
1ab90 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e  reLoopAddBtreeIn
1aba0 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53  dex(pBuilder, pS
1abb0 72 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a  rc, pProbe, 0);.
1abc0 20 20 20 20 69 66 28 20 70 42 75 69 6c 64 65 72      if( pBuilder
1abd0 2d 3e 62 6c 64 46 6c 61 67 73 3d 3d 53 51 4c 49  ->bldFlags==SQLI
1abe0 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45 44 20  TE_BLDF_INDEXED 
1abf0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
1ac00 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 69 6e 64 65   non-unique inde
1ac10 78 20 69 73 20 75 73 65 64 2c 20 6f 72 20 69 66  x is used, or if
1ac20 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
1ac30 20 6b 65 79 20 66 6f 72 0a 20 20 20 20 20 20 2a   key for.      *
1ac40 2a 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20 69  * unique index i
1ac50 73 20 75 73 65 64 20 28 6d 61 6b 69 6e 67 20 74  s used (making t
1ac60 68 65 20 69 6e 64 65 78 20 66 75 6e 63 74 69 6f  he index functio
1ac70 6e 61 6c 6c 79 20 6e 6f 6e 2d 75 6e 69 71 75 65  nally non-unique
1ac80 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ).      ** then 
1ac90 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31  the sqlite_stat1
1aca0 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 69 6d   data becomes im
1acb0 70 6f 72 74 61 6e 74 20 66 6f 72 20 73 63 6f 72  portant for scor
1acc0 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ing the.      **
1acd0 20 70 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 70   plan */.      p
1ace0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
1acf0 20 54 46 5f 53 74 61 74 73 55 73 65 64 3b 0a 20   TF_StatsUsed;. 
1ad00 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1ad10 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
1ad20 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 73 71 6c  OR_STAT4.    sql
1ad30 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 46 72  ite3Stat4ProbeFr
1ad40 65 65 28 70 42 75 69 6c 64 65 72 2d 3e 70 52 65  ee(pBuilder->pRe
1ad50 63 29 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72  c);.    pBuilder
1ad60 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 30 3b  ->nRecValid = 0;
1ad70 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 70  .    pBuilder->p
1ad80 52 65 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Rec = 0;.#endif.
1ad90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ada0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1adb0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1adc0 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  ABLE../*.** Argu
1add0 6d 65 6e 74 20 70 49 64 78 49 6e 66 6f 20 69 73  ment pIdxInfo is
1ade0 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
1adf0 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 73  ed with all cons
1ae00 74 72 61 69 6e 74 73 20 74 68 61 74 20 6d 61 79  traints that may
1ae10 0a 2a 2a 20 62 65 20 75 73 65 64 20 62 79 20 74  .** be used by t
1ae20 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1ae30 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1ae40 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69  Builder->pNew->i
1ae50 54 61 62 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  Tab. This.** fun
1ae60 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 75  ction marks a su
1ae70 62 73 65 74 20 6f 66 20 74 68 6f 73 65 20 63 6f  bset of those co
1ae80 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65  nstraints usable
1ae90 2c 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a  , invokes the.**
1aea0 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68   xBestIndex meth
1aeb0 6f 64 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  od and adds the 
1aec0 72 65 74 75 72 6e 65 64 20 70 6c 61 6e 20 74 6f  returned plan to
1aed0 20 70 42 75 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a   pBuilder..**.**
1aee0 20 41 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73   A constraint is
1aef0 20 6d 61 72 6b 65 64 20 75 73 61 62 6c 65 20 69   marked usable i
1af00 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 72 67  f:.**.**   * Arg
1af10 75 6d 65 6e 74 20 6d 55 73 61 62 6c 65 20 69 6e  ument mUsable in
1af20 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74 73  dicates that its
1af30 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61   prerequisites a
1af40 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 6e  re available, an
1af50 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 74 20 69  d.**.**   * It i
1af60 73 20 6e 6f 74 20 6f 6e 65 20 6f 66 20 74 68 65  s not one of the
1af70 20 6f 70 65 72 61 74 6f 72 73 20 73 70 65 63 69   operators speci
1af80 66 69 65 64 20 69 6e 20 74 68 65 20 6d 45 78 63  fied in the mExc
1af90 6c 75 64 65 20 6d 61 73 6b 20 70 61 73 73 65 64  lude mask passed
1afa0 0a 2a 2a 20 20 20 20 20 61 73 20 74 68 65 20 66  .**     as the f
1afb0 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 28  ourth argument (
1afc0 77 68 69 63 68 20 69 6e 20 70 72 61 63 74 69 63  which in practic
1afd0 65 20 69 73 20 65 69 74 68 65 72 20 57 4f 5f 49  e is either WO_I
1afe0 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 41  N or 0)..**.** A
1aff0 72 67 75 6d 65 6e 74 20 6d 50 72 65 72 65 71 20  rgument mPrereq 
1b000 69 73 20 61 20 6d 61 73 6b 20 6f 66 20 74 61 62  is a mask of tab
1b010 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  les that must be
1b020 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65 20   scanned before 
1b030 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74  the.** virtual t
1b040 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
1b050 2e 20 54 68 65 73 65 20 61 72 65 20 61 64 64 65  . These are adde
1b060 64 20 74 6f 20 74 68 65 20 70 6c 61 6e 73 20 70  d to the plans p
1b070 72 65 72 65 71 75 69 73 69 74 65 73 0a 2a 2a 20  rerequisites.** 
1b080 62 65 66 6f 72 65 20 69 74 20 69 73 20 61 64 64  before it is add
1b090 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a  ed to pBuilder..
1b0a0 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 70 61 72  **.** Output par
1b0b0 61 6d 65 74 65 72 20 2a 70 62 49 6e 20 69 73 20  ameter *pbIn is 
1b0c0 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 74  set to true if t
1b0d0 68 65 20 70 6c 61 6e 20 61 64 64 65 64 20 74 6f  he plan added to
1b0e0 20 70 42 75 69 6c 64 65 72 0a 2a 2a 20 75 73 65   pBuilder.** use
1b0f0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 4f  s one or more WO
1b100 5f 49 4e 20 74 65 72 6d 73 2c 20 6f 72 20 66 61  _IN terms, or fa
1b110 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
1b120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1b130 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1b140 4f 6e 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  One(.  WhereLoop
1b150 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1b160 72 2c 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  r,.  Bitmask mPr
1b170 65 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20  ereq,           
1b180 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1b190 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74  tables that must
1b1a0 20 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 42   be used. */.  B
1b1b0 69 74 6d 61 73 6b 20 6d 55 73 61 62 6c 65 2c 20  itmask mUsable, 
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b1d0 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61 62 6c 65  * Mask of usable
1b1e0 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 75 31 36   tables */.  u16
1b1f0 20 6d 45 78 63 6c 75 64 65 2c 20 20 20 20 20 20   mExclude,      
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b210 45 78 63 6c 75 64 65 20 74 65 72 6d 73 20 75 73  Exclude terms us
1b220 69 6e 67 20 74 68 65 73 65 20 6f 70 65 72 61 74  ing these operat
1b230 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ors */.  sqlite3
1b240 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
1b250 78 49 6e 66 6f 2c 20 20 20 2f 2a 20 50 6f 70 75  xInfo,   /* Popu
1b260 6c 61 74 65 64 20 6f 62 6a 65 63 74 20 66 6f 72  lated object for
1b270 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20   xBestIndex */. 
1b280 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 2c 20 20 20   u16 mNoOmit,   
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2a0 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 6d 69 74 20   /* Do not omit 
1b2b0 74 68 65 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  these constraint
1b2c0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49 6e  s */.  int *pbIn
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
1b2f0 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73  rue if plan uses
1b300 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20 2a   an IN(...) op *
1b310 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c 61 75  /.){.  WhereClau
1b320 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c 64  se *pWC = pBuild
1b330 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75 63  er->pWC;.  struc
1b340 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
1b350 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
1b360 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
1b370 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
1b380 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70  straint_usage *p
1b390 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f  Usage = pIdxInfo
1b3a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
1b3b0 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ge;.  int i;.  i
1b3c0 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e 74  nt mxTerm;.  int
1b3d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b3e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e  .  WhereLoop *pN
1b3f0 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1b400 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  New;.  Parse *pP
1b410 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72 2d  arse = pBuilder-
1b420 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b  >pWInfo->pParse;
1b430 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1b440 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20 26  t_item *pSrc = &
1b450 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f  pBuilder->pWInfo
1b460 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e  ->pTabList->a[pN
1b470 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e 74  ew->iTab];.  int
1b480 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   nConstraint = p
1b490 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
1b4a0 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  aint;..  assert(
1b4b0 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50 72 65   (mUsable & mPre
1b4c0 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20 29 3b  req)==mPrereq );
1b4d0 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20 20  .  *pbIn = 0;.  
1b4e0 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d  pNew->prereq = m
1b4f0 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53 65  Prereq;..  /* Se
1b500 74 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61  t the usable fla
1b510 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65 74 20  g on the subset 
1b520 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69  of constraints i
1b530 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 20 20  dentified by .  
1b540 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 55 73  ** arguments mUs
1b550 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75 64  able and mExclud
1b560 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  e. */.  pIdxCons
1b570 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
1b580 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1b590 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
1b5a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
1b5b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
1b5c0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
1b5d0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 57  dxCons++){.    W
1b5e0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20  hereTerm *pTerm 
1b5f0 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f  = &pWC->a[pIdxCo
1b600 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 5d  ns->iTermOffset]
1b610 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
1b620 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
1b630 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
1b640 65 71 52 69 67 68 74 20 26 20 6d 55 73 61 62 6c  eqRight & mUsabl
1b650 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65  e)==pTerm->prere
1b660 71 52 69 67 68 74 20 0a 20 20 20 20 20 26 26 20  qRight .     && 
1b670 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1b680 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d 30  r & mExclude)==0
1b690 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49  .    ){.      pI
1b6a0 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d  dxCons->usable =
1b6b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
1b6c0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1b6d0 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c 64 73  he output fields
1b6e0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
1b6f0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
1b700 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ture */.  memset
1b710 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
1b720 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e 43  of(pUsage[0])*nC
1b730 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 61 73  onstraint);.  as
1b740 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d 3e  sert( pIdxInfo->
1b750 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1b760 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e 66  ==0 );.  pIdxInf
1b770 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
1b780 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
1b790 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  m = 0;.  pIdxInf
1b7a0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
1b7b0 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  ed = 0;.  pIdxIn
1b7c0 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
1b7d0 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
1b7e0 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b 0a  BL / (double)2;.
1b7f0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
1b800 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b 0a  matedRows = 25;.
1b810 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46    pIdxInfo->idxF
1b820 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49 64 78  lags = 0;.  pIdx
1b830 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d 20  Info->colUsed = 
1b840 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
1b850 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a 20  Src->colUsed;.. 
1b860 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 76   /* Invoke the v
1b870 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42 65  irtual table xBe
1b880 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64  stIndex() method
1b890 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61 62 42   */.  rc = vtabB
1b8a0 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
1b8b0 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70 49 64   pSrc->pTab, pId
1b8c0 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72 63  xInfo);.  if( rc
1b8d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1b8e0 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20   mxTerm = -1;.  
1b8f0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
1b900 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69 6e  Slot>=nConstrain
1b910 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t );.  for(i=0; 
1b920 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1b930 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d  ++) pNew->aLTerm
1b940 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  [i] = 0;.  pNew-
1b950 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
1b960 20 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e 73   = 0;.  pIdxCons
1b970 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
1b980 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
1b990 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
1b9a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
1b9b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e   for(i=0; i<nCon
1b9c0 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
1b9d0 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 69  dxCons++){.    i
1b9e0 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 69 66  nt iTerm;.    if
1b9f0 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61 67  ( (iTerm = pUsag
1ba00 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 2d  e[i].argvIndex -
1ba10 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)>=0 ){.      
1ba20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1ba30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20  ;.      int j = 
1ba40 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
1ba50 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
1ba60 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72 61   iTerm>=nConstra
1ba70 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3c  int.       || j<
1ba80 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d 70  0.       || j>=p
1ba90 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20 20  WC->nTerm.      
1baa0 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d   || pNew->aLTerm
1bab0 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20 20  [iTerm]!=0.     
1bac0 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d 3e 75    || pIdxCons->u
1bad0 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20 29  sable==0.      )
1bae0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1baf0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1bb00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1bb10 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 2e  rMsg(pParse,"%s.
1bb20 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75  xBestIndex malfu
1bb30 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70 54  nction",pSrc->pT
1bb40 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
1bb50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bb60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
1bb70 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e 43  tcase( iTerm==nC
1bb80 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a 20  onstraint-1 );. 
1bb90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a       testcase( j
1bba0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==0 );.      tes
1bbb0 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e 6e  tcase( j==pWC->n
1bbc0 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20 20  Term-1 );.      
1bbd0 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
1bbe0 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  j];.      pNew->
1bbf0 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d 2d  prereq |= pTerm-
1bc00 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
1bc10 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
1bc20 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  m<pNew->nLSlot )
1bc30 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
1bc40 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70 54  Term[iTerm] = pT
1bc50 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 69  erm;.      if( i
1bc60 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d 78  Term>mxTerm ) mx
1bc70 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20 20  Term = iTerm;.  
1bc80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
1bc90 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20 20  erm==15 );.     
1bca0 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
1bcb0 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 69 66  ==16 );.      if
1bcc0 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70 55  ( iTerm<16 && pU
1bcd0 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20 70  sage[i].omit ) p
1bce0 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
1bcf0 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72 6d  Mask |= 1<<iTerm
1bd00 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
1bd10 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
1bd20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20 20  WO_IN)!=0 ){.   
1bd30 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75 61       /* A virtua
1bd40 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  l table that is 
1bd50 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61  constrained by a
1bd60 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79 20  n IN clause may 
1bd70 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  not.        ** c
1bd80 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45 52  onsume the ORDER
1bd90 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61 75   BY clause becau
1bda0 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65 72  se (1) the order
1bdb0 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20 20   of IN terms.   
1bdc0 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6e       ** is not n
1bdd0 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61 74  ecessarily relat
1bde0 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72 20  ed to the order 
1bdf0 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73 20  of output terms 
1be00 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  and.        ** (
1be10 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74 70  2) Multiple outp
1be20 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  uts from a singl
1be30 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c 20  e IN value will 
1be40 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20 20  not merge.      
1be50 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20 20    ** together.  
1be60 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78 49  */.        pIdxI
1be70 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
1be80 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  umed = 0;.      
1be90 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46    pIdxInfo->idxF
1bea0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
1beb0 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55  INDEX_SCAN_UNIQU
1bec0 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 49 6e  E;.        *pbIn
1bed0 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20 28 6d   = 1; assert( (m
1bee0 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49 4e 29  Exclude & WO_IN)
1bef0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ==0 );.      }. 
1bf00 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 2d     }.  }.  pNew-
1bf10 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b  >u.vtab.omitMask
1bf20 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20   &= ~mNoOmit;.. 
1bf30 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1bf40 6d 78 54 65 72 6d 2b 31 3b 0a 20 20 61 73 73 65  mxTerm+1;.  asse
1bf50 72 74 28 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  rt( pNew->nLTerm
1bf60 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29  <=pNew->nLSlot )
1bf70 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1bf80 2e 69 64 78 4e 75 6d 20 3d 20 70 49 64 78 49 6e  .idxNum = pIdxIn
1bf90 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 70 4e  fo->idxNum;.  pN
1bfa0 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  ew->u.vtab.needF
1bfb0 72 65 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  ree = pIdxInfo->
1bfc0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
1bfd0 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  ;.  pIdxInfo->ne
1bfe0 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
1bff0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74   0;.  pNew->u.vt
1c000 61 62 2e 69 64 78 53 74 72 20 3d 20 70 49 64 78  ab.idxStr = pIdx
1c010 49 6e 66 6f 2d 3e 69 64 78 53 74 72 3b 0a 20 20  Info->idxStr;.  
1c020 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 73 4f  pNew->u.vtab.isO
1c030 72 64 65 72 65 64 20 3d 20 28 69 38 29 28 70 49  rdered = (i8)(pI
1c040 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
1c050 6f 6e 73 75 6d 65 64 20 3f 0a 20 20 20 20 20 20  onsumed ?.      
1c060 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
1c070 42 79 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 2d  By : 0);.  pNew-
1c080 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
1c090 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
1c0a0 74 65 33 4c 6f 67 45 73 74 46 72 6f 6d 44 6f 75  te3LogEstFromDou
1c0b0 62 6c 65 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73  ble(pIdxInfo->es
1c0c0 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20  timatedCost);.  
1c0d0 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c  pNew->nOut = sql
1c0e0 69 74 65 33 4c 6f 67 45 73 74 28 70 49 64 78 49  ite3LogEst(pIdxI
1c0f0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f  nfo->estimatedRo
1c100 77 73 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ws);..  /* Set t
1c110 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
1c120 66 6c 61 67 20 69 66 20 74 68 65 20 78 42 65 73  flag if the xBes
1c130 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f 64 20  tIndex() method 
1c140 69 6e 64 69 63 61 74 65 64 0a 20 20 2a 2a 20 74  indicated.  ** t
1c150 68 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c  hat the scan wil
1c160 6c 20 76 69 73 69 74 20 61 74 20 6d 6f 73 74 20  l visit at most 
1c170 6f 6e 65 20 72 6f 77 2e 20 43 6c 65 61 72 20 69  one row. Clear i
1c180 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a  t otherwise. */.
1c190 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
1c1a0 69 64 78 46 6c 61 67 73 20 26 20 53 51 4c 49 54  idxFlags & SQLIT
1c1b0 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49  E_INDEX_SCAN_UNI
1c1c0 51 55 45 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  QUE ){.    pNew-
1c1d0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
1c1e0 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 65 6c 73  E_ONEROW;.  }els
1c1f0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  e{.    pNew->wsF
1c200 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45 5f 4f  lags &= ~WHERE_O
1c210 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 63 20  NEROW;.  }.  rc 
1c220 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1c230 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1c240 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 75  );.  if( pNew->u
1c250 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 29  .vtab.needFree )
1c260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1c270 65 65 28 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e  ee(pNew->u.vtab.
1c280 69 64 78 53 74 72 29 3b 0a 20 20 20 20 70 4e 65  idxStr);.    pNe
1c290 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
1c2a0 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 57 48  ee = 0;.  }.  WH
1c2b0 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66 2c  ERETRACE(0xffff,
1c2c0 20 28 22 20 20 62 49 6e 3d 25 64 20 70 72 65 72   ("  bIn=%d prer
1c2d0 65 71 49 6e 3d 25 30 34 6c 6c 78 20 70 72 65 72  eqIn=%04llx prer
1c2e0 65 71 4f 75 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c  eqOut=%04llx\n",
1c2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c300 20 20 20 20 20 20 20 2a 70 62 49 6e 2c 20 28 73         *pbIn, (s
1c310 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50  qlite3_uint64)mP
1c320 72 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20  rereq,.         
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1c340 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 28 70 4e  lite3_uint64)(pN
1c350 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50  ew->prereq & ~mP
1c360 72 65 72 65 71 29 29 29 3b 0a 0a 20 20 72 65 74  rereq)));..  ret
1c370 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1c380 2a 20 41 64 64 20 61 6c 6c 20 57 68 65 72 65 4c  * Add all WhereL
1c390 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  oop objects for 
1c3a0 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  a table of the j
1c3b0 6f 69 6e 20 69 64 65 6e 74 69 66 69 65 64 20 62  oin identified b
1c3c0 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72 2d 3e 70  y.** pBuilder->p
1c3d0 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74  New->iTab.  That
1c3e0 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e   table is guaran
1c3f0 74 65 65 64 20 74 6f 20 62 65 20 61 20 76 69 72  teed to be a vir
1c400 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
1c410 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
1c420 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  o LEFT or CROSS 
1c430 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e 20 74 68  JOIN joins in th
1c440 65 20 71 75 65 72 79 2c 20 62 6f 74 68 20 6d 50  e query, both mP
1c450 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e  rereq and.** mUn
1c460 75 73 61 62 6c 65 20 61 72 65 20 73 65 74 20 74  usable are set t
1c470 6f 20 30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  o 0. Otherwise, 
1c480 6d 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73  mPrereq is a mas
1c490 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 20 63 6c  k of all FROM cl
1c4a0 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ause.** entries 
1c4b0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
1c4c0 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
1c4d0 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
1c4e0 63 6c 61 75 73 65 20 61 6e 64 20 61 72 65 0a 2a  clause and are.*
1c4f0 2a 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  * separated from
1c500 20 69 74 20 62 79 20 61 74 20 6c 65 61 73 74 20   it by at least 
1c510 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43 52 4f 53  one LEFT or CROS
1c520 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c 61 72 6c  S JOIN. Similarl
1c530 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e 75 73 61  y, the.** mUnusa
1c540 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e  ble mask contain
1c550 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  s all FROM claus
1c560 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  e entries that o
1c570 63 63 75 72 20 61 66 74 65 72 20 74 68 65 0a 2a  ccur after the.*
1c580 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
1c590 61 6e 64 20 61 72 65 20 73 65 70 61 72 61 74 65  and are separate
1c5a0 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74 20  d from it by at 
1c5b0 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f  least one LEFT o
1c5c0 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a 4f 49 4e  r .** CROSS JOIN
1c5d0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  . .**.** For exa
1c5e0 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 71 75 65  mple, if the que
1c5f0 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  ry were:.**.**  
1c600 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c 20 74 32   ... FROM t1, t2
1c610 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 2c 20 74   LEFT JOIN t3, t
1c620 34 2c 20 76 74 20 43 52 4f 53 53 20 4a 4f 49 4e  4, vt CROSS JOIN
1c630 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74   t5, t6;.**.** t
1c640 68 65 6e 20 6d 50 72 65 72 65 71 20 63 6f 72 72  hen mPrereq corr
1c650 65 73 70 6f 6e 64 73 20 74 6f 20 28 74 31 2c 20  esponds to (t1, 
1c660 74 32 29 20 61 6e 64 20 6d 55 6e 75 73 61 62 6c  t2) and mUnusabl
1c670 65 20 74 6f 20 28 74 35 2c 20 74 36 29 2e 0a 2a  e to (t5, t6)..*
1c680 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20 74 61 62  *.** All the tab
1c690 6c 65 73 20 69 6e 20 6d 50 72 65 72 65 71 20 6d  les in mPrereq m
1c6a0 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62  ust be scanned b
1c6b0 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
1c6c0 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a 20 74 61  t virtual .** ta
1c6d0 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74 65 72 6d  ble. So any term
1c6e0 73 20 66 6f 72 20 77 68 69 63 68 20 61 6c 6c 20  s for which all 
1c6f0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 72  prerequisites ar
1c700 65 20 73 61 74 69 73 66 69 65 64 20 62 79 20 0a  e satisfied by .
1c710 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61 79 20 62  ** mPrereq may b
1c720 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 22  e specified as "
1c730 75 73 61 62 6c 65 22 20 69 6e 20 61 6c 6c 20 63  usable" in all c
1c740 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64  alls to xBestInd
1c750 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65 72 73 65  ex. .** Converse
1c760 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  ly, all tables i
1c770 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d 75 73 74  n mUnusable must
1c780 20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65   be scanned afte
1c790 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  r the current.**
1c7a0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20   virtual table, 
1c7b0 73 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f 72  so any terms for
1c7c0 20 77 68 69 63 68 20 74 68 65 20 70 72 65 72 65   which the prere
1c7d0 71 75 69 73 69 74 65 73 20 6f 76 65 72 6c 61 70  quisites overlap
1c7e0 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75 73 61 62   with.** mUnusab
1c7f0 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  le should always
1c800 20 62 65 20 63 6f 6e 66 69 67 75 72 65 64 20 61   be configured a
1c810 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65 22 20 66  s "not-usable" f
1c820 6f 72 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a  or xBestIndex..*
1c830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
1c840 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1c850 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
1c860 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
1c870 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   /* WHERE clause
1c880 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1c890 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72 65    Bitmask mPrere
1c8a0 71 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  q,             /
1c8b0 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d 75  * Tables that mu
1c8c0 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65  st be scanned be
1c8d0 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20 2a 2f  fore this one */
1c8e0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
1c8f0 61 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  able            
1c900 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 6d  /* Tables that m
1c910 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61  ust be scanned a
1c920 66 74 65 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  fter this one */
1c930 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1c940 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1c950 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1c960 65 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  e */.  WhereInfo
1c970 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
1c980 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61      /* WHERE ana
1c990 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f  lysis context */
1c9a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1c9b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c9c0 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
1c9d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
1c9e0 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
1c9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ca00 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1ca10 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1ca20 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20 20 20 2f  _item *pSrc;   /
1ca30 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1ca40 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
1ca50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1ca60 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20 20 20 20  dex_info *p;    
1ca70 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
1ca80 70 61 73 73 20 74 6f 20 78 42 65 73 74 49 6e 64  pass to xBestInd
1ca90 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ex() */.  int nC
1caa0 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20  onstraint;      
1cab0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cac0 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
1cad0 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74 20 62 49  in p */.  int bI
1cae0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1caf0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1cb00 66 20 70 6c 61 6e 20 75 73 65 73 20 49 4e 28 2e  f plan uses IN(.
1cb10 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  ..) operator */.
1cb20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1cb30 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 42 65  w;.  Bitmask mBe
1cb40 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1cb50 20 20 2f 2a 20 54 61 62 6c 65 73 20 75 73 65 64    /* Tables used
1cb60 20 62 79 20 62 65 73 74 20 70 6f 73 73 69 62 6c   by best possibl
1cb70 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75 31 36 20  e plan */.  u16 
1cb80 6d 4e 6f 4f 6d 69 74 3b 0a 0a 20 20 61 73 73 65  mNoOmit;..  asse
1cb90 72 74 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d  rt( (mPrereq & m
1cba0 55 6e 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a  Unusable)==0 );.
1cbb0 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
1cbc0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
1cbd0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
1cbe0 70 50 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20  pParse;.  pWC = 
1cbf0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
1cc00 20 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72   pNew = pBuilder
1cc10 2d 3e 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d  ->pNew;.  pSrc =
1cc20 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
1cc30 73 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62  st->a[pNew->iTab
1cc40 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 49 73 56  ];.  assert( IsV
1cc50 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61  irtual(pSrc->pTa
1cc60 62 29 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f  b) );.  p = allo
1cc70 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50  cateIndexInfo(pP
1cc80 61 72 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73  arse, pWC, mUnus
1cc90 61 62 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69  able, pSrc, pBui
1cca0 6c 64 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  lder->pOrderBy, 
1ccb0 0a 20 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29  .      &mNoOmit)
1ccc0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1ccd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1cce0 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d  EM_BKPT;.  pNew-
1ccf0 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70  >rSetup = 0;.  p
1cd00 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57  New->wsFlags = W
1cd10 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1cd20 45 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  E;.  pNew->nLTer
1cd30 6d 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75  m = 0;.  pNew->u
1cd40 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1cd50 20 30 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e   0;.  nConstrain
1cd60 74 20 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69  t = p->nConstrai
1cd70 6e 74 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c  nt;.  if( whereL
1cd80 6f 6f 70 52 65 73 69 7a 65 28 70 50 61 72 73 65  oopResize(pParse
1cd90 2d 3e 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e  ->db, pNew, nCon
1cda0 73 74 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20  straint) ){.    
1cdb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1cdc0 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  arse->db, p);.  
1cdd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cde0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
1cdf0 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c  .  /* First call
1ce00 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 77 69   xBestIndex() wi
1ce10 74 68 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  th all constrain
1ce20 74 73 20 75 73 61 62 6c 65 2e 20 2a 2f 0a 20 20  ts usable. */.  
1ce30 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1ce40 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1ce50 20 61 6c 6c 20 75 73 61 62 6c 65 5c 6e 22 29 29   all usable\n"))
1ce60 3b 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  ;.  rc = whereLo
1ce70 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1ce80 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65  pBuilder, mPrere
1ce90 71 2c 20 41 4c 4c 42 49 54 53 2c 20 30 2c 20 70  q, ALLBITS, 0, p
1cea0 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1ceb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
1cec0 61 6c 6c 20 74 6f 20 78 42 65 73 74 49 6e 64 65  all to xBestInde
1ced0 78 28 29 20 77 69 74 68 20 61 6c 6c 20 74 65 72  x() with all ter
1cee0 6d 73 20 65 6e 61 62 6c 65 64 20 70 72 6f 64 75  ms enabled produ
1cef0 63 65 64 20 61 20 70 6c 61 6e 0a 20 20 2a 2a 20  ced a plan.  ** 
1cf00 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
1cf10 71 75 69 72 65 20 61 6e 79 20 73 6f 75 72 63 65  quire any source
1cf20 20 74 61 62 6c 65 73 20 28 49 4f 57 3a 20 61 20   tables (IOW: a 
1cf30 70 6c 61 6e 20 77 69 74 68 20 6d 42 65 73 74 3d  plan with mBest=
1cf40 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  =0),.  ** then t
1cf50 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
1cf60 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e 79 20 66   in making any f
1cf70 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
1cf80 78 42 65 73 74 49 6e 64 65 78 28 29 20 0a 20 20  xBestIndex() .  
1cf90 2a 2a 20 73 69 6e 63 65 20 74 68 65 79 20 77 69  ** since they wi
1cfa0 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e 20 74 68  ll all return th
1cfb0 65 20 73 61 6d 65 20 72 65 73 75 6c 74 20 28 69  e same result (i
1cfc0 66 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78  f the xBestIndex
1cfd0 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  ().  ** implemen
1cfe0 74 61 74 69 6f 6e 20 69 73 20 73 61 6e 65 29 2e  tation is sane).
1cff0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
1d000 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d 42 65 73  LITE_OK && (mBes
1d010 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72 65 72 65  t = (pNew->prere
1d020 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 21 3d  q & ~mPrereq))!=
1d030 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  0 ){.    int see
1d040 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20 20 20 20  nZero = 0;      
1d050 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1d060 66 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6e 6f  f a plan with no
1d070 20 70 72 65 72 65 71 73 20 73 65 65 6e 20 2a 2f   prereqs seen */
1d080 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72  .    int seenZer
1d090 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20 20 20 20  oNoIN = 0;      
1d0a0 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69 74 68 20     /* Plan with 
1d0b0 6e 6f 20 70 72 65 72 65 71 73 20 61 6e 64 20 6e  no prereqs and n
1d0c0 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65 6e 20 2a  o IN(...) seen *
1d0d0 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 50  /.    Bitmask mP
1d0e0 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 42 69 74  rev = 0;.    Bit
1d0f0 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49 6e 20 3d  mask mBestNoIn =
1d100 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   0;..    /* If t
1d110 68 65 20 70 6c 61 6e 20 70 72 6f 64 75 63 65 64  he plan produced
1d120 20 62 79 20 74 68 65 20 65 61 72 6c 69 65 72 20   by the earlier 
1d130 63 61 6c 6c 20 75 73 65 73 20 61 6e 20 49 4e 28  call uses an IN(
1d140 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61 6c 6c 0a  ...) term, call.
1d150 20 20 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65      ** xBestInde
1d160 78 20 61 67 61 69 6e 2c 20 74 68 69 73 20 74 69  x again, this ti
1d170 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e 2e 29 20  me with IN(...) 
1d180 74 65 72 6d 73 20 64 69 73 61 62 6c 65 64 2e 20  terms disabled. 
1d190 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 6e 20 29  */.    if( bIn )
1d1a0 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  {.      WHERETRA
1d1b0 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72  CE(0x40, ("  Vir
1d1c0 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61  tualOne: all usa
1d1d0 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b  ble w/o IN\n"));
1d1e0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72  .      rc = wher
1d1f0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f  eLoopAddVirtualO
1d200 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 42  ne(.          pB
1d210 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c  uilder, mPrereq,
1d220 20 41 4c 4c 42 49 54 53 2c 20 57 4f 5f 49 4e 2c   ALLBITS, WO_IN,
1d230 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49   p, mNoOmit, &bI
1d240 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
1d250 28 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ( bIn==0 );.    
1d260 20 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70 4e    mBestNoIn = pN
1d270 65 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50  ew->prereq & ~mP
1d280 72 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66 28  rereq;.      if(
1d290 20 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b   mBestNoIn==0 ){
1d2a0 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72  .        seenZer
1d2b0 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  o = 1;.        s
1d2c0 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b  eenZeroNoIN = 1;
1d2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d2e0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65 73      /* Call xBes
1d2f0 74 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72 20  tIndex once for 
1d300 65 61 63 68 20 64 69 73 74 69 6e 63 74 20 76 61  each distinct va
1d310 6c 75 65 20 6f 66 20 28 70 72 65 72 65 71 52 69  lue of (prereqRi
1d320 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29 20  ght & ~mPrereq) 
1d330 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 73  .    ** in the s
1d340 65 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61 74  et of terms that
1d350 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63 75   apply to the cu
1d360 72 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74 61  rrent virtual ta
1d370 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69  ble.  */.    whi
1d380 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1d390 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
1d3a0 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
1d3b0 6d 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53 3b  mNext = ALLBITS;
1d3c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1d3d0 4e 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20 20  Next>0 );.      
1d3e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73  for(i=0; i<nCons
1d3f0 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  traint; i++){.  
1d400 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54        Bitmask mT
1d410 68 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20  his = (.        
1d420 20 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61 43      pWC->a[p->aC
1d430 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65  onstraint[i].iTe
1d440 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71  rmOffset].prereq
1d450 52 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71  Right & ~mPrereq
1d460 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1d470 20 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d 50      if( mThis>mP
1d480 72 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e 65  rev && mThis<mNe
1d490 78 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54 68  xt ) mNext = mTh
1d4a0 69 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  is;.      }.    
1d4b0 20 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74 3b    mPrev = mNext;
1d4c0 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74  .      if( mNext
1d4d0 3d 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65 61  ==ALLBITS ) brea
1d4e0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65  k;.      if( mNe
1d4f0 78 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e 65  xt==mBest || mNe
1d500 78 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29 20  xt==mBestNoIn ) 
1d510 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d520 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1d530 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1d540 20 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d 4e   mPrev=%04llx mN
1d550 65 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20  ext=%04llx\n",. 
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75        (sqlite3_u
1d580 69 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73 71  int64)mPrev, (sq
1d590 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e 65  lite3_uint64)mNe
1d5a0 78 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  xt));.      rc =
1d5b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1d5c0 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20  tualOne(.       
1d5d0 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72     pBuilder, mPr
1d5e0 65 72 65 71 2c 20 6d 4e 65 78 74 7c 6d 50 72 65  ereq, mNext|mPre
1d5f0 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d  req, 0, p, mNoOm
1d600 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1d610 20 69 66 28 20 70 4e 65 77 2d 3e 70 72 65 72 65   if( pNew->prere
1d620 71 3d 3d 6d 50 72 65 72 65 71 20 29 7b 0a 20 20  q==mPrereq ){.  
1d630 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d        seenZero =
1d640 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
1d650 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a 65 72  bIn==0 ) seenZer
1d660 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20  oNoIN = 1;.     
1d670 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d680 20 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f   If the calls to
1d690 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 69 6e   xBestIndex() in
1d6a0 20 74 68 65 20 61 62 6f 76 65 20 6c 6f 6f 70 20   the above loop 
1d6b0 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  did not find a p
1d6c0 6c 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  lan.    ** that 
1d6d0 72 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72  requires no sour
1d6e0 63 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c  ce tables at all
1d6f0 20 28 69 2e 65 2e 20 6f 6e 65 20 67 75 61 72 61   (i.e. one guara
1d700 6e 74 65 65 64 20 74 6f 20 62 65 0a 20 20 20 20  nteed to be.    
1d710 2a 2a 20 75 73 61 62 6c 65 29 2c 20 6d 61 6b 65  ** usable), make
1d720 20 61 20 63 61 6c 6c 20 68 65 72 65 20 77 69 74   a call here wit
1d730 68 20 61 6c 6c 20 73 6f 75 72 63 65 20 74 61 62  h all source tab
1d740 6c 65 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a  les disabled */.
1d750 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d760 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72  TE_OK && seenZer
1d770 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 48  o==0 ){.      WH
1d780 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20 28  ERETRACE(0x40, (
1d790 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61  "  VirtualOne: a
1d7a0 6c 6c 20 64 69 73 61 62 6c 65 64 5c 6e 22 29 29  ll disabled\n"))
1d7b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1d7c0 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1d7d0 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1d7e0 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1d7f0 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c  , mPrereq, 0, p,
1d800 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b   mNoOmit, &bIn);
1d810 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d  .      if( bIn==
1d820 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  0 ) seenZeroNoIN
1d830 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1d840 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 73   /* If the calls
1d850 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1d860 20 68 61 76 65 20 73 6f 20 66 61 72 20 66 61 69   have so far fai
1d870 6c 65 64 20 74 6f 20 66 69 6e 64 20 61 20 70 6c  led to find a pl
1d880 61 6e 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  an.    ** that r
1d890 65 71 75 69 72 65 73 20 6e 6f 20 73 6f 75 72 63  equires no sourc
1d8a0 65 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 20  e tables at all 
1d8b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  and does not use
1d8c0 20 61 6e 20 49 4e 28 2e 2e 2e 29 0a 20 20 20 20   an IN(...).    
1d8d0 2a 2a 20 6f 70 65 72 61 74 6f 72 2c 20 6d 61 6b  ** operator, mak
1d8e0 65 20 61 20 66 69 6e 61 6c 20 63 61 6c 6c 20 74  e a final call t
1d8f0 6f 20 6f 62 74 61 69 6e 20 6f 6e 65 20 68 65 72  o obtain one her
1d900 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  e.  */.    if( r
1d910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d920 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20  seenZeroNoIN==0 
1d930 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1d940 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1d950 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69  rtualOne: all di
1d960 73 61 62 6c 65 64 20 61 6e 64 20 77 2f 6f 20 49  sabled and w/o I
1d970 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  N\n"));.      rc
1d980 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1d990 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1d9a0 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1d9b0 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71 2c  Prereq, mPrereq,
1d9c0 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d   WO_IN, p, mNoOm
1d9d0 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 7d  it, &bIn);.    }
1d9e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e  .  }..  if( p->n
1d9f0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
1da00 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
1da10 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
1da20 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 50 61  ite3DbFreeNN(pPa
1da30 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 72  rse->db, p);.  r
1da40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1da50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1da60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1da70 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68 65  /../*.** Add Whe
1da80 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20 74  reLoop entries t
1da90 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72 6d  o handle OR term
1daa0 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 66  s.  This works f
1dab0 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74 72  or either.** btr
1dac0 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20 74  ees or virtual t
1dad0 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1dae0 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64   int whereLoopAd
1daf0 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  dOr(.  WhereLoop
1db00 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1db10 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50  r, .  Bitmask mP
1db20 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61 73  rereq, .  Bitmas
1db30 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a 20  k mUnusable.){. 
1db40 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1db50 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
1db60 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43 6c  WInfo;.  WhereCl
1db70 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65  ause *pWC;.  Whe
1db80 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1db90 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1dba0 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e 74  , *pWCEnd;.  int
1dbb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dbc0 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 57  .  int iCur;.  W
1dbd0 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70 57  hereClause tempW
1dbe0 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  C;.  WhereLoopBu
1dbf0 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64 3b  ilder sSubBuild;
1dc00 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73 53  .  WhereOrSet sS
1dc10 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72 75  um, sCur;.  stru
1dc20 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1dc30 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57 43  *pItem;.  .  pWC
1dc40 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43   = pBuilder->pWC
1dc50 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57 43  ;.  pWCEnd = pWC
1dc60 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d  ->a + pWC->nTerm
1dc70 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  ;.  pNew = pBuil
1dc80 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65 6d  der->pNew;.  mem
1dc90 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73 69  set(&sSum, 0, si
1dca0 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20 70  zeof(sSum));.  p
1dcb0 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
1dcc0 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e 65  TabList->a + pNe
1dcd0 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72 20  w->iTab;.  iCur 
1dce0 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
1dcf0 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  ;..  for(pTerm=p
1dd00 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
1dd10 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  End && rc==SQLIT
1dd20 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  E_OK; pTerm++){.
1dd30 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1dd40 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
1dd50 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  R)!=0.     && (p
1dd60 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
1dd70 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e 65  >indexable & pNe
1dd80 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 20  w->maskSelf)!=0 
1dd90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57 68  .    ){.      Wh
1dda0 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e 73  ereClause * cons
1ddb0 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72 6d  t pOrWC = &pTerm
1ddc0 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b  ->u.pOrInfo->wc;
1ddd0 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1dde0 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45 6e   * const pOrWCEn
1ddf0 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70 4f  d = &pOrWC->a[pO
1de00 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 20  rWC->nTerm];.   
1de10 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f     WhereTerm *pO
1de20 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74  rTerm;.      int
1de30 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
1de40 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 0a   int i, j;.    .
1de50 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 20        sSubBuild 
1de60 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20 20  = *pBuilder;.   
1de70 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
1de80 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
1de90 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53 65   sSubBuild.pOrSe
1dea0 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20 20  t = &sCur;..    
1deb0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1dec0 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f 63  00, ("Begin proc
1ded0 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65  essing OR-clause
1dee0 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b   %p\n", pTerm));
1def0 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54 65  .      for(pOrTe
1df00 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f 72  rm=pOrWC->a; pOr
1df10 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20 70  Term<pOrWCEnd; p
1df20 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
1df30 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d     if( (pOrTerm-
1df40 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1df50 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  AND)!=0 ){.     
1df60 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1df70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75  WC = &pOrTerm->u
1df80 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20  .pAndInfo->wc;. 
1df90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1dfa0 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
1dfb0 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20  rsor==iCur ){.  
1dfc0 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
1dfd0 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57 49  WInfo = pWC->pWI
1dfe0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 74  nfo;.          t
1dff0 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20 70  empWC.pOuter = p
1e000 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  WC;.          te
1e010 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44  mpWC.op = TK_AND
1e020 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
1e030 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20  WC.nTerm = 1;.  
1e040 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 61          tempWC.a
1e050 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20   = pOrTerm;.    
1e060 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1e070 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a 20  pWC = &tempWC;. 
1e080 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e090 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1e0a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e0b0 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b 0a      sCur.n = 0;.
1e0c0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
1e0d0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
1e0e0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32    WHERETRACE(0x2
1e0f0 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25 64  00, ("OR-term %d
1e100 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73 75   of %p has %d su
1e110 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20 20  bterms:\n", .   
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70 4f  (int)(pOrTerm-pO
1e140 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c 20  rWC->a), pTerm, 
1e150 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e 6e  sSubBuild.pWC->n
1e160 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
1e170 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
1e180 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
1e190 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e1a0 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
1e1b0 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57 43  nt(sSubBuild.pWC
1e1c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
1e1d0 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
1e1e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e1f0 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
1e200 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65 6d   IsVirtual(pItem
1e210 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
1e220 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1e230 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26 73  oopAddVirtual(&s
1e240 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65  SubBuild, mPrere
1e250 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20  q, mUnusable);. 
1e260 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
1e270 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
1e280 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1e290 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 26  reLoopAddBtree(&
1e2a0 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1e2b0 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eq);.        }. 
1e2c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1e2d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e2e0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1e2f0 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62 42  LoopAddOr(&sSubB
1e300 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20 6d  uild, mPrereq, m
1e310 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20 20  Unusable);.     
1e320 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1e330 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1e340 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30 20  OK || sCur.n==0 
1e350 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1e360 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  Cur.n==0 ){.    
1e370 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30        sSum.n = 0
1e380 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1e390 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1e3a0 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
1e3b0 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d 6f         whereOrMo
1e3c0 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72 29  ve(&sSum, &sCur)
1e3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65  ;.          once
1e3e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
1e3f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 57  lse{.          W
1e400 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76 3b  hereOrSet sPrev;
1e410 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65  .          where
1e420 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20 26  OrMove(&sPrev, &
1e430 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  sSum);.         
1e440 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20   sSum.n = 0;.   
1e450 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1e460 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29 7b  i<sPrev.n; i++){
1e470 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
1e480 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b 20  (j=0; j<sCur.n; 
1e490 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1e4a0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
1e4b0 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e 61  t(&sSum, sPrev.a
1e4c0 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43 75  [i].prereq | sCu
1e4d0 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a 20  r.a[j].prereq,. 
1e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e500 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1e510 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43 75  v.a[i].rRun, sCu
1e520 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20 20  r.a[j].rRun),.  
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e550 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65 76  3LogEstAdd(sPrev
1e560 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75 72  .a[i].nOut, sCur
1e570 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20 20  .a[j].nOut));.  
1e580 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e5a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1e5b0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 31  pNew->nLTerm = 1
1e5c0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c  ;.      pNew->aL
1e5d0 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
1e5e0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  .      pNew->wsF
1e5f0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c  lags = WHERE_MUL
1e600 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e 65  TI_OR;.      pNe
1e610 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20  w->rSetup = 0;. 
1e620 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
1e630 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 6d  Idx = 0;.      m
1e640 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c 20  emset(&pNew->u, 
1e650 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d 3e  0, sizeof(pNew->
1e660 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  u));.      for(i
1e670 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1e680 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20 69  K && i<sSum.n; i
1e690 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ++){.        /* 
1e6a0 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74 6c  TUNING: Currentl
1e6b0 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e  y sSum.a[i].rRun
1e6c0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
1e6d0 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a  um of the costs.
1e6e0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 6c          ** of al
1e6f0 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71 75  l sub-scans requ
1e700 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d 73  ired by the OR-s
1e710 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64 75  can. However, du
1e720 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20 20  e to rounding.  
1e730 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73 2c        ** errors,
1e740 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74 20   it may be that 
1e750 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
1e760 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61 6c  OR-scan is equal
1e770 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20 20   to its.        
1e780 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76  ** most expensiv
1e790 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64 20  e sub-scan. Add 
1e7a0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f 73  the smallest pos
1e7b0 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a 20  sible penalty . 
1e7c0 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69 76         ** (equiv
1e7d0 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70 6c  alent to multipl
1e7e0 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62 79  ying the cost by
1e7f0 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72 65   1.07) to ensure
1e800 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20 2a   that .        *
1e810 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  * this does not 
1e820 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69 73  happen. Otherwis
1e830 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61  e, for WHERE cla
1e840 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68 65  uses such as the
1e850 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
1e860 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65 72  owing where ther
1e870 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e is an index on
1e880 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a 2a   "y":.        **
1e890 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
1e8a0 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f 64  WHERE likelihood
1e8b0 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20 79  (x=?, 0.99) OR y
1e8c0 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  =?.        **.  
1e8d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c 61        ** the pla
1e8e0 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20 74  nner may elect t
1e8f0 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72 20  o "OR" together 
1e900 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
1e910 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 20  n and an.       
1e920 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70   ** index lookup
1e930 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d 69  . And other simi
1e940 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c 74  larly odd result
1e950 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  s.  */.        p
1e960 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75 6d  New->rRun = sSum
1e970 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b 0a  .a[i].rRun + 1;.
1e980 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
1e990 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 6e  ut = sSum.a[i].n
1e9a0 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  Out;.        pNe
1e9b0 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75 6d  w->prereq = sSum
1e9c0 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20 20  .a[i].prereq;.  
1e9d0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1e9e0 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1e9f0 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1ea00 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45 54    }.      WHERET
1ea10 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45 6e  RACE(0x200, ("En
1ea20 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52 2d  d processing OR-
1ea30 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70 54  clause %p\n", pT
1ea40 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  erm));.    }.  }
1ea50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ea60 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57  ./*.** Add all W
1ea70 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
1ea80 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
1ea90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1eaa0 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28 57  hereLoopAddAll(W
1eab0 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20  hereLoopBuilder 
1eac0 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57 68  *pBuilder){.  Wh
1ead0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20  ereInfo *pWInfo 
1eae0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1eaf0 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50  fo;.  Bitmask mP
1eb00 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69 74  rereq = 0;.  Bit
1eb10 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30 3b  mask mPrior = 0;
1eb20 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 53  .  int iTab;.  S
1eb30 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
1eb40 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
1eb50 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
1eb60 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1eb70 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  m;.  struct SrcL
1eb80 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20 3d  ist_item *pEnd =
1eb90 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 57   &pTabList->a[pW
1eba0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  Info->nLevel];. 
1ebb0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1ebc0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1ebd0 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
1ebe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65  LITE_OK;.  Where
1ebf0 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75 38  Loop *pNew;.  u8
1ec00 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1ec10 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f   0;..  /* Loop o
1ec20 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20 69  ver the tables i
1ec30 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f 6d  n the join, from
1ec40 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 2a   left to right *
1ec50 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69 6c  /.  pNew = pBuil
1ec60 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68 65  der->pNew;.  whe
1ec70 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77 29  reLoopInit(pNew)
1ec80 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c 20  ;.  for(iTab=0, 
1ec90 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pItem=pTabList->
1eca0 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20 69  a; pItem<pEnd; i
1ecb0 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  Tab++, pItem++){
1ecc0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e  .    Bitmask mUn
1ecd0 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  usable = 0;.    
1ece0 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54 61  pNew->iTab = iTa
1ecf0 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61 73  b;.    pNew->mas
1ed00 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33 57  kSelf = sqlite3W
1ed10 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49  hereGetMask(&pWI
1ed20 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 70  nfo->sMaskSet, p
1ed30 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
1ed40 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d 2d      if( ((pItem-
1ed50 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72 69  >fg.jointype|pri
1ed60 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28 4a  orJointype) & (J
1ed70 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
1ed80 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
1ed90 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
1eda0 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49 74  is true when pIt
1edb0 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20 63  em is the FROM c
1edc0 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74 68  lause term on th
1edd0 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74  e.      ** right
1ede0 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20  -hand-side of a 
1edf0 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1ee00 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d 50  IN.  */.      mP
1ee10 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b 0a  rereq = mPrior;.
1ee20 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72 4a      }.    priorJ
1ee30 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d 2d  ointype = pItem-
1ee40 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23 69  >fg.jointype;.#i
1ee50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ee60 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1ee70 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
1ee80 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b  (pItem->pTab) ){
1ee90 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
1eea0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a 20  cList_item *p;. 
1eeb0 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74 65       for(p=&pIte
1eec0 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  m[1]; p<pEnd; p+
1eed0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1eee0 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70 2d  mUnusable || (p-
1eef0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 28  >fg.jointype & (
1ef00 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1ef10 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
1ef20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71 6c  mUnusable |= sql
1ef30 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
1ef40 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
1ef50 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29 3b  et, p->iCursor);
1ef60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ef70 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68   }.      rc = wh
1ef80 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61  ereLoopAddVirtua
1ef90 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  l(pBuilder, mPre
1efa0 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
1efb0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
1efc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1efd0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1efe0 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
1eff0 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74  = whereLoopAddBt
1f000 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d 50  ree(pBuilder, mP
1f010 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20 20  rereq);.    }.  
1f020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1f040 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1f050 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1f060 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1f070 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f 72      }.    mPrior
1f080 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   |= pNew->maskSe
1f090 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20 7c  lf;.    if( rc |
1f0a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1f0b0 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ed ) break;.  }.
1f0c0 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  .  whereLoopClea
1f0d0 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 72  r(db, pNew);.  r
1f0e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f0f0 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68 65  ** Examine a Whe
1f100 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68 65  rePath (with the
1f110 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
1f120 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f 70   extra WhereLoop
1f130 20 6f 66 20 74 68 65 20 36 74 68 0a 2a 2a 20 70   of the 6th.** p
1f140 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73 65  arameters) to se
1f150 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73 20  e if it outputs 
1f160 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
1f170 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a 2a  ested ORDER BY.*
1f180 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20  * (or GROUP BY) 
1f190 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69 6e  without requirin
1f1a0 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f 72  g a separate sor
1f1b0 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52 65  t operation.  Re
1f1c0 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20 20  turn N:.** .**  
1f1d0 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73 20   N>0:   N terms 
1f1e0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1f1f0 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69 73  clause are satis
1f200 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a 20  fied.**   N==0: 
1f210 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68 65   No terms of the
1f220 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f230 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a   are satisfied.*
1f240 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e 6f  *   N<0:   Unkno
1f250 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79 20  wn yet how many 
1f260 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20 42  terms of ORDER B
1f270 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69 73  Y might be satis
1f280 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20 4e  fied.   .**.** N
1f290 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73 73  ote that process
1f2a0 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47 52  ing for WHERE_GR
1f2b0 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45 5f  OUPBY and WHERE_
1f2c0 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e 6f  DISTINCTBY is no
1f2d0 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e 20  t as.** strict. 
1f2e0 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20 61   With GROUP BY a
1f2f0 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65 20  nd DISTINCT the 
1f300 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e 74  only requirement
1f310 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75 69   is that.** equi
1f320 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70 65  valent rows appe
1f330 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ar immediately a
1f340 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20 61  djacent to one a
1f350 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20 42  nother.  GROUP B
1f360 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e 43  Y.** and DISTINC
1f370 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  T do not require
1f380 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72 20   rows to appear 
1f390 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61  in any particula
1f3a0 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67 0a  r order as long.
1f3b0 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e 74  ** as equivalent
1f3c0 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70 65   rows are groupe
1f3d0 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68 75  d together.  Thu
1f3e0 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20 61  s for GROUP BY a
1f3f0 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 74  nd DISTINCT.** t
1f400 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72 6d  he pOrderBy term
1f410 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65 64  s can be matched
1f420 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20 20   in any order.  
1f430 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20 74  With ORDER BY, t
1f440 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  he .** pOrderBy 
1f450 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d 61  terms must be ma
1f460 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74 20  tched in strict 
1f470 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f 72  left-to-right or
1f480 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1f490 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  8 wherePathSatis
1f4a0 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20 57  fiesOrderBy(.  W
1f4b0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1f4c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52  ,    /* The WHER
1f4d0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
1f4e0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
1f4f0 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ,   /* ORDER BY 
1f500 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 44  or GROUP BY or D
1f510 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 74  ISTINCT clause t
1f520 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68 65  o check */.  Whe
1f530 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 20  rePath *pPath,  
1f540 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 50     /* The WhereP
1f550 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ath to check */.
1f560 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
1f570 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45  ,       /* WHERE
1f580 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49 53  _GROUPBY or _DIS
1f590 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44 45  TINCTBY or _ORDE
1f5a0 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 75  RBY_LIMIT */.  u
1f5b0 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20 20  16 nLoop,       
1f5c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f5d0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50 61  f entries in pPa
1f5e0 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
1f5f0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73   WhereLoop *pLas
1f600 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  t,     /* Add th
1f610 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20  is WhereLoop to 
1f620 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74 68  the end of pPath
1f630 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20 42  ->aLoop[] */.  B
1f640 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73 6b  itmask *pRevMask
1f650 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 73       /* OUT: Mas
1f660 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73 20  k of WhereLoops 
1f670 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72 73  to run in revers
1f680 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20 20  e order */.){.  
1f690 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20 20  u8 revSet;      
1f6a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f6b0 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a 2f   rev is known */
1f6c0 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20 20  .  u8 rev;      
1f6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
1f6e0 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65 72  osite sort order
1f6f0 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78 3b   */.  u8 revIdx;
1f700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f710 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72 20  ndex sort order 
1f720 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72 44  */.  u8 isOrderD
1f730 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41 6c  istinct;   /* Al
1f740 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f 6f  l prior WhereLoo
1f750 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69 73  ps are order-dis
1f760 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64 69  tinct */.  u8 di
1f770 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20 20  stinctColumns;  
1f780 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1f790 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45 20  loop has UNIQUE 
1f7a0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73  NOT NULL columns
1f7b0 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63 68   */.  u8 isMatch
1f7c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  ;           /* i
1f7d0 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20 61  Column matches a
1f7e0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
1f7f0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1f800 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b 20    u16 eqOpMask; 
1f810 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77          /* Allow
1f820 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  ed equality oper
1f830 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20 6e  ators */.  u16 n
1f840 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  KeyCol;         
1f850 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65   /* Number of ke
1f860 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49 6e  y columns in pIn
1f870 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43 6f  dex */.  u16 nCo
1f880 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  lumn;          /
1f890 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1f8a0 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d 6e  f ordered column
1f8b0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a  s in the index *
1f8c0 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42 79  /.  u16 nOrderBy
1f8d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1f8e0 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ber terms in the
1f8f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f900 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70 3b   */.  int iLoop;
1f910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1f920 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f 6f  ndex of WhereLoo
1f930 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e 67  p in pPath being
1f940 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
1f950 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
1f960 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1f970 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
1f980 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20  iCur;           
1f990 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
1f9a0 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20 57  er for current W
1f9b0 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  hereLoop */.  in
1f9c0 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
1f9d0 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
1f9e0 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 61  number within ta
1f9f0 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57 68  ble iCur */.  Wh
1fa00 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20 3d  ereLoop *pLoop =
1fa10 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 57   0; /* Current W
1fa20 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20 70  hereLoop being p
1fa30 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20 57  rocessed. */.  W
1fa40 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
1fa50 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
1fa60 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
1fa70 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
1fa80 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20 20  xpr *pOBExpr;   
1fa90 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72 65       /* An expre
1faa0 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f  ssion from the O
1fab0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1fac0 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  /.  CollSeq *pCo
1fad0 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f 4c  ll;       /* COL
1fae0 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66 72  LATE function fr
1faf0 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  om an ORDER BY c
1fb00 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20  lause term */.  
1fb10 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1fb20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
1fb30 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1fb40 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73 71  th pLoop */.  sq
1fb50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e  lite3 *db = pWIn
1fb60 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 20  fo->pParse->db; 
1fb70 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1fb80 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74  nection */.  Bit
1fb90 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b 20  mask obSat = 0; 
1fba0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f 52     /* Mask of OR
1fbb0 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61 74  DER BY terms sat
1fbc0 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a 2f  isfied so far */
1fbd0 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f 6e  .  Bitmask obDon
1fbe0 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  e;       /* Mask
1fbf0 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59   of all ORDER BY
1fc00 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74 6d   terms */.  Bitm
1fc10 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e 63  ask orderDistinc
1fc20 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b 20  tMask;  /* Mask 
1fc30 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64 65  of all well-orde
1fc40 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 42  red loops */.  B
1fc50 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20 20  itmask ready;   
1fc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1fc70 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70  sk of inner loop
1fc80 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  s */..  /*.  ** 
1fc90 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72 65  We say the Where
1fca0 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f 77  Loop is "one-row
1fcb0 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74 65  " if it generate
1fcc0 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s no more than o
1fcd0 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 6f  ne.  ** row of o
1fce0 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65 4c  utput.  A WhereL
1fcf0 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20 69  oop is one-row i
1fd00 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
1fd10 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1fd20 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20 69  .  **  (a) All i
1fd30 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61 74  ndex columns mat
1fd40 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43 4f  ch with WHERE_CO
1fd50 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20 28  LUMN_EQ..  **  (
1fd60 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  b) The index is 
1fd70 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79 20  unique.  ** Any 
1fd80 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20 61  WhereLoop with a
1fd90 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  n WHERE_COLUMN_E
1fda0 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  Q constraint on 
1fdb0 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e 65  the rowid is one
1fdc0 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72 79  -row..  ** Every
1fdd0 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f   one-row WhereLo
1fde0 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65  op will have the
1fdf0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62 69   WHERE_ONEROW bi
1fe00 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67 73  t set in wsFlags
1fe10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 73  ..  **.  ** We s
1fe20 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  ay the WhereLoop
1fe30 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74 69   is "order-disti
1fe40 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74 20  nct" if the set 
1fe50 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 0a  of columns from.
1fe60 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65 4c    ** that WhereL
1fe70 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e 20  oop that are in 
1fe80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1fe90 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  use are differen
1fea0 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a 2a  t for every.  **
1feb0 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65 72   row of the Wher
1fec0 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f 6e  eLoop.  Every on
1fed0 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70 20  e-row WhereLoop 
1fee0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1fef0 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73 74  .  ** order-dist
1ff00 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65 4c  inct.   A WhereL
1ff10 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f 20  oop that has no 
1ff20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 4f  columns in the O
1ff30 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
1ff40 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65 72   ** is not order
1ff50 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62 65  -distinct. To be
1ff60 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74 20   order-distinct 
1ff70 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68 65  is not quite the
1ff80 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a 20   same as being. 
1ff90 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63 65   ** UNIQUE since
1ffa0 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e   a UNIQUE column
1ffb0 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68 61   or index can ha
1ffc0 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ve multiple rows
1ffd0 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65 20   that .  ** are 
1ffe0 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76 61  NULL and NULL va
1fff0 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61 6c  lues are equival
20000 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72 70  ent for the purp
20010 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69 73  ose of order-dis
20020 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20 62  tinct..  ** To b
20030 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
20040 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d 75  , the columns mu
20050 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e 64  st be UNIQUE and
20060 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a   NOT NULL..  **.
20070 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
20080 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61 6c  or a table is al
20090 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64 20  ways UNIQUE and 
200a0 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65 6e  NOT NULL so when
200b0 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72 6f  ever the.  ** ro
200c0 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20 74  wid appears in t
200d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
200e0 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  se, the correspo
200f0 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20  nding WhereLoop 
20100 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  is.  ** automati
20110 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73 74  cally order-dist
20120 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61 73  inct..  */..  as
20130 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
20140 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f 70  0 );.  if( nLoop
20150 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
20160 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
20170 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
20180 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  in) ) return 0;.
20190 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f  .  nOrderBy = pO
201a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
201b0 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64 65   testcase( nOrde
201c0 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  rBy==BMS-1 );.  
201d0 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d 53  if( nOrderBy>BMS
201e0 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  -1 ) return 0;  
201f0 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d 69  /* Cannot optimi
20200 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65 20  ze overly large 
20210 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20 69  ORDER BYs */.  i
20220 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
20230 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20 4d   1;.  obDone = M
20240 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79 29  ASKBIT(nOrderBy)
20250 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74 69  -1;.  orderDisti
20260 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 72  nctMask = 0;.  r
20270 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f 70  eady = 0;.  eqOp
20280 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20 57  Mask = WO_EQ | W
20290 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c 4c  O_IS | WO_ISNULL
202a0 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61  ;.  if( wctrlFla
202b0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
202c0 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70 4d  BY_LIMIT ) eqOpM
202d0 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20 20  ask |= WO_IN;.  
202e0 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73 4f  for(iLoop=0; isO
202f0 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26 20  rderDistinct && 
20300 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26 20  obSat<obDone && 
20310 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69 4c  iLoop<=nLoop; iL
20320 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  oop++){.    if( 
20330 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79 20  iLoop>0 ) ready 
20340 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65  |= pLoop->maskSe
20350 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f 6f  lf;.    if( iLoo
20360 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20  p<nLoop ){.     
20370 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d 3e   pLoop = pPath->
20380 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20  aLoop[iLoop];.  
20390 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
203a0 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
203b0 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74 69  BY_LIMIT ) conti
203c0 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nue;.    }else{.
203d0 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c        pLoop = pL
203e0 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ast;.    }.    i
203f0 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  f( pLoop->wsFlag
20400 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
20410 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20  LTABLE ){.      
20420 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74 61  if( pLoop->u.vta
20430 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f 62  b.isOrdered ) ob
20440 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20 20  Sat = obDone;.  
20450 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20460 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f 6f  else{.      pLoo
20470 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43  p->u.btree.nIdxC
20480 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
20490 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d    iCur = pWInfo-
204a0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
204b0 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72 73 6f  op->iTab].iCurso
204c0 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b 20  r;..    /* Mark 
204d0 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20 42 59  off any ORDER BY
204e0 20 74 65 72 6d 20 58 20 74 68 61 74 20 69 73 20   term X that is 
204f0 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  a column in the 
20500 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20  table of.    ** 
20510 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70  the current loop
20520 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 72 65   for which there
20530 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68 65 20   is term in the 
20540 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63 6c 61  WHERE.    ** cla
20550 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  use of the form 
20560 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58 3d 3f  X IS NULL or X=?
20570 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
20580 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20 20 2a  only outer.    *
20590 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a 2f 0a  * loops..    */.
205a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
205b0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
205c0 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54       if( MASKBIT
205d0 28 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f  (i) & obSat ) co
205e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4f  ntinue;.      pO
205f0 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  BExpr = sqlite3E
20600 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
20610 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
20620 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
20630 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  pOBExpr->op!=TK_
20640 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75  COLUMN ) continu
20650 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 42  e;.      if( pOB
20660 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43  Expr->iTable!=iC
20670 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
20680 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c       pTerm = sql
20690 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
206a0 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  m(&pWInfo->sWC, 
206b0 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d 3e 69  iCur, pOBExpr->i
206c0 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
206e0 72 65 61 64 79 2c 20 65 71 4f 70 4d 61 73 6b 2c  ready, eqOpMask,
206f0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
20700 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Term==0 ) contin
20710 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ue;.      if( pT
20720 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
20730 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20 20  WO_IN ){.       
20740 20 2f 2a 20 49 4e 20 74 65 72 6d 73 20 61 72 65   /* IN terms are
20750 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
20760 73 6f 72 74 69 6e 67 20 69 6e 20 74 68 65 20 4f  sorting in the O
20770 52 44 45 52 20 42 59 20 4c 49 4d 49 54 20 0a 20  RDER BY LIMIT . 
20780 20 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69         ** optimi
20790 7a 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68 65 6e  zation, and then
207a0 20 6f 6e 6c 79 20 69 66 20 74 68 65 79 20 61 72   only if they ar
207b0 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 0a  e actually used.
207c0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 74 68          ** by th
207d0 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  e query plan */.
207e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
207f0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
20800 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
20810 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
20820 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e 6e 4c  j=0; j<pLoop->nL
20830 54 65 72 6d 20 26 26 20 70 54 65 72 6d 21 3d 70  Term && pTerm!=p
20840 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3b  Loop->aLTerm[j];
20850 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
20860 69 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 4c  if( j>=pLoop->nL
20870 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Term ) continue;
20880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20890 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
208a0 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49  ator&(WO_EQ|WO_I
208b0 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70  S))!=0 && pOBExp
208c0 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b  r->iColumn>=0 ){
208d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
208e0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 4d  ite3ExprCollSeqM
208f0 61 74 63 68 28 70 57 49 6e 66 6f 2d 3e 70 50 61  atch(pWInfo->pPa
20900 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
20910 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
20920 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 54  ->a[i].pExpr, pT
20930 65 72 6d 2d 3e 70 45 78 70 72 29 3d 3d 30 20 29  erm->pExpr)==0 )
20940 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
20950 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
20960 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
20970 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  ( pTerm->pExpr->
20980 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20  op==TK_IS );.   
20990 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61 74     }.      obSat
209a0 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a   |= MASKBIT(i);.
209b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
209c0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
209d0 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d   WHERE_ONEROW)==
209e0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
209f0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
20a00 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20 20  WHERE_IPK ){.   
20a10 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
20a20 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c  .        nKeyCol
20a30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43   = 0;.        nC
20a40 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20 20  olumn = 1;.     
20a50 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e 64   }else if( (pInd
20a60 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  ex = pLoop->u.bt
20a70 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20 7c  ree.pIndex)==0 |
20a80 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64  | pIndex->bUnord
20a90 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ered ){.        
20aa0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
20ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
20ac0 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78 2d  KeyCol = pIndex-
20ad0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
20ae0 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    nColumn = pInd
20af0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
20b00 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
20b10 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31 20  lumn==nKeyCol+1 
20b20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
20b30 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b 0a  dex->pTable) );.
20b40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20b50 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
20b60 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e 5f  [nColumn-1]==XN_
20b70 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20 20  ROWID.          
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49 6e  || !HasRowid(pIn
20ba0 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a 20  dex->pTable));. 
20bb0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
20bc0 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71 75  stinct = IsUniqu
20bd0 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
20be0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
20bf0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
20c00 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
20c10 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61 6c  e index and deal
20c20 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a 20   with the ones. 
20c30 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
20c40 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65 64   not constrained
20c50 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20 20   by == or IN..  
20c60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 76      */.      rev
20c70 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a 20   = revSet = 0;. 
20c80 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f 6c       distinctCol
20c90 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  umns = 0;.      
20ca0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75  for(j=0; j<nColu
20cb0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
20cc0 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b 20    u8 bOnce = 1; 
20cd0 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20 74  /* True to run t
20ce0 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61 72  he ORDER BY sear
20cf0 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20 20  ch loop */..    
20d00 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 70      assert( j>=p
20d10 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  Loop->u.btree.nE
20d20 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  q .            |
20d30 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  | (pLoop->aLTerm
20d40 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f 6f  [j]==0)==(j<pLoo
20d50 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20 20  p->nSkip).      
20d60 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
20d70 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
20d80 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f 6f  e.nEq && j>=pLoo
20d90 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  p->nSkip ){.    
20da0 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d 20        u16 eOp = 
20db0 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d  pLoop->aLTerm[j]
20dc0 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20 20  ->eOperator;..  
20dd0 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
20de0 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20 61  over == and IS a
20df0 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73 2e  nd ISNULL terms.
20e00 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e 20    (Also skip IN 
20e10 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20 20  terms when.     
20e20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57 48       ** doing WH
20e30 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49  ERE_ORDERBY_LIMI
20e40 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20 0a  T processing). .
20e50 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
20e60 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
20e70 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
20e80 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20   a column of an 
20e90 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45 43  ((?,?) IN (SELEC
20ea0 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20 20  T...)) .        
20eb0 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
20ec0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53 45  for which the SE
20ed0 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f 72  LECT returns mor
20ee0 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d  e than one colum
20ef0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  n,.          ** 
20f00 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  check that it is
20f10 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e   the only column
20f20 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c 6f   used by this lo
20f30 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  op. Otherwise,. 
20f40 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69           ** if i
20f50 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f 20  t is one of two 
20f60 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f 66  or more, none of
20f70 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61 6e   the columns can
20f80 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
20f90 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 6d   considered to m
20fa0 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42 59  atch an ORDER BY
20fb0 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 20   term.  */.     
20fc0 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
20fd0 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b 0a  eqOpMask)!=0 ){.
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
20ff0 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
21000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21010 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64   testcase( isOrd
21020 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20  erDistinct );.  
21030 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72              isOr
21040 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  derDistinct = 0;
21050 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21060 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
21070 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20 20  nue;  .         
21080 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
21090 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20 29  S(eOp & WO_IN) )
210a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
210b0 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69 66   ALWAYS() justif
210c0 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73 20  ication: eOp is 
210d0 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65 72  an equality oper
210e0 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65 0a  ator due to the.
210f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6a              ** j
21100 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  <pLoop->u.btree.
21110 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  nEq constraint a
21120 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61 6c  bove.  Any equal
21130 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20 20  ity other.      
21140 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57 4f        ** than WO
21150 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65 64 20  _IN is captured 
21160 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
21170 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20 6f  "if".  So this o
21180 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ne.            *
21190 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f 20  * always has to 
211a0 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20 20  be WO_IN. */.   
211b0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
211c0 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  X = pLoop->aLTer
211d0 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  m[j]->pExpr;.   
211e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a           for(i=j
211f0 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e 62  +1; i<pLoop->u.b
21200 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b 0a  tree.nEq; i++){.
21210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21220 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  ( pLoop->aLTerm[
21230 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29 7b  i]->pExpr==pX ){
21240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21250 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d   assert( (pLoop-
21260 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70 65  >aLTerm[i]->eOpe
21270 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20 29  rator & WO_IN) )
21280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21290 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20    bOnce = 0;.   
212a0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
212b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
212c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
212d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
212e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
212f0 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c 75   /* Get the colu
21300 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  mn number in the
21310 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e 29   table (iColumn)
21320 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72 0a   and sort order.
21330 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76 49          ** (revI
21340 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74 68  dx) for the j-th
21350 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
21360 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ndex..        */
21370 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
21380 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dex ){.         
21390 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65   iColumn = pInde
213a0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
213b0 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64 78            revIdx
213c0 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74   = pIndex->aSort
213d0 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20  Order[j];.      
213e0 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d      if( iColumn=
213f0 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
21400 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d 6e  >iPKey ) iColumn
21410 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
21420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21430 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
21440 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  XN_ROWID;.      
21450 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
21460 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
21470 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
21480 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
21490 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
214a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
214b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
214c0 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
214d0 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
214e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
214f0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
21500 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
21510 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
21520 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
21530 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
21540 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
21550 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
21560 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
21570 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21580 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
21590 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
215a0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
215b0 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
215c0 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
215d0 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
215e0 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
215f0 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
21600 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
21610 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
21620 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
21630 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
21640 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
21650 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
21660 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
21670 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
21680 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
21690 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
216a0 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
216b0 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
216c0 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
216d0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
216e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
216f0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
21700 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
21710 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21720 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
21730 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
21740 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
21750 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
21760 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
21770 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
21780 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
21790 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
217a0 20 69 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52 4f 57   iColumn>=XN_ROW
217b0 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
217c0 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f    if( pOBExpr->o
217d0 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63  p!=TK_COLUMN ) c
217e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
217f0 20 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72       if( pOBExpr
21800 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 29  ->iTable!=iCur )
21810 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21820 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
21830 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
21840 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
21850 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21860 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78  {.            Ex
21870 70 72 20 2a 70 49 64 78 45 78 70 72 20 3d 20 70  pr *pIdxExpr = p
21880 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 2d  Index->aColExpr-
21890 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[j].pExpr;.   
218a0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
218b0 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 53  ite3ExprCompareS
218c0 6b 69 70 28 70 4f 42 45 78 70 72 2c 20 70 49 64  kip(pOBExpr, pId
218d0 78 45 78 70 72 2c 20 69 43 75 72 29 20 29 7b 0a  xExpr, iCur) ){.
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
218f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21910 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
21920 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f 57 49  iColumn!=XN_ROWI
21930 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
21940 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
21950 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 57  ExprNNCollSeq(pW
21960 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20 70 4f  Info->pParse, pO
21970 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
21980 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
21990 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
219a0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  Cmp(pColl->zName
219b0 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  , pIndex->azColl
219c0 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  [j])!=0 ) contin
219d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
219e0 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d            pLoop-
219f0 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c  >u.btree.nIdxCol
21a00 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20   = j+1;.        
21a10 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20    isMatch = 1;. 
21a20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
21a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21a40 20 20 69 66 28 20 69 73 4d 61 74 63 68 20 26 26    if( isMatch &&
21a50 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
21a60 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30  HERE_GROUPBY)==0
21a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
21a80 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
21a90 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d  ort order is com
21aa0 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52  patible in an OR
21ab0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  DER BY clause.. 
21ac0 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74           ** Sort
21ad0 20 6f 72 64 65 72 20 69 73 20 69 72 72 65 6c 65   order is irrele
21ae0 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50  vant for a GROUP
21af0 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20   BY clause. */. 
21b00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 76           if( rev
21b10 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Set ){.         
21b20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20 72 65     if( (rev ^ re
21b30 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d  vIdx)!=pOrderBy-
21b40 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[i].sortOrder 
21b50 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20  ) isMatch = 0;. 
21b60 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21b70 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76 20              rev 
21b80 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65  = revIdx ^ pOrde
21b90 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
21ba0 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  der;.           
21bb0 20 69 66 28 20 72 65 76 20 29 20 2a 70 52 65 76   if( rev ) *pRev
21bc0 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28  Mask |= MASKBIT(
21bd0 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  iLoop);.        
21be0 20 20 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a      revSet = 1;.
21bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21c00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21c10 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20  ( isMatch ){.   
21c20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75         if( iColu
21c30 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29 7b 0a  mn==XN_ROWID ){.
21c40 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
21c50 63 61 73 65 28 20 64 69 73 74 69 6e 63 74 43 6f  case( distinctCo
21c60 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20 20 20  lumns==0 );.    
21c70 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63 74          distinct
21c80 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 20  Columns = 1;.   
21c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ca0 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53 4b     obSat |= MASK
21cb0 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20 20  BIT(i);.        
21cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21cd0 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66 6f 75   /* No match fou
21ce0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
21cf0 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c 6e 4b  if( j==0 || j<nK
21d00 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  eyCol ){.       
21d10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
21d20 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 21 3d  sOrderDistinct!=
21d30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
21d40 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
21d50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
21d60 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
21d70 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
21d80 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f 6f 70     } /* end Loop
21d90 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65 78 20   over all index 
21da0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
21db0 20 69 66 28 20 64 69 73 74 69 6e 63 74 43 6f 6c   if( distinctCol
21dc0 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20 20 20  umns ){.        
21dd0 74 65 73 74 63 61 73 65 28 20 69 73 4f 72 64 65  testcase( isOrde
21de0 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  rDistinct==0 );.
21df0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
21e00 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 20  istinct = 1;.   
21e10 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 65 6e     }.    } /* en
21e20 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72 6f 77  d-if not one-row
21e30 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b   */..    /* Mark
21e40 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72 20 4f   off any other O
21e50 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
21e60 61 74 20 72 65 66 65 72 65 6e 63 65 20 70 4c 6f  at reference pLo
21e70 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  op */.    if( is
21e80 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 7b  OrderDistinct ){
21e90 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69 73 74  .      orderDist
21ea0 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c 6f 6f  inctMask |= pLoo
21eb0 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20  p->maskSelf;.   
21ec0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
21ed0 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
21ee0 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20        Expr *p;. 
21ef0 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d         Bitmask m
21f00 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
21f10 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f  ( MASKBIT(i) & o
21f20 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bSat ) continue;
21f30 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4f 72  .        p = pOr
21f40 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
21f50 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65 72 6d  r;.        mTerm
21f60 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45   = sqlite3WhereE
21f70 78 70 72 55 73 61 67 65 28 26 70 57 49 6e 66 6f  xprUsage(&pWInfo
21f80 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b 0a 20  ->sMaskSet,p);. 
21f90 20 20 20 20 20 20 20 69 66 28 20 6d 54 65 72 6d         if( mTerm
21fa0 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45  ==0 && !sqlite3E
21fb0 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 29  xprIsConstant(p)
21fc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21fd0 20 20 20 20 20 69 66 28 20 28 6d 54 65 72 6d 26       if( (mTerm&
21fe0 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74 4d 61  ~orderDistinctMa
21ff0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
22000 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
22010 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20 20  KBIT(i);.       
22020 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
22030 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68 65 20  .  } /* End the 
22040 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 57 68  loop over all Wh
22050 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20 6f 75  ereLoops from ou
22060 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20 74 6f  ter-most down to
22070 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f 0a 20   inner-most */. 
22080 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62 44 6f   if( obSat==obDo
22090 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69 38 29  ne ) return (i8)
220a0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
220b0 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74  !isOrderDistinct
220c0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4f   ){.    for(i=nO
220d0 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b 20 69  rderBy-1; i>0; i
220e0 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
220f0 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54 28 69  sk m = MASKBIT(i
22100 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  ) - 1;.      if(
22110 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20 29 20   (obSat&m)==m ) 
22120 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 7d 0a  return i;.    }.
22130 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22140 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
22150 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
22160 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c  WHERE_GROUPBY fl
22170 61 67 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  ag is set in the
22180 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74 6f 20   mask passed to 
22190 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
221a0 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c 61 6e  n(),.** the plan
221b0 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68 61 74  ner assumes that
221c0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
221d0 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69 73 20  OrderBy list is 
221e0 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f 55 50  actually a GROUP
221f0 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20 2d 20  .** BY clause - 
22200 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64 65 72  and so any order
22210 20 74 68 61 74 20 67 72 6f 75 70 73 20 72 6f 77   that groups row
22220 73 20 61 73 20 72 65 71 75 69 72 65 64 20 73 61  s as required sa
22230 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a 20 72  tisfies the.** r
22240 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  equest..**.** No
22250 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69 73 20  rmally, in this 
22260 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
22270 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
22280 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65 72 6d  caller to determ
22290 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  ine.** whether o
222a0 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73 20 61  r not the rows a
222b0 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e 67 20  re really being 
222c0 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73 6f 72  delivered in sor
222d0 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a 2a 2a  ted order, or.**
222e0 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20 6f 74   just in some ot
222f0 68 65 72 20 6f 72 64 65 72 20 74 68 61 74 20 70  her order that p
22300 72 6f 76 69 64 65 73 20 74 68 65 20 72 65 71 75  rovides the requ
22310 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e 20 48  ired grouping. H
22320 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 74 68  owever,.** if th
22330 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52  e WHERE_SORTBYGR
22340 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  OUP flag is also
22350 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
22360 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2c 20  e3WhereBegin(), 
22370 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  then.** this fun
22380 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
22390 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74 75 72  led on the retur
223a0 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20 6f 62  ned WhereInfo ob
223b0 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72 6e 73  ject. It returns
223c0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
223d0 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69 6c 6c  rows really will
223e0 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20 74 68   be sorted in th
223f0 65 20 73 70 65 63 69 66 69 65 64 20 6f 72 64 65  e specified orde
22400 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a 20 6f  r, or false.** o
22410 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
22420 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  For example, ass
22430 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43  uming:.**.**   C
22440 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
22450 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a 0a 2a  N t1(x, Y);.**.*
22460 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20 20 53  * then.**.**   S
22470 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
22480 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f 52 44  GROUP BY x,y ORD
22490 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d 2d 20  ER BY x,y;   -- 
224a0 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a 2a 2a  IsSorted()==1.**
224b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
224c0 20 74 31 20 47 52 4f 55 50 20 42 59 20 79 2c 78   t1 GROUP BY y,x
224d0 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b 20 20   ORDER BY y,x;  
224e0 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d   -- IsSorted()==
224f0 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  0.*/.int sqlite3
22500 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 57 68  WhereIsSorted(Wh
22510 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
22520 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
22530 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22540 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
22550 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
22560 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
22570 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f   WHERE_SORTBYGRO
22580 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  UP );.  return p
22590 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b 0a 7d  WInfo->sorted;.}
225a0 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ..#ifdef WHERETR
225b0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 20 46  ACE_ENABLED./* F
225c0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  or debugging use
225d0 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74 69 63   only: */.static
225e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 68 65   const char *whe
225f0 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65 72 65  rePathName(Where
22600 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69 6e 74  Path *pPath, int
22610 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c 6f 6f   nLoop, WhereLoo
22620 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73 74 61  p *pLast){.  sta
22630 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65 5b 36  tic char zName[6
22640 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  5];.  int i;.  f
22650 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f 70 3b  or(i=0; i<nLoop;
22660 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69 5d 20   i++){ zName[i] 
22670 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69  = pPath->aLoop[i
22680 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66 28 20  ]->cId; }.  if( 
22690 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b 69 2b  pLast ) zName[i+
226a0 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49 64 3b  +] = pLast->cId;
226b0 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20 30 3b  .  zName[i] = 0;
226c0 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
226d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
226e0 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
226f0 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52 6f 77   of sorting nRow
22700 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e 67 20   rows, assuming 
22710 74 68 61 74 20 74 68 65 20 6b 65 79 73 20 68 61  that the keys ha
22720 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62 79 20  ve .** nOrderby 
22730 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 61 74  columns and that
22740 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f 72 74   the first nSort
22750 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61  ed columns are a
22760 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f 72 64  lready in.** ord
22770 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f  er..*/.static Lo
22780 67 45 73 74 20 77 68 65 72 65 53 6f 72 74 69 6e  gEst whereSortin
22790 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65 49 6e  gCost(.  WhereIn
227a0 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 4c 6f  fo *pWInfo,.  Lo
227b0 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69 6e 74  gEst nRow,.  int
227c0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69 6e 74   nOrderBy,.  int
227d0 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20 2f 2a   nSorted.){.  /*
227e0 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d 61 74   TUNING: Estimat
227f0 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66 75 6c  ed cost of a ful
22800 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 2c  l external sort,
22810 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20 20 2a   where N is .  *
22820 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
22830 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69 73 3a  rows to sort is:
22840 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63 6f 73  .  **.  **   cos
22850 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a 20 6c  t = (3.0 * N * l
22860 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a 20 20  og(N))..  ** .  
22870 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 6f 72  ** Or, if the or
22880 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20 68 61  der-by clause ha
22890 73 20 58 20 74 65 72 6d 73 20 62 75 74 20 6f 6e  s X terms but on
228a0 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20 0a 20  ly the last Y . 
228b0 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 6f 75   ** terms are ou
228c0 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68 65 6e  t of order, then
228d0 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67 20 77   block-sorting w
228e0 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65 20 0a  ill reduce the .
228f0 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63 6f 73    ** sorting cos
22900 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
22910 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20    cost = (3.0 * 
22920 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20 28 59  N * log(N)) * (Y
22930 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  /X).  **.  ** Th
22940 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69 73 20  e (Y/X) term is 
22950 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
22960 67 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  g stack variable
22970 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62 65 6c   rScale.  ** bel
22980 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  ow.  */.  LogEst
22990 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74 43 6f   rScale, rSortCo
229a0 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
229b0 72 64 65 72 42 79 3e 30 20 26 26 20 36 36 3d 3d  rderBy>0 && 66==
229c0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
229d0 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65 20 3d  0) );.  rScale =
229e0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
229f0 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74 65 64  nOrderBy-nSorted
22a00 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79 29 20  )*100/nOrderBy) 
22a10 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43 6f 73  - 66;.  rSortCos
22a20 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63 61 6c  t = nRow + rScal
22a30 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20 4d 75  e + 16;..  /* Mu
22a40 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28 4d 29  ltiple by log(M)
22a50 20 77 68 65 72 65 20 4d 20 69 73 20 74 68 65 20   where M is the 
22a60 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
22a70 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73 65 20   rows..  ** Use 
22a80 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20 4d 20  the LIMIT for M 
22a90 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72  if it is smaller
22aa0 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49 6e 66   */.  if( (pWInf
22ab0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
22ac0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
22ad0 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d 3e 69  !=0 && pWInfo->i
22ae0 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a 20 20  Limit<nRow ){.  
22af0 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66 6f 2d    nRow = pWInfo-
22b00 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  >iLimit;.  }.  r
22b10 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73 74 4c  SortCost += estL
22b20 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65 74 75  og(nRow);.  retu
22b30 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a 7d 0a  rn rSortCost;.}.
22b40 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
22b50 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65 4c 6f   list of WhereLo
22b60 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20 70 57  op objects at pW
22b70 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 74 68  Info->pLoops, th
22b80 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 74  is routine.** at
22b90 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64 20 74  tempts to find t
22ba0 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70  he lowest cost p
22bb0 61 74 68 20 74 68 61 74 20 76 69 73 69 74 73 20  ath that visits 
22bc0 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70 0a 2a  each WhereLoop.*
22bd0 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20 70 61  * once.  This pa
22be0 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61 64 65  th is then loade
22bf0 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49 6e 66  d into the pWInf
22c00 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20 66 69  o->a[].pWLoop fi
22c10 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73 73 75  elds..**.** Assu
22c20 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f 74 61  me that the tota
22c30 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  l number of outp
22c40 75 74 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  ut rows that wil
22c50 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 6f 72  l need to be sor
22c60 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6e  ted.** will be n
22c70 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65 20 31  RowEst (in the 1
22c80 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65 6e 74  0*log2 represent
22c90 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69 67 6e  ation).  Or, ign
22ca0 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a 20 63  ore sorting.** c
22cb0 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73 74 3d  osts if nRowEst=
22cc0 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  =0..**.** Return
22cd0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22ce0 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54 45 5f  ccess or SQLITE_
22cf0 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d 6f 72  NOMEM of a memor
22d00 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  y allocation.** 
22d10 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
22d20 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
22d30 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68 65 72  ePathSolver(Wher
22d40 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 4c  eInfo *pWInfo, L
22d50 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29 7b 0a  ogEst nRowEst){.
22d60 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65 3b 20    int mxChoice; 
22d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22d80 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
22d90 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 70 61   simultaneous pa
22da0 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f 0a 20  ths tracked */. 
22db0 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20 20 20   int nLoop;     
22dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22dd0 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
22de0 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 50   the join */.  P
22df0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
22e00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
22e10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22e20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
22e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22e40 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
22e50 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
22e60 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
22e70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22e80 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20 74 65  nter over the te
22e90 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  rms of the join 
22ea0 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  */.  int ii, jj;
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ec0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
22ed0 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d 20 30  */.  int mxI = 0
22ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22ef0 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20  * Index of next 
22f00 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61 63 65  entry to replace
22f10 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
22f20 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  By;             
22f30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44  /* Number of ORD
22f40 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
22f50 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6d  ms */.  LogEst m
22f60 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 20 20  xCost = 0;      
22f70 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 73    /* Maximum cos
22f80 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
22f90 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ths */.  LogEst 
22fa0 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30 3b 20  mxUnsorted = 0; 
22fb0 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 75 6e     /* Maximum un
22fc0 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 61  sorted cost of a
22fd0 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a 2f 0a   set of path */.
22fe0 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72 6f 6d    int nTo, nFrom
22ff0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
23000 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 65  umber of valid e
23010 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b 5d 20  ntries in aTo[] 
23020 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f 0a 20  and aFrom[] */. 
23030 20 57 68 65 72 65 50 61 74 68 20 2a 61 46 72 6f   WherePath *aFro
23040 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  m;         /* Al
23050 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20 61 74  l nFrom paths at
23060 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 65   the previous le
23070 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
23080 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20 20 20  th *aTo;        
23090 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20 62 65     /* The nTo be
230a0 73 74 20 70 61 74 68 73 20 61 74 20 74 68 65 20  st paths at the 
230b0 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20 2a 2f  current level */
230c0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 46  .  WherePath *pF
230d0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
230e0 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 46  An element of aF
230f0 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20 61 72  rom[] that we ar
23100 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
23110 20 20 57 68 65 72 65 50 61 74 68 20 2a 70 54 6f    WherePath *pTo
23120 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
23130 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 54 6f  n element of aTo
23140 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65 20 77  [] that we are w
23150 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 57  orking on */.  W
23160 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f 6f 70  hereLoop *pWLoop
23170 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
23180 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70  of the WhereLoop
23190 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 57 68   objects */.  Wh
231a0 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20 20 20  ereLoop **pX;   
231b0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
231c0 74 6f 20 64 69 76 79 20 75 70 20 74 68 65 20 70  to divy up the p
231d0 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  Space memory */.
231e0 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72 74 43    LogEst *aSortC
231f0 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53  ost = 0;    /* S
23200 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72 74 69  orting and parti
23210 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73 74 73  al sorting costs
23220 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
23230 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
23240 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d 65 6d  /* Temporary mem
23250 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 69 73  ory used by this
23260 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e   routine */.  in
23270 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20 20 20  t nSpace;       
23280 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
23290 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
232a0 74 65 64 20 61 74 20 70 53 70 61 63 65 20 2a 2f  ted at pSpace */
232b0 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 49  ..  pParse = pWI
232c0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  nfo->pParse;.  d
232d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
232e0 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    nLoop = pWInfo
232f0 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a 20 54  ->nLevel;.  /* T
23300 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d 70 6c  UNING: For simpl
23310 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c 79 20  e queries, only 
23320 74 68 65 20 62 65 73 74 20 70 61 74 68 20 69 73  the best path is
23330 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a 20 46   tracked..  ** F
23340 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73 2c 20  or 2-way joins, 
23350 74 68 65 20 35 20 62 65 73 74 20 70 61 74 68 73  the 5 best paths
23360 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e 0a 20   are followed.. 
23370 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20 6f 66   ** For joins of
23380 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62 6c 65   3 or more table
23390 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31 30 20  s, track the 10 
233a0 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a 20 20  best paths */.  
233b0 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c 6f 6f  mxChoice = (nLoo
233c0 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e 4c 6f  p<=1) ? 1 : (nLo
233d0 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30 29 3b  op==2 ? 5 : 10);
233e0 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 70  .  assert( nLoop
233f0 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  <=pWInfo->pTabLi
23400 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 57 48  st->nSrc );.  WH
23410 45 52 45 54 52 41 43 45 28 30 78 30 30 32 2c 20  ERETRACE(0x002, 
23420 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73 6f 6c  ("---- begin sol
23430 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74 3d 25  ver.  (nRowEst=%
23440 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  d)\n", nRowEst))
23450 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f 77 45  ;..  /* If nRowE
23460 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74  st is zero and t
23470 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
23480 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67 6e 6f   BY clause, igno
23490 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73 0a 20  re it. In this. 
234a0 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70 75 72   ** case the pur
234b0 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
234c0 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61 74 65  l is to estimate
234d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
234e0 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20 20 2a  ows returned.  *
234f0 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61 6c 6c  * by the overall
23500 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74 68 69   query. Once thi
23510 73 20 65 73 74 69 6d 61 74 65 20 68 61 73 20 62  s estimate has b
23520 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
23530 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20 77 69  e caller.  ** wi
23540 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 66  ll invoke this f
23550 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f 6e 64  unction a second
23560 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67 20 74   time, passing t
23570 68 65 20 65 73 74 69 6d 61 74 65 20 61 73 20 74  he estimate as t
23580 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73 74 20  he.  ** nRowEst 
23590 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f 0a 20  parameter.  */. 
235a0 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
235b0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52 6f 77  derBy==0 || nRow
235c0 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  Est==0 ){.    nO
235d0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 65  rderBy = 0;.  }e
235e0 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65 72 42  lse{.    nOrderB
235f0 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  y = pWInfo->pOrd
23600 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d  erBy->nExpr;.  }
23610 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
23620 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  and initialize s
23630 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20 61 46  pace for aTo, aF
23640 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43 6f 73  rom and aSortCos
23650 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63 65 20  t[] */.  nSpace 
23660 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72 65 50  = (sizeof(WhereP
23670 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68 65 72  ath)+sizeof(Wher
23680 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29 2a 6d  eLoop*)*nLoop)*m
23690 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e 53 70  xChoice*2;.  nSp
236a0 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f  ace += sizeof(Lo
236b0 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79  gEst) * nOrderBy
236c0 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73 71 6c  ;.  pSpace = sql
236d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
236e0 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b 0a 20  N(db, nSpace);. 
236f0 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30 20 29   if( pSpace==0 )
23700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23710 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61 54 6f  OMEM_BKPT;.  aTo
23720 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a 29 70   = (WherePath*)p
23730 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d 20 3d  Space;.  aFrom =
23740 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b 0a 20   aTo+mxChoice;. 
23750 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c 20 30   memset(aFrom, 0
23760 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d 5b 30  , sizeof(aFrom[0
23770 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57 68 65  ]));.  pX = (Whe
23780 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f 6d 2b  reLoop**)(aFrom+
23790 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66 6f 72  mxChoice);.  for
237a0 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32 2c 20  (ii=mxChoice*2, 
237b0 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e 30 3b  pFrom=aTo; ii>0;
237c0 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b 2c 20   ii--, pFrom++, 
237d0 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a 20 20  pX += nLoop){.  
237e0 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 20 3d    pFrom->aLoop =
237f0 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   pX;.  }.  if( n
23800 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2f  OrderBy ){.    /
23810 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
23820 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23830 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 62   and it is not b
23840 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20 73 65  eing ignored, se
23850 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70 61 63  t up.    ** spac
23860 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72 74 43  e for the aSortC
23870 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45 61 63  ost[] array. Eac
23880 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
23890 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72 61 79   aSortCost array
238a0 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65  .    ** is eithe
238b0 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69 6e 67  r zero - meaning
238c0 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20   it has not yet 
238d0 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  been initialized
238e0 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a   - or the.    **
238f0 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
23900 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20 6f 66   nRowEst rows of
23910 20 64 61 74 61 20 77 68 65 72 65 20 74 68 65 20   data where the 
23920 66 69 72 73 74 20 58 20 74 65 72 6d 73 20 6f 66  first X terms of
23930 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45  .    ** the ORDE
23940 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
23950 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64 65 72  already in order
23960 2c 20 77 68 65 72 65 20 58 20 69 73 20 74 68 65  , where X is the
23970 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a 20 69   array .    ** i
23980 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 61 53  ndex.  */.    aS
23990 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67 45 73  ortCost = (LogEs
239a0 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d 73 65  t*)pX;.    memse
239b0 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30 2c 20  t(aSortCost, 0, 
239c0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a  sizeof(LogEst) *
239d0 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a   nOrderBy);.  }.
239e0 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
239f0 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost==0 || &pSpac
23a00 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
23a10 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e 4f 72  *)&aSortCost[nOr
23a20 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73 73 65  derBy] );.  asse
23a30 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21 3d 30  rt( aSortCost!=0
23a40 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53 70 61   || &pSpace[nSpa
23a50 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58 20 29  ce]==(char*)pX )
23a60 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74 68 65  ;..  /* Seed the
23a70 20 73 65 61 72 63 68 20 77 69 74 68 20 61 20 73   search with a s
23a80 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74 68 20  ingle WherePath 
23a90 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
23aa0 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20 2a 2a  WhereLoops..  **
23ab0 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20 44 6f  .  ** TUNING: Do
23ac0 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e 75 6d   not let the num
23ad0 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
23ae0 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e 20 20  s go above 28.  
23af0 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20 2a 2a  If the cost.  **
23b00 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
23b10 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
23b20 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62 61 63   is not paid bac
23b30 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  k within the fir
23b40 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77 73 2c  st 28.  ** rows,
23b50 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75 73 65   then do not use
23b60 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
23b70 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72 6f 6d  ndex. */.  aFrom
23b80 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e 28 70  [0].nRow = MIN(p
23b90 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
23ba0 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72 74 28  p, 48);  assert(
23bb0 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   48==sqlite3LogE
23bc0 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46 72 6f  st(28) );.  nFro
23bd0 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  m = 1;.  assert(
23be0 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65   aFrom[0].isOrde
23bf0 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  red==0 );.  if( 
23c00 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
23c10 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73 20 7a  /* If nLoop is z
23c20 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ero, then there 
23c30 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65 72 6d  are no FROM term
23c40 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  s in the query. 
23c50 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69 6e 20  Since.    ** in 
23c60 74 68 69 73 20 63 61 73 65 20 74 68 65 20 71 75  this case the qu
23c70 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e 20 61  ery may return a
23c80 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   maximum of one 
23c90 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c 74 73  row, the results
23ca0 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c 72 65  .    ** are alre
23cb0 61 64 79 20 69 6e 20 74 68 65 20 72 65 71 75 65  ady in the reque
23cc0 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65 74 20  sted order. Set 
23cd0 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e 4f 72  isOrdered to nOr
23ce0 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a 2a 20  derBy to.    ** 
23cf0 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e 20 4f  indicate this. O
23d00 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73 20 67  r, if nLoop is g
23d10 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
23d20 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65 64 20  , set isOrdered 
23d30 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20 69 6e  to.    ** -1, in
23d40 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68  dicating that th
23d50 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d 61 79  e result set may
23d60 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
23d70 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a 2a 20  rdered, .    ** 
23d80 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
23d90 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74 6f 20   loops added to 
23da0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c 61 6e  the current plan
23db0 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f 6d 5b  .  */.    aFrom[
23dc0 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 6e  0].isOrdered = n
23dd0 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20 6e 4f  Loop>0 ? -1 : nO
23de0 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20 20 2f  rderBy;.  }..  /
23df0 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63 65 73  * Compute succes
23e00 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20 57 68  sively longer Wh
23e10 65 72 65 50 61 74 68 73 20 75 73 69 6e 67 20 74  erePaths using t
23e20 68 65 20 70 72 65 76 69 6f 75 73 20 67 65 6e 65  he previous gene
23e30 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66 20 57  ration.  ** of W
23e40 68 65 72 65 50 61 74 68 73 20 61 73 20 74 68 65  herePaths as the
23e50 20 62 61 73 69 73 20 66 6f 72 20 74 68 65 20 6e   basis for the n
23e60 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61 63 6b  ext.  Keep track
23e70 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65   of the mxChoice
23e80 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74 68 73  .  ** best paths
23e90 20 61 74 20 65 61 63 68 20 67 65 6e 65 72 61 74   at each generat
23ea0 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  ion */.  for(iLo
23eb0 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
23ec0 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
23ed0 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20 66 6f   nTo = 0;.    fo
23ee0 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d 61 46  r(ii=0, pFrom=aF
23ef0 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20 69  rom; ii<nFrom; i
23f00 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
23f10 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f 70 3d       for(pWLoop=
23f20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 20  pWInfo->pLoops; 
23f30 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70 3d 70  pWLoop; pWLoop=p
23f40 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70  WLoop->pNextLoop
23f50 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73  ){.        LogEs
23f60 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20 20 20  t nOut;         
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23f80 52 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  Rows visited by 
23f90 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a  (pFrom+pWLoop) *
23fa0 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74  /.        LogEst
23fb0 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20   rCost;         
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
23fd0 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70 46 72  ost of path (pFr
23fe0 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
23ff0 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72 55 6e        LogEst rUn
24000 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  sorted;         
24010 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 6f 72          /* Unsor
24020 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70 46 72  ted cost of (pFr
24030 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20  om+pWLoop) */.  
24040 20 20 20 20 20 20 69 38 20 69 73 4f 72 64 65 72        i8 isOrder
24050 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  ed = pFrom->isOr
24060 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f 72 64  dered;  /* isOrd
24070 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f 6d 2b  ered for (pFrom+
24080 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20  pWLoop) */.     
24090 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 4e     Bitmask maskN
240a0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
240b0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
240c0 73 72 63 20 76 69 73 69 74 65 64 20 62 79 20 28  src visited by (
240d0 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 42  ..) */.        B
240e0 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b 20 3d  itmask revMask =
240f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24100 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65 76 2d   /* Mask of rev-
24110 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f 72 20  order loops for 
24120 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20  (..) */..       
24130 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 70 72   if( (pWLoop->pr
24140 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d 3e 6d  ereq & ~pFrom->m
24150 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
24160 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
24170 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d 61 73  if( (pWLoop->mas
24180 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d 3e 6d  kSelf & pFrom->m
24190 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20 63 6f  askLoop)!=0 ) co
241a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
241b0 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77 73 46  if( (pWLoop->wsF
241c0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
241d0 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70  O_INDEX)!=0 && p
241e0 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20 29 7b  From->nRow<10 ){
241f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
24200 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75 74 6f   not use an auto
24210 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66 20 74  matic index if t
24220 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  he this loop is 
24230 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20  expected.       
24240 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c 65 73     ** to run les
24250 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73 2e 20  s than 2 times. 
24260 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
24270 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
24280 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
24290 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
242a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
242b0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
242c0 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73 20 61  int, pWLoop is a
242d0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
242e0 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70 2e 20   the next loop. 
242f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f 6d 70  .        ** Comp
24300 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a 2f 0a  ute its cost */.
24310 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
24320 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  d = sqlite3LogEs
24330 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72 53 65  tAdd(pWLoop->rSe
24340 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52 75 6e  tup,pWLoop->rRun
24350 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 29 3b   + pFrom->nRow);
24360 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74  .        rUnsort
24370 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ed = sqlite3LogE
24380 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65 64 2c  stAdd(rUnsorted,
24390 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72 74 65   pFrom->rUnsorte
243a0 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  d);.        nOut
243b0 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 20 2b   = pFrom->nRow +
243c0 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20   pWLoop->nOut;. 
243d0 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77 20 3d         maskNew =
243e0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
243f0 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
24400 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  elf;.        if(
24410 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29 7b 0a   isOrdered<0 ){.
24420 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65            isOrde
24430 72 65 64 20 3d 20 77 68 65 72 65 50 61 74 68 53  red = wherePathS
24440 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28  atisfiesOrderBy(
24450 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  pWInfo,.        
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
24470 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c  WInfo->pOrderBy,
24480 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f 2d 3e   pFrom, pWInfo->
24490 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20 20 20  wctrlFlags,.    
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244b0 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70     iLoop, pWLoop
244c0 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  , &revMask);.   
244d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
244e0 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20 3d 20        revMask = 
244f0 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a  pFrom->revLoop;.
24500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24510 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64 3e    if( isOrdered>
24520 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65 64 3c  =0 && isOrdered<
24530 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  nOrderBy ){.    
24540 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 43        if( aSortC
24550 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 3d 3d  ost[isOrdered]==
24560 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24570 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64   aSortCost[isOrd
24580 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53 6f 72  ered] = whereSor
24590 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20 20 20  tingCost(.      
245a0 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
245b0 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72 64 65  , nRowEst, nOrde
245c0 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64 0a 20  rBy, isOrdered. 
245d0 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
245e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
245f0 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71 6c 69      rCost = sqli
24600 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e  te3LogEstAdd(rUn
24610 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43 6f 73  sorted, aSortCos
24620 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b 0a 0a  t[isOrdered]);..
24630 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54            WHERET
24640 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20 20 20  RACE(0x002,.    
24650 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d 2d 2d            ("----
24660 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33 64 20   sort cost=%-3d 
24670 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61 73 65  (%d/%d) increase
24680 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20 25 2d  s cost %3d to %-
24690 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3d\n",.         
246a0 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74 5b        aSortCost[
246b0 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e 4f 72  isOrdered], (nOr
246c0 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65 64 29  derBy-isOrdered)
246d0 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20 20 20  , nOrderBy, .   
246e0 20 20 20 20 20 20 20 20 20 20 20 20 72 55 6e 73              rUns
246f0 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29 3b 0a  orted, rCost));.
24700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24710 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20 3d           rCost =
24720 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20 20   rUnsorted;.    
24730 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65 64 20        rUnsorted 
24740 2d 3d 20 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47  -= 2;  /* TUNING
24750 3a 20 20 53 6c 69 67 68 74 20 62 69 61 73 20 69  :  Slight bias i
24760 6e 20 66 61 76 6f 72 20 6f 66 20 6e 6f 2d 73 6f  n favor of no-so
24770 72 74 20 70 6c 61 6e 73 20 2a 2f 0a 20 20 20 20  rt plans */.    
24780 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
24790 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
247a0 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c 64 20  f pWLoop should 
247b0 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
247c0 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  set of.        *
247d0 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73 74 2d  * mxChoice best-
247e0 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a 20 20  so-far paths..  
247f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
24800 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b 20 66   ** First look f
24810 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  or an existing p
24820 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74 2d 73  ath among best-s
24830 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20 20 20  o-far paths.    
24840 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 76 65      ** that cove
24850 72 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  rs the same set 
24860 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61 73  of loops and has
24870 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64 65   the same isOrde
24880 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  red.        ** s
24890 65 74 74 69 6e 67 20 61 73 20 74 68 65 20 63 75  etting as the cu
248a0 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e 64 69  rrent path candi
248b0 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  date..        **
248c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
248d0 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69 73 4f  term "((pTo->isO
248e0 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64  rdered^isOrdered
248f0 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73 20 65  )&0x80)==0" is e
24900 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
24910 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e 69 73    ** to (pTo->is
24920 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29 3d 3d  Ordered==(-1))==
24930 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29  (isOrdered==(-1)
24940 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e 67 65  )" for the range
24950 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6c  .        ** of l
24960 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20  egal values for 
24970 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e 2e 36  isOrdered, -1..6
24980 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  4..        */.  
24990 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 2c 20        for(jj=0, 
249a0 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54 6f 3b  pTo=aTo; jj<nTo;
249b0 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   jj++, pTo++){. 
249c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f           if( pTo
249d0 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61 73 6b  ->maskLoop==mask
249e0 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20 20 26  New.           &
249f0 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72  & ((pTo->isOrder
24a00 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26 30 78  ed^isOrdered)&0x
24a10 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  80)==0.         
24a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24a30 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d 6e 54  testcase( jj==nT
24a40 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  o-1 );.         
24a50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24a60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24a70 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 3d          if( jj>=
24a80 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nTo ){.         
24a90 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20   /* None of the 
24aa0 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d 73 6f  existing best-so
24ab0 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74 63 68  -far paths match
24ac0 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 2e 20   the candidate. 
24ad0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
24ae0 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65 0a 20   nTo>=mxChoice. 
24af0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 43            && (rC
24b00 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20 28 72  ost>mxCost || (r
24b10 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26 26 20  Cost==mxCost && 
24b20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55 6e 73  rUnsorted>=mxUns
24b30 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20 20 20  orted)).        
24b40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
24b50 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
24b60 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e 6f 20  candidate is no 
24b70 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e 79 20  better than any 
24b80 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63 65 0a  of the mxChoice.
24b90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
24ba0 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79 20 69  aths currently i
24bb0 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d 66 61  n the best-so-fa
24bc0 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20 64 69  r buffer.  So di
24bd0 73 63 61 72 64 0a 20 20 20 20 20 20 20 20 20 20  scard.          
24be0 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64 69 64    ** this candid
24bf0 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61 62 6c  ate as not viabl
24c00 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
24c10 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
24c20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
24c30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
24c40 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
24c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24c60 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
24c70 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73 20 63  ntf("Skip   %s c
24c80 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64  ost=%-3d,%3d,%3d
24c90 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20   order=%c\n",.  
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cb0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
24cc0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
24cd0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
24ce0 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20  , rUnsorted,.   
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
24d00 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
24d10 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
24d20 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
24d30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
24d40 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
24d50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24d60 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65       /* If we re
24d70 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ach this points 
24d80 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
24d90 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74 65 20  e new candidate 
24da0 70 61 74 68 0a 20 20 20 20 20 20 20 20 20 20 2a  path.          *
24db0 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  * needs to be ad
24dc0 64 65 64 20 74 6f 20 74 68 65 20 73 65 74 20 6f  ded to the set o
24dd0 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61  f best-so-far pa
24de0 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ths. */.        
24df0 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68 6f 69    if( nTo<mxChoi
24e00 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
24e10 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68    /* Increase th
24e20 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 54  e size of the aT
24e30 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a 2f 0a  o set by one */.
24e40 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
24e50 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20   nTo++;.        
24e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24e70 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 74 68       /* New path
24e80 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 70 72   replaces the pr
24e90 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b 65 65  ior worst to kee
24ea0 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 6d 78  p count below mx
24eb0 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20 20 20  Choice */.      
24ec0 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49 3b 0a        jj = mxI;.
24ed0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24ee0 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61 54 6f        pTo = &aTo
24ef0 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57 48 45  [jj];.#ifdef WHE
24f00 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
24f10 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
24f20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
24f30 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
24f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
24f50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24f60 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73 74 3d  "New    %s cost=
24f70 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
24f80 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  er=%c\n",.      
24f90 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
24fa0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
24fb0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
24fc0 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
24fd0 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
24fe0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
24ff0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
25000 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
25010 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25020 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25030 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72          /* Contr
25040 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65 20  ol reaches here 
25050 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70  if best-so-far p
25060 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a 5d 20  ath pTo=aTo[jj] 
25070 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20 20 20  covers the.     
25080 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 74       ** same set
25090 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68 61   of loops and ha
250a0 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72 64  s the same isOrd
250b0 65 72 65 64 20 73 65 74 74 69 6e 67 20 61 73 20  ered setting as 
250c0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
250d0 20 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 2e   candidate path.
250e0 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
250f0 66 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  f the candidate 
25100 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65 0a 20  should replace. 
25110 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f 20           ** pTo 
25120 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  or if the candid
25130 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20 73 6b  ate should be sk
25140 69 70 70 65 64 2e 0a 20 20 20 20 20 20 20 20 20  ipped..         
25150 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a   ** .          *
25160 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  * The conditiona
25170 6c 20 69 73 20 61 6e 20 65 78 70 61 6e 64 65 64  l is an expanded
25180 20 76 65 63 74 6f 72 20 63 6f 6d 70 61 72 69 73   vector comparis
25190 6f 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  on equivalent to
251a0 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
251b0 20 28 70 54 6f 2d 3e 72 43 6f 73 74 2c 70 54 6f   (pTo->rCost,pTo
251c0 2d 3e 6e 52 6f 77 2c 70 54 6f 2d 3e 72 55 6e 73  ->nRow,pTo->rUns
251d0 6f 72 74 65 64 29 20 3c 3d 20 28 72 43 6f 73 74  orted) <= (rCost
251e0 2c 6e 4f 75 74 2c 72 55 6e 73 6f 72 74 65 64 29  ,nOut,rUnsorted)
251f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
25200 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
25210 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 0a 20 20  >rCost<rCost .  
25220 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 6f           || (pTo
25230 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 0a 20  ->rCost==rCost. 
25240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
25250 20 28 70 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f 75 74   (pTo->nRow<nOut
25260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25270 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 6e 52 6f      || (pTo->nRo
25280 77 3d 3d 6e 4f 75 74 20 26 26 20 70 54 6f 2d 3e  w==nOut && pTo->
25290 72 55 6e 73 6f 72 74 65 64 3c 3d 72 55 6e 73 6f  rUnsorted<=rUnso
252a0 72 74 65 64 29 0a 20 20 20 20 20 20 20 20 20 20  rted).          
252b0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
252c0 20 20 20 20 20 20 20 20 29 0a 20 20 20 20 20 20          ).      
252d0 20 20 20 20 29 7b 0a 23 69 66 64 65 66 20 57 48      ){.#ifdef WH
252e0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
252f0 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
25300 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
25310 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34  e3WhereTrace&0x4
25320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25330 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
25340 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
25350 20 20 20 20 20 20 20 20 22 53 6b 69 70 20 20 20          "Skip   
25360 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
25370 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  ,%3d order=%c",.
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
253a0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
253b0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
253c0 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
253f0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
25400 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
25410 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25420 50 72 69 6e 74 66 28 22 20 20 20 76 73 20 25 73  Printf("   vs %s
25430 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
25440 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
25470 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
25480 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
25490 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
254a0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
254b0 72 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e  rUnsorted, pTo->
254c0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
254d0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
254e0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
254f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
25500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
25510 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69 64  scard the candid
25520 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66 75  ate path from fu
25530 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74  rther considerat
25540 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
25550 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 6f     testcase( pTo
25560 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20 29  ->rCost==rCost )
25570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
25580 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
25590 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
255a0 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43 6f  stcase( pTo->rCo
255b0 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a 20  st==rCost+1 );. 
255c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
255d0 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72 65  rol reaches here
255e0 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
255f0 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65 72  e path is better
25600 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20 20   than the.      
25610 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68 2e      ** pTo path.
25620 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77 69    Replace pTo wi
25630 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  th the candidate
25640 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45 52  . */.#ifdef WHER
25650 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f  ETRACE_ENABLED /
25660 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20 20  * 0x4 */.       
25670 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
25680 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b 0a  ereTrace&0x4 ){.
25690 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
256a0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74 3d  "Update %s cost=
256d0 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64  %-3d,%3d,%3d ord
256e0 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20  er=%c",.        
256f0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
25700 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
25710 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
25720 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72  st, nOut, rUnsor
25730 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
25740 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
25750 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
25760 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
25770 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
25780 75 67 50 72 69 6e 74 66 28 22 20 20 77 61 73 20  ugPrintf("  was 
25790 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
257a0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
257b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
257c0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
257d0 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29  pTo, iLoop+1, 0)
257e0 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54  , pTo->rCost, pT
257f0 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  o->nRow,.       
25800 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55           pTo->rU
25810 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e 69 73  nsorted, pTo->is
25820 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f  Ordered>=0 ? pTo
25830 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ->isOrdered+'0' 
25840 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
25850 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
25860 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20     }.        /* 
25870 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e  pWLoop is a winn
25880 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74  er.  Add it to t
25890 68 65 20 73 65 74 20 6f 66 20 62 65 73 74 20 73  he set of best s
258a0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
258b0 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d   pTo->maskLoop =
258c0 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70   pFrom->maskLoop
258d0 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   | pWLoop->maskS
258e0 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  elf;.        pTo
258f0 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d  ->revLoop = revM
25900 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ask;.        pTo
25910 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20  ->nRow = nOut;. 
25920 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73         pTo->rCos
25930 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20  t = rCost;.     
25940 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65     pTo->rUnsorte
25950 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20  d = rUnsorted;. 
25960 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
25970 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65  dered = isOrdere
25980 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  d;.        memcp
25990 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46  y(pTo->aLoop, pF
259a0 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65  rom->aLoop, size
259b0 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69  of(WhereLoop*)*i
259c0 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70  Loop);.        p
259d0 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  To->aLoop[iLoop]
259e0 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20   = pWLoop;.     
259f0 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
25a00 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
25a10 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20    mxI = 0;.     
25a20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54       mxCost = aT
25a30 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20  o[0].rCost;.    
25a40 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64        mxUnsorted
25a50 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a   = aTo[0].nRow;.
25a60 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a            for(jj
25a70 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b  =1, pTo=&aTo[1];
25a80 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a   jj<mxChoice; jj
25a90 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20  ++, pTo++){.    
25aa0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
25ab0 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20  >rCost>mxCost . 
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
25ad0 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f  pTo->rCost==mxCo
25ae0 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f  st && pTo->rUnso
25af0 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29  rted>mxUnsorted)
25b00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
25b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
25b20 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f  xCost = pTo->rCo
25b30 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
25b40 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70    mxUnsorted = p
25b50 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20  To->rUnsorted;. 
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 49               mxI
25b70 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20   = jj;.         
25b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
25b90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25ba0 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
25bb0 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
25bc0 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20  LED  /* >=2 */. 
25bd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
25be0 65 72 65 54 72 61 63 65 20 26 20 30 78 30 32 20  ereTrace & 0x02 
25bf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
25c00 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d  DebugPrintf("---
25c10 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64  - after round %d
25c20 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29   ----\n", iLoop)
25c30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
25c40 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54  , pTo=aTo; ii<nT
25c50 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; ii++, pTo++){
25c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25c70 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 25 73  DebugPrintf(" %s
25c80 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d   cost=%-3d nrow=
25c90 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a  %-3d order=%c",.
25ca0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
25cb0 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c  PathName(pTo, iL
25cc0 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e  oop+1, 0), pTo->
25cd0 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77  rCost, pTo->nRow
25ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 6f  ,.           pTo
25cf0 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
25d00 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64   (pTo->isOrdered
25d10 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20  +'0') : '?');.  
25d20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69        if( pTo->i
25d30 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20  sOrdered>0 ){.  
25d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25d50 65 62 75 67 50 72 69 6e 74 66 28 22 20 72 65 76  ebugPrintf(" rev
25d60 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d  =0x%llx\n", pTo-
25d70 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  >revLoop);.     
25d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25d90 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
25da0 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
25db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25dc0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
25dd0 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f    /* Swap the ro
25de0 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64  les of aFrom and
25df0 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78   aTo for the nex
25e00 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  t generation */.
25e10 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b      pFrom = aTo;
25e20 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d  .    aTo = aFrom
25e30 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46  ;.    aFrom = pF
25e40 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d  rom;.    nFrom =
25e50 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   nTo;.  }..  if(
25e60 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20   nFrom==0 ){.   
25e70 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25e80 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65  (pParse, "no que
25e90 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20  ry solution");. 
25ea0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
25eb0 4e 4e 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a  NN(db, pSpace);.
25ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25ed0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
25ee0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 6f    /* Find the lo
25ef0 77 65 73 74 20 63 6f 73 74 20 70 61 74 68 2e 20  west cost path. 
25f00 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65 20 6c   pFrom will be l
25f10 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
25f20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20 20 70  that path */.  p
25f30 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a 20 20  From = aFrom;.  
25f40 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 46 72  for(ii=1; ii<nFr
25f50 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  om; ii++){.    i
25f60 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e  f( pFrom->rCost>
25f70 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73 74 20  aFrom[ii].rCost 
25f80 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72 6f 6d  ) pFrom = &aFrom
25f90 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  [ii];.  }.  asse
25fa0 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  rt( pWInfo->nLev
25fb0 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f  el==nLoop );.  /
25fc0 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77 65 73  * Load the lowes
25fd0 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e 74 6f  t cost path into
25fe0 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72   pWInfo */.  for
25ff0 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c  (iLoop=0; iLoop<
26000 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b  nLoop; iLoop++){
26010 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20  .    WhereLevel 
26020 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f  *pLevel = pWInfo
26030 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20  ->a + iLoop;.   
26040 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20   pLevel->pWLoop 
26050 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d  = pWLoop = pFrom
26060 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
26070 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f      pLevel->iFro
26080 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54 61 62  m = pWLoop->iTab
26090 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54  ;.    pLevel->iT
260a0 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f 2d 3e  abCur = pWInfo->
260b0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
260c0 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75 72 73  el->iFrom].iCurs
260d0 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  or;.  }.  if( (p
260e0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
260f0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
26100 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20 20 26  ISTINCT)!=0.   &
26110 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  & (pWInfo->wctrl
26120 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
26130 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20 20 20  STINCTBY)==0.   
26140 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  && pWInfo->eDist
26150 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49 53 54  inct==WHERE_DIST
26160 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26 26 20  INCT_NOOP.   && 
26170 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20 20 20  nRowEst.  ){.   
26180 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73 65 64   Bitmask notUsed
26190 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77  ;.    int rc = w
261a0 68 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65  herePathSatisfie
261b0 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c  sOrderBy(pWInfo,
261c0 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75 6c 74   pWInfo->pResult
261d0 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20  Set, pFrom,.    
261e0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
261f0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e  RE_DISTINCTBY, n
26200 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61  Loop-1, pFrom->a
26210 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26  Loop[nLoop-1], &
26220 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
26230 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 52  ( rc==pWInfo->pR
26240 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70 72 20  esultSet->nExpr 
26250 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
26260 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
26270 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
26280 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RED;.    }.  }. 
26290 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
262a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
262b0 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
262c0 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
262d0 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
262e0 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
262f0 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ered==pWInfo->pO
26300 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
26310 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
26320 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
26330 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
26340 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RED;.      }.   
26350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
26360 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
26370 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
26380 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
26390 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
263a0 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  revLoop;.      i
263b0 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
263c0 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t<=0 ){.        
263d0 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
263e0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
263f0 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20  nLoop>0 ){.     
26400 20 20 20 20 20 75 33 32 20 77 73 46 6c 61 67 73       u32 wsFlags
26410 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b   = pFrom->aLoop[
26420 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46 6c 61 67  nLoop-1]->wsFlag
26430 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
26440 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
26450 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 0a 20 20  E_ONEROW)==0 .  
26460 20 20 20 20 20 20 20 20 20 26 26 20 28 77 73 46           && (wsF
26470 6c 61 67 73 26 28 57 48 45 52 45 5f 49 50 4b 7c  lags&(WHERE_IPK|
26480 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
26490 29 21 3d 28 57 48 45 52 45 5f 49 50 4b 7c 57 48  )!=(WHERE_IPK|WH
264a0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 0a 20  ERE_COLUMN_IN). 
264b0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
264c0 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
264d0 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  m = 0;.         
264e0 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72     int rc = wher
264f0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
26500 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
26510 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
26520 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20 20 20  pFrom,.         
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
26540 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  RE_ORDERBY_LIMIT
26550 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d  , nLoop-1, pFrom
26560 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d  ->aLoop[nLoop-1]
26570 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  , &m);.         
26580 20 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46     testcase( wsF
26590 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 50 4b  lags & WHERE_IPK
265a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
265b0 74 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67  testcase( wsFlag
265c0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
265d0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IN );.         
265e0 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e 66     if( rc==pWInf
265f0 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
26600 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
26610 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64      pWInfo->bOrd
26620 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20  eredInnerLoop = 
26630 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
26640 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
26650 20 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 20 20   = m;.          
26660 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
26670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26680 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
26690 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
266a0 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52 54  ags & WHERE_SORT
266b0 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20 20 20  BYGROUP).       
266c0 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53   && pWInfo->nOBS
266d0 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  at==pWInfo->pOrd
266e0 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26 20 6e  erBy->nExpr && n
266f0 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a 20 20  Loop>0.    ){.  
26700 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76 4d      Bitmask revM
26710 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ask = 0;.      i
26720 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68 65 72  nt nOrder = wher
26730 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
26740 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57  derBy(pWInfo, pW
26750 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2c 20  Info->pOrderBy, 
26760 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
26770 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  , 0, nLoop-1, pF
26780 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
26790 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a 20 20  -1], &revMask.  
267a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
267b0 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  ert( pWInfo->sor
267c0 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ted==0 );.      
267d0 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57 49 6e  if( nOrder==pWIn
267e0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
267f0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
26800 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20 3d 20  WInfo->sorted = 
26810 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  1;.        pWInf
26820 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72 65 76  o->revMask = rev
26830 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
26840 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57 49 6e    }.  }...  pWIn
26850 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 70 46  fo->nRowOut = pF
26860 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20 2f 2a  rom->nRow;..  /*
26870 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72 79 20   Free temporary 
26880 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74 75 72  memory and retur
26890 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 73  n success */.  s
268a0 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
268b0 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 72 65  b, pSpace);.  re
268c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
268d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20 71 75  }../*.** Most qu
268e0 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79 20 61  eries use only a
268f0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 28 74   single table (t
26900 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f 69 6e  hey are not join
26910 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a 20 73  s) and have.** s
26920 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61  imple == constra
26930 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69 6e 64  ints against ind
26940 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20 54 68  exed fields.  Th
26950 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
26960 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e 20 74  pts.** to plan t
26970 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61 73 65  hose simple case
26980 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c 65 73  s using much les
26990 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61 6e 20  s ceremony than 
269a0 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c 2d 70  the.** general-p
269b0 75 72 70 6f 73 65 20 71 75 65 72 79 20 70 6c 61  urpose query pla
269c0 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72 65 62  nner, and thereb
269d0 79 20 79 69 65 6c 64 20 66 61 73 74 65 72 20 73  y yield faster s
269e0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 29  qlite3_prepare()
269f0 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20 74 68  .** times for th
26a00 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 2a  e common case..*
26a10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
26a20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
26a30 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 63   if this query c
26a40 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79  an be handled by
26a50 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72 69 6c   this.** no-fril
26a60 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  ls query planner
26a70 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
26a80 66 20 74 68 69 73 20 71 75 65 72 79 20 6e 65 65  f this query nee
26a90 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e 65 72  ds the .** gener
26aa0 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79  al-purpose query
26ab0 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73 74 61   planner..*/.sta
26ac0 74 69 63 20 69 6e 74 20 77 68 65 72 65 53 68 6f  tic int whereSho
26ad0 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f 70 42  rtCut(WhereLoopB
26ae0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
26af0 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
26b00 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  pWInfo;.  struct
26b10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
26b20 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43 6c 61  Item;.  WhereCla
26b30 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68 65 72  use *pWC;.  Wher
26b40 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
26b50 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
26b60 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
26b70 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65 20 2a  int j;.  Table *
26b80 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
26b90 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66 6f 20 3d  Idx;..  pWInfo =
26ba0 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
26bb0 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d  o;.  if( pWInfo-
26bc0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
26bd0 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
26be0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
26bf0 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 70  ssert( pWInfo->p
26c00 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 3d 31  TabList->nSrc>=1
26c10 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57   );.  pItem = pW
26c20 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
26c30 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49 74 65  a;.  pTab = pIte
26c40 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28 20 49  m->pTab;.  if( I
26c50 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
26c60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
26c70 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
26c80 65 78 65 64 42 79 20 29 20 72 65 74 75 72 6e 20  exedBy ) return 
26c90 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49 74 65  0;.  iCur = pIte
26ca0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 57  m->iCursor;.  pW
26cb0 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  C = &pWInfo->sWC
26cc0 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42 75 69  ;.  pLoop = pBui
26cd0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70 4c  lder->pNew;.  pL
26ce0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20 30  oop->wsFlags = 0
26cf0 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b 69 70  ;.  pLoop->nSkip
26d00 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20 3d 20   = 0;.  pTerm = 
26d10 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
26d20 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
26d30 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f  -1, 0, WO_EQ|WO_
26d40 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  IS, 0);.  if( pT
26d50 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73 74 63  erm ){.    testc
26d60 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
26d70 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b  rator & WO_IS );
26d80 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  .    pLoop->wsFl
26d90 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
26da0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50 4b 7c  MN_EQ|WHERE_IPK|
26db0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
26dc0 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b    pLoop->aLTerm[
26dd0 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  0] = pTerm;.    
26de0 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20  pLoop->nLTerm = 
26df0 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e  1;.    pLoop->u.
26e00 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b 0a 20  btree.nEq = 1;. 
26e10 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
26e20 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20 6c 6f  st of a rowid lo
26e30 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a 20 20  okup is 10 */.  
26e40 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20    pLoop->rRun = 
26e50 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71 6c 69  33;  /* 33==sqli
26e60 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20 2a 2f  te3LogEst(10) */
26e70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
26e80 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
26e90 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
26ea0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
26eb0 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b 3b 0a      int opMask;.
26ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
26ed0 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65  oop->aLTermSpace
26ee0 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 20  ==pLoop->aLTerm 
26ef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  );.      if( !Is
26f00 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78  UniqueIndex(pIdx
26f10 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  ).       || pIdx
26f20 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 21  ->pPartIdxWhere!
26f30 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  =0 .       || pI
26f40 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72 72 61  dx->nKeyCol>Arra
26f50 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61 4c 54  ySize(pLoop->aLT
26f60 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20 20 20  ermSpace) .     
26f70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
26f80 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49 64 78     opMask = pIdx
26f90 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3f 20  ->uniqNotNull ? 
26fa0 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 3a 20  (WO_EQ|WO_IS) : 
26fb0 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66 6f 72  WO_EQ;.      for
26fc0 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b  (j=0; j<pIdx->nK
26fd0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
26fe0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c       pTerm = sql
26ff0 69 74 65 33 57 68 65 72 65 46 69 6e 64 54 65 72  ite3WhereFindTer
27000 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
27010 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64 78 29  0, opMask, pIdx)
27020 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
27030 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
27040 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27050 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
27060 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
27070 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54        pLoop->aLT
27080 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d 3b 0a  erm[j] = pTerm;.
27090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
270a0 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( j!=pIdx->nKeyC
270b0 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
270c0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c       pLoop->wsFl
270d0 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55  ags = WHERE_COLU
270e0 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e 45 52  MN_EQ|WHERE_ONER
270f0 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58 45 44  OW|WHERE_INDEXED
27100 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ;.      if( pIdx
27110 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c 7c 20  ->isCovering || 
27120 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  (pItem->colUsed 
27130 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
27140 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b 0a 20  x(pIdx))==0 ){. 
27150 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73         pLoop->ws
27160 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49  Flags |= WHERE_I
27170 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  DX_ONLY;.      }
27180 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c  .      pLoop->nL
27190 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  Term = j;.      
271a0 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
271b0 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20 70 4c  Eq = j;.      pL
271c0 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
271d0 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  dex = pIdx;.    
271e0 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73    /* TUNING: Cos
271f0 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20 69 6e  t of a unique in
27200 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20 31 35  dex lookup is 15
27210 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d   */.      pLoop-
27220 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f 2a 20  >rRun = 39;  /* 
27230 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  39==sqlite3LogEs
27240 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20 20 62  t(15) */.      b
27250 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
27260 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
27270 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c 6f 6f  lags ){.    pLoo
27280 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73  p->nOut = (LogEs
27290 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  t)1;.    pWInfo-
272a0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d 20 70  >a[0].pWLoop = p
272b0 4c 6f 6f 70 3b 0a 20 20 20 20 61 73 73 65 72 74  Loop;.    assert
272c0 28 20 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  ( pWInfo->sMaskS
272d0 65 74 2e 6e 3d 3d 31 20 26 26 20 69 43 75 72 3d  et.n==1 && iCur=
272e0 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65  =pWInfo->sMaskSe
272f0 74 2e 69 78 5b 30 5d 20 29 3b 0a 20 20 20 20 70  t.ix[0] );.    p
27300 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
27310 20 31 3b 20 2f 2a 20 73 71 6c 69 74 65 33 57 68   1; /* sqlite3Wh
27320 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57 49 6e  ereGetMask(&pWIn
27330 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20 69 43  fo->sMaskSet, iC
27340 75 72 29 3b 20 2a 2f 0a 20 20 20 20 70 57 49 6e  ur); */.    pWIn
27350 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43 75 72  fo->a[0].iTabCur
27360 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 57 49   = iCur;.    pWI
27370 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20 31  nfo->nRowOut = 1
27380 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f  ;.    if( pWInfo
27390 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70 57 49  ->pOrderBy ) pWI
273a0 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 20 70  nfo->nOBSat =  p
273b0 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d  WInfo->pOrderBy-
273c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >nExpr;.    if( 
273d0 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
273e0 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
273f0 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20  DISTINCT ){.    
27400 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
27410 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
27420 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20  INCT_UNIQUE;.   
27430 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
27440 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f 6f 70  _DEBUG.    pLoop
27450 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23 65 6e  ->cId = '0';.#en
27460 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 31  dif.    return 1
27470 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
27480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  ;.}../*.** Helpe
27490 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  r function for e
274a0 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69 73 74  xprIsDeterminist
274b0 69 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ic()..*/.static 
274c0 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 44 65  int exprNodeIsDe
274d0 74 65 72 6d 69 6e 69 73 74 69 63 28 57 61 6c 6b  terministic(Walk
274e0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
274f0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
27500 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 46   pExpr->op==TK_F
27510 55 4e 43 54 49 4f 4e 20 26 26 20 45 78 70 72 48  UNCTION && ExprH
27520 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
27530 2c 20 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3d  , EP_ConstFunc)=
27540 3d 30 20 29 7b 0a 20 20 20 20 70 57 61 6c 6b 65  =0 ){.    pWalke
27550 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20  r->eCode = 0;.  
27560 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
27570 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rt;.  }.  return
27580 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
27590 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
275a0 72 75 65 20 69 66 20 74 68 65 20 65 78 70 72 65  rue if the expre
275b0 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e  ssion contains n
275c0 6f 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73  o non-determinis
275d0 74 69 63 20 53 51 4c 20 0a 2a 2a 20 66 75 6e 63  tic SQL .** func
275e0 74 69 6f 6e 73 2e 20 44 6f 20 6e 6f 74 20 63 6f  tions. Do not co
275f0 6e 73 69 64 65 72 20 6e 6f 6e 2d 64 65 74 65 72  nsider non-deter
27600 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 66 75 6e  ministic SQL fun
27610 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ctions that are 
27620 0a 2a 2a 20 70 61 72 74 20 6f 66 20 73 75 62 2d  .** part of sub-
27630 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
27640 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
27650 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69   exprIsDetermini
27660 73 74 69 63 28 45 78 70 72 20 2a 70 29 7b 0a 20  stic(Expr *p){. 
27670 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
27680 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
27690 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f 64 65  f(w));.  w.eCode
276a0 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70 72 43   = 1;.  w.xExprC
276b0 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e 6f  allback = exprNo
276c0 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69  deIsDeterministi
276d0 63 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  c;.  w.xSelectCa
276e0 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
276f0 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c 3b 0a  SelectWalkFail;.
27700 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
27710 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65 74 75  r(&w, p);.  retu
27720 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a 0a 2f  rn w.eCode;.}../
27730 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
27740 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
27750 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72  he loop used for
27760 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
27770 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65  ocessing..** The
27780 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
27790 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
277a0 20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72   opaque structur
277b0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  e that contains.
277c0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e  ** information n
277d0 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61  eeded to termina
277e0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61  te the loop.  La
277f0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ter, the calling
27800 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75   routine.** shou
27810 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
27820 33 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68  3WhereEnd() with
27830 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
27840 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
27850 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  on.** in order t
27860 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57  o complete the W
27870 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
27880 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  essing..**.** If
27890 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
278a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
278b0 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  eturns NULL..**.
278c0 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65  ** The basic ide
278d0 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73  a is to do a nes
278e0 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f  ted loop, one lo
278f0 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  op for each tabl
27900 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d  e in.** the FROM
27910 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c   clause of a sel
27920 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e  ect.  (INSERT an
27930 64 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  d UPDATE stateme
27940 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73  nts are the.** s
27950 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20  ame as a SELECT 
27960 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67  with only a sing
27970 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
27980 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46  FROM clause.)  F
27990 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69  or.** example, i
279a0 66 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69  f the SQL is thi
279b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53  s:.**.**       S
279c0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
279d0 20 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e   t2, t3 WHERE ..
279e0 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  .;.**.** Then th
279f0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
27a00 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79   is conceptually
27a10 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77   like the follow
27a20 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ing:.**.**      
27a30 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20  foreach row1 in 
27a40 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20  t1 do       \   
27a50 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
27a60 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  **        foreac
27a70 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20  h row2 in t2 do 
27a80 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
27a90 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
27aa0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65  **          fore
27ab0 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64  ach row3 in t3 d
27ac0 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20  o   /.**        
27ad0 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
27ae0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
27af0 20 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20              \   
27b00 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a   Code generated.
27b10 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20  **        end   
27b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b30 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69       |-- by sqli
27b40 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
27b50 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
27b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b70 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74    /.**.** Note t
27b80 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69  hat the loops mi
27b90 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65  ght not be neste
27ba0 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69  d in the order i
27bb0 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  n which they.** 
27bc0 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
27bd0 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64  OM clause if a d
27be0 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69  ifferent order i
27bf0 73 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f  s better able to
27c00 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20   make.** use of 
27c10 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61  indices.  Note a
27c20 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68  lso that when th
27c30 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70  e IN operator ap
27c40 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  pears in.** the 
27c50 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74  WHERE clause, it
27c60 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e   might result in
27c70 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74   additional nest
27c80 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20  ed loops for.** 
27c90 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
27ca0 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74   all values on t
27cb0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
27cc0 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a  de of the IN..**
27cd0 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74  .** There are Bt
27ce0 72 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f  ree cursors asso
27cf0 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
27d00 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73   table.  t1 uses
27d10 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65   cursor.** numbe
27d20 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  r pTabList->a[0]
27d30 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73  .iCursor.  t2 us
27d40 65 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54  es the cursor pT
27d50 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75  abList->a[1].iCu
27d60 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20  rsor..** And so 
27d70 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75  forth.  This rou
27d80 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
27d90 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73  ode to open thos
27da0 65 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a  e VDBE cursors.*
27db0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65  * and sqlite3Whe
27dc0 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65  reEnd() generate
27dd0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c  s the code to cl
27de0 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  ose them..**.** 
27df0 54 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71  The code that sq
27e00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27e10 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76  ) generates leav
27e20 65 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e  es the cursors n
27e30 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c  amed.** in pTabL
27e40 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ist pointing at 
27e50 74 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74  their appropriat
27e60 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20  e entries.  The 
27e70 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61  [...] code.** ca
27e80 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20  n use OP_Column 
27e90 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63  and OP_Rowid opc
27ea0 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75  odes on these cu
27eb0 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74  rsors to extract
27ec0 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68  .** data from th
27ed0 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73  e various tables
27ee0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   of the loop..**
27ef0 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45  .** If the WHERE
27f00 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79   clause is empty
27f10 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f  , the foreach lo
27f20 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63  ops must each sc
27f30 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69  an their.** enti
27f40 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73  re tables.  Thus
27f50 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69   a three-way joi
27f60 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f  n is an O(N^3) o
27f70 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  peration.  But i
27f80 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20  f.** the tables 
27f90 68 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64  have indices and
27fa0 20 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73   there are terms
27fb0 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
27fc0 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66  ause that.** ref
27fd0 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69  er to those indi
27fe0 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20  ces, a complete 
27ff0 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62  table scan can b
28000 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68  e avoided and th
28010 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72  e.** code will r
28020 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20  un much faster. 
28030 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72   Most of the wor
28040 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  k of this routin
28050 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  e is checking.**
28060 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
28070 20 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61   are indices tha
28080 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
28090 20 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f   speed up the lo
280a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20  op..**.** Terms 
280b0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
280c0 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65  use are also use
280d0 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68  d to limit which
280e0 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a   rows actually.*
280f0 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65  * make it to the
28100 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69   "..." in the mi
28110 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ddle of the loop
28120 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66  .  After each "f
28130 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d  oreach",.** term
28140 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
28150 6c 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f  lause that use o
28160 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61  nly terms in tha
28170 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72  t loop and outer
28180 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76  .** loops are ev
28190 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66  aluated and if f
281a0 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d  alse a jump is m
281b0 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73  ade around all s
281c0 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e  ubsequent.** inn
281d0 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f  er loops (or aro
281e0 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66  und the "..." if
281f0 20 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73   the test occurs
28200 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65   within the inne
28210 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29  r-.** most loop)
28220 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49  .**.** OUTER JOI
28230 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65  NS.**.** An oute
28240 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73  r join of tables
28250 20 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f   t1 and t2 is co
28260 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20  nceptally coded 
28270 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
28280 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77  *    foreach row
28290 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20  1 in t1 do.**   
282a0 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20     flag = 0.**  
282b0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
282c0 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20   in t2 do.**    
282d0 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20      start:.**   
282e0 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
282f0 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a         flag = 1.
28300 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20  **      end.**  
28310 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74      if flag==0 t
28320 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f  hen.**        mo
28330 76 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73  ve the row2 curs
28340 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77  or to a null row
28350 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .**        goto 
28360 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69  start.**      fi
28370 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a  .**    end.**.**
28380 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45   ORDER BY CLAUSE
28390 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a   PROCESSING.**.*
283a0 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  * pOrderBy is a 
283b0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
283c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
283d0 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  or the GROUP BY 
283e0 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74 68 65  clause.** if the
283f0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 66   WHERE_GROUPBY f
28400 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 77 63  lag is set in wc
28410 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61 20 53  trlFlags) of a S
28420 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
28430 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
28440 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ne.  If there is
28450 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
28460 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  use or if this r
28470 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
28480 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44 41  led from an UPDA
28490 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
284a0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72  tement, then pOr
284b0 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a  derBy is NULL..*
284c0 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43 75 72  *.** The iIdxCur
284d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
284e0 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
284f0 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 66  of an index.  If
28500 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55   .** WHERE_OR_SU
28510 42 43 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20  BCLAUSE is set, 
28520 69 49 64 78 43 75 72 20 69 73 20 74 68 65 20 63  iIdxCur is the c
28530 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
28540 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75  an index.** to u
28550 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75 73 65  se for OR clause
28560 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
28570 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 73  e WHERE clause s
28580 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73 0a 2a  hould use this.*
28590 2a 20 73 70 65 63 69 66 69 63 20 63 75 72 73 6f  * specific curso
285a0 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f 4e 45  r.  If WHERE_ONE
285b0 50 41 53 53 5f 44 45 53 49 52 45 44 20 69 73 20  PASS_DESIRED is 
285c0 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78 43 75  set, then iIdxCu
285d0 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  r is.** the firs
285e0 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e 20 61  t cursor in an a
285f0 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72 73 20  rray of cursors 
28600 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e  for all indices.
28610 20 20 69 49 64 78 43 75 72 20 73 68 6f 75 6c 64    iIdxCur should
28620 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
28630 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70 72 6f  ompute the appro
28640 70 72 69 61 74 65 20 63 75 72 73 6f 72 20 64 65  priate cursor de
28650 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
28660 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75 73 65   index is.** use
28670 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
28680 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
28690 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
286a0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
286b0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
286c0 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
286d0 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
286e0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a   /* FROM clause:
286f0 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
28700 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
28710 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
28720 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 20  Where,          
28730 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
28740 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
28750 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
28760 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
28770 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29 20 63   (or GROUP BY) c
28780 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
28790 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 52  /.  ExprList *pR
287a0 65 73 75 6c 74 53 65 74 2c 20 20 20 2f 2a 20 51  esultSet,   /* Q
287b0 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 2e  uery result set.
287c0 20 20 52 65 71 27 64 20 66 6f 72 20 44 49 53 54    Req'd for DIST
287d0 49 4e 43 54 20 2a 2f 0a 20 20 75 31 36 20 77 63  INCT */.  u16 wc
287e0 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20  trlFlags,       
287f0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 5f 2a    /* The WHERE_*
28800 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
28810 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
28820 0a 20 20 69 6e 74 20 69 41 75 78 41 72 67 20 20  .  int iAuxArg  
28830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
28840 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
28850 55 53 45 20 69 73 20 73 65 74 2c 20 69 6e 64 65  USE is set, inde
28860 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 0a  x cursor number.
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
28890 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 2c  WHERE_USE_LIMIT,
288a0 20 74 68 65 6e 20 74 68 65 20 6c 69 6d 69 74 20   then the limit 
288b0 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  amount */.){.  i
288c0 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
288d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
288e0 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
288f0 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
28900 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
28910 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
28920 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28930 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
28940 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
28950 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
28960 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
28970 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
28980 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
28990 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
289a0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
289b0 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
289c0 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
289d0 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
289e0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
289f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
28a00 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
28a10 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
28a20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75  */.  WhereLoopBu
28a30 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20 20 20  ilder sWLB;     
28a40 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f 6f 70  /* The WhereLoop
28a50 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20 57 68   builder */.  Wh
28a60 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
28a70 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  kSet;    /* The 
28a80 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
28a90 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65  set */.  WhereLe
28aa0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
28ab0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
28ac0 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66 6f 2d  level in pWInfo-
28ad0 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c  >a[] */.  WhereL
28ae0 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  oop *pLoop;     
28af0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
28b00 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  to a single Wher
28b10 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a  eLoop object */.
28b20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b40 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
28b50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b70 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
28b80 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ion */.  int rc;
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
28bb0 64 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f 72 64  de */.  u8 bFord
28bc0 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20 20 20  elete = 0;      
28bd0 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46 4f 52     /* OPFLAG_FOR
28be0 44 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f 2c 20  DELETE or zero, 
28bf0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  as appropriate *
28c00 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 63  /..  assert( (wc
28c10 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28c20 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f  _ONEPASS_MULTIRO
28c30 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20 20 20  W)==0 || (.     
28c40 20 20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26     (wctrlFlags &
28c50 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
28c60 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20 20 20  ESIRED)!=0 .    
28c70 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20   && (wctrlFlags 
28c80 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  & WHERE_OR_SUBCL
28c90 41 55 53 45 29 3d 3d 30 20 0a 20 20 29 29 3b 0a  AUSE)==0 .  ));.
28ca0 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 6f  .  /* Only one o
28cb0 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  f WHERE_OR_SUBCL
28cc0 41 55 53 45 20 6f 72 20 57 48 45 52 45 5f 55 53  AUSE or WHERE_US
28cd0 45 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61 73 73  E_LIMIT */.  ass
28ce0 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73  ert( (wctrlFlags
28cf0 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
28d00 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 20 20 20  LAUSE)==0.      
28d10 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46        || (wctrlF
28d20 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45  lags & WHERE_USE
28d30 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 0a 20  _LIMIT)==0 );.. 
28d40 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 6e 69   /* Variable ini
28d50 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
28d60 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
28d70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 4c 42  ;.  memset(&sWLB
28d80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 4c 42  , 0, sizeof(sWLB
28d90 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f 52 44  ));..  /* An ORD
28da0 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ER/GROUP BY clau
28db0 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20  se of more than 
28dc0 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f 74 20  63 terms cannot 
28dd0 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a 2f 0a  be optimized */.
28de0 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 64    testcase( pOrd
28df0 65 72 42 79 20 26 26 20 70 4f 72 64 65 72 42 79  erBy && pOrderBy
28e00 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20 29  ->nExpr==BMS-1 )
28e10 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
28e20 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45   && pOrderBy->nE
28e30 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72 64 65  xpr>=BMS ) pOrde
28e40 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c 42 2e  rBy = 0;.  sWLB.
28e50 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
28e60 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62  rBy;..  /* Disab
28e70 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  le the DISTINCT 
28e80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
28e90 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
28ea0 70 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20  pt is set via.  
28eb0 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
28ec0 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  ctrl(SQLITE_TEST
28ed0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
28ee0 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28  NS,...) */.  if(
28ef0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73   OptimizationDis
28f00 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
28f10 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20 29 7b  _DistinctOpt) ){
28f20 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
28f30 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54 5f 44  &= ~WHERE_WANT_D
28f40 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a 20 20  ISTINCT;.  }..  
28f50 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
28f60 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
28f70 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
28f80 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
28f90 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
28fa0 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
28fb0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
28fc0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
28fd0 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61  BMS );.  if( pTa
28fe0 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
28ff0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
29000 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
29010 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
29020 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
29030 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
29040 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
29050 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c   function normal
29060 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e  ly generates a n
29070 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61  ested loop for a
29080 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20  ll tables in .  
29090 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75  ** pTabList.  Bu
290a0 74 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f  t if the WHERE_O
290b0 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67  R_SUBCLAUSE flag
290c0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65   is set, then we
290d0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c   should.  ** onl
290e0 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  y generate code 
290f0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61  for the first ta
29100 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20  ble in pTabList 
29110 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a  and assume that.
29120 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73    ** any cursors
29130 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
29140 20 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c   subsequent tabl
29150 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c  es are uninitial
29160 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61  ized..  */.  nTa
29170 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c  bList = (wctrlFl
29180 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53  ags & WHERE_OR_S
29190 55 42 43 4c 41 55 53 45 29 20 3f 20 31 20 3a 20  UBCLAUSE) ? 1 : 
291a0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
291b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
291c0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
291d0 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
291e0 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
291f0 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
29200 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
29210 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
29220 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
29230 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
29240 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
29250 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
29260 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
29270 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
29280 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
29290 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
292a0 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
292b0 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
292c0 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
292d0 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
292e0 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
292f0 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
29300 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
29310 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
29320 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
29330 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
29340 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
29350 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f   nByteWInfo = RO
29360 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72  UND8(sizeof(Wher
29370 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74  eInfo)+(nTabList
29380 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  -1)*sizeof(Where
29390 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66  Level));.  pWInf
293a0 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
293b0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 42 79  locRawNN(db, nBy
293c0 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65 6f 66  teWInfo + sizeof
293d0 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20  (WhereLoop));.  
293e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
293f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
29400 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57  te3DbFree(db, pW
29410 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49 6e 66  Info);.    pWInf
29420 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  o = 0;.    goto 
29430 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
29440 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  .  }.  pWInfo->p
29450 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
29460 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
29470 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
29480 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
29490 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
294a0 70 57 49 6e 66 6f 2d 3e 70 57 68 65 72 65 20 3d  pWInfo->pWhere =
294b0 20 70 57 68 65 72 65 3b 0a 20 20 70 57 49 6e 66   pWhere;.  pWInf
294c0 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  o->pResultSet = 
294d0 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20 70 57  pResultSet;.  pW
294e0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
294f0 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e  ss[0] = pWInfo->
29500 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20  aiCurOnePass[1] 
29510 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  = -1;.  pWInfo->
29520 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73  nLevel = nTabLis
29530 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72  t;.  pWInfo->iBr
29540 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43  eak = pWInfo->iC
29550 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
29560 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
29570 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74  );.  pWInfo->wct
29580 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46  rlFlags = wctrlF
29590 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  lags;.  pWInfo->
295a0 69 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67  iLimit = iAuxArg
295b0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  ;.  pWInfo->save
295c0 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50  dNQueryLoop = pP
295d0 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
295e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e  ;.  memset(&pWIn
295f0 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30 2c 20 0a  fo->nOBSat, 0, .
29600 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 6f           offseto
29610 66 28 57 68 65 72 65 49 6e 66 6f 2c 73 57 43 29  f(WhereInfo,sWC)
29620 20 2d 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72   - offsetof(Wher
29630 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29 29 3b 0a  eInfo,nOBSat));.
29640 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e 66 6f    memset(&pWInfo
29650 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[0], 0, sizeo
29660 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b 6e 54 61  f(WhereLoop)+nTa
29670 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28 57 68 65  bList*sizeof(Whe
29680 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 61 73 73  reLevel));.  ass
29690 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e  ert( pWInfo->eOn
296a0 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f  ePass==ONEPASS_O
296b0 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50 41 53  FF );  /* ONEPAS
296c0 53 20 64 65 66 61 75 6c 74 73 20 74 6f 20 4f 46  S defaults to OF
296d0 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65 74 20  F */.  pMaskSet 
296e0 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  = &pWInfo->sMask
296f0 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57 49 6e  Set;.  sWLB.pWIn
29700 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20 20 73  fo = pWInfo;.  s
29710 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49 6e 66  WLB.pWC = &pWInf
29720 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42 2e 70  o->sWC;.  sWLB.p
29730 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f 6f 70  New = (WhereLoop
29740 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49 6e 66  *)(((char*)pWInf
29750 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29 3b 0a  o)+nByteWInfo);.
29760 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
29770 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 73  BYTE_ALIGNMENT(s
29780 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20 20 77  WLB.pNew) );.  w
29790 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73 57 4c  hereLoopInit(sWL
297a0 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65 66 20  B.pNew);.#ifdef 
297b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
297c0 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20 3d 20  WLB.pNew->cId = 
297d0 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  '*';.#endif..  /
297e0 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52  * Split the WHER
297f0 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65  E clause into se
29800 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73  parate subexpres
29810 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68  sions where each
29820 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73  .  ** subexpress
29830 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64  ion is separated
29840 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61   by an AND opera
29850 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74  tor..  */.  init
29860 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74  MaskSet(pMaskSet
29870 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  );.  sqlite3Wher
29880 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70 57 49  eClauseInit(&pWI
29890 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e 66 6f  nfo->sWC, pWInfo
298a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  );.  sqlite3Wher
298b0 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f 2d 3e  eSplit(&pWInfo->
298c0 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f  sWC, pWhere, TK_
298d0 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20  AND);.    .  /* 
298e0 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 4e 6f  Special case: No
298f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
29900 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  /.  if( nTabList
29910 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
29920 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e 66 6f  OrderBy ) pWInfo
29930 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72 64 65  ->nOBSat = pOrde
29940 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
29950 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
29960 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
29970 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20 70 57  INCT ){.      pW
29980 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20  Info->eDistinct 
29990 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
299a0 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d 0a 20  _UNIQUE;.    }. 
299b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
299c0 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f 6d  ssign a bit from
299d0 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f 20   the bitmask to 
299e0 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
299f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20  e FROM clause.. 
29a00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
29a10 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68   N-th term of th
29a20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
29a30 20 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d   assigned a bitm
29a40 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 20  ask of 1<<N..   
29a50 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
29a60 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65 76 69  ule of the previ
29a70 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65 6e 73  ous sentence ens
29a80 75 72 65 73 20 74 68 74 61 20 69 66 20 58 20 69  ures thta if X i
29a90 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
29aa0 72 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65  r.    ** a table
29ab0 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69 73 20   T, then X-1 is 
29ac0 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20  the bitmask for 
29ad0 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 73  all other tables
29ae0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
29af0 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77 69 6e  T..    ** Knowin
29b00 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  g the bitmask fo
29b10 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
29b20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
29b30 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20 20 2a  ft join is.    *
29b40 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69  * important.  Ti
29b50 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20 20 20  cket #3015..    
29b60 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
29b70 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72 65  hat bitmasks are
29b80 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
29b90 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20   pTabList->nSrc 
29ba0 74 61 62 6c 65 73 20 69 6e 0a 20 20 20 20 2a 2a  tables in.    **
29bb0 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a   pTabList, not j
29bc0 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54  ust the first nT
29bd0 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20  abList tables.  
29be0 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d  nTabList is norm
29bf0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71 75 61  ally.    ** equa
29c00 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e  l to pTabList->n
29c10 53 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65  Src but might be
29c20 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20   shortened to 1 
29c30 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 57 48  if the.    ** WH
29c40 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
29c50 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20   flag is set..  
29c60 20 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20 30 3b    */.    ii = 0;
29c70 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 63  .    do{.      c
29c80 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53  reateMask(pMaskS
29c90 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
29ca0 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
29cb0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
29cc0 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72  TabFuncArgs(pPar
29cd0 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  se, &pTabList->a
29ce0 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  [ii], &pWInfo->s
29cf0 57 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  WC);.    }while(
29d00 20 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69 73 74   (++ii)<pTabList
29d10 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69 66 64  ->nSrc );.  #ifd
29d20 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29d30 20 20 20 20 7b 0a 20 20 20 20 20 20 42 69 74 6d      {.      Bitm
29d40 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20  ask mx = 0;.    
29d50 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
29d60 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
29d70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69  i++){.        Bi
29d80 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69 74 65  tmask m = sqlite
29d90 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 70 4d  3WhereGetMask(pM
29da0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
29db0 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29  ->a[ii].iCursor)
29dc0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
29dd0 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20 20 20  ( m>=mx );.     
29de0 20 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20 20 20     mx = m;.     
29df0 20 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e 64 69   }.    }.  #endi
29e00 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 41 6e  f.  }.  .  /* An
29e10 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65  alyze all of the
29e20 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
29e30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
29e40 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28 70 54  reExprAnalyze(pT
29e50 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
29e60 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d  >sWC);.  if( db-
29e70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29e80 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
29e90 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70 65 63  rror;..  /* Spec
29ea0 69 61 6c 20 63 61 73 65 3a 20 57 48 45 52 45 20  ial case: WHERE 
29eb0 74 65 72 6d 73 20 74 68 61 74 20 64 6f 20 6e 6f  terms that do no
29ec0 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 74  t refer to any t
29ed0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
29ee0 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61 6e 74  n.  ** (constant
29ef0 20 65 78 70 72 65 73 73 69 6f 6e 73 29 2e 20 45   expressions). E
29f00 76 61 6c 75 61 74 65 20 65 61 63 68 20 73 75 63  valuate each suc
29f10 68 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75 6d 70  h term, and jump
29f20 20 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a 20 20   over all the.  
29f30 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ** generated cod
29f40 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  e if the result 
29f50 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 20 0a 20  is not true.  . 
29f60 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20   **.  ** Do not 
29f70 64 6f 20 74 68 69 73 20 69 66 20 74 68 65 20 65  do this if the e
29f80 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
29f90 6e 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  ns non-determini
29fa0 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 0a 20  stic functions. 
29fb0 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e 6f 74   ** that are not
29fc0 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d 73 65   within a sub-se
29fd0 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  lect. This is no
29fe0 74 20 73 74 72 69 63 74 6c 79 20 72 65 71 75 69  t strictly requi
29ff0 72 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20 70 72  red, but.  ** pr
2a000 65 73 65 72 76 65 73 20 53 51 4c 69 74 65 27 73  eserves SQLite's
2a010 20 6c 65 67 61 63 79 20 62 65 68 61 76 69 6f 75   legacy behaviou
2a020 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r in the followi
2a030 6e 67 20 74 77 6f 20 63 61 73 65 73 3a 0a 20 20  ng two cases:.  
2a040 2a 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d 20 2e  **.  **   FROM .
2a050 2e 2e 20 57 48 45 52 45 20 72 61 6e 64 6f 6d 28  .. WHERE random(
2a060 29 3e 30 3b 20 20 20 20 20 20 20 20 20 20 20 2d  )>0;           -
2a070 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28 29 20  - eval random() 
2a080 6f 6e 63 65 20 70 65 72 20 72 6f 77 0a 20 20 2a  once per row.  *
2a090 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57 48 45  *   FROM ... WHE
2a0a0 52 45 20 28 53 45 4c 45 43 54 20 72 61 6e 64 6f  RE (SELECT rando
2a0b0 6d 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76 61 6c  m())>0;  -- eval
2a0c0 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65 20 6f   random() once o
2a0d0 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f  verall.  */.  fo
2a0e0 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e  r(ii=0; ii<sWLB.
2a0f0 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b  pWC->nTerm; ii++
2a100 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  ){.    WhereTerm
2a110 20 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70 57 43   *pT = &sWLB.pWC
2a120 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  ->a[ii];.    if(
2a130 20 70 54 2d 3e 70 72 65 72 65 71 41 6c 6c 3d 3d   pT->prereqAll==
2a140 30 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d  0 && (nTabList==
2a150 30 20 7c 7c 20 65 78 70 72 49 73 44 65 74 65 72  0 || exprIsDeter
2a160 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e 70 45 78  ministic(pT->pEx
2a170 70 72 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71  pr)) ){.      sq
2a180 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2a190 28 70 50 61 72 73 65 2c 20 70 54 2d 3e 70 45 78  (pParse, pT->pEx
2a1a0 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  pr, pWInfo->iBre
2a1b0 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
2a1c0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 70 54  FNULL);.      pT
2a1d0 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
2a1e0 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20  M_CODED;.    }. 
2a1f0 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46   }..  if( wctrlF
2a200 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
2a210 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
2a220 20 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74    if( isDistinct
2a230 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65  Redundant(pParse
2a240 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49  , pTabList, &pWI
2a250 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73 75 6c  nfo->sWC, pResul
2a260 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  tSet) ){.      /
2a270 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20 6d  * The DISTINCT m
2a280 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74 6c  arking is pointl
2a290 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74 2e  ess.  Ignore it.
2a2a0 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f   */.      pWInfo
2a2b0 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48  ->eDistinct = WH
2a2c0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
2a2d0 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  QUE;.    }else i
2a2e0 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
2a2f0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74  {.      /* Try t
2a300 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20 72  o ORDER BY the r
2a310 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61 6b  esult set to mak
2a320 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63 65  e distinct proce
2a330 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f 0a  ssing easier */.
2a340 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77 63        pWInfo->wc
2a350 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  trlFlags |= WHER
2a360 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20 20  E_DISTINCTBY;.  
2a370 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64      pWInfo->pOrd
2a380 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74 53 65  erBy = pResultSe
2a390 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2a3a0 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  /* Construct the
2a3b0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
2a3c0 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ts */.#if define
2a3d0 64 28 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  d(WHERETRACE_ENA
2a3e0 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71 6c 69  BLED).  if( sqli
2a3f0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
2a400 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 73 71  0xffff ){.    sq
2a410 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2a420 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20  ("*** Optimizer 
2a430 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74 72 6c  Start *** (wctrl
2a440 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77 63 74  Flags: 0x%x",wct
2a450 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  rlFlags);.    if
2a460 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2a470 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 29  HERE_USE_LIMIT )
2a480 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2a490 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20 6c 69  ebugPrintf(", li
2a4a0 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78 41 72  mit: %d", iAuxAr
2a4b0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
2a4c0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2a4d0 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  (")\n");.  }.  i
2a4e0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  f( sqlite3WhereT
2a4f0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 20  race & 0x100 ){ 
2a500 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 74  /* Display all t
2a510 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2a520 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
2a530 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75  sqlite3WhereClau
2a540 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70 57 43  sePrint(sWLB.pWC
2a550 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2a560 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21 3d 31   if( nTabList!=1
2a570 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74 43 75   || whereShortCu
2a580 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b 0a 20  t(&sWLB)==0 ){. 
2a590 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
2a5a0 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29 3b 0a  pAddAll(&sWLB);.
2a5b0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2a5c0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2a5d0 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57 48 45  r;.  .#ifdef WHE
2a5e0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
2a5f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2a600 68 65 72 65 54 72 61 63 65 20 29 7b 20 20 20 20  hereTrace ){    
2a610 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c 20 6f  /* Display all o
2a620 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
2a630 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20 20 20  objects */.     
2a640 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20   WhereLoop *p;. 
2a650 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2a660 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2a670 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22  har zLabel[] = "
2a680 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66  0123456789abcdef
2a690 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
2a6a0 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20 20 20  wyxz".          
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6d0 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
2a6e0 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a 22 3b  MNOPQRSTUVWYXZ";
2a6f0 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70 57 49  .      for(p=pWI
2a700 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30  nfo->pLoops, i=0
2a710 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c  ; p; p=p->pNextL
2a720 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20  oop, i++){.     
2a730 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c 61 62     p->cId = zLab
2a740 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28 7a 4c 61  el[i%(sizeof(zLa
2a750 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20 20 20 20  bel)-1)];.      
2a760 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
2a770 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20  (p, sWLB.pWC);. 
2a780 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
2a790 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65  dif.  .    where
2a7a0 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
2a7b0 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  o, 0);.    if( d
2a7c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a7d0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2a7e0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20  nError;.    if( 
2a7f0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2a800 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65   ){.       where
2a810 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66  PathSolver(pWInf
2a820 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  o, pWInfo->nRowO
2a830 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66  ut+1);.       if
2a840 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2a850 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2a860 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
2a870 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
2a880 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26  o->pOrderBy==0 &
2a890 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
2a8a0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
2a8b0 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70  er)!=0 ){.     p
2a8c0 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d  WInfo->revMask =
2a8d0 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20   ALLBITS;.  }.  
2a8e0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2a8f0 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61   || NEVER(db->ma
2a900 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20  llocFailed) ){. 
2a910 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
2a920 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66  inError;.  }.#if
2a930 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
2a940 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
2a950 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
2a960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
2a970 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53  ugPrintf("---- S
2a980 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22  olution nRow=%d"
2a990 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
2a9a0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  t);.    if( pWIn
2a9b0 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  fo->nOBSat>0 ){.
2a9c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2a9d0 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52  ugPrintf(" ORDER
2a9e0 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70  BY=%d,0x%llx", p
2a9f0 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70  WInfo->nOBSat, p
2aa00 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b  WInfo->revMask);
2aa10 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
2aa20 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74  h( pWInfo->eDist
2aa30 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61  inct ){.      ca
2aa40 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43  se WHERE_DISTINC
2aa50 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20  T_UNIQUE: {.    
2aa60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2aa70 50 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e  Printf("  DISTIN
2aa80 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20  CT=unique");.   
2aa90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2aaa0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
2aab0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
2aac0 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
2aad0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2aae0 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2aaf0 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20  ordered");.     
2ab00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2ab10 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  }.      case WHE
2ab20 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
2ab30 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
2ab40 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
2ab50 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d  ntf("  DISTINCT=
2ab60 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  unordered");.   
2ab70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ab80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2ab90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
2aba0 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("\n");.    for(
2abb0 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d  ii=0; ii<pWInfo-
2abc0 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a  >nLevel; ii++){.
2abd0 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50        whereLoopP
2abe0 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69  rint(pWInfo->a[i
2abf0 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e  i].pWLoop, sWLB.
2ac00 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pWC);.    }.  }.
2ac10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 74  #endif..  /* Att
2ac20 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62  empt to omit tab
2ac30 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69  les from the joi
2ac40 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 61 66  n that do not af
2ac50 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74 2e  fect the result.
2ac60 0a 20 20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  .  ** For a tabl
2ac70 65 20 74 6f 20 6e 6f 74 20 61 66 66 65 63 74 20  e to not affect 
2ac80 74 68 65 20 72 65 73 75 6c 74 2c 20 74 68 65 20  the result, the 
2ac90 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20 62  following must b
2aca0 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  e true:.  **.  *
2acb0 2a 20 20 20 31 29 20 54 68 65 20 71 75 65 72 79  *   1) The query
2acc0 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 6e 20   must not be an 
2acd0 61 67 67 72 65 67 61 74 65 2e 0a 20 20 2a 2a 20  aggregate..  ** 
2ace0 20 20 32 29 20 54 68 65 20 74 61 62 6c 65 20 6d    2) The table m
2acf0 75 73 74 20 62 65 20 74 68 65 20 52 48 53 20 6f  ust be the RHS o
2ad00 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 20  f a LEFT JOIN.. 
2ad10 20 2a 2a 20 20 20 33 29 20 45 69 74 68 65 72 20   **   3) Either 
2ad20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 62  the query must b
2ad30 65 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 20 65  e DISTINCT, or e
2ad40 6c 73 65 20 74 68 65 20 4f 4e 20 6f 72 20 55 53  lse the ON or US
2ad50 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20  ING clause.  ** 
2ad60 20 20 20 20 20 6d 75 73 74 20 63 6f 6e 74 61 69       must contai
2ad70 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  n a constraint t
2ad80 68 61 74 20 6c 69 6d 69 74 73 20 74 68 65 20 73  hat limits the s
2ad90 63 61 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  can of the table
2ada0 20 74 6f 20 0a 20 20 2a 2a 20 20 20 20 20 20 61   to .  **      a
2adb0 74 20 6d 6f 73 74 20 61 20 73 69 6e 67 6c 65 20  t most a single 
2adc0 72 6f 77 2e 0a 20 20 2a 2a 20 20 20 34 29 20 54  row..  **   4) T
2add0 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f  he table must no
2ade0 74 20 62 65 20 72 65 66 65 72 65 6e 63 65 64 20  t be referenced 
2adf0 62 79 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  by any part of t
2ae00 68 65 20 71 75 65 72 79 20 61 70 61 72 74 0a 20  he query apart. 
2ae10 20 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 69 74   **      from it
2ae20 73 20 6f 77 6e 20 55 53 49 4e 47 20 6f 72 20 4f  s own USING or O
2ae30 4e 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  N clause..  **. 
2ae40 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c   ** For example,
2ae50 20 67 69 76 65 6e 3a 0a 20 20 2a 2a 0a 20 20 2a   given:.  **.  *
2ae60 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
2ae70 4c 45 20 74 31 28 69 70 6b 20 49 4e 54 45 47 45  LE t1(ipk INTEGE
2ae80 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76  R PRIMARY KEY, v
2ae90 31 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  1);.  **     CRE
2aea0 41 54 45 20 54 41 42 4c 45 20 74 32 28 69 70 6b  ATE TABLE t2(ipk
2aeb0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2aec0 20 4b 45 59 2c 20 76 32 29 3b 0a 20 20 2a 2a 20   KEY, v2);.  ** 
2aed0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2aee0 20 74 33 28 69 70 6b 20 49 4e 54 45 47 45 52 20   t3(ipk INTEGER 
2aef0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 33 29  PRIMARY KEY, v3)
2af00 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 74 68 65 6e  ;.  **.  ** then
2af10 20 74 61 62 6c 65 20 74 32 20 63 61 6e 20 62 65   table t2 can be
2af20 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
2af30 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
2af40 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
2af50 54 20 76 31 2c 20 76 33 20 46 52 4f 4d 20 74 31  T v1, v3 FROM t1
2af60 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46   .  **       LEF
2af70 54 20 4a 4f 49 4e 20 74 32 20 55 53 49 4e 47 20  T JOIN t2 USING 
2af80 28 74 31 2e 69 70 6b 3d 74 32 2e 69 70 6b 29 0a  (t1.ipk=t2.ipk).
2af90 20 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20    **       LEFT 
2afa0 4a 4f 49 4e 20 74 33 20 55 53 49 4e 47 20 28 74  JOIN t3 USING (t
2afb0 31 2e 69 70 6b 3d 74 33 2e 69 70 6b 29 0a 20 20  1.ipk=t3.ipk).  
2afc0 2a 2a 0a 20 20 2a 2a 20 6f 72 20 66 72 6f 6d 3a  **.  ** or from:
2afd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2afe0 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 76  ELECT DISTINCT v
2aff0 31 2c 20 76 33 20 46 52 4f 4d 20 74 31 20 0a 20  1, v3 FROM t1 . 
2b000 20 2a 2a 20 20 20 20 20 20 20 4c 45 46 54 20 4a   **       LEFT J
2b010 4f 49 4e 20 74 32 0a 20 20 2a 2a 20 20 20 20 20  OIN t2.  **     
2b020 20 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33 20 55    LEFT JOIN t3 U
2b030 53 49 4e 47 20 28 74 31 2e 69 70 6b 3d 74 33 2e  SING (t1.ipk=t3.
2b040 69 70 6b 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ipk).  */.  if( 
2b050 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d  pWInfo->nLevel>=
2b060 32 0a 20 20 20 26 26 20 70 52 65 73 75 6c 74 53  2.   && pResultS
2b070 65 74 21 3d 30 20 20 20 20 20 20 20 20 20 20 20  et!=0           
2b080 20 20 20 20 2f 2a 20 67 75 61 72 61 6e 74 65 65      /* guarantee
2b090 73 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  s condition (1) 
2b0a0 61 62 6f 76 65 20 2a 2f 0a 20 20 20 26 26 20 4f  above */.   && O
2b0b0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2b0c0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 6d  ed(db, SQLITE_Om
2b0d0 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29 7b  itNoopJoin).  ){
2b0e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2b0f0 42 69 74 6d 61 73 6b 20 74 61 62 55 73 65 64 20  Bitmask tabUsed 
2b100 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78  = sqlite3WhereEx
2b110 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61 73  prListUsage(pMas
2b120 6b 53 65 74 2c 20 70 52 65 73 75 6c 74 53 65 74  kSet, pResultSet
2b130 29 3b 0a 20 20 20 20 69 66 28 20 73 57 4c 42 2e  );.    if( sWLB.
2b140 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2b150 20 20 74 61 62 55 73 65 64 20 7c 3d 20 73 71 6c    tabUsed |= sql
2b160 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
2b170 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
2b180 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b   sWLB.pOrderBy);
2b190 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
2b1a0 3d 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d  =pWInfo->nLevel-
2b1b0 31 3b 20 69 3e 3d 31 3b 20 69 2d 2d 29 7b 0a 20  1; i>=1; i--){. 
2b1c0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
2b1d0 70 54 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20  pTerm, *pEnd;.  
2b1e0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2b1f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2b200 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 57        pLoop = pW
2b210 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 57 4c 6f 6f  Info->a[i].pWLoo
2b220 70 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d  p;.      pItem =
2b230 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69   &pWInfo->pTabLi
2b240 73 74 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61  st->a[pLoop->iTa
2b250 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  b];.      if( (p
2b260 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
2b270 65 20 26 20 4a 54 5f 4c 45 46 54 29 3d 3d 30 20  e & JT_LEFT)==0 
2b280 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b290 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
2b2a0 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  s & WHERE_WANT_D
2b2b0 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20 20  ISTINCT)==0.    
2b2c0 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77 73     && (pLoop->ws
2b2d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2b2e0 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20 29  EROW)==0.      )
2b2f0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
2b300 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
2b310 20 20 69 66 28 20 28 74 61 62 55 73 65 64 20 26    if( (tabUsed &
2b320 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2b330 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2b340 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73 57  .      pEnd = sW
2b350 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c 42  LB.pWC->a + sWLB
2b360 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20  .pWC->nTerm;.   
2b370 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57 4c     for(pTerm=sWL
2b380 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  B.pWC->a; pTerm<
2b390 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  pEnd; pTerm++){.
2b3a0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
2b3b0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
2b3c0 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29  pLoop->maskSelf)
2b3d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2b3e0 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
2b3f0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
2b400 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
2b410 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
2b420 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 69 52 69  Term->pExpr->iRi
2b430 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 49  ghtJoinTable!=pI
2b440 74 65 6d 2d 3e 69 43 75 72 73 6f 72 0a 20 20 20  tem->iCursor.   
2b450 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2b460 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b480 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2b490 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20   if( pTerm<pEnd 
2b4a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2b4b0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
2b4c0 66 66 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c  fff, ("-> drop l
2b4d0 6f 6f 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c  oop %c not used\
2b4e0 6e 22 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29  n", pLoop->cId))
2b4f0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 70  ;.      if( i!=p
2b500 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 20  WInfo->nLevel-1 
2b510 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
2b520 42 79 74 65 20 3d 20 28 70 57 49 6e 66 6f 2d 3e  Byte = (pWInfo->
2b530 6e 4c 65 76 65 6c 2d 31 2d 69 29 20 2a 20 73 69  nLevel-1-i) * si
2b540 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29  zeof(WhereLevel)
2b550 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  ;.        memmov
2b560 65 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2c  e(&pWInfo->a[i],
2b570 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 2b 31 5d   &pWInfo->a[i+1]
2b580 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2b590 7d 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  }.      pWInfo->
2b5a0 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20  nLevel--;.      
2b5b0 6e 54 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20  nTabList--;.    
2b5c0 7d 0a 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41  }.  }.  WHERETRA
2b5d0 43 45 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20  CE(0xffff,("*** 
2b5e0 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68  Optimizer Finish
2b5f0 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70  ed ***\n"));.  p
2b600 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e  WInfo->pParse->n
2b610 51 75 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49  QueryLoop += pWI
2b620 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20  nfo->nRowOut;.. 
2b630 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
2b640 72 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  r is an UPDATE o
2b650 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
2b660 6e 74 20 74 68 61 74 20 69 73 20 72 65 71 75 65  nt that is reque
2b670 73 74 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73  sting.  ** to us
2b680 65 20 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67  e a one-pass alg
2b690 6f 72 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e  orithm, determin
2b6a0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 70 70  e if this is app
2b6b0 72 6f 70 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20  ropriate..  */. 
2b6c0 20 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46   assert( (wctrlF
2b6d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2b6e0 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30  PASS_DESIRED)==0
2b6f0 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76   || pWInfo->nLev
2b700 65 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28  el==1 );.  if( (
2b710 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b720 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
2b730 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ED)!=0 ){.    in
2b740 74 20 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e  t wsFlags = pWIn
2b750 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d  fo->a[0].pWLoop-
2b760 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e  >wsFlags;.    in
2b770 74 20 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46  t bOnerow = (wsF
2b780 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2b790 52 4f 57 29 21 3d 30 3b 0a 20 20 20 20 69 66 28  ROW)!=0;.    if(
2b7a0 20 62 4f 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c   bOnerow.     ||
2b7b0 20 28 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20   ((wctrlFlags & 
2b7c0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55  WHERE_ONEPASS_MU
2b7d0 4c 54 49 52 4f 57 29 21 3d 30 0a 20 20 20 20 20  LTIROW)!=0.     
2b7e0 20 20 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46        && 0==(wsF
2b7f0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52  lags & WHERE_VIR
2b800 54 55 41 4c 54 41 42 4c 45 29 29 0a 20 20 20 20  TUALTABLE)).    
2b810 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
2b820 3e 65 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65  >eOnePass = bOne
2b830 72 6f 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49  row ? ONEPASS_SI
2b840 4e 47 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d  NGLE : ONEPASS_M
2b850 55 4c 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20  ULTI;.      if( 
2b860 48 61 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73  HasRowid(pTabLis
2b870 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26  t->a[0].pTab) &&
2b880 20 28 77 73 46 6c 61 67 73 20 26 20 57 48 45 52   (wsFlags & WHER
2b890 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20  E_IDX_ONLY) ){. 
2b8a0 20 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c         if( wctrl
2b8b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2b8c0 45 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29  EPASS_MULTIROW )
2b8d0 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46 6f 72  {.          bFor
2b8e0 64 65 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f  delete = OPFLAG_
2b8f0 46 4f 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  FORDELETE;.     
2b900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49     }.        pWI
2b910 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70  nfo->a[0].pWLoop
2b920 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46  ->wsFlags = (wsF
2b930 6c 61 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44  lags & ~WHERE_ID
2b940 58 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d  X_ONLY);.      }
2b950 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2b960 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73   Open all tables
2b970 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
2b980 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73   and any indices
2b990 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20   selected for.  
2b9a0 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f  ** searching tho
2b9b0 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
2b9c0 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76    for(ii=0, pLev
2b9d0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69  el=pWInfo->a; ii
2b9e0 3c 6e 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c  <nTabList; ii++,
2b9f0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2ba00 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
2ba10 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
2ba20 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  n */.    int iDb
2ba30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
2ba40 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
2ba50 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
2ba60 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72  index */.    str
2ba70 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2ba80 20 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20   *pTabItem;..   
2ba90 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
2baa0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
2bab0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
2bac0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
2bad0 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
2bae0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
2baf0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
2bb00 68 65 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  hema);.    pLoop
2bb10 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f   = pLevel->pWLoo
2bb20 70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  p;.    if( (pTab
2bb30 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2bb40 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
2bb50 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
2bb60 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
2bb70 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
2bb80 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
2bb90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2bba0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f  BLE.    if( (pLo
2bbb0 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  op->wsFlags & WH
2bbc0 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2bbd0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  )!=0 ){.      co
2bbe0 6e 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20  nst char *pVTab 
2bbf0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
2bc00 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
2bc10 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
2bc20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61    int iCur = pTa
2bc30 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
2bc40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bc50 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f  eAddOp4(v, OP_VO
2bc60 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c  pen, iCur, 0, 0,
2bc70 20 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29   pVTab, P4_VTAB)
2bc80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2bc90 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
2bca0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70  ){.      /* noop
2bcb0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   */.    }else.#e
2bcc0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c  ndif.    if( (pL
2bcd0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2bce0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2bcf0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
2bd00 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2bd10 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
2bd20 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
2bd30 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64  op = OP_OpenRead
2bd40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
2bd50 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e  fo->eOnePass!=ON
2bd60 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20  EPASS_OFF ){.   
2bd70 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
2bd80 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
2bd90 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
2bda0 50 61 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74  Pass[0] = pTabIt
2bdb0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
2bdc0 20 20 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69     };.      sqli
2bdd0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
2bde0 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  rse, pTabItem->i
2bdf0 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61  Cursor, iDb, pTa
2be00 62 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73  b, op);.      as
2be10 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e  sert( pTabItem->
2be20 69 43 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d  iCursor==pLevel-
2be30 3e 69 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20  >iTabCur );.    
2be40 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
2be50 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e  fo->eOnePass==ON
2be60 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61  EPASS_OFF && pTa
2be70 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  b->nCol==BMS-1 )
2be80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2be90 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61  ( pWInfo->eOnePa
2bea0 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20  ss==ONEPASS_OFF 
2beb0 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  && pTab->nCol==B
2bec0 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
2bed0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2bee0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
2bef0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20   pTab->nCol<BMS 
2bf00 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
2bf10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ) ){.        Bit
2bf20 6d 61 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65  mask b = pTabIte
2bf30 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  m->colUsed;.    
2bf40 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20      int n = 0;. 
2bf50 20 20 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20         for(; b; 
2bf60 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20  b=b>>1, n++){}. 
2bf70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2bf80 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
2bf90 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
2bfa0 50 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32  PTR(n), P4_INT32
2bfb0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2bfc0 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
2bfd0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64   );.      }.#ifd
2bfe0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2bff0 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
2c000 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75      if( pLoop->u
2c010 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30  .btree.pIndex!=0
2c020 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2c030 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2c040 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  v, OPFLAG_SEEKEQ
2c050 7c 62 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20  |bFordelete);.  
2c060 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2c070 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2c080 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2c090 67 65 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65  geP5(v, bFordele
2c0a0 74 65 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  te);.      }.#if
2c0b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2c0c0 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
2c0d0 53 4b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  SK.      sqlite3
2c0e0 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
2c0f0 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
2c100 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
2c110 73 6f 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  sor, 0, 0,.     
2c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c130 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38         (const u8
2c140 2a 29 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  *)&pTabItem->col
2c150 55 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b  Used, P4_INT64);
2c160 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
2c170 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2c180 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
2c190 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
2c1a0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
2c1b0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2c1c0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2c1d0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2c1e0 20 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20   ){.      Index 
2c1f0 2a 70 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  *pIx = pLoop->u.
2c200 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
2c210 20 20 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75      int iIndexCu
2c220 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  r;.      int op 
2c230 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  = OP_OpenRead;. 
2c240 20 20 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20       /* iAuxArg 
2c250 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2c260 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
2c270 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73 20  e if ONEPASS is 
2c280 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20  possible */.    
2c290 20 20 61 73 73 65 72 74 28 20 69 41 75 78 41 72    assert( iAuxAr
2c2a0 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d  g!=0 || (pWInfo-
2c2b0 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
2c2c0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2c2d0 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  RED)==0 );.     
2c2e0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
2c2f0 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61 72  Tab) && IsPrimar
2c300 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29 0a 20  yKeyIndex(pIx). 
2c310 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
2c320 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f  lags & WHERE_OR_
2c330 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a 20 20  SUBCLAUSE)!=0.  
2c340 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
2c350 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74 65  * This is one te
2c360 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69  rm of an OR-opti
2c370 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20 74  mization using t
2c380 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f  he PRIMARY KEY o
2c390 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 57  f a.        ** W
2c3a0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
2c3b0 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72  le.  No need for
2c3c0 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64 65   a separate inde
2c3d0 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49 6e  x */.        iIn
2c3e0 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  dexCur = pLevel-
2c3f0 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20 20  >iTabCur;.      
2c400 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20    op = 0;.      
2c410 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66 6f  }else if( pWInfo
2c420 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
2c430 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
2c440 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70     Index *pJ = p
2c450 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70  TabItem->pTab->p
2c460 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 69  Index;.        i
2c470 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78 41  IndexCur = iAuxA
2c480 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rg;.        asse
2c490 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  rt( wctrlFlags &
2c4a0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
2c4b0 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20 20  ESIRED );.      
2c4c0 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
2c4d0 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20 29  pJ) && pJ!=pIx )
2c4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 64  {.          iInd
2c4f0 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20  exCur++;.       
2c500 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78     pJ = pJ->pNex
2c510 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
2c520 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65       op = OP_Ope
2c530 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20  nWrite;.        
2c540 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
2c550 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78  Pass[1] = iIndex
2c560 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Cur;.      }else
2c570 20 69 66 28 20 69 41 75 78 41 72 67 20 26 26 20   if( iAuxArg && 
2c580 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2c590 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
2c5a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2c5b0 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78  iIndexCur = iAux
2c5c0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  Arg;.        op 
2c5d0 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a  = OP_ReopenIdx;.
2c5e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c5f0 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20 3d       iIndexCur =
2c600 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2c610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2c620 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
2c630 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20   iIndexCur;.    
2c640 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
2c650 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
2c660 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
2c670 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75 72  ssert( iIndexCur
2c680 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
2c690 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73   op ){.        s
2c6a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2c6b0 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43 75  (v, op, iIndexCu
2c6c0 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44  r, pIx->tnum, iD
2c6d0 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
2c6e0 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
2c6f0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
2c700 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
2c710 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c720 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54  WHERE_CONSTRAINT
2c730 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
2c740 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2c750 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
2c760 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49  _RANGE|WHERE_SKI
2c770 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20  PSCAN))==0.     
2c780 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
2c790 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45  wctrlFlags&WHERE
2c7a0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30  _ORDERBY_MIN)==0
2c7b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 57 49  .         && pWI
2c7c0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 21 3d  nfo->eDistinct!=
2c7d0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2c7e0 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 20 29  RDERED.        )
2c7f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2c800 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2c810 76 2c 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51  v, OPFLAG_SEEKEQ
2c820 29 3b 20 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f  ); /* Hint to CO
2c830 4d 44 42 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  MDB2 */.        
2c840 7d 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  }.        VdbeCo
2c850 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2c860 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69  pIx->zName));.#i
2c870 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2c880 4c 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d  LE_COLUMN_USED_M
2c890 41 53 4b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ASK.        {.  
2c8a0 20 20 20 20 20 20 20 20 75 36 34 20 63 6f 6c 55          u64 colU
2c8b0 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sed = 0;.       
2c8c0 20 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20     int ii, jj;. 
2c8d0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
2c8e0 30 3b 20 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75  0; ii<pIx->nColu
2c8f0 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  mn; ii++){.     
2c900 20 20 20 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d         jj = pIx-
2c910 3e 61 69 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20  >aiColumn[ii];. 
2c920 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a             if( j
2c930 6a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  j<0 ) continue;.
2c940 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c950 6a 6a 3e 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b  jj>63 ) jj = 63;
2c960 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2c970 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55   (pTabItem->colU
2c980 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a  sed & MASKBIT(jj
2c990 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ))==0 ) continue
2c9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
2c9b0 6c 55 73 65 64 20 7c 3d 20 28 28 75 36 34 29 31  lUsed |= ((u64)1
2c9c0 29 3c 3c 28 69 69 3c 36 33 20 3f 20 69 69 20 3a  )<<(ii<63 ? ii :
2c9d0 20 36 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20   63);.          
2c9e0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
2c9f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
2ca00 38 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55  8(v, OP_ColumnsU
2ca10 73 65 64 2c 20 69 49 6e 64 65 78 43 75 72 2c 20  sed, iIndexCur, 
2ca20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca40 20 20 20 20 20 20 28 75 38 2a 29 26 63 6f 6c 55        (u8*)&colU
2ca50 73 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a  sed, P4_INT64);.
2ca60 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2ca70 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
2ca80 45 5f 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41  E_COLUMN_USED_MA
2ca90 53 4b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  SK */.      }.  
2caa0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
2cab0 3d 30 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  =0 ) sqlite3Code
2cac0 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2cad0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  rse, iDb);.  }. 
2cae0 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
2caf0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2cb00 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
2cb10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2cb20 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2cb30 67 69 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20  ginError;..  /* 
2cb40 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
2cb50 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
2cb60 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
2cb70 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
2cb80 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
2cb90 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
2cba0 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
2cbb0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
2cbc0 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
2cbd0 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
2cbe0 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
2cbf0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61  for(ii=0; ii<nTa
2cc00 62 4c 69 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  bList; ii++){.  
2cc10 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
2cc20 6e 3b 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61  n;.    int wsFla
2cc30 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  gs;.    pLevel =
2cc40 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b   &pWInfo->a[ii];
2cc50 0a 20 20 20 20 77 73 46 6c 61 67 73 20 3d 20 70  .    wsFlags = p
2cc60 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
2cc70 73 46 6c 61 67 73 3b 0a 23 69 66 6e 64 65 66 20  sFlags;.#ifndef 
2cc80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2cc90 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
2cca0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c  if( (pLevel->pWL
2ccb0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2ccc0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
2ccd0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
2cce0 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69 63 49  structAutomaticI
2ccf0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 70 57  ndex(pParse, &pW
2cd00 49 6e 66 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20  Info->sWC,.     
2cd10 20 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62             &pTab
2cd20 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2cd30 69 46 72 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79  iFrom], notReady
2cd40 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , pLevel);.     
2cd50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2cd60 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65  ailed ) goto whe
2cd70 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
2cd80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
2cd90 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c  ddrExplain = sql
2cda0 69 74 65 33 57 68 65 72 65 45 78 70 6c 61 69 6e  ite3WhereExplain
2cdb0 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20 20  OneScan(.       
2cdc0 20 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73   pParse, pTabLis
2cdd0 74 2c 20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70  t, pLevel, ii, p
2cde0 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63  Level->iFrom, wc
2cdf0 74 72 6c 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a  trlFlags.    );.
2ce00 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
2ce10 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
2ce20 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2ce30 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  ;.    notReady =
2ce40 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 64   sqlite3WhereCod
2ce50 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
2ce60 49 6e 66 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61  Info, ii, notRea
2ce70 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
2ce80 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65  >iContinue = pLe
2ce90 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20  vel->addrCont;. 
2cea0 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 26     if( (wsFlags&
2ceb0 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d  WHERE_MULTI_OR)=
2cec0 3d 30 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67  =0 && (wctrlFlag
2ced0 73 26 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  s&WHERE_OR_SUBCL
2cee0 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AUSE)==0 ){.    
2cef0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 41 64    sqlite3WhereAd
2cf00 64 53 63 61 6e 53 74 61 74 75 73 28 76 2c 20 70  dScanStatus(v, p
2cf10 54 61 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c  TabList, pLevel,
2cf20 20 61 64 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20   addrExplain);. 
2cf30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
2cf40 6f 6e 65 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f  one. */.  VdbeMo
2cf50 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  duleComment((v, 
2cf60 22 42 65 67 69 6e 20 57 48 45 52 45 2d 63 6f 72  "Begin WHERE-cor
2cf70 65 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e"));.  return p
2cf80 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
2cf90 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
2cfa0 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
2cfb0 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28  eginError:.  if(
2cfc0 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70   pWInfo ){.    p
2cfd0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2cfe0 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65  p = pWInfo->save
2cff0 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20  dNQueryLoop;.   
2d000 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
2d010 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  b, pWInfo);.  }.
2d020 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2d030 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68  *.** Generate th
2d040 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
2d050 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f  RE loop.  See co
2d060 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71  mments on .** sq
2d070 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2d080 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
2d090 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2d0a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65  .void sqlite3Whe
2d0b0 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20  reEnd(WhereInfo 
2d0c0 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73  *pWInfo){.  Pars
2d0d0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
2d0e0 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56 64  fo->pParse;.  Vd
2d0f0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2d100 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2d110 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
2d120 65 76 65 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f  evel;.  WhereLoo
2d130 70 20 2a 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c  p *pLoop;.  SrcL
2d140 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
2d150 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
2d160 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2d170 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
2d180 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f   /* Generate loo
2d190 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f  p termination co
2d1a0 64 65 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d  de..  */.  VdbeM
2d1b0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2d1c0 20 22 45 6e 64 20 57 48 45 52 45 2d 63 6f 72 65   "End WHERE-core
2d1d0 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  "));.  sqlite3Ex
2d1e0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2d1f0 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57  rse);.  for(i=pW
2d200 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20  Info->nLevel-1; 
2d210 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2d220 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 70 4c  int addr;.    pL
2d230 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
2d240 61 5b 69 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20  a[i];.    pLoop 
2d250 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70  = pLevel->pWLoop
2d260 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
2d270 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
2d280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d290 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41  DISABLE_SKIPAHEA
2d2a0 44 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20  D_DISTINCT.     
2d2b0 20 69 6e 74 20 61 64 64 72 53 65 65 6b 20 3d 20   int addrSeek = 
2d2c0 30 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  0;.      Index *
2d2d0 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e 74 20  pIdx;.      int 
2d2e0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  n;.      if( pWI
2d2f0 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d  nfo->eDistinct==
2d300 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2d310 52 44 45 52 45 44 0a 20 20 20 20 20 20 20 26 26  RDERED.       &&
2d320 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
2d330 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2d340 29 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28  )!=0.       && (
2d350 70 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  pIdx = pLoop->u.
2d360 62 74 72 65 65 2e 70 49 6e 64 65 78 29 2d 3e 68  btree.pIndex)->h
2d370 61 73 53 74 61 74 31 0a 20 20 20 20 20 20 20 26  asStat1.       &
2d380 26 20 28 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  & (n = pLoop->u.
2d390 62 74 72 65 65 2e 6e 49 64 78 43 6f 6c 29 3e 30  btree.nIdxCol)>0
2d3a0 0a 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d  .       && pIdx-
2d3b0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d 3e  >aiRowLogEst[n]>
2d3c0 3d 33 36 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =36.      ){.   
2d3d0 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 70 50       int r1 = pP
2d3e0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
2d3f0 20 20 20 20 20 20 69 6e 74 20 6a 2c 20 6f 70 3b        int j, op;
2d400 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
2d410 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<n; j++){.   
2d420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d430 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
2d440 6f 6c 75 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69  olumn, pLevel->i
2d450 49 64 78 43 75 72 2c 20 6a 2c 20 72 31 2b 6a 29  IdxCur, j, r1+j)
2d460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d470 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
2d480 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20 20   += n+1;.       
2d490 20 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f 70   op = pLevel->op
2d4a0 3d 3d 4f 50 5f 50 72 65 76 20 3f 20 4f 50 5f 53  ==OP_Prev ? OP_S
2d4b0 65 65 6b 4c 54 20 3a 20 4f 50 5f 53 65 65 6b 47  eekLT : OP_SeekG
2d4c0 54 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 53  T;.        addrS
2d4d0 65 65 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eek = sqlite3Vdb
2d4e0 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70  eAddOp4Int(v, op
2d4f0 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
2d500 72 2c 20 30 2c 20 72 31 2c 20 6e 29 3b 0a 20 20  r, 0, r1, n);.  
2d510 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2d520 67 65 49 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53  geIf(v, op==OP_S
2d530 65 65 6b 4c 54 29 3b 0a 20 20 20 20 20 20 20 20  eekLT);.        
2d540 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2d550 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29  , op==OP_SeekGT)
2d560 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2d570 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d580 50 5f 47 6f 74 6f 2c 20 31 2c 20 70 4c 65 76 65  P_Goto, 1, pLeve
2d590 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20 7d 0a  l->p2);.      }.
2d5a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2d5b0 5f 44 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45  _DISABLE_SKIPAHE
2d5c0 41 44 5f 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  AD_DISTINCT */. 
2d5d0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d       /* The comm
2d5e0 6f 6e 20 63 61 73 65 3a 20 41 64 76 61 6e 63 65  on case: Advance
2d5f0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
2d600 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2d610 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2d620 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2d630 72 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  rCont);.      sq
2d640 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2d650 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70  v, pLevel->op, p
2d660 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
2d670 6c 2d 3e 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p2, pLevel->p
2d680 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  3);.      sqlite
2d690 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2d6a0 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20   pLevel->p5);.  
2d6b0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2d6c0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
2d6d0 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65  overageIf(v, pLe
2d6e0 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74  vel->op==OP_Next
2d6f0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
2d700 65 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65  erageIf(v, pLeve
2d710 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b  l->op==OP_Prev);
2d720 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
2d730 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d  ageIf(v, pLevel-
2d740 3e 6f 70 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a  >op==OP_VNext);.
2d750 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
2d760 49 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44  ISABLE_SKIPAHEAD
2d770 5f 44 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20  _DISTINCT.      
2d780 69 66 28 20 61 64 64 72 53 65 65 6b 20 29 20 73  if( addrSeek ) s
2d790 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d7a0 72 65 28 76 2c 20 61 64 64 72 53 65 65 6b 29 3b  re(v, addrSeek);
2d7b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
2d7c0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2d7d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2d7e0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2d7f0 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Cont);.    }.   
2d800 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2d810 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41  ags & WHERE_IN_A
2d820 42 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75  BLE && pLevel->u
2d830 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  .in.nIn>0 ){.   
2d840 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
2d850 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74   *pIn;.      int
2d860 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   j;.      sqlite
2d870 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2d880 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2d890 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  rNxt);.      for
2d8a0 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  (j=pLevel->u.in.
2d8b0 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c  nIn, pIn=&pLevel
2d8c0 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a  ->u.in.aInLoop[j
2d8d0 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  -1]; j>0; j--, p
2d8e0 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73  In--){.        s
2d8f0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2d900 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49  re(v, pIn->addrI
2d910 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20  nTop+1);.       
2d920 20 69 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f   if( pIn->eEndLo
2d930 6f 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  opOp!=OP_Noop ){
2d940 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d950 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2d960 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c  pIn->eEndLoopOp,
2d970 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d   pIn->iCur, pIn-
2d980 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20  >addrInTop);.   
2d990 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
2d9a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2d9b0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
2d9c0 28 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  (v, pIn->eEndLoo
2d9d0 70 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70  pOp==OP_PrevIfOp
2d9e0 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  en);.          V
2d9f0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2da00 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2da10 3d 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29  ==OP_NextIfOpen)
2da20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2da30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2da40 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e  umpHere(v, pIn->
2da50 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20  addrInTop-1);.  
2da60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2da70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2da80 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65  veLabel(v, pLeve
2da90 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20  l->addrBrk);.   
2daa0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64   if( pLevel->add
2dab0 72 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73  rSkip ){.      s
2dac0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
2dad0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  , pLevel->addrSk
2dae0 69 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ip);.      VdbeC
2daf0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
2db00 20 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73   skip-scan on %s
2db10 22 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  ", pLoop->u.btre
2db20 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  e.pIndex->zName)
2db30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2db40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2db50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2db60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2db70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2db80 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70  pLevel->addrSkip
2db90 2d 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  -2);.    }.#ifnd
2dba0 65 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44  ef SQLITE_LIKE_D
2dbb0 4f 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42  OESNT_MATCH_BLOB
2dbc0 53 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  S.    if( pLevel
2dbd0 2d 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b  ->addrLikeRep ){
2dbe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2dbf0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
2dc00 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e  ecrJumpZero, (in
2dc10 74 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65  t)(pLevel->iLike
2dc20 52 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20  RepCntr>>1),.   
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc40 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
2dc50 72 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20  rLikeRep);.     
2dc60 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2dc70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2dc80 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
2dc90 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
2dca0 20 20 69 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70    int ws = pLoop
2dcb0 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20  ->wsFlags;.     
2dcc0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2dcd0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2dce0 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69  IfPos, pLevel->i
2dcf0 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43  LeftJoin); VdbeC
2dd00 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2dd10 20 20 61 73 73 65 72 74 28 20 28 77 73 20 26 20    assert( (ws & 
2dd20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2dd30 3d 30 20 7c 7c 20 28 77 73 20 26 20 57 48 45 52  =0 || (ws & WHER
2dd40 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b  E_INDEXED)!=0 );
2dd50 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
2dd60 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
2dd70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
2dd80 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 69  ssert( pLevel->i
2dd90 54 61 62 43 75 72 3d 3d 70 54 61 62 4c 69 73 74  TabCur==pTabList
2dda0 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2ddb0 6d 5d 2e 69 43 75 72 73 6f 72 20 29 3b 0a 20 20  m].iCursor );.  
2ddc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ddd0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
2dde0 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69  llRow, pLevel->i
2ddf0 54 61 62 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  TabCur);.      }
2de00 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
2de10 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 20   WHERE_INDEXED) 
2de20 0a 20 20 20 20 20 20 20 7c 7c 20 28 28 77 73 20  .       || ((ws 
2de30 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
2de40 29 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 70  ) && pLevel->u.p
2de50 43 6f 76 69 64 78 29 20 0a 20 20 20 20 20 20 29  Covidx) .      )
2de60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2de70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2de80 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
2de90 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
2dea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2deb0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
2dec0 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
2ded0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2dee0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
2def0 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
2df00 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
2df10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2df20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
2df30 6f 74 6f 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  oto(v, pLevel->a
2df40 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20  ddrFirst);.     
2df50 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2df60 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2df70 61 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  addr);.    }.   
2df80 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
2df90 6e 74 28 28 76 2c 20 22 45 6e 64 20 57 48 45 52  nt((v, "End WHER
2dfa0 45 2d 6c 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69  E-loop%d: %s", i
2dfb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dfc0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70         pWInfo->p
2dfd0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
2dfe0 6c 2d 3e 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e  l->iFrom].pTab->
2dff0 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20  zName));.  }..  
2e000 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
2e010 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
2e020 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
2e030 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
2e040 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
2e050 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
2e060 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2e070 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
2e080 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57  );..  assert( pW
2e090 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54  Info->nLevel<=pT
2e0a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
2e0b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
2e0c0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
2e0d0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
2e0e0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
2e0f0 20 20 20 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a     int k, last;.
2e100 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
2e110 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
2e120 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74   = 0;.    struct
2e130 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2e140 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
2e150 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
2e160 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65  From];.    Table
2e170 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
2e180 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73  m->pTab;.    ass
2e190 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
2e1a0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
2e1b0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20  el->pWLoop;..   
2e1c0 20 2f 2a 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75   /* For a co-rou
2e1d0 74 69 6e 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c  tine, change all
2e1e0 20 4f 50 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72   OP_Column refer
2e1f0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 61 62  ences to the tab
2e200 6c 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  le of.    ** the
2e210 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f   co-routine into
2e220 20 4f 50 5f 43 6f 70 79 20 6f 66 20 72 65 73 75   OP_Copy of resu
2e230 6c 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  lt contained in 
2e240 61 20 72 65 67 69 73 74 65 72 2e 0a 20 20 20 20  a register..    
2e250 2a 2a 20 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f  ** OP_Rowid beco
2e260 6d 65 73 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20  mes OP_Null..   
2e270 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
2e280 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2e290 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 74  utine ){.      t
2e2a0 65 73 74 63 61 73 65 28 20 70 50 61 72 73 65 2d  estcase( pParse-
2e2b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2e2c0 64 20 29 3b 0a 20 20 20 20 20 20 74 72 61 6e 73  d );.      trans
2e2d0 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79  lateColumnToCopy
2e2e0 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d  (pParse, pLevel-
2e2f0 3e 61 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65  >addrBody, pLeve
2e300 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20  l->iTabCur,.    
2e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e320 20 20 20 20 20 20 20 20 70 54 61 62 49 74 65 6d          pTabItem
2e330 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b  ->regResult, 0);
2e340 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2e350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2e360 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
2e370 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
2e380 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74 69  VDBE code substi
2e390 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64 20  tutions to read 
2e3a0 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  data.    ** from
2e3b0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74 65   the index inste
2e3c0 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20 74  ad of from the t
2e3d0 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73 69  able where possi
2e3e0 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61  ble.  In some ca
2e3f0 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ses.    ** this 
2e400 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65  optimization pre
2e410 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65 20  vents the table 
2e420 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67 20  from ever being 
2e430 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e 0a  read, which can.
2e440 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20 73      ** yield a s
2e450 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66 6f  ignificant perfo
2e460 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20  rmance boost..  
2e470 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
2e480 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
2e490 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
2e4a0 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
2e4b0 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
2e4c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2e4d0 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
2e4e0 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
2e4f0 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
2e500 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
2e510 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
2e520 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
2e530 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
2e540 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
2e550 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
2e560 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
2e570 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
2e580 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
2e590 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
2e5a0 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
2e5b0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
2e5c0 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e 44  ags & (WHERE_IND
2e5d0 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f  EXED|WHERE_IDX_O
2e5e0 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70 49  NLY) ){.      pI
2e5f0 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  dx = pLoop->u.bt
2e600 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
2e610 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d  }else if( pLoop-
2e620 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2e630 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20  _MULTI_OR ){.   
2e640 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c     pIdx = pLevel
2e650 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20  ->u.pCovidx;.   
2e660 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 0a   }.    if( pIdx.
2e670 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2e680 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2e690 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f  SS_OFF || !HasRo
2e6a0 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  wid(pIdx->pTable
2e6b0 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d 3e  )).     && !db->
2e6c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20  mallocFailed.   
2e6d0 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d   ){.      last =
2e6e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2e6f0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2e700 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64    k = pLevel->ad
2e710 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f  drBody;.      pO
2e720 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
2e730 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20  etOp(v, k);.    
2e740 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20    for(; k<last; 
2e750 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  k++, pOp++){.   
2e760 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31       if( pOp->p1
2e770 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  !=pLevel->iTabCu
2e780 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
2e790 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f        if( pOp->o
2e7a0 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e  pcode==OP_Column
2e7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2e7c0 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  t x = pOp->p2;. 
2e7d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2e7e0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70   pIdx->pTable==p
2e7f0 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Tab );.         
2e800 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
2e810 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
2e820 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d      Index *pPk =
2e830 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
2e840 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
2e850 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20 70             x = p
2e860 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b  Pk->aiColumn[x];
2e870 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2e880 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20  ert( x>=0 );.   
2e890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e8a0 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43 6f     x = sqlite3Co
2e8b0 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64 78  lumnOfIndex(pIdx
2e8c0 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
2e8d0 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20  if( x>=0 ){.    
2e8e0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
2e8f0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = x;.           
2e900 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
2e910 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
2e920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e930 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
2e940 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2e950 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c  E_IDX_ONLY)==0 |
2e960 7c 20 78 3e 3d 30 20 0a 20 20 20 20 20 20 20 20  | x>=0 .        
2e970 20 20 20 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d        || pWInfo-
2e980 3e 65 4f 6e 65 50 61 73 73 20 29 3b 0a 20 20 20  >eOnePass );.   
2e990 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
2e9a0 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52  Op->opcode==OP_R
2e9b0 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
2e9c0 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
2e9d0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
2e9e0 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
2e9f0 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64  de = OP_IdxRowid
2ea00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2ea10 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2ea20 3d 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 29 7b  =OP_IfNullRow ){
2ea30 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
2ea40 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
2ea50 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xCur;.        }.
2ea60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ea70 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c  }..  /* Final cl
2ea80 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61  eanup.  */.  pPa
2ea90 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
2eaa0 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e  = pWInfo->savedN
2eab0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65  QueryLoop;.  whe
2eac0 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
2ead0 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
2eae0 3b 0a 7d 0a                                      ;.}.